@ssheleg/make-skill 0.20.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,73 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v0.22.0 — the gate left 47 MB in $TMPDIR and never said what it left
|
|
4
|
+
|
|
5
|
+
**Two suites copied the tree to plant defects into it and never removed the copy.** The
|
|
6
|
+
conformance audit named one; the sweep found the other, and it was the larger half by two
|
|
7
|
+
orders of magnitude. Measured on this machine at the time of the fix: **1904 abandoned
|
|
8
|
+
mkdtemp roots, 47.3 MB** — 60 planted skill dirs and 36 repo copytrees unambiguously this
|
|
9
|
+
repository's, and 1808 plant-guard trees ambiguous, because four family repos ship the
|
|
10
|
+
byte-identical fixture at the same line and nothing in the content distinguishes them.
|
|
11
|
+
|
|
12
|
+
### `test/residue.py`
|
|
13
|
+
|
|
14
|
+
A shared ledger in this repo's `plant_guard.py` idiom: `workspace()` hands out a
|
|
15
|
+
`make-skill-test-` prefixed mkdtemp, `open_case` / `close_case` bind each tree to a case,
|
|
16
|
+
and `report()` — wired to `atexit`, so no exit path skips it — removes what may go, keeps
|
|
17
|
+
what a failure needs, and **prints one line either way**. A clean run says
|
|
18
|
+
`residue: this run left nothing — N temp tree(s) created, N removed`, because the
|
|
19
|
+
requirement is that completion *records* residue, not merely that there is none. A leak is
|
|
20
|
+
then visible the first time the line changes.
|
|
21
|
+
|
|
22
|
+
**The failure path keeps its tree, by decision and stated in three places.** A planted
|
|
23
|
+
defect here is debugged by reading the copy the plant landed in, and a cleanup that runs
|
|
24
|
+
only on the pass path removes the evidence exactly when you want it. The report names the
|
|
25
|
+
kept path, its owning case, and the `rm -rf` that ends it — a kept tree with no stated
|
|
26
|
+
remedy is a leak with better manners. A tree that refuses to delete is counted as **kept**,
|
|
27
|
+
never as removed: the report does not claim a teardown it did not achieve.
|
|
28
|
+
|
|
29
|
+
`test/residue_test.py` joins the gate with 8 cases, including the one that matters — stash
|
|
30
|
+
the two fixes and it exits 1 naming both suites, then prints
|
|
31
|
+
`residue: 2 of 2 temp tree(s) KEPT` with both paths. The failure path demonstrating itself.
|
|
32
|
+
|
|
33
|
+
### Not swept
|
|
34
|
+
|
|
35
|
+
The 1904 pre-existing directories were **left in place** and reported. Ownership of 1808
|
|
36
|
+
of them cannot be established from their contents, and deleting state you cannot prove is
|
|
37
|
+
yours is the one thing this kind of cleanup must not do.
|
|
38
|
+
|
|
39
|
+
## v0.21.0 — a gate's self-test runs in both directions
|
|
40
|
+
|
|
41
|
+
*"A validator that can't fail is decoration"* has been the rule here since the standard was
|
|
42
|
+
written. It is **half** the rule, and the missing half is the expensive one.
|
|
43
|
+
|
|
44
|
+
The planted defect proves a gate CAN fire. Nothing in it proves the gate fires only where it
|
|
45
|
+
should — and a gate that flags correct code is switched off within a day, taking the real check
|
|
46
|
+
with it. **A false positive does not arrive as a bug report. It arrives as an argument about
|
|
47
|
+
your gate**, from someone whose code was fine.
|
|
48
|
+
|
|
49
|
+
`references/authoring.md` gains *A gate's self-test runs in both directions*: the two kinds of
|
|
50
|
+
case, what each one's absence costs, and the point that counter-shapes **decide** a gate's
|
|
51
|
+
design rather than merely verifying it — a pattern that finds five hits and is wrong about all
|
|
52
|
+
five is a parser you have not written yet.
|
|
53
|
+
|
|
54
|
+
Two recurring shapes are named because both have shipped:
|
|
55
|
+
|
|
56
|
+
- **The input that cannot be resolved** must fail loudly, never skip — *a check that cannot run
|
|
57
|
+
is not a check that passed*. A slug resolver anchored on `github.com` returned nothing for
|
|
58
|
+
npm's `github:owner/repo` shorthand, so its check printed `skip` and reported success for work
|
|
59
|
+
it never did.
|
|
60
|
+
- **The word inside another word** — `lease` in *please*, `аудит` in *аудитория*, `seo` in
|
|
61
|
+
*Seoul*. Found by running the gate over a real corpus, never by reading it.
|
|
62
|
+
|
|
63
|
+
And: **count the cases, do not restate the count.** A summary saying *"5 cases"* while thirteen
|
|
64
|
+
run is the defect the gate exists to prevent, in the gate's own output.
|
|
65
|
+
|
|
66
|
+
**The doctrine went to the reference rather than the body, and the body's own gate decided
|
|
67
|
+
that.** `SKILL.md` measured 4738 of a 4750 working limit — twelve tokens of headroom — so every
|
|
68
|
+
draft that stated the rule inline failed the budget check. `authoring.md` is linked from
|
|
69
|
+
`SKILL.md` twice, so the rule is reachable without spending a body it does not have. Closes #5.
|
|
70
|
+
|
|
3
71
|
## v0.20.0 — the checker said 180 where the file said 1392
|
|
4
72
|
|
|
5
73
|
**Both checkers dropped the continuation lines of a plain multi-line YAML
|
package/README.md
CHANGED
|
@@ -261,10 +261,13 @@ plugins/make-skill/
|
|
|
261
261
|
cursor/rules/make-skill.mdc # self-contained Cursor rule
|
|
262
262
|
bin/make-skill.js + package.json # zero-dep npx installer
|
|
263
263
|
test/validate.py # structural validator
|
|
264
|
+
test/{plant_guard,checker_parity,residue}_test.py # the gate's three suites
|
|
265
|
+
test/{plant_guard,residue}.py # did the plant land · what did the run leave
|
|
264
266
|
test/evals/ # trigger set + behavioral scenarios (data)
|
|
265
267
|
.github/workflows/{validate,release}.yml
|
|
266
268
|
install.sh README.md CHANGELOG.md CONTRIBUTING.md SECURITY.md SKILL-CARD.md LICENSE
|
|
267
269
|
docs/evidence/{specs,plans}/ # historical design records
|
|
270
|
+
docs/evidence/{backlog,verification}.md # what is owed · what confirmed what
|
|
268
271
|
```
|
|
269
272
|
|
|
270
273
|
## Contributing
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ssheleg/make-skill",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.0",
|
|
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",
|
|
@@ -45,6 +45,6 @@
|
|
|
45
45
|
"node": ">=16"
|
|
46
46
|
},
|
|
47
47
|
"scripts": {
|
|
48
|
-
"test": "python3 test/validate.py && python3 test/plant_guard_test.py && python3 test/checker_parity_test.py"
|
|
48
|
+
"test": "python3 test/validate.py && python3 test/plant_guard_test.py && python3 test/checker_parity_test.py && python3 test/residue_test.py"
|
|
49
49
|
}
|
|
50
50
|
}
|
|
@@ -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.
|
|
6
|
+
"version": "0.22.0",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "ssheleg",
|
|
9
9
|
"url": "https://x.com/sshlg93"
|
|
@@ -5,7 +5,7 @@ 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.
|
|
8
|
+
version: "0.22.0"
|
|
9
9
|
homepage: https://github.com/ssheleg/make-skill
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -20,6 +20,7 @@ and [agentskills.io](https://agentskills.io/skill-creation/best-practices).
|
|
|
20
20
|
- Workflows and feedback loops
|
|
21
21
|
- Content guidelines (terminology, time, paths, table of contents)
|
|
22
22
|
- Scripts — the rules that separate a script from a liability
|
|
23
|
+
- A gate's self-test runs in both directions
|
|
23
24
|
- Evaluation and iteration — evals before prose
|
|
24
25
|
- Quality checklist
|
|
25
26
|
|
|
@@ -187,6 +188,43 @@ run flagged a false positive on the very document that teaches the anti-pattern
|
|
|
187
188
|
which is why it now ignores quoted spans. Hooks, subagents and commands that wrap
|
|
188
189
|
it, plus the fallbacks they owe, are in `references/host-capabilities.md`.
|
|
189
190
|
|
|
191
|
+
## A gate's self-test runs in both directions
|
|
192
|
+
|
|
193
|
+
*"A validator that can't fail is decoration"* is half the rule. The planted defect
|
|
194
|
+
proves the gate **can** fire. Nothing in it proves the gate fires only where it
|
|
195
|
+
should — and a gate that flags correct code is switched off within a day, taking
|
|
196
|
+
the real check with it. **A false positive does not arrive as a bug report. It
|
|
197
|
+
arrives as an argument about your gate**, from someone whose code was fine.
|
|
198
|
+
|
|
199
|
+
So a self-test carries two kinds of case:
|
|
200
|
+
|
|
201
|
+
| Direction | The case | What its absence costs |
|
|
202
|
+
|---|---|---|
|
|
203
|
+
| **Must catch** | the planted defect, watched failing | a check that cannot fail, green forever |
|
|
204
|
+
| **Must NOT flag** | the legal spelling, the empty input, the near-miss that only resembles the defect | a check that is correct and unusable, removed by the first person it wrongly blocks |
|
|
205
|
+
|
|
206
|
+
**The counter-shapes are also where a gate's design gets decided, not just
|
|
207
|
+
verified.** A pattern that reads *"no key may start with a mounted namespace"*
|
|
208
|
+
finds five hits and all five are correct — they pass absolute keys to a translator
|
|
209
|
+
that prefixes nothing. Written as a pattern the gate is wrong; written as a parser
|
|
210
|
+
that binds each translator variable to its namespace, it is right. The counter-case
|
|
211
|
+
is what tells the two apart, and only running it reveals which one you built.
|
|
212
|
+
|
|
213
|
+
Two shapes recur and both belong in every gate's fixtures:
|
|
214
|
+
|
|
215
|
+
- **The input that cannot be resolved.** A resolver returning nothing must be a
|
|
216
|
+
loud failure, never a silent skip — *a check that cannot run is not a check that
|
|
217
|
+
passed*. A slug resolver anchored on `github.com` returned nothing for npm's
|
|
218
|
+
`github:owner/repo` shorthand, so the check printed `skip` and reported success
|
|
219
|
+
for work it never did.
|
|
220
|
+
- **The word inside another word.** Any matcher over prose needs the near-miss:
|
|
221
|
+
`lease` inside *please*, `аудит` inside *аудитория*, `seo` inside *Seoul*. These
|
|
222
|
+
are found by running the gate over a real corpus, not by reading it.
|
|
223
|
+
|
|
224
|
+
**Count the cases, do not restate the count.** A summary line saying *"5 cases"*
|
|
225
|
+
while thirteen run is the same class of defect the gate exists to prevent, in the
|
|
226
|
+
gate's own output.
|
|
227
|
+
|
|
190
228
|
## Evaluation and iteration — evals before prose
|
|
191
229
|
|
|
192
230
|
**Build the evaluations before writing extensive documentation.** Otherwise the
|