Repository navigation
docs(ui-merge): fold objectui.org into objectstack docs, K3 — generate the component reference for all 106 authorable components from sdui.manifest.json, with a drift check #27142
Description
Filing gate ③ (maintainer-directed). In the "Restore objectui.org docs deploy" project thread (card thread of #26993), on 2026-10-28:
- 03:24Z, on the decision card "objectui.org 文档站以后怎么处理?", Tesla chose 「B 并入 objectstack 文档站」. www.objectui.org stops being a separate site, and its docs fold into the objectstack docs site (
content/docs, served at objectstack.ai/docs). - 03:24Z, Tesla asked 「objectui 文档全部需要保留吗?这需要评估并和我沟通」. The card thread then sorted the 183 pages under
ui/content/docsone by one into keep, merge, generate and delete, and put four questions to Tesla. - 07:58Z, on that evaluation, Tesla answered 「VS Code 扩展 不会发布,其他同意」 and then 「你负责派卡执行」.
The fold is split into four cards. The first three can run in parallel; the fourth is blocked by them:
- K1 moves the SDK pages.
- K2 merges pages into existing ones.
- K3 generates the component reference.
- K4 retires the old site and adds the redirects.
This is card K3.
维护者速读
元数据作者在页面 JSON 里能用的组件,以根目录的 sdui.manifest.json 为准。这份清单由 CI 生成并校验,共 106 个组件,每个都带输入项的类型和说明。
objectui 站点只为其中 17 个手写了组件页,另外 89 个没有自己的组件页。本卡写一个生成脚本,从 manifest 生成 objectstack 文档站的「组件参考」,一次覆盖全部 106 个。生成之后,那 17 个手写页和组件索引页就不再需要,由 K4 删除。
生成物会有漂移检查:manifest 变了而参考页没重新生成,检查就红。
Wanted
- A generator script, for example
scripts/gen-sdui-reference.mjs, with--self-test. It readssdui.manifest.jsonand writes a component reference intocontent/docs:- one page per namespace, or one page per component, whichever reads better at 106 entries (the dev's call, stated in the PR);
- each component listed with its
type, its namespace, and its inputs as a table (name, type, description); - a header on each generated page saying it is generated and naming the command that regenerates it.
- The pages go in a new
content/docs/ui/components/section, linked fromcontent/docs/ui/meta.json. If the generated pages fit an existing generated area's conventions better (for examplecontent/docs/references/, whose pages are never hand-edited), use that instead and say why. - A drift check:
--checkexits non-zero when the committed pages differ from what the manifest produces. Wire it in wheresdui.manifest.jsonis already verified, so that a manifest change and its reference change land in one PR. If that wiring needs a.github/workflows/**edit, the PR is Tier H (draft until green, the maintainer merges); otherwise prefer a rootpackage.jsonscript that an existing check family already runs. - The 17 hand-written pages this replaces (
ui/content/docs/components/):basic/{icon,image,span,text},complex/table,data-display/{alert,badge},disclosure/accordion,form/{button,label}andlayout/{box,card,container,flex,grid,stack,tabs}, pluscomponents/index. The PR body records the URL each one maps to, for K4's redirect map. Where a hand page carries a worked example the manifest lacks, put it in the PR body's Acceptance notes and do not copy it into a generated page.
⛔ Do not delete the hand pages and do not touch ui/apps/site. That is K4's work.
Who acts
A domain:devx card thread. The surface is scripts/gen-sdui-reference.mjs (or the dev's name for it), content/docs/ui/components/**, content/docs/ui/meta.json and the root package.json scripts, plus the workflow line only if item 3 needs one. Serial constraint with K2: both may touch content/docs/ui/meta.json, so whichever lands second merges main.
Business reason. A metadata author placing a component in a page finds no page of its own for 89 of the 106 authorable components today; the inputs and their descriptions exist only inside the manifest file. A generated reference also cannot drift from the renderer the way the 17 hand pages could.
Acceptance
node scripts/gen-sdui-reference.mjs --self-testexits 0, and--checkexits 0 on the PR head.- Hand-editing one generated line makes
--checkexit non-zero. Record that in the PR as a one-time ablation. - All 106 manifest types appear in the generated pages.
pnpm --filter @objectstack/docs buildis green.
Duplicate search. The same query as the fold's other cards: 33 hits, the first 10 read (#26993, #27030, #27048, #26140, #26688, #24230, #25677, #26944, #25854, #26035). No card generates docs from sdui.manifest.json. New.
Size: M. Clause-②: no. Metadata-protocol: none.
Activity
objectstack-fleet commentedon Oct 28, 2026
Claim: card thread "Restore objectui.org docs deploy", dispatch of #27142 (maintainer-directed: 「B 并入 objectstack 文档站」 03:24Z, 「VS Code 扩展 不会发布,其他同意」 and 「你负责派卡执行」 07:58Z, 2026-10-28, that thread)
Session:
session_01L9qibyAYPFxpNP4BCr7Z82(dispatching thread) · dev: a new card thread the project coordinator opens for this card; it names its own session in its os-dev-reportAccount:
os-teslaBranch: the dev card thread's platform-assigned
claude/project-thread-*branch (mode:thread; the only branch it pushes)Worktree: the dev card thread's own checkout
Domain:
domain:devxSeat:
domain:devx#1(seat 1 by default; dispatched on the maintainer's instruction from a card thread, not from a lane seat)File surface: a new generator under
scripts/with--self-test/--check,content/docs/ui/components/**(orcontent/docs/references/if justified),content/docs/ui/meta.json, rootpackage.jsonscripts, and the one workflow line item 3 may need (that makes the PR Tier H); ⛔ no edits underui/(stop on breach; explain in the report)Container & model: M,
mode:thread,model: opus(default;dispatch-gates --tier --repo objectstack-ai/objectstackon this surface prints no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: none
Premise: holds (page lists measured on main
24351cfe, 2026-10-28 08:0xZ: 183 pages underui/content/docs,guide/ci-cd-pipelinealready retired by #27071)Serial constraints cleared: #27141 may also touch
content/docs/ui/meta.json; whichever lands second mergesmain. Fold siblings: #27140, #27141 and #27142 run in parallel; #27145 is blocked by all three and does every deletion underui/. Open PRs were not enumerated by path; the dev mergesmainbefore marking the PR ready.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
os-dev-report
{ "issue": 27142, "status": "done", "branch": "claude/project-thread-7ka124", "pr": "https://github.com/objectstack-ai/objectstack/pull/27179", "session": "session_01L9qibwMyAnTNeas3ANYhyi", "premise_still_valid": true, "summary": "scripts/gen-sdui-reference.mjs renders content/docs/ui/components/ (7 namespace pages plus an index) from sdui.manifest.json: all 106 components, each input as a table row. --check reds on drift and runs as a new lint.yml step (Tier H). The directory is registered as generated in the docs-audit scope, the os-regen merge driver and the role-word skip list, which the gate sweep required. PR is draft; os-zhuang and hotlong are requested by CODEOWNERS.", "tests": "node scripts/gen-sdui-reference.mjs --self-test: 20 cases pass, 20 batteries at floor. --check on ca0a9747: 106 components on 7 pages. One-time ablation via scripts/ablation-replace.mjs (ui.mdx line 160 Required cell): --check exit 1 naming file and line; restored blob == HEAD. pnpm --filter @objectstack/docs build: VERDICT command-exit 0; next start serves /docs/ui/components (107 table rows) and /docs/ui/components/plugins (16 tables).", "gates": "dispatch-gates --ran on ca0a9747: 99 derived, 98 run green, 1 NOT MEASURED (check:dual-build-cjs-loads exit 3, needs a full workspace build; left to CI). First-run reds fixed in the PR and re-run green: check-section-landing-index, check:docs-audit-scope, check:merge-driver, check:role-word. check:pm-dispatch-gates red once mid-edit, green on the committed tree. CI check-runs: in_progress at report time.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "2 — subscribe_pr_activity, pull_request_read (reads only)", "api_writes": "1 relay stroke so far — pr_create (#27179); this report comment is the second", "open_questions": [], "out_of_scope_findings": [ "carrier: K2 #27141 · content/docs/ui/pages.mdx § Components lists record:chatter, element:image, element:record_picker, element:text_input (not in the public manifest) and omits record:discussion, element:definition-list, element:repeater; noted, not filed", "carrier: none · object-kanban cardFields description in the ui/ registry uses the ADR-0090 D3 reserved word role; noted, not filed" ] }Generated by Claude Code