@ssheleg/make-skill 0.6.1 → 0.6.5

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,80 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.6.5 — 2026-07-30
4
+
5
+ ### Added
6
+ - **`claude plugin validate <path> --strict` is now canon** — the upstream gate,
7
+ wired into CI against both the plugin and the marketplace manifest. It needs
8
+ no auth or API key, so a runner can install `@anthropic-ai/claude-code` and run
9
+ it. The canon records the two failures it found across all six repos of this
10
+ family at once, because neither is visible to a house validator:
11
+ - **`argument-hint` must be quoted.** Bare `[a | b]` is a YAML flow sequence,
12
+ so it parses as a list — and one comma or stray character breaks the block
13
+ outright, at which point the command loads with empty metadata and no
14
+ description, silently.
15
+ - **`homepage` and `repository` are not top-level `marketplace.json` fields.**
16
+ They belong to a plugin entry. Unrecognized fields are warnings the runtime
17
+ tolerates, which is why they survive everything except `--strict`.
18
+
19
+ ### Fixed
20
+ - This repo's own command hint and marketplace manifest, per the above.
21
+
22
+ ## v0.6.4 — 2026-07-30
23
+
24
+ ### Changed
25
+ - **Publishing to npm is no longer taught as a permanent human step.** The canon
26
+ said 2FA makes non-interactive publishing impossible and to plan the manual
27
+ step; that is only true of an interactive publish and a classic token. Arming
28
+ CI publishing is now step 9 of the first publish, and the definition of done
29
+ gained a fifth fact: *the next tag publishes without a human*.
30
+ - **`references/distribution.md` §3** carries both auth routes — npm trusted
31
+ publishing (OIDC, no credential at all: npm >= 11.5.1, Node >= 22.14,
32
+ `id-token: write`, the workflow filename registered on npmjs.com) and a
33
+ granular automation token in `NPM_TOKEN` — and says to write the workflow so
34
+ both work, which makes adopting OIDC later a secret deletion rather than a CI
35
+ edit.
36
+ - Three properties the publish job needs, each of which is a red build if
37
+ missing: skip a version already on the registry (publishing over one is a hard
38
+ 403), a `workflow_dispatch` input naming an existing tag (a dispatch runs the
39
+ workflow file as of the ref it is dispatched on, so an old tag can never gain
40
+ a new job), and polling `npm view` afterwards, because published is a claim
41
+ until the registry serves it.
42
+ - The release-automation section is no longer marked *optional*, with the
43
+ measurement that argues it: six of this family's seven packages were behind
44
+ their own tags on 2026-07-30, one by three releases.
45
+
46
+ ## v0.6.3 — 2026-07-30
47
+
48
+ ### Added
49
+ - **Declare the licence in BOTH manifests — now part of the spec floor.** An
50
+ SPDX id belongs in the SKILL.md front matter *and* in the `marketplace.json`
51
+ plugin entry (a documented field there too). A `LICENSE` file in the repo root
52
+ reaches neither the plugin listing nor an installed skill. This gap was found
53
+ across all six repos of this family on the same day, and it stayed open
54
+ precisely because this checklist never asked for it: both fields are optional,
55
+ so nothing ever errored.
56
+
57
+ ### Changed
58
+ - `license: MIT` declared in this repo's own two manifests, which is where the
59
+ rule should have been demonstrated first.
60
+
61
+ ## v0.6.2 — 2026-07-30
62
+
63
+ A family member's release did not end where the skill said it ended. Publishing
64
+ to npm left the umbrella pin pointing at the previous version, so the launcher
65
+ kept advertising — and `update` kept installing — the release before it, with
66
+ nothing in either repo to reveal the gap.
67
+
68
+ ### Added
69
+ - **First-publish step 10** (`SKILL.md`): a skill that belongs to a family is
70
+ not released until the umbrella's `skills.json` pin moves and the umbrella is
71
+ released, verified with `npx --yes sshlg-skills@latest list`.
72
+ - **`references/distribution.md` §5** — the same rule with the incident that
73
+ produced it (`agent-sync` 1.3.4 on npm while `list` still said 1.3.3).
74
+
75
+ ### Changed
76
+ - README — family list and the three family commands; `CONTRIBUTING.md`.
77
+
3
78
  ## v0.6.1 — 2026-07-28
4
79
 
5
80
  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.5",
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.5",
5
5
  "author": {
6
6
  "name": "ssheleg"
7
7
  },
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Create, retrofit, audit, or publish an agent skill / Claude Code plugin the proven ssheleg way — Agent Skills spec conformance, marketplace layout, version sync, validator + CI, multi-channel distribution, MCP / A2A rules.
3
- argument-hint: <what to build/retrofit/audit, or a skill path>
3
+ argument-hint: "<what to build/retrofit/audit, or a skill path>"
4
4
  ---
5
5
  Use the `make-skill` skill for the task below. First **detect the workflow** from
6
6
  the task and any path in `$ARGUMENTS`, announce it, then follow the skill exactly:
@@ -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/".
@@ -126,6 +134,24 @@ top CHANGELOG entry — SAME semver, bumped together, validator enforces. If
126
134
  version an agent outside Claude Code ever sees), it joins the sync as a 5th
127
135
  point.
128
136
 
137
+ **`claude plugin validate <path> --strict` is the upstream gate — wire it into
138
+ CI, both manifests.** Your own validator enforces house rules; this one enforces
139
+ Claude Code's actual schema, and it catches a class your validator cannot see.
140
+ It needs no auth and no API key, so a GitHub runner can install
141
+ `@anthropic-ai/claude-code` and run it. Two failures it found across this whole
142
+ family at once:
143
+
144
+ - **Front matter that silently drops.** `argument-hint: [a | b]` is a YAML flow
145
+ sequence, not a string: it parses as a *list*, and one value containing a
146
+ comma or a stray character breaks the block outright — at which point the
147
+ command loads with **empty metadata and no description**, with nothing at
148
+ runtime saying so. **Always quote `argument-hint`**, single quotes when the
149
+ value itself contains double quotes.
150
+ - **`homepage` and `repository` at the top level of `marketplace.json` are not
151
+ fields.** They are valid on a *plugin entry*; at the root Claude Code ignores
152
+ them. Unrecognized fields are warnings the runtime tolerates, which is exactly
153
+ why they survive without `--strict`.
154
+
129
155
  **Validator** (adapt super-ux `test/validate.py`): manifests parse+fields;
130
156
  SKILL.md front-matter — **spec rules** (name charset/length, description ≤1024,
131
157
  `compatibility` ≤500, `metadata` all-string, `allowed-tools` a string, no unknown
@@ -141,7 +167,8 @@ is the tie-breaker on the standard; the house validator owns the repo rules.
141
167
  ### First publish — end-to-end, same session
142
168
 
143
169
  Take it ALL the way: GitHub + CI green + npm published + verified installs.
144
- No half-done handoffs — the ONLY human step is npm 2FA.
170
+ No half-done handoffs. The first publish needs a human for 2FA; **arming CI
171
+ publishing is part of shipping**, so the second one does not (see step 9).
145
172
 
146
173
  1. **Preflight before code:** `npm view <name>` (E404 = free);
147
174
  `gh auth status` (may lie — just try repo create later); `npm whoami`
@@ -164,8 +191,20 @@ No half-done handoffs — the ONLY human step is npm 2FA.
164
191
  8. **Install for the user:** `claude plugin marketplace add <owner>/<name>` +
165
192
  `claude plugin install <name>@<name>`; verify
166
193
  `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.
194
+ 9. **Arm CI publishing so this is the last manual publish.** Ship the release
195
+ workflow (above), then hand over exactly two commands — `gh secret set
196
+ NPM_TOKEN --repo <owner>/<name>` (a GRANULAR AUTOMATION token; the user
197
+ pastes it, never you) and `gh variable set PUBLISH_NPMJS --body true --repo
198
+ <owner>/<name>`. Secret first: arming the variable with no token queues a red
199
+ run on the next tag.
200
+ 10. Done = five verified facts: GitHub repo + CI green; npm resolvable via
201
+ npx; plugin installed; skills-CLI discovery works; the next tag publishes
202
+ without a human.
203
+ 11. **If it belongs to a family** (`sshlg-skills`): bump its `version` pin in
204
+ the umbrella's `skills.json`, release the umbrella, and verify with
205
+ `npx --yes sshlg-skills@latest list`. Until that lands the launcher
206
+ advertises the OLD version and `update` installs it — see
207
+ `references/distribution.md` §5.
169
208
 
170
209
  ## Retrofit (bring an existing skill/repo up to standard)
171
210
 
@@ -317,10 +356,18 @@ Non-negotiables for any such skill:
317
356
  7. Global `~/.claude/CLAUDE.md` — only for rules that must fire even without
318
357
  the skill installed.
319
358
 
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).
359
+ **Toggleable release automation — set it up, don't leave it optional**
360
+ (reference impl: `ssheleg/task-pipeline` `.github/workflows/release.yml`). A
361
+ `v*`-tag workflow, **off by default** and armed per repo by two variables so a
362
+ fork inherits nothing: `RELEASE_ENABLED` for the GitHub release,
363
+ `PUBLISH_NPMJS` for the registry. It validates the tag ↔ manifest version, cuts
364
+ the GitHub release from the matching CHANGELOG section, smoke-tests `npx
365
+ github:<owner>/<repo>#<tag>` from a clean cwd, then publishes to npm with
366
+ provenance. Auth per `references/distribution.md` §3 — OIDC or `NPM_TOKEN`,
367
+ written so both work. Turns steps 2/4/5 into CI; keep step 6 manual (it touches
368
+ this machine).
369
+
370
+ **A release nobody has to attend is the point.** Leaving publish manual is how a
371
+ registry ends up several versions behind its own tags with nothing anywhere
372
+ showing the gap — measured across this family on 2026-07-30: six of seven
373
+ 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