@ssheleg/sheleg-dev 0.11.2 → 0.11.3

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,59 @@ 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.3 — the schema address was fixed in a position nothing reads
8
+
9
+ v0.11.2 corrected the `$schema` **name** in both manifests and left the marketplace's
10
+ declaration where it already sat: inside `plugins[0]`, one level below the document
11
+ root. Nothing reads it there. Measured before changing anything, which is how it was
12
+ confirmed rather than assumed:
13
+
14
+ ```
15
+ $ python3 -c "import json; print(list(json.load(open('.claude-plugin/marketplace.json')).keys()))"
16
+ ['name', 'owner', 'description', 'plugins'] # no $schema at all
17
+ ```
18
+
19
+ So the pack shipped a release whose whole subject was a `$schema` address, and ended it
20
+ with a marketplace document that had **no effective declaration** — reading, from the
21
+ outside, exactly like the release that fixed it. Found by `telegram-dev`'s family-wide
22
+ sweep on 2026-08-31, not by re-reading v0.11.2.
23
+
24
+ - **The declaration moved to the document root** of `.claude-plugin/marketplace.json`,
25
+ with the marketplace schema, and the inert nested copy is gone. Root keys are now
26
+ `['$schema', 'name', 'owner', 'description', 'plugins']`. The plugin manifest's own
27
+ root declaration was already present and already the *manifest* schema — checked, not
28
+ presumed.
29
+ - **Both documents were validated against the schema each one declares**, fetched from
30
+ the address it names: marketplace → 200 `'Claude Code Plugin Marketplace'`, manifest →
31
+ 200 `'Claude Code Plugin Manifest'`, both validating clean under `jsonschema` 4.26.0.
32
+ The shapes genuinely differ, so the wrong schema is its own defect: a marketplace
33
+ requires `['name', 'owner', 'plugins']` and each `plugins[]` entry requires
34
+ `['name', 'source']`; a manifest requires `['name']` and has no `source` key.
35
+ - **A guard, so the inert position cannot come back** — `test/validate.py` check 25
36
+ reads `$schema` from the **root** and refuses four ways: absent, the dead
37
+ `claude-code-plugin.json` name, the wrong document type, and a declaration nested in a
38
+ `plugins[]` entry. Its shape is adopted from `telegram-dev`'s check 14 and
39
+ `test/check_schemas.py` (its `0263b89`), with credit in both files.
40
+ - **`test/check_schemas.py`** is the half that looks: it resolves every declared address
41
+ and validates the document against what is served. Deliberately outside `npm test`,
42
+ which stays offline and stdlib-only. Both halves import one `SCHEMA_FOR` map, so the
43
+ addresses have a single home — which required putting `validate.py`'s verdict block
44
+ under `if __name__ == "__main__"`, since importing it previously ran the suite and
45
+ exited the importer.
46
+
47
+ **Two things measured while doing this, and they are why the guard pins addresses
48
+ instead of just validating.** The served marketplace schema lists `$schema` among the
49
+ permitted properties of a `plugins[]` entry — so v0.11.2's inert declaration was
50
+ schema-**legal**, and no conformance run could ever have rejected it. And this
51
+ repository's marketplace checked against the *manifest* schema raises **zero** errors,
52
+ because that schema requires only `name` and neither root sets
53
+ `additionalProperties: false`; the reverse raises two. For the direction that mattered
54
+ here, validating proves nothing — only a guard that reads the root can.
55
+
56
+ Four planted defects, each watched failing by name; the negatives floor is re-derived
57
+ by `python3 test/negatives.py --list` (43 → 47) and the verdict moves 24 → 25 checks.
58
+ No behavioural change to any skill.
59
+
7
60
  ## v0.11.2 — the schema address the manifests declared returns 404
8
61
 
9
62
  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.2",
3
+ "version": "0.11.3",
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.2",
6
+ "version": "0.11.3",
7
7
  "author": {
8
8
  "name": "ssheleg",
9
9
  "url": "https://x.com/sshlg93"