Skip to content

Commit 3a7a60a

Browse files
docs: give the @objectstack/skills install line for the project's own package manager (#24973)
Fixes #24926 Clause-②: no ## What changed Three `content/docs/**` pages printed `npm install --save-dev "@objectstack/skills@$(node -p …)"` as the only install command. Each one now gives the install line for the project's own package manager, in the same shape as PR #24922 (`content/docs/releases/v18/18-0.mdx` step 1): - the pnpm line in the block; - a one-line comment with the npm and yarn spellings; - the rule "add the package with the manager that installed the project", followed by the npm failure as measured. | site | old → new | measurement | |:--|:--|:--| | `content/docs/upgrading.mdx`, step 4, the "From 17.x to 18" block | `npm install --save-dev "@objectstack/skills@$(node -p …)"` → `pnpm add -D "@objectstack/skills@$(node -p …)"`, plus the line `# npm: npm install --save-dev "@objectstack/skills@…" · yarn: yarn add -D "@objectstack/skills@…"`, plus the rule sentence | M1 pnpm exit 0 · M2 the old line exit 1 · M3 npm exit 0 · M4 yarn exit 0 | | `content/docs/ai/skills.mdx`, § Installing skills | same change | M1 to M4 | | `content/docs/ai/skills-reference.mdx`, § Installing skills, step 1 | same change. Also: the 17.x refusal now names pnpm's `ERR_PNPM_NO_MATCHING_VERSION` beside npm's `ETARGET`, and the 18.0.0-next.0 note runs `npx skills list` before `npx skills remove --all` | M1 to M4, M5, M6 | | `skills/README.md` (≈`:11`) | **not in this PR.** The file is governed (Tier H, `domain:skills`). The `domain:devx` seat moves it to a `domain:skills` card when this one lands | — | | `skills/objectstack-upgrade/SKILL.md` (≈`:129`) | **not in this PR**, for the same reason | — | `upgrading.mdx` already said to run `npx skills list` before `--all` ("Run `npx skills list` first"), so that sentence is unchanged. `skills.mdx` does not print `--all`. ## Measured Node 22.22.0. Each scaffold was created in its own new, empty directory under the session scratchpad. The command was copied from the page: the pnpm line, or a spelling from the comment with its `@…` filled in with the same version expression. | # | manager | project | command | exit | `@objectstack/skills` line in `package.json` afterwards | |:--|:--|:--|:--|:--|:--| | M1 | pnpm 10.28.0 | `create-objectstack@18.0.0` scaffold, pnpm-installed | `pnpm add -D "@objectstack/skills@$(node -p …)"`, the line every site now keeps | `0` | `"18.0.0"`, written in place of the template's `"^18.0.0"` | | M2 | npm 10.9.4 | a second `create-objectstack@18.0.0` scaffold, pnpm-installed | `npm install --save-dev "@objectstack/skills@$(node -p …)"`, the line every site kept | `1` | not written: `npm error Cannot read properties of null (reading 'edgesOut')`; `package.json` unchanged (`"^18.0.0"`) | | M3 | npm 10.9.4 | `create-objectstack@18.0.0` scaffold, npm-installed. pnpm was taken off `PATH`, so the scaffolder chose npm and wrote `package-lock.json` | `npm install --save-dev "@objectstack/skills@$(node -p …)"`, the comment's npm spelling | `0`, **it succeeds** | `"^18.0.0"`: npm saves with its default `^` prefix, so the value is the template's | | M4 | yarn 1.22.22 | `create-objectstack@18.0.0 --skip-install`, then `yarn install` (exit `0`, `yarn.lock`) | `yarn add -D "@objectstack/skills@$(node -p …)"`, the comment's yarn spelling | `0` | `"18.0.0"` | | M5 | pnpm 10.28.0 | `create-objectstack@17.7.0 --skip-skills`, pnpm-installed (`@objectstack/spec` 17.7.0) | `pnpm add -D "@objectstack/skills@$(node -p …)"` | `1` | not written: `ERR_PNPM_NO_MATCHING_VERSION No matching version found for @objectstack/skills@17.7.0`; unchanged | | M6 | npm 10.9.4 | the M3 scaffold, with the version given as the literal `17.7.0` | `npm install --save-dev "@objectstack/skills@17.7.0"` | `1` | not written: `npm error code ETARGET`, `No matching version found for @objectstack/skills@17.7.0.`; unchanged | Notes on the readings: - **M6 used a literal version.** No npm-installed 17.7.0 scaffold could be built here: `create-objectstack@17.7.0`'s own `npm install` exited `1` with the same `edgesOut` error, and again on a retry. So npm's 17.x refusal was measured with the version written out. - **Yarn's 17.x refusal** was also measured: `error Couldn't find any versions for "@objectstack/skills" that matches "17.7.0"`, exit `1`. The page does not name it. - **pnpm, npm and yarn all re-sorted `dependencies` alphabetically** in M1, M3 and M4. No other value changed. ## Gates Local, at head `bd085862fc`. These are the 44 commands that `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derives from this diff, with each exit code captured before any pipe. - **All 44 exited `0`.** - **Five needed a build first.** They answered exit `3` (prerequisite not met) on the first pass, which is not a measurement: - `check:doc-formula-expressions`, `check:doc-security-posture` and `check:docs-transcript-drift` needed `@objectstack/lint` built; - `@objectstack/spec check:docs` needed its generated tree; - `@objectstack/spec check:skill-examples` needed `@objectstack/client-react` built. I built `@objectstack/lint...` and `@objectstack/client-react...` under the verify lock (`VERDICT command-exit 0` both times) and re-ran the five. Each exited `0`. - **The builds left the worktree clean.** `git status --porcelain` printed nothing afterwards. - **`--ran` reconciliation:** `44 derived, 44 run, 0 NOT-MEASURED, 0 UNRUN` (it calls this "a DERIVED zero"). - **Selected verdict lines:** - `check:doc-anchors`: 563 internal fragment links, each reaching a real heading; - `check:docs-single-h1`: 418 pages, no body-level heading-one; - `check:docs-image-tag`: OK, 9 concrete pins against 18.0.0; - `check:skill-docs`: `✓ content/docs/ai/skills-reference.mdx`, "Skill docs in sync"; - `check:nul-bytes`: OK, no raw control bytes. - **No package code changed,** so there is no package build, `pnpm test` or `typecheck` to run. `test:repo` is left to CI. - **Merge check:** `git merge-tree --write-tree origin/main HEAD` exited `0` against `origin/main` `693352e4c2`. That is three commits past the base, none of them under `content/docs/`. ## Changeset This PR is labelled `skip-changeset`, because `content/docs/**` ships in no package. Measured: - no published package lists a `content` or `docs` path in its `files[]`; - no build step copies these pages into a package; - after the build, I searched every path `@objectstack/spec` ships (`dist`, `json-schema`, `liveness`, `prompts`, `llms.txt`, `README.md`, `api-surface`) for five strings from the edited passages. Each matched 0 files. The positive control `defineStack` matched 93 files. ## Acceptance notes - **One sentence beyond the install line, the rule and `npx skills list`.** In `skills-reference.mdx`, the 17.x refusal sentence now names the code that step 1 prints. Left alone, the page would put npm's `ETARGET` under a pnpm command, which prints `ERR_PNPM_NO_MATCHING_VERSION` (M5). - **A sentence left as written.** `skills-reference.mdx` still says that a bare `npm install --save-dev @objectstack/skills` installs whichever version the registry tags `latest`. That is true as stated, and equally true of a bare `pnpm add -D`. The card rules out other prose changes, so it stays. Carrier: none. - **A sixth site the card does not list.** `packages/skills/README.md:28`, the published `@objectstack/skills` README, prints the same `npm install --save-dev` line as its only step 1. That is the M2 command. The README is in the package's `files[]`, so this text is on the npm page and in the tarball. It is outside this PR's file surface, and changing it publishes (a `patch` changeset for `@objectstack/skills`). It is reported to the seat to join the follow-up card with the two `skills/**` rows. - **`create-objectstack@17.7.0` cannot install with npm here.** Its own `npm install` (npm 10.9.4, no lockfile) exits `1` with `edgesOut`. 17.7.0 is a superseded release, and 18.0.0's npm path succeeds (M3). Carrier: none. - **pnpm and yarn write the exact version; npm writes a caret range.** pnpm and yarn write `"18.0.0"` and npm writes `"^18.0.0"`. None of the three pages says which. The sentence in `releases/v18/18-0.mdx`, "The command writes the exact version", is about its pnpm line, and M1 agrees with it. --- _Generated by [Claude Code](https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 0715fac commit 3a7a60a

3 files changed

Lines changed: 14 additions & 4 deletions

File tree

‎content/docs/ai/skills-reference.mdx‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,20 @@ The catalog ships as the npm package [`@objectstack/skills`](https://www.npmjs.c
1818

1919
```bash
2020
# 1 · the catalog, at the version of your installed @objectstack/spec
21-
npm install --save-dev "@objectstack/skills@$(node -p "require('@objectstack/spec/package.json').version")"
21+
pnpm add -D "@objectstack/skills@$(node -p "require('@objectstack/spec/package.json').version")"
22+
# npm: npm install --save-dev "@objectstack/skills@…" · yarn: yarn add -D "@objectstack/skills@…"
2223

2324
# 2 · copy it from node_modules into your agent's skills directory
2425
npx skills@1.7.2 experimental_sync --agent claude-code --copy -y
2526
```
2627

28+
Add the package with the manager that installed the project: in a pnpm project, `npm install --save-dev` exits `1` with `npm error Cannot read properties of null (reading 'edgesOut')`.
29+
2730
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.
2831

2932
**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.
3033

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.
34+
**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 `ERR_PNPM_NO_MATCHING_VERSION` (npm: `ETARGET`; both print `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 list` first, because `npx skills remove --all` removes every installed skill without asking; run that when the list shows only the `objectstack-*` skills — or remove those by name, as the [upgrade step](/docs/upgrading#moving-the-dependency-pins) does, if you added others — and then steps 1 and 2.
3235

3336
**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.
3437

‎content/docs/ai/skills.mdx‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,13 @@ See [Agents](/docs/ai/agents#you-extend-the-platform-with-skills-not-agents) for
2929
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
32-
npm install --save-dev "@objectstack/skills@$(node -p "require('@objectstack/spec/package.json').version")"
32+
pnpm add -D "@objectstack/skills@$(node -p "require('@objectstack/spec/package.json').version")"
33+
# npm: npm install --save-dev "@objectstack/skills@…" · yarn: yarn add -D "@objectstack/skills@…"
3334
npx skills@1.7.2 experimental_sync --agent claude-code --copy -y
3435
```
3536

37+
Add the package with the manager that installed the project: in a pnpm project, `npm install --save-dev` exits `1` with `npm error Cannot read properties of null (reading 'edgesOut')`.
38+
3639
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).
3740

3841
---

‎content/docs/upgrading.mdx‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,14 @@ command for this move; it is four steps you run yourself.
108108
npx skills remove objectstack-ai objectstack-api objectstack-automation \
109109
objectstack-data objectstack-formula objectstack-i18n objectstack-platform \
110110
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")"
111+
pnpm add -D "@objectstack/skills@$(node -p "require('@objectstack/spec/package.json').version")"
112+
# npm: npm install --save-dev "@objectstack/skills@…" · yarn: yarn add -D "@objectstack/skills@…"
112113
npx skills@1.7.2 experimental_sync --agent claude-code --copy -y
113114
```
114115

116+
Add the package with the manager that installed the project: in a pnpm
117+
project, `npm install --save-dev` exits `1` with
118+
`npm error Cannot read properties of null (reading 'edgesOut')`.
115119
The list names every skill the catalog carried during 17.x, and a name that
116120
is not installed is skipped; `npx skills remove --all` does the same when
117121
these are the only skills the project has. Run `npx skills list` first:

0 commit comments

Comments
 (0)