@ssheleg/make-skill 0.8.1 → 0.9.1

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,78 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.9.1 — 2026-08-05
4
+
5
+ ### Fixed
6
+ - **The release checklist told agents to publish npm by hand.** Step 5 of the
7
+ recurring-release checklist in `distribution.md` said "npm publish if
8
+ applicable (human 2FA the first time)" — contradicting the launch checklist's
9
+ own step 9, which arms CI publishing precisely so that is the *last* manual
10
+ publish. A `v*` tag now publishes; manual publish is named as the fallback
11
+ for a repo that has not armed CI yet.
12
+ - `CONTRIBUTING.md` carried the same stale instruction for the family
13
+ catalogue, and now points at `test/check_pins.py`, the registry comparison
14
+ `sshlg-skills` gained in v0.20.0.
15
+
16
+ ## v0.9.0 — 2026-08-03
17
+
18
+ The canon knew the Claude Code capability set and used none of it. This release
19
+ uses it — and turns the missing half into a rule: **every host capability is an
20
+ accelerator with a written fallback**, because hooks, subagents and `/commands`
21
+ exist only inside Claude Code, which is a minority of where skills run.
22
+
23
+ ### Added
24
+ - **`references/host-capabilities.md`** — hooks (events, handler types, matchers,
25
+ `if` rules, exit-code semantics, structured output, plugin-scoped MCP matchers),
26
+ subagents, commands, scripts, MCP and sibling-skill dependencies: what each
27
+ buys, what it costs in always-on tokens, and when it earns its place. Verified
28
+ against the hooks reference and against a working plugin, not from memory.
29
+ - **The degradation contract**, in `SKILL.md` and enforced by the validator.
30
+ Three axes, each written in the body where the agent will read it: not Claude
31
+ Code (no hooks/subagents/commands — name the inline procedure), recommended
32
+ plugin absent (say what is degraded, continue), tool or MCP server absent
33
+ (state it once, fall back, never retry in a loop). *A fallback you know but did
34
+ not write is not a fallback.*
35
+ - **`scripts/audit_skill.py`** — a stdlib auditor for ANY skill directory: name
36
+ charset/length/reserved words/XML tags/directory match, description limits and
37
+ third person, frontmatter keys, body budgets, bundled-file reachability and
38
+ nesting, tables of contents past 100 lines, link escapes, Windows paths,
39
+ time-branching prose, bare directory pointers. `--house` adds the ssheleg
40
+ rules. It finds all nine planted defects in the evaluation fixture and passes
41
+ clean on this skill; CI asserts both.
42
+ - **A `PostToolUse` hook** that audits a `SKILL.md` the moment it is written, and
43
+ is otherwise invisible: it exits 0 with no output for any other path, for a
44
+ missing `python3`, for a missing script. It advises via `systemMessage` and
45
+ never blocks — `PostToolUse` fires after the write, so a veto costs a turn and
46
+ buys nothing.
47
+ - **`commands/skill-audit.md`** (deliberately not named after the skill) and
48
+ **`agents/skill-auditor.md`** — a subagent for auditing a repo full of skills
49
+ without crowding the main thread, including the coexistence check that is
50
+ invisible per-skill.
51
+ - **Six skeletons in `assets/`**, now *inside* the skill directory so they travel
52
+ on every channel: SKILL, plugin manifest, marketplace manifest, and new hooks,
53
+ agent and command templates, each carrying its degradation clause.
54
+ - **`SKILL-CARD.md`** — the enterprise registry entry plus an honest pass over
55
+ the risk table, including the hook that runs automatically. **`test/evals/RESULTS.md`**
56
+ states plainly that the suite has never been executed against a model.
57
+ - Frontmatter `compatibility` (what this skill needs and where it does not work)
58
+ and `metadata.version`, which is the only version an agent outside Claude Code
59
+ can see — now the fifth point of the version-sync rule.
60
+
61
+ ### Fixed
62
+ - **The skeletons reached no agent.** `templates/` sat at the repo root, outside
63
+ the plugin directory and outside the skill directory, so neither the Claude
64
+ Code plugin nor the skills CLI ever shipped them. They are `assets/` now, and
65
+ the validator fails if a root `templates/` reappears.
66
+ - The auditor's own first run flagged a false positive on this skill's
67
+ anti-pattern gotcha ("Before August, use the old API" — quoted as an example).
68
+ Quoted and backticked spans are now excluded: a linter that flags the document
69
+ warning about the thing it detects earns the habit of being ignored.
70
+ - New validator rules, each with a negative self-test: hook commands must resolve
71
+ through a quoted `${CLAUDE_PLUGIN_ROOT}` and carry a timeout, hook scripts must
72
+ exist with a shebang and the executable bit, plugin agents must not carry
73
+ `hooks`/`mcpServers`/`permissionMode`, shipped scripts must compile, and the
74
+ degradation section must be present.
75
+
3
76
  ## v0.8.1 — 2026-08-03
4
77
 
5
78
  A file-by-file re-read of everything 0.8.0 touched, and of everything it didn't.
package/README.md CHANGED
@@ -34,9 +34,16 @@ make a skill that turns our incident runbooks into a triage workflow
34
34
  /make-skill:make-skill audit ./skills/my-skill against the spec
35
35
  ```
36
36
 
37
- With no argument it detects the situation — a `SKILL.md` or `.claude-plugin/` in
38
- the current directory means it runs the audit rather than asking you what you
39
- meant. The command is `/make-skill:make-skill` when installed as a plugin and
37
+ …or run just the mechanical half against any skill directory, no agent turn
38
+ required:
39
+
40
+ ```bash
41
+ python3 ~/.claude/plugins/*/make-skill/*/skills/make-skill/scripts/audit_skill.py ./my-skill --house
42
+ ```
43
+
44
+ With no argument the skill detects the situation — a `SKILL.md` or
45
+ `.claude-plugin/` in the current directory means it runs the audit rather than
46
+ asking you what you meant. The command is `/make-skill:make-skill` when installed as a plugin and
40
47
  `/make-skill` when it sits in a skills directory; both reach the same skill, and
41
48
  asking in plain language works either way.
42
49
 
@@ -77,6 +84,17 @@ both manifests, in CI as its own job. That check is what caught this repo's own
77
84
  `marketplace.json` shipping `homepage` and `repository` at a level where Claude
78
85
  Code ignores them.
79
86
 
87
+ **The Claude Code power set — with a fallback for everywhere else.** The skill
88
+ ships what it teaches: a `PostToolUse` **hook** that audits a `SKILL.md` the
89
+ moment you save one (and exits silently for every other write, in every other
90
+ project), a **subagent** for auditing a repo full of skills without crowding the
91
+ main thread, a `/skill-audit` **command**, and a stdlib **script** that does the
92
+ mechanical half of an audit deterministically. Hooks, subagents and commands
93
+ exist only inside Claude Code — so the canon makes the fallback a rule: **every
94
+ host capability is an accelerator with a written fallback**, for three named
95
+ cases (not Claude Code, recommended plugin absent, tool or MCP server absent).
96
+ A fallback you know but did not write is not a fallback.
97
+
80
98
  **Evaluations, not vibes.** The canon requires every skill to carry at least
81
99
  three behavioral scenarios and a trigger set whose negatives are *near-misses* —
82
100
  queries that share the keywords and need something else. make-skill ships its
@@ -125,16 +143,19 @@ agent opens only when the situation calls for them:
125
143
  | `authoring.md` | the craft — naming, third-person descriptions, degrees of freedom, workflows and feedback loops, script rules, evaluation-driven development |
126
144
  | `surfaces.md` | Claude Code vs the Claude API vs claude.ai — the Skills API (upload, versions, 8 per request), and the no-network / no-package-install limits that break scripts moved between surfaces |
127
145
  | `enterprise.md` | installing a skill you didn't write, and running a fleet — risk tiers, the review checklist, the five approval gates, lifecycle, recall limits, rollback |
128
- | `retrofit.md` | the audit procedure — the 13-item checklist, what counts as evidence for a PASS, and the short form for a personal skill |
146
+ | `retrofit.md` | the audit procedure — the 14-item checklist, what counts as evidence for a PASS, and the short form for a personal skill |
147
+ | `host-capabilities.md` | hooks, subagents, commands, scripts and MCP dependencies — what each buys, what it costs in always-on tokens, hook events and exit-code semantics, and the degradation clauses that keep a skill working where none of them exist |
129
148
  | `claude-code-plugin.md` | the [Claude Code layer](https://code.claude.com/docs/en/plugins-reference) — `plugin.json` / `marketplace.json` schemas, plugin sources, component locations, host-only front-matter, path variables, cache and symlink rules, the `claude plugin` CLI |
130
149
  | `distribution.md` | the repo layout, every install channel, exact CLI flags, npm publishing traps, the release checklist |
131
150
  | `mcp.md` | [MCP](https://modelcontextprotocol.io) — skill vs server, primitives and methods, transports, consent and untrusted-output rules |
132
151
  | `a2a.md` | [A2A](https://a2a-protocol.org) — Agent Cards, task lifecycle, method mapping, v0.x→1.0 wire drift |
133
152
 
134
- Plus three skeletons in `templates/`: `SKILL.template.md` with the spec limits
135
- written into it, and `plugin.template.json` / `marketplace.template.json`, which
136
- carry only fields Claude Code recognizes so a seeded repo passes
137
- `claude plugin validate --strict` on day one.
153
+ Plus six skeletons in `skills/make-skill/assets/` — inside the skill directory,
154
+ so they reach every channel: `SKILL.template.md` with both rulebooks' limits
155
+ written into it, `plugin.template.json` / `marketplace.template.json` carrying
156
+ only fields Claude Code recognizes (a seeded repo passes `claude plugin validate
157
+ --strict` on day one), and `hooks.template.json` / `agent.template.md` /
158
+ `command.template.md`, each with its degradation clause already in place.
138
159
 
139
160
  ## Install
140
161
 
@@ -201,9 +222,14 @@ copy on every global update, even when Claude Code was never named.
201
222
 
202
223
  ### Requirements
203
224
 
204
- Node ≥ 16 for the `npx` installer; Python 3 only if you run the validator;
205
- `bash` for `install.sh` (Windows users: use `npx`, the plugin, or the skills CLI).
206
- The skill itself is plain Markdown and needs nothing.
225
+ Node ≥ 16 for the `npx` installer; **Python 3 for the bundled auditor and the
226
+ validator** (without it the skill falls back to the same checks by hand, and
227
+ says so); `bash` for `install.sh` and the hook (Windows users: use `npx`, the
228
+ plugin, or the skills CLI). The canon itself is plain Markdown and needs nothing.
229
+
230
+ What runs on its own: one `PostToolUse` hook, which exits silently unless the
231
+ file you just wrote is a `SKILL.md`. It is 30 lines and is described in
232
+ [SECURITY.md](SECURITY.md) and [SKILL-CARD.md](SKILL-CARD.md).
207
233
 
208
234
  ## Repo layout
209
235
 
@@ -211,16 +237,20 @@ The skill itself is plain Markdown and needs nothing.
211
237
  .claude-plugin/marketplace.json
212
238
  plugins/make-skill/
213
239
  ├── .claude-plugin/plugin.json
214
- └── skills/make-skill/ # the skill IS /make-skill — no command file
215
- ├── SKILL.md # the canon, < 500 lines by rule
216
- └── references/*.md # loaded on demand
240
+ ├── skills/make-skill/ # everything here travels to every agent
241
+ │ ├── SKILL.md # the canon, < 500 lines and < 5000 tokens by rule
242
+ │ ├── references/*.md # loaded on demand
243
+ │ ├── scripts/audit_skill.py # audits any skill dir, stdlib only
244
+ │ └── assets/*.template.* # six skeletons: skill, manifests, hooks, agent, command
245
+ ├── hooks/ # Claude Code only — PostToolUse SKILL.md audit
246
+ ├── agents/skill-auditor.md # Claude Code only
247
+ └── commands/skill-audit.md # Claude Code only, never named after a skill
217
248
  cursor/rules/make-skill.mdc # self-contained Cursor rule
218
- templates/ # SKILL.template.md + the two manifest skeletons
219
249
  bin/make-skill.js + package.json # zero-dep npx installer
220
250
  test/validate.py # structural validator
221
251
  test/evals/ # trigger set + behavioral scenarios (data)
222
252
  .github/workflows/{validate,release}.yml
223
- install.sh README.md CHANGELOG.md CONTRIBUTING.md SECURITY.md LICENSE
253
+ install.sh README.md CHANGELOG.md CONTRIBUTING.md SECURITY.md SKILL-CARD.md LICENSE
224
254
  docs/superpowers/{specs,plans}/ # historical design records
225
255
  ```
226
256
 
package/SECURITY.md CHANGED
@@ -13,9 +13,21 @@ unless you'd prefer otherwise.
13
13
 
14
14
  ## What this project touches
15
15
 
16
- `make-skill` ships Markdown plus two small installers. Knowing exactly what runs
17
- where is most of the threat model:
18
-
16
+ `make-skill` ships Markdown, two small installers, one auditor script and one
17
+ hook. Knowing exactly what runs where is most of the threat model — and the hook
18
+ is the only thing that runs without you asking:
19
+
20
+ - **`plugins/make-skill/hooks/skill-md-audit.sh`** runs on every `Write`,
21
+ `Edit` and `MultiEdit` **in every project** once the plugin is enabled. It
22
+ reads the hook's stdin JSON and **exits 0 immediately, printing nothing,
23
+ unless the written path ends in `SKILL.md`** — so in a project that does not
24
+ author skills it is a no-op you never see. When it is a `SKILL.md`, it runs
25
+ the bundled auditor on that directory and returns the report as advice
26
+ (`systemMessage`). It never blocks, never writes a file, never makes a network
27
+ call, and needs no `jq`. Thirty lines; read them before enabling the plugin.
28
+ - **`skills/make-skill/scripts/audit_skill.py`** reads a skill directory and
29
+ prints a report. Standard library only. It writes nothing and is run by you,
30
+ the `/skill-audit` command, the subagent, or the hook above.
19
31
  - **`bin/make-skill.js`** (run via `npx`) and **`install.sh`** copy the skill
20
32
  directory into `~/.claude/skills/make-skill` and nothing else — no command file,
21
33
  no other path in `$HOME` — and overwrite only with `--force`. Both are
@@ -114,6 +114,30 @@ checker, not a house opinion:
114
114
  `${CLAUDE_PLUGIN_DATA}` — both Claude-Code-only, so keep relative paths as the
115
115
  portable contract.
116
116
 
117
+ ## Host capabilities and the degradation contract
118
+
119
+ Hooks, subagents, `/commands`, `${CLAUDE_PLUGIN_ROOT}` and MCP servers exist only
120
+ inside Claude Code — which is a minority of where skills run. **Each is an
121
+ accelerator with a WRITTEN fallback; the skill still finishes its job without
122
+ it.** Put all three cases in the body, in the words the agent reads when it hits
123
+ them:
124
+
125
+ - **Not Claude Code** (Cursor, Codex, skills CLI, API): no hooks, no subagents,
126
+ no `/command`. Name the inline procedure. Bundled `scripts/` still travel —
127
+ they live inside the skill dir — so give the path per channel.
128
+ - **Recommended plugin/skill absent**: say once what is degraded, then continue
129
+ on the manual path. A stage that refuses to start because an optional
130
+ companion is missing is broken, not strict.
131
+ - **Tool, interpreter or MCP server absent**: state it once, fall back to the
132
+ by-hand procedure, never retry in a loop; interactive auth is a human step.
133
+
134
+ If you do ship them: `hooks/hooks.json` at the plugin root, commands resolved
135
+ through a quoted `"${CLAUDE_PLUGIN_ROOT}/…"` with a `timeout`; hook scripts exit
136
+ 0 silently when the event is not theirs and when the interpreter is missing;
137
+ `PreToolUse` blocks (exit 2 sends stderr to the model), `PostToolUse` advises via
138
+ `systemMessage`; plugin agents may not carry `hooks`, `mcpServers` or
139
+ `permissionMode`; a command is never named after a skill in the same plugin.
140
+
117
141
  ## Hard rules
118
142
 
119
143
  - **Version sync:** marketplace.json, plugin.json, package.json (if npm), and the
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ssheleg/make-skill",
3
- "version": "0.8.1",
4
- "description": "Create, retrofit, audit, and ship agent skills & Claude Code plugins the proven ssheleg way — conformance to the Agent Skills open standard AND Anthropic's platform rules (front-matter limits, disclosure budgets, per-surface runtime limits, the Skills API, evals) plus the Claude Code plugin reference (manifest schemas, component layout, claude plugin validate --strict), marketplace repo layout, version sync, validator + CI, multi-channel distribution (plugin, vercel skills CLI, npx, Cursor), npm gotchas, the review checklist for third-party skills, and MCP / A2A rules for protocol-connected skills. This package is the installer CLI.",
3
+ "version": "0.9.1",
4
+ "description": "Create, retrofit, audit, and ship agent skills & Claude Code plugins the proven ssheleg way \u2014 conformance to the Agent Skills open standard AND Anthropic's platform rules (front-matter limits, disclosure budgets, per-surface runtime limits, the Skills API, evals) plus the Claude Code plugin reference (manifest schemas, component layout, claude plugin validate --strict), marketplace repo layout, version sync, validator + CI, multi-channel distribution (plugin, vercel skills CLI, npx, Cursor), npm gotchas, the review checklist for third-party skills, and MCP / A2A rules for protocol-connected skills. This package is the installer CLI.",
5
5
  "keywords": [
6
6
  "skill",
7
7
  "plugin",
@@ -33,7 +33,6 @@
33
33
  "bin",
34
34
  "plugins",
35
35
  "cursor",
36
- "templates",
37
36
  "README.md",
38
37
  "LICENSE",
39
38
  "CHANGELOG.md",
@@ -3,7 +3,7 @@
3
3
  "name": "make-skill",
4
4
  "displayName": "Make Skill",
5
5
  "description": "Create, retrofit, audit, and ship agent skills & Claude Code plugins the proven ssheleg way: conformance to the Agent Skills open standard, Anthropic's platform rules (surfaces, Skills API, evals) and the Claude Code plugin reference, marketplace repo layout, version sync, validator + CI, multi-channel distribution (plugin, vercel skills CLI, npx, Cursor), npm gotchas, end-to-end first publish, the review checklist for third-party skills, plus MCP / A2A references for protocol-connected skills.",
6
- "version": "0.8.1",
6
+ "version": "0.9.1",
7
7
  "author": {
8
8
  "name": "ssheleg",
9
9
  "url": "https://x.com/sshlg93"
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: skill-auditor
3
+ description: Audits one or many skill directories against the Agent Skills standard, Anthropic's platform rules and the ssheleg canon, returning a gap table with file:line evidence. Use when a repository holds several skills, or when the audit output would otherwise crowd out the work the main thread is doing.
4
+ tools: Read, Grep, Glob, Bash
5
+ ---
6
+
7
+ You audit skills. You do not fix them, and you do not offer to.
8
+
9
+ ## Procedure
10
+
11
+ 1. Locate every skill: a directory containing `SKILL.md`. In a plugin repo that
12
+ is `plugins/*/skills/*/`; elsewhere it may be `~/.claude/skills/*/`,
13
+ `.claude/skills/*/`, or a single directory handed to you.
14
+
15
+ 2. For each one, run the bundled auditor first — it is deterministic and costs
16
+ no reasoning:
17
+
18
+ ```bash
19
+ python3 "${CLAUDE_PLUGIN_ROOT}/skills/make-skill/scripts/audit_skill.py" <skill-dir> --house
20
+ ```
21
+
22
+ If `${CLAUDE_PLUGIN_ROOT}` is unset, find the script under the make-skill
23
+ directory you were loaded from. If `python3` is missing, say so once and fall
24
+ back to reading `references/agent-skills-spec.md` and checking by hand — a
25
+ missing interpreter changes how you work, not whether you report.
26
+
27
+ 3. Work the judgement half from
28
+ `${CLAUDE_PLUGIN_ROOT}/skills/make-skill/references/retrofit.md`: one job per
29
+ skill, entry point, evaluations, distribution live-checks, repo meta. Read
30
+ the file; do not reconstruct it from memory.
31
+
32
+ 4. Where several skills coexist, check what the script cannot: do two
33
+ descriptions compete for the same trigger phrases? That is the failure mode
34
+ that degrades a whole family, and it is invisible per-skill.
35
+
36
+ ## Output
37
+
38
+ One table for the caller, nothing else:
39
+
40
+ | Skill | Verdict | Evidence |
41
+ |---|---|---|
42
+
43
+ `PASS` only for a check you actually ran — a `file:line` or the command output.
44
+ `GAP` carries what is wrong and the fix that closes it. No "looks fine". Finish
45
+ with the single highest-value next action across everything you audited, and
46
+ stop.
@@ -0,0 +1,31 @@
1
+ ---
2
+ description: "Audit a skill directory against the Agent Skills standard and Anthropic's platform rules — mechanical checks by script, judgement by the retrofit checklist"
3
+ argument-hint: "[path to a skill dir] [--house]"
4
+ ---
5
+
6
+ Audit the skill at `$ARGUMENTS` (default: the skill directory in the current
7
+ working directory, or every `skills/*/` under `plugins/*/` if this is a plugin
8
+ repo).
9
+
10
+ 1. Run the bundled auditor — it does the mechanical half deterministically:
11
+
12
+ ```bash
13
+ python3 "${CLAUDE_PLUGIN_ROOT}/skills/make-skill/scripts/audit_skill.py" <skill-dir> --house
14
+ ```
15
+
16
+ No `${CLAUDE_PLUGIN_ROOT}` (not running as a Claude Code plugin)? The script
17
+ sits at `scripts/audit_skill.py` inside the skill directory you are reading
18
+ this from — commonly `~/.agents/skills/make-skill/` or
19
+ `~/.claude/skills/make-skill/`. No `python3` at all? Do the same checks by
20
+ hand from `references/agent-skills-spec.md`; the checklist is the same one the
21
+ script implements.
22
+
23
+ 2. Then work the judgement half from
24
+ `${CLAUDE_PLUGIN_ROOT}/skills/make-skill/references/retrofit.md` — one job,
25
+ entry point, evaluations, distribution, repo meta. The script cannot answer
26
+ those.
27
+
28
+ 3. Report one gap table: `PASS` / `GAP` per item, each with `file:line` or the
29
+ command output that proves it. End with exactly ONE suggested next action.
30
+
31
+ Do not fix anything until the table is reported.
@@ -0,0 +1,19 @@
1
+ {
2
+ "description": "make-skill — spec check on every SKILL.md write. The hook exits 0 without output for any path that is not a SKILL.md, so installing this plugin globally changes nothing in projects that do not author skills. It never blocks: PostToolUse runs after the write, and the result is advice, not a veto.",
3
+ "hooks": {
4
+ "PostToolUse": [
5
+ {
6
+ "matcher": "Write|Edit|MultiEdit",
7
+ "hooks": [
8
+ {
9
+ "type": "command",
10
+ "shell": "bash",
11
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/hooks/skill-md-audit.sh\"",
12
+ "timeout": 20,
13
+ "statusMessage": "Auditing SKILL.md against the spec"
14
+ }
15
+ ]
16
+ }
17
+ ]
18
+ }
19
+ }
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env bash
2
+ # PostToolUse: after a SKILL.md is written or edited, audit its directory against
3
+ # the Agent Skills standard and hand the result back as a system message.
4
+ #
5
+ # Contract, in this order:
6
+ # 1. Not a SKILL.md write? exit 0 immediately, print nothing. A globally
7
+ # installed plugin must be invisible in projects
8
+ # that do not author skills.
9
+ # 2. No python3 on PATH? exit 0 with no message. The audit is an
10
+ # accelerator; its absence must not surface as a
11
+ # hook error on someone else's machine.
12
+ # 3. Skill has gaps? exit 0 with a systemMessage naming them. Never
13
+ # exit 2: PostToolUse fires after the write, so
14
+ # blocking buys nothing and costs a turn.
15
+ #
16
+ # Everything this reads comes from the hook's stdin JSON; nothing is written.
17
+ set -uo pipefail
18
+
19
+ payload="$(cat)"
20
+
21
+ # Extract the written path without assuming jq exists (it usually does not).
22
+ file_path="$(printf '%s' "$payload" |
23
+ sed -n 's/.*"file_path"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1)"
24
+
25
+ case "$file_path" in
26
+ */SKILL.md|SKILL.md) ;;
27
+ *) exit 0 ;;
28
+ esac
29
+
30
+ [ -f "$file_path" ] || exit 0
31
+ command -v python3 >/dev/null 2>&1 || exit 0
32
+
33
+ skill_dir="$(dirname "$file_path")"
34
+ auditor="${CLAUDE_PLUGIN_ROOT:-}/skills/make-skill/scripts/audit_skill.py"
35
+ [ -f "$auditor" ] || exit 0
36
+
37
+ report="$(python3 "$auditor" "$skill_dir" --quiet 2>/dev/null)" && exit 0
38
+
39
+ # Non-zero from the auditor means GAPs were found. Escape the report for JSON
40
+ # with the tools every POSIX box has, then hand it back as advice.
41
+ escaped="$(printf '%s' "$report" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read()))')"
42
+ printf '{"systemMessage": %s, "suppressOutput": true}\n' "$escaped"
43
+ exit 0
@@ -2,6 +2,11 @@
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" / "новый скилл", "wrap it in a plugin" / "заверни в плагин", "publish a skill" / "опубликуй скилл", "retrofit a skill to the standard" / "приведи скилл к стандарту", "does this skill match the spec" / "соответствует ли скилл стандарту", "plugin.json / marketplace.json" / "claude plugin validate fails" / "проверь плагин по документации Anthropic", "is this skill safe to install" / "безопасно ли ставить этот скилл" - or when a skill must reach an MCP server or another agent over A2A. Encodes the Agent Skills open standard AND Anthropic's platform rules (front-matter limits, disclosure budgets, Skills API surfaces, evals), the Claude Code plugin reference (manifest schemas, component layout, validate --strict), plus the proven ssheleg pipeline - marketplace layout, version sync, validator+CI, multi-agent distribution, npm gotchas, end-to-end first publish.
4
4
  license: MIT
5
+ compatibility: Authoring works on any agent. The bundled scripts/ need python3. Publishing steps need git, gh, node and npm; the plugin gates need the claude CLI. Not usable on the Claude API surface, which has no network and no runtime package install.
6
+ metadata:
7
+ author: ssheleg
8
+ version: "0.9.1"
9
+ homepage: https://github.com/ssheleg/make-skill
5
10
  ---
6
11
 
7
12
  # make-skill — Create, Retrofit, and Ship Skills the Proven Way
@@ -20,6 +25,7 @@ Copy from a working repo (usually `~/DATA/<name>`): **`ssheleg/super-ux`**
20
25
  | `references/surfaces.md` | shipping anywhere but Claude Code — Skills API upload/versions/8-per-request, claude.ai zip, the no-network / no-install limits |
21
26
  | `references/enterprise.md` | installing someone else's skill, or governing a fleet — risk tiers, review checklist, approval gates, lifecycle, recall limits |
22
27
  | `references/retrofit.md` | auditing an existing skill/repo — the 13-item checklist, the evidence rules, the short form for personal skills |
28
+ | `references/host-capabilities.md` | shipping a **hook, subagent, command, script or MCP dependency** — what each buys and costs, hook events/exit codes, and the degradation clauses that keep the skill working without them |
23
29
  | `references/claude-code-plugin.md` | anything shipping as a **Claude Code plugin/marketplace** — manifest schemas, component layout, LSP/monitors, path variables, `validate` failures |
24
30
  | `references/distribution.md` | the repo layout, publishing, channels, releases |
25
31
  | `references/mcp.md` | the skill calls/wraps/documents an **MCP** server, or you're choosing skill vs server |
@@ -121,15 +127,45 @@ House additions on top of the spec:
121
127
  - Never overwrite user data: seed only when absent; overwrite only behind
122
128
  `--force`.
123
129
 
130
+ ### Degradation contract (every skill that touches a host capability)
131
+
132
+ Hooks, subagents, `/commands`, `${CLAUDE_PLUGIN_ROOT}` and MCP servers exist only
133
+ inside Claude Code — which is a minority of where skills run. **Each is an
134
+ accelerator with a written fallback; the skill still finishes its job without
135
+ it, more slowly.** Write the three cases into the body, in the agent's words, at
136
+ the point it will need them (shapes and wording:
137
+ `references/host-capabilities.md`):
138
+
139
+ - **Not Claude Code** (Cursor, Codex, skills CLI, API): no hooks, no subagents,
140
+ no `/command`. Name the inline procedure. Bundled `scripts/` still travel —
141
+ they live inside the skill directory — so give the path for each channel.
142
+ - **Recommended plugin/skill absent**: say once what is degraded, continue on
143
+ the manual path. A stage that refuses to start because an optional companion
144
+ is missing is broken, not strict.
145
+ - **Tool, interpreter or MCP server absent**: state it once, fall back to the
146
+ by-hand procedure, never retry in a loop. Interactive auth is a human step.
147
+
148
+ A fallback you know but did not write is not a fallback.
149
+
150
+ ### Working examples this skill ships — copy these, not your memory
151
+
152
+ `scripts/audit_skill.py` audits ANY skill dir (stdlib; the mechanical half of a
153
+ Retrofit). Beside it: `hooks/` (PostToolUse, exits 0 silently unless a `SKILL.md`
154
+ was written), `commands/skill-audit.md` (deliberately NOT the skill's name),
155
+ `agents/skill-auditor.md`, and six skeletons —
156
+ `assets/SKILL.template.md`, `assets/plugin.template.json`,
157
+ `assets/marketplace.template.json`, `assets/hooks.template.json`,
158
+ `assets/agent.template.md`, `assets/command.template.md`.
159
+
124
160
  ## Create (personal)
125
161
 
126
- `~/.claude/skills/<name>/SKILL.md` following the authoring rules — done. No
127
- repo, no versioning; loads next session. Mention Promote as the upgrade path.
162
+ `~/.claude/skills/<name>/SKILL.md` per the authoring rules — done. No repo, no
163
+ versioning; loads next session. Mention Promote as the upgrade path.
128
164
 
129
165
  Needs hooks, an agent, or an MCP server too, still with no repo? Add
130
166
  `.claude-plugin/plugin.json` to that same folder — Claude Code loads it as
131
- `<name>@skills-dir` next session, no marketplace, no install
132
- (`claude plugin init <name> --with hooks mcp` scaffolds it).
167
+ `<name>@skills-dir` next session (`claude plugin init <name> --with hooks mcp`
168
+ scaffolds it).
133
169
 
134
170
  ## Create (distributable)
135
171
 
@@ -159,12 +195,11 @@ writing the first file.** What holds regardless:
159
195
 
160
196
  Take it ALL the way: GitHub + CI green + npm published + verified installs, no
161
197
  half-done handoffs. Only the first publish needs a human (npm 2FA); **arming CI
162
- publishing is part of shipping**, so the second one does not.
163
-
164
- **The 11-step sequence is in `references/distribution.md` → *First publish*.**
165
- Everything green BEFORE publishing, and done = five VERIFIED facts: repo + CI
166
- green, npm resolvable via npx, plugin installed, skills-CLI discovery working,
167
- next tag publishing without a human.
198
+ publishing is part of shipping**, so the second one does not. **The 11-step
199
+ sequence is in `references/distribution.md` → *First publish*.** Everything
200
+ green BEFORE publishing; done = five VERIFIED facts: repo + CI green, npm
201
+ resolvable via npx, plugin installed, skills-CLI discovery working, next tag
202
+ publishing without a human.
168
203
 
169
204
  ## Retrofit (bring an existing skill/repo up to standard)
170
205
 
@@ -173,12 +208,13 @@ evidence — a `file:line` or the output of the command you actually ran. "Looks
173
208
  fine" is not a verdict, and neither is a PASS on a check that was reasoned about
174
209
  instead of executed.
175
210
 
176
- **The 13-item checklist is in `references/retrofit.md` — open it before
177
- auditing.** It covers, in order: the spec floor, the Anthropic plugin floor,
178
- surface honesty, one-job, entry point, layout and version sync, validator and
179
- CI, evaluations, README, distribution live-checks, repo meta, gotcha compliance,
180
- protocol dependencies. For a PERSONAL skill only three of them apply (spec
181
- floor, one-job, entry point) — that file says which.
211
+ **Run `scripts/audit_skill.py <dir> --house` first** — it does the mechanical
212
+ half deterministically — **then work the 14-item checklist in
213
+ `references/retrofit.md`**, which covers the spec floor, the Anthropic plugin
214
+ floor, surface honesty, one-job, entry point, layout and version sync, validator
215
+ and CI, evaluations, README, distribution live-checks, repo meta, gotchas,
216
+ protocol dependencies, and host capabilities with their fallbacks. For a
217
+ PERSONAL skill only three items apply — that file says which.
182
218
 
183
219
  **Then:** report the gap table, fix everything fixable now, bump a minor/patch
184
220
  version, run the release checklist.
@@ -192,29 +228,25 @@ AFTER the plugin install is verified — duplicate listings confuse agents.
192
228
 
193
229
  ## Distribution matrix
194
230
 
195
- Five filesystem channels: **Claude Code plugin** (`marketplace add` → `install
196
- <name>@<name>`), **vercel skills CLI** (`npx skills add <owner>/<repo>`, 70+
197
- agents, reads `marketplace.json`), **npx** (`npx github:<owner>/<repo>`),
198
- **Cursor** (skills CLI `--agent cursor --global`, or `.cursor/rules/*.mdc`),
199
- **umbrella family repo** (`ssheleg/sshlg-skills`). Anthropic's own surfaces —
200
- Skills API upload (workspace-wide, 8 per request) and claude.ai zip (per user,
201
- no admin push) — are separate deployments syncing with nothing:
231
+ Five filesystem channels — Claude Code plugin, vercel skills CLI (70+ agents,
232
+ reads `marketplace.json`), npx, Cursor, umbrella family repo — with the exact
233
+ flags in **`references/distribution.md`; read it before publishing, adding a
234
+ channel, or auditing distribution.** Anthropic's own surfaces (Skills API
235
+ upload, claude.ai zip) are separate deployments syncing with nothing:
202
236
  `references/surfaces.md`.
203
237
 
204
- **Read `references/distribution.md` before publishing, adding a channel, or
205
- auditing distribution.** Two rules survive without it: **one channel per agent**
206
- (never `claude-code` via the skills CLI when a plugin is installed), and **e2e
207
- `npx` from a non-repo cwd**.
238
+ Two rules survive without opening either: **one channel per agent** (never
239
+ `claude-code` via the skills CLI when a plugin is installed), and **e2e `npx`
240
+ from a non-repo cwd**.
208
241
 
209
242
  ## Installing someone else's skill
210
243
 
211
244
  A skill is instructions an agent executes plus code it runs without reading —
212
245
  installing one is installing software. Anything not written here gets the
213
- `references/enterprise.md` review first: scripts read end to end, network calls
214
- and credentials grepped for, instructions checked for "ignore previous rules",
215
- hidden actions, or data routed outward. Highest-risk shape: a skill that fetches
216
- instructions from a URL — that content changes after your review. Same file for
217
- the fleet rules (approval gates, lifecycle, recall limits).
246
+ `references/enterprise.md` review first: every file read, network calls and
247
+ credentials grepped for, instructions checked for "ignore previous rules",
248
+ hidden actions, or data routed outward. Highest-risk shape: a skill fetching
249
+ instructions from a URL — that content changes after your review.
218
250
 
219
251
  ## Protocol-connected skills (MCP / A2A)
220
252
 
@@ -245,34 +277,31 @@ Non-negotiables for any such skill:
245
277
 
246
278
  ## Gotchas (each cost a debugging round)
247
279
 
248
- - **npm publishing has its own trap list** — 2FA/EOTP, the name-similarity 403
249
- `npm view` can't predict, auth failures masked as 404 on PUT, read-replica lag
250
- after a first scoped publish, `npx` resolving locally inside the package's own
251
- repo. Fixes in `references/distribution.md` → **read it before any publish.**
280
+ - **npm publishing has a five-trap list** — 2FA/EOTP, a name-similarity 403 that
281
+ `npm view` cannot predict, auth failures masked as 404, read-replica lag, and
282
+ `npx` resolving locally inside the package's own repo. Each with its fix in
283
+ `references/distribution.md` → **read it before any publish.**
252
284
  - **A stray `SKILL.md` anywhere in the repo ships as a REAL skill** — the skills
253
285
  CLI discovers every one in the tree, so `templates/SKILL.md` lands in every
254
286
  agent as a placeholder (seen live: a skill named `<skill-name>`). Name
255
287
  skeletons `SKILL.template.md`, have the validator reject any `SKILL.md`
256
288
  outside the skill dirs, verify with `npx skills add <repo> --list`.
257
- - **Quote every `argument-hint`.** Bare `[a | b]` is a YAML flow sequence — one
258
- comma drops the whole front-matter block, leaving a command with no
259
- description and no warning.
260
- - **Never name a `commands/<x>.md` after a `skills/<x>/`** — same name, two
261
- components: the skill wins and the command is unreachable always-on cost
262
- (~100 tok/session here). Check with `claude plugin details`.
289
+ - **Commands: quote every `argument-hint`** (bare `[a | b]` is a YAML flow
290
+ sequence — one comma drops the whole front-matter block, silently) and **never
291
+ name one after a skill** in the same plugin (both claim `/<x>`, the skill wins,
292
+ the command is unreachable always-on cost). Details:
293
+ `references/host-capabilities.md`.
263
294
  - **Writing the installer or validator?** Four more traps (piped-stdin readline,
264
295
  raw-mode pickers, ANSI literals, python 3.9 drift) are in
265
296
  `references/distribution.md` → *Installer implementation traps*.
266
297
  - **gh auth status may lie** (invalid-token report while git+ssh works): attempt
267
298
  the operation before declaring it blocked.
268
- - **Duplicate-shadow: one channel per agent — and the shadow regrows.** A plugin
269
- install AND a plain `~/.claude/skills/<name>` copy = two listings, and the
270
- plain (usually STALE) one wins. `npx skills add|update … --global` recreates
271
- that path **even when `claude-code` was never targeted**, so the prune belongs
272
- in the update command: `npx skills update <name> --global --yes && rm -f
273
- ~/.claude/skills/<name>`.
274
- - **Plugin commands need the full `<name>@<name>`:** `claude plugin update
275
- <name>` → "Plugin not found". Same for install.
299
+ - **Duplicate-shadow: the stale copy wins, and it regrows.** A plugin install
300
+ plus a plain `~/.claude/skills/<name>` copy = two listings; `npx skills
301
+ add|update … --global` recreates that path **even when `claude-code` was never
302
+ targeted**, so the prune belongs inside the update command: `npx skills update
303
+ <name> --global --yes && rm -f ~/.claude/skills/<name>`. Plugin commands also
304
+ need the full id — `claude plugin update <name>` answers "Plugin not found".
276
305
  - **A pinned `version` you forget to bump freezes every user.** The version is
277
306
  the update cache key: twenty commits under `0.6.1` and `/plugin update` still
278
307
  says "already at the latest version". (Omitting it from both manifests is