From f1c2adf65763532e6b8d4f06d93a0cd796c3dc06 Mon Sep 17 00:00:00 2001 From: Aditya Garud <153842990+yashranaway@users.noreply.github.com> Date: Fri, 11 Sep 2026 17:31:23 +0000 Subject: [PATCH 1/5] fix(web): categorize docs nav and stop calling sessions isolated Docs navigation is now an explicit category catalog instead of slicing the route list. The overview pulls the shared-profile contract from COMMANDS.md. The command reference is filterable from that same source. --- apps/web/app/docs/commands/page.tsx | 21 ++--- apps/web/app/docs/page.tsx | 12 ++- apps/web/app/globals.css | 64 ++++++++++++++- apps/web/app/sitemap.ts | 1 - apps/web/components/command-directory.tsx | 59 +++++++++++++ apps/web/components/docs-shell.tsx | 65 +++++++++------ apps/web/lib/repository-content.d.mts | 17 +++- apps/web/lib/repository-content.mjs | 82 +++++++++++++++++-- .../scripts/validate-content-provenance.mjs | 2 +- 9 files changed, 266 insertions(+), 57 deletions(-) create mode 100644 apps/web/components/command-directory.tsx diff --git a/apps/web/app/docs/commands/page.tsx b/apps/web/app/docs/commands/page.tsx index 11e5c3f..5d9cbb2 100644 --- a/apps/web/app/docs/commands/page.tsx +++ b/apps/web/app/docs/commands/page.tsx @@ -1,6 +1,5 @@ -import { CommandBlock } from "@/components/docs-copy-controls"; +import { CommandDirectory } from "@/components/command-directory"; import { DocsShell } from "@/components/docs-shell"; -import { plainText } from "@/lib/markdown"; import { loadProductDocsContent } from "@/lib/repository-content.mjs"; import { docsMetadata } from "@/lib/site-metadata"; @@ -15,23 +14,15 @@ export default function CommandsPage() { return ( ({ + id: group.id, + label: group.title, + }))} kicker={`${commands.count} command forms`} title={<>The complete agent surface.} lede="These usage lines come from the generated command reference, which protocol tests keep in sync with the CLI help output. Unknown parameters fail closed." > - {commands.groups.map((group, index) => ( -
-

- {String(index + 1).padStart(2, "0")} / {group.title} -

-

{group.title}

-

{plainText(group.description)}

- {group.usage} -
- ))} +
); } diff --git a/apps/web/app/docs/page.tsx b/apps/web/app/docs/page.tsx index 7a1fd37..0d13b29 100644 --- a/apps/web/app/docs/page.tsx +++ b/apps/web/app/docs/page.tsx @@ -16,6 +16,14 @@ export default function DocsPage() { return ( @@ -31,8 +39,8 @@ export default function DocsPage() {

01 / First run

Start a session.

- Start the host, create a session, then visit the app. The session - stays isolated until you close it. + Start the host, create a session, then visit the app.{" "} + {plainText(documentation.sessionModel)}

{documentation.firstRunCommands}

{plainText(documentation.startupPresentation)}

diff --git a/apps/web/app/globals.css b/apps/web/app/globals.css index 4ab0d21..132141f 100644 --- a/apps/web/app/globals.css +++ b/apps/web/app/globals.css @@ -1248,6 +1248,19 @@ h3, width: min(1180px, calc(100% - 48px)); margin: 0 auto; } +.skip-link { + position: absolute; + left: 16px; + top: 12px; + z-index: 20; + padding: 8px 12px; + background: var(--amber); + color: var(--ink-on-amber); + transform: translateY(-150%); +} +.skip-link:focus { + transform: none; +} .docs-nav { height: 84px; display: flex; @@ -1286,14 +1299,55 @@ h3, font-family: var(--font-mono), monospace; font-size: 12px; } +.docs-nav-group, +.docs-toc { + display: flex; + flex-direction: column; + gap: 11px; +} +.docs-nav-group + .docs-nav-group, +.docs-toc { + margin-top: 30px; +} .docs-sidebar p { margin: 0 0 6px; color: var(--amber-ink); font-size: 9px; letter-spacing: 0.12em; + text-transform: uppercase; } -.docs-sidebar p:not(:first-child) { - margin-top: 30px; +.command-filter { + display: grid; + gap: 8px; + margin: 0 0 42px; +} +.command-filter label { + font-family: var(--font-mono), monospace; + font-size: 11px; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--amber-ink); +} +.command-filter input { + width: 100%; + min-height: 42px; + padding: 0 12px; + border: 1px solid var(--line); + border-radius: var(--radius); + background: var(--panel); + color: var(--ink); + font-family: var(--font-mono), monospace; + font-size: 13px; +} +.command-filter input:focus { + outline: 2px solid var(--amber); + outline-offset: 2px; +} +.command-filter p { + margin: 0; + color: var(--muted); + font-family: var(--font-mono), monospace; + font-size: 11px; } .docs-sidebar a:hover { color: var(--ink); @@ -1934,9 +1988,13 @@ h3, padding-bottom: 12px; overflow-x: auto; } - .docs-sidebar p { + .docs-sidebar p, + .docs-toc { display: none; } + .docs-nav-group { + display: contents; + } .docs-sidebar a { flex: 0 0 auto; padding: 7px 9px; diff --git a/apps/web/app/sitemap.ts b/apps/web/app/sitemap.ts index 2584fb0..ad2ac98 100644 --- a/apps/web/app/sitemap.ts +++ b/apps/web/app/sitemap.ts @@ -5,7 +5,6 @@ import type { MetadataRoute } from "next"; export default function sitemap(): MetadataRoute.Sitemap { const routes = [ "/", - "/docs", "/docs/markdown", ...PRODUCT_DOC_ROUTES.map(({ href }) => href), ]; diff --git a/apps/web/components/command-directory.tsx b/apps/web/components/command-directory.tsx new file mode 100644 index 0000000..5d419a2 --- /dev/null +++ b/apps/web/components/command-directory.tsx @@ -0,0 +1,59 @@ +"use client"; + +import { CommandBlock } from "@/components/docs-copy-controls"; +import { plainText } from "@/lib/markdown"; +import { useMemo, useState } from "react"; + +type CommandGroup = { + title: string; + id: string; + description: string; + usage: string; +}; + +export function CommandDirectory({ groups }: { groups: CommandGroup[] }) { + const [query, setQuery] = useState(""); + const normalized = query.trim().toLowerCase(); + const visible = useMemo(() => { + if (!normalized) return groups; + return groups.filter((group) => + `${group.title} ${group.description} ${group.usage}` + .toLowerCase() + .includes(normalized), + ); + }, [groups, normalized]); + + return ( + <> +
+ + setQuery(event.target.value)} + placeholder="visit, inspect, record…" + autoComplete="off" + spellCheck={false} + /> +

+ {visible.length} of {groups.length} groups +

+
+ {visible.length === 0 ? ( +

No commands match “{query}”.

+ ) : ( + visible.map((group, index) => ( +
+

+ {String(index + 1).padStart(2, "0")} / {group.title} +

+

{group.title}

+

{plainText(group.description)}

+ {group.usage} +
+ )) + )} + + ); +} diff --git a/apps/web/components/docs-shell.tsx b/apps/web/components/docs-shell.tsx index 05d1741..d010175 100644 --- a/apps/web/components/docs-shell.tsx +++ b/apps/web/components/docs-shell.tsx @@ -1,7 +1,10 @@ import { HeadlessMark } from "@/components/headless-mark"; import { LinkGlyph } from "@/components/link-glyph"; import { ThemeToggle } from "@/components/theme-toggle"; -import { PRODUCT_DOC_ROUTES } from "@/lib/repository-content.mjs"; +import { + PRODUCT_DOC_CATEGORIES, + PRODUCT_DOC_ROUTES, +} from "@/lib/repository-content.mjs"; import Link from "next/link"; export function DocumentationTable({ @@ -42,6 +45,7 @@ export function DocsShell({ lede, children, headingAction, + sections, }: { activePath: string; kicker: string; @@ -49,9 +53,13 @@ export function DocsShell({ lede: string; children: React.ReactNode; headingAction?: React.ReactNode; + sections?: Array<{ id: string; label: string }>; }) { return (
+ + Skip to content +