@ssheleg/make-skill 0.6.1 → 0.6.4

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/CHANGELOG.md CHANGED
@@ -1,5 +1,61 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.6.4 — 2026-07-30
4
+
5
+ ### Changed
6
+ - **Publishing to npm is no longer taught as a permanent human step.** The canon
7
+ said 2FA makes non-interactive publishing impossible and to plan the manual
8
+ step; that is only true of an interactive publish and a classic token. Arming
9
+ CI publishing is now step 9 of the first publish, and the definition of done
10
+ gained a fifth fact: *the next tag publishes without a human*.
11
+ - **`references/distribution.md` §3** carries both auth routes — npm trusted
12
+ publishing (OIDC, no credential at all: npm >= 11.5.1, Node >= 22.14,
13
+ `id-token: write`, the workflow filename registered on npmjs.com) and a
14
+ granular automation token in `NPM_TOKEN` — and says to write the workflow so
15
+ both work, which makes adopting OIDC later a secret deletion rather than a CI
16
+ edit.
17
+ - Three properties the publish job needs, each of which is a red build if
18
+ missing: skip a version already on the registry (publishing over one is a hard
19
+ 403), a `workflow_dispatch` input naming an existing tag (a dispatch runs the
20
+ workflow file as of the ref it is dispatched on, so an old tag can never gain
21
+ a new job), and polling `npm view` afterwards, because published is a claim
22
+ until the registry serves it.
23
+ - The release-automation section is no longer marked *optional*, with the
24
+ measurement that argues it: six of this family's seven packages were behind
25
+ their own tags on 2026-07-30, one by three releases.
26
+
27
+ ## v0.6.3 — 2026-07-30
28
+
29
+ ### Added
30
+ - **Declare the licence in BOTH manifests — now part of the spec floor.** An
31
+ SPDX id belongs in the SKILL.md front matter *and* in the `marketplace.json`
32
+ plugin entry (a documented field there too). A `LICENSE` file in the repo root
33
+ reaches neither the plugin listing nor an installed skill. This gap was found
34
+ across all six repos of this family on the same day, and it stayed open
35
+ precisely because this checklist never asked for it: both fields are optional,
36
+ so nothing ever errored.
37
+
38
+ ### Changed
39
+ - `license: MIT` declared in this repo's own two manifests, which is where the
40
+ rule should have been demonstrated first.
41
+
42
+ ## v0.6.2 — 2026-07-30
43
+
44
+ A family member's release did not end where the skill said it ended. Publishing
45
+ to npm left the umbrella pin pointing at the previous version, so the launcher
46
+ kept advertising — and `update` kept installing — the release before it, with
47
+ nothing in either repo to reveal the gap.
48
+
49
+ ### Added
50
+ - **First-publish step 10** (`SKILL.md`): a skill that belongs to a family is
51
+ not released until the umbrella's `skills.json` pin moves and the umbrella is
52
+ released, verified with `npx --yes sshlg-skills@latest list`.
53
+ - **`references/distribution.md` §5** — the same rule with the incident that
54
+ produced it (`agent-sync` 1.3.4 on npm while `list` still said 1.3.3).
55
+
56
+ ### Changed
57
+ - README — family list and the three family commands; `CONTRIBUTING.md`.
58
+
3
59
  ## v0.6.1 — 2026-07-28
4
60
 
5
61
  Open-source hygiene pass — the repo is public, so the files a first-time
package/README.md CHANGED
@@ -139,6 +139,19 @@ cd make-skill && ./install.sh # idempotent; --force to overwrite
139
139
 
140
140
  ### Updating
141
141
 
142
+ **The family updates as one package** — a bundle with one member current and the rest stale is a
143
+ combination nobody tested:
144
+
145
+ ```bash
146
+ npx sshlg-skills update # installed but behind — updates everything
147
+ npx sshlg-skills install # nothing installed yet
148
+ npx --yes sshlg-skills@latest list # what the current release of each member is
149
+ ```
150
+
151
+ Restart your agent afterwards: skills and hooks load at session start.
152
+
153
+ Per-channel, when you are updating this one member only:
154
+
142
155
  **One channel per agent.** A plugin plus a plain `~/.claude/skills` copy on the
143
156
  same Claude Code install shadow each other, and the stale one usually wins.
144
157
 
@@ -191,13 +204,19 @@ Built by ssheleg — [sshlg.me](https://sshlg.me)
191
204
  - Telegram — [@sshlg](https://t.me/sshlg)
192
205
 
193
206
  Part of the [ssheleg skill family](https://github.com/ssheleg/sshlg-skills):
194
- `super-ux`, `task-pipeline`, `make-skill`, `sheleg-design`, `seo-aeo-audit`.
195
- One command installs all five for every agent you use:
207
+ `super-ux`, `task-pipeline`, `agent-sync`, `make-skill`, `sheleg-design`, `seo-aeo-audit`.
208
+ **The family installs and updates as one package**, for every agent you use — a bundle with one
209
+ member current and the rest stale is a combination nobody tested:
196
210
 
197
211
  ```bash
198
- npx sshlg-skills install
212
+ npx sshlg-skills install # nothing installed yet — the whole family, any agent
213
+ npx sshlg-skills update # installed but behind — updates everything
214
+ npx --yes sshlg-skills@latest list # what the current release of each member is
199
215
  ```
200
216
 
217
+ Restart your agent afterwards: skills and hooks load at session start, so the session that
218
+ updates is not the session that gets the new ones.
219
+
201
220
  ## License
202
221
 
203
222
  MIT © 2026 ssheleg.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ssheleg/make-skill",
3
- "version": "0.6.1",
3
+ "version": "0.6.4",
4
4
  "description": "Create, retrofit, audit, and ship agent skills & Claude Code plugins the proven ssheleg way — conformance to the Agent Skills open standard (front-matter limits, progressive-disclosure budgets), marketplace repo layout, version sync, validator + CI, multi-channel distribution (plugin, vercel skills CLI, npx, Cursor), npm gotchas, and MCP / A2A rules for protocol-connected skills. This package is the installer CLI.",
5
5
  "keywords": [
6
6
  "skill",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "make-skill",
3
3
  "description": "Create, retrofit, audit, and ship agent skills & Claude Code plugins the proven ssheleg way: conformance to the Agent Skills open standard, marketplace repo layout, version sync, validator + CI, multi-channel distribution (plugin, vercel skills CLI, npx, Cursor), npm gotchas, end-to-end first publish, plus MCP / A2A references for protocol-connected skills.",
4
- "version": "0.6.1",
4
+ "version": "0.6.4",
5
5
  "author": {
6
6
  "name": "ssheleg"
7
7
  },
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: make-skill
3
3
  description: Use when creating, upgrading, auditing, or publishing agent skills and Claude Code plugins - "make a skill" / "сделай скилл", "new skill" / "новый скилл", "ssheleg skill" / "ssheleg скилл", "wrap it in a plugin" / "заверни в плагин", "publish a skill" / "опубликуй скилл", "retrofit a skill to the standard" / "приведи скилл к стандарту", "does this skill match the spec" / "соответствует ли скилл стандарту" - or when a skill must reach an MCP server or another agent over A2A. Encodes the Agent Skills open standard (front-matter limits, progressive-disclosure budgets) plus the proven ssheleg pipeline - marketplace layout, version sync, validator+CI, multi-agent distribution (Claude Code plugin, vercel skills CLI, npx, Cursor), npm gotchas, end-to-end first publish.
4
+ license: MIT
4
5
  ---
5
6
 
6
7
  # make-skill — Create, Retrofit, and Ship Skills the Proven Way
@@ -53,6 +54,13 @@ is non-negotiable; this canon only adds on top** (details + checklist:
53
54
  required MCP servers, runtimes, network here), `metadata` (string→string map;
54
55
  quote versions), `allowed-tools` (space-separated string, experimental).
55
56
  Nothing else belongs in front-matter.
57
+ - **`license` is optional but declare it anyway — in BOTH manifests.** An SPDX
58
+ id in the front matter AND in the `marketplace.json` plugin entry (a documented
59
+ field there too). A `LICENSE` file in the repo root is invisible to someone
60
+ reading the plugin listing or the installed skill: shipping code whose terms
61
+ are one repo-visit away is a gap, and it stays open because nothing errors.
62
+ Observed 2026-07-30 across all six repos in this family at once — every one had
63
+ the file, none declared it in either manifest.
56
64
  - Body **< 500 lines and < 5000 tokens**. Heavier material goes to `references/`,
57
65
  `scripts/`, `assets/` INSIDE the skill dir, one level deep, each with a stated
58
66
  load trigger ("read X when Y") — never a bare "see references/".
@@ -141,7 +149,8 @@ is the tie-breaker on the standard; the house validator owns the repo rules.
141
149
  ### First publish — end-to-end, same session
142
150
 
143
151
  Take it ALL the way: GitHub + CI green + npm published + verified installs.
144
- No half-done handoffs — the ONLY human step is npm 2FA.
152
+ No half-done handoffs. The first publish needs a human for 2FA; **arming CI
153
+ publishing is part of shipping**, so the second one does not (see step 9).
145
154
 
146
155
  1. **Preflight before code:** `npm view <name>` (E404 = free);
147
156
  `gh auth status` (may lie — just try repo create later); `npm whoami`
@@ -164,8 +173,20 @@ No half-done handoffs — the ONLY human step is npm 2FA.
164
173
  8. **Install for the user:** `claude plugin marketplace add <owner>/<name>` +
165
174
  `claude plugin install <name>@<name>`; verify
166
175
  `npx --yes skills add <owner>/<name> --list` finds the skills.
167
- 9. Done = four verified facts: GitHub repo + CI green; npm resolvable via
168
- npx; plugin installed; skills-CLI discovery works.
176
+ 9. **Arm CI publishing so this is the last manual publish.** Ship the release
177
+ workflow (above), then hand over exactly two commands — `gh secret set
178
+ NPM_TOKEN --repo <owner>/<name>` (a GRANULAR AUTOMATION token; the user
179
+ pastes it, never you) and `gh variable set PUBLISH_NPMJS --body true --repo
180
+ <owner>/<name>`. Secret first: arming the variable with no token queues a red
181
+ run on the next tag.
182
+ 10. Done = five verified facts: GitHub repo + CI green; npm resolvable via
183
+ npx; plugin installed; skills-CLI discovery works; the next tag publishes
184
+ without a human.
185
+ 11. **If it belongs to a family** (`sshlg-skills`): bump its `version` pin in
186
+ the umbrella's `skills.json`, release the umbrella, and verify with
187
+ `npx --yes sshlg-skills@latest list`. Until that lands the launcher
188
+ advertises the OLD version and `update` installs it — see
189
+ `references/distribution.md` §5.
169
190
 
170
191
  ## Retrofit (bring an existing skill/repo up to standard)
171
192
 
@@ -317,10 +338,18 @@ Non-negotiables for any such skill:
317
338
  7. Global `~/.claude/CLAUDE.md` — only for rules that must fire even without
318
339
  the skill installed.
319
340
 
320
- **Optional — toggleable release automation** (reference impl:
321
- `ssheleg/task-pipeline` `.github/workflows/release.yml`). A `v*`-tag workflow,
322
- **off by default** and armed per repo via a `RELEASE_ENABLED` repo variable
323
- (so forks decide for themselves), that validates the tag ↔ manifest version,
324
- cuts the GitHub release from the matching CHANGELOG section, and smoke-tests
325
- `npx github:<owner>/<repo>#<tag>` from a clean cwd. npm publish stays the human
326
- 2FA step. Turns steps 2/4 into CI; keep step 6 manual (it touches this machine).
341
+ **Toggleable release automation — set it up, don't leave it optional**
342
+ (reference impl: `ssheleg/task-pipeline` `.github/workflows/release.yml`). A
343
+ `v*`-tag workflow, **off by default** and armed per repo by two variables so a
344
+ fork inherits nothing: `RELEASE_ENABLED` for the GitHub release,
345
+ `PUBLISH_NPMJS` for the registry. It validates the tag ↔ manifest version, cuts
346
+ the GitHub release from the matching CHANGELOG section, smoke-tests `npx
347
+ github:<owner>/<repo>#<tag>` from a clean cwd, then publishes to npm with
348
+ provenance. Auth per `references/distribution.md` §3 — OIDC or `NPM_TOKEN`,
349
+ written so both work. Turns steps 2/4/5 into CI; keep step 6 manual (it touches
350
+ this machine).
351
+
352
+ **A release nobody has to attend is the point.** Leaving publish manual is how a
353
+ registry ends up several versions behind its own tags with nothing anywhere
354
+ showing the gap — measured across this family on 2026-07-30: six of seven
355
+ packages behind, one by three releases.
@@ -58,8 +58,30 @@ package's own repo, `npx` resolves the local package and reports a false
58
58
 
59
59
  ### npm gotchas — each one cost a debugging round
60
60
 
61
- - **npm 2FA:** publish throws EOTP; non-interactive is impossible without a
62
- granular automation token. Plan it as the one human step; verify after.
61
+ - **npm 2FA:** an interactive `npm publish` throws EOTP, and a *classic* token
62
+ does not get past it. Two ways out, both of which remove the human step for
63
+ good — set one up rather than planning a manual publish forever:
64
+ - **Trusted publishing (OIDC) — preferred, no credential exists to leak.**
65
+ npm CLI ≥ 11.5.1, Node ≥ 22.14, `permissions: id-token: write`, and the
66
+ package configured on npmjs.com with the exact workflow *filename* as its
67
+ trusted publisher. No `NODE_AUTH_TOKEN` at all.
68
+ - **Granular automation token** in `NPM_TOKEN`, passed as `NODE_AUTH_TOKEN`.
69
+ Works immediately with no npmjs.com setup, at the cost of a long-lived
70
+ credential to rotate.
71
+
72
+ Write the workflow so both work — always grant `id-token: write` and always
73
+ pass `NODE_AUTH_TOKEN` from the secret. Then adopting OIDC later is deleting a
74
+ secret, not editing CI. `id-token: write` is also what signs `--provenance`.
75
+
76
+ Three properties the job needs, each earned the hard way:
77
+ - **Skip a version already on the registry.** Publishing over one is a hard
78
+ 403, which turns every re-run into a red build.
79
+ - **A `workflow_dispatch` input naming an existing tag.** A dispatch runs the
80
+ workflow file *as of the ref it is dispatched on*, so a tag pushed before the
81
+ publish job existed can never gain one — the input lets the current workflow
82
+ run against an old tag.
83
+ - **Poll `npm view` after publishing.** The read replica lags the write master
84
+ by a minute or two; published is a claim until the registry serves it.
63
85
  - **Check the npm name FIRST, but don't trust E404:** `npm view <name>` → E404
64
86
  means free, yet npm's **name-similarity** policy only fires on PUT, so
65
87
  `npm publish` can still 403 "too similar to existing package <x>" (e.g.
@@ -104,6 +126,14 @@ above — `npx skills add` (non-Claude agents, repeated `--agent`), `claude plug
104
126
  truth; the validator keeps it in sync with `.gitmodules`. One command
105
127
  installs/updates the whole family everywhere.
106
128
 
129
+ **The umbrella pins each member's version, so a member release is not done until the pin moves.**
130
+ `sshlg-skills/skills.json` carries a `version` per member and `list` prints it. Publish a member
131
+ without bumping that pin and the launcher keeps advertising — and `update` keeps installing — the
132
+ previous release, with nothing in either repo to reveal the gap. Observed 2026-07-29: `agent-sync`
133
+ 1.3.4 was on npm and installed everywhere while `list` still said 1.3.3, so a project comparing its
134
+ install against `list` told every agent to update to what it already had. Bump the pin, release the
135
+ umbrella, then confirm with `npx --yes sshlg-skills@latest list`.
136
+
107
137
  ## Platforms
108
138
 
109
139
  The Node installer (`bin/*.js`, `os.homedir()`/`path.join`), `npx github:…`, the