@ssheleg/make-skill 0.11.0 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,63 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.11.1 — 2026-08-10
4
+
5
+ A behavioural pass over v0.11.0 — walking the skill the way an agent walks it and
6
+ running every command it hands out, rather than re-reading the files. The
7
+ structural gates were already green; what this found was in the one field no
8
+ structural gate covers.
9
+
10
+ ### Fixed — the description had a neighbour and no answer to it
11
+
12
+ Coexistence was measured instead of assumed, across the 130 skills of the 23
13
+ enabled plugins on the author's machine. The nearest neighbour is **not** the one
14
+ `test/evals/RESULTS.md` predicted:
15
+
16
+ | Neighbour | Overlap |
17
+ |---|---|
18
+ | **`claude-mem:version-bump`** | **9.6%** |
19
+ | `agent-sync` | 5.5% |
20
+ | `task-pipeline` (the predicted one) | 4.7% |
21
+
22
+ `version-bump` advertises "version increments across package.json,
23
+ marketplace.json, plugin.json manifests, git tagging, GitHub releases, and
24
+ changelog generation" — this skill's release checklist, and enabled alongside it.
25
+ The overlap is not vocabulary, it is *job*.
26
+
27
+ - The description now carries the clause `references/authoring.md` prescribes for
28
+ exactly this case: **NOT for a version bump or release in a repo that ships
29
+ anything but a skill or plugin.**
30
+ - **`triggers.json` gains q21 and q22**, the same manifest-bump-and-release
31
+ request once where the artifact IS a skill and once where it is not, on
32
+ opposite sides of the split so the near-miss is measured in validation rather
33
+ than tuned on. 22 queries, 11 positive / 11 near-miss negative.
34
+ - `RESULTS.md` records the measured table and drops the guess.
35
+
36
+ ### Added — the headroom rule reaches the field that decides triggering
37
+
38
+ v0.11.0 gave the body a 5% working limit and left the description at 1003 of
39
+ 1024\. Adding the clause above needed 60 characters that did not exist — the same
40
+ disease, in the field that decides whether the skill fires at all. Both the house
41
+ validator and the bundled auditor (`--house`) now hold the description to **≤970
42
+ of 1024**, with a negative self-test on each.
43
+
44
+ ### Verified, not assumed
45
+
46
+ Every command the canon hands an agent was executed against the released
47
+ artifact: `make-skill-audit` by bare name, the non-Claude fallback path, the
48
+ raw-fallback reference URLs (200 — checked for the first time), `npx skills add
49
+ --list` (no skeleton leaks), `npx` from a non-repo cwd, `claude plugin details`.
50
+ The hook was exercised on all three of its paths and returns valid JSON. Building
51
+ a skill from `assets/SKILL.template.md` and auditing it gives 0 GAP. The
52
+ compression in v0.11.0 was checked against every fact the evaluation scenarios
53
+ depend on: all of them are still reachable, and all 11 references are still
54
+ linked from the body.
55
+
56
+ The evaluation suite is still **authored and never executed against a model** —
57
+ that gap needs a fresh session per query per model, and this pass does not close
58
+ it. What it does show is why it matters: the risk this repo had written down was
59
+ not the risk it had.
60
+
3
61
  ## v0.11.0 — 2026-08-10
4
62
 
5
63
  A file-by-file audit of the whole repo, run with this skill's own evidence rules.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ssheleg/make-skill",
3
- "version": "0.11.0",
3
+ "version": "0.11.1",
4
4
  "description": "Create, retrofit, audit, and ship agent skills & Claude Code plugins the proven ssheleg way — conformance to the Agent Skills open standard AND Anthropic's platform rules (front-matter limits, disclosure budgets, per-surface runtime limits, the Skills API, evals) plus 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, the review checklist for third-party skills, and MCP / A2A rules for protocol-connected skills. This package is the installer CLI.",
5
5
  "keywords": [
6
6
  "skill",
@@ -3,7 +3,7 @@
3
3
  "name": "make-skill",
4
4
  "displayName": "Make Skill",
5
5
  "description": "Create, retrofit, audit, and ship agent skills & Claude Code plugins the proven ssheleg way: conformance to the Agent Skills open standard, Anthropic's platform rules (surfaces, Skills API, evals) 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, the review checklist for third-party skills, plus MCP / A2A references for protocol-connected skills.",
6
- "version": "0.11.0",
6
+ "version": "0.11.1",
7
7
  "author": {
8
8
  "name": "ssheleg",
9
9
  "url": "https://x.com/sshlg93"
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: make-skill
3
- description: Use when creating, upgrading, auditing, or publishing agent skills and Claude Code plugins - "make a skill" / "сделай скилл", "new skill" / "новый скилл", "wrap it in a plugin" / "заверни в плагин", "publish a skill" / "опубликуй скилл", "retrofit a skill to the standard" / "приведи скилл к стандарту", "does this skill match the spec" / "соответствует ли скилл стандарту", "plugin.json / marketplace.json" / "claude plugin validate fails" / "проверь плагин по документации Anthropic", "is this skill safe to install" / "безопасно ли ставить этот скилл" - or when a skill must reach an MCP server or another agent over A2A. Encodes the Agent Skills open standard AND Anthropic's platform rules (front-matter limits, disclosure budgets, Skills API surfaces, evals), the Claude Code plugin reference (manifest schemas, component layout, validate --strict), plus the proven ssheleg pipeline - marketplace layout, version sync, validator+CI, multi-agent distribution, npm gotchas, end-to-end first publish.
3
+ description: Use when creating, upgrading, auditing, or publishing agent skills and Claude Code plugins - "make a skill" / "сделай скилл", "wrap it in a plugin" / "заверни в плагин", "publish a skill" / "опубликуй скилл", "retrofit a skill to the standard" / "приведи скилл к стандарту", "does this skill match the spec" / "соответствует ли скилл стандарту", "claude plugin validate fails" / "проверь плагин по документации Anthropic", "is this skill safe to install" / "безопасно ли ставить этот скилл" - or when a skill must reach an MCP server or another agent over A2A. NOT for a version bump or release in a repo that ships anything but a skill or plugin. Encodes the Agent Skills open standard and Anthropic's platform rules (front-matter limits, budgets, the Skills API, evals), the Claude Code plugin reference (manifest schemas, component layout, validate --strict), plus the ssheleg pipeline - marketplace layout, version sync, validator+CI, distribution, npm gotchas.
4
4
  license: MIT
5
5
  compatibility: Authoring works on any agent. The bundled scripts/ need python3. Publishing steps need git, gh, node and npm; the plugin gates need the claude CLI. Not usable on the Claude API surface, which has no network and no runtime package install.
6
6
  metadata:
7
7
  author: ssheleg
8
- version: "0.11.0"
8
+ version: "0.11.1"
9
9
  homepage: https://github.com/ssheleg/make-skill
10
10
  ---
11
11
 
@@ -95,7 +95,9 @@ differences and the checklist: `references/agent-skills-spec.md`.
95
95
  House additions on top of the spec:
96
96
 
97
97
  - `description` starts "Use when …" and lists concrete trigger phrases — English
98
- AND Russian (user works in both). A skill nobody triggers is dead weight.
98
+ AND Russian (user works in both). A skill nobody triggers is dead weight. Hold
99
+ **5% headroom here too** (≤970 of 1024): a near-miss neighbour forces a "NOT
100
+ for …" clause, and a description at 98% of cap has nowhere to put it.
99
101
  - One naming pattern, preferably gerund (`processing-pdfs`); never `helper`,
100
102
  `utils`, `tools`, `data` — vague names lose every selection.
101
103
  - One skill = one job. Multiple concerns → multiple skills + a shared contract
@@ -110,8 +112,8 @@ House additions on top of the spec:
110
112
  - **Evals before prose:** run the target task with NO skill, record the
111
113
  failures, write ≥3 evaluations against them, then write the minimum that
112
114
  passes; a skill built without a baseline documents imagined problems. Adding
113
- to an existing family → test **coexistence**: a broad description steals the
114
- triggers of the skills already installed.
115
+ to an existing family → **measure coexistence against the INSTALLED set**, do
116
+ not guess it: the neighbour you would name is usually not the nearest one.
115
117
  - Ship a one-command entry point: idempotent — inspect state → repair missing
116
118
  pieces → status report → exactly ONE suggested next action. Detect mode, never
117
119
  ask. **The skill IS that command**; the invocation differs by channel
@@ -290,9 +292,9 @@ agent is **A2A** (`a2a.md`). Non-negotiables for any such skill:
290
292
  chars/token, cl100k gives 3.8–4.5). Budget against a tokenizer and expect the
291
293
  CLI to look alarming for a body already inside 5000 real tokens.
292
294
  - **A number you typed by hand is an assertion, not documentation.** Counts of
293
- files, steps and checklist items drift the release after you write them —
294
- this canon shipped "13-item" beside "14-item" and "ten references" beside
295
- eleven. Compute it, or have the validator compare it to the artifact.
295
+ files, steps and checklist items drift the release after you write them — this
296
+ canon shipped "13-item" beside "14-item". Compute it, or have the validator
297
+ compare it to the artifact.
296
298
 
297
299
  ## Release (every version)
298
300
 
@@ -308,8 +310,7 @@ session:
308
310
  --yes && rm -f ~/.claude/skills/<name>`, then remind about the restart;
309
311
  - **move the family pin in the SAME session.** A member released without its
310
312
  umbrella pin bumped is invisible: `list` advertises the old version and
311
- `update` installs it. Seen here 2026-08-10 — npm served make-skill 0.10.0
312
- while `sshlg-skills list` still said 0.9.1;
313
+ `update` installs it (seen here 2026-08-10);
313
314
  - **arm the tag-triggered release workflow** (`RELEASE_ENABLED`,
314
315
  `PUBLISH_NPMJS`, off by default) so the next release needs no human. Manual
315
316
  publishing is how a registry ends up behind its own tags — six of seven
@@ -30,6 +30,10 @@ import sys
30
30
  # --- limits, each with the authority that sets it --------------------------
31
31
  NAME_MAX = 64 # spec: name is 1-64 characters
32
32
  DESC_MAX = 1024 # spec: description is 1-1024 characters
33
+ # House working limit: 5% under the cap. The description is the whole triggering
34
+ # budget AND the field that must grow when a near-miss skill appears ("say what
35
+ # it is NOT for"). A description at 98% of cap cannot absorb that sentence.
36
+ DESC_TARGET = 970
33
37
  COMPAT_MAX = 500 # spec: compatibility is 1-500 characters
34
38
  BODY_MAX_LINES = 500 # spec + Anthropic: keep the body under 500 lines
35
39
  BODY_MAX_TOKENS = 5000 # spec + Anthropic: level-2 budget
@@ -224,6 +228,14 @@ def _check_description(a, fm, lines, rel, house):
224
228
  a.gap("DESC_RU", "description carries no Russian trigger phrases (house rule)", rel, ln)
225
229
  else:
226
230
  a.ok("DESC_RU", "description carries Russian trigger phrases (house rule)", rel, ln)
231
+ if DESC_TARGET < len(desc) <= DESC_MAX:
232
+ a.gap("DESC_HEADROOM", "description is %d chars — inside the %d cap but past the "
233
+ "%d working limit (house rule): leave room for the 'what this is NOT for' "
234
+ "clause a near-miss neighbour will require"
235
+ % (len(desc), DESC_MAX, DESC_TARGET), rel, ln)
236
+ elif len(desc) <= DESC_TARGET:
237
+ a.ok("DESC_HEADROOM", "description is %d/%d chars, inside the working limit"
238
+ % (len(desc), DESC_TARGET), rel, ln)
227
239
 
228
240
 
229
241
  def _check_optional_fields(a, fm, lines, rel):