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-zhuangos-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

vercelBot commented Jul 4, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJul 4, 2026 3:31pm

Request Review

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 mainJul 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-actionsgithub-actionsBot added documentation Improvements or additions to documentation tooling labels Jul 4, 2026
@github-actions

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>
os-zhuang added a commit that referenced this pull request Jul 31, 2026
…oves to the unfiltered required job (#4291) (#4292)
The filter was a hand-maintained duplicate of each gate's input set, and nothing
reconciled the two. Its own comment asked for the pair to be kept "in lockstep";
nothing enforced that, and it drifted three times on record — each found by
accident and written up in a comment rather than gated:
- #2584 moved a generated page and the filter kept watching the old path, so
hand-edits to the generated block went unchecked for months.
- #3855 listed specific spec paths but no schema dirs, so check:authorable-surface
went dormant on exactly the PRs that remove an authorable key.
- packages/spec/json-schema.manifest.json was never watched at all. It is the
#2978 ratchet and the only durable record of every schema ever emitted, since
json-schema/ is gitignored, and build-schemas.ts requires a retirement to
delete the key from it — so a manifest-only PR skipped its own verifier.
Six of the ten gates had already escaped to lint.yml's typecheck job one at a
time, each with a comment explaining that the filter had failed them. This moves
the last four — check:skill-docs, check:spec-changes, check:upgrade-guide,
check:authorable-surface — and deletes the check-generated job, the `generated`
filter, and its output. There is no second ledger left to keep in sync: the
failure mode #4255 gated for the check:generated ledger is removed at the source
here instead.
Affordable because that job was already doing the work: check:docs runs
gen:schema — the same scripts/build-schemas.ts that backs check:authorable-surface
— and that whole step measures 4s in CI, against a 5-minute job dominated by the
workspace build (check:skill-refs 0s, check:react-blocks 1s). All four read
source via tsx and need no build, so they run before the workspace build like the
gates already there.
Safe to delete: needs.filter.outputs.generated had exactly one reader, the job's
own `if:`, and lint.yml recorded that the job "is not required, either" — so no
branch-protection check disappears. Comments in lint.yml, check-generated.ts and
AGENTS.md that described the two-job split are updated to match.
Closes#4291
Refs #4255, #2584, #3855, #2978
Claude-Session: https://claude.ai/code/session_01QCrKazC5o5a77yXd7ykaZg
Co-authored-by: Claude <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/xltooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-zhuang@claude