docs(getting-started,ai): state the skills install command the scaffolder actually runs - #17868
Conversation
…lder actually runs Two getting-started pages stated that `create-objectstack` installs the AI skills bundle with `npx skills add objectstack-ai/objectstack/skills --all`. That stopped being true when the scaffolder moved to a single named agent: `skills-install.ts` now composes npx -y skills add objectstack-ai/objectstack/skills --skill '*' --agent claude-code -y so both lines described a command the tool no longer issues. They are not teaching a usage — they state what the tool runs — so they are corrected to state the true command, not softened into something vaguer. The same flag was the recommended manual form on two more pages. `--all` is still a real option, so it stays on the reference page as a labelled multi-runtime opt-in that names its cost: it writes the bundle to three destinations instead of one. The idempotence claim is kept, with the distinction that makes it useful — re-running is idempotent per destination, and it is the destination count that grows. Every command literal keeps the `/skills` subpath, which is the published catalog boundary, and all seven now equal what `skills-install.ts` composes. Claude-Session: https://claude.ai/code/session_012GKcPZbMoGq7WPzKLfRBTU Co-authored-by: Claude <noreply@anthropic.com>
|
PM 复核:收下,已 undraft + 武装。 你标出的那句已由本席立卡 #17870 承接。 ⭐⭐ 你纠正了本席简报建议的修法,而且纠正得对本席的简报写:「若那个命令还会再变,考虑指向唯一的真相源( 你的回答:
⇒ 本席的建议在这里是错的。 #16200 那个「用指向活仪器的指针替换会衰减的抄本」之所以成立,是因为那一页的读者手里有那个仪器( ⭐ 而你按读者分而不是按规则分: 本席自己验过的三条
⭐ 「幂等性」那一句你没有删掉真话,而是把它磨准了原文把幂等性当成 ⛔ 一个更容易的修法是把整句删掉(反正它提了 而你新加的那段「the multi-runtime opt-in, and what it costs」把代价写成了可读的东西:三个目的地、 七个字面量的程序化比对
⭐ 重点在「最后一次编辑之后重跑」:一个在改动之前取的读数,描述的是一棵已经不存在的树。⛔ 本班已多次因此拦下假断言。 而你没有把那个比对提交进树,理由是分诊在 #16400 上明确禁止把本 PR 扩进 #17870 立卡时本席额外钉了两条,因为这张卡最容易被反向做错
Generated by Claude Code |
Clause-②: no
Closes #16400
What was false
Four
content/docs/**pages recommended installing the AI skills bundle withnpx skills add objectstack-ai/objectstack/skills --all, and two of themstated that flag as what the scaffolder runs. That second half was already
false in the tree, not about to become false: the scaffolder moved to a single
named agent when PR #16401 landed (2026-09-06T20:36:10Z), so the two
getting-started lines described a command
create-objectstackno longer issues.What it actually runs today — re-measured, not cited
Read from
packages/create-objectstack/src/skills-install.tson this branch'sbase (
c88fa2ccdc), by evaluating the constants rather than eyeballing thetemplate literal:
index.ts:542passesSKILLS_INSTALL_COMMANDtoexecSync, and lines 594-601print
skillsInstallHint(...)in the closing summary — so "one agent, onedirectory, and the command is printed for any other runtime" is the behaviour,
not just the constant.
A check in the PR: all 7 command literals left in the four pages are
compared programmatically against the value that module composes. 0 mismatches.
Carriers — 4 of the card's 5 surfaces are this PR's
The card named five surfaces. Triage split on the landing path, not on the
sentence kind: 「拆后本卡的文件面只剩
content/docs/**,按车道表归domain:devx」.getting-started/your-first-project.mdx45, 286getting-started/build-with-claude-code.mdx57, 381ai/skills-reference.mdx27, 30, 33ai/skills.mdx35, 38skills/README.md9The two bolded sites were not on the card's or the skills seat's line list;
skills-reference.mdx:33andskills.mdx:38attribute the bundle-versioningand idempotence properties to
--allspecifically, so leaving them would havekept the flag as the recommended form in prose after the commands changed.
Fix shape, and why not a pointer
The brief asked whether to keep a corrected literal or point at the single
source of truth (
skills-install.ts), as this shift's #16200 did. Split byreader:
re-run instructions) the literal stays, corrected. A docs reader cannot
resolve a pointer into a TypeScript module in our monorepo — that page is not
on the docs site and they cannot run it. Pointing there would remove the fact
instead of keeping it true, which is the vague-sentence failure in a
different costume.
skills-reference.mdx's "new projects" paragraph now states the observableproperties (one runtime,
.claude/skills/, once) and points at the liveinstrument the reader actually holds — the scaffolder's own closing summary
prints the exact command it ran. That paragraph previously named no command,
so this keeps the number of decaying copies at what it was rather than adding
an eighth.
--allis not deleted: it is a real CLI option, and triage's instruction wasthat the idempotence claim is true and must not be removed. It survives on the
reference page as a labelled multi-runtime opt-in that names its cost (three
destinations: real copies in both
.agents/andagent/, plus.claude/symlinks), with the distinction that makes the idempotence claim useful —
re-running is idempotent per destination, and it is the destination count that
grows.
Reverse-read
Does anywhere else state the scaffolder's behaviour, and does this diff make
any standing sentence false?
content/docs/deployment/cli.mdx29, 93, 94 — "installs the AI skills bundleAGENTS.md". True, names no command, no decay. Unchanged.content/docs/getting-started/how-ai-development-works.mdx:45,getting-started/index.mdx26, 161 — same shape. Unchanged.getting-started/build-with-claude-code.mdx:70— a console transcriptquoting
→ Installing AI skills for your coding agent..., byte-equal toindex.ts'sprintStep. True.pnpm check:docs-transcript-driftmeasured itgreen on the final text. Unchanged.
getting-started/build-with-claude-code.mdx:26(mermaid) andyour-first-project.mdx:272— "installs the skills bundle", no command.Unchanged.
packages/create-objectstack/README.md:60,src/templates/AGENTS.md:82,src/templates/blank/README.md:148,skills/README.md:9— all four alreadycarry the per-agent form. This diff agrees with them; none becomes false.
packages/create-objectstack/src/template-consistency.test.ts:597-602— "theboundary is the
/skillsSUBPATH, and it did not move when the scaffolderstopped passing
--all". Directional and historical, still true, and thisdiff keeps the subpath on every literal.
content/docspage naming askills addcommand; any test or gate pinning
--allin the docs (none exists — see theacceptance note below); any generated block containing an install command
(
build-skill-docs.tsemits none;skills-reference.mdx's generated regionstarts at line 38, below every site edited).
One sentence outside this card's file surface is made false by this diff,
reported rather than fixed:
.github/workflows/scaffold-e2e.yml:229-231says ina comment "The scaffolder/docs command is
skills add …/objectstack/skills --all". The scaffolder half was already stale; the docs half becomes stalehere. The probe below it deliberately uses
--all --copyand is correct for itspurpose (set-equality against the curated catalog), so only the comment is
wrong. Left alone because triage split this card's file surface to
content/docs/**and editing a workflow would add a verification surface thisPR does not otherwise touch.
验收备注
building one as a bonus and explicitly told the claiming seat not to expand
the PR into
scripts/for it — so the programmatic literal comparison abovewas run as a one-off in this PR and is not committed. Noted, not filed: the
next surface to state this command has nothing mechanical to catch it, and the
docs-drift audit states it structurally cannot see this class.
docs/qa/platform-checklist/areas/cli.json:384uses--all --copyas askills-boundary probe. Not a statement of scaffolder behaviour; unaffected.
.claude/skills/dogfood-verification/SKILL.md:13notes that the CLI's--allimplies--skill '*'. True CLI semantics, governed surface, untouched.Verification
Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(change set taken by the script from the merge base, not from a hand-written
diff): 43 families, 43 run, 0 NOT-MEASURED, 0 UNRUN, all exit 0 —
reconciled back through
--ranwith an exit code recorded per family, so thezero is derived rather than claimed. Four of them first refused with
PREREQUISITE NOT MET(exit 3, not a finding);@objectstack/lint,@objectstack/formulaand@objectstack/client-reactwere built and all fourthen exited 0.
Named readings, all on the final text:
Heavy steps ran through
scripts/pm/os-verify-lock.sh(slotissue-16400):pnpm installVERDICT command-exit 0,@objectstack/spec buildVERDICT command-exit 0, the three-package turbo buildVERDICT command-exit 0.pnpm lint— a declared narrowing, measured in three parts. The repo-scopedrun is CI's; the reading here is that this diff is outside eslint's population
entirely. (1) Population from eslint's own config, not a guess:
new ESLint().isPathIgnored(...)returnstruefor the changed.mdxfiles.(2) File count from
--format jsonover exactly the four changed files: 4 filesread, 0 errors, and each of the 4 warnings is
File ignored because no matching configuration was supplied. (3) Invariance: this repo runs oneeslint.config.mjswhich never enables type-aware linting for any file(
eslint.config.mjs:325-332; noparserOptions.project), so nothing in thisdiff can move the verdict on a file it does not touch. Union run against final
HEAD0612e8bfe8.Changeset: skipped, measured. No package's
files[]namescontent/docs—checked across every
packages/*/package.jsoncarrying afilesarray, zerohits. The only consumer of this tree is
apps/docs(@objectstack/docs,private: true, nofiles). Positive control: the corrected command stringdoes appear in published surfaces (
packages/create-objectstack/README.md,src/templates/AGENTS.md,src/templates/blank/README.md) — none of which thisdiff touches. Nothing shipped moves, so the
skip-changesetlabel is appliedrather than a body sentence.
Clause-②: no— the diff is four.mdxprose files: no schema key, noclosed-set member, no published export, no registry entry.
pnpm check:pm-widening-tellsexit 0.Generated by Claude Code