@mutmutco/hermes-plugin 4.1.9 → 4.1.11

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/hermes-plugin",
3
- "version": "4.1.9",
3
+ "version": "4.1.11",
4
4
  "description": "MMI canonical skills transported as a Hermes Agent native plugin.",
5
5
  "author": {
6
6
  "name": "MMI Future",
package/plugin.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": 1,
3
3
  "name": "mmi",
4
- "version": "4.1.9",
4
+ "version": "4.1.11",
5
5
  "description": "MMI canonical workflow skills and fail-closed pre-tool policy gates.",
6
6
  "provides_hooks": [
7
7
  "pre_tool_call"
@@ -186,12 +186,21 @@ direction is a gate. Read the rows.
186
186
  Treating doctor's exit code as the gate halts a healthy train on cosmetic drift — or, worse, teaches an
187
187
  operator to ignore doctor's exit code entirely.
188
188
 
189
+ **`mmi-cli devops release --apply` and `mmi-cli devops rcand --apply` now run an active npm-major preflight
190
+ before any branch/tag mutation (#5666).** They read the repo's expected CI npm from `.github/workflows/gate.yml`
191
+ (when the infra gate's exact node pin maps to a bundled npm, e.g. node 24.19.0 → npm 11.17.0) or, when
192
+ gate.yml only declares a floating node major with no bundled npm, from the publish workflow's explicit npm pin
193
+ (e.g. `npx --yes npm@11.17.0 pack` in `publish.yml`). Local `npm -v` must match that npm **major**; a
194
+ mismatch refuses `--apply` with an align-local-npm remedy — the same class of failure the fold-failure notes
195
+ below describe, but caught before a wasted apply.
196
+
189
197
  **A local `npm ci` failure during the fold on a lockfile CI already accepted is an npm-major mismatch, not a
190
198
  bad lockfile (#4578).** Before touching the lockfile, compare toolchains:
191
199
  ```bash
192
200
  npm -v
193
201
  gh api repos/{owner}/{repo}/actions/runs --jq '.workflow_runs[0].id' # or read the gate log's
194
202
  # `node -v && npm -v` toolchain-preflight line (#3446) for the npm major CI ran with
203
+ # When gate.yml has no bundled npm pin, read the publish workflow npm pin instead (#5666).
195
204
  ```
196
205
  A different npm MAJOR (e.g. local 12 vs. CI's 11) resolves the same lockfile differently and throws `Missing:
197
206
  <pkg> from lock file` on a lockfile that is not actually broken. Align the local npm major
@@ -204,7 +213,8 @@ BEFORE inspecting package contents (deleted dir, malformed `package.json`, missi
204
213
  ```bash
205
214
  npm -v
206
215
  # green gate npm from the gate log's `node -v && npm -v` toolchain-preflight line (#3446),
207
- # or the exact node pin in `.github/workflows/gate.yml` (Hub infra gate: node 24.19.0 → npm 11.17.0)
216
+ # the exact node pin in `.github/workflows/gate.yml` (Hub infra gate: node 24.19.0 → npm 11.17.0),
217
+ # or the publish workflow npm pin when gate.yml has no bundled npm (#5666)
208
218
  ```
209
219
  When local npm differs from the green gate (e.g. local npm 12 vs CI's 11.17.0), align local npm
210
220
  (`npm install -g npm@<gate npm>`) and rerun the train — do not rewrite the publish surface for an
@@ -655,13 +665,28 @@ self-hosted Linux runner) — or on an operator machine with the **same OS and n
655
665
  runner. Elsewhere (Windows, a clean Linux container with a different packer, a mismatched npm major) a
656
666
  `tarball identity mismatch` can false-fail even when the published bytes match the tag: three different
657
667
  SSRIs (registry / Windows pack / container pack) with content-identical unpacked trees is the expected
658
- cross-environment shape, not a substituted artifact. Off the publish environment, either:
668
+ cross-environment shape for surfaces with no publish-time staged payload, not a substituted artifact.
669
+ Off the publish environment, either:
659
670
  - fall back to an **unpacked-content** proof — download the registry tarball (`npm pack <pkg>@X.Y.Z`
660
671
  from the registry, or `npm view … dist.tarball`), `npm pack` from the tag checkout, unpack both, and
661
- `diff -r` the trees (empty diff ⇒ identity OK; do not alarm on SSRI alone), or
672
+ compare the trees (do not alarm on SSRI alone). Hub host-plugin npm surfaces stage the canonical
673
+ `skills/` tree and declared hook-policy `scripts/` into the package at publish time via
674
+ `assembleDeclaredPayloads` (#5471); those paths are gitignored and absent from a plain tag checkout,
675
+ so a local `npm pack` without staging cannot reproduce them and an empty `diff -r` is an unreachable
676
+ bar (#5677), not evidence of substitution. For those surfaces, prove identity in two parts:
677
+ 1. **Committed package content** — `diff -r` the unpacked trees while excluding each publish-time
678
+ staged path relative to the package root (for `@mutmutco/claude-plugin`:
679
+ `diff -r -x skills -x scripts …`; list all staged targets with
680
+ `node --input-type=module -e "import { generatedPayloadPaths } from './scripts/distribution-assembly.mjs'; console.log(generatedPayloadPaths().join('\\n'))"` and strip each surface's `assembly.rootPath` prefix). Empty diff ⇒ the committed package matches.
681
+ 2. **Staged payload** — for each excluded path, compare the registry unpacked copy against the tag
682
+ checkout repo source named in that surface's `surfaces.json` assembly sync (`directories` sync:
683
+ `diff -r reg/package/skills skills/`; `files` sync: `cmp` each `include` entry against
684
+ `<sourcePath>/<name>`). Alternatively, run
685
+ `node --input-type=module -e "import { assembleDeclaredPayloads } from './scripts/distribution-assembly.mjs'; assembleDeclaredPayloads()"` on the tag checkout before the local `npm pack` so a plain `diff -r` compares the full publish payload.
686
+ Surfaces with no publish-time staged payload still use a plain `diff -r` (empty diff ⇒ identity OK), or
662
687
  - skip the registry identity read with
663
688
  `node scripts/release-distribution.mjs verify "X.Y.0" --skip-npm-view` and verify published content
664
- by hand the same way.
689
+ by hand the same way (including the staged-payload split above when applicable).
665
690
  Do not treat an off-runner SSRI mismatch as a broken release, and do not change how the runner publishes
666
691
  to paper over a local packer difference.
667
692