@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 +114 -1
- package/README.md +152 -82
- package/SECURITY.md +47 -0
- package/bin/make-skill.js +14 -1
- package/cursor/rules/make-skill.mdc +1 -0
- package/package.json +28 -24
- package/plugins/make-skill/.claude-plugin/plugin.json +1 -1
- package/plugins/make-skill/skills/make-skill/SKILL.md +62 -28
- package/plugins/make-skill/skills/make-skill/references/a2a.md +1 -1
- package/plugins/make-skill/skills/make-skill/references/agent-skills-spec.md +3 -0
- package/plugins/make-skill/skills/make-skill/references/distribution.md +46 -2
- package/plugins/make-skill/skills/make-skill/references/mcp.md +1 -0
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
|
|
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
|
[](https://github.com/ssheleg/make-skill/actions/workflows/validate.yml)
|
|
5
5
|
[](LICENSE)
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
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-
|
|
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,
|
|
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
|
-
|
|
39
|
-
|
|
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
|
-
**
|
|
46
|
-
```
|
|
47
|
-
/plugin marketplace add ssheleg/make-skill
|
|
48
|
-
/plugin install make-skill@make-skill
|
|
49
|
-
```
|
|
107
|
+
**Claude Code (recommended):**
|
|
50
108
|
|
|
51
|
-
|
|
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
|
-
|
|
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
|
-
**
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
77
|
-
|
|
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
|
|
83
|
-
|
|
|
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
|
-
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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/
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
##
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
|
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.
|
|
166
|
-
|
|
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
|
|
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
|
|
287
|
-
`~/.claude/skills/<name>` copy
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
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
|
-
**
|
|
316
|
-
`ssheleg/task-pipeline` `.github/workflows/release.yml`). A
|
|
317
|
-
**off by default** and armed per repo
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
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
|
|
48
|
-
|
|
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
|
|