@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.
Files changed (24) hide show
  1. package/CHANGELOG.md +114 -3
  2. package/README.md +49 -15
  3. package/SECURITY.md +24 -8
  4. package/cursor/rules/make-skill.mdc +29 -0
  5. package/package.json +2 -3
  6. package/plugins/make-skill/.claude-plugin/plugin.json +1 -1
  7. package/plugins/make-skill/agents/skill-auditor.md +46 -0
  8. package/plugins/make-skill/commands/skill-audit.md +31 -0
  9. package/plugins/make-skill/hooks/hooks.json +19 -0
  10. package/plugins/make-skill/hooks/skill-md-audit.sh +43 -0
  11. package/plugins/make-skill/skills/make-skill/SKILL.md +101 -87
  12. package/plugins/make-skill/skills/make-skill/assets/agent.template.md +33 -0
  13. package/plugins/make-skill/skills/make-skill/assets/command.template.md +32 -0
  14. package/plugins/make-skill/skills/make-skill/assets/hooks.template.json +32 -0
  15. package/{templates → plugins/make-skill/skills/make-skill/assets}/marketplace.template.json +1 -0
  16. package/{templates → plugins/make-skill/skills/make-skill/assets}/plugin.template.json +1 -0
  17. package/plugins/make-skill/skills/make-skill/references/authoring.md +7 -0
  18. package/plugins/make-skill/skills/make-skill/references/claude-code-plugin.md +2 -2
  19. package/plugins/make-skill/skills/make-skill/references/distribution.md +19 -6
  20. package/plugins/make-skill/skills/make-skill/references/host-capabilities.md +218 -0
  21. package/plugins/make-skill/skills/make-skill/references/retrofit.md +114 -0
  22. package/plugins/make-skill/skills/make-skill/scripts/audit_skill.py +378 -0
  23. package/templates/README.md +0 -31
  24. /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 `/<name>`: idempotent — inspect state → repair
113
- missing pieces → status report → exactly ONE suggested next action. Detect
114
- mode, never ask. (Pattern: super-ux `/ux`.) **The skill IS that command** —
115
- a `commands/<name>.md` beside `skills/<name>/` registers `/<name>` twice; add
116
- a `commands/*.md` only under a DIFFERENT name, with a quoted `argument-hint`.
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` following the authoring rules — done. No
123
- repo, no versioning; loads next session. Mention Promote as the upgrade path.
162
+ `~/.claude/skills/<name>/SKILL.md` per the authoring rules — done. No repo, no
163
+ versioning; loads next session. Mention Promote as the upgrade path.
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, no marketplace, no install
128
- (`claude plugin init <name> --with hooks mcp` scaffolds it).
167
+ `<name>@skills-dir` next session (`claude plugin init <name> --with hooks mcp`
168
+ scaffolds it).
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
- **The 11-step sequence is in `references/distribution.md` → *First publish*.**
159
- Everything green BEFORE publishing, and done = five VERIFIED facts: repo + CI
160
- green, npm resolvable via npx, plugin installed, skills-CLI discovery working,
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 (`file:line` or command output) — never "looks fine".
167
-
168
- 1. **Spec floor** (`references/agent-skills-spec.md`): name charset + ≤64 +
169
- ==dir + no reserved word or angle bracket; description ≤1024, "Use when…",
170
- third person, EN and RU triggers; no front-matter key outside spec ∪ host
171
- extensions; body <500 lines / <5000 tokens; every bundled file one level
172
- deep, linked from the body with a load trigger, `## Contents` past 100 lines.
173
- 2. **Anthropic floor** if it ships as a plugin
174
- (`references/claude-code-plugin.md`): both `claude plugin validate <plugin
175
- dir|.> --strict` runs exit 0; `$schema` present; components at the plugin
176
- root, never inside `.claude-plugin/`; `claude plugin details <name>` token
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. For a PERSONAL skill, retrofit = items 1, 4,
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: **Claude Code plugin** (`marketplace add` → `install
217
- <name>@<name>`), **vercel skills CLI** (`npx skills add <owner>/<repo>`, 70+
218
- agents, reads `marketplace.json`), **npx** (`npx github:<owner>/<repo>`),
219
- **Cursor** (skills CLI `--agent cursor --global`, or `.cursor/rules/*.mdc`),
220
- **umbrella family repo** (`ssheleg/sshlg-skills`). Anthropic's own surfaces —
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
- **Read `references/distribution.md` before publishing, adding a channel, or
226
- auditing distribution.** Two rules survive without it: **one channel per agent**
227
- (never `claude-code` via the skills CLI when a plugin is installed), and **e2e
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: scripts read end to end, network calls
235
- and credentials grepped for, instructions checked for "ignore previous rules",
236
- hidden actions, or data routed outward. Highest-risk shape: a skill that fetches
237
- instructions from a URL — that content changes after your review. Same file for
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 its own trap list** — 2FA/EOTP, the name-similarity 403
270
- `npm view` can't predict, auth failures masked as 404 on PUT, read-replica lag
271
- after a first scoped publish, `npx` resolving locally inside the package's own
272
- repo. Fixes in `references/distribution.md` → **read it before any publish.**
280
+ - **npm publishing has a five-trap list** — 2FA/EOTP, a name-similarity 403 that
281
+ `npm view` cannot predict, auth failures masked as 404, read-replica lag, and
282
+ `npx` resolving locally inside the package's own repo. Each with its fix in
283
+ `references/distribution.md` → **read it before any publish.**
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
- - **Quote every `argument-hint`.** Bare `[a | b]` is a YAML flow sequence — one
279
- comma drops the whole front-matter block, leaving a command with no
280
- description and no warning.
281
- - **Never name a `commands/<x>.md` after a `skills/<x>/`** — same name, two
282
- components: the skill wins and the command is unreachable always-on cost
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: one channel per agent — and the shadow regrows.** A plugin
290
- install AND a plain `~/.claude/skills/<name>` copy = two listings, and the
291
- plain (usually STALE) one wins. `npx skills add|update … --global` recreates
292
- that path **even when `claude-code` was never targeted**, so the prune belongs
293
- in the update command: `npx skills update <name> --global --yes && rm -f
294
- ~/.claude/skills/<name>`.
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
+ }
@@ -9,6 +9,7 @@
9
9
  "plugins": [
10
10
  {
11
11
  "name": "<plugin-name>",
12
+ "displayName": "<Plugin Name>",
12
13
  "source": "./plugins/<plugin-name>",
13
14
  "description": "<what the plugin gives an agent>",
14
15
  "version": "0.1.0",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "<plugin-name>",
4
+ "displayName": "<Plugin Name>",
4
5
  "description": "<what the plugin gives an agent, in one sentence>",
5
6
  "version": "0.1.0",
6
7
  "author": {
@@ -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` fields
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
- │ └── skills/<skill>/SKILL.md + references/*.md (+ scripts/, assets/)
50
- │ (commands/*.md too — but never named after a skill)
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 what
67
- the installers touch. A skill is text an agent executes, so "review before
68
- installing" belongs in writing.
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