@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 +75 -0
- package/README.md +22 -3
- package/package.json +1 -1
- package/plugins/make-skill/.claude-plugin/plugin.json +1 -1
- package/plugins/make-skill/commands/make-skill.md +1 -1
- package/plugins/make-skill/skills/make-skill/SKILL.md +57 -10
- package/plugins/make-skill/skills/make-skill/references/distribution.md +32 -2
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
|
-
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
168
|
-
|
|
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
|
-
**
|
|
321
|
-
`ssheleg/task-pipeline` `.github/workflows/release.yml`). A
|
|
322
|
-
**off by default** and armed per repo
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
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
|
|
62
|
-
|
|
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
|