Skip to content

Commit 175e8d4

Browse files
docs(skills): the end state after create-objectstack installs @objectstack/skills — one pinned --copy spelling, one next.0 exception, and the 17.x to 18 skills step (#23275) (#23295)
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/skills-reference.mdx‎

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,30 +14,28 @@ ObjectStack ships a set of **domain-specific skills** that teach AI assistants (
1414

1515
## Installing skills
1616

17-
The catalog ships as the npm package [`@objectstack/skills`](https://www.npmjs.com/package/@objectstack/skills), released together with every other `@objectstack/*` package at one shared version. Install it at the version of the `@objectstack/spec` your project has installed — the catalog's version is then your spec's, so the skills teach what that spec accepts — and sync it from `node_modules` into your coding agent's skills directory:
17+
The catalog ships as the npm package [`@objectstack/skills`](https://www.npmjs.com/package/@objectstack/skills), released together with every other `@objectstack/*` package at one shared version. Install it at the version of the `@objectstack/spec` your project has installed — the catalog's version is then your spec's, so the skills teach what that spec accepts — and copy it from `node_modules` into your coding agent's skills directory:
1818

1919
```bash
2020
# 1 · the catalog, at the version of your installed @objectstack/spec
2121
npm install --save-dev "@objectstack/skills@$(node -p "require('@objectstack/spec/package.json').version")"
2222

23-
# 2 · link it from node_modules into your agent's skills directory
24-
npx skills experimental_sync --agent claude-code -y
23+
# 2 · copy it from node_modules into your agent's skills directory
24+
npx skills@1.7.2 experimental_sync --agent claude-code --copy -y
2525
```
2626

27-
Step 2 is the [skills CLI](https://www.npmjs.com/package/skills)'s sync from `node_modules`: it finds the skills under `node_modules/@objectstack/skills/dist/skills/`, links each one into `.agents/skills/<skill>` (and, for `claude-code`, `.claude/skills/<skill>` to that), and records the source and version in `skills-lock.json`. Name your own runtime after `--agent` (`codex`, `cursor`, …). Add `--copy` to write real files instead of links — for `claude-code` the catalog then lands once, in `.claude/skills/`, and nowhere else. A bare `npm install --save-dev @objectstack/skills` installs whichever version the registry tags `latest`, not your spec's — keep the version in step 1.
27+
Step 2 is the [skills CLI](https://www.npmjs.com/package/skills)'s sync from `node_modules`: it finds the skills under `node_modules/@objectstack/skills/dist/skills/`, copies each one into your agent's directory — for `claude-code`, real files in `.claude/skills/<skill>` and nowhere else — and records the source and version in `skills-lock.json`. Commit both with the project. Keep `--copy`: without it the sync writes links into `node_modules`, which is not committed, so a clone of the project gets dangling links and no skills. The CLI is pinned because `experimental_sync` is that tool's own unstable interface; `create-objectstack` runs the same version. Name your own runtime after `--agent` (`codex`, `cursor`, …), one runtime per run — never `--agent '*'`, which copies the catalog into dozens of agent directories at once. A bare `npm install --save-dev @objectstack/skills` installs whichever version the registry tags `latest`, not your spec's — keep the version in step 1.
2828

29-
**Updating.** The catalog is versioned as **one bundle**, and it moves only with your ObjectStack version — you never track or update a skill on its own: bump `@objectstack/skills` with the other `@objectstack/*` packages, then re-run the sync (step 2, same flags).
29+
**Updating.** The catalog is versioned as **one bundle**, and it moves only with your ObjectStack version — you never track or update a skill on its own: bump `@objectstack/skills` with the other `@objectstack/*` packages, then re-run the sync (step 2, same flags) and commit what it changed.
3030

31-
**Which versions exist.** `@objectstack/skills` is published from `18.0.0-next.0` on; there is no 17.x release of it. A project on `@objectstack/spec` 17.x therefore has no catalog bound to its version: step 1 refuses with `ETARGET` (`No matching version found`).
31+
**Which versions exist.** `@objectstack/skills` is published from `18.0.0-next.0` on; there is no 17.x release of it. A project on `@objectstack/spec` 17.x therefore has no catalog bound to its version: step 1 refuses with `ETARGET` (`No matching version found`), and moving it to 18 includes [a skills step](/docs/upgrading#moving-the-dependency-pins). One scaffolder is the exception to the next paragraph: `create-objectstack@18.0.0-next.0` still installed the skills from the repository's `main` with `skills add`, and step 2 skips every skill a `skills add` installed (it prints `Skipped … installed with skills add` and exits 0), so in a project it scaffolded run `npx skills remove --all` — or remove the `objectstack-*` skills by name, as the [upgrade step](/docs/upgrading#moving-the-dependency-pins) does, if you added others — and then steps 1 and 2.
3232

33-
**New projects.** `create-objectstack` installs the skills for one agent runtime while it scaffolds — once, into `.claude/skills/` — and its closing summary prints the command for any other runtime you use.
33+
**New projects.** `create-objectstack` runs both steps while it scaffolds: the `package.json` it writes depends on `@objectstack/skills` at the same version as `@objectstack/spec`, its dependency install puts the catalog in `node_modules`, and step 2 copies it for one agent runtime, into `.claude/skills/`. Its closing summary prints step 2 again — to re-run after an upgrade, and with another `--agent` for any other runtime you use.
3434

3535
```bash
3636
npm create objectstack@latest my-app
3737
```
3838

39-
Through `18.0.0-next.0` the scaffolder takes those skills from the `next` channel below with `skills add`, not from `@objectstack/skills`, and step 2 skips every skill a `skills add` installed (it prints `Skipped … installed with skills add`). To bind a scaffolded project's skills to a version the package is published at, remove them first — `npx skills remove --all` removes every installed skill; name the `objectstack-*` ones instead (`npx skills remove objectstack-data objectstack-ui …`) if you added others — then run steps 1 and 2.
40-
4139
**The `next` channel.** `npx skills add objectstack-ai/objectstack/skills --skill '*' --agent claude-code -y` reads the catalog straight from the repository's unreleased `main` — for trying the next version's skills, not for a released project.
4240

4341
---

‎content/docs/ai/skills.mdx‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ See [Agents](/docs/ai/agents#you-extend-the-platform-with-skills-not-agents) for
2626

2727
## Installing skills
2828

29-
Skills ship as the npm package `@objectstack/skills`, released with the other `@objectstack/*` packages at one shared version. Install it at your installed `@objectstack/spec`'s version — the catalog's version is then your spec's — and sync it from `node_modules` into your agent's directory:
29+
Skills ship as the npm package `@objectstack/skills`, released with the other `@objectstack/*` packages at one shared version. Install it at your installed `@objectstack/spec`'s version — the catalog's version is then your spec's — and copy it from `node_modules` into your agent's directory, the two steps `create-objectstack` runs when it scaffolds a project:
3030

3131
```bash
3232
npm install --save-dev "@objectstack/skills@$(node -p "require('@objectstack/spec/package.json').version")"
33-
npx skills experimental_sync --agent claude-code -y
33+
npx skills@1.7.2 experimental_sync --agent claude-code --copy -y
3434
```
3535

36-
Name your own runtime after `--agent` (`codex`, `cursor`, …). The catalog is versioned and updated as **one unit**, with ObjectStack itself: bump `@objectstack/skills` with the other `@objectstack/*` packages, then re-run the sync. The package is published from `18.0.0-next.0` on (there is no 17.x release); for the versions, `--copy`, projects scaffolded by `create-objectstack` and the `next` channel, see the [AI Skills Reference](/docs/ai/skills-reference#installing-skills).
36+
The skills land as real files in `.claude/skills/`; commit them with the project, and keep `--copy` — without it they are links into `node_modules`, which a clone does not have. Name your own runtime after `--agent` (`codex`, `cursor`, …). The catalog is versioned and updated as **one unit**, with ObjectStack itself: bump `@objectstack/skills` with the other `@objectstack/*` packages, then re-run the sync. The package is published from `18.0.0-next.0` on (there is no 17.x release); for what the sync writes, the versions, the one scaffolder that is an exception and the `next` channel, see the [AI Skills Reference](/docs/ai/skills-reference#installing-skills).
3737

3838
---
3939

‎content/docs/getting-started/build-with-claude-code.mdx‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,13 @@ The scaffolder does more than copy files. It:
5757
- derives a **namespace** from the name (`support-desk` → `support_desk`), so
5858
every object you create is named `support_desk_*`;
5959
- installs dependencies;
60-
- installs the **AI skills bundle** for one agent runtime — once, into
61-
`.claude/skills/` — and prints the command for any other runtime you use.
62-
Through `18.0.0-next.0` that bundle comes from the repository's unreleased
63-
`main`, not from your version; to make the catalog's version your installed
64-
`@objectstack/spec`'s, replace it with the `@objectstack/skills` package and
65-
`npx skills experimental_sync --agent claude-code -y`
60+
- installs the **AI skills bundle** for one agent runtime from the
61+
`@objectstack/skills` package, at your `@objectstack/spec`'s version — copied
62+
once into `.claude/skills/`, to commit with the project — and prints the
63+
command for any other runtime you use
6664
([Installing skills](/docs/ai/skills-reference#installing-skills) has the
67-
steps, and the versions the package is published at);
65+
steps, the versions the package is published at, and the one scaffolder
66+
version that is an exception);
6867
- writes an **`AGENTS.md`** (and `.github/copilot-instructions.md`) that teach your
6968
coding agent the project layout, the naming rules, and — critically — *to run
7069
`npm run validate` after every metadata change*.
@@ -428,8 +427,9 @@ Three habits keep this reliable as the app grows:
428427
- **Keep the skills current.** The catalog's version is your installed
429428
`@objectstack/spec`'s: when you upgrade, bump `@objectstack/skills` with the
430429
other `@objectstack/*` packages, then re-run
431-
`npx skills experimental_sync --agent claude-code -y` — name your own runtime
432-
after `--agent` — so the agent authors against the schemas you actually run.
430+
`npx skills@1.7.2 experimental_sync --agent claude-code --copy -y` — name your
431+
own runtime after `--agent` — and commit what it changed, so the agent authors
432+
against the schemas you actually run.
433433
The install steps, and the versions the package is published at, are in the
434434
[AI Skills Reference](/docs/ai/skills-reference#installing-skills).
435435

‎content/docs/getting-started/your-first-project.mdx‎

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,14 @@ The scaffolder (`create-objectstack`) does four things:
4343
renamed to carry that prefix (`my_app_note`), which is what
4444
`os validate` later enforces.
4545
2. **Installs dependencies** (pnpm if available, otherwise npm).
46-
3. **Installs the AI skills bundle for one coding agent** — once, into
47-
`.claude/skills/` — so a coding agent is productive in the project from the
48-
first prompt. The closing summary prints the command for any other runtime
49-
you use. Through `18.0.0-next.0` the bundle comes from the repository's
50-
unreleased `main`, not from your version; to make the catalog's version your
51-
installed `@objectstack/spec`'s, replace it with the `@objectstack/skills`
52-
package and `npx skills experimental_sync --agent claude-code -y`
46+
3. **Installs the AI skills bundle for one coding agent** from the
47+
`@objectstack/skills` package, at your installed `@objectstack/spec`'s
48+
version — copied once into `.claude/skills/`, to commit with the project — so
49+
a coding agent is productive in the project from the first prompt. The
50+
closing summary prints the command for any other runtime you use
5351
([Installing skills](/docs/ai/skills-reference#installing-skills) has the
54-
steps, and the versions the package is published at).
52+
steps, the versions the package is published at, and the one scaffolder
53+
version that is an exception).
5554
4. **Writes `AGENTS.md`** (and `.github/copilot-instructions.md`) with the
5655
project conventions — including the rule to run `npm run validate` after
5756
every metadata change.
@@ -353,12 +352,12 @@ Each of those lands in a different metadata domain (UI, dashboards,
353352
automation) — the agent loads the matching skill per task. The full loop, and a
354353
per-domain prompt catalog, is on
355354
[Build with Claude Code](/docs/getting-started/build-with-claude-code#beyond-the-first-app--one-skill-per-metadata-domain).
356-
The catalog's version is your installed `@objectstack/spec`'s once it comes
357-
from the `@objectstack/skills` package (step 1.3): when you upgrade, bump
358-
`@objectstack/skills` with the other `@objectstack/*` packages, then re-run
359-
`npx skills experimental_sync --agent claude-code -y` to keep the agent in sync
360-
with the schemas you run. Name your own runtime after `--agent` if it is not
361-
Claude Code.
355+
The catalog's version is your installed `@objectstack/spec`'s (step 1.3): when
356+
you upgrade, bump `@objectstack/skills` with the other `@objectstack/*`
357+
packages, then re-run
358+
`npx skills@1.7.2 experimental_sync --agent claude-code --copy -y` and commit
359+
what it changed, to keep the agent in sync with the schemas you run. Name your
360+
own runtime after `--agent` if it is not Claude Code.
362361

363362
## Next steps
364363

‎content/docs/releases/v18/index.mdx‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,28 @@ under the same rules.
3737
v18 prerelease's handshake admits `engines.protocol: '^18'` and refuses
3838
`'^17'`. Read [Upgrading](/docs/upgrading) before you move an app's declared
3939
range.
40+
- **The AI skills move with the packages.** From v18 the skills catalog is the
41+
`@objectstack/skills` package, on the same version as every other
42+
`@objectstack/*` package, and it moves only with them. A 17.x project has no
43+
such dependency — its skills were installed with `skills add` from the
44+
repository's `main` — and the sync from the package skips every skill a
45+
`skills add` installed (`Skipped … installed with skills add`, exit 0), so
46+
bumping the packages alone keeps the 17.x-era skill text. After moving the
47+
`@objectstack/*` dependencies to 18, remove those skills, then add the
48+
catalog at the new `@objectstack/spec`'s version and copy it into your
49+
agent's directory ([Upgrading](/docs/upgrading#moving-the-dependency-pins),
50+
step 4):
51+
52+
```bash
53+
npx skills remove objectstack-ai objectstack-api objectstack-automation \
54+
objectstack-data objectstack-formula objectstack-i18n objectstack-platform \
55+
objectstack-pm-dispatch objectstack-query objectstack-ui objectstack-upgrade -y
56+
npm install --save-dev "@objectstack/skills@$(node -p "require('@objectstack/spec/package.json').version")"
57+
npx skills@1.7.2 experimental_sync --agent claude-code --copy -y
58+
```
59+
60+
`npx skills remove --all` replaces the first command when these are the only
61+
skills the project has.
4062
- **GA ends the prerelease.** Reaching GA exits pre mode and publishes the line
4163
to `latest`. Curated notes for the line's releases are compiled at release
4264
time and are not written yet; until then, the changesets are the record.

‎content/docs/upgrading.mdx‎

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ Not every deployment moves a tag. An app that consumes the platform as **npm
6868
dependencies** — `@objectstack/*` in its own `package.json`, which is the shape
6969
[`create-objectstack`](/docs/getting-started/quick-start) scaffolds — carries the
7070
platform version in its dependency tree and moves it there. There is no `os`
71-
command for this move; it is three steps you run yourself.
71+
command for this move; it is four steps you run yourself.
7272

7373
1. **Bump every `@objectstack/*` dependency together, to the same version.**
7474
The train is version-locked — every package on it shares one version number —
@@ -87,6 +87,34 @@ command for this move; it is three steps you run yourself.
8787
manifest. Both name the protocol **major**, so a move inside one major leaves
8888
both alone, and a major boundary is where they change. Move them deliberately
8989
when you cross one; never edit them to silence a mismatch.
90+
4. **Re-install the AI skills from the moved catalog, and commit them.** The
91+
skills your coding agent reads come from the `@objectstack/skills` dev
92+
dependency, which moves only with the other `@objectstack/*` packages — in
93+
step 1, never on its own — and step 2 only puts it in `node_modules`. Copy it
94+
into your agent's directory (name your own runtime after `--agent`):
95+
96+
```bash
97+
npx skills@1.7.2 experimental_sync --agent claude-code --copy -y
98+
```
99+
100+
**From 17.x to 18**, a project has no `@objectstack/skills` to move: its
101+
skills were installed with `skills add` from the repository's `main`, and the
102+
sync skips every skill a `skills add` installed (it prints
103+
`Skipped … installed with skills add` and exits 0), so a project that only
104+
bumps its packages keeps its 17.x-era skill text. Remove those skills first,
105+
then add the catalog at your new `@objectstack/spec`'s version and copy it:
106+
107+
```bash
108+
npx skills remove objectstack-ai objectstack-api objectstack-automation \
109+
objectstack-data objectstack-formula objectstack-i18n objectstack-platform \
110+
objectstack-pm-dispatch objectstack-query objectstack-ui objectstack-upgrade -y
111+
npm install --save-dev "@objectstack/skills@$(node -p "require('@objectstack/spec/package.json').version")"
112+
npx skills@1.7.2 experimental_sync --agent claude-code --copy -y
113+
```
114+
115+
The list names every skill the catalog carried during 17.x, and a name that
116+
is not installed is skipped; `npx skills remove --all` does the same when
117+
these are the only skills the project has.
90118

91119
Then run [the loop](#the-loop) below — `os validate` before `os build` — because
92120
moving the pins can move the gate.

0 commit comments

Comments
 (0)