Skip to content

web: agent landing pages, /agents hub, and JSON-LD across content pages - #6683

Merged
lawrencecchen merged 11 commits into
mainfrom
feat-seo-agent-pages-schema
Jun 23, 2026
Merged

lawrencecchen merged 11 commits into
mainfrom
feat-seo-agent-pages-schema

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Jun 23, 2026 •

Copy link
Copy Markdown
Contributor

Competitive SEO gap-fill vs warp.dev. Two changes, both web-only.

#4 Per-agent landing pages + hub

New localized landing pages mirroring the existing /claude-code-terminal pattern:

  • /agents — hub introducing cmux as the terminal for coding agents, links all seven
  • /gemini-cli, /aider, /amp, /cursor-cli

Each covers how cmux helps run that agent (parallel workspaces, notification rings, vertical tabs, iOS companion, scriptable socket). Registered in sitemap.ts; cross-linked via landing.links.

#5 Structured data on content pages

Previously only SoftwareApplication (global) + FAQPage (homepage). Added a reusable JSON-LD helper and applied:

  • FAQPage + BreadcrumbList on every agent landing page
  • Article + BreadcrumbList on every blog post
  • BreadcrumbList on every docs page

Localization

All new copy (5 namespaces + FAQ + cross-links) translated into all 20 locales. Audit: every new key present in every catalog, no English fallback.

tsc clean. Web-only, no app/runtime changes.


View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.


Note

Low Risk
Marketing-site and i18n-only changes with no app runtime or auth impact; main risk is broken old URLs or registry drift if redirects or sitemap/agent paths are incomplete.

Overview
Adds a coding-agents SEO hub at /agents plus per-agent pages (Gemini CLI, Aider, Amp, Cursor CLI) and moves Claude Code, Codex, and OpenCode from top-level slugs to /agents/*, with matching updates to sitemap, agentReadablePages, /guides ARTICLES, and landing.links cross-links.

Introduces shared json-ld helpers and wires FAQ + breadcrumb JSON-LD on agent landings (LandingSchema / LandingFaq), Article + breadcrumbs on blog posts (BlogSchema), and breadcrumbs on docs (DocsSchema). Existing agent pages gain FAQ sections and updated related links.

Adds a landing-page registry parity review rule (CodeRabbit, Greptile, pre-merge check) so new (landing) routes must stay in sync across sitemap, agent-readable paths, guides index, and nav copy. Full locale catalogs gain new landing.* namespaces, FAQ strings, and link labels for the new pages.

Reviewed by Cursor Bugbot for commit 5f10591. Bugbot is set up for automated code reviews on this repo. Configure here.


Summary by cubic

Add agent landing pages under /agents with a new hub and shared FAQ UI. Add JSON‑LD across agents, blog, and docs, and redirect old HTML and .md/.txt slugs.

  • New Features

    • New URL structure: /agents hub and /agents/{claude-code,codex,opencode,gemi­ni-cli,aider,amp,cursor-cli} with breadcrumbs Home > Agents > .
    • Reusable JSON‑LD helper; applied to agents (FAQ + breadcrumbs), blog posts (Article + breadcrumbs), and docs (breadcrumbs).
    • 20‑locale alternates and cross‑links via landing.links; sitemap and /guides updated.
    • FAQ UI matches the homepage with inline <code> rendering.
  • Bug Fixes

    • Registered /agents and all /agents/* pages in agentReadablePages so .md/.txt variants and llms.txt work; tests pass.
    • Permanent redirects from /claude-code-terminal, /codex-cli, /opencode to new /agents/* paths, including their .md/.txt variants and explicit /en‑prefixed routes.
    • Landing‑page registry parity rule for review bots to flag new (landing) pages missing entries in sitemap.ts, agentReadablePages, /guides ARTICLES, or landing.links.
    • Fixed /km runtime crash by adding missing Khmer landing.links.home and agent FAQ keys.
    • Fixed agent JSON‑LD FAQ answers by reading raw strings (handles <code> markup and ICU chars), so localized answers render correctly.

Written for commit 5f10591. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features

    • Added new agent landing pages for Aider, AMP, Cursor CLI, and Gemini CLI with localized content and FAQs
    • Added agents hub page for discovering and selecting coding agents
    • Enhanced SEO with structured data markup for landing pages, blog posts, and documentation
  • Refactor

    • Reorganized agent routes under /agents/* path structure with permanent redirects from old locations
  • Chores

    • Updated multi-language translations with new agent content, FAQs, and navigation entries
    • Added landing page registry parity checks to enforce content consistency

… pages

Add per-agent landing pages for Gemini CLI, Aider, Amp, and Cursor CLI,
plus an /agents hub that links every agent page. Each mirrors the existing
claude-code-terminal pattern (workspaces, notification rings, iOS, scriptable).

Add reusable JSON-LD helpers (json-ld.tsx) and render:
- FAQPage + BreadcrumbList on all agent landing pages (3 existing + 4 new + hub)
- Article + BreadcrumbList on all blog posts
- BreadcrumbList on all docs pages

Register new paths in sitemap.ts and add landing.links entries. English
content only in this commit; other locales follow.
@vercel

vercel Bot commented Jun 23, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Canceled Canceled Jun 23, 2026 1:37pm
cmux-staging Building Building Preview, Comment Jun 23, 2026 1:37pm

@coderabbitai

coderabbitai Bot commented Jun 23, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds five new localized agent landing pages under /agents/* (aider, amp, cursor-cli, gemini-cli, and a hub page), migrates existing agent pages from legacy top-level routes to /agents/<slug> with permanent redirects, introduces a shared JSON-LD utility module with LandingSchema/LandingFaq, DocsSchema, and BlogSchema components applied across all landing/docs/blog pages, expands i18n content with FAQ blocks and new agent sections in 20 languages, and adds a landing-page registry parity review rule.

Changes

Agent Landing Pages, JSON-LD Schema, and i18n Expansion

Layer / File(s) Summary
JSON-LD utility module
web/app/[locale]/components/json-ld.tsx
Adds localizedUrl, JsonLd component, breadcrumbList, faqPage, and articleSchema builders as the shared foundation for all schema components.
LandingSchema/LandingFaq, DocsSchema, BlogSchema components
web/app/[locale]/(landing)/landing-schema.tsx, web/app/[locale]/docs/docs-schema.tsx, web/app/[locale]/blog/blog-schema.tsx
Introduces LandingSchema (FAQPage + BreadcrumbList JSON-LD with optional agents crumb), LandingFaq (localized FAQ section), DocsSchema (Home→Docs→page breadcrumb), and BlogSchema (article + breadcrumb JSON-LD for blog posts).
New agent landing pages
web/app/[locale]/(landing)/agents/page.tsx, web/app/[locale]/(landing)/agents/aider/page.tsx, .../amp/page.tsx, .../cursor-cli/page.tsx, .../gemini-cli/page.tsx
Adds hub /agents page with AGENTS link list plus four new agent-specific pages, each with generateMetadata, LandingSchema, rich-text sections, LandingFaq, and LandingCTA.
Updated existing landing pages
web/app/[locale]/(landing)/agents/claude-code/page.tsx, .../codex/page.tsx, .../opencode/page.tsx, .../best-terminal-for-mac/page.tsx, .../guides/page.tsx
Adds LandingSchema/LandingFaq to existing agent pages, updates SEO alternates and CTA related links to use /agents/* routes, and adds agent guide entries to the ARTICLES list.
Sitemap, agent-page-paths, and redirects
web/app/sitemap.ts, web/app/lib/agent-page-paths.ts, web/next.config.ts
Replaces legacy /claude-code-terminal, /codex-cli, /opencode entries with /agents/* routes in the sitemap and agentReadablePages, and adds permanent Next.js redirects for both bare and locale-prefixed legacy slugs.
DocsSchema on all docs pages
web/app/[locale]/docs/**/*.tsx
Imports and renders <DocsSchema namespace="..." path="..." /> inside every docs page (20+ pages).
BlogSchema on all blog pages
web/app/[locale]/blog/*/page.tsx
Imports and renders <BlogSchema postKey="..." path="..." datePublished="..." /> inside every blog post page (16 pages).
i18n: FAQ blocks + new agents sections across 20 locales
web/messages/*.json
Adds FAQ Q/A blocks under existing claude/codex/opencode landing sections and introduces full landing.agents content trees (agents, geminiCli, aider, amp, cursorCli) with landing.links expansions across ar, bs, da, de, en, es, fr, it, ja, km, ko, no, pl, pt-BR, ru, th, tr, uk, zh-CN, zh-TW.
Landing-page registry parity review rules
.github/review-bot-rules/landing-page-registry-parity.md, .coderabbit.yaml, .greptile/config.json, .greptile/files.json, .greptile/rules.md, .github/review-bot-rules/README.md
Adds a registry parity rule requiring new landing pages to be registered in sitemap, agentReadablePages, guides ARTICLES, and landing.links, wired into coderabbit path instructions, a pre-merge custom check, and greptile configuration.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • manaflow-ai/cmux#6642: Directly modifies the same landing-page registries (web/app/sitemap.ts, web/app/lib/agent-page-paths.ts, guides ARTICLES) for the /claude-code-terminal, /codex-cli, /opencode, and /best-terminal-for-mac routes that this PR migrates to /agents/*.
  • manaflow-ai/cmux#6673: Modifies the same agentReadablePages and web/app/sitemap.ts registry variables, making it a direct conflict surface with this PR's route migration.
  • manaflow-ai/cmux#6523: Updates the same web/app/lib/agent-page-paths.ts and web/app/sitemap.ts registries with newly introduced landing page route paths.

Poem

🐇 Hop, hop — the agents have a home at last,
Five new pages planted, routes recast!
JSON-LD breadcrumbs trail through every page,
FAQs translated, locales all the rage.
Old slugs redirect with a permanent wave,
The registry parity rule keeps devs behaved! 🌿

🚥 Pre-merge checks | ✅ 24 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 14.06% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (24 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main changes: new agent landing pages under /agents, a hub page, and JSON-LD structured data on content pages.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Swift Actor Isolation ✅ Passed PR is web-only (TypeScript/React/JSON); contains zero Swift code changes. Swift actor isolation check is not applicable.
Cmux Swift Blocking Runtime ✅ Passed PR is web-only (Next.js/TypeScript/i18n) with zero Swift file changes; custom check applies only to Swift blocking runtime patterns, so it is not applicable.
Cmux Expensive Synchronous Load ✅ Passed PR is web-only (51 TSX, 22 JSON, 3 TS, 3 MD files) with zero Swift changes; custom check for expensive synchronous loads in Swift production code is not applicable.
Cmux Cache Substitution Correctness ✅ Passed PR contains no cache substitution patterns. Changes are web-only marketing content, localization, static configuration, and SEO metadata with no persistence, history, undo, or snapshot operations.
Cmux No Hacky Sleeps ✅ Passed PR contains no production TypeScript/JavaScript timing workarounds: new landing pages, schema helpers, and localization are pure deterministic code with no sleeps, timeouts, or wall-clock race patc...
Cmux Algorithmic Complexity ✅ Passed PR introduces only constant-time schema builders (fixed FAQ/breadcrumb sizes) and build-time operations (sitemap, redirects). No new algorithmic complexity violations: JSON-LD helpers handle bounde...
Cmux Swift Concurrency ✅ Passed PR contains only web-side changes (TypeScript, JSON, config); no Swift code modifications present. Custom check for Swift concurrency is not applicable.
Cmux Swift @Concurrent ✅ Passed This PR contains no Swift code changes. It is web-only (TypeScript/TSX, JSON, YAML, Markdown files). The Swift @concurrent annotation check is not applicable.
Cmux Swift File And Package Boundaries ✅ Passed PR contains no Swift file changes; check applies only to Swift files and does not apply to TypeScript/React/JSON changes in web/.
Cmux Swiftpm Lockfiles ✅ Passed PR contains only web-only changes (Next.js pages, TypeScript, i18n, config). No SwiftPM packages, Xcode projects, .gitignore, or Package.resolved files were modified.
Cmux Swift Logging ✅ Passed PR contains no Swift file modifications (web-only marketing/SEO changes); check is not applicable to TypeScript/config-only diffs.
Cmux User-Facing Error Privacy ✅ Passed PR adds marketing landing pages, SEO schemas, and localization without user-facing errors, sensitive data, or implementation details exposure.
Cmux Full Internationalization ✅ Passed All user-facing web content reads from next-intl translation sources; all 20 locales have matching translations for 5 new landing namespaces; schema components use next-intl with locale parameters;...
Cmux Swiftui State Layout ✅ Passed PR is web-only with no SwiftUI changes; custom check for SwiftUI state/layout violations is not applicable to TypeScript/React web content.
Cmux Architecture Rethink ✅ Passed This PR contains 80 web-only changes (TypeScript/React, JSON, YAML) with zero Swift files. The Swift-architectural-rethink check is not applicable to non-Swift code.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR contains no Swift changes; all modifications are web-only (TypeScript, JSON, YAML, Markdown). Check for Swift auxiliary windows is not applicable.
Cmux Source Artifacts ✅ Passed All changed files are intentional source code, configs, review rules, and localization catalogs with no artifact patterns (.next/, .cache/, tmp/, logs, etc) per source-control-artifacts.md.
Cmux No Test Or Debug Seam In Production Source ✅ Passed PR contains only web/TypeScript/i18n/config changes; no Swift files under Sources/ are modified, making this check inapplicable.
Cmux No Ambient Global State ✅ Passed Custom check applies only to Swift production code. This PR is web-only (TypeScript/TSX/JSON/YAML), containing no Swift files.
Cmux Hot Path Allocating Formatting ✅ Passed This PR contains no Swift code. The check for hot-path allocating formatting is inapplicable—this is a web-only PR (Next.js/TypeScript) adding landing pages, JSON-LD schemas, and localization.
Description check ✅ Passed The pull request description is comprehensive, well-structured, and clearly explains the changes, objectives, and testing approach.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat-seo-agent-pages-schema

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Comment thread web/app/[locale]/(landing)/landing-schema.tsx Outdated
Fixes web-typecheck (bun test) failure: agent-page-variants.test asserts every
sitemap page resolves to a Markdown/text variant. Adds /agents, /gemini-cli,
/aider, /amp, /cursor-cli to agentReadablePages so they also appear in llms.txt.
Comment thread web/app/[locale]/(landing)/landing-schema.tsx Outdated
@greptile-apps

greptile-apps Bot commented Jun 23, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR fills an SEO gap by adding a /agents hub page and individual landing pages for Gemini CLI, Aider, Amp, and Cursor CLI — mirroring the existing Claude Code/Codex/OpenCode pattern — then reorganizing all agent pages under /agents/* with permanent redirects from the old top-level slugs. A new json-ld.tsx helper emits FAQPage + BreadcrumbList on every agent landing, Article + BreadcrumbList on every blog post, and BreadcrumbList on every docs page.

  • Registry parity: All new pages are correctly registered in sitemap.ts, agentReadablePages, the /guides ARTICLES list, and landing.links; agentReadablePages/sitemap.ts are kept in sync.
  • Redirects: next.config.ts emits permanent redirects from the three old paths including their .md/.txt variants and explicit /en-prefixed routes, with correct locale-capture patterns.
  • i18n: The LandingFaq component correctly uses t.rich() to render <code> tags in FAQ answers, and LandingSchema uses t.raw() + stripTags() to produce clean plain-text JSON-LD.

Confidence Score: 5/5

Web-only marketing and SEO change with no app or runtime impact; all registries are in sync and redirects correctly cover old paths.

All registry entries (sitemap, agentReadablePages, guides ARTICLES, landing.links) are kept in sync for every new page. The previously-flagged FAQ rendering bug is correctly fixed using t.rich() in LandingFaq and t.raw()+stripTags() in LandingSchema. The km.json missing keys are addressed. Redirects cover all three moved slugs with .md/.txt variants and locale prefixes. No logic errors or missing registrations were found.

No files require special attention.

Important Files Changed

Filename Overview
web/app/[locale]/components/json-ld.tsx New JSON-LD helper; correctly escapes < to \u003c, breadcrumbList/faqPage/articleSchema all produce valid schema.org output.
web/app/[locale]/(landing)/landing-schema.tsx LandingSchema uses t.raw()+stripTags() for JSON-LD (avoiding ICU/HTML double-parse), LandingFaq uses t.rich() for correct code-tag rendering.
web/next.config.ts Permanent redirects cover bare English, /en-prefixed, and all 19 locale-prefixed variants of the three moved paths, including .md/.txt extensions.
web/app/lib/agent-page-paths.ts agentReadablePages correctly updated: old top-level slugs replaced by /agents/* entries; 8 new paths added in sync with sitemap.ts.
web/app/sitemap.ts Old landing paths removed, 8 new /agents/* paths added with correct priorities; stays in sync with agentReadablePages.
web/app/[locale]/(landing)/agents/page.tsx Hub page correctly uses agentsCrumb=false for schema, links all 7 agent pages, and reads from landing.agents namespace.
web/app/[locale]/(landing)/guides/page.tsx ARTICLES list updated to include /agents hub and all 7 /agents/* pages, consistent with sitemap and agentReadablePages.
web/app/[locale]/blog/blog-schema.tsx New BlogSchema emits Article + BreadcrumbList; reads title from blog.posts namespace and description from blog namespace.
web/app/[locale]/docs/docs-schema.tsx New DocsSchema emits BreadcrumbList using landing.links.home (new key added to all locales in this PR) and nav.docs (pre-existing).
web/messages/en.json New namespaces (agents, geminiCli, aider, amp, cursorCli) plus faqQ/A keys for existing three agents and new landing.links keys all present.
web/messages/km.json Previously-flagged missing landing.links.home and agent FAQ keys are now present in Khmer locale.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["/claude-code-terminal"] -->|301 redirect| C
    A2["/codex-cli"] -->|301 redirect| D
    A3["/opencode"] -->|301 redirect| E
    B["/agents hub"]
    B --> C["/agents/claude-code"]
    B --> D["/agents/codex"]
    B --> E["/agents/opencode"]
    B --> F["/agents/gemini-cli NEW"]
    B --> G["/agents/aider NEW"]
    B --> H["/agents/amp NEW"]
    B --> I["/agents/cursor-cli NEW"]
    C & D & E & F & G & H & I --> N[LandingSchema FAQPage + BreadcrumbList]
    J[Blog pages] --> O[BlogSchema Article + BreadcrumbList]
    K[Docs pages] --> P[DocsSchema BreadcrumbList]
    N & O & P --> Q[json-ld.tsx helper]
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A["/claude-code-terminal"] -->|301 redirect| C
    A2["/codex-cli"] -->|301 redirect| D
    A3["/opencode"] -->|301 redirect| E
    B["/agents hub"]
    B --> C["/agents/claude-code"]
    B --> D["/agents/codex"]
    B --> E["/agents/opencode"]
    B --> F["/agents/gemini-cli NEW"]
    B --> G["/agents/aider NEW"]
    B --> H["/agents/amp NEW"]
    B --> I["/agents/cursor-cli NEW"]
    C & D & E & F & G & H & I --> N[LandingSchema FAQPage + BreadcrumbList]
    J[Blog pages] --> O[BlogSchema Article + BreadcrumbList]
    K[Docs pages] --> P[DocsSchema BreadcrumbList]
    N & O & P --> Q[json-ld.tsx helper]
Loading

Reviews (4): Last reviewed commit: "web: use raw FAQ strings in landing JSON..." | Re-trigger Greptile

Comment thread web/messages/km.json
@@ -1718,7 +1718,127 @@
"ohMyCodex": "oh-my-codex",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Missing FAQ keys in Khmer locale

The Khmer (km.json) catalog is the only locale that didn't receive the new FAQ keys for the three existing agent landing pages. landing.claude, landing.codex, and landing.opencode are each missing faqTitle, faqQ1–faqQ4, and faqA1–faqA4 (27 keys total). Additionally, landing.links.home is absent from km.json while it is present in all 19 other locales.

At runtime, next-intl will either throw or silently fall back to the key name for Khmer visitors on /km/claude-code-terminal, /km/codex-cli, /km/opencode, and every page that renders a Home > breadcrumb (docs, blog, and all agent landings). The PR description says "every new key present in every catalog, no English fallback" but that's not the case for km.json.

Rule Used: Flag production user-facing text that is not fully... (source)

Comment on lines +49 to +64
export function LandingFaq({ namespace }: { namespace: string }) {
const t = useTranslations(namespace);
return (
<>
<h2>{t("faqTitle")}</h2>
{[1, 2, 3, 4].map((n) => (
<div key={n}>
<p>
<strong>{t(`faqQ${n}`)}</strong>
</p>
<p>{t(`faqA${n}`)}</p>
</div>
))}
</>
);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 FAQ answers with HTML tags rendered as literal text

LandingFaq renders answer strings with a plain {t('faqA1')} call, but every agent namespace's faqA1 value contains an HTML <code>...</code> tag (e.g. "so <code>claude</code> runs in any workspace"). next-intl's t() returns the raw string; React then auto-escapes it, so users will see the literal characters <code>claude</code> in the FAQ section instead of a styled code element.

The intro paragraphs on the same pages correctly use t.rich("intro", { code }) to process the same tag pattern. The FAQ answers need the same treatment, or the <code> tags need to be removed from the message values.

Suggested change
export function LandingFaq({ namespace }: { namespace: string }) {
const t = useTranslations(namespace);
return (
<>
<h2>{t("faqTitle")}</h2>
{[1, 2, 3, 4].map((n) => (
<div key={n}>
<p>
<strong>{t(`faqQ${n}`)}</strong>
</p>
<p>{t(`faqA${n}`)}</p>
</div>
))}
</>
);
}
/** Renders the localized FAQ section body for an agent landing page. */
export function LandingFaq({ namespace }: { namespace: string }) {
const t = useTranslations(namespace);
const code = (chunks: React.ReactNode) => <code>{chunks}</code>;
return (
<>
<h2>{t("faqTitle")}</h2>
{[1, 2, 3, 4].map((n) => (
<div key={n}>
<p>
<strong>{t.rich(`faqQ${n}`, { code })}</strong>
</p>
<p>{t.rich(`faqA${n}`, { code })}</p>
</div>
))}
</>
);
}

LandingFaq now uses the homepage FAQ treatment (muted section heading,
medium-weight question, muted answer, space-y-5) and renders answers with
t.rich so inline <code> tokens (e.g. gemini, aider) display as code instead
of literal tag text. Shared across all agent landing pages.
New (landing) pages must be registered in sitemap.ts, agentReadablePages
(agent-page-paths.ts), the /guides ARTICLES list, and landing.links. Wired
into CodeRabbit (path instructions + blocking check) and Greptile (config
rule + files entry + rules.md). Codifies the gap that left the new agent
pages out of agentReadablePages and /guides in this PR.
Move the seven agent landing pages under the /agents hub:
- /claude-code-terminal -> /agents/claude-code
- /codex-cli -> /agents/codex
- /opencode -> /agents/opencode
- new: /agents/{gemini-cli,aider,amp,cursor-cli}

Permanent redirects (bare + all locale prefixes) keep the three previously
shipped slugs working. Updates sitemap, agentReadablePages (md/txt + llms.txt),
the /guides index, breadcrumb schema, and all internal cross-links. Breadcrumbs
now read Home > Agents > <agent> matching the URL structure.
LandingSchema/DocsSchema/BlogSchema read landing.links.home, and the moved
claude/codex/opencode pages render LandingFaq, but km.json was missing
links.home and faqTitle/faqQ1-4/faqA1-4 for claude/codex/opencode. That threw
missing-message errors on every /km docs, blog, and agents page. Adds the
Khmer translations. Caught by autoreview.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

There are 2 total unresolved issues (including 1 from previous review).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit fda825d. Configure here.

Comment thread web/app/lib/agent-page-paths.ts
The slug move only redirected HTML paths; old agent-readable variants
(/codex-cli.md, /opencode.txt, /claude-code-terminal.md, locale-prefixed)
404'd. They were live and advertised in llms.txt, so redirect .md/.txt to the
new /agents/<agent> variants too. Caught by autoreview.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@web/next.config.ts`:
- Around line 14-15: The localePrefix variable at line 15 contains a hardcoded
list of locales as a string pattern, which duplicates locale ownership and can
get out of sync when new locales are added. Instead of maintaining this
hardcoded matcher, import the locale registry from the shared source, filter out
the default locale (en), and dynamically build the localePrefix pattern by
joining the remaining locales with pipe separators. This ensures the redirect
locale matcher automatically stays in sync with any locale additions made to the
central registry.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 3c10530a-5dd0-4515-bedc-1f323096cac6

📥 Commits

Reviewing files that changed from the base of the PR and between 58c2e40 and 6086543.

📒 Files selected for processing (80)
  • .coderabbit.yaml
  • .github/review-bot-rules/README.md
  • .github/review-bot-rules/landing-page-registry-parity.md
  • .greptile/config.json
  • .greptile/files.json
  • .greptile/rules.md
  • web/app/[locale]/(landing)/agents/aider/page.tsx
  • web/app/[locale]/(landing)/agents/amp/page.tsx
  • web/app/[locale]/(landing)/agents/claude-code/page.tsx
  • web/app/[locale]/(landing)/agents/codex/page.tsx
  • web/app/[locale]/(landing)/agents/cursor-cli/page.tsx
  • web/app/[locale]/(landing)/agents/gemini-cli/page.tsx
  • web/app/[locale]/(landing)/agents/opencode/page.tsx
  • web/app/[locale]/(landing)/agents/page.tsx
  • web/app/[locale]/(landing)/best-terminal-for-mac/page.tsx
  • web/app/[locale]/(landing)/guides/page.tsx
  • web/app/[locale]/(landing)/landing-schema.tsx
  • web/app/[locale]/blog/blog-schema.tsx
  • web/app/[locale]/blog/cmd-shift-u/page.tsx
  • web/app/[locale]/blog/cmux-claude-teams/page.tsx
  • web/app/[locale]/blog/cmux-finder/page.tsx
  • web/app/[locale]/blog/cmux-history/page.tsx
  • web/app/[locale]/blog/cmux-omo/page.tsx
  • web/app/[locale]/blog/cmux-ssh/page.tsx
  • web/app/[locale]/blog/cmux-vault/page.tsx
  • web/app/[locale]/blog/gpl/page.tsx
  • web/app/[locale]/blog/introducing-cmux/page.tsx
  • web/app/[locale]/blog/markdown-viewer/page.tsx
  • web/app/[locale]/blog/passkey-auth/page.tsx
  • web/app/[locale]/blog/session-restore/page.tsx
  • web/app/[locale]/blog/show-hn-launch/page.tsx
  • web/app/[locale]/blog/task-manager/page.tsx
  • web/app/[locale]/blog/unread-shortcuts/page.tsx
  • web/app/[locale]/blog/zen-of-cmux/page.tsx
  • web/app/[locale]/components/json-ld.tsx
  • web/app/[locale]/docs/agent-integrations/claude-code-teams/page.tsx
  • web/app/[locale]/docs/agent-integrations/oh-my-claudecode/page.tsx
  • web/app/[locale]/docs/agent-integrations/oh-my-codex/page.tsx
  • web/app/[locale]/docs/agent-integrations/oh-my-opencode/page.tsx
  • web/app/[locale]/docs/api/page.tsx
  • web/app/[locale]/docs/browser-automation/page.tsx
  • web/app/[locale]/docs/changelog/page.tsx
  • web/app/[locale]/docs/concepts/page.tsx
  • web/app/[locale]/docs/configuration/page.tsx
  • web/app/[locale]/docs/custom-commands/page.tsx
  • web/app/[locale]/docs/dock/page.tsx
  • web/app/[locale]/docs/docs-schema.tsx
  • web/app/[locale]/docs/getting-started/page.tsx
  • web/app/[locale]/docs/ios/page.tsx
  • web/app/[locale]/docs/keyboard-shortcuts/page.tsx
  • web/app/[locale]/docs/notifications/page.tsx
  • web/app/[locale]/docs/remote-tmux/page.tsx
  • web/app/[locale]/docs/session-restore/page.tsx
  • web/app/[locale]/docs/skills/page.tsx
  • web/app/[locale]/docs/ssh/page.tsx
  • web/app/[locale]/docs/textbox/page.tsx
  • web/app/[locale]/docs/workspace-groups/page.tsx
  • web/app/lib/agent-page-paths.ts
  • web/app/sitemap.ts
  • web/messages/ar.json
  • web/messages/bs.json
  • web/messages/da.json
  • web/messages/de.json
  • web/messages/en.json
  • web/messages/es.json
  • web/messages/fr.json
  • web/messages/it.json
  • web/messages/ja.json
  • web/messages/km.json
  • web/messages/ko.json
  • web/messages/no.json
  • web/messages/pl.json
  • web/messages/pt-BR.json
  • web/messages/ru.json
  • web/messages/th.json
  • web/messages/tr.json
  • web/messages/uk.json
  • web/messages/zh-CN.json
  • web/messages/zh-TW.json
  • web/next.config.ts

Comment thread web/next.config.ts
Comment on lines +14 to +15
const localePrefix =
":locale(ja|zh-CN|zh-TW|ko|de|es|fr|it|da|pl|ru|bs|ar|no|pt-BR|th|tr|km|uk)";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Derive redirect locales from the shared locale registry.

At Line 15, the locale matcher is hardcoded in next.config.ts. This duplicates locale ownership and can silently miss redirects for newly added locales. Build this matcher from the existing locale source (excluding en) so redirects stay in sync automatically. As per path instructions, “keep the locale/message registry aligned.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/next.config.ts` around lines 14 - 15, The localePrefix variable at line
15 contains a hardcoded list of locales as a string pattern, which duplicates
locale ownership and can get out of sync when new locales are added. Instead of
maintaining this hardcoded matcher, import the locale registry from the shared
source, filter out the default locale (en), and dynamically build the
localePrefix pattern by joining the remaining locales with pipe separators. This
ensures the redirect locale matcher automatically stays in sync with any locale
additions made to the central registry.

Source: Path instructions

The agent-readable variant router canonicalizes /en/... paths and dotted
variants bypass the locale middleware, so /en/codex-cli.md etc. must redirect
too. Adds explicit /en rules (to the canonical unprefixed new path). Caught by
autoreview.
…wers)

LandingSchema built FAQ answers with t(), but answers contain <code> markup
plus ICU-significant chars (e.g. French apostrophes). next-intl then failed to
format and emitted the message key (landing.<ns>.faqA1) into the structured
data instead of the answer. Use t.raw() + stripTags like the homepage FAQ
schema. Caught by autoreview.
@lawrencecchen
lawrencecchen merged commit f01c303 into main Jun 23, 2026
29 of 31 checks passed

This branch was successfully deployed

1 active deployment
Preview – cmux — 5f105910 Deployed Jun 23, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant