@mutmutco/claude-plugin 4.5.196 → 4.5.197

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mmi",
3
3
  "displayName": "MMI",
4
- "version": "4.5.196",
4
+ "version": "4.5.197",
5
5
  "mmiCompat": "4.x",
6
6
  "description": "MMI workflow skills and org gates delivery.",
7
7
  "author": {
package/cli/dist/main.cjs CHANGED
@@ -19279,10 +19279,10 @@ var rollout_plan_default = {
19279
19279
  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)."
19280
19280
  },
19281
19281
  baseline: {
19282
- version: "4.5.196",
19283
- tag: "v4.5.196",
19284
- commit: "b0a1e2a76ba0",
19285
- npm: "@mutmutco/cli@4.5.196"
19282
+ version: "4.5.197",
19283
+ tag: "v4.5.197",
19284
+ commit: "52a7574dc96e",
19285
+ npm: "@mutmutco/cli@4.5.197"
19286
19286
  },
19287
19287
  exitCriterion: "fleet-n-of-n",
19288
19288
  hubOnlyShortcut: "forbidden",
@@ -19299,14 +19299,14 @@ var rollout_plan_default = {
19299
19299
  repo: "mutmutco/mmi-hub",
19300
19300
  role: "canary",
19301
19301
  schedule: "train",
19302
- v3Target: "v4.5.196"
19302
+ v3Target: "v4.5.197"
19303
19303
  }
19304
19304
  ],
19305
19305
  rollbackTrigger: "Any red inside the post-contract soak window: `devops train gate` FAIL attributable to the v4 doors, Hub endpoint health probe failure, a pre-v4 client admitted instead of receiving actionable HTTP 426, or npm consumer install/doctor failure on the v4-only dist.",
19306
19306
  rollback: {
19307
19307
  independent: true,
19308
- mechanism: "npm dist-tag latest -> 4.5.196 and redeploy the Hub Lambda from tag v4.5.196 (b0a1e2a76ba0); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
19309
- v3Target: "v4.5.196 (@mutmutco/cli@4.5.196, tag commit b0a1e2a76ba0 \u2014 last known-good release carrying the repo-index v4-only contract)"
19308
+ mechanism: "npm dist-tag latest -> 4.5.197 and redeploy the Hub Lambda from tag v4.5.197 (52a7574dc96e); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
19309
+ v3Target: "v4.5.197 (@mutmutco/cli@4.5.197, tag commit 52a7574dc96e \u2014 last known-good release carrying the repo-index v4-only contract)"
19310
19310
  }
19311
19311
  },
19312
19312
  {
@@ -42913,19 +42913,18 @@ function evaluatePrMergeHousekeeping(report, context, force = false) {
42913
42913
  const failed2 = scratch?.status === "failed";
42914
42914
  const prunable = scratch?.safeAuto ?? 0;
42915
42915
  const unprunable = scratch?.skipped ?? 0;
42916
- if (!(failed2 || prunable > 0 || unprunable > 0)) return { blocked: false };
42917
- if (force) return { blocked: false };
42916
+ if (!(failed2 || prunable > 0 || unprunable > 0) || force) return {};
42918
42917
  const detail = failed2 ? `scratch housekeeping failed${scratch?.error ? `: ${scratch.error}` : ""}` : `${prunable} prunable + ${unprunable} un-prunable scratch item(s) remain after cleanup`;
42919
42918
  return {
42920
- blocked: true,
42921
- reason: `${context} housekeeping blocked merge: ${detail}. Run \`mmi-cli doctor --apply\` to prune aged repo-root scratch (or \`mmi-cli doctor --verbose\` to inspect what could not be removed), then retry \u2014 or re-run \`mmi-cli devops ${context} --force\` to acknowledge an unresolved scratch block without cleaning it and proceed anyway. (Kept advisory plans/ scratch never blocks: it is gitignored and can never reach origin.)`
42919
+ warning: `${context} housekeeping warning (not blocking): ${detail}. Run \`mmi-cli doctor --apply\` to prune aged repo-root scratch (or \`mmi-cli doctor --verbose\` to inspect what could not be removed). Local scratch never reaches origin, so the merge proceeds.`
42922
42920
  };
42923
42921
  }
42924
- function assertPrMergeHousekeepingClean(startingPath, context, options = {}) {
42922
+ function reportPrMergeHousekeeping(startingPath, context, options = {}) {
42925
42923
  const build = options.buildHousekeeping ?? ((repoRoot2) => buildPrMergeScratchHousekeeping(repoRoot2));
42926
42924
  const housekeeping = build(startingPath || process.cwd());
42927
42925
  const verdict = evaluatePrMergeHousekeeping(housekeeping, context, options.force);
42928
- if (verdict.blocked) throw new Error(verdict.reason);
42926
+ if (verdict.warning) process.stderr.write(`${verdict.warning}
42927
+ `);
42929
42928
  return housekeeping;
42930
42929
  }
42931
42930
  async function pollGhPrChecks(prNumber, repoArgs) {
@@ -48696,7 +48695,7 @@ ${list}`);
48696
48695
  }
48697
48696
  class PrHeadBehindBaseError extends Error {
48698
48697
  }
48699
- pr.command("land <numbers...>").description("agent merge path (#1440): train probe \u2014 checks-wait \u2014 merge --auto \u2014 poll enqueued \u2014 development PRs only. Several PR numbers land together (#8322): all are enqueued, waited on together, a queue-ejected PR is updated and re-enqueued once, a queue merge is followed by worktree/branch cleanup and board Done, and one table (or --json) reports each outcome").option("--json", "machine-readable output").option("--repo <owner/repo>", "target repo (defaults to the PR repo)").option("--enqueue-only", "return once queue membership is confirmed; without a merge queue, land normally").option("--no-require-train", "skip train-authority preflight (not recommended for autonomous agents)").option("--force", "acknowledge and land past a remaining prunable/severe scratch housekeeping block (advisory kept plans/ never blocks, #3012) or a negated-closing-keyword (#3718) or ambiguous-cross-repo-closing (#4279) refusal").option("--without-review <reason>", "compatibility option; shared merge helpers do not require a review verdict").option("--timeout <minutes>", `merge-queue wait per PR (default ${PR_LAND_QUEUE_TIMEOUT_MS / 6e4} minutes, one window per ${PR_LAND_QUEUE_BATCH_SIZE} PRs \u2014 the queue's own check timeout is 60)`).option("--preserve-worktree", "after a queue merge keep the local worktree and branch (skips the post-merge cleanup)").option("--expect-head <sha>", "pin the PR head to this full 40-hex SHA (#8456): checked before landing, after checks and by GitHub at enqueue (--match-head-commit); never updates a BEHIND head and never retries an ejection \u2014 it stops with pinnedHead.refused instead. One PR only").action(async (numbers, opts) => {
48698
+ pr.command("land <numbers...>").description("agent merge path (#1440): train probe \u2014 checks-wait \u2014 merge --auto \u2014 poll enqueued \u2014 development PRs only. Several PR numbers land together (#8322): all are enqueued, waited on together, a queue-ejected PR is updated and re-enqueued once, a queue merge is followed by worktree/branch cleanup and board Done, and one table (or --json) reports each outcome").option("--json", "machine-readable output").option("--repo <owner/repo>", "target repo (defaults to the PR repo)").option("--enqueue-only", "return once queue membership is confirmed; without a merge queue, land normally").option("--no-require-train", "skip train-authority preflight (not recommended for autonomous agents)").option("--force", "silence the leftover-scratch warning (scratch never blocks, #8785) and acknowledge a negated-closing-keyword (#3718) or ambiguous-cross-repo-closing (#4279) refusal").option("--without-review <reason>", "compatibility option; shared merge helpers do not require a review verdict").option("--timeout <minutes>", `merge-queue wait per PR (default ${PR_LAND_QUEUE_TIMEOUT_MS / 6e4} minutes, one window per ${PR_LAND_QUEUE_BATCH_SIZE} PRs \u2014 the queue's own check timeout is 60)`).option("--preserve-worktree", "after a queue merge keep the local worktree and branch (skips the post-merge cleanup)").option("--expect-head <sha>", "pin the PR head to this full 40-hex SHA (#8456): checked before landing, after checks and by GitHub at enqueue (--match-head-commit); never updates a BEHIND head and never retries an ejection \u2014 it stops with pinnedHead.refused instead. One PR only").action(async (numbers, opts) => {
48700
48699
  const timeoutMinutes = opts.timeout === void 0 ? void 0 : Number(opts.timeout);
48701
48700
  if (timeoutMinutes !== void 0 && !(timeoutMinutes > 0)) return fail("pr land: --timeout must be a positive number of minutes");
48702
48701
  if (opts.expectHead !== void 0) {
@@ -48721,7 +48720,7 @@ ${list}`);
48721
48720
  }
48722
48721
  const repoArgs = o.repo ? ["--repo", o.repo] : [];
48723
48722
  const startingPath = (await execFileP("git", ["rev-parse", "--show-toplevel"], { timeout: GIT_TIMEOUT_MS }).catch(() => ({ stdout: "" }))).stdout.trim();
48724
- assertPrMergeHousekeepingClean(startingPath || process.cwd(), "pr land", { force: o.force });
48723
+ reportPrMergeHousekeeping(startingPath || process.cwd(), "pr land", { force: o.force });
48725
48724
  const landRepoForGuard = await resolveRepo(o.repo).catch(() => void 0) ?? o.repo;
48726
48725
  const landClosingGuardInput = await withAlreadyClosedCommitTargets(
48727
48726
  await readClosingGuardInput(number, repoArgs, landRepoForGuard, "pr land"),
@@ -48950,7 +48949,7 @@ ${list}`);
48950
48949
  }
48951
48950
  if (entries.some((e) => e.outcome !== "merged" && e.outcome !== "queued")) process.exitCode = 1;
48952
48951
  });
48953
- jsonParity(pr.command("merge <number>").description("merge a PR (squash by default); archives gitignored tmp/** before worktree teardown; on no-ci repos run pr ci-policy / checks-wait first (#1432, #5679); on a merge-queue base use `pr land <n> [<n>...]` instead (#8322) \u2014 this verb is refused there except for train PRs").option("--squash", "squash merge (default)").option("--merge", "create a merge commit").option("--rebase", "rebase merge").option("--repo <owner/repo>", "target repo (defaults to the current repo); from a foreign checkout the remote probe/delete address this repo and local cleanup runs only in the verified sibling checkout ../<repo>, else localBranch reports skipped-foreign-cwd and the receipt carries foreignCwd: true (#6148)").option("--auto", "enable auto-merge \u2014 merge once the base-branch policy is satisfied (use for policy-gated repos)").addOption(new Option("--disable-auto", "disable a queued auto-merge without merging").conflicts(["auto", "wait", "squash", "merge", "rebase", "preserveWorktree", "gc", "squashBodyFile", "force"])).option("--wait", `wait for checks to reach a terminal passing verdict before merging (default budget ${PR_CHECKS_TIMEOUT_MS / 6e4}m) \u2014 run as a background/monitor task or under a shell timeout above that budget; a short foreground timeout (e.g. 120s) kills it after checks pass and leaves the PR open (#6027)`).option("--preserve-worktree", "after merge, keep the local PR worktree/branch for an active batch (#1888); also the merge settings-proof bypass when delete_branch_on_merge cannot be proven (#6210)").option("--gc", "acknowledge deleting unarchived gitignored tmp/** evidence newer than the branch base (#5679)").option("--squash-body-file <path>", "squash commit body (overrides GitHub COMMIT_MESSAGES); use when a pushed commit mentions close/fix/resolve + #N that must not close (#5723)").option("--force", "acknowledge and merge past a remaining prunable/severe scratch housekeeping block (advisory kept plans/ never blocks, #3012) or a negated-closing-keyword (#3718) or ambiguous-cross-repo-closing (#4279) refusal").option("--without-review <reason>", "compatibility option; shared merge helpers do not require a review verdict")).action(async (number, o) => {
48952
+ jsonParity(pr.command("merge <number>").description("merge a PR (squash by default); archives gitignored tmp/** before worktree teardown; on no-ci repos run pr ci-policy / checks-wait first (#1432, #5679); on a merge-queue base use `pr land <n> [<n>...]` instead (#8322) \u2014 this verb is refused there except for train PRs").option("--squash", "squash merge (default)").option("--merge", "create a merge commit").option("--rebase", "rebase merge").option("--repo <owner/repo>", "target repo (defaults to the current repo); from a foreign checkout the remote probe/delete address this repo and local cleanup runs only in the verified sibling checkout ../<repo>, else localBranch reports skipped-foreign-cwd and the receipt carries foreignCwd: true (#6148)").option("--auto", "enable auto-merge \u2014 merge once the base-branch policy is satisfied (use for policy-gated repos)").addOption(new Option("--disable-auto", "disable a queued auto-merge without merging").conflicts(["auto", "wait", "squash", "merge", "rebase", "preserveWorktree", "gc", "squashBodyFile", "force"])).option("--wait", `wait for checks to reach a terminal passing verdict before merging (default budget ${PR_CHECKS_TIMEOUT_MS / 6e4}m) \u2014 run as a background/monitor task or under a shell timeout above that budget; a short foreground timeout (e.g. 120s) kills it after checks pass and leaves the PR open (#6027)`).option("--preserve-worktree", "after merge, keep the local PR worktree/branch for an active batch (#1888); also the merge settings-proof bypass when delete_branch_on_merge cannot be proven (#6210)").option("--gc", "acknowledge deleting unarchived gitignored tmp/** evidence newer than the branch base (#5679)").option("--squash-body-file <path>", "squash commit body (overrides GitHub COMMIT_MESSAGES); use when a pushed commit mentions close/fix/resolve + #N that must not close (#5723)").option("--force", "silence the leftover-scratch warning (scratch never blocks, #8785) and acknowledge a negated-closing-keyword (#3718) or ambiguous-cross-repo-closing (#4279) refusal").option("--without-review <reason>", "compatibility option; shared merge helpers do not require a review verdict")).action(async (number, o) => {
48954
48953
  const method = o.rebase ? "--rebase" : o.merge ? "--merge" : "--squash";
48955
48954
  const repoArgs = o.repo ? ["--repo", o.repo] : [];
48956
48955
  if (o.disableAuto) {
@@ -49010,7 +49009,7 @@ ${list}`);
49010
49009
  assertRemoteBranchPreservedOnMerge(repoForPostCleanup, repoSettings.deleteBranchOnMerge);
49011
49010
  }
49012
49011
  const startingPath = (await execFileP("git", ["rev-parse", "--show-toplevel"], { timeout: GIT_TIMEOUT_MS }).catch(() => ({ stdout: "" }))).stdout.trim();
49013
- const housekeeping = assertPrMergeHousekeepingClean(startingPath || process.cwd(), "pr merge", { force: o.force });
49012
+ const housekeeping = reportPrMergeHousekeeping(startingPath || process.cwd(), "pr merge", { force: o.force });
49014
49013
  const beforeWorktreesRead = await execFileP("git", ["worktree", "list", "--porcelain"], { timeout: GIT_TIMEOUT_MS }).then((r) => ({ state: "ok", stdout: r.stdout })).catch((e) => ({ state: "failed", error: e.message || "git worktree list failed" }));
49015
49014
  let beforeWorktrees = beforeWorktreesRead.state === "ok" ? parseGitWorktreePorcelain(beforeWorktreesRead.stdout) : [];
49016
49015
  const cwdRepo = repoFromRemoteUrl(await gitOut(["remote", "get-url", "origin"]).catch(() => ""));
package/cli/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/cli",
3
- "version": "4.5.196",
3
+ "version": "4.5.197",
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",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/claude-plugin",
3
- "version": "4.5.196",
3
+ "version": "4.5.197",
4
4
  "description": "MMI workflow skills and org gates delivery.",
5
5
  "author": {
6
6
  "name": "MMI Future",