Skip to content

docs(site): restructure IA into module-first single sidebar#2584

Merged
os-zhuang merged 4 commits into
mainfrom
claude/docs-site-structure-w9lfzp
Jul 4, 2026
Merged

docs(site): restructure IA into module-first single sidebar#2584
os-zhuang merged 4 commits into
mainfrom
claude/docs-site-structure-w9lfzp

Conversation

@os-zhuang

@os-zhuang os-zhuang commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

Docs IA restructure: module-first single sidebar

Complete restructure of the docs site information architecture, modeled on Better Auth's docs: one sidebar tree, two levels, capability modules visible at first glance — replacing the previous six root: true tabs (Getting Started / Concepts / Guides / Reference / Protocol / Releases) where content for any one capability was scattered across up to six places.

Preview: https://spec-git-claude-docs-site-structure-w9lfzp-object-stack.vercel.app/docs

New sidebar (14 groups)

Get Started · Core Concepts
Data Modeling · Automation · Permissions & Identity · UI Engine
API & SDK · AI · Plugins & Packages · Kernel & Services
Deployment & Operations
Protocol Spec · Reference · Releases
  • Module taxonomy is aligned with the generated Reference domains (data, automation, identity/security, ui, ai, api, kernel), so "module overview → module guides → schema reference" is one predictable path.
  • Sidebar group names use capability language; protocol brand names (ObjectQL/ObjectOS/ObjectUI) stay in Protocol Spec, and each module index states its protocol-layer mapping (Data Modeling ↔ ObjectQL, UI Engine ↔ ObjectUI, Kernel & Services + Plugins ↔ ObjectOS).
  • The auto-generated references/ tree (239 pages) is structurally untouched; its generator no longer emits root: true.

What changed

Moves (~90 pages). guides/ (44 flat entries), guides/metadata/, guides/solutions/, guides/cheatsheets/ and the Concepts grab-bag are dissolved into the module groups. Full mapping is encoded in apps/docs/redirects.mjs.

Splits. Six oversized multi-topic pages were split along H2 boundaries (content moved verbatim, byte-diff-verified):

  • guides/security.mdx (777 L) → permissions/ index + profiles / permission-sets / roles / sharing-rules / field-level-security
  • guides/data-modeling.mdx (774 L) → data-modeling/schema-design + relationships + indexing
  • guides/ai-capabilities.mdx (712 L) → ai/ index + agents / actions-as-tools / knowledge-rag / natural-language-queries
  • guides/business-logic.mdx (675 L) → automation/hooks; flow/approval/validation/formula sections merged into their dedicated pages (deduped)
  • guides/plugins.mdx (572 L) → plugins/ index + merged interface/lifecycle into plugins/anatomy (three duplicate explanations of the Plugin interface reduced to one, verified against packages/core/src/types.ts)
  • guides/api-reference.mdx (540 L) → api/ index + data-api / metadata-api / plugin-endpoints

Dedup / merges.

  • concepts/architecture.mdx was a diverged verbatim fork of getting-started/architecture.mdx — one copy kept (now concepts/architecture)
  • concepts/terminology.mdx merged into getting-started/glossary.mdx (terminology was the fresher fork; kept its Source/Artifact & three-layer entries plus glossary's fuller Driver entry)
  • concepts/packages.mdx (dup of guides/packages.mdx) deleted
  • guides/airtable-dashboard-analysis.mdx and guides/standards.mdx (internal-facing) moved out of the site to docs/notes/

New content. Docs landing page (module map) and five module overviews (data-modeling, automation, permissions, ui, kernel), each linking group pages + matching Protocol Spec section + Reference domain.

Redirects. Every old URL 301s to its new home — ~90 exact entries plus wildcards for the moved runtime-services//contracts/ folders and a /docs/guides/:path* safety net (apps/docs/redirects.mjs, wired into next.config.mjs).

Link rewrites. ~105 absolute /docs/... links rewritten across content/blog per the same mapping; ~190 relative links resolved against their pre-move locations and rewritten as absolute URLs; stale content/docs/... file paths updated across skills corpus, package READMEs, ADRs, and packages/spec/src JSDoc (source of generated reference text).

Broken-link purge. getting-started/quick-reference.mdx had drifted badly from the generated reference tree: 18 table rows documented schemas that do not exist anywhere in packages/spec/src (deleted), 13 rows pointed at the wrong domain (relinked to the real pages — dataset lives in ui/, marketplace/tenant in cloud/, etc.), 4 rows reference real schemas with no generated page (unlinked, text kept). The mcp README bullet advertising a guide that never existed was dropped.

Tooling repointed.

  • packages/spec/scripts/build-skill-docs.ts → emits content/docs/ai/skills-reference.mdx
  • packages/spec/scripts/build-docs.ts → references group no longer a root tab; banner wording updated
  • scripts/check-doc-authoring.mjs SKIP_FILES, .claude/workflows/docs-accuracy-audit.js page list regenerated (146 hand-written pages)
  • 8 package READMEs pointed at real doc files (their old /content/docs/guides/<topic>/ links pointed at directories that never existed)

Verification

  • node scripts/check-doc-authoring.mjs — 180 files clean
  • pnpm --filter @objectstack/spec gen:schema && gen:docs && gen:skill-docs — regenerate cleanly into the new tree
  • Full next build passes (385 paths); served the built site and spot-checked: 9 representative old URLs 308-redirect to their new homes, all 14 module/group indexes and split pages return 200, landing page renders all sidebar groups
  • No content/docs/guides|concepts/core references remain outside CHANGELOGs

🤖 Generated with Claude Code

https://claude.ai/code/session_018r9mjpF7jr9BKdzEmUE4uZ

claude added 2 commits July 4, 2026 15:09
Dissolve the six root tabs (Getting Started/Concepts/Guides/Reference/
Protocol/Releases) into one sidebar tree of 14 capability groups aligned
with the Reference domains: Get Started, Core Concepts, Data Modeling,
Automation, Permissions & Identity, UI Engine, API & SDK, AI, Plugins &
Packages, Kernel & Services, Deployment & Operations, Protocol Spec,
Reference, Releases.

- move ~90 pages out of guides//concepts/ grab-bags into module groups
- split 6 oversized multi-topic pages (security, data-modeling,
  ai-capabilities, business-logic, plugins, api-reference) along H2
  boundaries; content moved verbatim and deduplicated
- delete diverged duplicate pages (architecture fork, packages,
  concepts index); merge terminology into glossary
- new landing page and five module overview pages
- rewrite internal links (absolute + relative) to the new URL space
- move internal-facing pages (airtable gap analysis, CRM standards)
  out of the site to docs/notes/

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018r9mjpF7jr9BKdzEmUE4uZ
- apps/docs/redirects.mjs: permanent redirects for every moved URL
  (exact entries + folder wildcards + /docs/guides/:path* safety net),
  wired into next.config.mjs
- build-docs.ts: references group is no longer a root sidebar tab;
  banner wording updated (guides/ no longer exists)
- build-skill-docs.ts now emits content/docs/ai/skills-reference.mdx;
  check-doc-authoring.mjs SKIP_FILES follows
- docs-accuracy-audit workflow page list regenerated (146 pages)
- update stale content/docs paths in spec JSDoc (source of generated
  reference prose), skills corpus, package READMEs, ADRs, roadmaps

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018r9mjpF7jr9BKdzEmUE4uZ
@vercel

vercel Bot commented Jul 4, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jul 4, 2026 3:31pm

Request Review

@os-zhuang
os-zhuang marked this pull request as ready for review July 4, 2026 15:15
claude added 2 commits July 4, 2026 15:19
quick-reference had drifted from the generated reference tree:
- delete 18 table rows whose schemas do not exist anywhere in
  packages/spec/src (fictional ai/hub/policy entries, plus a Workflow
  row duplicating State Machine)
- relink 13 rows to the real generated pages (dataset lives in ui/,
  marketplace/tenant/plugin-security in cloud/, service-registry and
  plugin-registry in kernel/, connectors in integration/)
- unlink 4 rows whose schema exists but has no generated page
  (driver/postgres, driver/mongo, shared mapping, connector-auth)
- recount section headers; resolve the last relative links
- drop the mcp README bullet advertising a guide that never existed

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018r9mjpF7jr9BKdzEmUE4uZ
@os-zhuang
os-zhuang merged commit f7606a1 into main Jul 4, 2026
10 of 11 checks passed
@os-zhuang
os-zhuang deleted the claude/docs-site-structure-w9lfzp branch July 4, 2026 15:25
@github-actions github-actions Bot added documentation Improvements or additions to documentation tooling labels Jul 4, 2026
@github-actions

github-actions Bot commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 7 package(s): @objectstack/mcp, @objectstack/metadata, @objectstack/objectql, @objectstack/plugin-audit, @objectstack/runtime, packages/services, @objectstack/spec.

105 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/mcp, @objectstack/spec)
  • content/docs/ai/chatbot-integration.mdx (via @objectstack/mcp, @objectstack/runtime)
  • content/docs/ai/index.mdx (via @objectstack/mcp)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/automation/approvals.mdx (via packages/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via @objectstack/runtime, packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via @objectstack/metadata, @objectstack/objectql, packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/runtime, packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via packages/objectql, @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cloud-artifact-api.mdx (via packages/runtime, packages/spec)
  • content/docs/deployment/environment-variables.mdx (via @objectstack/mcp)
  • content/docs/deployment/index.mdx (via @objectstack/runtime)
  • content/docs/deployment/migration-from-objectql.mdx (via @objectstack/objectql)
  • content/docs/deployment/production-readiness.mdx (via @objectstack/plugin-audit, @objectstack/runtime)
  • content/docs/deployment/single-project-mode.mdx (via @objectstack/runtime)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/vercel.mdx (via @objectstack/objectql, @objectstack/runtime)
  • content/docs/getting-started/cli.mdx (via @objectstack/plugin-audit, @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via packages/metadata, @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/audit-service.mdx (via packages/services)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/services, packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/settings-service.mdx (via packages/services)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/objectql, @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/objectql)
  • content/docs/permissions/authentication.mdx (via @objectstack/objectql, @objectstack/runtime)
  • content/docs/permissions/authorization.mdx (via packages/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/profiles.mdx (via @objectstack/spec)
  • content/docs/permissions/roles.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/objectql, @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/mcp, @objectstack/metadata, @objectstack/objectql, @objectstack/plugin-audit, @objectstack/runtime, packages/services, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/mcp, @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/http-protocol.mdx (via @objectstack/runtime)
  • content/docs/protocol/objectos/i18n-standard.mdx (via packages/services, @objectstack/spec)
  • content/docs/protocol/objectos/index.mdx (via @objectstack/objectql, @objectstack/runtime)
  • content/docs/protocol/objectos/lifecycle.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/objectos/metadata-service.mdx (via @objectstack/metadata)
  • content/docs/protocol/objectos/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via packages/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/objectql, @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via packages/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/mcp, @objectstack/objectql, @objectstack/plugin-audit, @objectstack/runtime, @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/objectql, @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

os-zhuang added a commit that referenced this pull request Jul 17, 2026
content/docs/references/** is generated from packages/spec and committed, but no CI
job ever regenerated and diffed it, so the public reference docs drifted silently
while main stayed green. #3076 added RowCrudActionOverride to the spec and the docs
never learned the type existed.

Regenerate: 7 files, every change traced to a spec change that shipped without
re-running the generator — RowCrudActionOverride and ServiceSelfInfo missing outright,
dashboard filterBindings/name missing, readonly (#2948/#3003) and allowTransfer (#3004)
stale, and connector ADR-0096 → ADR-0097 (both ADRs exist and are distinct, so the
published docs were pointing readers at the wrong one). Verified deterministic: two
consecutive runs produce byte-identical output.

Gate: build-docs.ts --check, following the sibling convention. Every write goes through
emit() and every wiped folder through manageDir(), so check and write run identical
generation logic and differ only in the final disposition — it cannot pass on output a
real run would not produce. Verified output-identical to the previous generator across
all 258 files, and proven to fail on stale content, a missing page, a stale leftover
page, and a vacuous no-schema run. Not `git diff --exit-code`: that misses untracked
files.

Placement: lint.yml's "TypeScript Type Check" — no paths filter and a required status
check, so the gate can neither go dormant nor be merged past. ci.yml's "Build Docs" is
gated on a `docs` filter excluding packages/spec/**, so it skips exactly the spec-only
PRs that cause this drift.

Also un-dormants the sibling gates: check:spec-changes / check:upgrade-guide read the
ADR-0087 registries but ran under a filter listing only skills/**, and that filter
watched content/docs/guides/skills.mdx, a path #2584 moved. Job renamed
check-skill-docs → check-generated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/xl tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants