@mutmutco/cli 3.129.0 → 3.131.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.
Files changed (2) hide show
  1. package/dist/main.cjs +673 -168
  2. package/package.json +1 -1
package/dist/main.cjs CHANGED
@@ -9050,31 +9050,8 @@ function readSettingsAutoUpdate(raw, name) {
9050
9050
  const { autoUpdate } = entry;
9051
9051
  return typeof autoUpdate === "boolean" ? autoUpdate : void 0;
9052
9052
  }
9053
- var AUTO_UPDATE_TOGGLE_STEPS = "`/plugin` \u2192 Marketplaces tab \u2192 select the marketplace \u2192 Enable auto-update";
9054
9053
  var CATALOG_CONTENT_REF = "main";
9055
9054
  var CATALOG_REF_PIN_STEPS = `add \`"ref": "${CATALOG_CONTENT_REF}"\` to this marketplace's \`source\` in ~/.claude/plugins/known_marketplaces.json, then restart Claude`;
9056
- function resolveCatalogRef(probe) {
9057
- const { name, registered, ref, autoUpdate } = probe;
9058
- if (!registered) return void 0;
9059
- if (ref) {
9060
- const agrees = ref === CATALOG_CONTENT_REF;
9061
- return {
9062
- name,
9063
- ref,
9064
- autoUpdate,
9065
- unpinned: false,
9066
- agrees,
9067
- reason: agrees ? `pinned to ${ref} \u2014 catalog and plugin content come from the same branch` : `pinned to ${ref} \u2014 plugin content is pinned to ${CATALOG_CONTENT_REF}, so the two disagree`
9068
- };
9069
- }
9070
- return {
9071
- name,
9072
- autoUpdate,
9073
- unpinned: true,
9074
- agrees: false,
9075
- reason: `no ref pinned \u2014 the catalog is served from the repo's default branch while plugin content is pinned to ${CATALOG_CONTENT_REF}`
9076
- };
9077
- }
9078
9055
 
9079
9056
  // src/plugin-guard-io.ts
9080
9057
  var import_node_fs14 = require("node:fs");
@@ -10062,7 +10039,7 @@ function disableOrgMarketplaceBackgroundUpdates(path2, names, hostIsRunning = cl
10062
10039
  const detail = writeMarketplacePinsOnDisk(
10063
10040
  path2,
10064
10041
  new Map(names.map((name) => [name, { autoUpdate: false }])),
10065
- (pins) => `background auto-update off for ${[...pins.keys()].join(", ")} \u2014 \`mmi-cli doctor\` is the update channel`,
10042
+ (pins) => `background auto-update off for ${[...pins.keys()].join(", ")} \u2014 \`mmi-updater\` is the update channel`,
10066
10043
  "disable",
10067
10044
  () => hostIsRunning() ? "left as-is \u2014 Claude Code is running and rewrites this registration from its own copy; the next doctor run outside a live session sets it" : void 0
10068
10045
  );
@@ -16037,10 +16014,10 @@ var rollout_plan_default = {
16037
16014
  note: "The v4.0.0 stamp happens at cut time (D6e #4463); until then the candidate is the origin/development head artifacts (built cli/dist + npm pack), identity proven by dist content hash (D6a)."
16038
16015
  },
16039
16016
  baseline: {
16040
- version: "3.129.0",
16041
- tag: "v3.129.0",
16042
- commit: "7067f7164642",
16043
- npm: "@mutmutco/cli@3.129.0"
16017
+ version: "3.131.0",
16018
+ tag: "v3.131.0",
16019
+ commit: "11960bf8a21b",
16020
+ npm: "@mutmutco/cli@3.131.0"
16044
16021
  },
16045
16022
  exitCriterion: "fleet-n-of-n",
16046
16023
  hubOnlyShortcut: "forbidden",
@@ -16057,14 +16034,14 @@ var rollout_plan_default = {
16057
16034
  repo: "mutmutco/mmi-hub",
16058
16035
  role: "canary",
16059
16036
  schedule: "train",
16060
- v3Target: "v3.129.0"
16037
+ v3Target: "v3.131.0"
16061
16038
  }
16062
16039
  ],
16063
16040
  rollbackTrigger: "Any red inside the post-cut soak window: `devops train gate` FAIL attributable to the v4 doors, Hub endpoint health probe failure, a v3 client refused while the compat window must still admit it (SUPPORTED_MINOR_WINDOW=2, MIN_CLIENT_VERSION 0.0.0 \u2014 D6a), or npm consumer install/doctor failure on the v4 dist.",
16064
16041
  rollback: {
16065
16042
  independent: true,
16066
- mechanism: "npm dist-tag latest -> 3.129.0 and redeploy the Hub Lambda from tag v3.129.0 (7067f7164642); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
16067
- v3Target: "v3.129.0 (@mutmutco/cli@3.129.0, tag commit 7067f7164642 \u2014 the preserved latest-v3 distribution, D6b)"
16043
+ mechanism: "npm dist-tag latest -> 3.131.0 and redeploy the Hub Lambda from tag v3.131.0 (11960bf8a21b); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
16044
+ v3Target: "v3.131.0 (@mutmutco/cli@3.131.0, tag commit 11960bf8a21b \u2014 the preserved latest-v3 distribution, D6b)"
16068
16045
  }
16069
16046
  },
16070
16047
  {
@@ -16253,7 +16230,7 @@ function formatTrainStatus(r) {
16253
16230
  "",
16254
16231
  `release track: ${r.releaseTrack} \u2014 stages: ${r.branches.join(" -> ")}`,
16255
16232
  `cli version: ${r.cliVersion}${r.repoVersion ? ` (repo: ${r.repoVersion})` : ""}${r.releasedVersion ? ` (released: ${r.releasedVersion})` : ""}`,
16256
- `release bump intent: ${r.bumpIntent ?? "not declared \u2014 set MMI_BUMP_INTENT=major|minor|patch before an ordinary train"}`
16233
+ `release bump intent: ${r.bumpIntent ?? "not declared \u2014 an ordinary train defaults to patch (#4929); set MMI_BUMP_INTENT=major|minor to override"}`
16257
16234
  ];
16258
16235
  if (r.versionLag.ok) {
16259
16236
  lines.push("version lag: none \u2014 CLI is current");
@@ -17065,7 +17042,7 @@ async function runIssueViewContext(deps, opts) {
17065
17042
  }
17066
17043
  async function runPrViewContext(deps, opts) {
17067
17044
  let fields = opts.jsonFields;
17068
- if (opts.comments || opts.context) fields = ensureField(fields, "comments");
17045
+ if (opts.comments || opts.context) fields = ensureField(ensureField(fields, "body"), "comments");
17069
17046
  if (opts.context) fields = ensureField(fields, "closingIssuesReferences");
17070
17047
  const base = await deps.ghJson(["pr", "view", String(opts.number), "--repo", opts.repo, "--json", fields], GH_LIST_TIMEOUT_MS);
17071
17048
  if (!opts.context) return base;
@@ -20417,21 +20394,7 @@ async function resolveTrainBumpIntent(deps, env = process.env) {
20417
20394
  }
20418
20395
  return explicit.major > latest.major ? "major" : explicit.minor > latest.minor ? "minor" : "patch";
20419
20396
  }
20420
- try {
20421
- return requireValue(
20422
- clean2(await deps.run("node", ["scripts/next-version.mjs", "intent"])),
20423
- "release bump intent"
20424
- );
20425
- } catch (e) {
20426
- const message = e instanceof Error ? e.message : String(e);
20427
- const usage = /usage: next-version\.mjs <([^>]+)>/.exec(message);
20428
- if (usage && !usage[1].split("|").includes("intent")) {
20429
- throw new Error(
20430
- `release bump intent: this repo's seeded scripts/next-version.mjs predates the \`intent\` verb (its usage lists <${usage[1]}>), so unset-intent derivation cannot run here. Declare the intent explicitly and rerun \u2014 MMI_BUMP_INTENT=major|minor|patch (or MMI_RELEASE_VERSION=X.Y.Z for an exact target); the train then resolves it in the CLI without shelling this script. The durable fix is refreshing the seeded script from the Hub via seed propagation.`
20431
- );
20432
- }
20433
- throw e;
20434
- }
20397
+ return "patch";
20435
20398
  }
20436
20399
  async function runTrainApply(command, deps, options = {}) {
20437
20400
  const watch = options.watch ?? false;
@@ -26611,7 +26574,7 @@ async function portFoldToDevelopment(deps, ctx, deployModel, tag) {
26611
26574
  "--title",
26612
26575
  `chore(release): port the ${tag} version fold to development`,
26613
26576
  "--body",
26614
- `Regenerated version fold for ${tag} (#4410). \`main\` carries the released version; without this development declares the previous one and every PR into it fails catalog-lockstep.
26577
+ `Regenerated version fold for ${tag} (#4410). \`main\` carries the released version; without this development declares the previous version/BOM and the next release starts from stale package pins.
26615
26578
 
26616
26579
  Generated by \`mmi-cli devops hotfix release\` \u2014 no main-parented commit is merged in, so the squash parents stay clean (#4365/#4371).`
26617
26580
  ]));
@@ -35949,7 +35912,7 @@ function requiredEstateCommandsPresent(commandNames) {
35949
35912
  return required.filter((name) => !present.has(name));
35950
35913
  }
35951
35914
  function onboardPluginGate(deps) {
35952
- const { registered, declared, ref } = readKnownMarketplace(deps.readKnown(), MMI_MARKETPLACE_NAME);
35915
+ const { registered, declared } = readKnownMarketplace(deps.readKnown(), MMI_MARKETPLACE_NAME);
35953
35916
  if (!registered) {
35954
35917
  return { ok: false, detail: `${MMI_MARKETPLACE_NAME} marketplace not registered on this machine` };
35955
35918
  }
@@ -35959,11 +35922,7 @@ function onboardPluginGate(deps) {
35959
35922
  declared,
35960
35923
  settingsDeclared: readSettingsAutoUpdate(deps.readSettings(), MMI_MARKETPLACE_NAME)
35961
35924
  }).effective;
35962
- const catalog = resolveCatalogRef({ name: MMI_MARKETPLACE_NAME, registered, ref, autoUpdate });
35963
- const gaps = [];
35964
- if (!autoUpdate) gaps.push(`auto-update is off \u2014 turn it on with ${AUTO_UPDATE_TOGGLE_STEPS}`);
35965
- if (catalog && !catalog.agrees) gaps.push(`the catalog is ${catalog.unpinned ? "unpinned" : `pinned to ${catalog.ref}`} \u2014 ${CATALOG_REF_PIN_STEPS}`);
35966
- return gaps.length === 0 ? { ok: true, detail: `auto-update on, catalog pinned to ${catalog?.ref}` } : { ok: false, detail: gaps.join("; ") };
35925
+ return autoUpdate ? { ok: false, detail: "background auto-update is ON \u2014 duplicate writer; run `mmi-updater reconcile` outside Claude Code to disable it" } : { ok: true, detail: "background auto-update off; mmi-updater is the single release-gated writer" };
35967
35926
  }
35968
35927
  async function collectOnboardStatus(opts = {}) {
35969
35928
  const cfg = await loadConfig();
@@ -36161,12 +36120,8 @@ var LOOP_PLAYBOOKS = {
36161
36120
  ]
36162
36121
  }
36163
36122
  };
36164
- function formatExplainCommand(cmd, rootName) {
36123
+ function formatOwnDetail(cmd) {
36165
36124
  const lines = [];
36166
- if (cmd.description) {
36167
- lines.push(cmd.description);
36168
- lines.push("");
36169
- }
36170
36125
  const args = cmd.arguments;
36171
36126
  if (args.length) {
36172
36127
  lines.push("Arguments:");
@@ -36177,10 +36132,10 @@ function formatExplainCommand(cmd, rootName) {
36177
36132
  }
36178
36133
  lines.push("");
36179
36134
  }
36180
- if (cmd.options.length) {
36135
+ const ownOptions = cmd.options.filter((opt) => opt.flags !== "--help" && opt.flags !== "-V, --version");
36136
+ if (ownOptions.length) {
36181
36137
  lines.push("Options:");
36182
- for (const opt of cmd.options) {
36183
- if (opt.flags === "--help" || opt.flags === "-V, --version") continue;
36138
+ for (const opt of ownOptions) {
36184
36139
  const tags = [];
36185
36140
  if (opt.mandatory) tags.push("required");
36186
36141
  if (opt.default !== void 0) tags.push(`default: ${JSON.stringify(opt.default)}`);
@@ -36205,6 +36160,15 @@ function formatExplainCommand(cmd, rootName) {
36205
36160
  }
36206
36161
  lines.push("");
36207
36162
  }
36163
+ return lines;
36164
+ }
36165
+ function formatExplainCommand(cmd, rootName) {
36166
+ const lines = [];
36167
+ if (cmd.description) {
36168
+ lines.push(cmd.description);
36169
+ lines.push("");
36170
+ }
36171
+ lines.push(...formatOwnDetail(cmd));
36208
36172
  return lines.join("\n").trimEnd();
36209
36173
  }
36210
36174
  function formatExplainGroup(cmd, rootName) {
@@ -36212,9 +36176,10 @@ function formatExplainGroup(cmd, rootName) {
36212
36176
  const lines = [
36213
36177
  `${rootName} ${canonical(cmd)}${cmd.description ? ` \u2014 ${cmd.description}` : ""}`,
36214
36178
  `Category: ${cmd.category} \xB7 Discovery: ${cmd.discovery}`,
36215
- "",
36216
- "Commands:"
36179
+ ""
36217
36180
  ];
36181
+ lines.push(...formatOwnDetail(cmd));
36182
+ lines.push("Commands:");
36218
36183
  for (const child2 of cmd.subcommands) {
36219
36184
  const args = child2.arguments.map((arg) => {
36220
36185
  const name = arg.variadic ? `${arg.name}...` : arg.name;
@@ -37409,12 +37374,83 @@ var surfaces_default = {
37409
37374
  token: "claude",
37410
37375
  displayName: "Claude Code",
37411
37376
  lifecycle: "active",
37412
- artifactIds: ["mmi-claude-plugin", "mmi-claude-marketplace", "mmi-skills", "mmi-hook-policy", "mmi-hooks", "mmi-cli"],
37377
+ artifactIds: [
37378
+ "mmi-claude-plugin",
37379
+ "mmi-claude-marketplace",
37380
+ "mmi-skills",
37381
+ "mmi-hook-policy",
37382
+ "mmi-hooks",
37383
+ "mmi-cli"
37384
+ ],
37413
37385
  plannedArtifactIds: [],
37414
37386
  assembly: {
37415
- mode: "source-tree",
37416
- rootPath: ".",
37417
- sync: []
37387
+ mode: "package-directory",
37388
+ rootPath: "packages/claude-plugin",
37389
+ sync: [
37390
+ {
37391
+ mode: "directories",
37392
+ sourcePath: "skills",
37393
+ targetPath: "packages/claude-plugin/skills"
37394
+ },
37395
+ {
37396
+ mode: "files",
37397
+ sourcePath: "hooks",
37398
+ targetPath: "packages/claude-plugin/hooks",
37399
+ include: [
37400
+ "hooks.json"
37401
+ ]
37402
+ },
37403
+ {
37404
+ mode: "files",
37405
+ sourcePath: "scripts",
37406
+ targetPath: "packages/claude-plugin/scripts",
37407
+ include: [
37408
+ "pretooluse-shell-gates.mjs",
37409
+ "vault-edit-gate.mjs",
37410
+ "secret-redact.mjs",
37411
+ "deny-gate-crash.mjs",
37412
+ "secret-echo-lint.mjs",
37413
+ "env-write-lint.mjs",
37414
+ "command-ladder-gate.mjs",
37415
+ "command-ladder-core.mjs",
37416
+ "validate-hook.mjs",
37417
+ "hook-io.mjs",
37418
+ "hook-trace.mjs",
37419
+ "edit-tool-paths.mjs",
37420
+ "throttle-core.mjs",
37421
+ "hook-policy.mjs",
37422
+ "hook-run.mjs"
37423
+ ]
37424
+ },
37425
+ {
37426
+ mode: "files",
37427
+ sourcePath: "bin",
37428
+ targetPath: "packages/claude-plugin/bin",
37429
+ include: [
37430
+ "mmi-hook",
37431
+ "mmi-hook.exe",
37432
+ "mmi-hook-console.cmd",
37433
+ "mmi-cli",
37434
+ "mmi-cli.cmd"
37435
+ ]
37436
+ },
37437
+ {
37438
+ mode: "files",
37439
+ sourcePath: ".claude-plugin",
37440
+ targetPath: "packages/claude-plugin/.claude-plugin",
37441
+ include: [
37442
+ "plugin.json"
37443
+ ]
37444
+ },
37445
+ {
37446
+ mode: "files",
37447
+ sourcePath: ".pi-plugin",
37448
+ targetPath: "packages/claude-plugin/.pi-plugin",
37449
+ include: [
37450
+ "package.json"
37451
+ ]
37452
+ }
37453
+ ]
37418
37454
  },
37419
37455
  install: {
37420
37456
  mechanism: "marketplace",
@@ -37437,9 +37473,18 @@ var surfaces_default = {
37437
37473
  adapterPath: "hooks/hooks.json",
37438
37474
  sourceSurfaceId: "mmi-hook-policy",
37439
37475
  gates: [
37440
- { id: "command-ladder", failure: "closed" },
37441
- { id: "vault-edit", failure: "closed" },
37442
- { id: "secret-output", failure: "open" }
37476
+ {
37477
+ id: "command-ladder",
37478
+ failure: "closed"
37479
+ },
37480
+ {
37481
+ id: "vault-edit",
37482
+ failure: "closed"
37483
+ },
37484
+ {
37485
+ id: "secret-output",
37486
+ failure: "open"
37487
+ }
37443
37488
  ],
37444
37489
  probe: "installed-contract",
37445
37490
  execution: "command",
@@ -37458,7 +37503,9 @@ var surfaces_default = {
37458
37503
  },
37459
37504
  certification: {
37460
37505
  hostCommand: "claude",
37461
- versionArgs: ["--version"]
37506
+ versionArgs: [
37507
+ "--version"
37508
+ ]
37462
37509
  },
37463
37510
  enforcementCeilings: [
37464
37511
  "Final assistant text cannot be rewritten by the hook surface.",
@@ -37469,12 +37516,73 @@ var surfaces_default = {
37469
37516
  token: "codex",
37470
37517
  displayName: "Codex",
37471
37518
  lifecycle: "active",
37472
- artifactIds: ["mmi-codex-plugin", "mmi-skills", "mmi-hook-policy", "mmi-cli"],
37519
+ artifactIds: [
37520
+ "mmi-codex-plugin",
37521
+ "mmi-skills",
37522
+ "mmi-hook-policy",
37523
+ "mmi-cli"
37524
+ ],
37473
37525
  plannedArtifactIds: [],
37474
37526
  assembly: {
37475
- mode: "source-tree",
37476
- rootPath: ".",
37477
- sync: []
37527
+ mode: "package-directory",
37528
+ rootPath: "packages/codex-plugin",
37529
+ sync: [
37530
+ {
37531
+ mode: "directories",
37532
+ sourcePath: "skills",
37533
+ targetPath: "packages/codex-plugin/skills"
37534
+ },
37535
+ {
37536
+ mode: "files",
37537
+ sourcePath: "hooks",
37538
+ targetPath: "packages/codex-plugin/hooks",
37539
+ include: [
37540
+ "codex-hooks.json"
37541
+ ]
37542
+ },
37543
+ {
37544
+ mode: "files",
37545
+ sourcePath: "scripts",
37546
+ targetPath: "packages/codex-plugin/scripts",
37547
+ include: [
37548
+ "pretooluse-shell-gates.mjs",
37549
+ "vault-edit-gate.mjs",
37550
+ "secret-redact.mjs",
37551
+ "deny-gate-crash.mjs",
37552
+ "secret-echo-lint.mjs",
37553
+ "env-write-lint.mjs",
37554
+ "command-ladder-gate.mjs",
37555
+ "command-ladder-core.mjs",
37556
+ "validate-hook.mjs",
37557
+ "hook-io.mjs",
37558
+ "hook-trace.mjs",
37559
+ "edit-tool-paths.mjs",
37560
+ "throttle-core.mjs",
37561
+ "hook-policy.mjs",
37562
+ "hook-run.mjs"
37563
+ ]
37564
+ },
37565
+ {
37566
+ mode: "files",
37567
+ sourcePath: "bin",
37568
+ targetPath: "packages/codex-plugin/bin",
37569
+ include: [
37570
+ "mmi-hook",
37571
+ "mmi-hook.exe",
37572
+ "mmi-hook-console.cmd",
37573
+ "mmi-cli",
37574
+ "mmi-cli.cmd"
37575
+ ]
37576
+ },
37577
+ {
37578
+ mode: "files",
37579
+ sourcePath: ".codex-plugin",
37580
+ targetPath: "packages/codex-plugin/.codex-plugin",
37581
+ include: [
37582
+ "plugin.json"
37583
+ ]
37584
+ }
37585
+ ]
37478
37586
  },
37479
37587
  install: {
37480
37588
  mechanism: "marketplace",
@@ -37497,9 +37605,18 @@ var surfaces_default = {
37497
37605
  adapterPath: "hooks/codex-hooks.json",
37498
37606
  sourceSurfaceId: "mmi-hook-policy",
37499
37607
  gates: [
37500
- { id: "command-ladder", failure: "closed" },
37501
- { id: "vault-edit", failure: "closed" },
37502
- { id: "secret-output", failure: "open" }
37608
+ {
37609
+ id: "command-ladder",
37610
+ failure: "closed"
37611
+ },
37612
+ {
37613
+ id: "vault-edit",
37614
+ failure: "closed"
37615
+ },
37616
+ {
37617
+ id: "secret-output",
37618
+ failure: "open"
37619
+ }
37503
37620
  ],
37504
37621
  probe: "installed-contract",
37505
37622
  execution: "node-bootstrap",
@@ -37518,7 +37635,9 @@ var surfaces_default = {
37518
37635
  },
37519
37636
  certification: {
37520
37637
  hostCommand: "codex",
37521
- versionArgs: ["--version"]
37638
+ versionArgs: [
37639
+ "--version"
37640
+ ]
37522
37641
  },
37523
37642
  enforcementCeilings: [
37524
37643
  "Post-tool hooks can detect secret output but cannot rewrite it.",
@@ -37529,12 +37648,65 @@ var surfaces_default = {
37529
37648
  token: "kimi",
37530
37649
  displayName: "Kimi Code CLI",
37531
37650
  lifecycle: "active",
37532
- artifactIds: ["mmi-kimi-plugin", "mmi-skills", "mmi-hook-policy", "mmi-cli"],
37651
+ artifactIds: [
37652
+ "mmi-kimi-plugin",
37653
+ "mmi-skills",
37654
+ "mmi-hook-policy",
37655
+ "mmi-cli"
37656
+ ],
37533
37657
  plannedArtifactIds: [],
37534
37658
  assembly: {
37535
- mode: "source-tree",
37536
- rootPath: ".",
37537
- sync: []
37659
+ mode: "package-directory",
37660
+ rootPath: "packages/kimi-plugin",
37661
+ sync: [
37662
+ {
37663
+ mode: "directories",
37664
+ sourcePath: "skills",
37665
+ targetPath: "packages/kimi-plugin/skills"
37666
+ },
37667
+ {
37668
+ mode: "files",
37669
+ sourcePath: "scripts",
37670
+ targetPath: "packages/kimi-plugin/scripts",
37671
+ include: [
37672
+ "pretooluse-shell-gates.mjs",
37673
+ "vault-edit-gate.mjs",
37674
+ "secret-redact.mjs",
37675
+ "deny-gate-crash.mjs",
37676
+ "secret-echo-lint.mjs",
37677
+ "env-write-lint.mjs",
37678
+ "command-ladder-gate.mjs",
37679
+ "command-ladder-core.mjs",
37680
+ "validate-hook.mjs",
37681
+ "hook-io.mjs",
37682
+ "hook-trace.mjs",
37683
+ "edit-tool-paths.mjs",
37684
+ "throttle-core.mjs",
37685
+ "hook-policy.mjs",
37686
+ "hook-run.mjs"
37687
+ ]
37688
+ },
37689
+ {
37690
+ mode: "files",
37691
+ sourcePath: "bin",
37692
+ targetPath: "packages/kimi-plugin/bin",
37693
+ include: [
37694
+ "mmi-hook",
37695
+ "mmi-hook.exe",
37696
+ "mmi-hook-console.cmd",
37697
+ "mmi-cli",
37698
+ "mmi-cli.cmd"
37699
+ ]
37700
+ },
37701
+ {
37702
+ mode: "files",
37703
+ sourcePath: ".kimi-plugin",
37704
+ targetPath: "packages/kimi-plugin/.kimi-plugin",
37705
+ include: [
37706
+ "plugin.json"
37707
+ ]
37708
+ }
37709
+ ]
37538
37710
  },
37539
37711
  install: {
37540
37712
  mechanism: "github-source",
@@ -37557,9 +37729,18 @@ var surfaces_default = {
37557
37729
  adapterPath: ".kimi-plugin/plugin.json",
37558
37730
  sourceSurfaceId: "mmi-hook-policy",
37559
37731
  gates: [
37560
- { id: "command-ladder", failure: "closed" },
37561
- { id: "vault-edit", failure: "closed" },
37562
- { id: "secret-output", failure: "open" }
37732
+ {
37733
+ id: "command-ladder",
37734
+ failure: "closed"
37735
+ },
37736
+ {
37737
+ id: "vault-edit",
37738
+ failure: "closed"
37739
+ },
37740
+ {
37741
+ id: "secret-output",
37742
+ failure: "open"
37743
+ }
37563
37744
  ],
37564
37745
  probe: "installed-contract",
37565
37746
  execution: "inline-manifest",
@@ -37578,7 +37759,9 @@ var surfaces_default = {
37578
37759
  },
37579
37760
  certification: {
37580
37761
  hostCommand: "kimi",
37581
- versionArgs: ["--version"]
37762
+ versionArgs: [
37763
+ "--version"
37764
+ ]
37582
37765
  },
37583
37766
  enforcementCeilings: [
37584
37767
  "Post-tool hooks are observation-only and cannot rewrite secret output.",
@@ -37589,12 +37772,73 @@ var surfaces_default = {
37589
37772
  token: "cursor",
37590
37773
  displayName: "Cursor",
37591
37774
  lifecycle: "active",
37592
- artifactIds: ["mmi-cursor-plugin", "mmi-skills", "mmi-hook-policy", "mmi-cli"],
37775
+ artifactIds: [
37776
+ "mmi-cursor-plugin",
37777
+ "mmi-skills",
37778
+ "mmi-hook-policy",
37779
+ "mmi-cli"
37780
+ ],
37593
37781
  plannedArtifactIds: [],
37594
37782
  assembly: {
37595
- mode: "source-tree",
37596
- rootPath: ".",
37597
- sync: []
37783
+ mode: "package-directory",
37784
+ rootPath: "packages/cursor-plugin",
37785
+ sync: [
37786
+ {
37787
+ mode: "directories",
37788
+ sourcePath: "skills",
37789
+ targetPath: "packages/cursor-plugin/skills"
37790
+ },
37791
+ {
37792
+ mode: "files",
37793
+ sourcePath: "hooks",
37794
+ targetPath: "packages/cursor-plugin/hooks",
37795
+ include: [
37796
+ "cursor-hooks.json"
37797
+ ]
37798
+ },
37799
+ {
37800
+ mode: "files",
37801
+ sourcePath: "scripts",
37802
+ targetPath: "packages/cursor-plugin/scripts",
37803
+ include: [
37804
+ "pretooluse-shell-gates.mjs",
37805
+ "vault-edit-gate.mjs",
37806
+ "secret-redact.mjs",
37807
+ "deny-gate-crash.mjs",
37808
+ "secret-echo-lint.mjs",
37809
+ "env-write-lint.mjs",
37810
+ "command-ladder-gate.mjs",
37811
+ "command-ladder-core.mjs",
37812
+ "validate-hook.mjs",
37813
+ "hook-io.mjs",
37814
+ "hook-trace.mjs",
37815
+ "edit-tool-paths.mjs",
37816
+ "throttle-core.mjs",
37817
+ "hook-policy.mjs",
37818
+ "hook-run.mjs"
37819
+ ]
37820
+ },
37821
+ {
37822
+ mode: "files",
37823
+ sourcePath: "bin",
37824
+ targetPath: "packages/cursor-plugin/bin",
37825
+ include: [
37826
+ "mmi-hook",
37827
+ "mmi-hook.exe",
37828
+ "mmi-hook-console.cmd",
37829
+ "mmi-cli",
37830
+ "mmi-cli.cmd"
37831
+ ]
37832
+ },
37833
+ {
37834
+ mode: "files",
37835
+ sourcePath: ".cursor-plugin",
37836
+ targetPath: "packages/cursor-plugin/.cursor-plugin",
37837
+ include: [
37838
+ "plugin.json"
37839
+ ]
37840
+ }
37841
+ ]
37598
37842
  },
37599
37843
  install: {
37600
37844
  mechanism: "github-source",
@@ -37617,9 +37861,18 @@ var surfaces_default = {
37617
37861
  adapterPath: "hooks/cursor-hooks.json",
37618
37862
  sourceSurfaceId: "mmi-hook-policy",
37619
37863
  gates: [
37620
- { id: "command-ladder", failure: "closed" },
37621
- { id: "vault-edit", failure: "closed" },
37622
- { id: "secret-output", failure: "open" }
37864
+ {
37865
+ id: "command-ladder",
37866
+ failure: "closed"
37867
+ },
37868
+ {
37869
+ id: "vault-edit",
37870
+ failure: "closed"
37871
+ },
37872
+ {
37873
+ id: "secret-output",
37874
+ failure: "open"
37875
+ }
37623
37876
  ],
37624
37877
  probe: "installed-contract",
37625
37878
  execution: "command",
@@ -37638,7 +37891,9 @@ var surfaces_default = {
37638
37891
  },
37639
37892
  certification: {
37640
37893
  hostCommand: "cursor-agent",
37641
- versionArgs: ["--version"]
37894
+ versionArgs: [
37895
+ "--version"
37896
+ ]
37642
37897
  },
37643
37898
  enforcementCeilings: [
37644
37899
  "Cursor can replace MCP results only; it cannot rewrite ordinary tool output after execution, though MMI still detects secret-shaped output.",
@@ -37650,7 +37905,12 @@ var surfaces_default = {
37650
37905
  token: "kilo",
37651
37906
  displayName: "Kilo Code",
37652
37907
  lifecycle: "active",
37653
- artifactIds: ["mmi-kilo-plugin", "mmi-kilo-skills", "mmi-hook-policy", "mmi-cli"],
37908
+ artifactIds: [
37909
+ "mmi-kilo-plugin",
37910
+ "mmi-kilo-skills",
37911
+ "mmi-hook-policy",
37912
+ "mmi-cli"
37913
+ ],
37654
37914
  plannedArtifactIds: [],
37655
37915
  assembly: {
37656
37916
  mode: "package-directory",
@@ -37660,7 +37920,9 @@ var surfaces_default = {
37660
37920
  mode: "directories",
37661
37921
  sourcePath: "skills",
37662
37922
  targetPath: ".kilo-plugin/skills",
37663
- excludeNamePrefixes: ["_"]
37923
+ excludeNamePrefixes: [
37924
+ "_"
37925
+ ]
37664
37926
  },
37665
37927
  {
37666
37928
  mode: "files",
@@ -37707,9 +37969,18 @@ var surfaces_default = {
37707
37969
  adapterPath: ".kilo-plugin/server.mjs",
37708
37970
  sourceSurfaceId: "mmi-hook-policy",
37709
37971
  gates: [
37710
- { id: "command-ladder", failure: "closed" },
37711
- { id: "vault-edit", failure: "closed" },
37712
- { id: "secret-output", failure: "open" }
37972
+ {
37973
+ id: "command-ladder",
37974
+ failure: "closed"
37975
+ },
37976
+ {
37977
+ id: "vault-edit",
37978
+ failure: "closed"
37979
+ },
37980
+ {
37981
+ id: "secret-output",
37982
+ failure: "open"
37983
+ }
37713
37984
  ],
37714
37985
  probe: "installed-contract",
37715
37986
  execution: "in-process",
@@ -37728,7 +37999,9 @@ var surfaces_default = {
37728
37999
  },
37729
38000
  certification: {
37730
38001
  hostCommand: "kilo",
37731
- versionArgs: ["--version"]
38002
+ versionArgs: [
38003
+ "--version"
38004
+ ]
37732
38005
  },
37733
38006
  enforcementCeilings: [
37734
38007
  "Some read, write, and web-fetch tool outputs are not rewriteable by the host.",
@@ -37739,7 +38012,11 @@ var surfaces_default = {
37739
38012
  token: "jervcode",
37740
38013
  displayName: "JervCode",
37741
38014
  lifecycle: "active",
37742
- artifactIds: ["mmi-pi-plugin", "mmi-skills", "mmi-cli"],
38015
+ artifactIds: [
38016
+ "mmi-pi-plugin",
38017
+ "mmi-skills",
38018
+ "mmi-cli"
38019
+ ],
37743
38020
  plannedArtifactIds: [],
37744
38021
  assembly: {
37745
38022
  mode: "source-tree",
@@ -37784,7 +38061,9 @@ var surfaces_default = {
37784
38061
  },
37785
38062
  certification: {
37786
38063
  hostCommand: "jervcode",
37787
- versionArgs: ["--version"]
38064
+ versionArgs: [
38065
+ "--version"
38066
+ ]
37788
38067
  },
37789
38068
  enforcementCeilings: [
37790
38069
  "Pi reads the user package set from ~/.jerv/agent/settings.json at launch: a live seat keeps the packages it started with, the mmi-cli heal refuses to edit the file while PI_SESSION_ID is set, and a new registration reaches JervCode only on the next launch.",
@@ -37804,16 +38083,24 @@ var surfaces_default = {
37804
38083
  applicability: "plugin-enabled agent surfaces",
37805
38084
  versionCoordinated: true,
37806
38085
  versionPaths: [
37807
- { path: "cli/package.json", pointer: "version" }
38086
+ {
38087
+ path: "cli/package.json",
38088
+ pointer: "version"
38089
+ }
37808
38090
  ],
37809
38091
  artifactIdentity: {
37810
38092
  kind: "sha256-tree",
37811
- paths: ["skills"]
38093
+ paths: [
38094
+ "skills"
38095
+ ]
37812
38096
  },
37813
38097
  verify: [
37814
38098
  {
37815
38099
  command: "node",
37816
- args: ["scripts/check-skill-payload.mjs", "--contract"],
38100
+ args: [
38101
+ "scripts/check-skill-payload.mjs",
38102
+ "--contract"
38103
+ ],
37817
38104
  expected: "skill payload check: ok"
37818
38105
  }
37819
38106
  ],
@@ -37823,18 +38110,33 @@ var surfaces_default = {
37823
38110
  id: "mmi-claude-plugin",
37824
38111
  classification: "packaging",
37825
38112
  kind: "plugin",
37826
- ownerPath: ".claude-plugin/plugin.json",
37827
- deliveryPath: ".claude-plugin/plugin.json",
37828
- delivery: "release",
37829
- applicability: "Claude Code plugin marketplace",
38113
+ ownerPath: "packages/claude-plugin/package.json",
38114
+ deliveryPath: "packages/claude-plugin/package.json",
38115
+ delivery: "npm",
38116
+ applicability: "Claude Code plugin; npm package @mutmutco/claude-plugin carrying the plugin manifest, skills, hooks, gate scripts, and launchers. The thin git catalog stays in .claude-plugin/marketplace.json (#4945).",
37830
38117
  versionCoordinated: true,
37831
38118
  surfaceToken: "claude",
37832
38119
  versionPaths: [
37833
- { path: ".claude-plugin/plugin.json", pointer: "version" }
38120
+ {
38121
+ path: ".claude-plugin/plugin.json",
38122
+ pointer: "version"
38123
+ },
38124
+ {
38125
+ path: "packages/claude-plugin/package.json",
38126
+ pointer: "version"
38127
+ }
38128
+ ],
38129
+ additionalPaths: [
38130
+ "packages/claude-plugin/.claude-plugin",
38131
+ "packages/claude-plugin/.pi-plugin",
38132
+ "packages/claude-plugin/skills",
38133
+ "packages/claude-plugin/hooks",
38134
+ "packages/claude-plugin/scripts",
38135
+ "packages/claude-plugin/bin"
37834
38136
  ],
37835
38137
  artifactIdentity: {
37836
- kind: "sha256-tree",
37837
- paths: [".claude-plugin/plugin.json", "skills", "hooks", "scripts", "bin"]
38138
+ kind: "npm-pack",
38139
+ packagePath: "packages/claude-plugin"
37838
38140
  },
37839
38141
  publishVisibility: "public"
37840
38142
  },
@@ -37842,18 +38144,36 @@ var surfaces_default = {
37842
38144
  id: "mmi-codex-plugin",
37843
38145
  classification: "packaging",
37844
38146
  kind: "plugin",
37845
- ownerPath: ".codex-plugin/plugin.json",
37846
- deliveryPath: ".codex-plugin/plugin.json",
37847
- delivery: "release",
37848
- applicability: "Codex plugin marketplace; carries the MMI lifecycle hooks via hooks/codex-hooks.json (#3563)",
38147
+ ownerPath: "packages/codex-plugin/package.json",
38148
+ deliveryPath: "packages/codex-plugin/package.json",
38149
+ delivery: "npm",
38150
+ applicability: "Codex plugin; npm package @mutmutco/codex-plugin carrying the plugin manifest (hooks via hooks/codex-hooks.json, #3563), skills, gate scripts, and launchers. The thin git catalog stays in .agents/plugins/marketplace.json (#4945).",
37849
38151
  versionCoordinated: true,
37850
38152
  surfaceToken: "codex",
37851
38153
  versionPaths: [
37852
- { path: ".codex-plugin/plugin.json", pointer: "version" }
38154
+ {
38155
+ path: ".codex-plugin/plugin.json",
38156
+ pointer: "version"
38157
+ },
38158
+ {
38159
+ path: "packages/codex-plugin/package.json",
38160
+ pointer: "version"
38161
+ },
38162
+ {
38163
+ path: ".agents/plugins/marketplace.json",
38164
+ pointer: "plugins.0.source.version"
38165
+ }
38166
+ ],
38167
+ additionalPaths: [
38168
+ "packages/codex-plugin/.codex-plugin",
38169
+ "packages/codex-plugin/skills",
38170
+ "packages/codex-plugin/hooks",
38171
+ "packages/codex-plugin/scripts",
38172
+ "packages/codex-plugin/bin"
37853
38173
  ],
37854
38174
  artifactIdentity: {
37855
- kind: "sha256-tree",
37856
- paths: [".codex-plugin/plugin.json", "skills", "hooks/codex-hooks.json", "scripts", "bin"]
38175
+ kind: "npm-pack",
38176
+ packagePath: "packages/codex-plugin"
37857
38177
  },
37858
38178
  publishVisibility: "public"
37859
38179
  },
@@ -37861,18 +38181,31 @@ var surfaces_default = {
37861
38181
  id: "mmi-kimi-plugin",
37862
38182
  classification: "packaging",
37863
38183
  kind: "plugin",
37864
- ownerPath: ".kimi-plugin/plugin.json",
37865
- deliveryPath: ".kimi-plugin/plugin.json",
37866
- delivery: "release",
37867
- applicability: "Kimi Code CLI plugin install (GitHub source); inline event mapping invokes the shared hook runner",
38184
+ ownerPath: "packages/kimi-plugin/package.json",
38185
+ deliveryPath: "packages/kimi-plugin/package.json",
38186
+ delivery: "npm",
38187
+ applicability: "Kimi Code CLI plugin; npm package @mutmutco/kimi-plugin carrying the inline-hook plugin manifest, skills, gate scripts, and launchers. Installed into $KIMI_CODE_HOME/plugins/managed/mmi by the Kimi TUI or the fleet updater (#4945).",
37868
38188
  versionCoordinated: true,
37869
38189
  surfaceToken: "kimi",
37870
38190
  versionPaths: [
37871
- { path: ".kimi-plugin/plugin.json", pointer: "version" }
38191
+ {
38192
+ path: ".kimi-plugin/plugin.json",
38193
+ pointer: "version"
38194
+ },
38195
+ {
38196
+ path: "packages/kimi-plugin/package.json",
38197
+ pointer: "version"
38198
+ }
38199
+ ],
38200
+ additionalPaths: [
38201
+ "packages/kimi-plugin/.kimi-plugin",
38202
+ "packages/kimi-plugin/skills",
38203
+ "packages/kimi-plugin/scripts",
38204
+ "packages/kimi-plugin/bin"
37872
38205
  ],
37873
38206
  artifactIdentity: {
37874
- kind: "sha256-tree",
37875
- paths: [".kimi-plugin/plugin.json", "skills", "scripts", "bin"]
38207
+ kind: "npm-pack",
38208
+ packagePath: "packages/kimi-plugin"
37876
38209
  },
37877
38210
  publishVisibility: "public"
37878
38211
  },
@@ -37880,18 +38213,32 @@ var surfaces_default = {
37880
38213
  id: "mmi-cursor-plugin",
37881
38214
  classification: "packaging",
37882
38215
  kind: "plugin",
37883
- ownerPath: ".cursor-plugin/plugin.json",
37884
- deliveryPath: "~/.cursor/plugins/local/mmi",
37885
- delivery: "local-copy",
37886
- applicability: "Cursor IDE and Cursor Agent CLI; local plugin checkout managed by mmi-cli",
38216
+ ownerPath: "packages/cursor-plugin/package.json",
38217
+ deliveryPath: "packages/cursor-plugin/package.json",
38218
+ delivery: "npm",
38219
+ applicability: "Cursor IDE and Cursor Agent CLI; npm package @mutmutco/cursor-plugin carrying the plugin manifest (hooks via hooks/cursor-hooks.json), skills, gate scripts, and launchers. The managed checkout at ~/.cursor/plugins/local/mmi is switched to each release by the fleet updater (#4945).",
37887
38220
  versionCoordinated: true,
37888
38221
  surfaceToken: "cursor",
37889
38222
  versionPaths: [
37890
- { path: ".cursor-plugin/plugin.json", pointer: "version" }
38223
+ {
38224
+ path: ".cursor-plugin/plugin.json",
38225
+ pointer: "version"
38226
+ },
38227
+ {
38228
+ path: "packages/cursor-plugin/package.json",
38229
+ pointer: "version"
38230
+ }
38231
+ ],
38232
+ additionalPaths: [
38233
+ "packages/cursor-plugin/.cursor-plugin",
38234
+ "packages/cursor-plugin/skills",
38235
+ "packages/cursor-plugin/hooks",
38236
+ "packages/cursor-plugin/scripts",
38237
+ "packages/cursor-plugin/bin"
37891
38238
  ],
37892
38239
  artifactIdentity: {
37893
- kind: "sha256-tree",
37894
- paths: [".cursor-plugin/plugin.json", "skills", "hooks/cursor-hooks.json", "scripts", "bin"]
38240
+ kind: "npm-pack",
38241
+ packagePath: "packages/cursor-plugin"
37895
38242
  },
37896
38243
  publishVisibility: "public"
37897
38244
  },
@@ -37906,7 +38253,10 @@ var surfaces_default = {
37906
38253
  versionCoordinated: true,
37907
38254
  surfaceToken: "kilo",
37908
38255
  versionPaths: [
37909
- { path: ".kilo-plugin/package.json", pointer: "version" }
38256
+ {
38257
+ path: ".kilo-plugin/package.json",
38258
+ pointer: "version"
38259
+ }
37910
38260
  ],
37911
38261
  additionalPaths: [
37912
38262
  ".kilo-plugin/server.mjs",
@@ -37929,11 +38279,16 @@ var surfaces_default = {
37929
38279
  applicability: "Kilo Code (via @mutmutco/kilo-plugin provisioning to ~/.kilo/skills)",
37930
38280
  versionCoordinated: true,
37931
38281
  versionPaths: [
37932
- { path: "cli/package.json", pointer: "version" }
38282
+ {
38283
+ path: "cli/package.json",
38284
+ pointer: "version"
38285
+ }
37933
38286
  ],
37934
38287
  artifactIdentity: {
37935
38288
  kind: "sha256-tree",
37936
- paths: [".kilo-plugin/skills"]
38289
+ paths: [
38290
+ ".kilo-plugin/skills"
38291
+ ]
37937
38292
  },
37938
38293
  surfaceToken: "kilo",
37939
38294
  publishVisibility: "public"
@@ -37949,12 +38304,25 @@ var surfaces_default = {
37949
38304
  versionCoordinated: true,
37950
38305
  surfaceToken: "claude",
37951
38306
  versionPaths: [
37952
- { path: ".claude-plugin/marketplace.json", pointer: "plugins.0.version" },
37953
- { path: ".claude-plugin/marketplace.json", pointer: "plugins.0.displayName", template: "MMI {version}" }
38307
+ {
38308
+ path: ".claude-plugin/marketplace.json",
38309
+ pointer: "plugins.0.version"
38310
+ },
38311
+ {
38312
+ path: ".claude-plugin/marketplace.json",
38313
+ pointer: "plugins.0.displayName",
38314
+ template: "MMI {version}"
38315
+ },
38316
+ {
38317
+ path: ".claude-plugin/marketplace.json",
38318
+ pointer: "plugins.0.source.version"
38319
+ }
37954
38320
  ],
37955
38321
  artifactIdentity: {
37956
38322
  kind: "sha256-tree",
37957
- paths: [".claude-plugin/marketplace.json"]
38323
+ paths: [
38324
+ ".claude-plugin/marketplace.json"
38325
+ ]
37958
38326
  },
37959
38327
  publishVisibility: "public"
37960
38328
  },
@@ -37968,15 +38336,44 @@ var surfaces_default = {
37968
38336
  applicability: "editor-agnostic agent surfaces",
37969
38337
  versionCoordinated: true,
37970
38338
  versionPaths: [
37971
- { path: "cli/package.json", pointer: "version" }
38339
+ {
38340
+ path: "cli/package.json",
38341
+ pointer: "version"
38342
+ }
38343
+ ],
38344
+ additionalPaths: [
38345
+ "cli/dist"
37972
38346
  ],
37973
- additionalPaths: ["cli/dist"],
37974
38347
  artifactIdentity: {
37975
38348
  kind: "npm-pack",
37976
38349
  packagePath: "cli"
37977
38350
  },
37978
38351
  publishVisibility: "public"
37979
38352
  },
38353
+ {
38354
+ id: "mmi-updater",
38355
+ classification: "capability",
38356
+ kind: "cli",
38357
+ ownerPath: "updater/package.json",
38358
+ deliveryPath: "updater/package.json",
38359
+ delivery: "npm",
38360
+ applicability: "editor-agnostic agent surfaces",
38361
+ versionCoordinated: true,
38362
+ versionPaths: [
38363
+ {
38364
+ path: "updater/package.json",
38365
+ pointer: "version"
38366
+ }
38367
+ ],
38368
+ additionalPaths: [
38369
+ "updater/dist"
38370
+ ],
38371
+ artifactIdentity: {
38372
+ kind: "npm-pack",
38373
+ packagePath: "updater"
38374
+ },
38375
+ publishVisibility: "public"
38376
+ },
37980
38377
  {
37981
38378
  id: "mmi-cli-lock",
37982
38379
  classification: "packaging",
@@ -37987,12 +38384,20 @@ var surfaces_default = {
37987
38384
  applicability: "editor-agnostic agent surfaces",
37988
38385
  versionCoordinated: true,
37989
38386
  versionPaths: [
37990
- { path: "cli/package-lock.json", pointer: "version" },
37991
- { path: "cli/package-lock.json", pointer: "packages.$root.version" }
38387
+ {
38388
+ path: "cli/package-lock.json",
38389
+ pointer: "version"
38390
+ },
38391
+ {
38392
+ path: "cli/package-lock.json",
38393
+ pointer: "packages.$root.version"
38394
+ }
37992
38395
  ],
37993
38396
  artifactIdentity: {
37994
38397
  kind: "sha256-tree",
37995
- paths: ["cli/package-lock.json"]
38398
+ paths: [
38399
+ "cli/package-lock.json"
38400
+ ]
37996
38401
  },
37997
38402
  publishVisibility: "public"
37998
38403
  },
@@ -38006,27 +38411,52 @@ var surfaces_default = {
38006
38411
  applicability: "editor-agnostic agent surfaces",
38007
38412
  versionCoordinated: true,
38008
38413
  versionPaths: [
38009
- { path: "cli/package.json", pointer: "version" }
38414
+ {
38415
+ path: "cli/package.json",
38416
+ pointer: "version"
38417
+ }
38418
+ ],
38419
+ additionalPaths: [
38420
+ "cli/dist/main.cjs"
38010
38421
  ],
38011
- additionalPaths: ["cli/dist/main.cjs"],
38012
38422
  prepare: [
38013
38423
  {
38014
38424
  command: "npm",
38015
- args: ["--prefix", "cli", "run", "build"],
38016
- inputs: ["cli/src", "cli/build.mjs", "cli/package.json", "cli/README.md", "cli/tsconfig.json", "infra/rollout-plan.json"],
38017
- outputs: ["cli/dist/index.cjs", "cli/dist/main.cjs"]
38425
+ args: [
38426
+ "--prefix",
38427
+ "cli",
38428
+ "run",
38429
+ "build"
38430
+ ],
38431
+ inputs: [
38432
+ "cli/src",
38433
+ "cli/build.mjs",
38434
+ "cli/package.json",
38435
+ "cli/README.md",
38436
+ "cli/tsconfig.json",
38437
+ "infra/rollout-plan.json"
38438
+ ],
38439
+ outputs: [
38440
+ "cli/dist/index.cjs",
38441
+ "cli/dist/main.cjs"
38442
+ ]
38018
38443
  }
38019
38444
  ],
38020
38445
  verify: [
38021
38446
  {
38022
38447
  command: "node",
38023
- args: ["cli/dist/index.cjs", "--version"],
38448
+ args: [
38449
+ "cli/dist/index.cjs",
38450
+ "--version"
38451
+ ],
38024
38452
  expected: "{version}"
38025
38453
  }
38026
38454
  ],
38027
38455
  artifactIdentity: {
38028
38456
  kind: "sha256-tree",
38029
- paths: ["cli/dist"]
38457
+ paths: [
38458
+ "cli/dist"
38459
+ ]
38030
38460
  },
38031
38461
  publishVisibility: "public"
38032
38462
  },
@@ -38040,7 +38470,10 @@ var surfaces_default = {
38040
38470
  applicability: "all five active hook-capable agent surfaces",
38041
38471
  versionCoordinated: true,
38042
38472
  versionPaths: [
38043
- { path: "cli/package.json", pointer: "version" }
38473
+ {
38474
+ path: "cli/package.json",
38475
+ pointer: "version"
38476
+ }
38044
38477
  ],
38045
38478
  artifactIdentity: {
38046
38479
  kind: "sha256-tree",
@@ -38064,7 +38497,9 @@ var surfaces_default = {
38064
38497
  verify: [
38065
38498
  {
38066
38499
  command: "node",
38067
- args: ["scripts/check-hook-contract.mjs"],
38500
+ args: [
38501
+ "scripts/check-hook-contract.mjs"
38502
+ ],
38068
38503
  expected: "hook contract: 5 active adapters proven, 12 repositories covered"
38069
38504
  }
38070
38505
  ],
@@ -38080,11 +38515,17 @@ var surfaces_default = {
38080
38515
  applicability: "Claude hook-enabled agents",
38081
38516
  versionCoordinated: true,
38082
38517
  versionPaths: [
38083
- { path: "cli/package.json", pointer: "version" }
38518
+ {
38519
+ path: "cli/package.json",
38520
+ pointer: "version"
38521
+ }
38084
38522
  ],
38085
38523
  artifactIdentity: {
38086
38524
  kind: "sha256-tree",
38087
- paths: ["hooks", "scripts"]
38525
+ paths: [
38526
+ "hooks",
38527
+ "scripts"
38528
+ ]
38088
38529
  },
38089
38530
  surfaceToken: "claude",
38090
38531
  publishVisibility: "public"
@@ -38099,7 +38540,10 @@ var surfaces_default = {
38099
38540
  applicability: "org automation and authorization",
38100
38541
  versionCoordinated: true,
38101
38542
  versionPaths: [
38102
- { path: "infra/package.json", pointer: "version" }
38543
+ {
38544
+ path: "infra/package.json",
38545
+ pointer: "version"
38546
+ }
38103
38547
  ],
38104
38548
  publishVisibility: "n/a",
38105
38549
  deployedVersionSource: "http-header:x-hub-version"
@@ -38114,7 +38558,10 @@ var surfaces_default = {
38114
38558
  applicability: "master DM notifications only; chatops out by default",
38115
38559
  versionCoordinated: true,
38116
38560
  versionPaths: [
38117
- { path: "cli/package.json", pointer: "version" }
38561
+ {
38562
+ path: "cli/package.json",
38563
+ pointer: "version"
38564
+ }
38118
38565
  ],
38119
38566
  publishVisibility: "n/a"
38120
38567
  },
@@ -38129,16 +38576,24 @@ var surfaces_default = {
38129
38576
  versionCoordinated: true,
38130
38577
  surfaceToken: "jervcode",
38131
38578
  versionPaths: [
38132
- { path: ".pi-plugin/package.json", pointer: "version" }
38579
+ {
38580
+ path: ".pi-plugin/package.json",
38581
+ pointer: "version"
38582
+ }
38133
38583
  ],
38134
38584
  artifactIdentity: {
38135
38585
  kind: "sha256-tree",
38136
- paths: [".pi-plugin/package.json", "skills"]
38586
+ paths: [
38587
+ ".pi-plugin/package.json",
38588
+ "skills"
38589
+ ]
38137
38590
  },
38138
38591
  verify: [
38139
38592
  {
38140
38593
  command: "node",
38141
- args: ["scripts/check-jervcode-consumer.mjs"],
38594
+ args: [
38595
+ "scripts/check-jervcode-consumer.mjs"
38596
+ ],
38142
38597
  expected: "JervCode consumer fitness: clean ({version})"
38143
38598
  }
38144
38599
  ],
@@ -38708,6 +39163,9 @@ async function runDoctorClean(opts, io, deps) {
38708
39163
  const restartAction = registryEvidence ? surfaceRestartAction(registryEvidence.descriptor) : "restart the agent host";
38709
39164
  const checks = [];
38710
39165
  let restartPending = false;
39166
+ const changedPluginHosts = /* @__PURE__ */ new Set();
39167
+ const activeHostToken = registryEvidence?.descriptor.token;
39168
+ const extraRestartLines = () => [...changedPluginHosts].filter((host) => host !== activeHostToken).sort().map((host) => restartLineForHost(host));
38711
39169
  const streamed = /* @__PURE__ */ new Set();
38712
39170
  const streamedLines = /* @__PURE__ */ new Set();
38713
39171
  const alreadyShown = (c) => streamed.has(c) || streamedLines.has(renderCheckLine(c));
@@ -38774,6 +39232,7 @@ async function runDoctorClean(opts, io, deps) {
38774
39232
  if (!heal.skipped) restartPending = true;
38775
39233
  if (heal.ok && !heal.skipped) {
38776
39234
  markHealChanged();
39235
+ if (activeHostToken) changedPluginHosts.add(activeHostToken);
38777
39236
  spentRows.set("plugin-chain", row);
38778
39237
  }
38779
39238
  } else if (diagnosis.state !== "skipped") {
@@ -38829,7 +39288,25 @@ async function runDoctorClean(opts, io, deps) {
38829
39288
  const intent = capabilityGap && cliReport.ok ? `mmi-cli \u2014 self-updating to ${target} via npm install -g (missing commands: ${missing.join(", ")})` : `mmi-cli \u2014 self-updating ${cliReport.currentVersion} \u2192 ${target} via npm install -g`;
38830
39289
  healIntent(intent);
38831
39290
  traceHeal("cli-self-update");
38832
- const heal = await deps.updateCli(target, healStep);
39291
+ let lastNpmLineAt = Date.now();
39292
+ const startedAt = lastNpmLineAt;
39293
+ const stepWithLiveness = (message, stepOpts) => {
39294
+ lastNpmLineAt = Date.now();
39295
+ healStep(message, stepOpts);
39296
+ };
39297
+ const heartbeat = opts.json ? void 0 : setInterval(() => {
39298
+ const quietS = Math.floor((Date.now() - lastNpmLineAt) / 1e3);
39299
+ if (quietS >= 30) {
39300
+ io.log(`${VERBOSE_INDENT}still running \u2014 npm quiet for ${quietS}s (${Math.floor((Date.now() - startedAt) / 1e3)}s total)`);
39301
+ }
39302
+ }, 3e4);
39303
+ heartbeat?.unref?.();
39304
+ let heal;
39305
+ try {
39306
+ heal = await deps.updateCli(target, stepWithLiveness);
39307
+ } finally {
39308
+ if (heartbeat) clearInterval(heartbeat);
39309
+ }
38833
39310
  if (heal.skipped) spentHeals.delete("cli-self-update");
38834
39311
  if (heal.ok && !heal.skipped) markHealChanged();
38835
39312
  const healEvidence = [
@@ -39036,6 +39513,9 @@ async function runDoctorClean(opts, io, deps) {
39036
39513
  if (changed.length > 0) {
39037
39514
  markHealChanged();
39038
39515
  restartPending = true;
39516
+ for (const note of changed) {
39517
+ if (note.host !== "marketplace") changedPluginHosts.add(note.host);
39518
+ }
39039
39519
  }
39040
39520
  const passRow = {
39041
39521
  id: "update-pass",
@@ -39472,6 +39952,8 @@ async function runDoctorClean(opts, io, deps) {
39472
39952
  checks: payload,
39473
39953
  restartPending,
39474
39954
  ...restartPending ? { restartAction } : {},
39955
+ // #4940: stable host tokens whose plugin changed this run — additive beside restartAction.
39956
+ ...changedPluginHosts.size > 0 ? { restartHosts: [...changedPluginHosts].sort() } : {},
39475
39957
  exitCode
39476
39958
  }, null, 2));
39477
39959
  return exitCode;
@@ -39482,7 +39964,10 @@ async function runDoctorClean(opts, io, deps) {
39482
39964
  io.log(renderReport([c], { restartPending: false }));
39483
39965
  if (opts.verbose) for (const evidence of c.verbose ?? []) io.log(`${VERBOSE_INDENT}${evidence}`);
39484
39966
  }
39485
- if (restartPending) io.log(`\u21BB ${restartAction.charAt(0).toUpperCase()}${restartAction.slice(1)} to finish.`);
39967
+ if (restartPending) {
39968
+ io.log(`\u21BB ${restartAction.charAt(0).toUpperCase()}${restartAction.slice(1)} to finish.`);
39969
+ for (const line of extraRestartLines()) io.log(line);
39970
+ }
39486
39971
  return 0;
39487
39972
  }
39488
39973
  const rest = checks.filter((c) => !alreadyShown(c));
@@ -39493,7 +39978,10 @@ async function runDoctorClean(opts, io, deps) {
39493
39978
  if (opts.verbose) for (const evidence of check.verbose ?? []) lines.push(`${VERBOSE_INDENT}${evidence}`);
39494
39979
  }
39495
39980
  lines.push(renderTally(checks));
39496
- if (restartPending) lines.push(`\u21BB ${restartAction.charAt(0).toUpperCase()}${restartAction.slice(1)} to finish.`);
39981
+ if (restartPending) {
39982
+ lines.push(`\u21BB ${restartAction.charAt(0).toUpperCase()}${restartAction.slice(1)} to finish.`);
39983
+ lines.push(...extraRestartLines());
39984
+ }
39497
39985
  io.log(lines.join("\n"));
39498
39986
  return exitCode;
39499
39987
  }
@@ -43735,6 +44223,23 @@ installProcessBackstop();
43735
44223
  consolidateCommandNamespaces(program2);
43736
44224
  registerOrgHealthQuery(program2);
43737
44225
  applyCommandTaxonomy(program2);
44226
+ function registeredPathPrefix(path2) {
44227
+ const tokens2 = path2.split(" ");
44228
+ let node = program2;
44229
+ let depth = 0;
44230
+ while (depth < tokens2.length) {
44231
+ const next = node.commands.find((c) => c.name() === tokens2[depth]);
44232
+ if (!next) break;
44233
+ node = next;
44234
+ depth += 1;
44235
+ }
44236
+ return tokens2.slice(0, Math.max(depth, 1)).join(" ");
44237
+ }
44238
+ function recoveryPointerFor(path2) {
44239
+ const runnable = registeredPathPrefix(path2);
44240
+ if (runnable === path2) return `run: mmi-cli ${canonicalPathFor(runnable)} \u2026`;
44241
+ return `'${path2}' is not a registered command \u2014 run \`mmi-cli ${canonicalPathFor(runnable)} --help\` for what lives under it`;
44242
+ }
43738
44243
  function resolveHouseShim(argv) {
43739
44244
  const houseToken = argv[2];
43740
44245
  if (!houseToken) return;
@@ -43744,7 +44249,7 @@ function resolveHouseShim(argv) {
43744
44249
  const flatHouse = houseForPath(flatPath);
43745
44250
  if (!flatHouse || flatHouse === "core") return;
43746
44251
  process.stderr.write(
43747
- `mmi-cli: the flat '${flatPath}' alias was removed in ${COMPAT_SHIM_DEATH_WAVE} (#4316) \u2014 run: mmi-cli ${canonicalPathFor(flatPath)} \u2026
44252
+ `mmi-cli: the flat '${flatPath}' alias was removed in ${COMPAT_SHIM_DEATH_WAVE} (#4316) \u2014 ${recoveryPointerFor(flatPath)}
43748
44253
  `
43749
44254
  );
43750
44255
  hardExit(2);
@@ -43768,7 +44273,7 @@ function resolveHouseShim(argv) {
43768
44273
  }
43769
44274
  if (actual) {
43770
44275
  process.stderr.write(
43771
- `mmi-cli ${houseToken}: '${lookupPath}' lives in house '${actual}' \u2014 run: mmi-cli ${canonicalPathFor(lookupPath)} \u2026
44276
+ `mmi-cli ${houseToken}: '${lookupPath}' lives in house '${actual}' \u2014 ${recoveryPointerFor(lookupPath)}
43772
44277
  `
43773
44278
  );
43774
44279
  } else {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/cli",
3
- "version": "3.129.0",
3
+ "version": "3.131.0",
4
4
  "description": "MMI Future CLI — the org dev toolbox and shared cross-IDE engine for every registry-declared MMI coding surface.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",