@ssheleg/make-skill 0.8.0 → 0.9.0
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 +114 -3
- package/README.md +49 -15
- package/SECURITY.md +24 -8
- package/cursor/rules/make-skill.mdc +29 -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 +101 -87
- 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/{templates → plugins/make-skill/skills/make-skill/assets}/marketplace.template.json +1 -0
- package/{templates → plugins/make-skill/skills/make-skill/assets}/plugin.template.json +1 -0
- package/plugins/make-skill/skills/make-skill/references/authoring.md +7 -0
- package/plugins/make-skill/skills/make-skill/references/claude-code-plugin.md +2 -2
- package/plugins/make-skill/skills/make-skill/references/distribution.md +19 -6
- package/plugins/make-skill/skills/make-skill/references/host-capabilities.md +218 -0
- package/plugins/make-skill/skills/make-skill/references/retrofit.md +114 -0
- package/plugins/make-skill/skills/make-skill/scripts/audit_skill.py +378 -0
- package/templates/README.md +0 -31
- /package/{templates → plugins/make-skill/skills/make-skill/assets}/SKILL.template.md +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,115 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v0.9.0 — 2026-08-03
|
|
4
|
+
|
|
5
|
+
The canon knew the Claude Code capability set and used none of it. This release
|
|
6
|
+
uses it — and turns the missing half into a rule: **every host capability is an
|
|
7
|
+
accelerator with a written fallback**, because hooks, subagents and `/commands`
|
|
8
|
+
exist only inside Claude Code, which is a minority of where skills run.
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **`references/host-capabilities.md`** — hooks (events, handler types, matchers,
|
|
12
|
+
`if` rules, exit-code semantics, structured output, plugin-scoped MCP matchers),
|
|
13
|
+
subagents, commands, scripts, MCP and sibling-skill dependencies: what each
|
|
14
|
+
buys, what it costs in always-on tokens, and when it earns its place. Verified
|
|
15
|
+
against the hooks reference and against a working plugin, not from memory.
|
|
16
|
+
- **The degradation contract**, in `SKILL.md` and enforced by the validator.
|
|
17
|
+
Three axes, each written in the body where the agent will read it: not Claude
|
|
18
|
+
Code (no hooks/subagents/commands — name the inline procedure), recommended
|
|
19
|
+
plugin absent (say what is degraded, continue), tool or MCP server absent
|
|
20
|
+
(state it once, fall back, never retry in a loop). *A fallback you know but did
|
|
21
|
+
not write is not a fallback.*
|
|
22
|
+
- **`scripts/audit_skill.py`** — a stdlib auditor for ANY skill directory: name
|
|
23
|
+
charset/length/reserved words/XML tags/directory match, description limits and
|
|
24
|
+
third person, frontmatter keys, body budgets, bundled-file reachability and
|
|
25
|
+
nesting, tables of contents past 100 lines, link escapes, Windows paths,
|
|
26
|
+
time-branching prose, bare directory pointers. `--house` adds the ssheleg
|
|
27
|
+
rules. It finds all nine planted defects in the evaluation fixture and passes
|
|
28
|
+
clean on this skill; CI asserts both.
|
|
29
|
+
- **A `PostToolUse` hook** that audits a `SKILL.md` the moment it is written, and
|
|
30
|
+
is otherwise invisible: it exits 0 with no output for any other path, for a
|
|
31
|
+
missing `python3`, for a missing script. It advises via `systemMessage` and
|
|
32
|
+
never blocks — `PostToolUse` fires after the write, so a veto costs a turn and
|
|
33
|
+
buys nothing.
|
|
34
|
+
- **`commands/skill-audit.md`** (deliberately not named after the skill) and
|
|
35
|
+
**`agents/skill-auditor.md`** — a subagent for auditing a repo full of skills
|
|
36
|
+
without crowding the main thread, including the coexistence check that is
|
|
37
|
+
invisible per-skill.
|
|
38
|
+
- **Six skeletons in `assets/`**, now *inside* the skill directory so they travel
|
|
39
|
+
on every channel: SKILL, plugin manifest, marketplace manifest, and new hooks,
|
|
40
|
+
agent and command templates, each carrying its degradation clause.
|
|
41
|
+
- **`SKILL-CARD.md`** — the enterprise registry entry plus an honest pass over
|
|
42
|
+
the risk table, including the hook that runs automatically. **`test/evals/RESULTS.md`**
|
|
43
|
+
states plainly that the suite has never been executed against a model.
|
|
44
|
+
- Frontmatter `compatibility` (what this skill needs and where it does not work)
|
|
45
|
+
and `metadata.version`, which is the only version an agent outside Claude Code
|
|
46
|
+
can see — now the fifth point of the version-sync rule.
|
|
47
|
+
|
|
48
|
+
### Fixed
|
|
49
|
+
- **The skeletons reached no agent.** `templates/` sat at the repo root, outside
|
|
50
|
+
the plugin directory and outside the skill directory, so neither the Claude
|
|
51
|
+
Code plugin nor the skills CLI ever shipped them. They are `assets/` now, and
|
|
52
|
+
the validator fails if a root `templates/` reappears.
|
|
53
|
+
- The auditor's own first run flagged a false positive on this skill's
|
|
54
|
+
anti-pattern gotcha ("Before August, use the old API" — quoted as an example).
|
|
55
|
+
Quoted and backticked spans are now excluded: a linter that flags the document
|
|
56
|
+
warning about the thing it detects earns the habit of being ignored.
|
|
57
|
+
- New validator rules, each with a negative self-test: hook commands must resolve
|
|
58
|
+
through a quoted `${CLAUDE_PLUGIN_ROOT}` and carry a timeout, hook scripts must
|
|
59
|
+
exist with a shebang and the executable bit, plugin agents must not carry
|
|
60
|
+
`hooks`/`mcpServers`/`permissionMode`, shipped scripts must compile, and the
|
|
61
|
+
degradation section must be present.
|
|
62
|
+
|
|
63
|
+
## v0.8.1 — 2026-08-03
|
|
64
|
+
|
|
65
|
+
A file-by-file re-read of everything 0.8.0 touched, and of everything it didn't.
|
|
66
|
+
Fourteen findings, all fixed. The two that would have misled a reader:
|
|
67
|
+
|
|
68
|
+
### Fixed
|
|
69
|
+
- **The token estimate was asserted, not measured.** The validator's comment
|
|
70
|
+
claimed dense markdown runs "closer to 3.7 chars/token, so this under-reports";
|
|
71
|
+
nothing had ever been counted. Tokenizing the bundle gives **3.78–4.47**
|
|
72
|
+
chars/token (3.9 for `SKILL.md`), so the divisor is now 3.9, measured — and
|
|
73
|
+
the recalibration immediately failed the body it was checking, which is what a
|
|
74
|
+
calibrated rule is for. The audit checklist moved to a new
|
|
75
|
+
**`references/retrofit.md`**, bringing the body to ~4.6k tokens with headroom.
|
|
76
|
+
- **`claude plugin details` and a real tokenizer disagree by ~40%** — the CLI
|
|
77
|
+
reported ~7.2k on-invoke for a `SKILL.md` that tokenizes at ~5.0k, because its
|
|
78
|
+
estimator assumes ~2.8 chars/token. Measured across six installed skills and
|
|
79
|
+
recorded as a gotcha: budget against a tokenizer, expect the CLI to look
|
|
80
|
+
alarming, and never gut a body that is genuinely inside the budget.
|
|
81
|
+
- **`SECURITY.md` described paths the installers do not write.** It claimed
|
|
82
|
+
`bin/make-skill.js` and `install.sh` copy into `~/.claude/commands/`; that
|
|
83
|
+
command file was deleted in 0.6.x and CI asserts its absence on every run. The
|
|
84
|
+
threat model now matches the code, and states what `test/evals/fixtures/` is —
|
|
85
|
+
including that the malicious sample is inert data, never installed.
|
|
86
|
+
- **The trigger split could not measure what it claimed.** `train: q01-q12` /
|
|
87
|
+
`validation: q13-q20` put all ten positives in train and left validation with
|
|
88
|
+
nothing but negatives, so the held-out half could only detect false-firing.
|
|
89
|
+
Split is now explicit ids with both classes on both sides, and the validator
|
|
90
|
+
rejects a half that holds only one class.
|
|
91
|
+
- **`displayName` was required by the canon and absent from the skeletons.**
|
|
92
|
+
Both manifest templates now seed it, and the validator enforces it in the
|
|
93
|
+
templates, in `plugin.json`, and in the marketplace entry — where it belongs
|
|
94
|
+
(the marketplace root takes neither `displayName` nor `homepage`).
|
|
95
|
+
- **`/make-skill` is only half the truth.** As a plugin the command is
|
|
96
|
+
`/make-skill:make-skill`; the bare form is what a skills-directory install
|
|
97
|
+
gets. README and canon now state both, and the canon says to write both rather
|
|
98
|
+
than promise one.
|
|
99
|
+
- `distribution.md`'s table of contents listed a "shadow rule" section that did
|
|
100
|
+
not exist as a heading — the exact failure a table of contents prevents. It is
|
|
101
|
+
a real section now.
|
|
102
|
+
- Counts that had drifted: CONTRIBUTING said CI runs "four negative self-tests"
|
|
103
|
+
(six groups), the issue-template contact link said "the other four skills"
|
|
104
|
+
(five), the retrofit fixture header claimed eight planted defects (nine, now
|
|
105
|
+
scored one per line).
|
|
106
|
+
- Dead `EVAL_DIR` variable removed; `test/evals/` added to the Cursor rule's
|
|
107
|
+
layout tree and to the templates README, both of which still described a repo
|
|
108
|
+
without it; the PR template now asks for the two `--strict` runs and for an
|
|
109
|
+
eval re-run when the description changes.
|
|
110
|
+
- Three more negative self-tests (split classes, `displayName` ×2), keeping the
|
|
111
|
+
rule that no validator rule ships without one.
|
|
112
|
+
|
|
3
113
|
## v0.8.0 — 2026-08-03
|
|
4
114
|
|
|
5
115
|
Read Anthropic's four Agent Skills pages end to end (overview, authoring best
|
|
@@ -63,9 +173,10 @@ six new validator rules, and one self-violation fixed.
|
|
|
63
173
|
- **This skill was over its own token budget.** `SKILL.md` was ~5.2k estimated
|
|
64
174
|
tokens against a stated `< 5000` — a rule the repo enforced on everyone but
|
|
65
175
|
itself, because only the 500-line half was ever checked. The body budget is
|
|
66
|
-
now measured (
|
|
67
|
-
|
|
68
|
-
|
|
176
|
+
now measured (frontmatter excluded as level-1 metadata) and the body was cut
|
|
177
|
+
by moving the repo layout, the two Claude Code gates, the validator spec and
|
|
178
|
+
the release checklist into `references/distribution.md`. (The divisor used
|
|
179
|
+
here was a guess; v0.8.1 measured it and cut further.)
|
|
69
180
|
- **Reference files longer than 100 lines now open with a `## Contents` list.**
|
|
70
181
|
Agents preview long files with `head`; without a table of contents they act on
|
|
71
182
|
the first hundred lines and never learn the rest exists. All eight references
|
package/README.md
CHANGED
|
@@ -31,11 +31,21 @@ make a skill that turns our incident runbooks into a triage workflow
|
|
|
31
31
|
…or point it at something that already exists:
|
|
32
32
|
|
|
33
33
|
```
|
|
34
|
-
/make-skill audit ./skills/my-skill against the spec
|
|
34
|
+
/make-skill:make-skill audit ./skills/my-skill against the spec
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
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
|
|
47
|
+
`/make-skill` when it sits in a skills directory; both reach the same skill, and
|
|
48
|
+
asking in plain language works either way.
|
|
39
49
|
|
|
40
50
|
## What it does
|
|
41
51
|
|
|
@@ -74,6 +84,17 @@ both manifests, in CI as its own job. That check is what caught this repo's own
|
|
|
74
84
|
`marketplace.json` shipping `homepage` and `repository` at a level where Claude
|
|
75
85
|
Code ignores them.
|
|
76
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
|
+
|
|
77
98
|
**Evaluations, not vibes.** The canon requires every skill to carry at least
|
|
78
99
|
three behavioral scenarios and a trigger set whose negatives are *near-misses* —
|
|
79
100
|
queries that share the keywords and need something else. make-skill ships its
|
|
@@ -122,15 +143,19 @@ agent opens only when the situation calls for them:
|
|
|
122
143
|
| `authoring.md` | the craft — naming, third-person descriptions, degrees of freedom, workflows and feedback loops, script rules, evaluation-driven development |
|
|
123
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 |
|
|
124
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 |
|
|
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 |
|
|
125
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 |
|
|
126
149
|
| `distribution.md` | the repo layout, every install channel, exact CLI flags, npm publishing traps, the release checklist |
|
|
127
150
|
| `mcp.md` | [MCP](https://modelcontextprotocol.io) — skill vs server, primitives and methods, transports, consent and untrusted-output rules |
|
|
128
151
|
| `a2a.md` | [A2A](https://a2a-protocol.org) — Agent Cards, task lifecycle, method mapping, v0.x→1.0 wire drift |
|
|
129
152
|
|
|
130
|
-
Plus
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
`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.
|
|
134
159
|
|
|
135
160
|
## Install
|
|
136
161
|
|
|
@@ -197,9 +222,14 @@ copy on every global update, even when Claude Code was never named.
|
|
|
197
222
|
|
|
198
223
|
### Requirements
|
|
199
224
|
|
|
200
|
-
Node ≥ 16 for the `npx` installer; Python 3
|
|
201
|
-
|
|
202
|
-
|
|
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).
|
|
203
233
|
|
|
204
234
|
## Repo layout
|
|
205
235
|
|
|
@@ -207,16 +237,20 @@ The skill itself is plain Markdown and needs nothing.
|
|
|
207
237
|
.claude-plugin/marketplace.json
|
|
208
238
|
plugins/make-skill/
|
|
209
239
|
├── .claude-plugin/plugin.json
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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
|
|
213
248
|
cursor/rules/make-skill.mdc # self-contained Cursor rule
|
|
214
|
-
templates/ # SKILL.template.md + the two manifest skeletons
|
|
215
249
|
bin/make-skill.js + package.json # zero-dep npx installer
|
|
216
250
|
test/validate.py # structural validator
|
|
217
251
|
test/evals/ # trigger set + behavioral scenarios (data)
|
|
218
252
|
.github/workflows/{validate,release}.yml
|
|
219
|
-
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
|
|
220
254
|
docs/superpowers/{specs,plans}/ # historical design records
|
|
221
255
|
```
|
|
222
256
|
|
package/SECURITY.md
CHANGED
|
@@ -13,15 +13,31 @@ 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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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.
|
|
31
|
+
- **`bin/make-skill.js`** (run via `npx`) and **`install.sh`** copy the skill
|
|
32
|
+
directory into `~/.claude/skills/make-skill` and nothing else — no command file,
|
|
33
|
+
no other path in `$HOME` — and overwrite only with `--force`. Both are
|
|
34
|
+
zero-dependency: no network calls, no postinstall script. CI asserts the
|
|
35
|
+
absence of `~/.claude/commands/make-skill.md` on every run.
|
|
23
36
|
- **`test/validate.py`** reads repository files and exits with a status. It writes
|
|
24
|
-
nothing.
|
|
37
|
+
nothing. `test/evals/` is inert data — text a human feeds to an agent — and
|
|
38
|
+
`test/evals/fixtures/untrusted-skill.md` is a deliberately malicious *sample*
|
|
39
|
+
used to score a review; it is never installed or executed, and its endpoints
|
|
40
|
+
are `example.com` placeholders.
|
|
25
41
|
- The Claude Code plugin and the `skills` CLI channels are handled by those tools,
|
|
26
42
|
not by code in this repo.
|
|
27
43
|
|
|
@@ -77,6 +77,7 @@ cursor/rules/*.mdc # self-contained, NO relative links
|
|
|
77
77
|
templates/*.md # skeletons — NEVER name one SKILL.md
|
|
78
78
|
bin/<name>.js + package.json # zero-dep npx installer
|
|
79
79
|
test/validate.py # stdlib-only consistency validator
|
|
80
|
+
test/evals/ # triggers.json + scenarios.json (data, run by a human)
|
|
80
81
|
.github/workflows/validate.yml (+ release.yml, off by default)
|
|
81
82
|
install.sh, README.md (English-first), CHANGELOG.md, LICENSE (MIT)
|
|
82
83
|
CONTRIBUTING.md + SECURITY.md # required once the repo is public
|
|
@@ -113,6 +114,30 @@ checker, not a house opinion:
|
|
|
113
114
|
`${CLAUDE_PLUGIN_DATA}` — both Claude-Code-only, so keep relative paths as the
|
|
114
115
|
portable contract.
|
|
115
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
|
+
|
|
116
141
|
## Hard rules
|
|
117
142
|
|
|
118
143
|
- **Version sync:** marketplace.json, plugin.json, package.json (if npm), and the
|
|
@@ -132,6 +157,10 @@ checker, not a house opinion:
|
|
|
132
157
|
- **Cursor .mdc:** embed contracts inline (files get copied into foreign projects).
|
|
133
158
|
- **e2e npx from a NON-repo cwd** (inside the repo it resolves the local package →
|
|
134
159
|
false "command not found").
|
|
160
|
+
- **Two token counters, ~40% apart:** `claude plugin details` assumes ~2.8
|
|
161
|
+
chars/token and shows a far bigger on-invoke cost than a real tokenizer
|
|
162
|
+
(3.8–4.5 chars/token). Budget the body against a tokenizer; expect the CLI to
|
|
163
|
+
look alarming for a file that is genuinely inside 5000 tokens.
|
|
135
164
|
- **Installing a skill you did not write is installing software.** Read every
|
|
136
165
|
file, run scripts sandboxed, grep for network calls and credentials, and check
|
|
137
166
|
the instructions for "ignore previous rules", hidden actions, or data routed
|
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.0",
|
|
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.0",
|
|
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
|