@mutmutco/cursor-plugin 4.2.6 → 4.3.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/.cursor-plugin/plugin.json +2 -3
- package/package.json +1 -1
- package/scripts/edit-tool-paths.mjs +4 -4
- package/skills/bootstrap/SKILL.md +2 -2
- package/skills/bootstrap/seeds/README.template.md +2 -2
- package/skills/bootstrap/seeds/gate.template.yml +5 -5
- package/skills/bootstrap/seeds/manifest.json +1 -0
- package/skills/bootstrap/seeds/test-policy.template.json +4 -0
- package/skills/hotfix/SKILL.md +1 -1
- package/skills/rcand/SKILL.md +1 -1
- package/skills/release/SKILL.md +55 -16
- package/skills/secrets/SKILL.md +1 -1
- package/skills/stage/SKILL.md +1 -1
- package/bin/mmi-hook +0 -2
- package/bin/mmi-hook-console.cmd +0 -16
- package/bin/mmi-hook.exe +0 -0
- package/hooks/cursor-hooks.json +0 -26
- package/scripts/command-ladder-core.mjs +0 -339
- package/scripts/command-ladder-gate.mjs +0 -126
- package/scripts/deny-gate-crash.mjs +0 -179
- package/scripts/env-write-lint.mjs +0 -146
- package/scripts/hook-io.mjs +0 -22
- package/scripts/hook-policy.mjs +0 -78
- package/scripts/hook-run.mjs +0 -434
- package/scripts/hook-trace.mjs +0 -151
- package/scripts/pretooluse-shell-gates.mjs +0 -720
- package/scripts/secret-echo-lint.mjs +0 -177
- package/scripts/test-command-policy-core.mjs +0 -294
- package/scripts/throttle-core.mjs +0 -332
- package/scripts/vault-edit-gate.mjs +0 -94
- package/skills/browser-automation/SKILL.md +0 -122
- package/skills/mmi/SKILL.md +0 -544
- package/skills/mmi-doctor/SKILL.md +0 -66
- package/skills/mmi-resume/SKILL.md +0 -123
- package/skills/onboard/SKILL.md +0 -72
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mmi",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.3.0",
|
|
4
4
|
"mmiCompat": "4.x",
|
|
5
5
|
"description": "MMI workflow skills and organisation gates for Cursor.",
|
|
6
6
|
"author": {
|
|
@@ -16,6 +16,5 @@
|
|
|
16
16
|
"workflow",
|
|
17
17
|
"organisation"
|
|
18
18
|
],
|
|
19
|
-
"skills": "./skills/"
|
|
20
|
-
"hooks": "./hooks/cursor-hooks.json"
|
|
19
|
+
"skills": "./skills/"
|
|
21
20
|
}
|
package/package.json
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
// whole patch in `tool_input.command` — there is no `file_path` at all. A gate that reads only
|
|
5
5
|
// `file_path` therefore sees nothing to check and exits 0: on Codex the vault-edit gate FAILED OPEN and
|
|
6
6
|
// `apply_patch` could create a `.env`, while the guide claimed the path was protected (cross-vendor
|
|
7
|
-
// check, openai-sol). Matching `apply_patch` in a
|
|
7
|
+
// check, openai-sol). Matching `apply_patch` in a host manifest does not rewrite the payload.
|
|
8
8
|
//
|
|
9
|
-
// One extractor, used by every edit-shaped
|
|
9
|
+
// One extractor, used by every edit-shaped integration, so a new host contract is taught in one place.
|
|
10
10
|
|
|
11
11
|
/** Tool names that mean "this call writes files". `StrReplace` is Cursor's in-place edit tool: it
|
|
12
12
|
* carries its target in `tool_input.path` and was outside this set, so even once the adapter matched
|
|
@@ -63,7 +63,7 @@ const SHELL_WRAPPERS = new Set(['bash', 'sh', 'zsh', 'dash', 'pwsh', 'powershell
|
|
|
63
63
|
export function invokesApplyPatch(command) {
|
|
64
64
|
if (typeof command !== 'string' || !command) return false;
|
|
65
65
|
// Redirects may abut the command word — `apply_patch<<'EOF'` and `apply_patch<<<"$P"` are both valid
|
|
66
|
-
// shell, and both hid the command name from a whitespace tokenizer (cross-vendor check
|
|
66
|
+
// shell, and both hid the command name from a whitespace tokenizer (cross-vendor check).
|
|
67
67
|
// Separating the operators first is what makes the command word its own token in every form.
|
|
68
68
|
const spaced = command.replace(/([<>]+)/g, ' $1 ');
|
|
69
69
|
for (const segment of spaced.split(/\|\||&&|[;&|\n]|<<-?\s*['"]?\w+['"]?/)) {
|
|
@@ -85,7 +85,7 @@ export function invokesApplyPatch(command) {
|
|
|
85
85
|
/**
|
|
86
86
|
* Every file path a tool call writes to. Returns `[]` for non-edit tools and unreadable payloads —
|
|
87
87
|
* callers treat an empty list as "nothing to check", exactly as they treated a missing `file_path`.
|
|
88
|
-
* @param {{ tool_name?: unknown, tool_input?: Record<string, unknown> }} input raw
|
|
88
|
+
* @param {{ tool_name?: unknown, tool_input?: Record<string, unknown> }} input raw tool payload
|
|
89
89
|
* @returns {string[]}
|
|
90
90
|
*/
|
|
91
91
|
export function editedPaths(input) {
|
|
@@ -3,7 +3,7 @@ name: bootstrap
|
|
|
3
3
|
description: Provision a repo into the org with board, registry, rules, and plugin setup.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
**Host-native invocation:** Claude `/mmi:bootstrap` · Codex `$mmi:bootstrap` ·
|
|
6
|
+
**Host-native invocation:** Claude `/mmi:bootstrap` · Codex `$mmi:bootstrap` · Cursor `/bootstrap` · jervcode `/bootstrap` · Hermes skill_view. A backticked `/name` in this doc names the matching workflow (this skill or a sibling), not a literal command.
|
|
7
7
|
|
|
8
8
|
# /bootstrap — provision a repo into the org
|
|
9
9
|
|
|
@@ -506,7 +506,7 @@ mmi-cli devops bootstrap apply "$OWNER/$REPO" --class deployable \
|
|
|
506
506
|
Tenant-container repos must carry a `docker-compose.yml` and Dockerfile that build from the shipped source
|
|
507
507
|
archive; the train does not ship a prebuilt `dist/`. **Bootstrap seeds both files** for
|
|
508
508
|
`deployModel: tenant-container` from `skills/bootstrap/seeds/` (rendered from
|
|
509
|
-
|
|
509
|
+
the bootstrap seed Dockerfile and compose templates). The box
|
|
510
510
|
writes the release `.env` from the registry + vault at deploy time; the compose file carries `env_file: .env`
|
|
511
511
|
and the app reads plain env vars — it must **not** self-load SSM and must **not** ship a committed `.env`.
|
|
512
512
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# {{REPO_NAME}}
|
|
2
2
|
|
|
3
3
|
> One paragraph: what this repo **is** — the product/service and who it's for. (Write fresh — D35: do
|
|
4
|
-
> not carry a legacy README over verbatim; the
|
|
4
|
+
> not carry a legacy README over verbatim; write the current product map.)
|
|
5
5
|
|
|
6
6
|
## What's here
|
|
7
7
|
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
(Owner/operator — who runs this day to day.) Access follows the MMI Future three-level model: read for
|
|
13
13
|
org members, developer as GitHub `write`, project-admin as `write` plus train-branch allowlist. Authority
|
|
14
|
-
detail → [
|
|
14
|
+
detail → [Hub architecture](https://github.com/mutmutco/MMI-Hub/blob/main/architecture.md);
|
|
15
15
|
access runbook → [repo-access](https://github.com/mutmutco/MMI-Hub/blob/development/docs/Guides/repo-access.md).
|
|
16
16
|
|
|
17
17
|
## Agent context
|
|
@@ -28,7 +28,7 @@ name: gate
|
|
|
28
28
|
# Do not add a windows-compat (or any other) job that runs-on GH-hosted Windows. Linux self-hosted
|
|
29
29
|
# (mmi-live / mmi-heavy) is the only CI merge gate. Rare Windows proof stays on the owner's machine or
|
|
30
30
|
# a future self-hosted Windows runner — never windows-latest.
|
|
31
|
-
# (seed touch: keep
|
|
31
|
+
# (seed touch: keep BOM digests in lockstep after classifier land.)
|
|
32
32
|
on:
|
|
33
33
|
pull_request:
|
|
34
34
|
push:
|
|
@@ -79,17 +79,17 @@ jobs:
|
|
|
79
79
|
offenders=$(mktemp)
|
|
80
80
|
trap 'rm -f "$offenders"' EXIT
|
|
81
81
|
{
|
|
82
|
-
git grep -Il $'\r' -- '*.sh' || true
|
|
83
|
-
git grep -Il '^#!' | while IFS= read -r path; do
|
|
82
|
+
git grep --cached -Il $'\r' -- '*.sh' || true
|
|
83
|
+
git grep --cached -Il '^#!' | while IFS= read -r path; do
|
|
84
84
|
case "$path" in
|
|
85
85
|
*.sh) ;;
|
|
86
|
-
*) git grep -Il $'\r' -- "$path" || true ;;
|
|
86
|
+
*) git grep --cached -Il $'\r' -- "$path" || true ;;
|
|
87
87
|
esac
|
|
88
88
|
done
|
|
89
89
|
} | sort -u > "$offenders"
|
|
90
90
|
if [[ -s "$offenders" ]]; then
|
|
91
91
|
while IFS= read -r path; do
|
|
92
|
-
|
|
92
|
+
printf "::error title=Line-ending guard::CR byte in tracked script: %s. Run git add --renormalize . with this repo's .gitattributes.\n" "$path"
|
|
93
93
|
done < "$offenders"
|
|
94
94
|
exit 1
|
|
95
95
|
fi
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
{ "target": "README.md", "source": "seed:README.template.md", "ownership": "repo", "classes": ["deployable", "content"], "managedBlock": { "source": "seed:readme-mmi-developer-environment.block.md", "begin": "<!-- mmi-developer-environment:start -->", "end": "<!-- mmi-developer-environment:end -->" } },
|
|
16
16
|
{ "target": "architecture.md", "source": "seed:architecture.template.md", "ownership": "repo", "classes": ["deployable", "content"] },
|
|
17
17
|
{ "target": "docs/decisions/README.md", "source": "seed:decisions-readme.template.md", "ownership": "repo", "classes": ["deployable", "content"] },
|
|
18
|
+
{ "target": "test-policy.json", "source": "seed:test-policy.template.json", "ownership": "repo", "classes": ["deployable", "content"] },
|
|
18
19
|
{ "target": "docs/Guides/google-login.md", "source": "seed:google-login.template.md", "ownership": "repo", "classes": ["deployable"], "projectTypes": ["web-app"] },
|
|
19
20
|
{ "target": "docker-compose.yml", "source": "seed:docker-compose.template.yml", "ownership": "repo", "classes": ["deployable"], "deployModels": ["tenant-container"] },
|
|
20
21
|
{ "target": "Dockerfile", "source": "seed:Dockerfile.template", "ownership": "repo", "classes": ["deployable"], "deployModels": ["tenant-container"] }
|
package/skills/hotfix/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: hotfix
|
|
|
3
3
|
description: Promote an already-merged development fix to main and production through the gated Hub train.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
**Host-native invocation:** Claude `/mmi:hotfix` · Codex `$mmi:hotfix` ·
|
|
6
|
+
**Host-native invocation:** Claude `/mmi:hotfix` · Codex `$mmi:hotfix` · Cursor `/hotfix` · jervcode `/hotfix` · Hermes skill_view. A backticked `/name` in this doc names the matching workflow (this skill or a sibling), not a literal command.
|
|
7
7
|
|
|
8
8
|
# /hotfix — promote a development fix to main + prod
|
|
9
9
|
|
package/skills/rcand/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: rcand
|
|
|
3
3
|
description: Promote development to a release-candidate branch.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
**Host-native invocation:** Claude `/mmi:rcand` · Codex `$mmi:rcand` ·
|
|
6
|
+
**Host-native invocation:** Claude `/mmi:rcand` · Codex `$mmi:rcand` · Cursor `/rcand` · jervcode `/rcand` · Hermes skill_view. A backticked `/name` in this doc names the matching workflow (this skill or a sibling), not a literal command.
|
|
7
7
|
|
|
8
8
|
# /rcand — promote development to release-candidate
|
|
9
9
|
|
package/skills/release/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: release
|
|
|
3
3
|
description: Ship rc or direct-track development to main and production.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
**Host-native invocation:** Claude `/mmi:release` · Codex `$mmi:release` ·
|
|
6
|
+
**Host-native invocation:** Claude `/mmi:release` · Codex `$mmi:release` · Cursor `/release` · jervcode `/release` · Hermes skill_view. A backticked `/name` in this doc names the matching workflow (this skill or a sibling), not a literal command.
|
|
7
7
|
|
|
8
8
|
**Argument (#4929):** `/release minor`, `/release major`, or `/release patch` — a bare bump word, never a
|
|
9
9
|
`--flag` or env var. Map it to `MMI_BUMP_INTENT` exported for the whole run (the train and
|
|
@@ -187,13 +187,25 @@ Treating doctor's exit code as the gate halts a healthy train on cosmetic drift
|
|
|
187
187
|
operator to ignore doctor's exit code entirely.
|
|
188
188
|
|
|
189
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, in this order (#5866
|
|
191
|
-
an explicit `npm-version:` on the gate's `runner-node-toolchain` step; else
|
|
192
|
-
|
|
193
|
-
|
|
190
|
+
before any branch/tag mutation (#5666).** They read the repo's expected CI npm, in this order (#5866,
|
|
191
|
+
#5893): an explicit `npm-version:` on the gate's `runner-node-toolchain` step; else an explicit
|
|
192
|
+
`npm install -g npm@<major>` step in gate.yml; else the infra gate's exact node pin through the
|
|
193
|
+
bundled-npm map (only for an estate that still carries a retired pre-#5870 pin); else the publish
|
|
194
|
+
workflow's own npm pin (`npm install -g npm@12`, the #5870 retirement shape). Local `npm -v`
|
|
194
195
|
must match that npm **major**; a
|
|
195
196
|
mismatch refuses `--apply` before any repository write.
|
|
196
197
|
|
|
198
|
+
**Both gate shapes are a declaration; only a gate that declares NEITHER falls through (#5893).** A lane
|
|
199
|
+
that installs its own npm has stated its npm as plainly as an `npm-version:` input — the shape differs, the
|
|
200
|
+
intent does not. Reading only `npm-version:` skipped Jerv-JervCode's gate (floating `node-version: 24`
|
|
201
|
+
plus `npm install -g npm@12`), fell through to publish.yml's stale npm 11, and prescribed a downgrade the
|
|
202
|
+
repo had already retired (#2845, MMI-Hub#5871); the publish smoke then failed under npm 11 (`Cannot find
|
|
203
|
+
module jiti/package.json` — a packed global install materializes no dependency closure under npm 11 once
|
|
204
|
+
the root declares `bundleDependencies`), shipping v1.57.7 to main with a Release but no npm publish.
|
|
205
|
+
**When gate.yml and publish.yml disagree on the npm major, that is a repo defect** — one lane will run the
|
|
206
|
+
wrong toolchain whichever the preflight believes. The preflight names it and proceeds; fix it with a PR
|
|
207
|
+
moving both pins together, never by silently trusting publish.yml.
|
|
208
|
+
|
|
197
209
|
**Check which side is wrong before repairing (#5862).** The receipt names one direction — move the machine
|
|
198
210
|
to the pin — and that is only right when the pin is current. Compare it against the registry first:
|
|
199
211
|
|
|
@@ -225,7 +237,8 @@ bad lockfile (#4578).** Before touching the lockfile, compare toolchains:
|
|
|
225
237
|
npm -v
|
|
226
238
|
gh api repos/{owner}/{repo}/actions/runs --jq '.workflow_runs[0].id' # or read the gate log's
|
|
227
239
|
# `node -v && npm -v` toolchain-preflight line (#3446) for the npm major CI ran with
|
|
228
|
-
#
|
|
240
|
+
# Read the gate's OWN declared npm first — `npm-version:` or `npm install -g npm@X` (#5893);
|
|
241
|
+
# only a gate that declares neither falls back to the publish workflow npm pin (#5666).
|
|
229
242
|
```
|
|
230
243
|
A different npm MAJOR (e.g. local 12 vs. CI's 11) resolves the same lockfile differently and throws `Missing:
|
|
231
244
|
<pkg> from lock file` on a lockfile that is not actually broken. Align the local npm major
|
|
@@ -238,8 +251,9 @@ BEFORE inspecting package contents (deleted dir, malformed `package.json`, missi
|
|
|
238
251
|
```bash
|
|
239
252
|
npm -v
|
|
240
253
|
# green gate npm from the gate log's `node -v && npm -v` toolchain-preflight line (#3446),
|
|
241
|
-
# the gate's declared `npm-version
|
|
242
|
-
# or the publish workflow npm pin when gate
|
|
254
|
+
# the gate's declared `npm-version:` or its `npm install -g npm@X` step (#5893), or an exact
|
|
255
|
+
# node pin that maps to a bundled npm, or the publish workflow npm pin when the gate declares
|
|
256
|
+
# no npm of its own (#5666)
|
|
243
257
|
```
|
|
244
258
|
When local npm differs from the green gate (e.g. local npm 11 vs CI's 12), align local npm
|
|
245
259
|
(`npm install -g npm@<gate npm>`) and rerun the train — do not rewrite the publish surface for an
|
|
@@ -400,7 +414,7 @@ What the fold bumps, by repo:
|
|
|
400
414
|
`scripts/check-hook-contract.mjs`, which executes host adapter commands as a native argv without a
|
|
401
415
|
shell (#5605), so a checkout path that contains spaces is supported; the spaced-path argv regression
|
|
402
416
|
is pinned in `infra/plugin-set.test.mjs`. Publication and staging both derive from `surfaces.json`;
|
|
403
|
-
there is no second package list. Claude, Codex,
|
|
417
|
+
there is no second package list. Claude, Codex, Cursor, jervcode, and Hermes are active.
|
|
404
418
|
- **App-style repos with a root `package.json`** (most products): the manifest + lockfile version via
|
|
405
419
|
`npm version --no-git-tag-version`, kept in lockstep with the release tag.
|
|
406
420
|
- **Repos with neither:** nothing to fold — the tag is the version.
|
|
@@ -589,8 +603,7 @@ Before running `--apply` for MMI-Hub, resolve the real tag first:
|
|
|
589
603
|
`v2.43.0`) in summaries, Slack, chat, and the final report; never a placeholder like `vX.Y.0` or
|
|
590
604
|
`v0.x.0`.
|
|
591
605
|
|
|
592
|
-
**Write the announcement
|
|
593
|
-
release type. It is the authoritative contract; follow it and its checklist before posting. Key rules:
|
|
606
|
+
**Write the announcement from the actual release evidence** — summarize the user-visible change, required action, and recovery path before posting. Key rules:
|
|
594
607
|
|
|
595
608
|
- **Audience is the whole org** — no issue/PR numbers, repo names, commit SHAs, or internal tool jargon.
|
|
596
609
|
- **Scale length and depth by release type** (major > minor > patch > hotfix): a major is a broad,
|
|
@@ -650,6 +663,11 @@ mmi-cli oracle org project sync-info --apply # omit --apply for the read-only
|
|
|
650
663
|
release: the alignment PR's own `cli`/`infra`/`docs` checks are still running, so a plain immediate merge is
|
|
651
664
|
policy-blocked — `--auto` merges once they pass. If you await with `--wait` instead, still pass `--merge`
|
|
652
665
|
(`mmi-cli devops pr merge <number> --wait --merge`); `--wait` alone must not land the alignment PR. Never force.
|
|
666
|
+
A pre-#5903 CLI can true-merge this PR and still exit 1 with `mergeStatus: partial-cleanup` after GitHub
|
|
667
|
+
refuses to delete its protected `main` head. Classify that legacy receipt from the live PR: `MERGED` with
|
|
668
|
+
merge method `MERGE` means alignment succeeded and protected-main retention is expected. Never delete
|
|
669
|
+
`main`, retry the release, or call the alignment failed. Current CLIs report the same retention as
|
|
670
|
+
`remoteBranch.status: retained-protected` with `mergeStatus: merged`.
|
|
653
671
|
- Full-track repos: `mmi-cli devops release --apply` already aligned `rc` to the released `main` (#1036 — the
|
|
654
672
|
push runs inside the authority-gated train; the result reports it as `rcAlignment`). No manual `rc`
|
|
655
673
|
push — if the result reports a failed alignment, investigate and rerun via the train, never bare-push.
|
|
@@ -659,11 +677,10 @@ mmi-cli oracle org project sync-info --apply # omit --apply for the read-only
|
|
|
659
677
|
(`checkout`, #2340) and fast-forwards the others (`localSync`) — non-destructively: only a true
|
|
660
678
|
fast-forward moves a branch; a diverged local branch is reported and left untouched (never a force).
|
|
661
679
|
The one branch it **cannot** sync at release time is a check-gated `development` whose roll-forward is a
|
|
662
|
-
`pr-pending` alignment PR (Hub) — that PR merges on origin *after* the release returns.
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
work — no manual `git pull`. Nothing here ever blocks or fails the release.
|
|
680
|
+
`pr-pending` alignment PR (Hub) — that PR merges on origin *after* the release returns. Once that PR
|
|
681
|
+
lands, fast-forward the local branch yourself (`git pull --ff-only` on `development`) — #5908 retired
|
|
682
|
+
the session-start self-heal along with the rest of the hook-era plumbing. Nothing here ever blocks or
|
|
683
|
+
fails the release.
|
|
667
684
|
- **Read the `checkout:` clause — it does not always say "returned" (#4006).** The report always prints
|
|
668
685
|
one, and restoration is deliberately skipped rather than forced when the repo is not in a fit state.
|
|
669
686
|
A release leaves the repo on `main` until the train moves it back, so a non-`returned` outcome means
|
|
@@ -740,6 +757,28 @@ Release-blocking for Hub tooling changes: every public artifact must match the r
|
|
|
740
757
|
identity. Manual fallback if CI can't publish: `node scripts/release-distribution.mjs publish "X.Y.0"`
|
|
741
758
|
from a machine with npm auth.
|
|
742
759
|
|
|
760
|
+
**Windows WebAuthn/passkey exception (#5920).** Normal publishing remains non-interactive and token-based;
|
|
761
|
+
headless and CI hosts keep using automation tokens. When any npm write requires a human desktop passkey on
|
|
762
|
+
Windows, **never run it from the agent shell**. Write the package loop to a durable `.cmd` outside disposable
|
|
763
|
+
worktrees (for example, `C:\Users\<you>\Documents\mmi-npm-write.cmd`):
|
|
764
|
+
```bat
|
|
765
|
+
@echo off
|
|
766
|
+
set "failures=%~dpn0.failures.txt"
|
|
767
|
+
del "%failures%" 2>nul
|
|
768
|
+
for %%P in (@scope/package-a @scope/package-b) do (
|
|
769
|
+
call npm deprecate "%%P@*" "replacement message"
|
|
770
|
+
if errorlevel 1 >>"%failures%" echo %%P
|
|
771
|
+
)
|
|
772
|
+
if exist "%failures%" type "%failures%"
|
|
773
|
+
```
|
|
774
|
+
Launch it visibly and leave the window open, then let the human tap once for each npm invocation:
|
|
775
|
+
```powershell
|
|
776
|
+
Start-Process cmd -ArgumentList '/k', 'C:\Users\<you>\Documents\mmi-npm-write.cmd'
|
|
777
|
+
```
|
|
778
|
+
Ignore any EOTP browser URL npm prints; it does not complete this passkey flow. Treat the failure file as the
|
|
779
|
+
per-package receipt and verify the corresponding registry state, for example
|
|
780
|
+
`npm view <pkg> deprecated --prefer-online` after `npm deprecate`.
|
|
781
|
+
|
|
743
782
|
**npm tarball identity is packer-sensitive (#5366 / #5251).** `verify` without `--skip-npm-view`
|
|
744
783
|
compares the registry's served `dist.integrity` (SSRI) against a live `npm pack` on THIS machine
|
|
745
784
|
(`packedIntegrityBySurface`). A tarball SSRI covers file modes and packer (npm version) behavior, so
|
package/skills/secrets/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: secrets
|
|
|
3
3
|
description: Manage the full own-project vault and granted org-infra secret names.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
**Host-native invocation:** Claude `/mmi:secrets` · Codex `$mmi:secrets` ·
|
|
6
|
+
**Host-native invocation:** Claude `/mmi:secrets` · Codex `$mmi:secrets` · Cursor `/secrets` · jervcode `/secrets` · Hermes skill_view. A backticked `/name` in this doc names the matching workflow (this skill or a sibling), not a literal command.
|
|
7
7
|
|
|
8
8
|
# /secrets — two-tier project secrets
|
|
9
9
|
|
package/skills/stage/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: stage
|
|
|
3
3
|
description: Run a local test stage, or a personal cloud dev stage with --live.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
**Host-native invocation:** Claude `/mmi:stage` · Codex `$mmi:stage` ·
|
|
6
|
+
**Host-native invocation:** Claude `/mmi:stage` · Codex `$mmi:stage` · Cursor `/stage` · jervcode `/stage` · Hermes skill_view. A backticked `/name` in this doc names the matching workflow (this skill or a sibling), not a literal command.
|
|
7
7
|
|
|
8
8
|
# /stage — local test environment
|
|
9
9
|
|
package/bin/mmi-hook
DELETED
package/bin/mmi-hook-console.cmd
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
:; exec node "$@" # sh half: cmd sees a label, POSIX shells exec node exactly like bin/mmi-hook
|
|
2
|
-
:: <#
|
|
3
|
-
@echo off
|
|
4
|
-
rem sh/cmd/PowerShell polyglot console launcher (#4878/#5591), stored CRLF: cmd mis-parses LF-only batch files.
|
|
5
|
-
rem The trailing # on line 1 keeps the CR out of the sh exec. Line 2 opens a PowerShell block comment so
|
|
6
|
-
rem `powershell -File` can parse this trampoline. Line 2 is a LABEL, not `rem`: echo is still on until
|
|
7
|
-
rem line 3, so `rem <#` was echoed as `<cwd>>rem <# ` onto every hook stdout ahead of the payload, and
|
|
8
|
-
rem cmd never echoes a label (#5828). The space in `:: <#` is load-bearing: `::<#` stops PowerShell parsing.
|
|
9
|
-
rem PowerShell never waits on the GUI-subsystem mmi-hook.exe, so the batch half enters that same windowless
|
|
10
|
-
rem exe through cmd (which PowerShell does wait on). Referenced WITH the .cmd extension: an extensionless
|
|
11
|
-
rem sibling would win PowerShell path resolution and run as neither.
|
|
12
|
-
"%~dp0mmi-hook.exe" %*
|
|
13
|
-
exit /b %errorlevel%
|
|
14
|
-
#>
|
|
15
|
-
& (Join-Path $PSScriptRoot 'mmi-hook.exe') @args
|
|
16
|
-
exit $LASTEXITCODE
|
package/bin/mmi-hook.exe
DELETED
|
Binary file
|
package/hooks/cursor-hooks.json
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 1,
|
|
3
|
-
"hooks": {
|
|
4
|
-
"preToolUse": [
|
|
5
|
-
{
|
|
6
|
-
"command": "'${CURSOR_PLUGIN_ROOT}/bin/mmi-hook-console.cmd' '${CURSOR_PLUGIN_ROOT}/scripts/hook-run.mjs' --surface cursor --gate command-ladder",
|
|
7
|
-
"matcher": "Shell",
|
|
8
|
-
"timeout": 10,
|
|
9
|
-
"failClosed": true
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"command": "'${CURSOR_PLUGIN_ROOT}/bin/mmi-hook-console.cmd' '${CURSOR_PLUGIN_ROOT}/scripts/hook-run.mjs' --surface cursor --gate vault-edit",
|
|
13
|
-
"matcher": "Write",
|
|
14
|
-
"timeout": 5,
|
|
15
|
-
"failClosed": true
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
"command": "'${CURSOR_PLUGIN_ROOT}/bin/mmi-hook-console.cmd' '${CURSOR_PLUGIN_ROOT}/scripts/hook-run.mjs' --surface cursor --gate vault-edit",
|
|
19
|
-
"matcher": "StrReplace",
|
|
20
|
-
"timeout": 5,
|
|
21
|
-
"failClosed": true
|
|
22
|
-
}
|
|
23
|
-
],
|
|
24
|
-
"postToolUse": []
|
|
25
|
-
}
|
|
26
|
-
}
|