@ssheleg/make-skill 0.6.6 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,125 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.7.1 — 2026-07-31
4
+
5
+ Re-read the plugin reference against what the canon actually says, and against
6
+ what Claude Code 2.1.212 actually does. Six corrections, two of them places
7
+ where the docs and the binary disagree.
8
+
9
+ ### Fixed
10
+ - **`claude plugin validate` validates the manifest, not front matter.** The
11
+ docs' troubleshooting table says it checks "`plugin.json`, skill/agent/command
12
+ frontmatter, and `hooks/hooks.json`"; a `SKILL.md` carrying an invented
13
+ front-matter key passes `--strict` untouched. The canon said this gate
14
+ "catches a class your validator cannot see" — true for manifests, misleading
15
+ for front matter, which is exactly where the house validator earns its place.
16
+ - **`claude plugin update <bare-name>` does not work**, though the docs list a
17
+ bare name as accepted: it answers `Plugin "make-skill" not found` **and exits
18
+ 0**, so a release script sees success and ships nothing. The reference now
19
+ records both the documented form and the observed one.
20
+ - **`skills` adds to the default scan — except at a marketplace root.** When a
21
+ plugin entry's `source` resolves to the marketplace root, the listed
22
+ subdirectories replace the default `skills/` scan (and if none exist, the
23
+ default runs after all). The reference stated the rule without its exception.
24
+ - **"Every component directory sits at the plugin root" was too absolute.** That
25
+ is the default; a manifest path field may point anywhere inside the plugin,
26
+ and since 2.1.140 Claude Code warns when a manifest key leaves a default
27
+ folder unscanned. Only `.claude-plugin/` is genuinely off-limits.
28
+ - **`allowed-tools`: Claude Code is looser than the spec.** It accepts a
29
+ space- or comma-separated string or a YAML list; the open standard accepts
30
+ only the space-separated string. Canon, Cursor rule and the validator's own
31
+ error message now say which form travels and why, instead of calling a legal
32
+ Claude Code skill invalid.
33
+ - **npm plugin sources** resolve to `unknown` only when no `version` is set
34
+ anywhere — the entry or manifest version still wins.
35
+
36
+ ### Changed
37
+ - The stray-`SKILL.md` rule is scoped honestly: a plugin-root `SKILL.md` is a
38
+ legal single-skill plugin in Claude Code (2.1.142+). It is multi-channel
39
+ distribution — the skills CLI shipping every `SKILL.md` in the tree — that
40
+ makes the rule, and the validator says so.
41
+ - Version pinning: omitting `version` from both manifests is legal and hands
42
+ updates to the git SHA. This canon pins and bumps by choice, which the gotcha
43
+ now states rather than implies.
44
+
45
+ ### Added
46
+ - **LSP and monitor fields in `references/claude-code-plugin.md`.** Its own load
47
+ condition promised "adding agents / hooks / MCP / LSP / monitors", and the
48
+ file had a table row for each and nothing else: now the required and optional
49
+ LSP keys with the 2.1.205 `restartOnCrash` / `shutdownTimeout` trap and the
50
+ same-extension race, and the monitor entry schema with its trust,
51
+ `${user_config.*}` rejection and session-lifetime rules. Plus the missing
52
+ `themes/` row.
53
+
54
+ ## v0.7.0 — 2026-07-30
55
+
56
+ Conformance to Anthropic's own plugin reference
57
+ (<https://code.claude.com/docs/en/plugins-reference>), checked with Anthropic's
58
+ own checker. The canon already matched the Agent Skills open standard; the
59
+ Claude Code layer on top of it — manifest schemas, component layout, path
60
+ variables, the CLI — was folk knowledge until now. Everything stays
61
+ multi-agent: the host layer is documented as host-specific and never
62
+ load-bearing for skills that also run on Cursor, Codex, or the skills CLI.
63
+
64
+ v0.6.5 wired the upstream gate into CI and fixed the two failures it caught;
65
+ this release is the rulebook behind it — so the next repo passes `--strict`
66
+ before anyone runs it, not after.
67
+
68
+ ### Added
69
+ - **`references/claude-code-plugin.md`** — the Anthropic layer: full
70
+ `plugin.json` and `marketplace.json` schemas, plugin sources, strict mode,
71
+ reserved marketplace names, component locations, skill front-matter host
72
+ extensions, plugin-agent restrictions, scoped MCP hook names,
73
+ `${CLAUDE_PLUGIN_ROOT}` / `${CLAUDE_PLUGIN_DATA}` / `${CLAUDE_SKILL_DIR}`,
74
+ cache and symlink behavior, skills-directory plugins, the whole
75
+ `claude plugin` CLI, and a conformance checklist. Dated against Claude Code
76
+ 2.1.212.
77
+ - `$schema` in both manifests (schemastore), so the next edit gets autocomplete
78
+ and inline validation.
79
+ - The upstream gate now also covers the **retrofit audit** and the **release
80
+ checklist**, and CI runs it as **its own job** so an upstream CLI outage
81
+ cannot mask a house-validator failure.
82
+ - Validator rules, each with a negative self-test: recognized-fields-only for
83
+ both manifests, `$schema` present, reserved marketplace names, `./`-relative
84
+ component paths that never escape the plugin root, source directory name ==
85
+ plugin name, and nothing but the manifest inside `.claude-plugin/`.
86
+ - Skill front-matter now accepts the **Claude Code extension keys**
87
+ (`when_to_use`, `argument-hint`, `arguments`, `disable-model-invocation`,
88
+ `user-invocable`, `disallowed-tools`, `model`, `effort`, `context`, `agent`,
89
+ `background`, `hooks`, `paths`, `shell`) alongside the spec set. Previously a
90
+ conformant Claude Code skill failed this repo's own audit.
91
+ - `templates/plugin.template.json` and `templates/marketplace.template.json` —
92
+ annotated, schema-linked skeletons for the two manifests.
93
+ - Personal workflow: a `~/.claude/skills/<name>/` folder with
94
+ `.claude-plugin/plugin.json` loads as `<name>@skills-dir` with hooks, agents,
95
+ and MCP servers — no marketplace, no install step (`claude plugin init`).
96
+ - Gotchas: unknown manifest fields load fine and mean nothing (only `--strict`
97
+ surfaces them); a pinned `version` you forget to bump freezes every user,
98
+ because the version is the update cache key.
99
+ - `displayName` in both manifests, and the v0.6.6 canon on `claude plugin
100
+ details`, folded in from the parallel release.
101
+
102
+ ### Removed
103
+ - **`plugins/make-skill/commands/make-skill.md`.** `claude plugin details`
104
+ reported `Skills (2) make-skill, make-skill`: a command and a skill of the
105
+ same name register `/make-skill` twice, the skill wins, and the command was
106
+ ~100 always-on tokens per session for something unreachable. Its workflow
107
+ detection now lives in the skill body, where it was always going to be read.
108
+ The validator rejects any `commands/<x>.md` that collides with `skills/<x>/`
109
+ and any unquoted `argument-hint`, with negative tests for both; the npx
110
+ installer and `install.sh` no longer write `~/.claude/commands/make-skill.md`
111
+ (an existing copy from an older install is harmless and can be deleted).
112
+
113
+ ### Changed
114
+ - **Progressive disclosure applied to the body itself.** The four installer
115
+ implementation traps (piped-stdin readline, raw-mode pickers, ANSI literals,
116
+ Python 3.9 annotation drift) and the 11-step **First publish** sequence moved
117
+ out of `SKILL.md` into `references/distribution.md`, each under a stated load
118
+ condition: they matter only while writing the CLI or actually publishing,
119
+ while the body's token budget is paid by every session. `SKILL.md` ends this
120
+ release under both caps — 347 lines, ~5k tokens — despite everything added
121
+ here and in v0.6.2–v0.6.5.
122
+
3
123
  ## v0.6.6 — 2026-07-30
4
124
 
5
125
  ### Added
package/README.md CHANGED
@@ -60,6 +60,16 @@ directory, `description` caps at 1024 characters, the body should stay under 500
60
60
  lines and 5000 tokens. Local conventions that merely *feel* right drift from those
61
61
  without anyone noticing; here they're checked.
62
62
 
63
+ **Plugins Anthropic's own tooling accepts.** The
64
+ [Claude Code plugin reference](https://code.claude.com/docs/en/plugins-reference)
65
+ is a second rulebook on top of the standard: which fields `plugin.json` and
66
+ `marketplace.json` actually recognize, where components must sit, which paths
67
+ survive installation. Unknown fields load silently and do nothing, so the repo is
68
+ checked with Anthropic's own gate — `claude plugin validate <path> --strict` on
69
+ both manifests, in CI as its own job. That check is what caught this repo's own
70
+ `marketplace.json` shipping `homepage` and `repository` at a level where Claude
71
+ Code ignores them.
72
+
63
73
  **A validator that can fail.** `test/validate.py` (Python stdlib only, no deps)
64
74
  checks spec rules, version sync across every manifest, front-matter on commands
65
75
  and Cursor rules, link integrity, and the traps below. CI runs it plus **negative
@@ -95,12 +105,15 @@ agent opens only when the situation calls for them:
95
105
  | Reference | Covers |
96
106
  |---|---|
97
107
  | `agent-skills-spec.md` | the open standard — field limits, optional front-matter, token budgets, the description trigger-eval loop |
108
+ | `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 |
98
109
  | `distribution.md` | every install channel, exact CLI flags, npm publishing traps |
99
110
  | `mcp.md` | [MCP](https://modelcontextprotocol.io) — skill vs server, primitives and methods, transports, consent and untrusted-output rules |
100
111
  | `a2a.md` | [A2A](https://a2a-protocol.org) — Agent Cards, task lifecycle, method mapping, v0.x→1.0 wire drift |
101
112
 
102
- Plus `templates/SKILL.template.md`, a spec-legal skeleton with the limits written
103
- into it.
113
+ Plus three skeletons in `templates/`: `SKILL.template.md` with the spec limits
114
+ written into it, and `plugin.template.json` / `marketplace.template.json`, which
115
+ carry only fields Claude Code recognizes so a seeded repo passes
116
+ `claude plugin validate --strict` on day one.
104
117
 
105
118
  ## Install
106
119
 
@@ -177,12 +190,11 @@ The skill itself is plain Markdown and needs nothing.
177
190
  .claude-plugin/marketplace.json
178
191
  plugins/make-skill/
179
192
  ├── .claude-plugin/plugin.json
180
- ├── commands/make-skill.md # the /make-skill entry point
181
- └── skills/make-skill/
193
+ └── skills/make-skill/ # the skill IS /make-skill — no command file
182
194
  ├── SKILL.md # the canon, < 500 lines by rule
183
195
  └── references/*.md # loaded on demand
184
196
  cursor/rules/make-skill.mdc # self-contained Cursor rule
185
- templates/SKILL.template.md # spec-legal skeleton
197
+ templates/ # SKILL.template.md + the two manifest skeletons
186
198
  bin/make-skill.js + package.json # zero-dep npx installer
187
199
  test/validate.py # structural validator
188
200
  .github/workflows/{validate,release}.yml
package/bin/make-skill.js CHANGED
@@ -2,8 +2,9 @@
2
2
  /*
3
3
  * make-skill installer CLI.
4
4
  *
5
- * Installs the make-skill skill into ~/.claude/skills/make-skill and the
6
- * /make-skill slash command into ~/.claude/commands/ (same layout as install.sh).
5
+ * Installs the make-skill skill into ~/.claude/skills/make-skill, which is what
6
+ * provides /make-skill (same layout as install.sh). No separate command file:
7
+ * a command sharing a skill's name registers the same slash command twice.
7
8
  * Idempotent: existing installs are skipped unless --force. Zero dependencies.
8
9
  *
9
10
  * For other agents (Cursor, Codex, 70+) use: npx skills add ssheleg/make-skill
@@ -29,7 +30,7 @@ function usage() {
29
30
  console.log(`make-skill installer v${version()}
30
31
 
31
32
  Usage:
32
- npx @ssheleg/make-skill [--force] install skill + /make-skill command into
33
+ npx @ssheleg/make-skill [--force] install the make-skill skill into
33
34
  ~/.claude (skip existing unless --force)
34
35
  npx @ssheleg/make-skill --version
35
36
  npx @ssheleg/make-skill --help
@@ -81,29 +82,19 @@ function main(argv) {
81
82
  }
82
83
 
83
84
  const skillSrc = path.join(ROOT, 'plugins/make-skill/skills/make-skill');
84
- const cmdSrc = path.join(ROOT, 'plugins/make-skill/commands/make-skill.md');
85
- for (const [p, what] of [[skillSrc, 'skill sources'], [cmdSrc, 'command source']]) {
86
- if (!fs.existsSync(p)) {
87
- console.error(`error: ${what} missing at ${p} — corrupted package?`);
88
- return 1;
89
- }
85
+ if (!fs.existsSync(skillSrc)) {
86
+ console.error(`error: skill sources missing at ${skillSrc} — corrupted package?`);
87
+ return 1;
90
88
  }
91
89
 
92
90
  const home = os.homedir();
93
91
  installOne(
94
- 'make-skill skill ',
92
+ 'make-skill skill',
95
93
  skillSrc,
96
94
  path.join(home, '.claude', 'skills', 'make-skill'),
97
95
  true,
98
96
  force
99
97
  );
100
- installOne(
101
- '/make-skill command',
102
- cmdSrc,
103
- path.join(home, '.claude', 'commands', 'make-skill.md'),
104
- false,
105
- force
106
- );
107
98
  return 0;
108
99
  }
109
100
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "make-skill: create, retrofit, audit, or publish an agent skill / plugin the proven ssheleg way — the Agent Skills open standard (front-matter limits, progressive-disclosure budgets), marketplace repo layout, four-way version sync, validator + CI, multi-channel distribution (Claude Code plugin, skills CLI, npx, Cursor), npm gotchas, and the MCP / A2A rules for protocol-connected skills. Apply when creating a new skill, upgrading one to standard, checking one against the spec, or wrapping one into a plugin."
2
+ description: "make-skill: create, retrofit, audit, or publish an agent skill / plugin the proven ssheleg way — the Agent Skills open standard (front-matter limits, progressive-disclosure budgets), the Claude Code plugin reference (manifest schemas, component layout, claude plugin validate --strict), marketplace repo layout, four-way version sync, validator + CI, multi-channel distribution (Claude Code plugin, skills CLI, npx, Cursor), npm gotchas, and the MCP / A2A rules for protocol-connected skills. Apply when creating a new skill, upgrading one to standard, checking one against the spec, or wrapping one into a plugin."
3
3
  alwaysApply: false
4
4
  ---
5
5
 
@@ -15,9 +15,14 @@ every contract inline and uses **absolute URLs only — never a relative link**
15
15
 
16
16
  - `name`: 1–64 chars, `a-z0-9` + single internal hyphens, == directory name.
17
17
  - `description`: ≤1024 chars (that cap is on the field, not the whole front-matter).
18
- - Only these front-matter keys exist: `name`, `description`, `license`,
18
+ - Portable front-matter keys: `name`, `description`, `license`,
19
19
  `compatibility` (≤500), `metadata` (string→string map), `allowed-tools`
20
- (space-separated string, experimental).
20
+ (space-separated string — Claude Code also takes a comma-list or YAML list, but
21
+ only the space form is portable). Claude Code additionally reads
22
+ `when_to_use`, `argument-hint`, `arguments`, `disable-model-invocation`,
23
+ `user-invocable`, `disallowed-tools`, `model`, `effort`, `context`, `agent`,
24
+ `background`, `hooks`, `paths`, `shell` — legal, ignored elsewhere, never
25
+ load-bearing. Anything outside both sets is a typo.
21
26
  - Body < 500 lines and < 5000 tokens. Overflow goes to `references/` (docs),
22
27
  `scripts/` (code), `assets/` (templates) INSIDE the skill dir, one level deep,
23
28
  each with a stated load trigger ("read X when Y"). Gotchas stay in SKILL.md.
@@ -39,8 +44,8 @@ every contract inline and uses **absolute URLs only — never a relative link**
39
44
  ```
40
45
  .claude-plugin/marketplace.json # plugins[0].source: ./plugins/<name>
41
46
  plugins/<name>/.claude-plugin/plugin.json
42
- plugins/<name>/commands/*.md
43
47
  plugins/<name>/skills/<skill>/SKILL.md (+ references/, scripts/, assets/)
48
+ plugins/<name>/commands/*.md # only under a name no skill uses
44
49
  cursor/rules/*.mdc # self-contained, NO relative links
45
50
  templates/*.md # skeletons — NEVER name one SKILL.md
46
51
  bin/<name>.js + package.json # zero-dep npx installer
@@ -51,6 +56,36 @@ CONTRIBUTING.md + SECURITY.md # required once the repo is public
51
56
  docs/superpowers/{specs,plans}/
52
57
  ```
53
58
 
59
+ ## Claude Code plugin conformance (Anthropic's own reference)
60
+
61
+ <https://code.claude.com/docs/en/plugins-reference> — the gate is Anthropic's
62
+ checker, not a house opinion:
63
+
64
+ - `claude plugin validate ./plugins/<name> --strict` **and**
65
+ `claude plugin validate . --strict` (marketplace) must both exit 0. Unknown
66
+ fields are warnings that `--strict` turns into errors; wrong types always fail.
67
+ It runs offline, so it belongs in CI.
68
+ - `$schema` in both manifests:
69
+ `https://json.schemastore.org/claude-code-plugin-manifest.json` and
70
+ `https://json.schemastore.org/claude-code-marketplace.json`.
71
+ - Marketplace level takes ONLY `name`, `owner`, `plugins`, `$schema`,
72
+ `description`, `version`, `metadata`, `allowCrossMarketplaceDependenciesOn`,
73
+ `renames`. `homepage`/`repository`/`license` are plugin-entry fields; the
74
+ project URL goes in `owner.url`. Plugin entry needs `name` + `source`.
75
+ - Only `plugin.json` lives in `.claude-plugin/`; `skills/`, `commands/`,
76
+ `agents/`, `hooks/`, `.mcp.json` sit at the plugin ROOT. Buried components
77
+ load as nothing and the plugin still appears to work.
78
+ - Every component path is relative and starts `./`; nothing outside the plugin
79
+ root survives install (the plugin is copied into a version cache).
80
+ `skills` ADDS to the default scan, `commands`/`agents`/`workflows`/
81
+ `outputStyles` REPLACE it.
82
+ - A pinned `version` is the update cache key — bump it or nobody ever receives
83
+ the change. Marketplace names like `agent-skills`/`anthropic-*` are reserved
84
+ and stop loading.
85
+ - Bundled scripts resolve through `${CLAUDE_PLUGIN_ROOT}`, state through
86
+ `${CLAUDE_PLUGIN_DATA}` — both Claude-Code-only, so keep relative paths as the
87
+ portable contract.
88
+
54
89
  ## Hard rules
55
90
 
56
91
  - **Version sync:** marketplace.json, plugin.json, package.json (if npm), and the
@@ -64,6 +99,9 @@ docs/superpowers/{specs,plans}/
64
99
  - **One channel per agent:** don't run a plugin AND a plain `~/.claude/skills` copy
65
100
  on the same install — the stale plain copy shadows the plugin.
66
101
  - **npm name first:** `npm view <name>` (E404 = free). **npm publish = human 2FA.**
102
+ - **Commands ARE skills now:** a `commands/<x>.md` beside `skills/<x>/` registers
103
+ `/<x>` twice — the skill wins, the command is unreachable always-on cost. Check
104
+ with `claude plugin details <name>@<marketplace>`; quote every `argument-hint`.
67
105
  - **Cursor .mdc:** embed contracts inline (files get copied into foreign projects).
68
106
  - **e2e npx from a NON-repo cwd** (inside the repo it resolves the local package →
69
107
  false "command not found").
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ssheleg/make-skill",
3
- "version": "0.6.6",
4
- "description": "Create, retrofit, audit, and ship agent skills & Claude Code plugins the proven ssheleg way — conformance to the Agent Skills open standard (front-matter limits, progressive-disclosure budgets), marketplace repo layout, version sync, validator + CI, multi-channel distribution (plugin, vercel skills CLI, npx, Cursor), npm gotchas, and MCP / A2A rules for protocol-connected skills. This package is the installer CLI.",
3
+ "version": "0.7.1",
4
+ "description": "Create, retrofit, audit, and ship agent skills & Claude Code plugins the proven ssheleg way — conformance to the Agent Skills open standard (front-matter limits, progressive-disclosure budgets) and 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, and MCP / A2A rules for protocol-connected skills. This package is the installer CLI.",
5
5
  "keywords": [
6
6
  "skill",
7
7
  "plugin",
@@ -1,8 +1,9 @@
1
1
  {
2
+ "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
2
3
  "name": "make-skill",
3
4
  "displayName": "Make Skill",
4
- "description": "Create, retrofit, audit, and ship agent skills & Claude Code plugins the proven ssheleg way: conformance to the Agent Skills open standard, marketplace repo layout, version sync, validator + CI, multi-channel distribution (plugin, vercel skills CLI, npx, Cursor), npm gotchas, end-to-end first publish, plus MCP / A2A references for protocol-connected skills.",
5
- "version": "0.6.6",
5
+ "description": "Create, retrofit, audit, and ship agent skills & Claude Code plugins the proven ssheleg way: conformance to the Agent Skills open standard 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, plus MCP / A2A references for protocol-connected skills.",
6
+ "version": "0.7.1",
6
7
  "author": {
7
8
  "name": "ssheleg"
8
9
  },