@mutmutco/cli 3.130.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 +635 -139
  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.130.0",
16041
- tag: "v3.130.0",
16042
- commit: "4092383c82be",
16043
- npm: "@mutmutco/cli@3.130.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.130.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.130.0 and redeploy the Hub Lambda from tag v3.130.0 (4092383c82be); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
16067
- v3Target: "v3.130.0 (@mutmutco/cli@3.130.0, tag commit 4092383c82be \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
  {
@@ -26597,7 +26574,7 @@ async function portFoldToDevelopment(deps, ctx, deployModel, tag) {
26597
26574
  "--title",
26598
26575
  `chore(release): port the ${tag} version fold to development`,
26599
26576
  "--body",
26600
- `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.
26601
26578
 
26602
26579
  Generated by \`mmi-cli devops hotfix release\` \u2014 no main-parented commit is merged in, so the squash parents stay clean (#4365/#4371).`
26603
26580
  ]));
@@ -35935,7 +35912,7 @@ function requiredEstateCommandsPresent(commandNames) {
35935
35912
  return required.filter((name) => !present.has(name));
35936
35913
  }
35937
35914
  function onboardPluginGate(deps) {
35938
- const { registered, declared, ref } = readKnownMarketplace(deps.readKnown(), MMI_MARKETPLACE_NAME);
35915
+ const { registered, declared } = readKnownMarketplace(deps.readKnown(), MMI_MARKETPLACE_NAME);
35939
35916
  if (!registered) {
35940
35917
  return { ok: false, detail: `${MMI_MARKETPLACE_NAME} marketplace not registered on this machine` };
35941
35918
  }
@@ -35945,11 +35922,7 @@ function onboardPluginGate(deps) {
35945
35922
  declared,
35946
35923
  settingsDeclared: readSettingsAutoUpdate(deps.readSettings(), MMI_MARKETPLACE_NAME)
35947
35924
  }).effective;
35948
- const catalog = resolveCatalogRef({ name: MMI_MARKETPLACE_NAME, registered, ref, autoUpdate });
35949
- const gaps = [];
35950
- if (!autoUpdate) gaps.push(`auto-update is off \u2014 turn it on with ${AUTO_UPDATE_TOGGLE_STEPS}`);
35951
- if (catalog && !catalog.agrees) gaps.push(`the catalog is ${catalog.unpinned ? "unpinned" : `pinned to ${catalog.ref}`} \u2014 ${CATALOG_REF_PIN_STEPS}`);
35952
- 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" };
35953
35926
  }
35954
35927
  async function collectOnboardStatus(opts = {}) {
35955
35928
  const cfg = await loadConfig();
@@ -37401,12 +37374,83 @@ var surfaces_default = {
37401
37374
  token: "claude",
37402
37375
  displayName: "Claude Code",
37403
37376
  lifecycle: "active",
37404
- 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
+ ],
37405
37385
  plannedArtifactIds: [],
37406
37386
  assembly: {
37407
- mode: "source-tree",
37408
- rootPath: ".",
37409
- 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
+ ]
37410
37454
  },
37411
37455
  install: {
37412
37456
  mechanism: "marketplace",
@@ -37429,9 +37473,18 @@ var surfaces_default = {
37429
37473
  adapterPath: "hooks/hooks.json",
37430
37474
  sourceSurfaceId: "mmi-hook-policy",
37431
37475
  gates: [
37432
- { id: "command-ladder", failure: "closed" },
37433
- { id: "vault-edit", failure: "closed" },
37434
- { 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
+ }
37435
37488
  ],
37436
37489
  probe: "installed-contract",
37437
37490
  execution: "command",
@@ -37450,7 +37503,9 @@ var surfaces_default = {
37450
37503
  },
37451
37504
  certification: {
37452
37505
  hostCommand: "claude",
37453
- versionArgs: ["--version"]
37506
+ versionArgs: [
37507
+ "--version"
37508
+ ]
37454
37509
  },
37455
37510
  enforcementCeilings: [
37456
37511
  "Final assistant text cannot be rewritten by the hook surface.",
@@ -37461,12 +37516,73 @@ var surfaces_default = {
37461
37516
  token: "codex",
37462
37517
  displayName: "Codex",
37463
37518
  lifecycle: "active",
37464
- 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
+ ],
37465
37525
  plannedArtifactIds: [],
37466
37526
  assembly: {
37467
- mode: "source-tree",
37468
- rootPath: ".",
37469
- 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
+ ]
37470
37586
  },
37471
37587
  install: {
37472
37588
  mechanism: "marketplace",
@@ -37489,9 +37605,18 @@ var surfaces_default = {
37489
37605
  adapterPath: "hooks/codex-hooks.json",
37490
37606
  sourceSurfaceId: "mmi-hook-policy",
37491
37607
  gates: [
37492
- { id: "command-ladder", failure: "closed" },
37493
- { id: "vault-edit", failure: "closed" },
37494
- { 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
+ }
37495
37620
  ],
37496
37621
  probe: "installed-contract",
37497
37622
  execution: "node-bootstrap",
@@ -37510,7 +37635,9 @@ var surfaces_default = {
37510
37635
  },
37511
37636
  certification: {
37512
37637
  hostCommand: "codex",
37513
- versionArgs: ["--version"]
37638
+ versionArgs: [
37639
+ "--version"
37640
+ ]
37514
37641
  },
37515
37642
  enforcementCeilings: [
37516
37643
  "Post-tool hooks can detect secret output but cannot rewrite it.",
@@ -37521,12 +37648,65 @@ var surfaces_default = {
37521
37648
  token: "kimi",
37522
37649
  displayName: "Kimi Code CLI",
37523
37650
  lifecycle: "active",
37524
- 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
+ ],
37525
37657
  plannedArtifactIds: [],
37526
37658
  assembly: {
37527
- mode: "source-tree",
37528
- rootPath: ".",
37529
- 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
+ ]
37530
37710
  },
37531
37711
  install: {
37532
37712
  mechanism: "github-source",
@@ -37549,9 +37729,18 @@ var surfaces_default = {
37549
37729
  adapterPath: ".kimi-plugin/plugin.json",
37550
37730
  sourceSurfaceId: "mmi-hook-policy",
37551
37731
  gates: [
37552
- { id: "command-ladder", failure: "closed" },
37553
- { id: "vault-edit", failure: "closed" },
37554
- { 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
+ }
37555
37744
  ],
37556
37745
  probe: "installed-contract",
37557
37746
  execution: "inline-manifest",
@@ -37570,7 +37759,9 @@ var surfaces_default = {
37570
37759
  },
37571
37760
  certification: {
37572
37761
  hostCommand: "kimi",
37573
- versionArgs: ["--version"]
37762
+ versionArgs: [
37763
+ "--version"
37764
+ ]
37574
37765
  },
37575
37766
  enforcementCeilings: [
37576
37767
  "Post-tool hooks are observation-only and cannot rewrite secret output.",
@@ -37581,12 +37772,73 @@ var surfaces_default = {
37581
37772
  token: "cursor",
37582
37773
  displayName: "Cursor",
37583
37774
  lifecycle: "active",
37584
- 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
+ ],
37585
37781
  plannedArtifactIds: [],
37586
37782
  assembly: {
37587
- mode: "source-tree",
37588
- rootPath: ".",
37589
- 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
+ ]
37590
37842
  },
37591
37843
  install: {
37592
37844
  mechanism: "github-source",
@@ -37609,9 +37861,18 @@ var surfaces_default = {
37609
37861
  adapterPath: "hooks/cursor-hooks.json",
37610
37862
  sourceSurfaceId: "mmi-hook-policy",
37611
37863
  gates: [
37612
- { id: "command-ladder", failure: "closed" },
37613
- { id: "vault-edit", failure: "closed" },
37614
- { 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
+ }
37615
37876
  ],
37616
37877
  probe: "installed-contract",
37617
37878
  execution: "command",
@@ -37630,7 +37891,9 @@ var surfaces_default = {
37630
37891
  },
37631
37892
  certification: {
37632
37893
  hostCommand: "cursor-agent",
37633
- versionArgs: ["--version"]
37894
+ versionArgs: [
37895
+ "--version"
37896
+ ]
37634
37897
  },
37635
37898
  enforcementCeilings: [
37636
37899
  "Cursor can replace MCP results only; it cannot rewrite ordinary tool output after execution, though MMI still detects secret-shaped output.",
@@ -37642,7 +37905,12 @@ var surfaces_default = {
37642
37905
  token: "kilo",
37643
37906
  displayName: "Kilo Code",
37644
37907
  lifecycle: "active",
37645
- 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
+ ],
37646
37914
  plannedArtifactIds: [],
37647
37915
  assembly: {
37648
37916
  mode: "package-directory",
@@ -37652,7 +37920,9 @@ var surfaces_default = {
37652
37920
  mode: "directories",
37653
37921
  sourcePath: "skills",
37654
37922
  targetPath: ".kilo-plugin/skills",
37655
- excludeNamePrefixes: ["_"]
37923
+ excludeNamePrefixes: [
37924
+ "_"
37925
+ ]
37656
37926
  },
37657
37927
  {
37658
37928
  mode: "files",
@@ -37699,9 +37969,18 @@ var surfaces_default = {
37699
37969
  adapterPath: ".kilo-plugin/server.mjs",
37700
37970
  sourceSurfaceId: "mmi-hook-policy",
37701
37971
  gates: [
37702
- { id: "command-ladder", failure: "closed" },
37703
- { id: "vault-edit", failure: "closed" },
37704
- { 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
+ }
37705
37984
  ],
37706
37985
  probe: "installed-contract",
37707
37986
  execution: "in-process",
@@ -37720,7 +37999,9 @@ var surfaces_default = {
37720
37999
  },
37721
38000
  certification: {
37722
38001
  hostCommand: "kilo",
37723
- versionArgs: ["--version"]
38002
+ versionArgs: [
38003
+ "--version"
38004
+ ]
37724
38005
  },
37725
38006
  enforcementCeilings: [
37726
38007
  "Some read, write, and web-fetch tool outputs are not rewriteable by the host.",
@@ -37731,7 +38012,11 @@ var surfaces_default = {
37731
38012
  token: "jervcode",
37732
38013
  displayName: "JervCode",
37733
38014
  lifecycle: "active",
37734
- artifactIds: ["mmi-pi-plugin", "mmi-skills", "mmi-cli"],
38015
+ artifactIds: [
38016
+ "mmi-pi-plugin",
38017
+ "mmi-skills",
38018
+ "mmi-cli"
38019
+ ],
37735
38020
  plannedArtifactIds: [],
37736
38021
  assembly: {
37737
38022
  mode: "source-tree",
@@ -37776,7 +38061,9 @@ var surfaces_default = {
37776
38061
  },
37777
38062
  certification: {
37778
38063
  hostCommand: "jervcode",
37779
- versionArgs: ["--version"]
38064
+ versionArgs: [
38065
+ "--version"
38066
+ ]
37780
38067
  },
37781
38068
  enforcementCeilings: [
37782
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.",
@@ -37796,16 +38083,24 @@ var surfaces_default = {
37796
38083
  applicability: "plugin-enabled agent surfaces",
37797
38084
  versionCoordinated: true,
37798
38085
  versionPaths: [
37799
- { path: "cli/package.json", pointer: "version" }
38086
+ {
38087
+ path: "cli/package.json",
38088
+ pointer: "version"
38089
+ }
37800
38090
  ],
37801
38091
  artifactIdentity: {
37802
38092
  kind: "sha256-tree",
37803
- paths: ["skills"]
38093
+ paths: [
38094
+ "skills"
38095
+ ]
37804
38096
  },
37805
38097
  verify: [
37806
38098
  {
37807
38099
  command: "node",
37808
- args: ["scripts/check-skill-payload.mjs", "--contract"],
38100
+ args: [
38101
+ "scripts/check-skill-payload.mjs",
38102
+ "--contract"
38103
+ ],
37809
38104
  expected: "skill payload check: ok"
37810
38105
  }
37811
38106
  ],
@@ -37815,18 +38110,33 @@ var surfaces_default = {
37815
38110
  id: "mmi-claude-plugin",
37816
38111
  classification: "packaging",
37817
38112
  kind: "plugin",
37818
- ownerPath: ".claude-plugin/plugin.json",
37819
- deliveryPath: ".claude-plugin/plugin.json",
37820
- delivery: "release",
37821
- 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).",
37822
38117
  versionCoordinated: true,
37823
38118
  surfaceToken: "claude",
37824
38119
  versionPaths: [
37825
- { 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"
37826
38136
  ],
37827
38137
  artifactIdentity: {
37828
- kind: "sha256-tree",
37829
- paths: [".claude-plugin/plugin.json", "skills", "hooks", "scripts", "bin"]
38138
+ kind: "npm-pack",
38139
+ packagePath: "packages/claude-plugin"
37830
38140
  },
37831
38141
  publishVisibility: "public"
37832
38142
  },
@@ -37834,18 +38144,36 @@ var surfaces_default = {
37834
38144
  id: "mmi-codex-plugin",
37835
38145
  classification: "packaging",
37836
38146
  kind: "plugin",
37837
- ownerPath: ".codex-plugin/plugin.json",
37838
- deliveryPath: ".codex-plugin/plugin.json",
37839
- delivery: "release",
37840
- 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).",
37841
38151
  versionCoordinated: true,
37842
38152
  surfaceToken: "codex",
37843
38153
  versionPaths: [
37844
- { 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"
37845
38173
  ],
37846
38174
  artifactIdentity: {
37847
- kind: "sha256-tree",
37848
- paths: [".codex-plugin/plugin.json", "skills", "hooks/codex-hooks.json", "scripts", "bin"]
38175
+ kind: "npm-pack",
38176
+ packagePath: "packages/codex-plugin"
37849
38177
  },
37850
38178
  publishVisibility: "public"
37851
38179
  },
@@ -37853,18 +38181,31 @@ var surfaces_default = {
37853
38181
  id: "mmi-kimi-plugin",
37854
38182
  classification: "packaging",
37855
38183
  kind: "plugin",
37856
- ownerPath: ".kimi-plugin/plugin.json",
37857
- deliveryPath: ".kimi-plugin/plugin.json",
37858
- delivery: "release",
37859
- 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).",
37860
38188
  versionCoordinated: true,
37861
38189
  surfaceToken: "kimi",
37862
38190
  versionPaths: [
37863
- { 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"
37864
38205
  ],
37865
38206
  artifactIdentity: {
37866
- kind: "sha256-tree",
37867
- paths: [".kimi-plugin/plugin.json", "skills", "scripts", "bin"]
38207
+ kind: "npm-pack",
38208
+ packagePath: "packages/kimi-plugin"
37868
38209
  },
37869
38210
  publishVisibility: "public"
37870
38211
  },
@@ -37872,18 +38213,32 @@ var surfaces_default = {
37872
38213
  id: "mmi-cursor-plugin",
37873
38214
  classification: "packaging",
37874
38215
  kind: "plugin",
37875
- ownerPath: ".cursor-plugin/plugin.json",
37876
- deliveryPath: "~/.cursor/plugins/local/mmi",
37877
- delivery: "local-copy",
37878
- 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).",
37879
38220
  versionCoordinated: true,
37880
38221
  surfaceToken: "cursor",
37881
38222
  versionPaths: [
37882
- { 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"
37883
38238
  ],
37884
38239
  artifactIdentity: {
37885
- kind: "sha256-tree",
37886
- paths: [".cursor-plugin/plugin.json", "skills", "hooks/cursor-hooks.json", "scripts", "bin"]
38240
+ kind: "npm-pack",
38241
+ packagePath: "packages/cursor-plugin"
37887
38242
  },
37888
38243
  publishVisibility: "public"
37889
38244
  },
@@ -37898,7 +38253,10 @@ var surfaces_default = {
37898
38253
  versionCoordinated: true,
37899
38254
  surfaceToken: "kilo",
37900
38255
  versionPaths: [
37901
- { path: ".kilo-plugin/package.json", pointer: "version" }
38256
+ {
38257
+ path: ".kilo-plugin/package.json",
38258
+ pointer: "version"
38259
+ }
37902
38260
  ],
37903
38261
  additionalPaths: [
37904
38262
  ".kilo-plugin/server.mjs",
@@ -37921,11 +38279,16 @@ var surfaces_default = {
37921
38279
  applicability: "Kilo Code (via @mutmutco/kilo-plugin provisioning to ~/.kilo/skills)",
37922
38280
  versionCoordinated: true,
37923
38281
  versionPaths: [
37924
- { path: "cli/package.json", pointer: "version" }
38282
+ {
38283
+ path: "cli/package.json",
38284
+ pointer: "version"
38285
+ }
37925
38286
  ],
37926
38287
  artifactIdentity: {
37927
38288
  kind: "sha256-tree",
37928
- paths: [".kilo-plugin/skills"]
38289
+ paths: [
38290
+ ".kilo-plugin/skills"
38291
+ ]
37929
38292
  },
37930
38293
  surfaceToken: "kilo",
37931
38294
  publishVisibility: "public"
@@ -37941,12 +38304,25 @@ var surfaces_default = {
37941
38304
  versionCoordinated: true,
37942
38305
  surfaceToken: "claude",
37943
38306
  versionPaths: [
37944
- { path: ".claude-plugin/marketplace.json", pointer: "plugins.0.version" },
37945
- { 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
+ }
37946
38320
  ],
37947
38321
  artifactIdentity: {
37948
38322
  kind: "sha256-tree",
37949
- paths: [".claude-plugin/marketplace.json"]
38323
+ paths: [
38324
+ ".claude-plugin/marketplace.json"
38325
+ ]
37950
38326
  },
37951
38327
  publishVisibility: "public"
37952
38328
  },
@@ -37960,15 +38336,44 @@ var surfaces_default = {
37960
38336
  applicability: "editor-agnostic agent surfaces",
37961
38337
  versionCoordinated: true,
37962
38338
  versionPaths: [
37963
- { path: "cli/package.json", pointer: "version" }
38339
+ {
38340
+ path: "cli/package.json",
38341
+ pointer: "version"
38342
+ }
38343
+ ],
38344
+ additionalPaths: [
38345
+ "cli/dist"
37964
38346
  ],
37965
- additionalPaths: ["cli/dist"],
37966
38347
  artifactIdentity: {
37967
38348
  kind: "npm-pack",
37968
38349
  packagePath: "cli"
37969
38350
  },
37970
38351
  publishVisibility: "public"
37971
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
+ },
37972
38377
  {
37973
38378
  id: "mmi-cli-lock",
37974
38379
  classification: "packaging",
@@ -37979,12 +38384,20 @@ var surfaces_default = {
37979
38384
  applicability: "editor-agnostic agent surfaces",
37980
38385
  versionCoordinated: true,
37981
38386
  versionPaths: [
37982
- { path: "cli/package-lock.json", pointer: "version" },
37983
- { 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
+ }
37984
38395
  ],
37985
38396
  artifactIdentity: {
37986
38397
  kind: "sha256-tree",
37987
- paths: ["cli/package-lock.json"]
38398
+ paths: [
38399
+ "cli/package-lock.json"
38400
+ ]
37988
38401
  },
37989
38402
  publishVisibility: "public"
37990
38403
  },
@@ -37998,27 +38411,52 @@ var surfaces_default = {
37998
38411
  applicability: "editor-agnostic agent surfaces",
37999
38412
  versionCoordinated: true,
38000
38413
  versionPaths: [
38001
- { path: "cli/package.json", pointer: "version" }
38414
+ {
38415
+ path: "cli/package.json",
38416
+ pointer: "version"
38417
+ }
38418
+ ],
38419
+ additionalPaths: [
38420
+ "cli/dist/main.cjs"
38002
38421
  ],
38003
- additionalPaths: ["cli/dist/main.cjs"],
38004
38422
  prepare: [
38005
38423
  {
38006
38424
  command: "npm",
38007
- args: ["--prefix", "cli", "run", "build"],
38008
- inputs: ["cli/src", "cli/build.mjs", "cli/package.json", "cli/README.md", "cli/tsconfig.json", "infra/rollout-plan.json"],
38009
- 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
+ ]
38010
38443
  }
38011
38444
  ],
38012
38445
  verify: [
38013
38446
  {
38014
38447
  command: "node",
38015
- args: ["cli/dist/index.cjs", "--version"],
38448
+ args: [
38449
+ "cli/dist/index.cjs",
38450
+ "--version"
38451
+ ],
38016
38452
  expected: "{version}"
38017
38453
  }
38018
38454
  ],
38019
38455
  artifactIdentity: {
38020
38456
  kind: "sha256-tree",
38021
- paths: ["cli/dist"]
38457
+ paths: [
38458
+ "cli/dist"
38459
+ ]
38022
38460
  },
38023
38461
  publishVisibility: "public"
38024
38462
  },
@@ -38032,7 +38470,10 @@ var surfaces_default = {
38032
38470
  applicability: "all five active hook-capable agent surfaces",
38033
38471
  versionCoordinated: true,
38034
38472
  versionPaths: [
38035
- { path: "cli/package.json", pointer: "version" }
38473
+ {
38474
+ path: "cli/package.json",
38475
+ pointer: "version"
38476
+ }
38036
38477
  ],
38037
38478
  artifactIdentity: {
38038
38479
  kind: "sha256-tree",
@@ -38056,7 +38497,9 @@ var surfaces_default = {
38056
38497
  verify: [
38057
38498
  {
38058
38499
  command: "node",
38059
- args: ["scripts/check-hook-contract.mjs"],
38500
+ args: [
38501
+ "scripts/check-hook-contract.mjs"
38502
+ ],
38060
38503
  expected: "hook contract: 5 active adapters proven, 12 repositories covered"
38061
38504
  }
38062
38505
  ],
@@ -38072,11 +38515,17 @@ var surfaces_default = {
38072
38515
  applicability: "Claude hook-enabled agents",
38073
38516
  versionCoordinated: true,
38074
38517
  versionPaths: [
38075
- { path: "cli/package.json", pointer: "version" }
38518
+ {
38519
+ path: "cli/package.json",
38520
+ pointer: "version"
38521
+ }
38076
38522
  ],
38077
38523
  artifactIdentity: {
38078
38524
  kind: "sha256-tree",
38079
- paths: ["hooks", "scripts"]
38525
+ paths: [
38526
+ "hooks",
38527
+ "scripts"
38528
+ ]
38080
38529
  },
38081
38530
  surfaceToken: "claude",
38082
38531
  publishVisibility: "public"
@@ -38091,7 +38540,10 @@ var surfaces_default = {
38091
38540
  applicability: "org automation and authorization",
38092
38541
  versionCoordinated: true,
38093
38542
  versionPaths: [
38094
- { path: "infra/package.json", pointer: "version" }
38543
+ {
38544
+ path: "infra/package.json",
38545
+ pointer: "version"
38546
+ }
38095
38547
  ],
38096
38548
  publishVisibility: "n/a",
38097
38549
  deployedVersionSource: "http-header:x-hub-version"
@@ -38106,7 +38558,10 @@ var surfaces_default = {
38106
38558
  applicability: "master DM notifications only; chatops out by default",
38107
38559
  versionCoordinated: true,
38108
38560
  versionPaths: [
38109
- { path: "cli/package.json", pointer: "version" }
38561
+ {
38562
+ path: "cli/package.json",
38563
+ pointer: "version"
38564
+ }
38110
38565
  ],
38111
38566
  publishVisibility: "n/a"
38112
38567
  },
@@ -38121,16 +38576,24 @@ var surfaces_default = {
38121
38576
  versionCoordinated: true,
38122
38577
  surfaceToken: "jervcode",
38123
38578
  versionPaths: [
38124
- { path: ".pi-plugin/package.json", pointer: "version" }
38579
+ {
38580
+ path: ".pi-plugin/package.json",
38581
+ pointer: "version"
38582
+ }
38125
38583
  ],
38126
38584
  artifactIdentity: {
38127
38585
  kind: "sha256-tree",
38128
- paths: [".pi-plugin/package.json", "skills"]
38586
+ paths: [
38587
+ ".pi-plugin/package.json",
38588
+ "skills"
38589
+ ]
38129
38590
  },
38130
38591
  verify: [
38131
38592
  {
38132
38593
  command: "node",
38133
- args: ["scripts/check-jervcode-consumer.mjs"],
38594
+ args: [
38595
+ "scripts/check-jervcode-consumer.mjs"
38596
+ ],
38134
38597
  expected: "JervCode consumer fitness: clean ({version})"
38135
38598
  }
38136
38599
  ],
@@ -38700,6 +39163,9 @@ async function runDoctorClean(opts, io, deps) {
38700
39163
  const restartAction = registryEvidence ? surfaceRestartAction(registryEvidence.descriptor) : "restart the agent host";
38701
39164
  const checks = [];
38702
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));
38703
39169
  const streamed = /* @__PURE__ */ new Set();
38704
39170
  const streamedLines = /* @__PURE__ */ new Set();
38705
39171
  const alreadyShown = (c) => streamed.has(c) || streamedLines.has(renderCheckLine(c));
@@ -38766,6 +39232,7 @@ async function runDoctorClean(opts, io, deps) {
38766
39232
  if (!heal.skipped) restartPending = true;
38767
39233
  if (heal.ok && !heal.skipped) {
38768
39234
  markHealChanged();
39235
+ if (activeHostToken) changedPluginHosts.add(activeHostToken);
38769
39236
  spentRows.set("plugin-chain", row);
38770
39237
  }
38771
39238
  } else if (diagnosis.state !== "skipped") {
@@ -38821,7 +39288,25 @@ async function runDoctorClean(opts, io, deps) {
38821
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`;
38822
39289
  healIntent(intent);
38823
39290
  traceHeal("cli-self-update");
38824
- 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
+ }
38825
39310
  if (heal.skipped) spentHeals.delete("cli-self-update");
38826
39311
  if (heal.ok && !heal.skipped) markHealChanged();
38827
39312
  const healEvidence = [
@@ -39028,6 +39513,9 @@ async function runDoctorClean(opts, io, deps) {
39028
39513
  if (changed.length > 0) {
39029
39514
  markHealChanged();
39030
39515
  restartPending = true;
39516
+ for (const note of changed) {
39517
+ if (note.host !== "marketplace") changedPluginHosts.add(note.host);
39518
+ }
39031
39519
  }
39032
39520
  const passRow = {
39033
39521
  id: "update-pass",
@@ -39464,6 +39952,8 @@ async function runDoctorClean(opts, io, deps) {
39464
39952
  checks: payload,
39465
39953
  restartPending,
39466
39954
  ...restartPending ? { restartAction } : {},
39955
+ // #4940: stable host tokens whose plugin changed this run — additive beside restartAction.
39956
+ ...changedPluginHosts.size > 0 ? { restartHosts: [...changedPluginHosts].sort() } : {},
39467
39957
  exitCode
39468
39958
  }, null, 2));
39469
39959
  return exitCode;
@@ -39474,7 +39964,10 @@ async function runDoctorClean(opts, io, deps) {
39474
39964
  io.log(renderReport([c], { restartPending: false }));
39475
39965
  if (opts.verbose) for (const evidence of c.verbose ?? []) io.log(`${VERBOSE_INDENT}${evidence}`);
39476
39966
  }
39477
- 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
+ }
39478
39971
  return 0;
39479
39972
  }
39480
39973
  const rest = checks.filter((c) => !alreadyShown(c));
@@ -39485,7 +39978,10 @@ async function runDoctorClean(opts, io, deps) {
39485
39978
  if (opts.verbose) for (const evidence of check.verbose ?? []) lines.push(`${VERBOSE_INDENT}${evidence}`);
39486
39979
  }
39487
39980
  lines.push(renderTally(checks));
39488
- 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
+ }
39489
39985
  io.log(lines.join("\n"));
39490
39986
  return exitCode;
39491
39987
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/cli",
3
- "version": "3.130.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",