@ssheleg/sheleg-dev 0.11.2 → 0.11.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
|
@@ -4,6 +4,79 @@ All notable changes to this project are documented here.
|
|
|
4
4
|
Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
5
5
|
Versioning: [SemVer](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## v0.11.4 — the registry card stopped lagging what ships
|
|
8
|
+
|
|
9
|
+
`SKILL-CARD.md` carries the fields Anthropic's Skills-for-enterprise guidance asks every
|
|
10
|
+
organisation to keep — *"written so somebody who did not build this can decide"*. It said
|
|
11
|
+
`0.10.3` while this package shipped `0.11.3`.
|
|
12
|
+
|
|
13
|
+
**Nothing read it, so it could only drift.** The version moves in `package.json`,
|
|
14
|
+
`plugin.json` and `marketplace.json` on every release; the card was in no list. Measured
|
|
15
|
+
2026-09-01 across the family: **four of nine cards were behind** — `agent-stack` by ten
|
|
16
|
+
minor releases, `sheleg-design` by six, `super-ux` by four, this one by one.
|
|
17
|
+
|
|
18
|
+
The same check now sits in each of them, which is this family's own rule that a class
|
|
19
|
+
seen twice becomes a script. It refuses a card whose `Version` row disagrees with
|
|
20
|
+
`package.json`, and refuses a card that states no version at all: one a reader cannot see
|
|
21
|
+
go stale is worse than one that lags visibly. Watched failing before it shipped.
|
|
22
|
+
|
|
23
|
+
Checks 25 → **26**, and `REQ-001`'s quoted gate line moves with it — the ledger's own
|
|
24
|
+
guard caught the restated output before this entry was written, which is what that guard
|
|
25
|
+
is for.
|
|
26
|
+
|
|
27
|
+
## v0.11.3 — the schema address was fixed in a position nothing reads
|
|
28
|
+
|
|
29
|
+
v0.11.2 corrected the `$schema` **name** in both manifests and left the marketplace's
|
|
30
|
+
declaration where it already sat: inside `plugins[0]`, one level below the document
|
|
31
|
+
root. Nothing reads it there. Measured before changing anything, which is how it was
|
|
32
|
+
confirmed rather than assumed:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
$ python3 -c "import json; print(list(json.load(open('.claude-plugin/marketplace.json')).keys()))"
|
|
36
|
+
['name', 'owner', 'description', 'plugins'] # no $schema at all
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
So the pack shipped a release whose whole subject was a `$schema` address, and ended it
|
|
40
|
+
with a marketplace document that had **no effective declaration** — reading, from the
|
|
41
|
+
outside, exactly like the release that fixed it. Found by `telegram-dev`'s family-wide
|
|
42
|
+
sweep on 2026-08-31, not by re-reading v0.11.2.
|
|
43
|
+
|
|
44
|
+
- **The declaration moved to the document root** of `.claude-plugin/marketplace.json`,
|
|
45
|
+
with the marketplace schema, and the inert nested copy is gone. Root keys are now
|
|
46
|
+
`['$schema', 'name', 'owner', 'description', 'plugins']`. The plugin manifest's own
|
|
47
|
+
root declaration was already present and already the *manifest* schema — checked, not
|
|
48
|
+
presumed.
|
|
49
|
+
- **Both documents were validated against the schema each one declares**, fetched from
|
|
50
|
+
the address it names: marketplace → 200 `'Claude Code Plugin Marketplace'`, manifest →
|
|
51
|
+
200 `'Claude Code Plugin Manifest'`, both validating clean under `jsonschema` 4.26.0.
|
|
52
|
+
The shapes genuinely differ, so the wrong schema is its own defect: a marketplace
|
|
53
|
+
requires `['name', 'owner', 'plugins']` and each `plugins[]` entry requires
|
|
54
|
+
`['name', 'source']`; a manifest requires `['name']` and has no `source` key.
|
|
55
|
+
- **A guard, so the inert position cannot come back** — `test/validate.py` check 25
|
|
56
|
+
reads `$schema` from the **root** and refuses four ways: absent, the dead
|
|
57
|
+
`claude-code-plugin.json` name, the wrong document type, and a declaration nested in a
|
|
58
|
+
`plugins[]` entry. Its shape is adopted from `telegram-dev`'s check 14 and
|
|
59
|
+
`test/check_schemas.py` (its `0263b89`), with credit in both files.
|
|
60
|
+
- **`test/check_schemas.py`** is the half that looks: it resolves every declared address
|
|
61
|
+
and validates the document against what is served. Deliberately outside `npm test`,
|
|
62
|
+
which stays offline and stdlib-only. Both halves import one `SCHEMA_FOR` map, so the
|
|
63
|
+
addresses have a single home — which required putting `validate.py`'s verdict block
|
|
64
|
+
under `if __name__ == "__main__"`, since importing it previously ran the suite and
|
|
65
|
+
exited the importer.
|
|
66
|
+
|
|
67
|
+
**Two things measured while doing this, and they are why the guard pins addresses
|
|
68
|
+
instead of just validating.** The served marketplace schema lists `$schema` among the
|
|
69
|
+
permitted properties of a `plugins[]` entry — so v0.11.2's inert declaration was
|
|
70
|
+
schema-**legal**, and no conformance run could ever have rejected it. And this
|
|
71
|
+
repository's marketplace checked against the *manifest* schema raises **zero** errors,
|
|
72
|
+
because that schema requires only `name` and neither root sets
|
|
73
|
+
`additionalProperties: false`; the reverse raises two. For the direction that mattered
|
|
74
|
+
here, validating proves nothing — only a guard that reads the root can.
|
|
75
|
+
|
|
76
|
+
Four planted defects, each watched failing by name; the negatives floor is re-derived
|
|
77
|
+
by `python3 test/negatives.py --list` (43 → 47) and the verdict moves 24 → 25 checks.
|
|
78
|
+
No behavioural change to any skill.
|
|
79
|
+
|
|
7
80
|
## v0.11.2 — the schema address the manifests declared returns 404
|
|
8
81
|
|
|
9
82
|
A sibling repository's wave-3 run (agent-stack) measured that
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ssheleg/sheleg-dev",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.4",
|
|
4
4
|
"description": "Seven integration skills for the layer a product reaches once it has users: Stripe subscription billing and cancellation retention, crypto payments, ad and conversion tracking under Consent Mode v2, Google sign-in and the wider Google auth surface, error tracking, and Core Web Vitals. This package is the installer CLI.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"sheleg-dev": "bin/sheleg-dev.js"
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
"scripts": {
|
|
46
46
|
"test": "python3 test/validate.py && node test/moneygate_test.js && node test/fixtures_test.js && node test/installer_test.js",
|
|
47
47
|
"test:negatives": "python3 test/negatives.py",
|
|
48
|
+
"test:schemas": "python3 test/check_schemas.py",
|
|
48
49
|
"test:all": "python3 test/validate.py && node test/moneygate_test.js && node test/fixtures_test.js && node test/installer_test.js && python3 test/negatives.py"
|
|
49
50
|
}
|
|
50
51
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "sheleg-dev",
|
|
4
4
|
"displayName": "Sheleg Dev",
|
|
5
5
|
"description": "The integration layer a product needs once it has users: Stripe subscription billing reconciled into your own database, crypto payments that survive over-payment and duplicate webhooks, ad and conversion tracking under Consent Mode v2, Google sign-in with the account-linking guards, the wider Google auth surface, and Core Web Vitals work that moves the score, and Sentry error tracking wired so it does not forward your own credentials to a third party and so a stack trace names the commit that caused it.",
|
|
6
|
-
"version": "0.11.
|
|
6
|
+
"version": "0.11.4",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "ssheleg",
|
|
9
9
|
"url": "https://x.com/sshlg93"
|