@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
|
@@ -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.0"
|
|
9
|
+
homepage: https://github.com/ssheleg/make-skill
|
|
5
10
|
---
|
|
6
11
|
|
|
7
12
|
# make-skill — Create, Retrofit, and Ship Skills the Proven Way
|
|
@@ -19,6 +24,8 @@ Copy from a working repo (usually `~/DATA/<name>`): **`ssheleg/super-ux`**
|
|
|
19
24
|
| `references/authoring.md` | writing or tuning a body/description — naming, third-person rule, degrees of freedom, script rules, eval loops |
|
|
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 |
|
|
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 |
|
|
22
29
|
| `references/claude-code-plugin.md` | anything shipping as a **Claude Code plugin/marketplace** — manifest schemas, component layout, LSP/monitors, path variables, `validate` failures |
|
|
23
30
|
| `references/distribution.md` | the repo layout, publishing, channels, releases |
|
|
24
31
|
| `references/mcp.md` | the skill calls/wraps/documents an **MCP** server, or you're choosing skill vs server |
|
|
@@ -109,23 +116,56 @@ House additions on top of the spec:
|
|
|
109
116
|
passes; a skill built without a baseline documents imagined problems. Adding a
|
|
110
117
|
member to an existing family → test **coexistence**: a broad description
|
|
111
118
|
steals the triggers of the skills already installed.
|
|
112
|
-
- Ship a one-command entry point
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
a `commands/*.md` only under a DIFFERENT name, with a quoted
|
|
119
|
+
- Ship a one-command entry point: idempotent — inspect state → repair missing
|
|
120
|
+
pieces → status report → exactly ONE suggested next action. Detect mode, never
|
|
121
|
+
ask. (Pattern: super-ux `/ux`.) **The skill IS that command** — a
|
|
122
|
+
`commands/<name>.md` beside `skills/<name>/` registers the same command twice;
|
|
123
|
+
add a `commands/*.md` only under a DIFFERENT name, with a quoted
|
|
124
|
+
`argument-hint`. The invocation differs by channel: `/<skill>` from a skills
|
|
125
|
+
directory, `/<plugin>:<skill>` once it is installed as a plugin — write both
|
|
126
|
+
in the README rather than promising one.
|
|
117
127
|
- Never overwrite user data: seed only when absent; overwrite only behind
|
|
118
128
|
`--force`.
|
|
119
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
|
+
|
|
120
160
|
## Create (personal)
|
|
121
161
|
|
|
122
|
-
`~/.claude/skills/<name>/SKILL.md`
|
|
123
|
-
|
|
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.
|
|
124
164
|
|
|
125
165
|
Needs hooks, an agent, or an MCP server too, still with no repo? Add
|
|
126
166
|
`.claude-plugin/plugin.json` to that same folder — Claude Code loads it as
|
|
127
|
-
`<name>@skills-dir` next session
|
|
128
|
-
|
|
167
|
+
`<name>@skills-dir` next session (`claude plugin init <name> --with hooks mcp`
|
|
168
|
+
scaffolds it).
|
|
129
169
|
|
|
130
170
|
## Create (distributable)
|
|
131
171
|
|
|
@@ -145,6 +185,8 @@ writing the first file.** What holds regardless:
|
|
|
145
185
|
- **Both `--strict` runs green, in CI, as their own job** — and they read
|
|
146
186
|
MANIFESTS only, so front-matter rules live in your own `test/validate.py`,
|
|
147
187
|
which needs a negative self-test: a validator that can't fail is decoration.
|
|
188
|
+
Ship `$schema` and `displayName` in `plugin.json` AND in the marketplace
|
|
189
|
+
ENTRY (the marketplace root takes neither `displayName` nor `homepage`).
|
|
148
190
|
- A public repo owes a reader an English-first README, `CONTRIBUTING.md` with
|
|
149
191
|
the offline commands that verify a change, and `SECURITY.md` naming a private
|
|
150
192
|
channel and what the installers touch.
|
|
@@ -153,56 +195,29 @@ writing the first file.** What holds regardless:
|
|
|
153
195
|
|
|
154
196
|
Take it ALL the way: GitHub + CI green + npm published + verified installs, no
|
|
155
197
|
half-done handoffs. Only the first publish needs a human (npm 2FA); **arming CI
|
|
156
|
-
publishing is part of shipping**, so the second one does not.
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
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.
|
|
162
203
|
|
|
163
204
|
## Retrofit (bring an existing skill/repo up to standard)
|
|
164
205
|
|
|
165
206
|
Audit first, fix second, in the same session. Verdict per item: PASS / GAP with
|
|
166
|
-
evidence
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
cost worth paying.
|
|
178
|
-
3. **Surface honesty** (`references/surfaces.md`): every runtime need (network,
|
|
179
|
-
packages, MCP server) declared in `compatibility`; no script assuming an
|
|
180
|
-
install the target surface forbids.
|
|
181
|
-
4. One-job check; shared contracts INSIDE the skill dir — verify by installing
|
|
182
|
-
via the skills CLI and checking the files actually arrived.
|
|
183
|
-
5. Entry-point command exists, idempotent (inspect → repair → status → one next
|
|
184
|
-
action).
|
|
185
|
-
6. Layout matches the tree; manifests complete; version sync ×4 (×5 with
|
|
186
|
-
`metadata.version`).
|
|
187
|
-
7. Validator present, green, and able to fail (run the negative test); CI
|
|
188
|
-
present, last run `success`.
|
|
189
|
-
8. **Evals exist** in `test/evals/` (`references/authoring.md`): ≥3 scenarios
|
|
190
|
-
plus should-NOT-trigger queries, coexistence checked against the installed
|
|
191
|
-
set, re-run on every model the skill claims.
|
|
192
|
-
9. README: badges (npm/CI/license), install + update matrix, English-first,
|
|
193
|
-
bundled `references/` listed so a reader sees what ships.
|
|
194
|
-
10. Distribution live-checks (`references/distribution.md`): `npx --yes skills
|
|
195
|
-
add <repo> --list` lists ONLY real skills; `npx <name>` works from a
|
|
196
|
-
non-repo cwd (if npm published); `.mdc` rules valid, no relative links.
|
|
197
|
-
11. Repo meta: homepage + description + topics on the forge; LICENSE; CHANGELOG
|
|
198
|
-
current; public repos also CONTRIBUTING.md + SECURITY.md.
|
|
199
|
-
12. Gotcha compliance: the list below, plus the installer traps in
|
|
200
|
-
`references/distribution.md` if the repo ships a CLI or validator.
|
|
201
|
-
13. MCP or A2A involved: see Protocol-connected skills below.
|
|
207
|
+
evidence — a `file:line` or the output of the command you actually ran. "Looks
|
|
208
|
+
fine" is not a verdict, and neither is a PASS on a check that was reasoned about
|
|
209
|
+
instead of executed.
|
|
210
|
+
|
|
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.
|
|
202
218
|
|
|
203
219
|
**Then:** report the gap table, fix everything fixable now, bump a minor/patch
|
|
204
|
-
version, run the release checklist.
|
|
205
|
-
5 only.
|
|
220
|
+
version, run the release checklist.
|
|
206
221
|
|
|
207
222
|
## Promote (personal → distributable)
|
|
208
223
|
|
|
@@ -213,29 +228,25 @@ AFTER the plugin install is verified — duplicate listings confuse agents.
|
|
|
213
228
|
|
|
214
229
|
## Distribution matrix
|
|
215
230
|
|
|
216
|
-
Five filesystem channels
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
Skills API upload (workspace-wide, 8 per request) and claude.ai zip (per user,
|
|
222
|
-
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:
|
|
223
236
|
`references/surfaces.md`.
|
|
224
237
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
`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**.
|
|
229
241
|
|
|
230
242
|
## Installing someone else's skill
|
|
231
243
|
|
|
232
244
|
A skill is instructions an agent executes plus code it runs without reading —
|
|
233
245
|
installing one is installing software. Anything not written here gets the
|
|
234
|
-
`references/enterprise.md` review first:
|
|
235
|
-
|
|
236
|
-
hidden actions, or data routed outward. Highest-risk shape: a skill
|
|
237
|
-
instructions from a URL — that content changes after your review.
|
|
238
|
-
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.
|
|
239
250
|
|
|
240
251
|
## Protocol-connected skills (MCP / A2A)
|
|
241
252
|
|
|
@@ -266,34 +277,31 @@ Non-negotiables for any such skill:
|
|
|
266
277
|
|
|
267
278
|
## Gotchas (each cost a debugging round)
|
|
268
279
|
|
|
269
|
-
- **npm publishing has
|
|
270
|
-
`npm view`
|
|
271
|
-
|
|
272
|
-
|
|
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.**
|
|
273
284
|
- **A stray `SKILL.md` anywhere in the repo ships as a REAL skill** — the skills
|
|
274
285
|
CLI discovers every one in the tree, so `templates/SKILL.md` lands in every
|
|
275
286
|
agent as a placeholder (seen live: a skill named `<skill-name>`). Name
|
|
276
287
|
skeletons `SKILL.template.md`, have the validator reject any `SKILL.md`
|
|
277
288
|
outside the skill dirs, verify with `npx skills add <repo> --list`.
|
|
278
|
-
- **
|
|
279
|
-
comma drops the whole front-matter block,
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
(~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`.
|
|
284
294
|
- **Writing the installer or validator?** Four more traps (piped-stdin readline,
|
|
285
295
|
raw-mode pickers, ANSI literals, python 3.9 drift) are in
|
|
286
296
|
`references/distribution.md` → *Installer implementation traps*.
|
|
287
297
|
- **gh auth status may lie** (invalid-token report while git+ssh works): attempt
|
|
288
298
|
the operation before declaring it blocked.
|
|
289
|
-
- **Duplicate-shadow:
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
- **Plugin commands need the full `<name>@<name>`:** `claude plugin update
|
|
296
|
-
<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".
|
|
297
305
|
- **A pinned `version` you forget to bump freezes every user.** The version is
|
|
298
306
|
the update cache key: twenty commits under `0.6.1` and `/plugin update` still
|
|
299
307
|
says "already at the latest version". (Omitting it from both manifests is
|
|
@@ -301,6 +309,12 @@ Non-negotiables for any such skill:
|
|
|
301
309
|
- **Time-branching text rots.** "Before August, use the old API" is wrong the day
|
|
302
310
|
it ships — superseded material goes under `## Old patterns`, and a dated
|
|
303
311
|
provenance line ("*read from the spec on 2026-08-03*") ages well.
|
|
312
|
+
- **Two token counters, ~40% apart.** `claude plugin details` reported ~7.2k
|
|
313
|
+
on-invoke for a SKILL.md that a real tokenizer puts at ~5.0k (measured across
|
|
314
|
+
six installed skills: the CLI assumes ~2.8 chars/token, cl100k gives 3.8–4.5).
|
|
315
|
+
Its estimator is the pessimistic one — budget against a tokenizer, then expect
|
|
316
|
+
the CLI to show a bigger number, and never "fix" a body that is already
|
|
317
|
+
inside 5000 real tokens because the CLI looked alarming.
|
|
304
318
|
|
|
305
319
|
## Release (every version)
|
|
306
320
|
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agent-name-here
|
|
3
|
+
description: What this agent does and WHEN the main thread should delegate to it. Third person, concrete triggers — the same selection problem a skill description solves.
|
|
4
|
+
tools: Read, Grep, Glob, Bash
|
|
5
|
+
# Optional: model, effort, maxTurns, disallowedTools, memory, background,
|
|
6
|
+
# isolation: "worktree" (only value accepted)
|
|
7
|
+
# REJECTED for plugin-shipped agents: hooks, mcpServers, permissionMode
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
You <one sentence: the single job>. You do not <the adjacent job you must refuse>.
|
|
11
|
+
|
|
12
|
+
## Procedure
|
|
13
|
+
|
|
14
|
+
1. Deterministic step first — run the bundled script rather than reasoning your
|
|
15
|
+
way to the same answer:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/skills/SKILL_NAME/scripts/SCRIPT.py" <target>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
No `${CLAUDE_PLUGIN_ROOT}`? You are not running as a Claude Code plugin —
|
|
22
|
+
find the script under the skill directory you were loaded from. Interpreter
|
|
23
|
+
missing? Say so once and do the checks by hand from the reference; a missing
|
|
24
|
+
tool changes how you work, not whether you report.
|
|
25
|
+
|
|
26
|
+
2. Judgement steps, each naming the reference file that carries the rules. Read
|
|
27
|
+
the file; do not reconstruct it from memory.
|
|
28
|
+
|
|
29
|
+
## Output
|
|
30
|
+
|
|
31
|
+
Exactly what the caller needs and nothing else — a table, a verdict, or a patch.
|
|
32
|
+
Evidence for every claim (`file:line` or command output). Finish with ONE next
|
|
33
|
+
action and stop.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "One line the user sees in the / menu — what it does, not how it works"
|
|
3
|
+
argument-hint: "[what to pass] [--flag]"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!--
|
|
7
|
+
Two rules this skeleton exists to enforce:
|
|
8
|
+
|
|
9
|
+
1. NEVER name this file after a skill directory in the same plugin. Commands
|
|
10
|
+
are skills now: `commands/x.md` beside `skills/x/` registers /x twice, the
|
|
11
|
+
skill wins, and the command is unreachable always-on token cost.
|
|
12
|
+
2. ALWAYS quote `argument-hint`. A bare [a | b] is a YAML flow sequence; one
|
|
13
|
+
comma inside it drops the whole frontmatter block, leaving a command with
|
|
14
|
+
no description and no warning.
|
|
15
|
+
-->
|
|
16
|
+
|
|
17
|
+
Do <the task> for `$ARGUMENTS`.
|
|
18
|
+
|
|
19
|
+
1. The deterministic part, by script:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/skills/SKILL_NAME/scripts/SCRIPT.py" $ARGUMENTS
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Not running as a Claude Code plugin, so `${CLAUDE_PLUGIN_ROOT}` is unset? The
|
|
26
|
+
script is in the skill directory this file was installed beside. No
|
|
27
|
+
interpreter? Fall back to the manual procedure in the reference and say that
|
|
28
|
+
you did.
|
|
29
|
+
|
|
30
|
+
2. The judgement part, from `references/FILE.md`.
|
|
31
|
+
|
|
32
|
+
3. Report: what was checked, what the verdict is, and ONE next action.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "PLUGIN_NAME — one sentence on what these hooks do, and the sentence that matters to a reviewer: when they no-op. A globally installed plugin must be invisible in projects that do not use it.",
|
|
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/HOOK_SCRIPT.sh\"",
|
|
12
|
+
"timeout": 20,
|
|
13
|
+
"statusMessage": "What the user sees while this runs"
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
"SessionStart": [
|
|
19
|
+
{
|
|
20
|
+
"matcher": "startup|resume",
|
|
21
|
+
"hooks": [
|
|
22
|
+
{
|
|
23
|
+
"type": "command",
|
|
24
|
+
"shell": "bash",
|
|
25
|
+
"command": "\"${CLAUDE_PLUGIN_ROOT}/hooks/SESSION_SCRIPT.sh\"",
|
|
26
|
+
"timeout": 15
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -180,6 +180,13 @@ if written carelessly.
|
|
|
180
180
|
- **Vision is available**: rendering an input to images and letting the agent look
|
|
181
181
|
at it beats describing a layout in prose.
|
|
182
182
|
|
|
183
|
+
Worked example: this skill's own `scripts/audit_skill.py`. It is stdlib-only so
|
|
184
|
+
it runs wherever the skill landed, prints `file:line` evidence rather than
|
|
185
|
+
verdicts, handles its own missing-file and bad-frontmatter cases, and its first
|
|
186
|
+
run flagged a false positive on the very document that teaches the anti-pattern —
|
|
187
|
+
which is why it now ignores quoted spans. Hooks, subagents and commands that wrap
|
|
188
|
+
it, plus the fallbacks they owe, are in `references/host-capabilities.md`.
|
|
189
|
+
|
|
183
190
|
## Evaluation and iteration — evals before prose
|
|
184
191
|
|
|
185
192
|
**Build the evaluations before writing extensive documentation.** Otherwise the
|
|
@@ -22,8 +22,8 @@ must also run on Cursor, Codex, or the skills CLI.
|
|
|
22
22
|
## Contents
|
|
23
23
|
|
|
24
24
|
- The gate: `claude plugin validate`
|
|
25
|
-
- `plugin.json`
|
|
26
|
-
- `marketplace.json` fields, reserved names, plugin entries
|
|
25
|
+
- `plugin.json` — `.claude-plugin/plugin.json` (field table)
|
|
26
|
+
- `marketplace.json` — `.claude-plugin/marketplace.json` (fields, reserved names, plugin entries)
|
|
27
27
|
- Component locations
|
|
28
28
|
- Skill frontmatter — host extensions
|
|
29
29
|
- Agents, hooks, MCP inside a plugin
|
|
@@ -19,6 +19,8 @@ API or claude.ai instead is `references/surfaces.md`.
|
|
|
19
19
|
- Release checklist (every version)
|
|
20
20
|
- Toggleable release automation
|
|
21
21
|
|
|
22
|
+
## The shadow rule (one channel per agent)
|
|
23
|
+
|
|
22
24
|
Hard rule across all channels: **one channel per agent.** Two installs of the same
|
|
23
25
|
skill on one agent = two listings, and the stale copy shadows the fresh one.
|
|
24
26
|
|
|
@@ -46,10 +48,13 @@ the shape from `ssheleg/super-ux`:
|
|
|
46
48
|
├── .claude-plugin/marketplace.json # root manifest, plugins[0].source: ./plugins/<name>
|
|
47
49
|
├── plugins/<name>/
|
|
48
50
|
│ ├── .claude-plugin/plugin.json # ONLY the manifest lives in .claude-plugin/
|
|
49
|
-
│
|
|
50
|
-
│
|
|
51
|
+
│ ├── skills/<skill>/SKILL.md + references/*.md + scripts/ + assets/
|
|
52
|
+
│ │ # skeletons live HERE, not at the repo root:
|
|
53
|
+
│ │ # only the skill dir travels on every channel
|
|
54
|
+
│ ├── hooks/hooks.json + *.sh # Claude Code only — see host-capabilities.md
|
|
55
|
+
│ ├── agents/*.md # Claude Code only
|
|
56
|
+
│ └── commands/*.md # never named after a skill
|
|
51
57
|
├── cursor/rules/*.mdc # if agent-rules make sense for Cursor
|
|
52
|
-
├── templates/*.md # skeletons (NEVER name one SKILL.md)
|
|
53
58
|
├── bin/<name>.js + package.json # npx installer (zero-dep Node)
|
|
54
59
|
├── test/validate.py # consistency validator (stdlib only)
|
|
55
60
|
├── test/evals/ # triggers.json + scenarios.json (data, run by a human)
|
|
@@ -57,15 +62,23 @@ the shape from `ssheleg/super-ux`:
|
|
|
57
62
|
├── install.sh # POSIX fallback
|
|
58
63
|
├── README.md (English-first), CHANGELOG.md, LICENSE (MIT)
|
|
59
64
|
├── CONTRIBUTING.md + SECURITY.md # public repo: how to check work, where to report
|
|
65
|
+
├── SKILL-CARD.md # the enterprise registry entry + risk-table pass
|
|
60
66
|
└── docs/superpowers/{specs,plans}/
|
|
61
67
|
```
|
|
62
68
|
|
|
63
69
|
**Public-repo floor** (validator-enforced): a README saying what it does before
|
|
64
70
|
how to install it, **English-first** — Russian belongs in trigger phrases, where
|
|
65
71
|
it changes whether the skill fires; `CONTRIBUTING.md` with the offline commands
|
|
66
|
-
that verify a change; `SECURITY.md` naming a private reporting channel and
|
|
67
|
-
|
|
68
|
-
|
|
72
|
+
that verify a change; `SECURITY.md` naming a private reporting channel and every
|
|
73
|
+
path that executes, hooks first; `SKILL-CARD.md` answering the enterprise
|
|
74
|
+
registry fields and the risk table honestly. A skill is text an agent executes,
|
|
75
|
+
so "review before installing" belongs in writing — and anything that runs
|
|
76
|
+
without being asked belongs at the top of it.
|
|
77
|
+
|
|
78
|
+
**What travels where.** Only `skills/<skill>/` reaches non-Claude channels, so
|
|
79
|
+
scripts and skeletons live inside it. `hooks/`, `agents/` and `commands/` reach
|
|
80
|
+
Claude Code alone: they are accelerators, and the skill body owes each one a
|
|
81
|
+
written fallback (`references/host-capabilities.md`).
|
|
69
82
|
|
|
70
83
|
**Version sync (hard rule):** `marketplace.json`, `plugin.json`, `package.json`
|
|
71
84
|
and the top CHANGELOG entry carry the SAME semver, bumped together; the validator
|