@ssheleg/make-skill 0.5.1 → 0.6.4

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,118 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.6.4 — 2026-07-30
4
+
5
+ ### Changed
6
+ - **Publishing to npm is no longer taught as a permanent human step.** The canon
7
+ said 2FA makes non-interactive publishing impossible and to plan the manual
8
+ step; that is only true of an interactive publish and a classic token. Arming
9
+ CI publishing is now step 9 of the first publish, and the definition of done
10
+ gained a fifth fact: *the next tag publishes without a human*.
11
+ - **`references/distribution.md` §3** carries both auth routes — npm trusted
12
+ publishing (OIDC, no credential at all: npm >= 11.5.1, Node >= 22.14,
13
+ `id-token: write`, the workflow filename registered on npmjs.com) and a
14
+ granular automation token in `NPM_TOKEN` — and says to write the workflow so
15
+ both work, which makes adopting OIDC later a secret deletion rather than a CI
16
+ edit.
17
+ - Three properties the publish job needs, each of which is a red build if
18
+ missing: skip a version already on the registry (publishing over one is a hard
19
+ 403), a `workflow_dispatch` input naming an existing tag (a dispatch runs the
20
+ workflow file as of the ref it is dispatched on, so an old tag can never gain
21
+ a new job), and polling `npm view` afterwards, because published is a claim
22
+ until the registry serves it.
23
+ - The release-automation section is no longer marked *optional*, with the
24
+ measurement that argues it: six of this family's seven packages were behind
25
+ their own tags on 2026-07-30, one by three releases.
26
+
27
+ ## v0.6.3 — 2026-07-30
28
+
29
+ ### Added
30
+ - **Declare the licence in BOTH manifests — now part of the spec floor.** An
31
+ SPDX id belongs in the SKILL.md front matter *and* in the `marketplace.json`
32
+ plugin entry (a documented field there too). A `LICENSE` file in the repo root
33
+ reaches neither the plugin listing nor an installed skill. This gap was found
34
+ across all six repos of this family on the same day, and it stayed open
35
+ precisely because this checklist never asked for it: both fields are optional,
36
+ so nothing ever errored.
37
+
38
+ ### Changed
39
+ - `license: MIT` declared in this repo's own two manifests, which is where the
40
+ rule should have been demonstrated first.
41
+
42
+ ## v0.6.2 — 2026-07-30
43
+
44
+ A family member's release did not end where the skill said it ended. Publishing
45
+ to npm left the umbrella pin pointing at the previous version, so the launcher
46
+ kept advertising — and `update` kept installing — the release before it, with
47
+ nothing in either repo to reveal the gap.
48
+
49
+ ### Added
50
+ - **First-publish step 10** (`SKILL.md`): a skill that belongs to a family is
51
+ not released until the umbrella's `skills.json` pin moves and the umbrella is
52
+ released, verified with `npx --yes sshlg-skills@latest list`.
53
+ - **`references/distribution.md` §5** — the same rule with the incident that
54
+ produced it (`agent-sync` 1.3.4 on npm while `list` still said 1.3.3).
55
+
56
+ ### Changed
57
+ - README — family list and the three family commands; `CONTRIBUTING.md`.
58
+
59
+ ## v0.6.1 — 2026-07-28
60
+
61
+ Open-source hygiene pass — the repo is public, so the files a first-time
62
+ contributor looks for now exist.
63
+
64
+ ### Added
65
+ - `CODE_OF_CONDUCT.md`, issue forms for bugs and ideas, and a pull-request
66
+ template carrying this repo's actual checks (`test/validate.py`, `bash -n
67
+ install.sh`).
68
+ - US spelling in the changelog.
69
+
70
+ ## v0.6.0 — 2026-07-28
71
+
72
+ Production pass for a public repository: the README now explains the project
73
+ before it explains its own conventions, contributors get an entry point, and the
74
+ last inaccuracies found by reading every file end to end are gone.
75
+
76
+ ### Added
77
+ - **`CONTRIBUTING.md`** — what belongs in the canon (evidence, not advice), the
78
+ offline one-liner that runs the entire CI suite locally, the rules the
79
+ validator enforces, and the standing requirement that every new validator rule
80
+ ships with a negative test.
81
+ - **`SECURITY.md`** — private reporting channel, an exact statement of what the
82
+ installers touch (`~/.claude/skills/make-skill`, `~/.claude/commands/`, no
83
+ network, no postinstall, zero dependencies), and the point that a skill is text
84
+ an agent executes, so it deserves review before installation.
85
+ - `--version` / `-v` on the installer CLI, asserted in CI against
86
+ `package.json`.
87
+ - **Public-repo floor** in the canon and in the validator: README, CHANGELOG,
88
+ LICENSE, CONTRIBUTING and SECURITY are required root files once a repo is
89
+ public, each with a negative self-test.
90
+ - Validator rule: every `references/*.md` must carry a `Load this when:` line.
91
+ A reference without a stated condition is loaded always or never — the exact
92
+ failure progressive disclosure exists to prevent.
93
+ - `bugs` URL in `package.json`; `SECURITY.md` added to the published files.
94
+
95
+ ### Fixed
96
+ - **The shadow-copy gotcha understated the problem.** Docs said to remove a stray
97
+ `~/.claude/skills/<name>` copy "if it appears". It reappears on schedule: the
98
+ skills CLI auto-detects Claude Code and recreates that path — usually as a
99
+ symlink — on every `--global` add or update, whether or not `claude-code` was
100
+ targeted. The prune is now documented as part of the update command itself.
101
+ - The v0.1.0 implementation plan still described `templates/SKILL.md` and an
102
+ unscoped npm package; marked executed and pointed at the spec's Superseded
103
+ table, matching the treatment its sibling spec already had.
104
+ - Reference files derived from moving specs (Agent Skills, MCP, A2A) now carry
105
+ the date they were read, so a stale claim is visible instead of implied.
106
+
107
+ ### Changed
108
+ - **README rewritten for a first-time reader**: what it is in two sentences, a
109
+ quickstart that ends in a working command, what you actually get (standard
110
+ conformance, a validator that can fail, every channel, the named gotchas,
111
+ where a skill ends and MCP/A2A begin), an install matrix with the prune step
112
+ in it, and a requirements section.
113
+ - `permissions: contents: read` on the validate workflow.
114
+ - `package.json` keys ordered conventionally.
115
+
3
116
  ## v0.5.1 — 2026-07-28
4
117
 
5
118
  Full-repo consistency pass: every file read against every other, contradictions
@@ -12,7 +125,7 @@ fixed rather than annotated.
12
125
  - **The canon demanded a README section this repo deliberately doesn't have.**
13
126
  `README.md (EN + closing RU section)` in the layout and "RU section" in the
14
127
  Retrofit audit contradicted the v0.4.0 decision to ship an English-only README.
15
- Canon now says English-first, with Russian where it actually changes behaviour
128
+ Canon now says English-first, with Russian where it actually changes behavior
16
129
  (trigger phrases) and an optional RU section for RU-facing projects.
17
130
  - **The entry-point command contradicted its own design rule.** The canon says a
18
131
  `/<name>` command must "detect mode, never ask"; `/make-skill` with no argument
package/README.md CHANGED
@@ -4,133 +4,197 @@
4
4
  [![validate](https://github.com/ssheleg/make-skill/actions/workflows/validate.yml/badge.svg)](https://github.com/ssheleg/make-skill/actions/workflows/validate.yml)
5
5
  [![license](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
6
6
 
7
- Create, retrofit, audit, and ship agent **skills** and **Claude Code plugins** the
8
- proven ssheleg way — conformance to the [Agent Skills open standard](https://agentskills.io/specification),
9
- marketplace repo layout, four-way version sync, a structural validator + CI,
10
- multi-channel distribution, and end-to-end first publish, encoded as a skill so
11
- every new skill follows the same standard.
7
+ **A skill that builds skills.** Install it and your coding agent knows how to
8
+ create, audit, and ship [Agent Skills](https://agentskills.io/specification) and
9
+ Claude Code plugins properly — conforming to the open standard, validated in CI,
10
+ and installable on every agent instead of just yours.
11
+
12
+ The idea for a skill takes ten minutes. The packaging eats the evening: which
13
+ front-matter fields are legal, how long a description may be, four manifests that
14
+ must carry one identical version, plugin ids that only work in full `name@name`
15
+ form, an installer that quietly leaves a second copy shadowing the one you just
16
+ fixed. `make-skill` is that evening, written down and enforced.
17
+
18
+ ## Quickstart
19
+
20
+ ```bash
21
+ claude plugin marketplace add ssheleg/make-skill
22
+ claude plugin install make-skill@make-skill
23
+ ```
24
+
25
+ Restart Claude Code, then just ask:
26
+
27
+ ```
28
+ make a skill that turns our incident runbooks into a triage workflow
29
+ ```
30
+
31
+ …or point it at something that already exists:
32
+
33
+ ```
34
+ /make-skill audit ./skills/my-skill against the spec
35
+ ```
36
+
37
+ Inside a skill repo, `/make-skill` with no argument detects the situation and runs
38
+ the audit rather than asking you what you meant.
12
39
 
13
40
  ## What it does
14
41
 
15
- `make-skill` is a meta-skill: point it at a task and it routes to the right workflow.
42
+ Four workflows, picked automatically from what you asked for:
16
43
 
17
44
  | Workflow | When |
18
45
  |---|---|
19
46
  | **Create (personal)** | a skill only for your own agents (`~/.claude/skills/<name>/`) |
20
47
  | **Create (distributable)** | a skill others install → full marketplace repo + first publish |
21
- | **Retrofit** | an existing skill/repo below the standard → audit → fix → release |
48
+ | **Retrofit** | an existing skill or repo below the standard → audit → fix → release |
22
49
  | **Promote** | a personal skill that should become installable |
23
50
 
24
- It encodes: conformance to the [Agent Skills open standard](https://agentskills.io/specification),
25
- the repo layout, the version-sync hard rule, the validator (with negative
26
- self-tests), the distribution matrix (Claude Code plugin, vercel skills CLI, npx,
27
- Cursor), the npm gotchas, and a release checklist.
51
+ Each one ends somewhere verifiable — a validator exit code, a green CI run, a
52
+ resolvable install — not "should work now".
53
+
54
+ ## What you get
55
+
56
+ **Conformance to the open standard, not just a house style.** The
57
+ [Agent Skills specification](https://agentskills.io/specification) sets hard
58
+ limits — `name` is 1–64 chars of `a-z0-9` and single hyphens and must match its
59
+ directory, `description` caps at 1024 characters, the body should stay under 500
60
+ lines and 5000 tokens. Local conventions that merely *feel* right drift from those
61
+ without anyone noticing; here they're checked.
62
+
63
+ **A validator that can fail.** `test/validate.py` (Python stdlib only, no deps)
64
+ checks spec rules, version sync across every manifest, front-matter on commands
65
+ and Cursor rules, link integrity, and the traps below. CI runs it plus **negative
66
+ self-tests** — deliberately broken copies that must make it exit non-zero. A
67
+ validator nobody has seen fail is decoration.
68
+
69
+ **Every distribution channel, with the flags that actually work.** Claude Code
70
+ plugin, the [vercel `skills` CLI](https://github.com/vercel-labs/skills) (70+
71
+ agents), `npx`, Cursor rules, and umbrella-repo families — including the
72
+ one-channel-per-agent rule that stops them from shadowing each other.
28
73
 
29
- Bundled references the skill loads on demand:
74
+ **The gotchas that each cost a debugging round**, so your first publish works
75
+ instead of your fourth:
76
+
77
+ - a stray `SKILL.md` anywhere in the repo ships as a *real* skill on every agent;
78
+ - `npm view` returning E404 does **not** mean the name is publishable;
79
+ - npm reports expired-token failures as `404 Not Found` on publish;
80
+ - `npx <pkg>` inside the package's own repo resolves the local copy and lies;
81
+ - the skills CLI recreates the Claude Code shadow copy on every `--global` update,
82
+ whether or not you targeted Claude Code.
83
+
84
+ **Knowing where a skill ends.** A skill is instructions — it cannot hold a
85
+ credential or open a socket. When the task needs a live system that's an **MCP**
86
+ server; when the other side is another autonomous agent that's **A2A**. The skill
87
+ ships references for both, including the version drift that silently breaks
88
+ integrations.
89
+
90
+ ## What ships with it
91
+
92
+ The skill body stays small on purpose; the detail sits in reference files the
93
+ agent opens only when the situation calls for them:
30
94
 
31
95
  | Reference | Covers |
32
96
  |---|---|
33
- | `agent-skills-spec.md` | the open standard — field limits, optional front-matter, token budgets, description-trigger evals |
97
+ | `agent-skills-spec.md` | the open standard — field limits, optional front-matter, token budgets, the description trigger-eval loop |
34
98
  | `distribution.md` | every install channel, exact CLI flags, npm publishing traps |
35
- | `mcp.md` | [MCP](https://modelcontextprotocol.io) — skill vs server, primitives, transports, security rules |
36
- | `a2a.md` | [A2A](https://a2a-protocol.org) — Agent Cards, task lifecycle, v0.x→1.0 wire drift |
99
+ | `mcp.md` | [MCP](https://modelcontextprotocol.io) — skill vs server, primitives and methods, transports, consent and untrusted-output rules |
100
+ | `a2a.md` | [A2A](https://a2a-protocol.org) — Agent Cards, task lifecycle, method mapping, v0.x→1.0 wire drift |
37
101
 
38
- Reference implementations it mirrors: [super-ux](https://github.com/ssheleg/super-ux)
39
- (structure) and [task-pipeline](https://github.com/ssheleg/task-pipeline)
40
- (config-contract + toggleable release automation). make-skill is itself built to
41
- this canon.
102
+ Plus `templates/SKILL.template.md`, a spec-legal skeleton with the limits written
103
+ into it.
42
104
 
43
105
  ## Install
44
106
 
45
- **Plugin (recommended):**
46
- ```
47
- /plugin marketplace add ssheleg/make-skill
48
- /plugin install make-skill@make-skill
49
- ```
107
+ **Claude Code (recommended):**
50
108
 
51
- **Any agent via the skills CLI (Cursor, Codex, OpenCode, 70+ — not Claude Code, use the plugin above):**
109
+ ```bash
110
+ claude plugin marketplace add ssheleg/make-skill
111
+ claude plugin install make-skill@make-skill
52
112
  ```
113
+
114
+ **Any other agent — Cursor, Codex, OpenCode, Zed, 70+ via the skills CLI:**
115
+
116
+ ```bash
53
117
  npx skills add ssheleg/make-skill
54
118
  ```
55
119
 
56
- **npm / npx (no clone):**
57
- ```
58
- npx github:ssheleg/make-skill # straight from GitHub
59
- npx @ssheleg/make-skill # from the npm registry (scoped — npm blocks the bare name)
60
- ```
120
+ Don't target `claude-code` here if you installed the plugin above — see
121
+ one-channel-per-agent.
61
122
 
62
- **Cursor:**
63
- ```
64
- npx skills add ssheleg/make-skill --agent cursor --global
123
+ **npx, no clone:**
124
+
125
+ ```bash
126
+ npx github:ssheleg/make-skill # always current with this repo
127
+ npx @ssheleg/make-skill # npm registry (scoped: npm blocks the bare name)
65
128
  ```
66
- …or copy `cursor/rules/make-skill.mdc` into a project's `.cursor/rules/`.
129
+
130
+ **Cursor, per project:** copy [`cursor/rules/make-skill.mdc`](cursor/rules/make-skill.mdc)
131
+ into `.cursor/rules/` — it is self-contained by design.
67
132
 
68
133
  **Plain skill:**
69
- ```
134
+
135
+ ```bash
70
136
  git clone https://github.com/ssheleg/make-skill
71
137
  cd make-skill && ./install.sh # idempotent; --force to overwrite
72
138
  ```
73
139
 
74
- ## Updating everywhere
140
+ ### Updating
141
+
142
+ **The family updates as one package** — a bundle with one member current and the rest stale is a
143
+ combination nobody tested:
144
+
145
+ ```bash
146
+ npx sshlg-skills update # installed but behind — updates everything
147
+ npx sshlg-skills install # nothing installed yet
148
+ npx --yes sshlg-skills@latest list # what the current release of each member is
149
+ ```
75
150
 
76
- One channel per agent (a plugin plus a plain `~/.claude/skills` copy on the same
77
- Claude Code install shadow each other).
151
+ Restart your agent afterwards: skills and hooks load at session start.
152
+
153
+ Per-channel, when you are updating this one member only:
154
+
155
+ **One channel per agent.** A plugin plus a plain `~/.claude/skills` copy on the
156
+ same Claude Code install shadow each other, and the stale one usually wins.
78
157
 
79
158
  | Channel | Update |
80
159
  |---|---|
81
160
  | Claude Code (plugin) | `claude plugin marketplace update make-skill` → `claude plugin update make-skill@make-skill` → restart |
82
- | Any agent (skills CLI) | `npx skills update make-skill --global --yes` (repeated `--agent`; never `claude-code`) |
83
- | npm | `npx @ssheleg/make-skill@latest` / `npx github:ssheleg/make-skill` |
161
+ | Any agent (skills CLI) | `npx skills update make-skill --global --yes && rm -f ~/.claude/skills/make-skill` |
162
+ | npx | `npx github:ssheleg/make-skill` / `npx @ssheleg/make-skill@latest` |
84
163
  | Plain skill | `git pull && ./install.sh --force` |
85
164
 
86
- ## Use
165
+ The prune in row two is not optional: the skills CLI recreates the Claude Code
166
+ copy on every global update, even when Claude Code was never named.
167
+
168
+ ### Requirements
87
169
 
88
- Say *"make a skill"*, *"retrofit this skill to the standard"*, or *"does this
89
- skill match the spec?"* — or invoke `/make-skill <what to build, retrofit, or
90
- audit>`. With no argument inside a skill repo it detects the situation and runs
91
- the audit rather than asking. Russian phrasings (*"сделай скилл"*, *"приведи
92
- скилл к стандарту"*) route the same way.
170
+ Node ≥ 16 for the `npx` installer; Python 3 only if you run the validator;
171
+ `bash` for `install.sh` (Windows users: use `npx`, the plugin, or the skills CLI).
172
+ The skill itself is plain Markdown and needs nothing.
93
173
 
94
174
  ## Repo layout
95
175
 
96
176
  ```
97
177
  .claude-plugin/marketplace.json
98
- plugins/make-skill/{.claude-plugin/plugin.json, commands/make-skill.md,
99
- skills/make-skill/{SKILL.md, references/*.md}}
100
- cursor/rules/make-skill.mdc # self-contained Cursor rule
101
- templates/SKILL.template.md # skeleton seeded into new skills
102
- bin/make-skill.js + package.json # npx installer
103
- test/validate.py # structural validator (+ negative self-test in CI)
178
+ plugins/make-skill/
179
+ ├── .claude-plugin/plugin.json
180
+ ├── commands/make-skill.md # the /make-skill entry point
181
+ └── skills/make-skill/
182
+ ├── SKILL.md # the canon, < 500 lines by rule
183
+ └── references/*.md # loaded on demand
184
+ cursor/rules/make-skill.mdc # self-contained Cursor rule
185
+ templates/SKILL.template.md # spec-legal skeleton
186
+ bin/make-skill.js + package.json # zero-dep npx installer
187
+ test/validate.py # structural validator
104
188
  .github/workflows/{validate,release}.yml
105
- install.sh README.md CHANGELOG.md LICENSE
106
- docs/superpowers/{specs,plans}/
189
+ install.sh README.md CHANGELOG.md CONTRIBUTING.md SECURITY.md LICENSE
190
+ docs/superpowers/{specs,plans}/ # historical design records
107
191
  ```
108
192
 
109
- ## What this gives you
110
-
111
- The moment you catch yourself re-explaining the same workflow to your agent, you
112
- want a skill. Then the packaging eats your evening: front-matter limits, four
113
- files that must carry the identical version, plugin ids that only work in full
114
- `name@name` form, a CLI that silently installs a second copy shadowing the one
115
- you just fixed.
116
-
117
- - **Turns a workflow you keep repeating into something installable** — for
118
- yourself, your team, or the public.
119
- - **Keeps you inside the open standard** — the `name` charset, the 1024-char
120
- `description` cap, the <500-line / <5000-token body budget. The validator
121
- fails on each, so a skill that installs on Claude Code also installs
122
- everywhere else.
123
- - **Ships the scaffolding that keeps it alive:** repo layout, a validator, CI
124
- with negative self-tests. A skill that fails loudly beats one that quietly
125
- stops firing.
126
- - **Knows where a skill ends and a protocol begins** — when to write an MCP
127
- server instead, how to consume one safely, and what changes when the other
128
- side is another agent over A2A.
129
- - **Covers every distribution channel** — Claude Code plugin, 70+ agents via the
130
- vercel `skills` CLI, `npx`, Cursor rules — and the one-channel-per-agent rule
131
- that stops them from shadowing each other.
132
- - **Encodes the gotchas that each cost a debugging round**, so your first
133
- publish works instead of your fourth.
193
+ ## Contributing
194
+
195
+ Issues and PRs welcome — see [CONTRIBUTING.md](CONTRIBUTING.md) for how to run the
196
+ validator and the full CI suite locally (both work offline, no dependencies to
197
+ install). Security reports: [SECURITY.md](SECURITY.md).
134
198
 
135
199
  ## Author
136
200
 
@@ -140,13 +204,19 @@ Built by ssheleg — [sshlg.me](https://sshlg.me)
140
204
  - Telegram — [@sshlg](https://t.me/sshlg)
141
205
 
142
206
  Part of the [ssheleg skill family](https://github.com/ssheleg/sshlg-skills):
143
- `super-ux`, `task-pipeline`, `make-skill`, `sheleg-design`, `seo-aeo-audit`.
144
- One command installs all five for every agent you use:
207
+ `super-ux`, `task-pipeline`, `agent-sync`, `make-skill`, `sheleg-design`, `seo-aeo-audit`.
208
+ **The family installs and updates as one package**, for every agent you use — a bundle with one
209
+ member current and the rest stale is a combination nobody tested:
145
210
 
146
211
  ```bash
147
- npx sshlg-skills install
212
+ npx sshlg-skills install # nothing installed yet — the whole family, any agent
213
+ npx sshlg-skills update # installed but behind — updates everything
214
+ npx --yes sshlg-skills@latest list # what the current release of each member is
148
215
  ```
149
216
 
217
+ Restart your agent afterwards: skills and hooks load at session start, so the session that
218
+ updates is not the session that gets the new ones.
219
+
150
220
  ## License
151
221
 
152
222
  MIT © 2026 ssheleg.
package/SECURITY.md ADDED
@@ -0,0 +1,47 @@
1
+ # Security Policy
2
+
3
+ ## Reporting a vulnerability
4
+
5
+ Report privately through
6
+ [GitHub Security Advisories](https://github.com/ssheleg/make-skill/security/advisories/new),
7
+ or by Telegram to [@sshlg](https://t.me/sshlg) if you'd rather not use GitHub.
8
+ Please don't open a public issue for something exploitable.
9
+
10
+ Expect an acknowledgement within a few days. This is a small project maintained by
11
+ one person — there is no bounty, but you'll be credited in the release notes
12
+ unless you'd prefer otherwise.
13
+
14
+ ## What this project touches
15
+
16
+ `make-skill` ships Markdown plus two small installers. Knowing exactly what runs
17
+ where is most of the threat model:
18
+
19
+ - **`bin/make-skill.js`** (run via `npx`) and **`install.sh`** copy files into
20
+ `~/.claude/skills/make-skill` and `~/.claude/commands/`. They create and
21
+ overwrite only those paths, never elsewhere in `$HOME`, and overwrite only with
22
+ `--force`. Both are zero-dependency: no network calls, no postinstall script.
23
+ - **`test/validate.py`** reads repository files and exits with a status. It writes
24
+ nothing.
25
+ - The Claude Code plugin and the `skills` CLI channels are handled by those tools,
26
+ not by code in this repo.
27
+
28
+ Nothing here asks for credentials, and nothing phones home. The npm package has no
29
+ dependencies, so its supply-chain surface is npm itself.
30
+
31
+ ## Content is instructions for an agent
32
+
33
+ A skill is text that a coding agent loads into its context and follows. Two
34
+ consequences worth stating plainly:
35
+
36
+ - **Review a skill before installing it**, from any source including this one.
37
+ Prose that an agent treats as instruction deserves the same scrutiny as code you
38
+ would run.
39
+ - The canon in this repo deliberately tells agents to treat everything coming back
40
+ from an MCP server or an A2A peer as **untrusted data, never instructions**, and
41
+ never to auto-approve tool calls or bypass consent prompts. If you find guidance
42
+ here that contradicts that, it is a bug — please report it.
43
+
44
+ ## Supported versions
45
+
46
+ The latest release on `main` is supported. Fixes go into a new version rather than
47
+ being backported.
package/bin/make-skill.js CHANGED
@@ -17,12 +17,21 @@ const os = require('os');
17
17
  const ROOT = path.resolve(__dirname, '..');
18
18
  const REPO = 'ssheleg/make-skill';
19
19
 
20
+ function version() {
21
+ try {
22
+ return require(path.join(ROOT, 'package.json')).version;
23
+ } catch {
24
+ return 'unknown';
25
+ }
26
+ }
27
+
20
28
  function usage() {
21
- console.log(`make-skill installer
29
+ console.log(`make-skill installer v${version()}
22
30
 
23
31
  Usage:
24
32
  npx @ssheleg/make-skill [--force] install skill + /make-skill command into
25
33
  ~/.claude (skip existing unless --force)
34
+ npx @ssheleg/make-skill --version
26
35
  npx @ssheleg/make-skill --help
27
36
 
28
37
  Other install paths:
@@ -59,6 +68,10 @@ function main(argv) {
59
68
  usage();
60
69
  return 0;
61
70
  }
71
+ if (args.includes('--version') || args.includes('-v')) {
72
+ console.log(version());
73
+ return 0;
74
+ }
62
75
  const force = args.includes('--force');
63
76
  const unknown = args.filter((a) => a !== '--force');
64
77
  if (unknown.length) {
@@ -47,6 +47,7 @@ bin/<name>.js + package.json # zero-dep npx installer
47
47
  test/validate.py # stdlib-only consistency validator
48
48
  .github/workflows/validate.yml (+ release.yml, off by default)
49
49
  install.sh, README.md (English-first), CHANGELOG.md, LICENSE (MIT)
50
+ CONTRIBUTING.md + SECURITY.md # required once the repo is public
50
51
  docs/superpowers/{specs,plans}/
51
52
  ```
52
53
 
package/package.json CHANGED
@@ -1,29 +1,7 @@
1
1
  {
2
2
  "name": "@ssheleg/make-skill",
3
- "version": "0.5.1",
3
+ "version": "0.6.4",
4
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.",
5
- "bin": {
6
- "make-skill": "bin/make-skill.js"
7
- },
8
- "publishConfig": {
9
- "access": "public"
10
- },
11
- "files": [
12
- "bin",
13
- "plugins",
14
- "cursor",
15
- "templates",
16
- "README.md",
17
- "LICENSE",
18
- "CHANGELOG.md"
19
- ],
20
- "repository": "github:ssheleg/make-skill",
21
- "homepage": "https://github.com/ssheleg/make-skill",
22
- "license": "MIT",
23
- "author": "ssheleg",
24
- "engines": {
25
- "node": ">=16"
26
- },
27
5
  "keywords": [
28
6
  "skill",
29
7
  "plugin",
@@ -37,5 +15,31 @@
37
15
  "agent-skills",
38
16
  "mcp",
39
17
  "a2a"
40
- ]
18
+ ],
19
+ "homepage": "https://github.com/ssheleg/make-skill",
20
+ "bugs": {
21
+ "url": "https://github.com/ssheleg/make-skill/issues"
22
+ },
23
+ "repository": "github:ssheleg/make-skill",
24
+ "license": "MIT",
25
+ "author": "ssheleg",
26
+ "bin": {
27
+ "make-skill": "bin/make-skill.js"
28
+ },
29
+ "files": [
30
+ "bin",
31
+ "plugins",
32
+ "cursor",
33
+ "templates",
34
+ "README.md",
35
+ "LICENSE",
36
+ "CHANGELOG.md",
37
+ "SECURITY.md"
38
+ ],
39
+ "publishConfig": {
40
+ "access": "public"
41
+ },
42
+ "engines": {
43
+ "node": ">=16"
44
+ }
41
45
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "make-skill",
3
3
  "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.",
4
- "version": "0.5.1",
4
+ "version": "0.6.4",
5
5
  "author": {
6
6
  "name": "ssheleg"
7
7
  },
@@ -1,22 +1,18 @@
1
1
  ---
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" / "новый скилл", "ssheleg skill" / "ssheleg скилл", "wrap it in a plugin" / "заверни в плагин", "publish a skill" / "опубликуй скилл", "retrofit a skill to the standard" / "приведи скилл к стандарту", "does this skill match the spec" / "соответствует ли скилл стандарту" - or when a skill must reach an MCP server or another agent over A2A. Encodes the Agent Skills open standard (front-matter limits, progressive-disclosure budgets) plus the proven ssheleg pipeline - marketplace layout, version sync, validator+CI, multi-agent distribution (Claude Code plugin, vercel skills CLI, npx, Cursor), npm gotchas, end-to-end first publish.
4
+ license: MIT
4
5
  ---
5
6
 
6
7
  # make-skill — Create, Retrofit, and Ship Skills the Proven Way
7
8
 
8
- Reference implementations (local checkouts usually at `~/DATA/<name>`):
9
- - **`ssheleg/super-ux`** — the canonical structure; copy it verbatim when in
10
- doubt. Multi-skill suite, Cursor rules, templates seeded into projects.
11
- - **`ssheleg/task-pipeline`** — the reference for the newer patterns: a
12
- single-skill orchestrator with a generic JSON **config-contract**
13
- (`pipeline.schema.json` + a copy-and-rewrite `pipeline.example.json`),
14
- four-way version sync with jsonschema conformance in the validator, and
15
- **toggleable release automation**.
16
-
17
- Both work end-to-end; match whichever is closer to the skill at hand.
18
- **make-skill itself** (`ssheleg/make-skill`) is built to this exact canon — the
19
- single-skill-plus-templates shape, distributed on all channels.
9
+ Reference implementations to copy from (local checkouts usually `~/DATA/<name>`):
10
+ **`ssheleg/super-ux`** — canonical structure, multi-skill suite, Cursor rules,
11
+ seeded templates. **`ssheleg/task-pipeline`** — newer patterns: single-skill
12
+ orchestrator, generic JSON config-contract (`pipeline.schema.json` +
13
+ `pipeline.example.json`), jsonschema conformance in the validator, toggleable
14
+ release automation. Match whichever is closer; both work end-to-end.
15
+ **make-skill itself** is built to this canon.
20
16
 
21
17
  ## References — load on demand
22
18
 
@@ -58,6 +54,13 @@ is non-negotiable; this canon only adds on top** (details + checklist:
58
54
  required MCP servers, runtimes, network here), `metadata` (string→string map;
59
55
  quote versions), `allowed-tools` (space-separated string, experimental).
60
56
  Nothing else belongs in front-matter.
57
+ - **`license` is optional but declare it anyway — in BOTH manifests.** An SPDX
58
+ id in the front matter AND in the `marketplace.json` plugin entry (a documented
59
+ field there too). A `LICENSE` file in the repo root is invisible to someone
60
+ reading the plugin listing or the installed skill: shipping code whose terms
61
+ are one repo-visit away is a gap, and it stays open because nothing errors.
62
+ Observed 2026-07-30 across all six repos in this family at once — every one had
63
+ the file, none declared it in either manifest.
61
64
  - Body **< 500 lines and < 5000 tokens**. Heavier material goes to `references/`,
62
65
  `scripts/`, `assets/` INSIDE the skill dir, one level deep, each with a stated
63
66
  load trigger ("read X when Y") — never a bare "see references/".
@@ -110,9 +113,16 @@ path if it proves useful.
110
113
  ├── .github/workflows/validate.yml # validator on push+PR (+ release.yml, off by default)
111
114
  ├── install.sh # POSIX fallback
112
115
  ├── README.md (English-first), CHANGELOG.md, LICENSE (MIT)
116
+ ├── CONTRIBUTING.md + SECURITY.md # public repo: how to check work, where to report
113
117
  └── docs/superpowers/{specs,plans}/
114
118
  ```
115
119
 
120
+ **Public-repo floor** (validator-enforced): a README that says what it does
121
+ before how to install it; `CONTRIBUTING.md` with the exact offline commands that
122
+ verify a change; `SECURITY.md` naming a private reporting channel and what the
123
+ installers touch — a skill is text an agent executes, so "review before
124
+ installing" belongs in writing.
125
+
116
126
  README language: **English-first** — it is the public face of the repo and most
117
127
  readers aren't Russian speakers. Russian belongs in the skill's trigger phrases
118
128
  (where it changes whether the skill fires) and, optionally, in a closing RU
@@ -139,7 +149,8 @@ is the tie-breaker on the standard; the house validator owns the repo rules.
139
149
  ### First publish — end-to-end, same session
140
150
 
141
151
  Take it ALL the way: GitHub + CI green + npm published + verified installs.
142
- No half-done handoffs — the ONLY human step is npm 2FA.
152
+ No half-done handoffs. The first publish needs a human for 2FA; **arming CI
153
+ publishing is part of shipping**, so the second one does not (see step 9).
143
154
 
144
155
  1. **Preflight before code:** `npm view <name>` (E404 = free);
145
156
  `gh auth status` (may lie — just try repo create later); `npm whoami`
@@ -162,8 +173,20 @@ No half-done handoffs — the ONLY human step is npm 2FA.
162
173
  8. **Install for the user:** `claude plugin marketplace add <owner>/<name>` +
163
174
  `claude plugin install <name>@<name>`; verify
164
175
  `npx --yes skills add <owner>/<name> --list` finds the skills.
165
- 9. Done = four verified facts: GitHub repo + CI green; npm resolvable via
166
- npx; plugin installed; skills-CLI discovery works.
176
+ 9. **Arm CI publishing so this is the last manual publish.** Ship the release
177
+ workflow (above), then hand over exactly two commands — `gh secret set
178
+ NPM_TOKEN --repo <owner>/<name>` (a GRANULAR AUTOMATION token; the user
179
+ pastes it, never you) and `gh variable set PUBLISH_NPMJS --body true --repo
180
+ <owner>/<name>`. Secret first: arming the variable with no token queues a red
181
+ run on the next tag.
182
+ 10. Done = five verified facts: GitHub repo + CI green; npm resolvable via
183
+ npx; plugin installed; skills-CLI discovery works; the next tag publishes
184
+ without a human.
185
+ 11. **If it belongs to a family** (`sshlg-skills`): bump its `version` pin in
186
+ the umbrella's `skills.json`, release the umbrella, and verify with
187
+ `npx --yes sshlg-skills@latest list`. Until that lands the launcher
188
+ advertises the OLD version and `update` installs it — see
189
+ `references/distribution.md` §5.
167
190
 
168
191
  ## Retrofit (bring an existing skill/repo up to standard)
169
192
 
@@ -193,7 +216,8 @@ with evidence (`file:line` or command output) — never "looks fine".
193
216
  `npx --yes skills add <repo> --list` lists ONLY real skills; `npx <name>`
194
217
  works from a non-repo cwd (if npm published); `.mdc` rules have no relative
195
218
  links and valid front-matter.
196
- 8. Repo meta: homepage → npm page; LICENSE; CHANGELOG current.
219
+ 8. Repo meta: homepage + description + topics set on the forge; LICENSE;
220
+ CHANGELOG current; public repos also carry CONTRIBUTING.md and SECURITY.md.
197
221
  9. Gotcha compliance (see below): `from __future__ import annotations` in
198
222
  validate.py; `\x1b` literals not raw ESC; single prompter for piped
199
223
  stdin; raw-mode only behind isTTY guards.
@@ -283,11 +307,13 @@ Non-negotiables for any such skill:
283
307
  `3.x` won't catch it, local run will.
284
308
  - **gh auth status may lie** (invalid-token report while git+ssh path
285
309
  works): attempt the operation before declaring it blocked.
286
- - **Duplicate-shadow: one channel per agent.** A plugin install AND a plain
287
- `~/.claude/skills/<name>` copy (from `install.sh` or `npx skills add
288
- --agent '*'`) on the SAME Claude Code install = two listings; the plain copy
289
- can be STALE and shadow the fresh plugin. Keep exactly one channel per
290
- agent; `rm -rf ~/.claude/skills/<name>` if a stray plain copy appears.
310
+ - **Duplicate-shadow: one channel per agent — and the shadow regrows.** A plugin
311
+ install AND a plain `~/.claude/skills/<name>` copy on the SAME Claude Code
312
+ install = two listings, and the plain copy (often STALE) wins. It is not only
313
+ `install.sh`: `npx skills add|update … --global` auto-detects Claude Code and
314
+ recreates that path — usually as a symlink — **even when `claude-code` was
315
+ never targeted**. So the prune belongs in the update step itself:
316
+ `npx skills update <name> --global --yes && rm -f ~/.claude/skills/<name>`.
291
317
  - **Plugin commands need the full `<name>@<name>`:** `claude plugin update
292
318
  <name>` → "Plugin not found"; it must be `claude plugin update
293
319
  <name>@<name>`. Same for install.
@@ -312,10 +338,18 @@ Non-negotiables for any such skill:
312
338
  7. Global `~/.claude/CLAUDE.md` — only for rules that must fire even without
313
339
  the skill installed.
314
340
 
315
- **Optional — toggleable release automation** (reference impl:
316
- `ssheleg/task-pipeline` `.github/workflows/release.yml`). A `v*`-tag workflow,
317
- **off by default** and armed per repo via a `RELEASE_ENABLED` repo variable
318
- (so forks decide for themselves), that validates the tag ↔ manifest version,
319
- cuts the GitHub release from the matching CHANGELOG section, and smoke-tests
320
- `npx github:<owner>/<repo>#<tag>` from a clean cwd. npm publish stays the human
321
- 2FA step. Turns steps 2/4 into CI; keep step 6 manual (it touches this machine).
341
+ **Toggleable release automation — set it up, don't leave it optional**
342
+ (reference impl: `ssheleg/task-pipeline` `.github/workflows/release.yml`). A
343
+ `v*`-tag workflow, **off by default** and armed per repo by two variables so a
344
+ fork inherits nothing: `RELEASE_ENABLED` for the GitHub release,
345
+ `PUBLISH_NPMJS` for the registry. It validates the tag ↔ manifest version, cuts
346
+ the GitHub release from the matching CHANGELOG section, smoke-tests `npx
347
+ github:<owner>/<repo>#<tag>` from a clean cwd, then publishes to npm with
348
+ provenance. Auth per `references/distribution.md` §3 — OIDC or `NPM_TOKEN`,
349
+ written so both work. Turns steps 2/4/5 into CI; keep step 6 manual (it touches
350
+ this machine).
351
+
352
+ **A release nobody has to attend is the point.** Leaving publish manual is how a
353
+ registry ends up several versions behind its own tags with nothing anywhere
354
+ showing the gap — measured across this family on 2026-07-30: six of seven
355
+ packages behind, one by three releases.
@@ -8,7 +8,7 @@ Spec referenced here: **A2A 1.0.0**
8
8
  (<https://a2a-protocol.org/latest/specification/>). **Verify field and method
9
9
  names against the version you target before locking a contract** — v0.x → v1.0
10
10
  renamed the wire surface (examples below), and plenty of SDKs and blog posts still
11
- document v0.3.
11
+ document v0.3. *Read from the spec on 2026-07-28.*
12
12
 
13
13
  ## A2A vs MCP — not competitors
14
14
 
@@ -11,6 +11,9 @@ Upstream sources (verify before locking anything — the spec moves):
11
11
  - Best practices — <https://agentskills.io/skill-creation/best-practices>
12
12
  - Description tuning — <https://agentskills.io/skill-creation/optimizing-descriptions>
13
13
 
14
+ *Field limits and budgets below were read from the spec on 2026-07-28. Re-read
15
+ before trusting them in a new quarter.*
16
+
14
17
  The ssheleg canon in `SKILL.md` is a **superset** of this spec. It may add rules
15
18
  (RU triggers, version sync, marketplace layout); it must never violate one.
16
19
 
@@ -6,6 +6,20 @@ auditing an existing repo's distribution in a Retrofit.
6
6
  Hard rule across all channels: **one channel per agent.** Two installs of the same
7
7
  skill on one agent = two listings, and the stale copy shadows the fresh one.
8
8
 
9
+ **The shadow comes back on its own.** `npx skills add|update … --global`
10
+ auto-detects Claude Code and writes `~/.claude/skills/<name>` — often as a symlink
11
+ into `~/.agents/skills/<name>` — *even when `claude-code` was never named as a
12
+ target*. So the routine that refreshes the Cursor/Codex channel silently recreates
13
+ the shadow every single run. It cannot be handled by discipline; it needs a step:
14
+
15
+ ```bash
16
+ npx skills update <name> --global --yes && rm -f ~/.claude/skills/<name>
17
+ ```
18
+
19
+ Put that prune inside whatever script performs the update, so the supported path
20
+ can't leave a shadow behind. A symlink shadows exactly as a directory does — check
21
+ with `ls -ld`, and remember `find -type f` will not see through it.
22
+
9
23
  ## 1. Claude Code plugin
10
24
 
11
25
  `/plugin marketplace add <owner>/<repo>` → `/plugin install <name>@<name>`;
@@ -44,8 +58,30 @@ package's own repo, `npx` resolves the local package and reports a false
44
58
 
45
59
  ### npm gotchas — each one cost a debugging round
46
60
 
47
- - **npm 2FA:** publish throws EOTP; non-interactive is impossible without a
48
- granular automation token. Plan it as the one human step; verify after.
61
+ - **npm 2FA:** an interactive `npm publish` throws EOTP, and a *classic* token
62
+ does not get past it. Two ways out, both of which remove the human step for
63
+ good — set one up rather than planning a manual publish forever:
64
+ - **Trusted publishing (OIDC) — preferred, no credential exists to leak.**
65
+ npm CLI ≥ 11.5.1, Node ≥ 22.14, `permissions: id-token: write`, and the
66
+ package configured on npmjs.com with the exact workflow *filename* as its
67
+ trusted publisher. No `NODE_AUTH_TOKEN` at all.
68
+ - **Granular automation token** in `NPM_TOKEN`, passed as `NODE_AUTH_TOKEN`.
69
+ Works immediately with no npmjs.com setup, at the cost of a long-lived
70
+ credential to rotate.
71
+
72
+ Write the workflow so both work — always grant `id-token: write` and always
73
+ pass `NODE_AUTH_TOKEN` from the secret. Then adopting OIDC later is deleting a
74
+ secret, not editing CI. `id-token: write` is also what signs `--provenance`.
75
+
76
+ Three properties the job needs, each earned the hard way:
77
+ - **Skip a version already on the registry.** Publishing over one is a hard
78
+ 403, which turns every re-run into a red build.
79
+ - **A `workflow_dispatch` input naming an existing tag.** A dispatch runs the
80
+ workflow file *as of the ref it is dispatched on*, so a tag pushed before the
81
+ publish job existed can never gain one — the input lets the current workflow
82
+ run against an old tag.
83
+ - **Poll `npm view` after publishing.** The read replica lags the write master
84
+ by a minute or two; published is a claim until the registry serves it.
49
85
  - **Check the npm name FIRST, but don't trust E404:** `npm view <name>` → E404
50
86
  means free, yet npm's **name-similarity** policy only fires on PUT, so
51
87
  `npm publish` can still 403 "too similar to existing package <x>" (e.g.
@@ -90,6 +126,14 @@ above — `npx skills add` (non-Claude agents, repeated `--agent`), `claude plug
90
126
  truth; the validator keeps it in sync with `.gitmodules`. One command
91
127
  installs/updates the whole family everywhere.
92
128
 
129
+ **The umbrella pins each member's version, so a member release is not done until the pin moves.**
130
+ `sshlg-skills/skills.json` carries a `version` per member and `list` prints it. Publish a member
131
+ without bumping that pin and the launcher keeps advertising — and `update` keeps installing — the
132
+ previous release, with nothing in either repo to reveal the gap. Observed 2026-07-29: `agent-sync`
133
+ 1.3.4 was on npm and installed everywhere while `list` still said 1.3.3, so a project comparing its
134
+ install against `list` told every agent to update to what it already had. Bump the pin, release the
135
+ umbrella, then confirm with `npx --yes sshlg-skills@latest list`.
136
+
93
137
  ## Platforms
94
138
 
95
139
  The Node installer (`bin/*.js`, `os.homedir()`/`path.join`), `npx github:…`, the
@@ -7,6 +7,7 @@ Spec revision referenced here: **2025-11-25**
7
7
  (<https://modelcontextprotocol.io/specification/latest>). Pin the revision you
8
8
  build against and re-verify method names before locking a contract — MCP versions
9
9
  by date and the negotiated `protocolVersion` string is part of the handshake.
10
+ *Read from the spec on 2026-07-28.*
10
11
 
11
12
  ## Skill vs MCP server — pick the right one
12
13