@vegastack/skills 0.16.0 → 0.16.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,17 +2,25 @@
2
2
 
3
3
  Installer for VegaStack Agent Skills — a family of self-contained skills for Claude Code, Codex, and Hermes, shipped in one integrity-checked package.
4
4
 
5
+ Install the whole dev workflow, once per machine:
6
+
7
+ ```sh
8
+ npx @vegastack/skills add --group dev-skills --global
9
+ ```
10
+
11
+ `--global` is the recommended install: the skills land in your home directory and are available in every project you open. Drop it for a project-local install when a repository should carry its own copy.
12
+
13
+ See what else is bundled:
14
+
5
15
  ```sh
6
- npx @vegastack/skills list # what is bundled, by group
7
- npx @vegastack/skills add --group dev-skills # the whole dev workflow, one command
8
- npx @vegastack/skills add dev-architect # or a single skill
16
+ npx @vegastack/skills list
9
17
  ```
10
18
 
11
19
  ## Skills in this package
12
20
 
13
21
  ### `dev-skills` — the issue-driven dev workflow
14
22
 
15
- Install the family with `add --group dev-skills`.
23
+ Install the family with `add --group dev-skills --global`.
16
24
 
17
25
  | Skill | What it does |
18
26
  |---|---|
@@ -58,13 +66,46 @@ These operate on the vegastack-skills repository itself and do nothing useful in
58
66
 
59
67
  A `--group` or `--all` install is **one transaction**: every skill is checked and staged before any of them is committed, so if one fails, none are installed and the destination is left exactly as it was.
60
68
 
69
+ The ten dev-workflow skills:
70
+
71
+ ```sh
72
+ npx @vegastack/skills add --group dev-skills --global
73
+ ```
74
+
75
+ Everything worth installing outside this repo:
76
+
77
+ ```sh
78
+ npx @vegastack/skills add --all --global
79
+ ```
80
+
81
+ Check the family against the manifest:
82
+
61
83
  ```sh
62
- npx @vegastack/skills add --group dev-skills # the ten dev-workflow skills
63
- npx @vegastack/skills add --all # everything worth installing in your project
64
- npx @vegastack/skills verify --group dev-skills # check the family against the manifest
65
- npx @vegastack/skills remove --group dev-skills # uninstall it again
84
+ npx @vegastack/skills verify --group dev-skills --global
66
85
  ```
67
86
 
87
+ Uninstall it again:
88
+
89
+ ```sh
90
+ npx @vegastack/skills remove --group dev-skills --global
91
+ ```
92
+
93
+ ## Upgrading and health checks
94
+
95
+ Upgrade to the latest release. `--force` is required because `add` refuses to overwrite an installed copy that differs from the bundle rather than silently discarding local edits:
96
+
97
+ ```sh
98
+ npx @vegastack/skills@latest add --group dev-skills --global --force
99
+ ```
100
+
101
+ Diagnose an install — integrity across all skills, plus installed-vs-latest version:
102
+
103
+ ```sh
104
+ npx @vegastack/skills doctor --global
105
+ ```
106
+
107
+ Run `doctor` without `--global` from inside a project to additionally check that project's `.vegastack/dev.md` profile; the global run skips that check, since the profile is per-project by design.
108
+
68
109
  ## Flags
69
110
 
70
111
  | Flag | Meaning |
@@ -82,18 +123,22 @@ npx @vegastack/skills remove --group dev-skills # uninstall it again
82
123
 
83
124
  `--all` and `--agent all` are different axes and are easy to confuse: `--all` chooses **which skills**, `--agent all` chooses **which agent runtimes**. `add --all --agent all --global` is valid and means every installable skill, on every runtime, in your home directory.
84
125
 
85
- Agent targeting is automatic: the CLI detects which agents you have (`~/.claude`, `~/.codex`/`~/.agents`, `~/.hermes`) and targets them without asking — `--agent` overrides. A numbered picker appears only when nothing is detected. Installs are project-local by default; pass `--global` for the home directory (required for Hermes).
126
+ Agent targeting is automatic: the CLI detects which agents you have (`~/.claude`, `~/.codex`/`~/.agents`, `~/.hermes`) and targets them without asking — `--agent` overrides. A numbered picker appears only when nothing is detected.
86
127
 
87
128
  ## Agent surfaces
88
129
 
89
- | Agent | Project install | Global install |
130
+ `--global` is the recommended install and the only one that can cover all three runtimes at once. `--project` is the flag default, so pass `--global` explicitly.
131
+
132
+ | Agent | Global install (recommended) | Project install |
90
133
  |---|---|---|
91
- | Claude Code | `.claude/skills/` | `~/.claude/skills/` |
92
- | Codex | `.agents/skills/` | `~/.agents/skills/` |
93
- | Hermes | — (Hermes discovers skills globally only) | `~/.hermes/skills/` |
134
+ | Claude Code | `~/.claude/skills/` | `.claude/skills/` |
135
+ | Codex | `~/.agents/skills/` | `.agents/skills/` |
136
+ | Hermes | `~/.hermes/skills/` | — (Hermes discovers skills globally only) |
94
137
 
95
138
  `--agent hermes` therefore requires `--global`; `--agent all` on a project install covers codex+claude and prints a notice about hermes.
96
139
 
140
+ Prefer a project install when a repository should carry its own copy — so collaborators get the same skills from a checkout, or so one project can pin a version while the rest of the machine moves on. Pick one or the other per skill rather than both: in Claude Code a personal (global) skill takes precedence over a project one, so a project-local copy would not override a global install of the same skill.
141
+
97
142
  ## Integrity model
98
143
 
99
144
  The package ships a checksum manifest that is verified at install and by `verify` — it proves the installed bytes match what was packed, not who published it. Publisher identity is attested separately by npm provenance, generated by the trusted-publishing release pipeline. Verify it with `npm audit signatures` or on the package's npm page.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vegastack/skills",
3
- "version": "0.16.0",
3
+ "version": "0.16.2",
4
4
  "description": "Installer and verifier for VegaStack Agent Skills (Claude Code, Codex, and Hermes)",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -25,14 +25,14 @@ Every workflow-generated issue comment opens with an invisible HTML marker follo
25
25
 
26
26
  ## Operator identity
27
27
 
28
- Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — is written `operator (<github-username>)`:
28
+ Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — names the operator by their GitHub username in parentheses, with no title before it — `(<github-username>)`:
29
29
 
30
- - Approval: `Approved by operator (<username>) on DD-MM-YYYY: "<their words>"`
31
- - Register line: `- DD-MM-YYYY operator (<username>) — <decision>`
30
+ - Approval: `Approved by (<username>) on DD-MM-YYYY: "<their words>"`
31
+ - Register line: `- DD-MM-YYYY (<username>) — <decision>`
32
32
 
33
33
  ## Revision markers
34
34
 
35
- Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per operator (<username>) correction`. Existing revision lines are never rewritten.
35
+ Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per (<username>) correction`. Existing revision lines are never rewritten.
36
36
 
37
37
  ## Scope classes
38
38
 
@@ -20,7 +20,7 @@ Nearest neighbors: `dev-implement` writes the entries at hand-back (the write ru
20
20
  - **Changed:** <the user-visible changes, simple words — sub-bullets or one ·-separated line>
21
21
  - **Decisions:** <register lines it produced, or "none">
22
22
 
23
- — approved by operator (<username>) · built by <agent> · branch <name>
23
+ — approved by (<username>) · built by <agent> · branch <name>
24
24
  ```
25
25
 
26
26
  - Titles name the outcome ("Invoice reminders now chase late payers"), never the mechanism ("add reminderAt column"). The issue reference is a full markdown link to `…/issues/<n>` (correct for PRs too — GitHub redirects); a bare `#N` never appears anywhere in an entry, because file views don't auto-link it.
@@ -25,14 +25,14 @@ Every workflow-generated issue comment opens with an invisible HTML marker follo
25
25
 
26
26
  ## Operator identity
27
27
 
28
- Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — is written `operator (<github-username>)`:
28
+ Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — names the operator by their GitHub username in parentheses, with no title before it — `(<github-username>)`:
29
29
 
30
- - Approval: `Approved by operator (<username>) on DD-MM-YYYY: "<their words>"`
31
- - Register line: `- DD-MM-YYYY operator (<username>) — <decision>`
30
+ - Approval: `Approved by (<username>) on DD-MM-YYYY: "<their words>"`
31
+ - Register line: `- DD-MM-YYYY (<username>) — <decision>`
32
32
 
33
33
  ## Revision markers
34
34
 
35
- Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per operator (<username>) correction`. Existing revision lines are never rewritten.
35
+ Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per (<username>) correction`. Existing revision lines are never rewritten.
36
36
 
37
37
  ## Scope classes
38
38
 
@@ -25,14 +25,14 @@ Every workflow-generated issue comment opens with an invisible HTML marker follo
25
25
 
26
26
  ## Operator identity
27
27
 
28
- Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — is written `operator (<github-username>)`:
28
+ Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — names the operator by their GitHub username in parentheses, with no title before it — `(<github-username>)`:
29
29
 
30
- - Approval: `Approved by operator (<username>) on DD-MM-YYYY: "<their words>"`
31
- - Register line: `- DD-MM-YYYY operator (<username>) — <decision>`
30
+ - Approval: `Approved by (<username>) on DD-MM-YYYY: "<their words>"`
31
+ - Register line: `- DD-MM-YYYY (<username>) — <decision>`
32
32
 
33
33
  ## Revision markers
34
34
 
35
- Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per operator (<username>) correction`. Existing revision lines are never rewritten.
35
+ Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per (<username>) correction`. Existing revision lines are never rewritten.
36
36
 
37
37
  ## Scope classes
38
38
 
@@ -25,14 +25,14 @@ Every workflow-generated issue comment opens with an invisible HTML marker follo
25
25
 
26
26
  ## Operator identity
27
27
 
28
- Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — is written `operator (<github-username>)`:
28
+ Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — names the operator by their GitHub username in parentheses, with no title before it — `(<github-username>)`:
29
29
 
30
- - Approval: `Approved by operator (<username>) on DD-MM-YYYY: "<their words>"`
31
- - Register line: `- DD-MM-YYYY operator (<username>) — <decision>`
30
+ - Approval: `Approved by (<username>) on DD-MM-YYYY: "<their words>"`
31
+ - Register line: `- DD-MM-YYYY (<username>) — <decision>`
32
32
 
33
33
  ## Revision markers
34
34
 
35
- Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per operator (<username>) correction`. Existing revision lines are never rewritten.
35
+ Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per (<username>) correction`. Existing revision lines are never rewritten.
36
36
 
37
37
  ## Scope classes
38
38
 
@@ -55,7 +55,7 @@ Before posting any brief, run `node <path-to-this-skill>/scripts/brief-lint.mjs
55
55
 
56
56
  - A new issue starts at `needs-operator`, plus its scope label; add `risky` when it touches security, money, user data, or production. (Names come from dev.md's `labels:` knob.)
57
57
  - Approval is only the operator's explicit words, clearly tied to the issue. Labels, silence, or time never create approval.
58
- - Record it as one approval marker comment per conventions — `scope=brief`, or `scope=brief+plan` when the inline plan was posted with it — quoting the operator's words in the operator (username) format. That comment is what preflight verifies.
58
+ - Record it as one approval marker comment per conventions — `scope=brief`, or `scope=brief+plan` when the inline plan was posted with it — quoting the operator's words in the (username) format. That comment is what preflight verifies.
59
59
  - Then flip the state: `research` and `quick-build` → `ready`; `full-plan` → `needs-plan` (dev-plan takes it from there).
60
60
  - An issue with an unresolved Assumptions entry cannot leave `needs-operator` — resolve every entry (confirmed, corrected, or moved to a spike) first; the section is deleted once resolved.
61
61
  - A directional decision this work settles — one passing the Decisions test in dev.md — is proposed as one register line on the operator's yes; `dev-ship` records at merge.
@@ -25,14 +25,14 @@ Every workflow-generated issue comment opens with an invisible HTML marker follo
25
25
 
26
26
  ## Operator identity
27
27
 
28
- Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — is written `operator (<github-username>)`:
28
+ Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — names the operator by their GitHub username in parentheses, with no title before it — `(<github-username>)`:
29
29
 
30
- - Approval: `Approved by operator (<username>) on DD-MM-YYYY: "<their words>"`
31
- - Register line: `- DD-MM-YYYY operator (<username>) — <decision>`
30
+ - Approval: `Approved by (<username>) on DD-MM-YYYY: "<their words>"`
31
+ - Register line: `- DD-MM-YYYY (<username>) — <decision>`
32
32
 
33
33
  ## Revision markers
34
34
 
35
- Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per operator (<username>) correction`. Existing revision lines are never rewritten.
35
+ Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per (<username>) correction`. Existing revision lines are never rewritten.
36
36
 
37
37
  ## Scope classes
38
38
 
@@ -25,14 +25,14 @@ Every workflow-generated issue comment opens with an invisible HTML marker follo
25
25
 
26
26
  ## Operator identity
27
27
 
28
- Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — is written `operator (<github-username>)`:
28
+ Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — names the operator by their GitHub username in parentheses, with no title before it — `(<github-username>)`:
29
29
 
30
- - Approval: `Approved by operator (<username>) on DD-MM-YYYY: "<their words>"`
31
- - Register line: `- DD-MM-YYYY operator (<username>) — <decision>`
30
+ - Approval: `Approved by (<username>) on DD-MM-YYYY: "<their words>"`
31
+ - Register line: `- DD-MM-YYYY (<username>) — <decision>`
32
32
 
33
33
  ## Revision markers
34
34
 
35
- Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per operator (<username>) correction`. Existing revision lines are never rewritten.
35
+ Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per (<username>) correction`. Existing revision lines are never rewritten.
36
36
 
37
37
  ## Scope classes
38
38
 
@@ -10,7 +10,7 @@ Format, one entry per pattern:
10
10
  - **Pattern:** <what the reviewer keeps flagging, concretely — code shape, file area>
11
11
  - **Why it's safe here:** <the project fact that makes it a false positive>
12
12
  - **Still flag if:** <the exception that makes it a real finding after all>
13
- - **Origin:** <date + issue where the dismissal happened — operator (<username>)>
13
+ - **Origin:** <date + issue where the dismissal happened — (<username>)>
14
14
  ```
15
15
 
16
16
  The four fields are LIST ITEMS — this file is read in a repo's file view, where single newlines soft-wrap into one paragraph; bullets are what guarantee a line per field. Appended entries (dev-implement's corrections loop) keep the same shape.
@@ -25,14 +25,14 @@ Every workflow-generated issue comment opens with an invisible HTML marker follo
25
25
 
26
26
  ## Operator identity
27
27
 
28
- Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — is written `operator (<github-username>)`:
28
+ Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — names the operator by their GitHub username in parentheses, with no title before it — `(<github-username>)`:
29
29
 
30
- - Approval: `Approved by operator (<username>) on DD-MM-YYYY: "<their words>"`
31
- - Register line: `- DD-MM-YYYY operator (<username>) — <decision>`
30
+ - Approval: `Approved by (<username>) on DD-MM-YYYY: "<their words>"`
31
+ - Register line: `- DD-MM-YYYY (<username>) — <decision>`
32
32
 
33
33
  ## Revision markers
34
34
 
35
- Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per operator (<username>) correction`. Existing revision lines are never rewritten.
35
+ Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per (<username>) correction`. Existing revision lines are never rewritten.
36
36
 
37
37
  ## Scope classes
38
38
 
@@ -68,7 +68,7 @@ mobile: {{no | flutter (separate repo)}}
68
68
 
69
69
  Record a decision only when it is directional — it steers work beyond this issue: a real alternative was rejected; it constrains work not yet written; and no dev.md line, lint rule, or guard can enforce it instead (if one can, write the rule). Feature requests, one-off fixes, and routine implementation choices never qualify. Every entry needs the user's explicit yes. One line in the register (`decisions:` knob), append-only, no other metadata:
70
70
 
71
- - DD-MM-YYYY operator (github-username) — the decision
71
+ - DD-MM-YYYY (github-username) — the decision
72
72
 
73
73
  ## Stop and ask
74
74
 
@@ -25,14 +25,14 @@ Every workflow-generated issue comment opens with an invisible HTML marker follo
25
25
 
26
26
  ## Operator identity
27
27
 
28
- Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — is written `operator (<github-username>)`:
28
+ Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — names the operator by their GitHub username in parentheses, with no title before it — `(<github-username>)`:
29
29
 
30
- - Approval: `Approved by operator (<username>) on DD-MM-YYYY: "<their words>"`
31
- - Register line: `- DD-MM-YYYY operator (<username>) — <decision>`
30
+ - Approval: `Approved by (<username>) on DD-MM-YYYY: "<their words>"`
31
+ - Register line: `- DD-MM-YYYY (<username>) — <decision>`
32
32
 
33
33
  ## Revision markers
34
34
 
35
- Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per operator (<username>) correction`. Existing revision lines are never rewritten.
35
+ Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per (<username>) correction`. Existing revision lines are never rewritten.
36
36
 
37
37
  ## Scope classes
38
38
 
@@ -25,14 +25,14 @@ Every workflow-generated issue comment opens with an invisible HTML marker follo
25
25
 
26
26
  ## Operator identity
27
27
 
28
- Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — is written `operator (<github-username>)`:
28
+ Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — names the operator by their GitHub username in parentheses, with no title before it — `(<github-username>)`:
29
29
 
30
- - Approval: `Approved by operator (<username>) on DD-MM-YYYY: "<their words>"`
31
- - Register line: `- DD-MM-YYYY operator (<username>) — <decision>`
30
+ - Approval: `Approved by (<username>) on DD-MM-YYYY: "<their words>"`
31
+ - Register line: `- DD-MM-YYYY (<username>) — <decision>`
32
32
 
33
33
  ## Revision markers
34
34
 
35
- Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per operator (<username>) correction`. Existing revision lines are never rewritten.
35
+ Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per (<username>) correction`. Existing revision lines are never rewritten.
36
36
 
37
37
  ## Scope classes
38
38
 
@@ -25,14 +25,14 @@ Every workflow-generated issue comment opens with an invisible HTML marker follo
25
25
 
26
26
  ## Operator identity
27
27
 
28
- Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — is written `operator (<github-username>)`:
28
+ Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — names the operator by their GitHub username in parentheses, with no title before it — `(<github-username>)`:
29
29
 
30
- - Approval: `Approved by operator (<username>) on DD-MM-YYYY: "<their words>"`
31
- - Register line: `- DD-MM-YYYY operator (<username>) — <decision>`
30
+ - Approval: `Approved by (<username>) on DD-MM-YYYY: "<their words>"`
31
+ - Register line: `- DD-MM-YYYY (<username>) — <decision>`
32
32
 
33
33
  ## Revision markers
34
34
 
35
- Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per operator (<username>) correction`. Existing revision lines are never rewritten.
35
+ Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per (<username>) correction`. Existing revision lines are never rewritten.
36
36
 
37
37
  ## Scope classes
38
38
 
@@ -24,8 +24,8 @@ profile carries a schema version to validate against.
24
24
  ## Release flow (tag-driven)
25
25
 
26
26
  1. Every PR that changes released behavior lands with a changeset — a `.changeset/<slug>.md` written directly, since the `changeset` add prompt is interactive (`bunx changeset version` at release time is the only CLI use) — whose bump follows the table above and whose shape follows dev-implement's changelog rule.
27
- 2. Maintainer, at release time: `bunx changeset version` (applies changesets to `packages/cli/package.json` and the changelog), then `bun install` so any dependency changes riding along reach the lockfile, commit. That install does **not** update the workspace's own version inside `bun.lock`: measured on the bun the root `packageManager` line pins, the recorded version is left unchanged by a plain install, by `--force`, and even by `--lockfile-only`, so it sits at an older number indefinitely. `bun install --frozen-lockfile`, which CI and the release workflow both run, passes with it, and nothing in this repo reads it: `packages/cli/package.json` is the single release identity. Never hand-edit the lockfile to "correct" it. The release record is `packages/cli/CHANGELOG.md`, changesets-written — never by hand; the root `CHANGELOG.md` is the frozen pre-0.3.0 record pointing there.
28
- 3. Tag the release commit `v<version>`, push the tag.
27
+ 2. Maintainer, at release time: `bunx changeset version` (applies changesets to `packages/cli/package.json` and the changelog), then `bun install` so any dependency changes riding along reach the lockfile, commit on a `chore/release-<version>` branch and open its PR — main is branch-protected with no admin exemption, so the bump reaches main by merge and never by direct push. That install does **not** update the workspace's own version inside `bun.lock`: measured on the bun the root `packageManager` line pins, the recorded version is left unchanged by a plain install, by `--force`, and even by `--lockfile-only`, so it sits at an older number indefinitely. `bun install --frozen-lockfile`, which CI and the release workflow both run, passes with it, and nothing in this repo reads it: `packages/cli/package.json` is the single release identity. Never hand-edit the lockfile to "correct" it. The release record is `packages/cli/CHANGELOG.md`, changesets-written — never by hand; the root `CHANGELOG.md` is the frozen pre-0.3.0 record pointing there.
28
+ 3. Merge the release PR on the operator's word, pull main, then tag that merged commit `v<version>` and push the tag. Tags are not branch-protected, so the tag push is unaffected.
29
29
  4. The release workflow runs on the tag: `bun run check`, tag↔version guard, `npm publish` via trusted publishing (OIDC, token-free, provenance by default; idempotently skipped if already on the registry), SBOM, GitHub release. Never pass `--provenance` explicitly — it conflicts with trusted-publishing config.
30
30
 
31
31
  Contributors do not bump versions in PRs; releases are maintainer-driven.
@@ -34,7 +34,7 @@ Contributors do not bump versions in PRs; releases are maintainer-driven.
34
34
 
35
35
  `npm unpublish` is limited to 72 hours and breaks pinned consumers — it is not the rollback mechanism.
36
36
 
37
- 1. **Roll forward:** revert the offending commits on `main`, changeset, tag, release the previous known-good content as a **new patch version**.
37
+ 1. **Roll forward:** revert the offending commits through a PR onto `main` (protection applies to reverts too), changeset, tag, release the previous known-good content as a **new patch version**.
38
38
  2. **Deprecate the bad version:** `npm deprecate @vegastack/skills@<bad> "Broken — use <new>"`.
39
39
  3. Unpublish only if the bad version leaked secrets or is actively harmful, still within 72 hours, and always *in addition to* steps 1–2, never instead.
40
40
 
@@ -5,8 +5,10 @@ TODO: one-paragraph summary for humans and agents browsing the repo. The agent e
5
5
  ## Install
6
6
 
7
7
  ```sh
8
- npx @vegastack/skills add {{name}}{{groupInstallLine}}
8
+ npx @vegastack/skills add {{name}} --global
9
9
  ```
10
+ {{groupInstallBlock}}
11
+ `--global` installs into your home directory, where the skill is available in every project; drop it for a project-local install.
10
12
 
11
13
  ## What's in this skill
12
14
 
@@ -222,28 +222,37 @@ export async function scaffoldSkill({ name, dir, group = null, write = false, no
222
222
  // Every refusal belongs in this pre-flight. wireReadme runs after the tree is renamed into
223
223
  // place and the packaging entry written, so anything discovered there would leave a half-wired
224
224
  // skill on disk while reporting a refusal - or, worse, report success with no row at all.
225
- // When a README exists, its row target must be resolvable BEFORE the tree is staged, so a
226
- // refusal writes nothing. A wholly absent README or packaging.json keeps the documented
227
- // degrade-to-`skipped:` contract (skillify's README, and the bare-repo test) - tightening that
228
- // is a behaviour change of its own, tracked separately.
225
+ // Both wiring targets a scaffolded skill cannot do without must therefore be resolvable BEFORE
226
+ // the tree is staged: an absent one is a refusal, not a `skipped:` status, because a skill with
227
+ // no README row or no packaging entry is exactly the state structure.mjs check blocks. Only
228
+ // `.changeset/` still degrades to `skipped:` - a missing changeset breaks no check.
229
229
  const readmePath = join(repoRoot, 'README.md')
230
- if ((await entryAt(readmePath))?.isFile()) {
231
- const lines = (await readFile(readmePath, 'utf8')).split('\n')
232
- const rowTarget = findRowInsertion(lines, group, groupHeading)
233
- if (rowTarget?.missingSection) {
234
- throw new Error(`README.md has no "### ${groupHeading}" section for group "${group}" - create it with structure.mjs create-group`)
235
- }
236
- if (!rowTarget) {
237
- throw new Error(`README.md has no ${group ? `table under "### ${groupHeading}"` : 'ungrouped Skills table'} to add a row to - every skill needs its row, so refusing rather than scaffolding a skill the structure check would block`)
238
- }
230
+ if (!(await entryAt(readmePath))?.isFile()) {
231
+ throw new Error(`README.md not found at ${readmePath} - every skill needs its Skills-table row, so refusing rather than scaffolding a skill the structure check would block`)
232
+ }
233
+ const lines = (await readFile(readmePath, 'utf8')).split('\n')
234
+ const rowTarget = findRowInsertion(lines, group, groupHeading)
235
+ if (rowTarget?.missingSection) {
236
+ throw new Error(`README.md has no "### ${groupHeading}" section for group "${group}" - create it with structure.mjs create-group`)
237
+ }
238
+ if (!rowTarget) {
239
+ throw new Error(`README.md has no ${group ? `table under "### ${groupHeading}"` : 'ungrouped Skills table'} to add a row to - every skill needs its row, so refusing rather than scaffolding a skill the structure check would block`)
240
+ }
241
+
242
+ const packagingPath = join(repoRoot, 'packages/cli/packaging.json')
243
+ if (!(await entryAt(packagingPath))?.isFile()) {
244
+ throw new Error(`packages/cli/packaging.json not found at ${packagingPath} - every skill needs its packaging entry, so refusing rather than scaffolding a skill the structure check would block`)
239
245
  }
240
246
 
241
247
  // The generated test imports the repo validator by relative path, so its depth follows the
242
248
  // skill's: skills/<name>/tests/ is three levels up, skills/<group>/<name>/tests/ is four.
243
249
  const validatorPath = `${group ? '../../../..' : '../../..'}/packages/cli/scripts/validate-skill.mjs`
244
- // Only a grouped skill gets the family-install line; an ungrouped one would otherwise ship a
245
- // command naming a group that does not exist.
246
- const groupInstallLine = group ? `\nnpx @vegastack/skills add --group ${group} # or the whole ${group} family` : ''
250
+ // Only a grouped skill gets the family-install block; an ungrouped one would otherwise ship a
251
+ // command naming a group that does not exist. It is its own fence, not a second line in the
252
+ // first one: pasting a shared fence would run the alternative too.
253
+ const groupInstallBlock = group
254
+ ? `\nOr the whole ${group} family at once:\n\n\`\`\`sh\nnpx @vegastack/skills add --group ${group} --global\n\`\`\`\n`
255
+ : ''
247
256
 
248
257
  const outputs = templateFiles.map(([source, output]) => [source, output ?? `tests/${name}.test.ts`])
249
258
  const plan = { name, group, target, files: outputs.map(([, output]) => output), wrote: false }
@@ -258,7 +267,7 @@ export async function scaffoldSkill({ name, dir, group = null, write = false, no
258
267
  .replaceAll('{{name}}', name)
259
268
  .replaceAll('{{date}}', date)
260
269
  .replaceAll('{{validatorPath}}', validatorPath)
261
- .replaceAll('{{groupInstallLine}}', groupInstallLine)
270
+ .replaceAll('{{groupInstallBlock}}', groupInstallBlock)
262
271
  const destination = join(staging, output)
263
272
  await mkdir(dirname(destination), { recursive: true })
264
273
  await writeFile(destination, rendered)
@@ -8,7 +8,7 @@
8
8
  "SKILL.md": "74150dde2d3c83598769a4c9f8cd295a7496d9eb9a5e920a29cba8464eb58128",
9
9
  "agents/openai.yaml": "99023b056d5c568ff3acc059e5bb7a4e6cfa5261cd0d35a525407f9e159de562",
10
10
  "references/ai-agents.md": "565e5d480f7e342adf43f9b864ab4cb66b7e513f0ea676de66909fe0ccd95988",
11
- "references/conventions.md": "815f5189daff1b71b3251b7a57de183a4a387fcdedbd5875e673d5bd3de398fc",
11
+ "references/conventions.md": "95bf916cc11f95f3d5eefcb34db4fbc05d88ae1c8f08869800dfa417f8da17ed",
12
12
  "references/data.md": "781d3ae7d3bca0b269c123a10013226f3878503dd1224ee526edd102bfc270f0",
13
13
  "references/infra.md": "a6d07c5e9ea67788edac7b80742a5588a1f019e387163bfdab531314fb54d009",
14
14
  "references/mobile.md": "b6ee481df810f3fd5466487848287ceeb33ac98bf6db0bc2d65c4d6fa397284f",
@@ -25,9 +25,9 @@
25
25
  "group": "dev-skills",
26
26
  "repoOnly": false,
27
27
  "files": {
28
- "SKILL.md": "23c6266758726d6435de38cb0cc142a94a0b55f2329f7ab6404e42fa5d0dee3a",
28
+ "SKILL.md": "2bd58c19cdb5a55d7fefdfcd1748054aba403ff9d5161030e36a65f3b2e69b05",
29
29
  "agents/openai.yaml": "765b12e17b7fce88c53ca0fae735bf0efceb843cc3703b91bc1801ab5cac06b4",
30
- "references/conventions.md": "815f5189daff1b71b3251b7a57de183a4a387fcdedbd5875e673d5bd3de398fc",
30
+ "references/conventions.md": "95bf916cc11f95f3d5eefcb34db4fbc05d88ae1c8f08869800dfa417f8da17ed",
31
31
  "refresh/REFRESH.md": "760e66642eec426cd5ab2319613e817adf5bbd7b64c8eaa22dd13497351bf9c1",
32
32
  "refresh/sources.json": "a7ba2340964dc70410626087686145b5790a0e763a18ef2c4d9aa37e950f2e04"
33
33
  }
@@ -38,7 +38,7 @@
38
38
  "files": {
39
39
  "SKILL.md": "38ba9e67c00925f4e4738be333dc398218008df929fcf17b61398966ce4deee1",
40
40
  "agents/openai.yaml": "4aa52b5c620b0bf4de7f1609867956ce762d83dc4297ab5670a68c206ae63075",
41
- "references/conventions.md": "815f5189daff1b71b3251b7a57de183a4a387fcdedbd5875e673d5bd3de398fc",
41
+ "references/conventions.md": "95bf916cc11f95f3d5eefcb34db4fbc05d88ae1c8f08869800dfa417f8da17ed",
42
42
  "references/loop-ladder.md": "ddcb45ec2241bc5dc25936348074cdcc8f9af848e90b363351a7faf97007c256",
43
43
  "refresh/REFRESH.md": "70816e44c8d6a5d11b73eb40762e6d8931724517e0b4c138eb07bc8e91b45008",
44
44
  "refresh/sources.json": "a7ba2340964dc70410626087686145b5790a0e763a18ef2c4d9aa37e950f2e04"
@@ -50,7 +50,7 @@
50
50
  "files": {
51
51
  "SKILL.md": "f79f4d312f6c03ffdcf2e2fd44169e48520445900389e2d469c0946811be3801",
52
52
  "agents/openai.yaml": "1abab383deca54d32749fd9156f9a6211fe96e02e0166dc8a16ff8459ac31b74",
53
- "references/conventions.md": "815f5189daff1b71b3251b7a57de183a4a387fcdedbd5875e673d5bd3de398fc",
53
+ "references/conventions.md": "95bf916cc11f95f3d5eefcb34db4fbc05d88ae1c8f08869800dfa417f8da17ed",
54
54
  "references/ledger-and-resume.md": "5e3deae2af67735940564e04adcbc23c0c0dc86da2f6c80d68b8c1207c8f5900",
55
55
  "refresh/REFRESH.md": "7b854109d897b78b3055bf1ab89517afdca65c12eb65a4d009141e3ee11cf58f",
56
56
  "refresh/sources.json": "7bd883e5b3512e236a909ad6ff20c97f3555785867c31fd728256c7c2c514c74",
@@ -63,10 +63,10 @@
63
63
  "group": "dev-skills",
64
64
  "repoOnly": false,
65
65
  "files": {
66
- "SKILL.md": "4754383297822d3f6e0ad8a391ac76499d83c74f424b90b928199d6c2649dc71",
66
+ "SKILL.md": "08126d2c631051bf92d400dd678b8f75af1ee7905b1c389e030e4ca435f2c548",
67
67
  "agents/openai.yaml": "5473d2d3efffc518c07dfa8e6788c6535a5054ceca696119c5856ad265ef5581",
68
68
  "references/brief-template.md": "906c6b805f9737755f4d4b34fd16d4296924b95039379ea86bc59973949d9823",
69
- "references/conventions.md": "815f5189daff1b71b3251b7a57de183a4a387fcdedbd5875e673d5bd3de398fc",
69
+ "references/conventions.md": "95bf916cc11f95f3d5eefcb34db4fbc05d88ae1c8f08869800dfa417f8da17ed",
70
70
  "refresh/REFRESH.md": "bb5265cee98c243c775c3e5fbc59de4b84ab54e828f3290d7c19e47291d66f71",
71
71
  "refresh/sources.json": "7bd883e5b3512e236a909ad6ff20c97f3555785867c31fd728256c7c2c514c74",
72
72
  "scripts/brief-lint.mjs": "7202def7c3a8b0049e67d60602a4c652d3c99f5fa1711080fd46b94ff4dc3684"
@@ -78,7 +78,7 @@
78
78
  "files": {
79
79
  "SKILL.md": "eb2ce1542b1769fa6e7d9dc7be9fc9c84df8b353ded16e39e1e578ee372c1aca",
80
80
  "agents/openai.yaml": "4b9ccc9870b4eafb73c1bc4492a0b5a530097bbcbae11dbf3235160f4f05587b",
81
- "references/conventions.md": "815f5189daff1b71b3251b7a57de183a4a387fcdedbd5875e673d5bd3de398fc",
81
+ "references/conventions.md": "95bf916cc11f95f3d5eefcb34db4fbc05d88ae1c8f08869800dfa417f8da17ed",
82
82
  "references/plan-format.md": "a915acce2fc447e685077756aeb94fdc3f84139800703034987b8409971493db",
83
83
  "refresh/REFRESH.md": "e22830102db9cf7c6db1e8fea9e73b7845b77e59da0d44e186a6b26d6dc9ebe1",
84
84
  "refresh/sources.json": "a7ba2340964dc70410626087686145b5790a0e763a18ef2c4d9aa37e950f2e04",
@@ -91,8 +91,8 @@
91
91
  "files": {
92
92
  "SKILL.md": "561e0232d20fc7e6893b38a4c3d7deb41862d60d7b545a98d3ce7ba1d3c7ac06",
93
93
  "agents/openai.yaml": "3f35d3dc60f179d4ac2526997c4d10173ba3018d06f0dbe77e209ce2978fa702",
94
- "assets/review-known-patterns.md.template": "2fe7dbcc4d0eeac542e7624111130265b2bb4f08806f20dbd2087842cbb22b5c",
95
- "references/conventions.md": "815f5189daff1b71b3251b7a57de183a4a387fcdedbd5875e673d5bd3de398fc",
94
+ "assets/review-known-patterns.md.template": "7747b807ed18c4c8bf8acdc6481b2f7f27914d932d757c7243a32a41a18d32c5",
95
+ "references/conventions.md": "95bf916cc11f95f3d5eefcb34db4fbc05d88ae1c8f08869800dfa417f8da17ed",
96
96
  "references/cross-agent.md": "3541715d0563703373ea3d93582119b80356d1cbdee19ce17f958c0f7c914884",
97
97
  "references/dispatch-prompts.md": "cb8134a7b6ff9e20ec4db02d0af2f8767f71bf13fa9a21b28b7a586c2747ec1d",
98
98
  "references/security-axis.md": "e207071fc48f761f2deb24c73ef4f5ebcf28c130264dab7c3061ae6c0eee6543",
@@ -108,8 +108,8 @@
108
108
  "SKILL.md": "4b29049b8ce165fb03f554c8784e095cbe97cef16752b57b86321352a1017ce7",
109
109
  "agents/openai.yaml": "be790c04fdf910e71642cfadf1a7c07c217bf7fad18581610feb4c31a79651f2",
110
110
  "assets/agents-section.md.template": "6c9591d50f73e1e05e78c8969c7836767432cf32487af7205b2cb9f4a410440e",
111
- "assets/dev-profile.md.template": "b42b633b5e236bd8448648c2475978488afcac23c99342619a71670abbd7122c",
112
- "references/conventions.md": "815f5189daff1b71b3251b7a57de183a4a387fcdedbd5875e673d5bd3de398fc",
111
+ "assets/dev-profile.md.template": "26e244b488d181e23ff4b49addd9ab519c8f5d43e2d914638033648a7ca5bd3a",
112
+ "references/conventions.md": "95bf916cc11f95f3d5eefcb34db4fbc05d88ae1c8f08869800dfa417f8da17ed",
113
113
  "references/harness-facts.md": "2be1d81f6a616d40dc865aaeefaf53c61bc13ade4ba1de8fb406c520bf15be40",
114
114
  "references/stack-playbooks.md": "8f457c3d0f96e3c99d745b04332590fdf8af53a9694541181d9c878ae0718ea2",
115
115
  "refresh/REFRESH.md": "debda6ab96e899dd7e38309f714e9d65a3fbc53fd8ca68b8156f1348226c87b9",
@@ -122,7 +122,7 @@
122
122
  "files": {
123
123
  "SKILL.md": "aa3bd8b0a1ac076309190f2008896f24ebe1216352872ff428c1b88b55c06e65",
124
124
  "agents/openai.yaml": "8f18cfd505131557eb4c9f7b7f54e9069f787be4c162403fc30253eed49a06ea",
125
- "references/conventions.md": "815f5189daff1b71b3251b7a57de183a4a387fcdedbd5875e673d5bd3de398fc",
125
+ "references/conventions.md": "95bf916cc11f95f3d5eefcb34db4fbc05d88ae1c8f08869800dfa417f8da17ed",
126
126
  "references/runbook.md": "5cbf3f89b2fcad1a2873f729b6c1a027566344d5dffcb799ed1d039e76b3e679",
127
127
  "refresh/REFRESH.md": "06894b54fcbde12d3b5804523f20d5544ba1a18bb5e36960caa4f98454c6203e",
128
128
  "refresh/sources.json": "7bd883e5b3512e236a909ad6ff20c97f3555785867c31fd728256c7c2c514c74",
@@ -135,7 +135,7 @@
135
135
  "files": {
136
136
  "SKILL.md": "56415c2f69bb1a2fcb488b9846a20e632eb902b05c5b2b58ae9206d3eaffd77b",
137
137
  "agents/openai.yaml": "72435947f5afef0c8a2c170e987b14fe6057b174318c16b6b538ae8d129791fb",
138
- "references/conventions.md": "815f5189daff1b71b3251b7a57de183a4a387fcdedbd5875e673d5bd3de398fc",
138
+ "references/conventions.md": "95bf916cc11f95f3d5eefcb34db4fbc05d88ae1c8f08869800dfa417f8da17ed",
139
139
  "refresh/REFRESH.md": "52aee9bae64d8342e127704d1db282e43ed57c101148727bf10172d6cb975bfa",
140
140
  "refresh/sources.json": "a7ba2340964dc70410626087686145b5790a0e763a18ef2c4d9aa37e950f2e04",
141
141
  "scripts/status.mjs": "bc56d0b5d996676cfccb752d9d77d0e9e7d64932741cd39d6a503e9761fbe34d"
@@ -147,7 +147,7 @@
147
147
  "files": {
148
148
  "SKILL.md": "1733d2f1fa756cbb37c74ecee0d48ddd9abf31155c4dd72eba10af31c33d88ec",
149
149
  "agents/openai.yaml": "0b89d4e6416cf20b448f5322f3d7433cfde333d2b4a05b42ed53db3759701fb4",
150
- "references/release-ops.md": "b5df1922b34daf7751c332c019a0ea770a48283aaa2e25f83c9851bef47999b1",
150
+ "references/release-ops.md": "d213f66976e24942560d611582d27409f8ba4392886b4663d7dfbc7d395ef2ef",
151
151
  "references/standards.md": "b44122822a320a305728ee023ed8e3140bf87aaaef400a43d45b778e53ad2c02",
152
152
  "refresh/REFRESH.md": "d3ba44be2c264b849d8a815111c049e782720428d5d0c5cea23998b05e50d58f",
153
153
  "refresh/sources.json": "4977152381d53555196ac676f95e61b4eaa301309a17560da5cda722010eb80f"
@@ -159,7 +159,7 @@
159
159
  "files": {
160
160
  "SKILL.md": "310ac32ff4d557cc166a470fd1866060dfc5f03898e8ff3da9c406b84580742b",
161
161
  "agents/openai.yaml": "df320cf32a8db06c213f7892844dab810b7e96cfbf32502d25185d4a4167ef87",
162
- "assets/templates/README.md.template": "49dccb4e9b5bdb07c254f9142502b3fd11fd5b083d8661b0ae6a567dec79de74",
162
+ "assets/templates/README.md.template": "74750e59514bff2211b043f6584ed75271529ff4b304e82b207c282396d3e2a1",
163
163
  "assets/templates/REFRESH.md.template": "ff86afade565d668333e7f6d0432213760fd68a62b8ba22897a8601b74c94ac0",
164
164
  "assets/templates/SKILL.md.template": "b038775f97b13b54227fe41a767a48cdaa922a93d1732f22c2d1d79bff52ca00",
165
165
  "assets/templates/openai.yaml.template": "2fbf488369825109d6cad4f17e7b729a40d9e3c43c7f01bc5dfa16361d59c086",
@@ -170,7 +170,7 @@
170
170
  "references/eval-playbook.md": "1f463dfea8d69b7022712776794369892643aa020186fe3a3707c493a6c2d4e9",
171
171
  "refresh/REFRESH.md": "695f3283b27c14accf4095137898ce1f6dc40749483c5a5705e80aa9693f08c2",
172
172
  "refresh/sources.json": "e554e80c72c16dc70587361804db9e0cf2716c128820b2612d5983a009b2b242",
173
- "scripts/scaffold-skill.mjs": "8bc3314f800fcff0bf5f797fdd82424ceb16a45ac03c4ee0eebcc416dfc41b97"
173
+ "scripts/scaffold-skill.mjs": "d9edbe912ca20aad29afe1b0b904f85bbc4c9bfefb2c75e2986949ce00cb7fae"
174
174
  }
175
175
  }
176
176
  }