@ssheleg/make-skill 0.6.5 → 0.7.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 +82 -0
- package/README.md +17 -5
- package/bin/make-skill.js +8 -17
- package/cursor/rules/make-skill.mdc +41 -4
- package/package.json +2 -2
- package/plugins/make-skill/.claude-plugin/plugin.json +4 -2
- package/plugins/make-skill/skills/make-skill/SKILL.md +182 -209
- package/plugins/make-skill/skills/make-skill/references/claude-code-plugin.md +280 -0
- package/plugins/make-skill/skills/make-skill/references/distribution.md +52 -0
- package/templates/README.md +10 -0
- package/templates/SKILL.template.md +6 -0
- package/templates/marketplace.template.json +27 -0
- package/templates/plugin.template.json +16 -0
- package/plugins/make-skill/commands/make-skill.md +0 -19
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,87 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v0.7.0 — 2026-07-30
|
|
4
|
+
|
|
5
|
+
Conformance to Anthropic's own plugin reference
|
|
6
|
+
(<https://code.claude.com/docs/en/plugins-reference>), checked with Anthropic's
|
|
7
|
+
own checker. The canon already matched the Agent Skills open standard; the
|
|
8
|
+
Claude Code layer on top of it — manifest schemas, component layout, path
|
|
9
|
+
variables, the CLI — was folk knowledge until now. Everything stays
|
|
10
|
+
multi-agent: the host layer is documented as host-specific and never
|
|
11
|
+
load-bearing for skills that also run on Cursor, Codex, or the skills CLI.
|
|
12
|
+
|
|
13
|
+
v0.6.5 wired the upstream gate into CI and fixed the two failures it caught;
|
|
14
|
+
this release is the rulebook behind it — so the next repo passes `--strict`
|
|
15
|
+
before anyone runs it, not after.
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
- **`references/claude-code-plugin.md`** — the Anthropic layer: full
|
|
19
|
+
`plugin.json` and `marketplace.json` schemas, plugin sources, strict mode,
|
|
20
|
+
reserved marketplace names, component locations, skill front-matter host
|
|
21
|
+
extensions, plugin-agent restrictions, scoped MCP hook names,
|
|
22
|
+
`${CLAUDE_PLUGIN_ROOT}` / `${CLAUDE_PLUGIN_DATA}` / `${CLAUDE_SKILL_DIR}`,
|
|
23
|
+
cache and symlink behavior, skills-directory plugins, the whole
|
|
24
|
+
`claude plugin` CLI, and a conformance checklist. Dated against Claude Code
|
|
25
|
+
2.1.212.
|
|
26
|
+
- `$schema` in both manifests (schemastore), so the next edit gets autocomplete
|
|
27
|
+
and inline validation.
|
|
28
|
+
- The upstream gate now also covers the **retrofit audit** and the **release
|
|
29
|
+
checklist**, and CI runs it as **its own job** so an upstream CLI outage
|
|
30
|
+
cannot mask a house-validator failure.
|
|
31
|
+
- Validator rules, each with a negative self-test: recognized-fields-only for
|
|
32
|
+
both manifests, `$schema` present, reserved marketplace names, `./`-relative
|
|
33
|
+
component paths that never escape the plugin root, source directory name ==
|
|
34
|
+
plugin name, and nothing but the manifest inside `.claude-plugin/`.
|
|
35
|
+
- Skill front-matter now accepts the **Claude Code extension keys**
|
|
36
|
+
(`when_to_use`, `argument-hint`, `arguments`, `disable-model-invocation`,
|
|
37
|
+
`user-invocable`, `disallowed-tools`, `model`, `effort`, `context`, `agent`,
|
|
38
|
+
`background`, `hooks`, `paths`, `shell`) alongside the spec set. Previously a
|
|
39
|
+
conformant Claude Code skill failed this repo's own audit.
|
|
40
|
+
- `templates/plugin.template.json` and `templates/marketplace.template.json` —
|
|
41
|
+
annotated, schema-linked skeletons for the two manifests.
|
|
42
|
+
- Personal workflow: a `~/.claude/skills/<name>/` folder with
|
|
43
|
+
`.claude-plugin/plugin.json` loads as `<name>@skills-dir` with hooks, agents,
|
|
44
|
+
and MCP servers — no marketplace, no install step (`claude plugin init`).
|
|
45
|
+
- Gotchas: unknown manifest fields load fine and mean nothing (only `--strict`
|
|
46
|
+
surfaces them); a pinned `version` you forget to bump freezes every user,
|
|
47
|
+
because the version is the update cache key.
|
|
48
|
+
- `displayName` in both manifests, and the v0.6.6 canon on `claude plugin
|
|
49
|
+
details`, folded in from the parallel release.
|
|
50
|
+
|
|
51
|
+
### Removed
|
|
52
|
+
- **`plugins/make-skill/commands/make-skill.md`.** `claude plugin details`
|
|
53
|
+
reported `Skills (2) make-skill, make-skill`: a command and a skill of the
|
|
54
|
+
same name register `/make-skill` twice, the skill wins, and the command was
|
|
55
|
+
~100 always-on tokens per session for something unreachable. Its workflow
|
|
56
|
+
detection now lives in the skill body, where it was always going to be read.
|
|
57
|
+
The validator rejects any `commands/<x>.md` that collides with `skills/<x>/`
|
|
58
|
+
and any unquoted `argument-hint`, with negative tests for both; the npx
|
|
59
|
+
installer and `install.sh` no longer write `~/.claude/commands/make-skill.md`
|
|
60
|
+
(an existing copy from an older install is harmless and can be deleted).
|
|
61
|
+
|
|
62
|
+
### Changed
|
|
63
|
+
- **Progressive disclosure applied to the body itself.** The four installer
|
|
64
|
+
implementation traps (piped-stdin readline, raw-mode pickers, ANSI literals,
|
|
65
|
+
Python 3.9 annotation drift) and the 11-step **First publish** sequence moved
|
|
66
|
+
out of `SKILL.md` into `references/distribution.md`, each under a stated load
|
|
67
|
+
condition: they matter only while writing the CLI or actually publishing,
|
|
68
|
+
while the body's token budget is paid by every session. `SKILL.md` ends this
|
|
69
|
+
release under both caps — 347 lines, ~5k tokens — despite everything added
|
|
70
|
+
here and in v0.6.2–v0.6.5.
|
|
71
|
+
|
|
72
|
+
## v0.6.6 — 2026-07-30
|
|
73
|
+
|
|
74
|
+
### Added
|
|
75
|
+
- **`claude plugin details` joins the canon as the check no manifest performs**:
|
|
76
|
+
it prints what Claude Code believes the plugin contains and the always-on token
|
|
77
|
+
cost per component. Two defects are visible only there — a component listed
|
|
78
|
+
**twice**, because a `commands/<x>.md` and a `skills/<x>/SKILL.md` both claim
|
|
79
|
+
`/<x>` now that custom commands are merged into skills, and a description whose
|
|
80
|
+
always-on cost is worth trimming.
|
|
81
|
+
- **`displayName` in both manifests** is now canon: `name` is kebab-case because
|
|
82
|
+
it namespaces components, and the `/plugin` picker falls back to it, so a
|
|
83
|
+
listing reads `my-cool-plugin` until the field is set.
|
|
84
|
+
|
|
3
85
|
## v0.6.5 — 2026-07-30
|
|
4
86
|
|
|
5
87
|
### 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
|
|
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
|
-
|
|
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
|
|
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
|
|
6
|
-
* /make-skill
|
|
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
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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,13 @@ 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
|
-
-
|
|
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, experimental). Claude Code additionally reads
|
|
21
|
+
`when_to_use`, `argument-hint`, `arguments`, `disable-model-invocation`,
|
|
22
|
+
`user-invocable`, `disallowed-tools`, `model`, `effort`, `context`, `agent`,
|
|
23
|
+
`background`, `hooks`, `paths`, `shell` — legal, ignored elsewhere, never
|
|
24
|
+
load-bearing. Anything outside both sets is a typo.
|
|
21
25
|
- Body < 500 lines and < 5000 tokens. Overflow goes to `references/` (docs),
|
|
22
26
|
`scripts/` (code), `assets/` (templates) INSIDE the skill dir, one level deep,
|
|
23
27
|
each with a stated load trigger ("read X when Y"). Gotchas stay in SKILL.md.
|
|
@@ -39,8 +43,8 @@ every contract inline and uses **absolute URLs only — never a relative link**
|
|
|
39
43
|
```
|
|
40
44
|
.claude-plugin/marketplace.json # plugins[0].source: ./plugins/<name>
|
|
41
45
|
plugins/<name>/.claude-plugin/plugin.json
|
|
42
|
-
plugins/<name>/commands/*.md
|
|
43
46
|
plugins/<name>/skills/<skill>/SKILL.md (+ references/, scripts/, assets/)
|
|
47
|
+
plugins/<name>/commands/*.md # only under a name no skill uses
|
|
44
48
|
cursor/rules/*.mdc # self-contained, NO relative links
|
|
45
49
|
templates/*.md # skeletons — NEVER name one SKILL.md
|
|
46
50
|
bin/<name>.js + package.json # zero-dep npx installer
|
|
@@ -51,6 +55,36 @@ CONTRIBUTING.md + SECURITY.md # required once the repo is public
|
|
|
51
55
|
docs/superpowers/{specs,plans}/
|
|
52
56
|
```
|
|
53
57
|
|
|
58
|
+
## Claude Code plugin conformance (Anthropic's own reference)
|
|
59
|
+
|
|
60
|
+
<https://code.claude.com/docs/en/plugins-reference> — the gate is Anthropic's
|
|
61
|
+
checker, not a house opinion:
|
|
62
|
+
|
|
63
|
+
- `claude plugin validate ./plugins/<name> --strict` **and**
|
|
64
|
+
`claude plugin validate . --strict` (marketplace) must both exit 0. Unknown
|
|
65
|
+
fields are warnings that `--strict` turns into errors; wrong types always fail.
|
|
66
|
+
It runs offline, so it belongs in CI.
|
|
67
|
+
- `$schema` in both manifests:
|
|
68
|
+
`https://json.schemastore.org/claude-code-plugin-manifest.json` and
|
|
69
|
+
`https://json.schemastore.org/claude-code-marketplace.json`.
|
|
70
|
+
- Marketplace level takes ONLY `name`, `owner`, `plugins`, `$schema`,
|
|
71
|
+
`description`, `version`, `metadata`, `allowCrossMarketplaceDependenciesOn`,
|
|
72
|
+
`renames`. `homepage`/`repository`/`license` are plugin-entry fields; the
|
|
73
|
+
project URL goes in `owner.url`. Plugin entry needs `name` + `source`.
|
|
74
|
+
- Only `plugin.json` lives in `.claude-plugin/`; `skills/`, `commands/`,
|
|
75
|
+
`agents/`, `hooks/`, `.mcp.json` sit at the plugin ROOT. Buried components
|
|
76
|
+
load as nothing and the plugin still appears to work.
|
|
77
|
+
- Every component path is relative and starts `./`; nothing outside the plugin
|
|
78
|
+
root survives install (the plugin is copied into a version cache).
|
|
79
|
+
`skills` ADDS to the default scan, `commands`/`agents`/`workflows`/
|
|
80
|
+
`outputStyles` REPLACE it.
|
|
81
|
+
- A pinned `version` is the update cache key — bump it or nobody ever receives
|
|
82
|
+
the change. Marketplace names like `agent-skills`/`anthropic-*` are reserved
|
|
83
|
+
and stop loading.
|
|
84
|
+
- Bundled scripts resolve through `${CLAUDE_PLUGIN_ROOT}`, state through
|
|
85
|
+
`${CLAUDE_PLUGIN_DATA}` — both Claude-Code-only, so keep relative paths as the
|
|
86
|
+
portable contract.
|
|
87
|
+
|
|
54
88
|
## Hard rules
|
|
55
89
|
|
|
56
90
|
- **Version sync:** marketplace.json, plugin.json, package.json (if npm), and the
|
|
@@ -64,6 +98,9 @@ docs/superpowers/{specs,plans}/
|
|
|
64
98
|
- **One channel per agent:** don't run a plugin AND a plain `~/.claude/skills` copy
|
|
65
99
|
on the same install — the stale plain copy shadows the plugin.
|
|
66
100
|
- **npm name first:** `npm view <name>` (E404 = free). **npm publish = human 2FA.**
|
|
101
|
+
- **Commands ARE skills now:** a `commands/<x>.md` beside `skills/<x>/` registers
|
|
102
|
+
`/<x>` twice — the skill wins, the command is unreachable always-on cost. Check
|
|
103
|
+
with `claude plugin details <name>@<marketplace>`; quote every `argument-hint`.
|
|
67
104
|
- **Cursor .mdc:** embed contracts inline (files get copied into foreign projects).
|
|
68
105
|
- **e2e npx from a NON-repo cwd** (inside the repo it resolves the local package →
|
|
69
106
|
false "command not found").
|
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 — 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.0",
|
|
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,7 +1,9 @@
|
|
|
1
1
|
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
2
3
|
"name": "make-skill",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
4
|
+
"displayName": "Make Skill",
|
|
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.0",
|
|
5
7
|
"author": {
|
|
6
8
|
"name": "ssheleg"
|
|
7
9
|
},
|