From 30e455c8842afdcf3f9125d0def427091745292f Mon Sep 17 00:00:00 2001 From: lovestaco Date: Thu, 10 Sep 2026 19:26:07 +0530 Subject: [PATCH 1/6] Document multi-arch release options in AGENTS.md Fold the still-relevant parts of the internal flyweight wiki page "LiveReview: Publishing Updates for the Self-Hosted Version" into AGENTS.md so the repo is the single source of truth for the release process. The wiki page's docker context steps were already obsolete (dropped in 2825a9b4) and are not carried over. - Document the explicit non-interactive form, make docker-multiarch-push ARGS="--latest --version vX.Y.Z", plus --no-latest for backport tags that must not move :latest. - Document the interactive targets (docker-interactive-multiarch*), note that both paths converge on the same build_docker_image() call, and record the two real differences: --tag vs --version, and that lrops.py docker validates the tag exists while build --docker does not. - Require agents to ask the user which mode to use rather than choosing. - Add a gotcha about disk space on the build machine during multi-arch builds. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_013xQQCYSxKhLKSMiMeBwndL --- AGENTS.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) 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 From 62d558ddb7924f21561ac3ee6fa903843416a2ce Mon Sep 17 00:00:00 2001 From: lovestaco Date: Thu, 10 Sep 2026 19:51:20 +0530 Subject: [PATCH 2/6] fix: contact us --- internal/docindex/docs/routes_guide/README.md | 4 +++ .../docs/routes_guide/checkout-team.md | 7 ++++ .../docindex/docs/routes_guide/contact.md | 36 +++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 internal/docindex/docs/routes_guide/contact.md diff --git a/internal/docindex/docs/routes_guide/README.md b/internal/docindex/docs/routes_guide/README.md index 049bd21a..0515d9b1 100644 --- a/internal/docindex/docs/routes_guide/README.md +++ b/internal/docindex/docs/routes_guide/README.md @@ -13,6 +13,10 @@ 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 diff --git a/internal/docindex/docs/routes_guide/checkout-team.md b/internal/docindex/docs/routes_guide/checkout-team.md index e211c5b4..f3a678ec 100644 --- a/internal/docindex/docs/routes_guide/checkout-team.md +++ b/internal/docindex/docs/routes_guide/checkout-team.md @@ -3,6 +3,13 @@ **Route:** `/checkout/team` **Component:** `ui/src/pages/Checkout/TeamCheckout.tsx` +> **Deprecated - per-seat licensing.** LiveReview no longer gates team size on +> purchased seats. Org owners simply add as many users as they want in +> [Settings -> User Management](settings/user-management.md); no seat needs +> to be bought or assigned first. This page still exists for orgs on legacy +> seat-based subscriptions, but it is **not** part of onboarding a new team +> member - do not recommend it as an onboarding step. + ## Purpose Checkout flow specifically for purchasing a team plan (multiple seats) via diff --git a/internal/docindex/docs/routes_guide/contact.md b/internal/docindex/docs/routes_guide/contact.md new file mode 100644 index 00000000..c3375860 --- /dev/null +++ b/internal/docindex/docs/routes_guide/contact.md @@ -0,0 +1,36 @@ +# 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) From 4ab2857222092ef4318fc26a4bced942b9bbb3cd Mon Sep 17 00:00:00 2001 From: lovestaco Date: Thu, 10 Sep 2026 19:52:44 +0530 Subject: [PATCH 3/6] fix: licence related issues --- .../licenses/license-assignment.md | 7 ++++ .../licenses/license-management.md | 7 ++++ .../docs/routes_guide/settings/license.md | 40 +++++++++++++++++-- .../routes_guide/settings/user-management.md | 5 +++ 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/internal/docindex/docs/routes_guide/licenses/license-assignment.md b/internal/docindex/docs/routes_guide/licenses/license-assignment.md index 543728ce..234209ac 100644 --- a/internal/docindex/docs/routes_guide/licenses/license-assignment.md +++ b/internal/docindex/docs/routes_guide/licenses/license-assignment.md @@ -3,6 +3,13 @@ **Route:** `/subscribe/subscriptions/:id/assign` **Component:** `ui/src/pages/Licenses/LicenseAssignment.tsx` +> **Deprecated - per-seat licensing.** LiveReview no longer gates team size on +> purchased seats. Org owners simply add as many users as they want in +> [Settings -> User Management](../settings/user-management.md); no seat needs +> to be bought or assigned first. This page still exists for orgs on legacy +> seat-based subscriptions, but it is **not** part of onboarding a new team +> member - do not recommend it as an onboarding step. + ## Purpose Assign purchased seats on a specific subscription to individual org diff --git a/internal/docindex/docs/routes_guide/licenses/license-management.md b/internal/docindex/docs/routes_guide/licenses/license-management.md index 8f8b9946..96090a7f 100644 --- a/internal/docindex/docs/routes_guide/licenses/license-management.md +++ b/internal/docindex/docs/routes_guide/licenses/license-management.md @@ -3,6 +3,13 @@ **Route:** `/subscribe/manage` **Component:** `ui/src/pages/Licenses/LicenseManagement.tsx` +> **Deprecated - per-seat licensing.** LiveReview no longer gates team size on +> purchased seats. Org owners simply add as many users as they want in +> [Settings -> User Management](../settings/user-management.md); no seat needs +> to be bought or assigned first. This page still exists for orgs on legacy +> seat-based subscriptions, but it is **not** part of onboarding a new team +> member - do not recommend it as an onboarding step. + ## Purpose Manage an org's active cloud subscription: view plan type, seat quantity, 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/user-management.md b/internal/docindex/docs/routes_guide/settings/user-management.md index 64fcd59b..2e6b8965 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. From ff2445c990e0b4a0bb50328bfdb36487045323eb Mon Sep 17 00:00:00 2001 From: lovestaco Date: Thu, 10 Sep 2026 20:38:44 +0530 Subject: [PATCH 4/6] Correct and expand routes_guide docs for the chatbot corpus Audited every file in internal/docindex/docs/routes_guide against the actual code. Fixes several factual errors that were feeding Livi wrong answers, and fills in the parts of the UI the corpus never described. Access/permission corrections (same class of bug throughout: docs claimed super_admin-only for things org owners can also do): - settings/instance.md, settings/storage.md: gated by canManageInstanceConfig = super_admin or a self-hosted org owner, not super_admin alone. - settings/deployment.md, settings/smtp.md: gated by canManageCurrentOrg = owner or super_admin. - settings/settings-overview.md: same corrections in the summary table. - reports/*: the /api/v1/reports/* groups are RequireAuth + org context, i.e. any org member; only the Reports mega-menu section is owner/admin-gated. Both facts are now stated separately. Content corrections and expansion: - reports/onboarding-report.md: the stated purpose was wrong. It is not a per-member setup checklist; it is a 57-chart org analytics report over seven sections, built from internal/onboardingreport/templates.json, with an async PDF/HTML export job. The per-person checklist actually lives on the Dashboard, which is what made this page easy to misdescribe. - reports/taxonomy-reports.md: document the three modes, the URL-parameter filter set that makes mega-menu deep links work, the /summary fields, and the CSV/XLSX dataset exports alongside the PDF impact report. - dashboard.md: the doc omitted DashboardGrid entirely. Document the period selector, per-user layout persistence, and all 13 widgets with how to read each chart and where it drills through. - settings/integrations.md: replace the stub with the real Slack, Microsoft Teams, and Discord setup steps as the UI presents them. Also drop the Livi icon download step from the Teams setup flow in IntegrationsTab.tsx, and renumber the remaining steps - they previously rendered 1,2,3,4,6,7,8, skipping 5. Deleted route docs for pages being retired (per-seat licensing is deprecated) and several auth/chatbot pages. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_013xQQCYSxKhLKSMiMeBwndL --- .../routes_guide/admin-billing-portfolio.md | 26 ---- .../docindex/docs/routes_guide/auth/login.md | 27 ---- .../docs/routes_guide/auth/oauth-callback.md | 28 ---- .../docindex/docs/routes_guide/auth/setup.md | 23 ---- .../docs/routes_guide/chatbot/chatbot.md | 42 ------ .../docs/routes_guide/checkout-team.md | 28 ---- .../docindex/docs/routes_guide/dashboard.md | 120 ++++++++++++++++-- .../licenses/license-assignment.md | 32 ----- .../routes_guide/reports/onboarding-report.md | 67 +++++++++- .../routes_guide/reports/taxonomy-reports.md | 76 +++++++++-- .../docs/routes_guide/settings/deployment.md | 3 +- .../docs/routes_guide/settings/instance.md | 5 +- .../routes_guide/settings/integrations.md | 98 +++++++++++++- .../settings/settings-overview.md | 10 +- .../docs/routes_guide/settings/smtp.md | 3 +- .../docs/routes_guide/settings/storage.md | 5 +- ui/src/pages/Settings/IntegrationsTab.tsx | 16 +-- 17 files changed, 343 insertions(+), 266 deletions(-) delete mode 100644 internal/docindex/docs/routes_guide/admin-billing-portfolio.md delete mode 100644 internal/docindex/docs/routes_guide/auth/login.md delete mode 100644 internal/docindex/docs/routes_guide/auth/oauth-callback.md delete mode 100644 internal/docindex/docs/routes_guide/auth/setup.md delete mode 100644 internal/docindex/docs/routes_guide/chatbot/chatbot.md delete mode 100644 internal/docindex/docs/routes_guide/checkout-team.md delete mode 100644 internal/docindex/docs/routes_guide/licenses/license-assignment.md 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/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 f3a678ec..00000000 --- a/internal/docindex/docs/routes_guide/checkout-team.md +++ /dev/null @@ -1,28 +0,0 @@ -# Team Checkout - -**Route:** `/checkout/team` -**Component:** `ui/src/pages/Checkout/TeamCheckout.tsx` - -> **Deprecated - per-seat licensing.** LiveReview no longer gates team size on -> purchased seats. Org owners simply add as many users as they want in -> [Settings -> User Management](settings/user-management.md); no seat needs -> to be bought or assigned first. This page still exists for orgs on legacy -> seat-based subscriptions, but it is **not** part of onboarding a new team -> member - do not recommend it as an onboarding step. - -## 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/dashboard.md b/internal/docindex/docs/routes_guide/dashboard.md index 4d87c909..e2ef5a92 100644 --- a/internal/docindex/docs/routes_guide/dashboard.md +++ b/internal/docindex/docs/routes_guide/dashboard.md @@ -4,29 +4,125 @@ 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) 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 234209ac..00000000 --- a/internal/docindex/docs/routes_guide/licenses/license-assignment.md +++ /dev/null @@ -1,32 +0,0 @@ -# License Assignment - -**Route:** `/subscribe/subscriptions/:id/assign` -**Component:** `ui/src/pages/Licenses/LicenseAssignment.tsx` - -> **Deprecated - per-seat licensing.** LiveReview no longer gates team size on -> purchased seats. Org owners simply add as many users as they want in -> [Settings -> User Management](../settings/user-management.md); no seat needs -> to be bought or assigned first. This page still exists for orgs on legacy -> seat-based subscriptions, but it is **not** part of onboarding a new team -> member - do not recommend it as an onboarding step. - -## 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/reports/onboarding-report.md b/internal/docindex/docs/routes_guide/reports/onboarding-report.md index 6af8cccf..edbb1a88 100644 --- a/internal/docindex/docs/routes_guide/reports/onboarding-report.md +++ b/internal/docindex/docs/routes_guide/reports/onboarding-report.md @@ -2,22 +2,75 @@ **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 diff --git a/internal/docindex/docs/routes_guide/reports/taxonomy-reports.md b/internal/docindex/docs/routes_guide/reports/taxonomy-reports.md index 45cd30e0..bab44739 100644 --- a/internal/docindex/docs/routes_guide/reports/taxonomy-reports.md +++ b/internal/docindex/docs/routes_guide/reports/taxonomy-reports.md @@ -1,25 +1,81 @@ # 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) 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..f932c54a 100644 --- a/internal/docindex/docs/routes_guide/settings/integrations.md +++ b/internal/docindex/docs/routes_guide/settings/integrations.md @@ -1,19 +1,103 @@ # 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) 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/ui/src/pages/Settings/IntegrationsTab.tsx b/ui/src/pages/Settings/IntegrationsTab.tsx index 250641c6..d48ea79c 100644 --- a/ui/src/pages/Settings/IntegrationsTab.tsx +++ b/ui/src/pages/Settings/IntegrationsTab.tsx @@ -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.
      2. From de5b6acfaeee77f15bc0637e7cadda01eb550b8e Mon Sep 17 00:00:00 2001 From: lovestaco Date: Thu, 10 Sep 2026 20:44:19 +0530 Subject: [PATCH 5/6] Retire seat-based framing and link routes_guide to the public docs Two follow-ups to the routes_guide audit. Per-seat licensing is deprecated, but three pages still described the seat flow as the current way to make room for a team member: - subscribe.md: upgrading is about plan tier and features, not headcount. Also note self-hosted instances never use this page - they unlock with a license key instead. - licenses/license-management.md: marked a legacy page. Seat quantity is historical detail on older subscriptions; the page's live use (view plan, cancel) is documented as such. - settings/plan-and-usage.md: document the Overview / Breakdown / Control sub-tabs and their deep links, and scope the assignment UI to legacy seat plans. This also clears the last dangling links left by the deleted route docs. Then, where a page is also covered by the public documentation site, add a "Learn more (public docs)" section linking to it (15 files). URLs follow the hexmos.com/livereview/docs base, mirroring the layout of the hexmos_docs corpus, and every URL was checked against that synced copy so none of them 404. README.md records the convention, including the rule that only pages actually present in hexmos_docs may be linked. Note git-lrc/configure/integrations covers AI connector management (BYOK) despite its name, so it is linked from ai/ai-providers.md rather than git/git-providers.md, which has no public counterpart. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_013xQQCYSxKhLKSMiMeBwndL --- internal/docindex/docs/routes_guide/README.md | 15 ++++++++ .../docs/routes_guide/ai/ai-providers.md | 4 ++ .../docindex/docs/routes_guide/contact.md | 4 ++ .../docindex/docs/routes_guide/dashboard.md | 4 ++ .../licenses/license-management.md | 29 +++++++------- .../routes_guide/reports/onboarding-report.md | 4 ++ .../routes_guide/reports/taxonomy-reports.md | 5 +++ .../docs/routes_guide/reviews/ci-cd-gates.md | 5 +++ .../routes_guide/reviews/create-review-cli.md | 6 +++ .../routes_guide/reviews/create-review-mcp.md | 5 +++ .../routes_guide/reviews/review-detail.md | 4 ++ .../docs/routes_guide/settings/api-keys.md | 4 ++ .../routes_guide/settings/integrations.md | 7 ++++ .../docs/routes_guide/settings/learnings.md | 5 +++ .../routes_guide/settings/mcp-integration.md | 6 +++ .../routes_guide/settings/plan-and-usage.md | 38 ++++++++++++++----- .../docs/routes_guide/settings/prompts.md | 4 ++ .../routes_guide/settings/user-management.md | 5 +++ .../docindex/docs/routes_guide/subscribe.md | 21 +++++++--- 19 files changed, 146 insertions(+), 29 deletions(-) diff --git a/internal/docindex/docs/routes_guide/README.md b/internal/docindex/docs/routes_guide/README.md index 0515d9b1..db85cf06 100644 --- a/internal/docindex/docs/routes_guide/README.md +++ b/internal/docindex/docs/routes_guide/README.md @@ -23,6 +23,21 @@ not implementation detail. - **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/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/contact.md b/internal/docindex/docs/routes_guide/contact.md index c3375860..f5fd8057 100644 --- a/internal/docindex/docs/routes_guide/contact.md +++ b/internal/docindex/docs/routes_guide/contact.md @@ -34,3 +34,7 @@ Every channel reaches the same engineers who set your instance up. [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 e2ef5a92..e497abd3 100644 --- a/internal/docindex/docs/routes_guide/dashboard.md +++ b/internal/docindex/docs/routes_guide/dashboard.md @@ -126,3 +126,7 @@ yet, not that something is wrong. 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-management.md b/internal/docindex/docs/routes_guide/licenses/license-management.md index 96090a7f..f8baa090 100644 --- a/internal/docindex/docs/routes_guide/licenses/license-management.md +++ b/internal/docindex/docs/routes_guide/licenses/license-management.md @@ -3,18 +3,19 @@ **Route:** `/subscribe/manage` **Component:** `ui/src/pages/Licenses/LicenseManagement.tsx` -> **Deprecated - per-seat licensing.** LiveReview no longer gates team size on -> purchased seats. Org owners simply add as many users as they want in -> [Settings -> User Management](../settings/user-management.md); no seat needs -> to be bought or assigned first. This page still exists for orgs on legacy -> seat-based subscriptions, but it is **not** part of onboarding a new team -> member - do not recommend it as an onboarding step. +> **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 @@ -22,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 edbb1a88..c2e1aa4c 100644 --- a/internal/docindex/docs/routes_guide/reports/onboarding-report.md +++ b/internal/docindex/docs/routes_guide/reports/onboarding-report.md @@ -75,3 +75,7 @@ Formats are **PDF** and **HTML** (`internal/onboardingreport/generate_pdf.go`, ## 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 bab44739..9996bce9 100644 --- a/internal/docindex/docs/routes_guide/reports/taxonomy-reports.md +++ b/internal/docindex/docs/routes_guide/reports/taxonomy-reports.md @@ -79,3 +79,8 @@ per-repository/provider breakdown, and category↔subcategory relations. [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/integrations.md b/internal/docindex/docs/routes_guide/settings/integrations.md index f932c54a..99a1cb6b 100644 --- a/internal/docindex/docs/routes_guide/settings/integrations.md +++ b/internal/docindex/docs/routes_guide/settings/integrations.md @@ -101,3 +101,10 @@ Livi through an installed app. [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/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/user-management.md b/internal/docindex/docs/routes_guide/settings/user-management.md index 2e6b8965..2afb9af6 100644 --- a/internal/docindex/docs/routes_guide/settings/user-management.md +++ b/internal/docindex/docs/routes_guide/settings/user-management.md @@ -29,3 +29,8 @@ License Assignment is part of onboarding someone. ## 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) From 45723ddd1049aa119068d1eece59ca27cc681bb4 Mon Sep 17 00:00:00 2001 From: lovestaco Date: Thu, 10 Sep 2026 20:54:22 +0530 Subject: [PATCH 6/6] fix: azure link --- internal/docindex/docs/routes_guide/settings/integrations.md | 2 +- ui/src/pages/Settings/IntegrationsTab.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/docindex/docs/routes_guide/settings/integrations.md b/internal/docindex/docs/routes_guide/settings/integrations.md index 99a1cb6b..8f5b476d 100644 --- a/internal/docindex/docs/routes_guide/settings/integrations.md +++ b/internal/docindex/docs/routes_guide/settings/integrations.md @@ -49,7 +49,7 @@ 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** +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 diff --git a/ui/src/pages/Settings/IntegrationsTab.tsx b/ui/src/pages/Settings/IntegrationsTab.tsx index d48ea79c..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.