Repository navigation
Commit 175e8d4
Fixes #23275
Clause-②: no (docs)
PR #23248 made `create-objectstack` install the skills catalog itself:
the scaffolded `package.json` depends on `@objectstack/skills` at the
`@objectstack/spec` version, and the scaffolder runs `npx -y
skills@1.7.2 experimental_sync --agent claude-code --copy -y`. The six
pages still described the scaffolder from before that PR, and they
taught a different, linked sync. This PR rewrites them to the end state.
There is now one install spelling on the site, the scaffolder's own. The
one scaffolder that still read `main` (`18.0.0-next.0`) is named in one
sentence, in one place. The upgrade guide and the v18 line page gain the
17.x to 18 skills step.
## What changes, page by page
- `content/docs/ai/skills-reference.mdx`, "Installing skills" (outside
the generated block, which is byte-identical):
- Step 2 is now `npx skills@1.7.2 experimental_sync --agent claude-code
--copy -y` ("copy it from node_modules"). Step 1 is unchanged.
- The paragraph after the steps says the sync copies real files into
`.claude/skills/SKILL` and nowhere else, and records them in
`skills-lock.json`. It says to commit both and to keep `--copy`, because
the links point into `node_modules`, which a clone does not have. It
says why the CLI is pinned (the scaffolder runs the same version), and
to use one runtime per run, never `--agent '*'`. The linked form is no
longer taught.
- "Updating" adds: commit what the sync changed.
- "Which versions exist" now holds the one exception sentence:
`create-objectstack@18.0.0-next.0` still installed the skills from
`main` with `skills add`, and step 2 skips those. So in such a project,
run `npx skills remove --all` (or remove the skills by name, as the
upgrade step does), then steps 1 and 2. The paragraph also links the
17.x line to the new upgrade step.
- "New projects" now describes the end state: the scaffolder runs both
steps (the dependency is at the spec's version, the install puts it in
`node_modules`, and the sync copies it into `.claude/skills/`), and its
summary prints step 2 again. The "Through `18.0.0-next.0` …" paragraph
is gone.
- `content/docs/ai/skills.mdx`: the same two commands. A sentence on
real files, committing them and keeping `--copy`. The pointer to the
reference now names the one scaffolder that is an exception.
- `content/docs/getting-started/build-with-claude-code.mdx`: the step-1
bullet now says the bundle comes from `@objectstack/skills` at your
spec's version, copied once into `.claude/skills/` to commit, and links
the exception. It no longer carries a "replace it" instruction. "Keep
the skills current" uses the pinned `--copy` sync and says to commit the
result.
- `content/docs/getting-started/your-first-project.mdx`: scaffold step 3
and the section 7 sentence get the same two edits ("once it comes from
the package" is gone).
- `content/docs/upgrading.mdx`, "Moving the dependency pins": three
steps become four. Step 4 says the catalog moves only with the other
`@objectstack/*` packages, then re-run the pinned `--copy` sync and
commit. Its "From 17.x to 18" half gives the remove, install and sync
sequence.
- `content/docs/releases/v18/index.mdx`: one new bullet, "The AI skills
move with the packages". It has the same rule and the same three-command
block, and links to upgrading step 4.
`content/docs/releases/` is release-owned. This PR is docs-only (no
code, no package), and the card and its claim name this page, so it does
not ride a code change. The page is the hand-written status page of the
v18 line, not compiled release notes.
## Where this differs from the card's literal text, and why (all
measured)
1. **The remove list has 11 names, not 10. `objectstack-pm-dispatch` is
added.** Through the contents API I listed `skills/` on `main` every two
days from 2026-06-01 to 2026-10-13. Across those samples the catalog
held 11 skill names. `objectstack-pm-dispatch` was on `main` from the
2026-08-02 sample to the last one before 2026-09-11. It is in the
`@objectstack/spec@17.0.0` through `17.4.0` tags and gone from `17.5.0`
on. The 17.x scaffolders read `main` at scaffold time, so projects
scaffolded in that window got it. I installed a project from the
`17.4.0` tree with the 17.0–17.3 scaffolders' `skills add … --all`. The
card's 10-name `npx skills remove … -y` printed `Found 11 unique
installed skill(s)` and `Successfully removed 10 skill(s)`. That left
`objectstack-pm-dispatch` in `.claude/skills/`, `.agents/skills/` and
`agent/skills/`, plus its `github` lock entry. The 11-name list removed
all 11. A name that is not installed is skipped: on a 10-skill project
the 11-name list printed `removed 10`, exit 0. So one list covers both
project shapes, and the pages say so.
2. **The named remove carries `-y`.** `skills remove --help` lists `-y,
--yes Skip confirmation prompts` (and `--all … (-y implied)`). The
scaffolder's own remedy line is `npx skills remove NAME -y`
(`src/index.ts`). This container's CLI printed `Agent detected —
removing non-interactively`, so a human at a terminal would get the
prompt that `-y` skips.
3. **`remove` stays unpinned, as the card and the scaffolder's remedy
spell it.** Only `experimental_sync` is pinned (`SKILLS_CLI =
'skills@1.7.2'` in `packages/create-objectstack/src/skills-install.ts`
at this head), because that is the unstable interface. `npm view skills
dist-tags` today gives `latest: 1.7.2`.
No other wording of the card's sequence changed. The 17.x to 18 step is
the removal, then step 1, then step 2, plus the rule that the catalog
moves only with the packages.
## Measured on 2026-10-13, in throwaway projects under the session
scratchpad
Node 22.22.0, npm 10.9.4, skills CLI 1.7.2. Every exit code was captured
before any pipe.
- **Registry.** `@objectstack/skills` dist-tags `latest` and `next` are
both `18.0.0-next.0`; its versions are `0.0.0-stage` and
`18.0.0-next.0`. `@objectstack/spec` and `create-objectstack` are at
`latest 17.7.0` and `next 18.0.0-next.0`, so no scaffolder with #23248
has been published yet. I read the published tarballs' `dist/index.js`.
`17.0.0` and `17.3.0` run `skills add objectstack-ai/objectstack/skills
--all`. `17.5.0`, `17.7.0` and `18.0.0-next.0` run `skills add
objectstack-ai/objectstack/skills --skill '*' --agent AGENT -y`. So
`18.0.0-next.0` is the one 18.x scaffolder that reads `main`, and the
pages describe every scaffolder publish after it.
- **This tree's scaffolder, run for real.** I ran `tsx
packages/create-objectstack/src/index.ts real-probe` with no flags, so
its own `pnpm install` went to the registry. Results:
- The install printed `+ @objectstack/skills 18.0.0-next.0`, then
`Installing AI skills for your coding agent from
@objectstack/skills@18.0.0-next.0...` and `Synced 10 skills`.
- `.claude/skills/` holds 10 directories, 10 real `SKILL.md` and 0
symlinks. `skills-lock.json` has 10 entries, all `source
@objectstack/skills`, `sourceType node_modules`, `version
18.0.0-next.0`. `package.json` has `@objectstack/spec` and
`@objectstack/skills` both at `^18.0.0-next.0`.
- The summary prints `npx skills@1.7.2 experimental_sync --agent
claude-code --copy -y`.
- `git add -A` staged 10 `SKILL.md` and 0 symlinks, and a clone held 10
readable `SKILL.md`. The control was the linked sync (no `--copy`) on a
copy of that project: it staged 20 symlinks and 0 `SKILL.md`, and its
clone held 0 readable `SKILL.md` and 20 dangling links. This matches
#23248's committed-project measurement.
- **The reference's two steps, on a fresh `@objectstack/spec@next`
project.** I extracted the code block from the page and ran it with
`bash -e`: exit 0. It saved `@objectstack/skills ^18.0.0-next.0` and
wrote 10 real skills in `.claude/skills/`, with a lock of 10 entries,
all `node_modules`. On a `17.7.0` project, step 1 exits 1 with `npm
error code ETARGET` and `No matching version found for
@objectstack/skills@17.7.0`. That is the reference's "Which versions
exist" line, unchanged.
- **The 17.x to 18 step, both 17.x project shapes.**
- **Shape A** is what the 17.5–17.7 scaffolders write: `skills add …
--skill '*' --agent claude-code -y` from `main`, 10 real skills and a
lock of 10 × `github`.
- **Shape B** is what the 17.0–17.3 scaffolders write: `skills add …
--all` over the `17.4.0` tree. It gives `.claude/skills/` 11 symlinks,
`.agents/skills/` and `agent/skills/` 11 real copies each, and a lock of
11 × `github`.
- **Control.** On shape A, after bumping to `@objectstack/spec@next`,
running step 1 and then the sync with no removal printed `Skipped NAME
from @objectstack/skills: installed with \`skills add\` from
objectstack-ai/objectstack` × 10 and `Nothing to sync.`, exit 0. The
tree was unchanged. This is the card's premise, reproduced.
- **The page's exact block**, taken from `upgrading.mdx` and
de-indented, ran under `bash -e` after the bump on both shapes, exit 0:
- A: `removed 10`, `Synced 10 skills`.
- B: `Found 11`, `removed 11`, `Synced 10 skills`.
- On both: `.claude/skills/` has 10 real `SKILL.md` and 0 symlinks, and
the lock has 10 × `@objectstack/skills` / `node_modules` /
`18.0.0-next.0`. A `diff -r` of B's `.claude/skills` against
`node_modules/@objectstack/skills/dist/skills` differs only by the
catalog `README.md`. On B the `.agents/skills/` and `agent/skills/`
directories remain, empty (git tracks no empty directory).
- The `upgrading.mdx` block and the `releases/v18/index.mdx` block are
byte-identical once de-indented.
- **One spelling.** `git grep -ho` for every `npx … experimental_sync …`
under `content/docs`, excluding `releases/v17`, returns 7 occurrences,
all `npx skills@1.7.2 experimental_sync --agent claude-code --copy -y`,
and 0 of any other form. That equals `skillsInstallHint('claude-code')`
and the line in the scaffold's `AGENTS.md` and `README.md`.
## Gates, at `98ee767b5a`
- `node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack`, with no paths, derived 50 commands from the
merge base: 6 paths, 119 changed lines.
- First pass: 45 exited 0. Four exited 3 (`PREREQUISITE NOT MET`, read
as not measured): `check:doc-formula-expressions`,
`check:doc-security-posture`, `check:skill-examples` and
`check:docs-transcript-drift`. `pnpm --filter @objectstack/spec run
check:docs` exited 1 with "Generate it first: pnpm --filter
@objectstack/spec gen:schema". That is a missing gitignored tree, not a
finding about the docs.
- I then ran `turbo run build --filter=@objectstack/spec
--filter=@objectstack/formula --filter=@objectstack/lint
--filter=@objectstack/client --filter=@objectstack/client-react
--concurrency=2` under the shared verify lock: 35 tasks, `VERDICT
command-exit 0`. All five re-ran to exit 0: "263 prose examples
type-check across 3 surface(s)", "226 generated files in sync with
packages/spec", "4 declared transcript value(s) across 414 page(s) …
equal what the registry derives today". The tree was clean after the
build.
- `--ran` over the final per-command record: `50 derived, 50 run, 0
NOT-MEASURED, 0 UNRUN` ("a DERIVED zero").
- The card's named gates are among the 50 and exit 0:
`check:corpus-claim-drift`, `check:doc-authoring`, and
`check-doc-route-spelling.mjs --advisory` plus `--self-test`. Enforce
mode (no flag) also exits 0: `population clean`. `check:doc-anchors`
exits 0, and it is the gate that resolves the new
`/docs/upgrading#moving-the-dependency-pins` links.
- Docs link check, as `check-links.yml` runs it: `lychee 0.24.2
--offline --root-dir content --fallback-extensions mdx,md --config
lychee.toml` over `content/**/*.md`, `content/**/*.mdx`, `README.md` and
`ARCHITECTURE.md`. Exit 0: `2457 Total … 0 Errors`.
- MDX compile of the six pages with the workspace's `@mdx-js/mdx` 3.1.1:
6 of 6 ok. A negative control (a bare unclosed tag) fails to compile.
- `pnpm lint` is not affected. Measured: `eslint --no-inline-config
--format json` over the six files gives 6 results, 0 errors, each `File
ignored because no matching configuration was supplied`.
`eslint.config.mjs` enables no type-aware linting, so this diff cannot
move any other file's verdict.
- A control-character grep (`-naP` over the C0 range and DEL) on the six
files has no hits, and `check:nul-bytes` exits 0.
- `skip-changeset`: the diff is `content/docs/**` only, which ships in
no package.
## Acceptance notes
- `npm create objectstack@latest`, which these pages use, resolves
`create-objectstack@17.7.0` today (`latest`), and that scaffolder still
runs `skills add` from `main`. The pages on `main` describe the v18
line. The 17.x line is covered by "Which versions exist" (no 17.x
catalog) and by the new upgrade step. This was already true before this
PR and resolves at GA. Not filed.
- The `next` channel sentence (`npx skills add
objectstack-ai/objectstack/skills --skill '*' --agent claude-code -y`)
is kept as is, per ruling A.
- The two package READMEs and the `objectstack-upgrade` skill belong to
the skills lane's sibling card (`skills/**` and `packages/**` are
outside this claim). If that card copies the card's remove list, it
needs `objectstack-pm-dispatch` too (finding 1 above).
---
_Generated by [Claude
Code](https://claude.ai/code/session_012zwsLMxQBwHUYJgPyrpEvx)_
Co-authored-by: Claude <noreply@anthropic.com>
1 parent b529a5c commit 175e8d4
6 files changed
Lines changed: 83 additions & 36 deletions
File tree
- content/docs
- ai
- getting-started
- releases/v18
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
17 | | - | |
| 17 | + | |
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
23 | | - | |
24 | | - | |
| 23 | + | |
| 24 | + | |
25 | 25 | | |
26 | 26 | | |
27 | | - | |
| 27 | + | |
28 | 28 | | |
29 | | - | |
| 29 | + | |
30 | 30 | | |
31 | | - | |
| 31 | + | |
32 | 32 | | |
33 | | - | |
| 33 | + | |
34 | 34 | | |
35 | 35 | | |
36 | 36 | | |
37 | 37 | | |
38 | 38 | | |
39 | | - | |
40 | | - | |
41 | 39 | | |
42 | 40 | | |
43 | 41 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
29 | | - | |
| 29 | + | |
30 | 30 | | |
31 | 31 | | |
32 | 32 | | |
33 | | - | |
| 33 | + | |
34 | 34 | | |
35 | 35 | | |
36 | | - | |
| 36 | + | |
37 | 37 | | |
38 | 38 | | |
39 | 39 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
57 | 57 | | |
58 | 58 | | |
59 | 59 | | |
60 | | - | |
61 | | - | |
62 | | - | |
63 | | - | |
64 | | - | |
65 | | - | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
66 | 64 | | |
67 | | - | |
| 65 | + | |
| 66 | + | |
68 | 67 | | |
69 | 68 | | |
70 | 69 | | |
| |||
428 | 427 | | |
429 | 428 | | |
430 | 429 | | |
431 | | - | |
432 | | - | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
433 | 433 | | |
434 | 434 | | |
435 | 435 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
43 | 43 | | |
44 | 44 | | |
45 | 45 | | |
46 | | - | |
47 | | - | |
48 | | - | |
49 | | - | |
50 | | - | |
51 | | - | |
52 | | - | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
53 | 51 | | |
54 | | - | |
| 52 | + | |
| 53 | + | |
55 | 54 | | |
56 | 55 | | |
57 | 56 | | |
| |||
353 | 352 | | |
354 | 353 | | |
355 | 354 | | |
356 | | - | |
357 | | - | |
358 | | - | |
359 | | - | |
360 | | - | |
361 | | - | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
362 | 361 | | |
363 | 362 | | |
364 | 363 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
37 | 37 | | |
38 | 38 | | |
39 | 39 | | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
40 | 62 | | |
41 | 63 | | |
42 | 64 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
68 | 68 | | |
69 | 69 | | |
70 | 70 | | |
71 | | - | |
| 71 | + | |
72 | 72 | | |
73 | 73 | | |
74 | 74 | | |
| |||
87 | 87 | | |
88 | 88 | | |
89 | 89 | | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
90 | 118 | | |
91 | 119 | | |
92 | 120 | | |
| |||
0 commit comments