@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 +73 -0
- package/README.md +46 -16
- package/SECURITY.md +15 -3
- package/cursor/rules/make-skill.mdc +24 -0
- package/package.json +2 -3
- package/plugins/make-skill/.claude-plugin/plugin.json +1 -1
- package/plugins/make-skill/agents/skill-auditor.md +46 -0
- package/plugins/make-skill/commands/skill-audit.md +31 -0
- package/plugins/make-skill/hooks/hooks.json +19 -0
- package/plugins/make-skill/hooks/skill-md-audit.sh +43 -0
- package/plugins/make-skill/skills/make-skill/SKILL.md +79 -50
- package/plugins/make-skill/skills/make-skill/assets/agent.template.md +33 -0
- package/plugins/make-skill/skills/make-skill/assets/command.template.md +32 -0
- package/plugins/make-skill/skills/make-skill/assets/hooks.template.json +32 -0
- package/plugins/make-skill/skills/make-skill/references/authoring.md +7 -0
- package/plugins/make-skill/skills/make-skill/references/distribution.md +23 -8
- package/plugins/make-skill/skills/make-skill/references/host-capabilities.md +218 -0
- package/plugins/make-skill/skills/make-skill/references/retrofit.md +25 -2
- package/plugins/make-skill/skills/make-skill/scripts/audit_skill.py +378 -0
- package/templates/README.md +0 -34
- /package/{templates → plugins/make-skill/skills/make-skill/assets}/SKILL.template.md +0 -0
- /package/{templates → plugins/make-skill/skills/make-skill/assets}/marketplace.template.json +0 -0
- /package/{templates → plugins/make-skill/skills/make-skill/assets}/plugin.template.json +0 -0
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
|
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
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
`claude plugin validate
|
|
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
|
|
205
|
-
|
|
206
|
-
|
|
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
|
-
|
|
215
|
-
|
|
216
|
-
|
|
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
|
|
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.
|
|
4
|
-
"description": "Create, retrofit, audit, and ship agent skills & Claude Code plugins the proven ssheleg way
|
|
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.
|
|
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`
|
|
127
|
-
|
|
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
|
|
132
|
-
|
|
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
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
-
**
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
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
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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:
|
|
214
|
-
|
|
215
|
-
hidden actions, or data routed outward. Highest-risk shape: a skill
|
|
216
|
-
instructions from a URL — that content changes after your review.
|
|
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
|
|
249
|
-
`npm view`
|
|
250
|
-
|
|
251
|
-
|
|
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
|
-
- **
|
|
258
|
-
comma drops the whole front-matter block,
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
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:
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
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
|