diff --git a/AGENTS.md b/AGENTS.md index 354b385f..bca7c4bb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -495,6 +495,36 @@ Docker/`gh` invocations beyond the one-time registry login in step 3. make docker-multiarch-dry # sanity-check the plan first make docker-multiarch-push # builds amd64+arm64, pushes :X.Y.Z and :latest ``` + Bare `make docker-multiarch-push` auto-detects the version from the Git tag + and leaves the `latest` decision to auto-detection. To be fully explicit and + non-interactive - e.g. in a script, or when `HEAD` isn't the tagged commit - + pass the flags through `ARGS` (the Makefile forwards `$(ARGS)` to + `scripts/lrops.py build --docker --multiarch --push`): + ``` + make docker-multiarch-push ARGS="--latest --version v1.0.4" + ``` + `--no-latest` is the counterpart when publishing an older/backport tag that + must not move the `:latest` pointer. + + There is also an **interactive** variant - `make docker-interactive-multiarch` + / `make docker-interactive-multiarch-push` (single-arch: + `make docker-interactive` / `-push` / `-dry`). It prompts for three things: + which existing tag to build, whether to also tag it `latest`, and whether to + go multi-arch. Both paths end in the same `build_docker_image()` call with + the same arguments, so the build and push themselves are identical - the + only difference is where those values come from. + + Two behavioral gotchas worth knowing: + - Interactive runs `lrops.py docker` (flag: `--tag`), non-interactive runs + `lrops.py build --docker` (flag: `--version`). + - `lrops.py docker` **validates that the tag already exists** in the repo and + refuses otherwise; `build --docker` does not, so a typo'd `--version` will + happily build and push a tag that matches no commit. + + **Rule for agents: do not pick between these two on your own.** Before + running any multi-arch build/push, ask the user which they want - + interactive or non-interactive with explicit `ARGS` - and run their choice. + This uses the `gitlab-multiarch` buildx builder (a local `docker-container` driver builder - `scripts/lrops.py` creates it automatically on first use if missing; despite the name it has nothing to do with GitLab or a remote @@ -510,6 +540,12 @@ Docker/`gh` invocations beyond the one-time registry login in step 3. `docs/releases/v1.0.4.md` as the notes body (`scripts/release_gh.py`). SBOM generation/attachment runs separately, from CI, off the pushed tag. +**Gotcha - multi-arch builds are disk-hungry.** Building amd64+arm64 in one +run materializes two full image trees plus the buildx cache. If the build dies +with a confusing write/extract error, check free space on the build machine +first (`df -h`, `docker system df`) and reclaim with `docker buildx prune` / +`docker system prune` before assuming the Dockerfile is at fault. + **Gotcha - the Docker build context is the raw repo directory (`.`), not a git archive.** `docker buildx build .` needs to traverse every directory under the repo root, even ones excluded by `.dockerignore` (that filtering diff --git a/internal/docindex/docs/routes_guide/README.md b/internal/docindex/docs/routes_guide/README.md index 049bd21a..db85cf06 100644 --- a/internal/docindex/docs/routes_guide/README.md +++ b/internal/docindex/docs/routes_guide/README.md @@ -13,12 +13,31 @@ not implementation detail. (`reviews/`, `explore/`, `git/`, `ai/`, `settings/`, `licenses/`, `reports/`, `chatbot/`, `auth/`). Top-level pages that don't belong to a group (dashboard, home) live directly in `ui/docs/training_data/lr_routes/`. +- A small number of top-level files are **reference pages, not routes** + (e.g. `contact.md`), for cross-cutting questions the chatbot must answer + that no single page owns. Keep these rare and clearly marked as non-routes + at the top of the file. - Each file follows this shape: - **Route(s)** — path(s) and the component that renders them - **Purpose** — what the page is for, in plain language - **Who can access it** — role/permission gating, if any - **Key actions** — what a user can do on this page - **Related pages** — where this page links to / is linked from + - **Learn more (public docs)** — optional; links to the matching page(s) + on the public docs site, when one exists + +## Linking to the public docs + +Where a page is also covered by the public documentation site, end the file +with a **Learn more (public docs)** section linking to it. Base URL is +`https://hexmos.com/livereview/docs/`, where `` mirrors the file +layout under `../hexmos_docs/` (e.g. `livereview/integrations/slack.mdx` → +`https://hexmos.com/livereview/docs/livereview/integrations/slack`, and an +`index.mdx` drops the `/index`). + +Only link to pages that actually exist in `../hexmos_docs/` — that folder is +synced from the live docs site, so it is the authority on what is publishable. +Never guess a URL: a 404 in the chatbot's answer is worse than no link. ## Keeping this in sync diff --git a/internal/docindex/docs/routes_guide/admin-billing-portfolio.md b/internal/docindex/docs/routes_guide/admin-billing-portfolio.md deleted file mode 100644 index dfd0b536..00000000 --- a/internal/docindex/docs/routes_guide/admin-billing-portfolio.md +++ /dev/null @@ -1,26 +0,0 @@ -# Admin → Billing Portfolio - -**Route:** `/admin/billing-portfolio` -**Component:** `ui/src/pages/Admin/BillingPortfolio.tsx` - -## Purpose - -Cross-org billing dashboard for LiveReview operators (not org-scoped): -total orgs, active orgs, total billable lines-of-code, total operations, -net revenue collected, failed payments — plus a per-org and per-member -usage breakdown. - -## Who can access it - -super_admin only. - -## Key actions - -- View portfolio-wide billing summary. -- Drill into per-org usage (LOC used, plan, billing period, revenue, - failed payments). -- Drill into per-member usage within an org. - -## Related pages - -[Settings → Plan & Usage](settings/plan-and-usage.md) diff --git a/internal/docindex/docs/routes_guide/ai/ai-providers.md b/internal/docindex/docs/routes_guide/ai/ai-providers.md index 7da96c69..6e1ee95c 100644 --- a/internal/docindex/docs/routes_guide/ai/ai-providers.md +++ b/internal/docindex/docs/routes_guide/ai/ai-providers.md @@ -31,3 +31,7 @@ typically an owner/admin action (enforced server-side). - [New Review](../reviews/new-review.md) - [Settings](../settings/settings-overview.md) + +## Learn more (public docs) + +- [Integrations — AI connector management (BYOK): Gemini, OpenAI, Claude, DeepSeek, OpenRouter](https://hexmos.com/livereview/docs/git-lrc/configure/integrations) diff --git a/internal/docindex/docs/routes_guide/auth/login.md b/internal/docindex/docs/routes_guide/auth/login.md deleted file mode 100644 index 43330b86..00000000 --- a/internal/docindex/docs/routes_guide/auth/login.md +++ /dev/null @@ -1,27 +0,0 @@ -# Login - -**Route:** shown whenever the user is unauthenticated (root `/`, or any -route redirect target) -**Component:** `ui/src/pages/Auth/Login.tsx`, which renders `Cloud.tsx` in -cloud mode or `SelfHosted.tsx` in self-hosted mode - -## Purpose - -Authenticate a user into LiveReview. Cloud mode uses hosted OAuth/login -flows; self-hosted mode uses email/password against the local instance -(`/admin` path also allows the email/password form in cloud mode, for -initial setup/troubleshooting). - -## Who can access it - -Unauthenticated users. - -## Key actions - -- Log in with email/password (self-hosted) or OAuth (cloud). -- On success, redirected to the originally requested URL if one was - captured (`redirectAfterLogin`), else to the dashboard. - -## Related pages - -[Setup](setup.md), [OAuth Callback](oauth-callback.md), [Dashboard](../dashboard.md) diff --git a/internal/docindex/docs/routes_guide/auth/oauth-callback.md b/internal/docindex/docs/routes_guide/auth/oauth-callback.md deleted file mode 100644 index b30d4ff0..00000000 --- a/internal/docindex/docs/routes_guide/auth/oauth-callback.md +++ /dev/null @@ -1,28 +0,0 @@ -# OAuth Callback - -**Route(s):** `/oauth-callback` (`OAuthCallbackHandler`), plus inline -handling of `?code=`/`?error=` params on `/` via `HomeWithOAuthCheck` → -`CodeHostCallback` -**Components:** `ui/src/pages/Auth/OAuthCallbackHandler.tsx`, -`ui/src/pages/Auth/CodeHostCallback.tsx` - -## Purpose - -Completes OAuth redirect flows — both login OAuth and git-provider connector -OAuth (e.g. connecting GitLab). Reads `code`/`error`/`state` query params, -stashes them in `sessionStorage`, and routes to the appropriate handler -without leaking the raw params into the visible URL. - -## Who can access it - -Anyone mid-OAuth-flow (redirected here by the OAuth provider). - -## Key actions - -None directly user-initiated — this is a transit page that finishes the -OAuth handshake and redirects onward (to Dashboard, or back to -[Git Providers](../git/git-providers.md) connector setup on error/success). - -## Related pages - -[Login](login.md), [Git Providers](../git/git-providers.md) diff --git a/internal/docindex/docs/routes_guide/auth/setup.md b/internal/docindex/docs/routes_guide/auth/setup.md deleted file mode 100644 index 30504f8e..00000000 --- a/internal/docindex/docs/routes_guide/auth/setup.md +++ /dev/null @@ -1,23 +0,0 @@ -# Setup - -**Route:** shown in place of any route when the instance requires initial -setup (`isSetupRequired`) -**Component:** `ui/src/pages/Setup/Setup.tsx` - -## Purpose - -First-run wizard for a fresh self-hosted LiveReview instance — creates the -first super_admin account and the initial organization. - -## Who can access it - -Anyone, only while the instance has no admin account yet. - -## Key actions - -- Submit admin email, password (min 8 characters), and organization name to - bootstrap the instance. Logs the new admin in immediately on success. - -## Related pages - -[Login](login.md), [Dashboard](../dashboard.md) diff --git a/internal/docindex/docs/routes_guide/chatbot/chatbot.md b/internal/docindex/docs/routes_guide/chatbot/chatbot.md deleted file mode 100644 index d796414c..00000000 --- a/internal/docindex/docs/routes_guide/chatbot/chatbot.md +++ /dev/null @@ -1,42 +0,0 @@ -# Chatbot (Livi) - -**Route(s):** `/chat`, `/chat/:conversationId`; debug variant `/chat-debug/*` -(dev/`LIVI_DEBUG_LOG`-gated, adds a debug-artifacts inspector) -**Component:** `ui/src/pages/Chatbot/Chatbot.tsx` and -`ChatDebugPage.tsx`, both thin wrappers over the shared -`ui/src/pages/Chatbot/ChatConversation.tsx` - -## Purpose - -In-app AI chat assistant ("Livi") for asking natural-language questions -about the org's data (reviews, repos, PRs, spend, onboarding) and about the -product itself (how-to / navigation questions). Answers can render as text, -tables, or charts (`InteractiveChart`). Reachable from anywhere via the -floating chat button or Ctrl+I. - -## Who can access it - -Any authenticated org member. - -## Key actions - -- Ask data questions, e.g. "how many reviews have triggered this week?", - "which repo has the most issues?", "how much is spent on average per - review?" -- Ask product/how-to questions, e.g. "how to onboard a team member?", - "how to add a custom rule for a repository?" (answered from the docs - in `ui/docs/training_data/lr_routes/` — see root `AGENTS.md`). -- Continue a previous conversation via `/chat/:conversationId`; starting a - new one remounts the component so state starts clean. -- (`/chat-debug` only) inspect debug artifacts behind the model's answer. - -## Prerequisites - -- **Production URL must be configured** (Settings → Instance). Super-admins - see a warning banner if it is missing. - -## Related pages - -All other pages are effectively "related" — the chatbot answers questions -about any of them by drawing on this `ui/docs/training_data/lr_routes/` -documentation set. diff --git a/internal/docindex/docs/routes_guide/checkout-team.md b/internal/docindex/docs/routes_guide/checkout-team.md deleted file mode 100644 index e211c5b4..00000000 --- a/internal/docindex/docs/routes_guide/checkout-team.md +++ /dev/null @@ -1,21 +0,0 @@ -# Team Checkout - -**Route:** `/checkout/team` -**Component:** `ui/src/pages/Checkout/TeamCheckout.tsx` - -## Purpose - -Checkout flow specifically for purchasing a team plan (multiple seats) via -Razorpay, separate from the general [Subscribe](subscribe.md) plan-picker. - -## Who can access it - -Org owner or super_admin (cloud mode). - -## Key actions - -- Configure seat quantity and complete Razorpay payment for a team plan. - -## Related pages - -[Subscribe](subscribe.md), [License Assignment](licenses/license-assignment.md) diff --git a/internal/docindex/docs/routes_guide/contact.md b/internal/docindex/docs/routes_guide/contact.md new file mode 100644 index 00000000..f5fd8057 --- /dev/null +++ b/internal/docindex/docs/routes_guide/contact.md @@ -0,0 +1,40 @@ +# Contacting the LiveReview / Hexmos Team + +> Not a UI route - this is a reference page so questions like "how do I +> contact support?", "how do I reach the Hexmos team?", "who do I talk to +> about my license?" can be answered directly. + +## Reach us any time + +Every channel reaches the same engineers who set your instance up. + +- **Email:** info@hexmos.com +- **Founder:** shrijith@hexmos.com - Shrijith, founder of Hexmos. Fine to + reach out to directly for licensing, pricing, or anything needing a + decision. +- **Discord:** join the LiveReview community at + +- **Slack:** invite us into a shared channel in your workspace, so answers + arrive where your team already works. +- **Microsoft Teams:** supported the same way as Slack - invite us into a + shared channel. + +## When to use which + +- **General questions, sales enquiries, anything else** - email + info@hexmos.com. +- **Self-hosted license keys** (getting one, renewing, activating) - there is + no self-serve purchase flow; contact info@hexmos.com or shrijith@hexmos.com. + See [Settings -> License](settings/license.md). +- **Quick back-and-forth or community help** - Discord. +- **Ongoing support alongside your team's own workflow** - a shared Slack or + Teams channel. + +## Related pages + +[Settings -> License](settings/license.md), +[Settings -> Integrations](settings/integrations.md) + +## Learn more (public docs) + +- [LiveReview documentation home](https://hexmos.com/livereview/docs) diff --git a/internal/docindex/docs/routes_guide/dashboard.md b/internal/docindex/docs/routes_guide/dashboard.md index 4d87c909..e497abd3 100644 --- a/internal/docindex/docs/routes_guide/dashboard.md +++ b/internal/docindex/docs/routes_guide/dashboard.md @@ -4,29 +4,129 @@ any pending OAuth callback params), `/dashboard` (`Dashboard`) **Component:** `ui/src/pages/Home/HomeWithOAuthCheck.tsx`, `ui/src/components/Dashboard/Dashboard.tsx` +**Widgets:** `ui/src/components/Dashboard/widgets/` (registry in `registry.ts`) ## Purpose -The landing page after login. Shows a summary of the organization's -LiveReview usage: total code reviews run, active AI connectors, whether the -CLI (`lrc`) is installed, and onboarding progress. Also surfaces quota/trial -billing banners when usage limits are being approached or exceeded. +The landing page after login, and the org's main visual summary of LiveReview +usage. Three things stack here: + +1. **Onboarding + quota banners** — the setup checklist and any billing/quota + warnings. +2. **A customizable widget grid** — 13 drag-and-drop charts and stat panels + (this is where all the graphs live). +3. **Recent Activity** — a fixed, API-backed activity feed at the bottom. ## Who can access it -Any authenticated user of the org. +Any authenticated user of the org. All widget data is scoped to the caller's +organization. + +## The period selector + +One control at the top of the grid sets the window for **every** widget: +**Today**, **This Week**, **This Month** (default), or **All Time**. Each +widget receives values already scoped to that period by the backend, so +changing it rewrites the whole grid at once. + +## Customizing the grid + +- **Add Widget** — pick from any widget not currently placed. +- **Edit mode** — drag to rearrange and resize widgets. +- **Remove** — drop a widget from your layout. +- **Reset Layout** — restore the defaults. + +Layout is per user, saved in `localStorage` under an `lr__` +key. It's a personal view: your arrangement does not change anyone else's, and +it doesn't follow you to another browser. + +## Reading the graphs + +Widgets are grouped into three categories, shown as coloured badges: **Review +Layers** (blue), **System Overview** (purple), **People** (green). + +Two vocabularies recur across the charts: + +- **Review layer / stage** — where a review was triggered from: + **Pre-commit** (the `lrc` CLI, before a commit lands), **MR / PR** (on a + merge/pull request), **API / MCP** (programmatic), and **Scheduled**. + These come from each review's `trigger_type`. +- **Issue category** — what kind of problem a finding is: Security, + Reliability, Correctness, Performance, Cost, Scalability, Maintainability, + Architecture, Developer Experience, Compliance & Governance. Colours are + consistent for a given category across every chart. + +Nearly every widget is clickable and drills through to the matching filtered +view, so a chart is also a navigation shortcut. + +### Review Layers + +| Widget | Chart type | How to read it | Clicking through | +|---|---|---|---| +| **Review Pipeline** | Sankey | Left column = review layers, right column = issue categories; each ribbon's thickness is how many findings of that category came from that layer. Wide ribbons show which trigger source is finding which kind of problem. A layer with no reviews gets no node at all. | A category → findings filtered to it | +| **Issue Distribution** | Treemap | Nested rectangles, sized by finding count: outer tiles are categories, inner tiles subcategories. The biggest tile is your most common problem type. | Drills into that category/subcategory in Reports | +| **Issue Mix by Stage** | Radar | One spoke per issue category, one coloured ring per review stage. A ring stretched toward a spoke means that stage disproportionately catches that kind of issue — useful for seeing that, say, pre-commit catches Correctness while scheduled runs surface Security. | — | +| **Reviews by Stage** | Stat cards | Plain volume and issue counts per stage; the numeric companion to the charts above. | Findings explorer | +| **Stage Volume Comparison** | Bar | Side-by-side review volume per stage — the quickest read of which trigger source your team actually uses. | Findings explorer | + +### System Overview + +| Widget | Chart type | How to read it | Clicking through | +|---|---|---|---| +| **System at a Glance** | KPI tiles | Four counts: Git Hosts, AI Connectors, Repositories, PRs/MRs tracked. | Each tile → its own page (`/git`, `/ai`, repositories, merge requests) | +| **PR Count by Repo / Host** | Sunburst | Concentric rings: inner ring = git host, outer ring = repositories, arc size = PR volume. Shows at a glance which host and which repos dominate activity. | Host → `/git`; repo → repositories | +| **Connected Providers** | List | Every git host and AI provider currently connected. | The relevant provider page | +| **Review Coverage** | Gauge | Percentage of PRs/MRs in the period that received **at least one** AI review. This is the "are we actually reviewing everything?" number — a low gauge with high review counts means reviews are concentrated on a few PRs. | Reports overview | +| **Review Averages** | Stat pair | Average reviews per PR/MR (1 decimal) and per commit (2 decimals). Depth rather than breadth: how many times a typical change gets looked at. | Findings explorer | + +### People + +| Widget | Chart type | How to read it | Clicking through | +|---|---|---|---| +| **Top Reviewers** | Leaderboard | Contributors ranked by reviews given in the period. | User management | +| **Usage Share** | Donut | Share of total review volume per contributor — top 5 plus an "others" slice. A single dominant slice means adoption is concentrated in one person rather than spread across the team. | User management | +| **Contribution Activity** | Calendar heatmap | GitHub-style grid over the last ~7 months; each cell is a day, darker = more reviews. Good for spotting streaks, gaps, and whether usage is sustained or bursty. | A day → findings for exactly that date | + +Each contributor keeps the same colour across Top Reviewers and Usage Share +(it's hashed from their email), so the same person is recognisable in both. + +### When a widget is empty + +Widgets render an empty state rather than a broken chart when there's no data +yet — e.g. Review Coverage shows "Review coverage will appear here once +PRs/MRs are tracked." An empty grid usually means the org hasn't run reviews +yet, not that something is wrong. + +## Onboarding and banners + +- **`OnboardingSteps` / `FloatingOnboardingNudge`** — the setup checklist: + install the CLI, connect an AI provider, run a first review. The floating + nudge stays available until dismissed. **This is where per-person setup + progress lives** — not in the Onboarding *Report*, which is an org-wide + analytics report despite the similar name. +- **`QuotaWarningBanner` / `QuotaExhaustedBanner`** — appear as usage limits + are approached or exceeded, with links to upgrade. +- **`PlanBadge`** — current plan/tier. ## Key actions -- View onboarding checklist (install CLI, connect an AI provider, run first - review) via `OnboardingSteps`. -- See quota warnings/exhaustion banners (`QuotaWarningBanner`, - `QuotaExhaustedBanner`) with links to upgrade. -- Navigate to Reviews, Explore, Settings, etc. from here. +- Switch the dashboard period (Today / This Week / This Month / All Time). +- Add, remove, drag, resize, or reset widgets. +- Click any chart to drill into the matching filtered view. +- Work through the onboarding checklist. +- Read the Recent Activity feed. ## Related pages +- [Reports → Taxonomy Reports](reports/taxonomy-reports.md) — where most + widget click-throughs land, with far deeper filtering. +- [Reports → Onboarding Report](reports/onboarding-report.md) — the org-wide + adoption/cost/quality analytics report. - [Create Review via CLI](reviews/create-review-cli.md), [Create Review via - MCP](reviews/create-review-mcp.md) — dedicated onboarding entry points - reachable from the mega menu, sharing the same onboarding data as this page. + MCP](reviews/create-review-mcp.md) — onboarding entry points sharing this + page's onboarding data. - [Reviews](reviews/reviews-list.md) + +## Learn more (public docs) + +- [Generate engineering reports — ask for the report you need in plain English](https://hexmos.com/livereview/docs/livereview/mcp/usecases/generate-engineering-reports) diff --git a/internal/docindex/docs/routes_guide/licenses/license-assignment.md b/internal/docindex/docs/routes_guide/licenses/license-assignment.md deleted file mode 100644 index 543728ce..00000000 --- a/internal/docindex/docs/routes_guide/licenses/license-assignment.md +++ /dev/null @@ -1,25 +0,0 @@ -# License Assignment - -**Route:** `/subscribe/subscriptions/:id/assign` -**Component:** `ui/src/pages/Licenses/LicenseAssignment.tsx` - -## Purpose - -Assign purchased seats on a specific subscription to individual org -members (per-user licensing), and see payment status for that -subscription. - -## Who can access it - -Org owner or super_admin. - -## Key actions - -- Assign a seat to a member (by email). -- Unassign a seat. -- View subscription payment status (last payment id/status, owner info). -- Trigger upgrade flow if seats are exhausted (`UpgradePromptModal`). - -## Related pages - -[License Management](license-management.md), [Settings → Plan & Usage](../settings/plan-and-usage.md) diff --git a/internal/docindex/docs/routes_guide/licenses/license-management.md b/internal/docindex/docs/routes_guide/licenses/license-management.md index 8f8b9946..f8baa090 100644 --- a/internal/docindex/docs/routes_guide/licenses/license-management.md +++ b/internal/docindex/docs/routes_guide/licenses/license-management.md @@ -3,11 +3,19 @@ **Route:** `/subscribe/manage` **Component:** `ui/src/pages/Licenses/LicenseManagement.tsx` +> **Legacy page — per-seat licensing is deprecated.** LiveReview no longer +> gates team size on purchased seats. Org owners add as many users as they +> want in [Settings → User Management](../settings/user-management.md), with +> no seat to buy or assign first. This page remains for orgs still on older +> seat-based subscriptions. **Never present it as part of adding or +> onboarding a team member.** + ## Purpose -Manage an org's active cloud subscription: view plan type, seat quantity, -assigned seats, billing period, and license expiry; cancel the -subscription. +View and manage an existing cloud subscription: plan type, billing period, +license expiry, and cancellation. On seat-based legacy subscriptions it also +shows seat quantity and how many are assigned — historical detail, not +something a current org needs to act on. ## Who can access it @@ -15,12 +23,12 @@ Org owner or super_admin. ## Key actions -- View subscription details (plan, status, period, seats assigned vs. - purchased). -- Cancel subscription (`CancelSubscriptionModal`), with cancel-at-period-end - semantics. +- View subscription details (plan, status, billing period). +- Cancel the subscription (`CancelSubscriptionModal`), with + cancel-at-period-end semantics. +- On legacy seat plans only: see seats assigned vs. purchased. ## Related pages -[Subscribe](../subscribe.md), [License Assignment](license-assignment.md), +[Subscribe](../subscribe.md), [Settings → Plan & Usage](../settings/plan-and-usage.md) diff --git a/internal/docindex/docs/routes_guide/reports/onboarding-report.md b/internal/docindex/docs/routes_guide/reports/onboarding-report.md index 6af8cccf..c2e1aa4c 100644 --- a/internal/docindex/docs/routes_guide/reports/onboarding-report.md +++ b/internal/docindex/docs/routes_guide/reports/onboarding-report.md @@ -2,23 +2,80 @@ **Route:** `/reports/onboarding` **Component:** `ui/src/pages/Reports/OnboardingReport.tsx` +**Chart catalog:** `internal/onboardingreport/templates.json` ## Purpose -Tracks org onboarding progress across members — who has/hasn't onboarded -(installed CLI, connected AI provider, run a first review), so admins can -see adoption at a glance. Directly answers questions like "who hasn't -onboarded yet?" and "is everyone using it or just a few?" +A broad, pre-built analytics report on **how the org is actually using +LiveReview** — adoption, per-repository and per-engineer activity, finding +quality, cost, and engagement. Despite the name it is not a per-person +setup checklist; it is the "is LiveReview landing in this org, and what is it +costing/finding?" report, built from 57 predefined charts. + +Use it for questions like "is adoption growing or flat?", "which engineers and +repos actually use it?", "what is this costing per line of code?", and "do +people find the findings useful?" + +## Sections + +Charts are grouped into seven sections, each fetched on demand: + +| Section id | Label | Covers | +|---|---|---| +| `adoption` | Adoption & Growth | Daily review counts, cumulative LOC reviewed, adoption levels/breadth, top adopters, active engineers over time | +| `repos` | Repository Analysis | Per-repo velocity change, LOC reviewed by repo, Pareto of top repos | +| `engineers` | Engineer Analysis | Top engineers by reviews, LOC Pareto, trigger types per engineer | +| `quality` | Review Quality & Findings | Trigger-type mix and trends, severity distribution, top problem categories/subcategories, top files with issues | +| `cost` | Cost & Efficiency | Daily cost, cost per line of code, cost by AI provider, median review duration | +| `engagement` | Engagement & Trust | Completed reviews, comments per review, upvote/downvote trends, feedback by category | +| `summary` | Summary & Comparison | Cross-cutting activity trend, severity distribution, per-engineer change comparisons | + +Each chart carries a title, description, `query_summary`, chart type, +granularity, time range, row count, and optional stats. Charts are rendered +from **Vega-Lite** specs (`vega_spec`) produced server-side, with a shared +theme injected at render time so they look identical everywhere. ## Who can access it -Org owner or super_admin. +- **The route and its API:** any authenticated org member — the + `/api/v1/reports/onboarding` group applies only `RequireAuth` plus org + context, and `internal/api/server.go` labels it "org-scoped: any member". + Data is scoped to the caller's org (`{{.OrgID}}` is substituted into each + chart's SQL by `PrepareSQL`). +- **In the navigation:** the Reports section is owner/super_admin-gated, so + in practice members won't discover it in the menu. + +## How to get here + +There is **no mega-menu entry** for this report. Reach it by opening +**Reports** (`/reports`) and following the Onboarding Report link there +(`ui/src/pages/Reports/TaxonomyReports.tsx`), or by going to +`/reports/onboarding` directly. + +## Exports + +Export runs as an **async job**, not an instant download, because rendering 57 +charts takes a while: + +1. `POST /api/v1/reports/onboarding/export?format=pdf|html` starts the job and + returns a `job_id` plus a total. +2. The page polls `GET /export/:jobId/status` and shows a progress bar with + the current chart being rendered. +3. On completion it fetches `GET /export/:jobId/file` and saves it. + +Formats are **PDF** and **HTML** (`internal/onboardingreport/generate_pdf.go`, +`generate_html.go`). A failed export can be retried from the modal. ## Key actions -- View per-member onboarding status. -- Identify members who haven't completed onboarding. +- Browse charts by section. +- Read a chart's description and query summary to understand what it measures. +- Export the whole report as PDF or HTML, watching job progress. ## Related pages [Reports → Taxonomy Reports](taxonomy-reports.md), [Dashboard](../dashboard.md) + +## Learn more (public docs) + +- [Generate engineering reports](https://hexmos.com/livereview/docs/livereview/mcp/usecases/generate-engineering-reports) diff --git a/internal/docindex/docs/routes_guide/reports/taxonomy-reports.md b/internal/docindex/docs/routes_guide/reports/taxonomy-reports.md index 45cd30e0..9996bce9 100644 --- a/internal/docindex/docs/routes_guide/reports/taxonomy-reports.md +++ b/internal/docindex/docs/routes_guide/reports/taxonomy-reports.md @@ -1,25 +1,86 @@ # Reports → Taxonomy Reports -**Route:** `/reports/*` (default reports view, excluding `/reports/onboarding`) +**Route:** `/reports/*` (the default Reports view; `/reports/onboarding` is a +separate page) **Component:** `ui/src/pages/Reports/TaxonomyReports.tsx` ## Purpose -Analytics dashboard over review findings: totals, breakdown by severity -(critical/high/medium/low/info) and confidence level, distribution by -dimension (e.g. rule category, repo), and trends over time -(`TrendAreaChart`). Supports filtering and exporting a PDF impact report. +The analytics dashboard over **review findings** — every issue LiveReview's +AI has raised, sliced by severity, confidence, category, repository, and time. +Answers questions like "how many critical issues did we have last month?", +"which repo produces the most security findings?", and "are findings trending +down?" ## Who can access it -Any authenticated org member. +- **In the navigation:** org **owner** or **super_admin** only — the Reports + mega-menu section carries `requiresOwnerOrAdmin: true` + (`ui/src/components/Navbar/megaMenuData.ts`). +- **The route and its API:** any authenticated org member. `/api/v1/reports/taxonomy/*` + requires only `RequireAuth` + org context (`internal/api/server.go`), so a + member with the URL can load the page; they just won't find it in the menu. +- **super_admin** additionally reads from `/api/v1/admin/reports/taxonomy/*` + (`baseEndpoint` switches on `isSuperAdmin`), which spans organizations + rather than just the current one. + +## The three modes + +The page has one URL with a `mode` query parameter; anything unrecognized +falls back to `overview`. + +| Mode | URL | What it shows | +|---|---|---| +| Overview | `/reports` | Headline totals and distribution/trend charts | +| Explore | `/reports?mode=explore` | The filterable findings table (drill into individual findings) | +| Custom | `/reports?mode=custom` | Build a custom export by picking datasets | + +## Filters (all are URL parameters, so any view is shareable) + +`since`, `until`, `severity`, `confidence`, `type`, `category`, +`subcategory`, `repository`, `provider`, `org_id`, and `grain` (trend bucket +size, default `day`). `severity`, `category` and `subcategory` accept multiple +values. + +Because filters live in the URL, the mega menu links to pre-filtered views — +e.g. Last 7 Days, Last 30 Days, Critical Issues +(`?mode=explore&severity=Critical`), Security Findings +(`?mode=explore&category=Security`). + +## What the overview reports + +From `/summary`: `total_findings`, `total_reviews`, counts per severity +(`critical`/`high`/`medium`/`low`/`info`) and per confidence +(`high`/`medium`/`low`). Plus distribution by severity, category and +subcategory, a bucketed trend over time (`TrendAreaChart.tsx`), a +per-repository/provider breakdown, and category↔subcategory relations. + +## Exports + +- **PDF impact report** — `generateImpactReportPdf` in + `ui/src/pages/Reports/pdfExport.ts`. Deep-linkable: `/reports?export=pdf` + opens the export dialog straight on the PDF tab. +- **Raw data as CSV or XLSX** — `/api/v1/reports/taxonomy/export` and + `/export/xlsx`. Choose among the datasets `findings`, + `severity_distribution`, `category_distribution`, `trend`, `breakdown`. An + `/export/preview` call reports the row count per dataset before you commit. ## Key actions -- Filter findings by dimension/time range. -- View trend charts of findings over time. -- Export a PDF "impact report" (`generateImpactReportPdf`). +- Switch between Overview / Explore / Custom modes. +- Filter findings by time range, severity, confidence, category, repository, + or provider — and share the resulting URL. +- Sort the findings table (by created_at, severity, confidence, type, + category, subcategory, repository, provider, file path, or line number). +- Export a PDF impact report, or raw CSV/XLSX per dataset. ## Related pages -[Reports → Onboarding](onboarding-report.md), [Reviews list](../reviews/reviews-list.md) +[Reports → Onboarding Report](onboarding-report.md), +[Reviews list](../reviews/reviews-list.md), +[Review detail](../reviews/review-detail.md) + +## Learn more (public docs) + +- [Generate engineering reports](https://hexmos.com/livereview/docs/livereview/mcp/usecases/generate-engineering-reports) +- [Understand engineering decisions — query past reviews and spot recurring quality issues](https://hexmos.com/livereview/docs/livereview/mcp/usecases/understand-engineering-decisions) diff --git a/internal/docindex/docs/routes_guide/reviews/ci-cd-gates.md b/internal/docindex/docs/routes_guide/reviews/ci-cd-gates.md index b6efdc45..1091803d 100644 --- a/internal/docindex/docs/routes_guide/reviews/ci-cd-gates.md +++ b/internal/docindex/docs/routes_guide/reviews/ci-cd-gates.md @@ -55,3 +55,8 @@ Organization owners and super admins (gated in the mega menu by - [Reviews (list)](reviews-list.md) - [Review Detail](review-detail.md) - [Dashboard](../dashboard.md) + +## Learn more (public docs) + +- [CI/CD gates and merge enforcement — write a jq rule against findings and call one URL from any pipeline](https://hexmos.com/livereview/docs/livereview/mcp/usecases/cicd-gates-merge-enforcement) +- [Prevent production issues — automated reviews in your CI/CD pipeline](https://hexmos.com/livereview/docs/livereview/mcp/usecases/prevent-production-issues) diff --git a/internal/docindex/docs/routes_guide/reviews/create-review-cli.md b/internal/docindex/docs/routes_guide/reviews/create-review-cli.md index 764ef97d..2155e5c5 100644 --- a/internal/docindex/docs/routes_guide/reviews/create-review-cli.md +++ b/internal/docindex/docs/routes_guide/reviews/create-review-cli.md @@ -36,3 +36,9 @@ Any authenticated org member. Free-plan orgs may see an upgrade dialog - [Dashboard](../dashboard.md) - [Create Review via MCP](create-review-mcp.md) - [New Review](new-review.md) + +## Learn more (public docs) + +- [Install git-lrc in one minute and activate local hooks](https://hexmos.com/livereview/docs/git-lrc/get-started/install) +- [What git-lrc does and where it fits in your workflow](https://hexmos.com/livereview/docs/git-lrc/get-started/intro) +- [Typical developer workflow with git-lrc enabled](https://hexmos.com/livereview/docs/git-lrc/concepts/workflow) diff --git a/internal/docindex/docs/routes_guide/reviews/create-review-mcp.md b/internal/docindex/docs/routes_guide/reviews/create-review-mcp.md index 08be9fe7..5049d41d 100644 --- a/internal/docindex/docs/routes_guide/reviews/create-review-mcp.md +++ b/internal/docindex/docs/routes_guide/reviews/create-review-mcp.md @@ -31,3 +31,8 @@ Any authenticated org member. - [Dashboard](../dashboard.md) - [Create Review via CLI](create-review-cli.md) - [Settings → MCP Integration](../settings/mcp-integration.md) + +## Learn more (public docs) + +- [Configuring the MCP server — get your API key and connect your client](https://hexmos.com/livereview/docs/livereview/mcp/mcp-configuration) +- [How to use the MCP server — available tools, with example prompts](https://hexmos.com/livereview/docs/livereview/mcp/mcp-usage) diff --git a/internal/docindex/docs/routes_guide/reviews/review-detail.md b/internal/docindex/docs/routes_guide/reviews/review-detail.md index 1d1fa45d..40288968 100644 --- a/internal/docindex/docs/routes_guide/reviews/review-detail.md +++ b/internal/docindex/docs/routes_guide/reviews/review-detail.md @@ -28,3 +28,7 @@ Any authenticated org member; the review must belong to their org - [Reviews list](reviews-list.md) - [New Review](new-review.md) + +## Learn more (public docs) + +- [Turn findings into tickets and follow-up tasks](https://hexmos.com/livereview/docs/livereview/mcp/usecases/turn-findings-into-tickets) diff --git a/internal/docindex/docs/routes_guide/settings/api-keys.md b/internal/docindex/docs/routes_guide/settings/api-keys.md index 70c2048b..7a10689c 100644 --- a/internal/docindex/docs/routes_guide/settings/api-keys.md +++ b/internal/docindex/docs/routes_guide/settings/api-keys.md @@ -21,3 +21,7 @@ deactivation) — those require an active JWT session (see root `AGENTS.md`, ## Related pages [Settings overview](settings-overview.md), [Create Review via CLI](../reviews/create-review-cli.md) + +## Learn more (public docs) + +- [Configuring the MCP server — where your API key is used](https://hexmos.com/livereview/docs/livereview/mcp/mcp-configuration) diff --git a/internal/docindex/docs/routes_guide/settings/deployment.md b/internal/docindex/docs/routes_guide/settings/deployment.md index fb868c08..d81a8c8f 100644 --- a/internal/docindex/docs/routes_guide/settings/deployment.md +++ b/internal/docindex/docs/routes_guide/settings/deployment.md @@ -1,7 +1,8 @@ # Settings → Deployment **Route:** `/settings#deployment` -**Who sees it:** super_admin only +**Who sees it:** super_admin or org **owner** (`canManageCurrentOrg`), in both +cloud and self-hosted mode. ## Purpose diff --git a/internal/docindex/docs/routes_guide/settings/instance.md b/internal/docindex/docs/routes_guide/settings/instance.md index 939ad6c9..a69bf72e 100644 --- a/internal/docindex/docs/routes_guide/settings/instance.md +++ b/internal/docindex/docs/routes_guide/settings/instance.md @@ -1,7 +1,10 @@ # Settings → Instance **Route:** `/settings#instance` -**Who sees it:** super_admin only +**Who sees it:** super_admin, or an org **owner** on a self-hosted instance +(`canManageInstanceConfig` in `ui/src/pages/Settings/Settings.tsx`). In cloud +mode this config is shared across every tenant, so it stays super_admin-only +there. ## Purpose diff --git a/internal/docindex/docs/routes_guide/settings/integrations.md b/internal/docindex/docs/routes_guide/settings/integrations.md index 4b68acd2..8f5b476d 100644 --- a/internal/docindex/docs/routes_guide/settings/integrations.md +++ b/internal/docindex/docs/routes_guide/settings/integrations.md @@ -1,19 +1,110 @@ # Settings → Integrations **Route:** `/settings#integrations` -**Who sees it:** any org member; in cloud mode shows an "Enterprise only" -notice instead of connect options (self-hosted-only feature there) +**Component:** `ui/src/pages/Settings/IntegrationsTab.tsx` +**Who sees it:** any org member; **self-hosted only** — in cloud mode the tab +renders an "Enterprise" notice saying Slack, Microsoft Teams, and Discord +integrations are not available on that plan, with no connect options. ## Purpose -Connect LiveReview to external tools/services beyond git and AI providers -(e.g. chat/notification integrations). Enterprise-gated in cloud mode. +Connect LiveReview's bot (**Livi**) to your team's chat platform, so people +can ask Livi questions and get review notifications where they already work. +Three integrations are offered, each configured independently on this page: +**Slack**, **Microsoft Teams**, and **Discord**. + +Each one is a *bring-your-own-bot* setup: you register an app on the chat +platform yourself, then paste its credentials into this page. LiveReview does +not host a shared public bot for these. + +The Slack and Discord flows offer a **Download Livi icon** button +(`/assets/lrbot/lrbot-original.png`) for use as the bot's avatar. Teams does +not - its branding comes from the uploaded app package instead. + +## Slack setup + +Uses Slack **Socket Mode**, so it needs two tokens: an app-level token and a +bot token. + +1. In the [Slack API Apps](https://api.slack.com/apps) portal, click + **Create New App**, choose **From manifest**. +2. Paste the manifest shown on the page (there is a **Copy** button) and + choose your workspace. The manifest defines the bot as `Livi` and requests + scopes including `channels:read`, `app_mentions:read`, `channels:history`, + `chat:write`, `files:write`, `groups:history`, `im:history`, `im:read`, + `im:write`, `users:read`, with `app_mention` / `message.im` bot events, + interactivity, and socket mode enabled. +3. Download the Livi icon, then in Slack go to **Basic Information > Display + Information**, upload it as the App icon, and **Save Changes**. +4. Go to **Basic Information > App-Level Tokens**, click **Generate Token and + Scopes**, add the `connections:write` scope, **Generate**, and copy it into + the **App-Level Token** field (format `xapp-1-...`). +5. Go to **Install App** and click **Install to Workspace**. Click **Allow** + when prompted, to reveal the **Bot Token** (format `xoxb-...`). Copy it in. +6. Click **Save**. Both tokens are required before Save enables. + +## Microsoft Teams setup + +Teams needs an Azure Bot registration **and** an uploaded app package — the +Azure side alone is not enough, because Teams only lets people find and add +Livi through an installed app. + +1. In the [Azure Portal](https://portal.azure.com/), create an **Azure Bot** + resource, name it **Livi**, choose **Single Tenant**. Copy the **Microsoft + App ID** and **Directory (tenant) ID** into the **Bot App ID** and + **Tenant ID** fields. Both must be GUIDs — the page warns if a value looks + autofilled with something else (e.g. an email). +2. On the bot resource's **Configuration** page, set the **Messaging + endpoint** to `/api/messages`. +3. Generate a **Client Secret** (**App registrations > your bot's app > + Certificates & secrets > New client secret**). Copy the value immediately — + Azure shows it only once — into **Bot Password (Client Secret)**. +4. Under the bot resource's **Channels**, add the **Microsoft Teams** channel. +5. Click **Save**. +6. **After saving**, return to this page and download the **Livi Teams App + package**, then have a Teams admin upload it via the + [Teams admin center](https://admin.teams.microsoft.com) (not the general + Microsoft 365 admin center) — **Teams apps → Manage apps → Actions → + Upload new app**. This is the step that actually makes Livi + installable/usable in Teams. + +## Discord setup + +1. Go to the + [Discord Developer Portal](https://discord.com/developers/applications), + click **New Application**, name it **Livi**, then **Create**. +2. Copy the **Application ID** (from the app's **General Information** tab) + into the Application ID field. +3. Click **Bot** in the left sidebar. +4. Download the Livi icon and upload it as the bot's avatar on the Bot page. +5. Under **Privileged Gateway Intents**, enable both and save changes: + - `MESSAGE CONTENT INTENT` — required to read message content + - `SERVER MEMBERS INTENT` — required to see guild members +6. Click **Reset Token**, paste the bot token into **Bot Token**, and + click **Save**. +7. After saving, click **Invite bot to your server** (the page builds the + OAuth2 authorize URL from your Application ID), choose your server, and + authorize. +8. DM the bot, or mention it in a channel (`@Livi your question`), to start. ## Key actions -- View available integrations. -- Connect/configure an integration (self-hosted, sufficiently licensed). +- View which of Slack / Teams / Discord are currently configured. +- Connect an integration by pasting its credentials, or **Edit** an existing + one. +- **Disconnect** an integration (confirmation modal). +- Download the Livi icon (Slack/Discord), the Slack app manifest, or the + Teams app package. +- Follow the generated invite link to add the Discord bot to a server. ## Related pages -[Settings overview](settings-overview.md), [Git Providers](../git/git-providers.md) +[Settings overview](settings-overview.md), [Contact us](../contact.md), +[Git Providers](../git/git-providers.md) + +## Learn more (public docs) + +- [Integrations overview — bringing Livi into Slack, Discord, and Microsoft Teams](https://hexmos.com/livereview/docs/livereview/integrations) +- [Connect Livi to your Slack workspace](https://hexmos.com/livereview/docs/livereview/integrations/slack) +- [Connect Livi to Microsoft Teams via an Azure Bot](https://hexmos.com/livereview/docs/livereview/integrations/teams) +- [Connect Livi to your Discord server](https://hexmos.com/livereview/docs/livereview/integrations/discord) diff --git a/internal/docindex/docs/routes_guide/settings/learnings.md b/internal/docindex/docs/routes_guide/settings/learnings.md index 3d80b03d..0dfe750c 100644 --- a/internal/docindex/docs/routes_guide/settings/learnings.md +++ b/internal/docindex/docs/routes_guide/settings/learnings.md @@ -19,3 +19,8 @@ that LiveReview's AI review pipeline takes into account (see ## Related pages [Settings overview](settings-overview.md) + +## Learn more (public docs) + +- [Set review rules — what gets flagged and how strict reviews are](https://hexmos.com/livereview/docs/git-lrc/configure/set-review-rules) +- [Repository rules — the .lrc/ directory for repo-specific review rules](https://hexmos.com/livereview/docs/git-lrc/configure/repository-rules) diff --git a/internal/docindex/docs/routes_guide/settings/license.md b/internal/docindex/docs/routes_guide/settings/license.md index 932ebecd..33ff1c62 100644 --- a/internal/docindex/docs/routes_guide/settings/license.md +++ b/internal/docindex/docs/routes_guide/settings/license.md @@ -1,18 +1,52 @@ # Settings → License **Route:** `/settings#license` -**Who sees it:** super_admin (cloud); super_admin or org owner (self-hosted) +**Who sees it:** self-hosted deployments only (super_admin or org owner). +The tab is not rendered at all in cloud mode - see `isCloudMode()` in +`ui/src/pages/Settings/Settings.tsx`. ## Purpose Manage the self-hosted license key that unlocks Team/Enterprise tier -features (see `internal/license`). Not shown the same way in cloud mode, -where billing/plan is handled via [Plan & Usage](plan-and-usage.md) instead. +features (see `internal/license`). This is a **license key**, not per-user +seats - it is not where you assign a seat to a team member. + +In cloud mode this tab does not exist; cloud billing/plan lives in +[Plan & Usage](plan-and-usage.md). + +Adding team members does **not** require anything on this page. Per-seat +licensing is deprecated - an owner adds as many users as they like in +[User Management](user-management.md), with no seat purchase or assignment +step. + +## How a self-hosted org gets a license + +A self-hosted instance with no valid license shows a **persistent status +banner** at the top of the app (`ui/src/components/License/LicenseStatusBar.tsx`, +rendered only when not in cloud mode). It reads **"License Missing - Get +License to continue"**, and clicking through opens the license modal where the +key is pasted in. Expired, invalid, and soon-to-expire licenses surface the +same way. + +**There is no self-serve purchase flow for self-hosted license keys.** To get +or renew one, the user must contact Hexmos directly: + +- **info@hexmos.com** - general/sales enquiries +- **shrijith@hexmos.com** - Shrijith, founder + +There is also a self-hosted access page at +, which the banner's +"Upgrade now" / "Renew now" action links to. + +When a user asks how to get, buy, renew, or activate a self-hosted license, +point them at those contact addresses - do not invent a checkout or +subscription flow, and do not route them to the cloud seat/subscription pages. ## Key actions - View current license tier and status. - Add or update a license key. +- Follow the missing/expired-license banner to the license entry modal. ## Related pages diff --git a/internal/docindex/docs/routes_guide/settings/mcp-integration.md b/internal/docindex/docs/routes_guide/settings/mcp-integration.md index 65e38b7a..aeb1b945 100644 --- a/internal/docindex/docs/routes_guide/settings/mcp-integration.md +++ b/internal/docindex/docs/routes_guide/settings/mcp-integration.md @@ -26,3 +26,9 @@ within those tools. ## Related pages [Settings overview](settings-overview.md), [Create Review via MCP](../reviews/create-review-mcp.md) + +## Learn more (public docs) + +- [MCP server overview](https://hexmos.com/livereview/docs/livereview/mcp) +- [Configuring the MCP server](https://hexmos.com/livereview/docs/livereview/mcp/mcp-configuration) +- [How to use the MCP server](https://hexmos.com/livereview/docs/livereview/mcp/mcp-usage) diff --git a/internal/docindex/docs/routes_guide/settings/plan-and-usage.md b/internal/docindex/docs/routes_guide/settings/plan-and-usage.md index ba249092..e1e00d68 100644 --- a/internal/docindex/docs/routes_guide/settings/plan-and-usage.md +++ b/internal/docindex/docs/routes_guide/settings/plan-and-usage.md @@ -1,26 +1,44 @@ # Settings → Plan & Usage -**Route(s):** `/settings#subscriptions`, plus dedicated sub-routes +**Route(s):** `/settings#subscriptions`, plus the sub-tab deep links `/settings-subscriptions-overview`, `/settings-subscriptions-breakdown`, `/settings-subscriptions-assign`, `/settings-subscriptions-portfolio` (all render `Settings.tsx` pinned to the `subscriptions` tab) -**Who sees it:** any org member, cloud mode only +**Component:** `ui/src/pages/Settings/SubscriptionTab.tsx` +**Who sees it:** any org member, **cloud mode only** — the tab is registered +under `isCloudMode()` in `Settings.tsx`, so self-hosted instances never show +it (they use [Settings → License](license.md) instead) ## Purpose -View and manage the org's cloud subscription/billing: current plan, usage -against quota (lines-of-code billed, etc.), and seat assignment for -license-per-user plans. +The org's cloud billing home: which plan you're on, what you've used against +quota (lines of code billed, etc.), and the billing period. + +> **Note on seats.** Per-seat licensing is deprecated — this page is not where +> you make room for a new team member. Adding users is unlimited and happens +> in [User Management](user-management.md). The assignment UI described below +> survives for orgs on older seat-based subscriptions. + +## Sub-tabs + +| Sub-tab | Deep link | Shows | +|---|---|---| +| Overview | `/settings-subscriptions-overview` | Current plan, status, billing period | +| Breakdown | `/settings-subscriptions-breakdown` | Usage against quota, itemized | +| Control | `/settings-subscriptions-assign` | Cancellation, downgrade, payment link, and legacy access assignment | + +The Control sub-tab links out to the standalone advanced assignment page at +`/subscribe/subscriptions/:id/assign` — legacy seat-based plans only. ## Key actions - View current plan, usage breakdown, and billing period. -- Assign/unassign seats to org members. -- Cancel subscription (`CancelSubscriptionModal`). -- Upgrade plan (links to [Subscribe](../subscribe.md) / [Team Checkout](../checkout-team.md)). +- Cancel or downgrade the subscription (`CancelSubscriptionModal`). +- Open the payment link. +- Upgrade the plan (links to [Subscribe](../subscribe.md)). ## Related pages [Settings overview](settings-overview.md), [Subscribe](../subscribe.md), -[License Management](../licenses/license-management.md), -[License Assignment](../licenses/license-assignment.md) +[Settings → License](license.md), +[License Management](../licenses/license-management.md) diff --git a/internal/docindex/docs/routes_guide/settings/prompts.md b/internal/docindex/docs/routes_guide/settings/prompts.md index ec960376..7ec9ad98 100644 --- a/internal/docindex/docs/routes_guide/settings/prompts.md +++ b/internal/docindex/docs/routes_guide/settings/prompts.md @@ -17,3 +17,7 @@ Lets teams see and, where permitted, customize how reviews are prompted. ## Related pages [Settings overview](settings-overview.md), [AI Providers](../ai/ai-providers.md) + +## Learn more (public docs) + +- [Set review rules — tuning severity, sensitive patterns, and critical paths](https://hexmos.com/livereview/docs/git-lrc/configure/set-review-rules) diff --git a/internal/docindex/docs/routes_guide/settings/settings-overview.md b/internal/docindex/docs/routes_guide/settings/settings-overview.md index 3a3ef989..6761dd02 100644 --- a/internal/docindex/docs/routes_guide/settings/settings-overview.md +++ b/internal/docindex/docs/routes_guide/settings/settings-overview.md @@ -13,11 +13,11 @@ tabs. Which tabs are visible depends on the user's role | Tab | id | Who sees it | |---|---|---| -| Instance | `instance` | super_admin only | -| SMTP | `smtp` | super_admin, self-hosted only | -| Storage | `storage` | super_admin only | -| Deployment | `deployment` | super_admin only | -| License | `license` | super_admin (cloud); super_admin or owner (self-hosted) | +| Instance | `instance` | super_admin, or org owner (self-hosted only) | +| SMTP | `smtp` | super_admin or org owner, self-hosted only | +| Storage | `storage` | super_admin, or org owner (self-hosted only) | +| Deployment | `deployment` | super_admin or org owner | +| License | `license` | super_admin or org owner, self-hosted only (tab absent in cloud) | | Prompts | `prompts` | super_admin, or org owner/member | | Learnings | `learnings` | any org member | | API Keys | `api-keys` | any org member | diff --git a/internal/docindex/docs/routes_guide/settings/smtp.md b/internal/docindex/docs/routes_guide/settings/smtp.md index a1ea8dd9..cfb40382 100644 --- a/internal/docindex/docs/routes_guide/settings/smtp.md +++ b/internal/docindex/docs/routes_guide/settings/smtp.md @@ -1,7 +1,8 @@ # Settings → SMTP **Route:** `/settings#smtp` -**Who sees it:** super_admin, self-hosted deployments only (hidden in cloud mode) +**Who sees it:** super_admin or org **owner** (`canManageCurrentOrg`), +self-hosted deployments only (hidden in cloud mode) ## Purpose diff --git a/internal/docindex/docs/routes_guide/settings/storage.md b/internal/docindex/docs/routes_guide/settings/storage.md index 9811aacc..54831468 100644 --- a/internal/docindex/docs/routes_guide/settings/storage.md +++ b/internal/docindex/docs/routes_guide/settings/storage.md @@ -1,7 +1,10 @@ # Settings → Storage **Route:** `/settings#storage` -**Who sees it:** super_admin only +**Who sees it:** super_admin, or an org **owner** on a self-hosted instance +(`canManageInstanceConfig` in `ui/src/pages/Settings/Settings.tsx`). In cloud +mode the blob store is shared across every tenant, so it stays +super_admin-only there. ## Purpose diff --git a/internal/docindex/docs/routes_guide/settings/user-management.md b/internal/docindex/docs/routes_guide/settings/user-management.md index 64fcd59b..2afb9af6 100644 --- a/internal/docindex/docs/routes_guide/settings/user-management.md +++ b/internal/docindex/docs/routes_guide/settings/user-management.md @@ -11,6 +11,11 @@ Manage the org's user roster — invite new users, assign roles (`super_admin`/`owner`/`member`), deactivate users, force password resets. +**This is the one and only place a new team member is added.** There is no +seat to buy or assign first: per-seat licensing is deprecated and an owner can +add unlimited users here. Nothing in Settings -> License, Team Checkout, or +License Assignment is part of onboarding someone. + ## Key actions - View org members and their roles. @@ -24,3 +29,8 @@ Manage the org's user roster — invite new users, assign roles ## Related pages [Settings overview](settings-overview.md) + +## Learn more (public docs) + +- [Collaboration — team rollout patterns that keep adoption smooth](https://hexmos.com/livereview/docs/git-lrc/concepts/collaboration) +- [Roles — suggested responsibilities when adopting LiveReview](https://hexmos.com/livereview/docs/git-lrc/concepts/roles) diff --git a/internal/docindex/docs/routes_guide/subscribe.md b/internal/docindex/docs/routes_guide/subscribe.md index a5a0e5e2..5c8c7c9a 100644 --- a/internal/docindex/docs/routes_guide/subscribe.md +++ b/internal/docindex/docs/routes_guide/subscribe.md @@ -5,8 +5,18 @@ ## Purpose -Plan-selection/upgrade page for cloud orgs — shows available plan tiers and -their features, and kicks off checkout via Razorpay. +Plan-selection/upgrade page for **cloud** orgs — shows available plan tiers +and their features, and kicks off checkout via Razorpay. + +> **Note on seats.** Per-seat licensing is deprecated. Plans are no longer a +> way to buy headcount: an org owner adds as many users as they want in +> [Settings → User Management](settings/user-management.md) without buying or +> assigning a seat first. Upgrading is about plan tier and features, not team +> size. + +Self-hosted instances do not use this page at all — they are unlocked with a +license key instead; see [Settings → License](settings/license.md) and +[Contact us](contact.md). ## Who can access it @@ -15,9 +25,10 @@ Org owner or super_admin (cloud mode). ## Key actions - Compare plans/pricing. -- Start checkout (loads Razorpay checkout script, opens payment modal). +- Start checkout (loads the Razorpay checkout script, opens the payment + modal). ## Related pages -[License Management](licenses/license-management.md), [Team Checkout](checkout-team.md), -[Settings → Plan & Usage](settings/plan-and-usage.md) +[Settings → Plan & Usage](settings/plan-and-usage.md), +[Settings → License](settings/license.md), [Contact us](contact.md) diff --git a/ui/src/pages/Settings/IntegrationsTab.tsx b/ui/src/pages/Settings/IntegrationsTab.tsx index 250641c6..2e378dc3 100644 --- a/ui/src/pages/Settings/IntegrationsTab.tsx +++ b/ui/src/pages/Settings/IntegrationsTab.tsx @@ -625,7 +625,7 @@ const TeamsIntegration: React.FC<{ currentOrg: any }> = ({ currentOrg }) => {

Step-by-step setup:

  1. - In the Azure Portal, create a new Azure Bot resource, name it Livi, and choose Single Tenant. Copy the Microsoft App ID and Directory (tenant) ID Azure shows for it into the fields below. + In the Azure Portal, create a new Azure Bot resource, name it Livi, and choose Single Tenant. Copy the Microsoft App ID and Directory (tenant) ID Azure shows for it into the fields below.
@@ -665,20 +665,6 @@ const TeamsIntegration: React.FC<{ currentOrg: any }> = ({ currentOrg }) => {
    -
  1. - Download the Livi icon below and upload it as the bot's icon on the Azure Bot resource (Configuration > Branding, or during creation). -
  2. -
- -
  1. On the bot resource's Configuration page, set the Messaging endpoint to {window.location.origin}/api/messages.
  2. @@ -698,7 +684,7 @@ const TeamsIntegration: React.FC<{ currentOrg: any }> = ({ currentOrg }) => { className="w-full px-3 py-2 text-sm bg-slate-700 border border-slate-600 rounded-lg text-white placeholder-slate-500 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" /> -
      +
      1. Under the bot resource's Channels, add the Microsoft Teams channel.