wicked-garden 12.54.0 → 12.55.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.
Files changed (47) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/CHANGELOG.md +21 -2
  4. package/CONTRIBUTING.md +1 -1
  5. package/README.md +2 -2
  6. package/docs/extending.md +1 -1
  7. package/docs/required-peers.md +2 -2
  8. package/install.mjs +2 -1
  9. package/package.json +1 -1
  10. package/packs/README.md +29 -0
  11. package/packs/garden-mcp-inspector/README.md +35 -0
  12. package/packs/garden-mcp-inspector/editors/garden-mcp-inspector/index.html +663 -0
  13. package/packs/garden-mcp-inspector/wicked-pack.json +81 -0
  14. package/pyproject.toml +5 -1
  15. package/schemas/wicked-pack.schema.json +100 -2
  16. package/scripts/_pack_registry.py +1 -1
  17. package/scripts/demo/package-lock.json +7 -7
  18. package/scripts/demo/palette.mjs +39 -0
  19. package/scripts/demo/record.mjs +8 -3
  20. package/scripts/demo/stage.mjs +32 -27
  21. package/scripts/demo/walkthrough.mjs +6 -1
  22. package/scripts/editor/_pack.py +2 -0
  23. package/scripts/editor/_surfaces.py +323 -0
  24. package/scripts/editor/conformance.py +458 -25
  25. package/scripts/editor/scaffold.py +56 -9
  26. package/scripts/loom/manifest.py +5 -4
  27. package/scripts/pack/check.py +10 -1
  28. package/scripts/qe/lib/gate.mjs +9 -7
  29. package/scripts/qe/lib/vault-evidence.mjs +16 -18
  30. package/scripts/qe/runner/README.md +5 -6
  31. package/scripts/qe/runner/test/th17-vault-evidence.test.mjs +6 -6
  32. package/skills/archetype/refs/incident.md +2 -2
  33. package/skills/archetype/refs/migrate.md +1 -1
  34. package/skills/archetype/refs/modernize.md +1 -1
  35. package/skills/archetype/refs/review.md +1 -1
  36. package/skills/archetype/refs/specify.md +1 -1
  37. package/skills/core/refs/setup.md +2 -2
  38. package/skills/demo/refs/stage-design.md +6 -3
  39. package/skills/demo/refs/storyline-api.md +9 -1
  40. package/skills/editor-scaffold/SKILL.md +43 -11
  41. package/skills/editor-scaffold/assets/pack/README.md +6 -3
  42. package/skills/editor-scaffold/assets/pack/editors/__EDITOR_ID__/index.html +142 -27
  43. package/skills/editor-scaffold/refs/mcp-server.md +4 -0
  44. package/skills/editor-scaffold/refs/surfaces.md +69 -0
  45. package/skills/qe/refs/campaign-grading.md +4 -4
  46. package/skills/qe/refs/evidence.md +4 -4
  47. package/uv.lock +1 -1
@@ -1 +1 @@
1
- {"name": "wicked-garden", "owner": {"name": "Mike Parcewski"}, "plugins": [{"name": "wicked-garden", "source": "./", "description": "Your coding agent already plans and swarms \u2014 Wicked Garden is the curated toolkit for what it can't: proof-not-claims gates, code links grep can't see, deterministic refactor, cross-session memory, multi-model second opinions (fallback seats labelled). Don't fight the harness; fill its gaps. The gate needs wicked-vault (a self-contained infra peer, installed directly) and re-derives through garden's built-in engine; estate/bus are opt-in layers (wicked-testing and wicked-brain are retired \u2014 QE ships in-catalog as the qe domain, memory lives in wicked-estate).", "version": "12.54.0"}], "version": "12.54.0"}
1
+ {"name": "wicked-garden", "owner": {"name": "Mike Parcewski"}, "plugins": [{"name": "wicked-garden", "source": "./", "description": "Your coding agent already plans and swarms \u2014 Wicked Garden is the curated toolkit for what it can't: proof-not-claims gates, code links grep can't see, deterministic refactor, cross-session memory, multi-model second opinions (fallback seats labelled). Don't fight the harness; fill its gaps. The gate needs wicked-vault (a self-contained infra peer, installed directly) and re-derives through garden's built-in engine; estate/bus are opt-in layers (wicked-testing and wicked-brain are retired \u2014 QE ships in-catalog as the qe domain, memory lives in wicked-estate).", "version": "12.55.1"}], "version": "12.55.1"}
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "wicked-garden",
3
- "version": "12.54.0",
3
+ "version": "12.55.1",
4
4
  "description": "Your coding agent's harness already plans and swarms; Wicked Garden is the curated toolkit for what it can't do alone. Proof, not claims \u2014 gates re-derive 'done' through the internal loom engine (fail-closed, independently attested via wicked-vault), so a self-asserted pass can't lie its way green. Relationships grep can't see \u2014 the wicked-estate code graph + injected bus/dispatch/capability/archetype edges power blast-radius & lineage. Plus deterministic multi-file refactor (wicked-patch), cross-session memory + knowledge (the mem domain over wicked-estate), multi-model second opinions (fallback seats labelled) (jam:council), portable expertise as on-demand skill-refs, and evidence-gated testing (the in-catalog qe domain). It reads the shape of your work to apply the right rigor \u2014 steering, not a pipeline \u2014 then gets out of the way. The compiler stamps a self-contained evidence gate into any repo that runs with no wicked-garden installed. Don't fight the harness; fill its gaps. The evidence gate requires wicked-vault, a self-contained infra peer wicked-garden installs directly; wicked-bus is an opt-in layer \u2014 install what you'll use, the toolkit works without the rest.",
5
- "wicked_vault_version": "^0.5.0",
5
+ "wicked_vault_version": ">=0.8.0",
6
6
  "wicked_ledger_version": "^0.6.0",
7
7
  "wicked_bus_version": "^2.0.0",
8
8
  "author": {
package/CHANGELOG.md CHANGED
@@ -2,10 +2,27 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [12.55.1] — 2026-10-15
6
+
7
+ ### Fixed
8
+ - **Bump the `wicked-vault` peer floor to `>= 0.8.0` and drop stale "unreleased manifest-2.1 twin" notes (garden#1309).** `.claude-plugin/plugin.json` now declares `"wicked_vault_version": ">=0.8.0"` (replacing `"^0.5.0"`, whose `0.x` caret excluded every later minor), in lockstep with `scripts/loom/manifest.py` (`version_pin="0.8"`) and every `<!-- vault-floor -->` doc/skill restatement. `VAULT_RELEASE_REQUIREMENT` in `scripts/qe/lib/vault-evidence.mjs` and the QE docs/help strings now point to `npm i -g wicked-vault@latest` (the manifest-2.1 twin shipped in 0.7.0; 0.8.0 is the current floor).
9
+ - **The plugin's Python range stops below 3.15 until its dependencies ship 3.15 wheels.** `pydantic-core` (via `pydantic`) has no CPython 3.15 wheel. A 3.15 default interpreter (the macOS GitHub runners and Homebrew `python@3.15`) made `uv sync` build it from source with Rust, which fails without a toolchain. That blocked wicked-crew's first skills publish (its release smoke S02 on macOS, and any 3.15-only host without Rust). `requires-python` is now `>=3.10,<3.15` (uv.lock relocked at the same lock revision), so uv picks or downloads a 3.14. Lift the bound once pydantic-core publishes cp315 wheels.
10
+
11
+ ## [12.55.0] — 2026-10-14
12
+
13
+ ### Added
14
+ - **The editor-plugin builder speaks wicked.editor/2 (PR #1303, DES-EDITOR-PLUGIN-CONTRACT-001).** A protocol-2 editor declares its surfaces: the card in the run's thread, options tabs in the host panel (plugin-rendered, or host-drawn controls), and full screen with Simple/Advanced. The host renders all three from that declaration. The pack schema and `pack check` (new code PK069) require `surfaces` when `protocol` lists 2 and refuse it otherwise, using the same rules as studio's host. `scaffold.py` writes a protocol-[1,2] plugin with all three surfaces (`--surfaces <file>` for your own declaration), and the template implements every part of it while still speaking protocol 1 to an older host. Conformance adds cases 13-16 (surfaces, card, options, full screen) and 17 (a protocol-1 plugin under a protocol-2 host). Cases 13-16 need a studio whose conformance page reads `surface`, `tab` and `mode` and reports options values. On a conformance host that speaks protocol 1 only, cases 13-16 are not run and are reported as a gap, so the 12-case base suite can pass. That report does not certify protocol 2, and crew still requires 13-16 to install a protocol-2 editor. New editor permission: `artifact.theme`.
15
+ - **The MCP inspector ships as an editor plugin pack: `packs/garden-mcp-inspector` (PR #1307, DES-EDITOR-PLUGIN-CONTRACT-001 slice 5).** The editor-plugin scaffold made it (kind `mcp-server`, protocol [1,2], sizes inline/pane/full, permissions `artifact.read`, `mcp.session`, `ui.fullscreen`). The card holds the tools, the argument form, Call and the result. The options tabs are Resources, Prompts and the JSON-RPC Log. Full screen shows the whole inspector, and Advanced adds the last call's raw exchange. It follows list pages, shows a list the server refuses as its error, and starts the log over on Restart. Arguments come from the tool's schema, with a JSON box for anything the fields can't express. A tool call is sent only from a click on Call. Install it with `install.py --dir "$(wicked-garden path packs/garden-mcp-inspector)"`. A test re-runs the scaffold and holds the pack to its output.
16
+
17
+ ### Changed
18
+ - **Editor conformance tolerates a slow host and checks the options mount (PR #1307).** Each page load and each read proxied to the daemon may take `--timeout` seconds (else `$WG_EDITOR_CONFORMANCE_TIMEOUT`, default 120; it was Playwright's 30 s). No load waits for "network idle", which never comes while studio holds its live socket. The host page's own files are fetched once per run. Case 15 now reads the `host.hello` the editor's frame received: each plugin tab must be mounted as an options instance told that tab, and `host.tab` must switch it to the other tabs and back without a reload. Case 14 checks the card is told `surface: card`. Before, a host page that ignored `tab` passed case 15.
19
+ - **Demo videos follow the studio skin by default (PR #1304).** The recorder's stage, title and chapter cards, captions, progress and callouts take their colours and typeface from the operator's studio Theme. It reads them from wicked-crew's `GET /api/v1/appearance/video-palette` (`$WICKED_CREW_URL`), replacing the fixed grey palette and its red accent (`#ee0000`). A storyline's `brand.accent` still overrides the accent. With no daemon, the stage uses a neutral grey-and-slate look.
20
+ - **deps:** Playwright 1.64.1 (PR #1305) and motion 14.2.0 (PR #1302).
21
+
5
22
  ## [12.54.0] — 2026-10-12
6
23
 
7
24
  ### Changed
8
- - **QE acceptance needs an isolated reviewer; a seat without one records FAIL (PR #1296, #1290).** `qe accept` runs the writer, executor and reviewer as separate workers (a fresh context per step, whose reply returns to the pipeline), so a claude QE seat no longer ends its turn on the writer's test plan. The reviewer is never run inline. **QE seat change:** a seat that cannot run an isolated sub-agent (for example pi or codex) now records FAIL `inconclusive — no isolated reviewer` instead of a verdict. Until the engine-run reviewer (wicked-core, `feat/qe-reviewer-every-seat`) ships in a core-ts release, put QE steps on a claude seat; the earlier "put QE on pi" workaround no longer yields a PASS.
25
+ - **QE acceptance needs an isolated reviewer; a seat without one records FAIL (PR #1296, #1290).** `qe accept` runs the writer, executor and reviewer as separate workers (a fresh context per step, whose reply returns to the pipeline), so a claude QE seat no longer ends its turn on the writer's test plan. The reviewer is never run inline. **QE seat change:** with wicked-core-ts 0.9.9 or later (wicked-core#917), QE acceptance works on every seat: the engine runs the reviewer as its own isolated reviewer turn, and when no reviewer is possible the operator's approve at the `qe_reviewer_unavailable` gate is the judgment, labelled "judged by operator". On an older engine (core-ts 0.9.8 or earlier) a seat that cannot run an isolated sub-agent (for example pi or codex) records FAIL `inconclusive — no isolated reviewer`: it fails closed, never a false PASS.
9
26
 
10
27
  ### Added
11
28
  - **Engine-run reviewer phases for accept (PR #1299).** `accept --phase evidence` and `accept --phase review --evidence <dir>`: inside a governed run the engine can run the isolated reviewer as its own fresh session on any seat; the verdict carries `review_session`. `--phase all` (direct use) is unchanged. Takes effect once a wicked-core release with the engine side ships.
@@ -1118,7 +1135,9 @@ through `v9.2.18`. Major themes across that span:
1118
1135
 
1119
1136
  For each of those releases, see the corresponding tag in git history.
1120
1137
 
1121
- [Unreleased]: https://github.com/mikeparcewski/wicked-garden/compare/v12.54.0...HEAD
1138
+ [Unreleased]: https://github.com/mikeparcewski/wicked-garden/compare/v12.55.1...HEAD
1139
+ [12.55.1]: https://github.com/mikeparcewski/wicked-garden/compare/v12.55.0...v12.55.1
1140
+ [12.55.0]: https://github.com/mikeparcewski/wicked-garden/compare/v12.54.0...v12.55.0
1122
1141
  [12.54.0]: https://github.com/mikeparcewski/wicked-garden/compare/v12.53.3...v12.54.0
1123
1142
  [12.53.3]: https://github.com/mikeparcewski/wicked-garden/compare/v12.53.2...v12.53.3
1124
1143
  [12.53.2]: https://github.com/mikeparcewski/wicked-garden/compare/v12.53.1...v12.53.2
package/CONTRIBUTING.md CHANGED
@@ -29,7 +29,7 @@ uv run pytest tests/ -x
29
29
 
30
30
  **For offline CI and dev environments without the wicked-vault peer only.**
31
31
 
32
- wicked-vault (npm, ≥ 0.5.0 <!-- vault-floor -->, install `npm i -g wicked-vault`)
32
+ wicked-vault (npm, ≥ 0.8.0 <!-- vault-floor -->, install `npm i -g wicked-vault`)
33
33
  is the one required peer (the loom engine is built into the garden; bus is an
34
34
  opt-in layer). The garden's produces-gates re-derive
35
35
  evidence through the built-in loom engine — `scripts/qe/vault_gate.py` runs
package/README.md CHANGED
@@ -86,7 +86,7 @@ Then, in a Claude Code session:
86
86
  **One required peer, the rest opt-in.** The evidence gate is the floor we won't fake, so it needs one external peer — setup blocks without it:
87
87
 
88
88
  ```bash
89
- npm i -g wicked-vault # wicked-vault (≥ 0.5.0), the honest-evidence backend the gate re-derives against
89
+ npm i -g wicked-vault # wicked-vault (≥ 0.8.0), the honest-evidence backend the gate re-derives against
90
90
  ```
91
91
 
92
92
  > The gate/resolve engine (formerly the separate `wicked-loom` package) is now **absorbed in-package** as of v12.27.0 (`scripts/loom/`) — nothing extra to install. The gate re-hashes recorded evidence and re-runs its verifier through that engine; a false "tests pass" is **rejected**, a missing backend **fails closed**.
@@ -170,7 +170,7 @@ Full author guide: [`docs/extending.md`](docs/extending.md).
170
170
 
171
171
  ## Requirements
172
172
 
173
- A coding-agent harness ([Claude Code](https://docs.anthropic.com/en/docs/claude-code/overview) ≥ 1.0 for the plugin surface; the peers + compiled gate are harness-agnostic) · Python 3.9+ (stdlib-only hooks) · Node + `npx` · the gate's one required peer (`wicked-vault` ≥ 0.5.0) plus opt-in layers (`wicked-estate` · `wicked-bus`).
173
+ A coding-agent harness ([Claude Code](https://docs.anthropic.com/en/docs/claude-code/overview) ≥ 1.0 for the plugin surface; the peers + compiled gate are harness-agnostic) · Python 3.9+ (stdlib-only hooks) · Node + `npx` · the gate's one required peer (`wicked-vault` ≥ 0.8.0) plus opt-in layers (`wicked-estate` · `wicked-bus`).
174
174
 
175
175
  ## License
176
176
 
package/docs/extending.md CHANGED
@@ -51,7 +51,7 @@ A complete working example (used as garden's own e2e fixture):
51
51
  ]
52
52
  }
53
53
  ],
54
- "peers": { "wicked-garden": ">=12.0.0", "wicked-vault": ">=0.5.0" },
54
+ "peers": { "wicked-garden": ">=12.0.0", "wicked-vault": ">=0.8.0" },
55
55
  "provenance": { "source": "https://github.com/acme/acme-seo-pack", "publisher": "acme" }
56
56
  }
57
57
  ```
@@ -18,7 +18,7 @@ works.
18
18
 
19
19
  | Peer | What it does | Install |
20
20
  |------|--------------|---------|
21
- | **wicked-vault** | The honest-evidence backend the gate re-derives against: record → re-hash + re-run the verifier → cross-check. Never trusts a cached status. | `npm i -g wicked-vault` — puts the `wicked-vault` binary on PATH (optionally run `wicked-vault-install` afterwards to copy the vault skills into your AI CLIs). Declared floor: **≥ 0.5.0** <!-- vault-floor --> (on 0.4.x or older, upgrade with `npm i -g wicked-vault@latest` — the peer registry's health probe, `loom doctor` / the peer-health command, reports a below-floor vault as `drift` and fails its check). Resolved at runtime via `WICKED_VAULT_BIN` → config → `PATH` → `node_modules` → `npx wicked-vault`. |
21
+ | **wicked-vault** | The honest-evidence backend the gate re-derives against: record → re-hash + re-run the verifier → cross-check. Never trusts a cached status. | `npm i -g wicked-vault` — puts the `wicked-vault` binary on PATH (optionally run `wicked-vault-install` afterwards to copy the vault skills into your AI CLIs). Declared floor: **≥ 0.8.0** <!-- vault-floor --> (below 0.8.0, upgrade with `npm i -g wicked-vault@latest` — the peer registry's health probe, `loom doctor` / the peer-health command, reports a below-floor vault as `drift` and fails its check). Resolved at runtime via `WICKED_VAULT_BIN` → config → `PATH` → `node_modules` → `npx wicked-vault`. |
22
22
 
23
23
  The core skill's `setup` action (`/wicked-garden-core setup`) **blocks** without
24
24
  it — a toolkit whose headline is "done is re-derived, not asserted" cannot ship
@@ -35,7 +35,7 @@ single source of truth; every doc restatement of the number is tagged with a
35
35
  `<!-- vault-floor -->` marker (README's bash-comment restatement can't carry an
36
36
  HTML comment, so grep the number too). **To bump the floor:** change
37
37
  `manifest.py` + `plugin.json`, then
38
- `grep -rn "vault-floor\|0\.5\.0" README.md CONTRIBUTING.md docs/ skills/` and
38
+ `grep -rn "vault-floor\|0\.8\.0" README.md CONTRIBUTING.md docs/ skills/` and
39
39
  update every tagged restatement in the same commit.
40
40
 
41
41
  ## The built-in gate engine (loom) — nothing to install
package/install.mjs CHANGED
@@ -61,7 +61,8 @@ import { execSync, spawnSync } from "node:child_process";
61
61
  const __dirname = dirname(fileURLToPath(import.meta.url));
62
62
  const pkg = JSON.parse(readFileSync(join(__dirname, "package.json"), "utf8"));
63
63
 
64
- const PLUGIN_DIRS = [".claude-plugin", "hooks", "scripts", "skills", "schemas"];
64
+ // packs/ = the editor plugin packs garden ships (`wicked-garden path packs/<name>` resolves inside the copy).
65
+ const PLUGIN_DIRS = [".claude-plugin", "hooks", "scripts", "skills", "schemas", "packs"];
65
66
  // uv.lock rides along so the copy's `uv sync` (and the launcher's `uv run --frozen`) resolve
66
67
  // the same pins the release was tested with.
67
68
  const PLUGIN_FILES = ["ETHOS.md", "CHANGELOG.md", "README.md", "WICKED_GARDEN_BUS_EVENTS.md", "pyproject.toml", "uv.lock"];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wicked-garden",
3
- "version": "12.54.0",
3
+ "version": "12.55.1",
4
4
  "type": "module",
5
5
  "description": "Curated toolkit for what AI coding agents can't do alone: evidence-gated work, codegraph relationships, deterministic multi-file refactor, multi-model second opinions, and cross-session memory. Installs as a Claude Code plugin.",
6
6
  "keywords": [
@@ -0,0 +1,29 @@
1
+ # Editor plugin packs that ship with wicked-garden
2
+
3
+ Each directory is a `wicked-pack.json` spec-2 pack built with the editor-plugin builder
4
+ (the `wicked-garden-editor-scaffold` skill), the same way the `editor-plugin` workflow builds any plugin.
5
+ None of them uses the reserved `wicked` vendor: that prefix belongs to the editors bundled inside studio.
6
+
7
+ | Pack | Opens | What it is |
8
+ |---|---|---|
9
+ | `garden-mcp-inspector` | `mcp-server` | The MCP inspector: list a server's tools, resources and prompts, call them, and read the JSON-RPC log. The host connects the server and draws Connect, Restart and the call line. |
10
+
11
+ ## How it was made
12
+
13
+ ```
14
+ wicked-garden run scripts/editor/scaffold.py --vendor garden --id garden-mcp-inspector --title "MCP inspector" \
15
+ --kinds mcp-server --permissions artifact.read,mcp.session,ui.fullscreen --surfaces <its surfaces JSON> \
16
+ --out packs/garden-mcp-inspector
17
+ ```
18
+
19
+ Then the inspector went into the entry's YOUR EDITOR part, and `pin.py` re-pinned the hash. `tests/editor/test_garden_packs.py`
20
+ re-runs that scaffold with the pack's own declaration and requires everything but the entry's hash to match.
21
+
22
+ ## Install one
23
+
24
+ ```
25
+ wicked-garden run scripts/editor/install.py --dir "$(wicked-garden path packs/garden-mcp-inspector)" --crew-url <the daemon URL>
26
+ ```
27
+
28
+ The daemon re-runs `pack check` and the conformance cases before it lists the editor. Installing grants
29
+ `mcp.session` for this build only, and studio's MCP inspector page then opens it.
@@ -0,0 +1,35 @@
1
+ # MCP inspector
2
+
3
+ An artifact editor plugin for wicked-studio (`garden-mcp-inspector` 0.1.0), packaged as a
4
+ `wicked-pack.json` spec-2 pack. It opens: mcp-server.
5
+
6
+ - `wicked-pack.json` declares the editor: its id, the artifact kinds it opens, its sizes, every
7
+ permission it asks for and why, and the sha256 of its one entry file.
8
+ - `editors/garden-mcp-inspector/index.html` is the whole editor: one self-contained HTML file speaking the
9
+ `wicked.editor/2` protocol (and /1 to an older host) to studio's plugin host over a MessagePort. It
10
+ runs in sandboxed frames with no network: the card in the run's thread, the options tabs in the host
11
+ panel and full screen, all drawn from the `surfaces` its manifest declares.
12
+
13
+ ## Check it
14
+
15
+ ```
16
+ wicked-garden run scripts/editor/pin.py . # re-pin the entry's sha256 after an edit
17
+ npx wicked-garden pack check . # the manifest and the entry
18
+ wicked-garden run scripts/editor/conformance.py --pack . --host-url <a wicked-crew daemon URL> --json
19
+ ```
20
+
21
+ The conformance run drives studio's conformance host page in headless Chromium against this
22
+ editor: handshake, sizes, no network, permissions, typing never acts, key forwarding, strict
23
+ input, liveness, keyboard reach, theme, the pinned hash, and the three surfaces (the card, each
24
+ options tab, full screen and its modes). On a slow host, give it longer to load the page with
25
+ `--timeout <seconds>` (default 120).
26
+
27
+ ## Install it
28
+
29
+ Through the `editor-plugin` workflow's install step, or by hand:
30
+
31
+ ```
32
+ wicked-garden run scripts/editor/install.py --dir . --crew-url <the daemon URL>
33
+ ```
34
+
35
+ It then shows in studio under Settings → Developer → Editor plugins, and opens in the editor dev host.