@mutmutco/cli 4.6.29 → 4.6.30

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 +31 -23
  2. package/package.json +1 -1
package/dist/main.cjs CHANGED
@@ -28248,10 +28248,10 @@ var rollout_plan_default = {
28248
28248
  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)."
28249
28249
  },
28250
28250
  baseline: {
28251
- version: "4.6.29",
28252
- tag: "v4.6.29",
28253
- commit: "36e01a038f52",
28254
- npm: "@mutmutco/cli@4.6.29"
28251
+ version: "4.6.30",
28252
+ tag: "v4.6.30",
28253
+ commit: "52569fa5c01e",
28254
+ npm: "@mutmutco/cli@4.6.30"
28255
28255
  },
28256
28256
  exitCriterion: "fleet-n-of-n",
28257
28257
  hubOnlyShortcut: "forbidden",
@@ -28268,14 +28268,14 @@ var rollout_plan_default = {
28268
28268
  repo: "mutmutco/mmi-hub",
28269
28269
  role: "canary",
28270
28270
  schedule: "train",
28271
- v3Target: "v4.6.29"
28271
+ v3Target: "v4.6.30"
28272
28272
  }
28273
28273
  ],
28274
28274
  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.",
28275
28275
  rollback: {
28276
28276
  independent: true,
28277
- mechanism: "npm dist-tag latest -> 4.6.29 and redeploy the Hub Lambda from tag v4.6.29 (36e01a038f52); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
28278
- v3Target: "v4.6.29 (@mutmutco/cli@4.6.29, tag commit 36e01a038f52 \u2014 last known-good release carrying the repo-index v4-only contract)"
28277
+ mechanism: "npm dist-tag latest -> 4.6.30 and redeploy the Hub Lambda from tag v4.6.30 (52569fa5c01e); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
28278
+ v3Target: "v4.6.30 (@mutmutco/cli@4.6.30, tag commit 52569fa5c01e \u2014 last known-good release carrying the repo-index v4-only contract)"
28279
28279
  }
28280
28280
  },
28281
28281
  {
@@ -39363,8 +39363,9 @@ function blessedHubActionPins(constants = gate_budget_exports) {
39363
39363
  }
39364
39364
  return pins;
39365
39365
  }
39366
+ var PIN_COMMIT_FORMAT = "commit-format:runbook-unaffected";
39366
39367
  function pinTableDigest(pins) {
39367
- return (0, import_node_crypto11.createHash)("sha1").update([...pins].map(([a, s]) => `${a}@${s}`).sort().join("\n")).digest("hex");
39368
+ return (0, import_node_crypto11.createHash)("sha1").update([PIN_COMMIT_FORMAT, ...[...pins].map(([a, s]) => `${a}@${s}`).sort()].join("\n")).digest("hex");
39368
39369
  }
39369
39370
  var HUB_ACTION_USE = /^(\s*-?\s*uses:\s*['"]?mutmutco\/mmi-hub\/\.github\/actions\/)([\w.-]+)@([^\s'"#]+)([^\n]*)$/i;
39370
39371
  function staleHubActionPins(body, pins = blessedHubActionPins()) {
@@ -39484,7 +39485,9 @@ async function runPinTick(input) {
39484
39485
  if (!next.changes.length) continue;
39485
39486
  lines2.push(...next.changes.map((c) => `- \`${path2}:${c.line}\` ${c.action}: \`${c.from.slice(0, 12)}\` \u2192 \`${c.to.slice(0, 12)}\``));
39486
39487
  const tmp = (0, import_node_path29.join)((0, import_node_os17.tmpdir)(), `mmi-pin-propagate-${process.pid}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}.json`);
39487
- const put = { message: `ci: pin MMI-Hub actions in ${path2} to the blessed SHAs`, content: encodeGitHubContents(next.body), branch };
39488
+ const put = { message: `ci: pin MMI-Hub actions in ${path2} to the blessed SHAs
39489
+
39490
+ Runbook-Unaffected: SHA-only MMI-Hub action pin move; no workflow step changes`, content: encodeGitHubContents(next.body), branch };
39488
39491
  if (file.sha) put.sha = file.sha;
39489
39492
  (0, import_node_fs32.writeFileSync)(tmp, JSON.stringify(put), "utf8");
39490
39493
  try {
@@ -42451,9 +42454,19 @@ async function runPrLandOnce(prNumber, options, deps) {
42451
42454
  }
42452
42455
  }
42453
42456
  }
42454
- const checksWaitError = (checksWait) => {
42457
+ const isConflicting = (state) => state.mergeStateStatus === "DIRTY" || state.mergeable === "CONFLICTING";
42458
+ const conflictError = () => `pr land #${prNumber}: branch conflicts with base \u2014 merge origin/development into the branch (never rebase a pushed branch), rebuild any checked-in artifacts, then push before landing${hasQueue ? `; ${prQueueReadHint(prNumber, repo)}` : ""}`;
42459
+ const readPrState = async () => {
42460
+ const state = await deps.readPrState(prNumber, repo);
42461
+ if (!isConflicting(state)) return state;
42462
+ await (deps.sleep ?? ((ms) => new Promise((resolve8) => setTimeout(resolve8, ms))))(PR_HEAD_UPDATE_API_READ_DELAY_MS);
42463
+ return deps.readPrState(prNumber, repo);
42464
+ };
42465
+ let prState;
42466
+ const checksWaitError = async (checksWait) => {
42455
42467
  if (checksWait.status === "conflicting") {
42456
- return `checks-wait conflicting: ${checksWait.reason ?? "PR is conflicting with the base branch"}`;
42468
+ prState = await readPrState();
42469
+ return isConflicting(prState) ? conflictError() : void 0;
42457
42470
  }
42458
42471
  if (checksWait.status === "failure" || checksWait.status === "timeout" || checksWait.status === "rate-limited") {
42459
42472
  return `checks-wait ${checksWait.status}${checksWait.detail ? `: ${checksWait.detail}` : ""}`;
@@ -42461,11 +42474,11 @@ async function runPrLandOnce(prNumber, options, deps) {
42461
42474
  return void 0;
42462
42475
  };
42463
42476
  base.checksWait = await deps.waitForChecks(prNumber, repo);
42464
- const waitError = checksWaitError(base.checksWait);
42465
- if (waitError) return { ...base, error: hasQueue ? `${waitError} \u2014 ${prQueueReadHint(prNumber, repo)}` : waitError };
42477
+ const waitError = await checksWaitError(base.checksWait);
42478
+ if (waitError) return { ...base, error: hasQueue && base.checksWait.status !== "conflicting" ? `${waitError} \u2014 ${prQueueReadHint(prNumber, repo)}` : waitError };
42466
42479
  const driftAfterChecks = await headDrift("after checks");
42467
42480
  if (driftAfterChecks) return driftAfterChecks;
42468
- let prState = await deps.readPrState(prNumber, repo);
42481
+ prState = prState ?? await readPrState();
42469
42482
  if (!hasQueue && pinned && prState.mergeStateStatus === "BEHIND") {
42470
42483
  return {
42471
42484
  ...base,
@@ -42480,16 +42493,11 @@ async function runPrLandOnce(prNumber, options, deps) {
42480
42493
  return { ...base, error: `pr land #${prNumber}: ${e.message}` };
42481
42494
  }
42482
42495
  base.checksWait = await deps.waitForChecks(prNumber, repo);
42483
- const reWaitError = checksWaitError(base.checksWait);
42484
- if (reWaitError) return { ...base, error: hasQueue ? `${reWaitError} \u2014 ${prQueueReadHint(prNumber, repo)}` : reWaitError };
42485
- prState = await deps.readPrState(prNumber, repo);
42486
- }
42487
- if (prState.mergeStateStatus === "DIRTY" || prState.mergeable === "CONFLICTING") {
42488
- return {
42489
- ...base,
42490
- error: `pr land #${prNumber}: branch conflicts with base \u2014 rebase/merge development, rebuild any checked-in artifacts, then re-push before landing${hasQueue ? `; ${prQueueReadHint(prNumber, repo)}` : ""}`
42491
- };
42496
+ const reWaitError = await checksWaitError(base.checksWait);
42497
+ if (reWaitError) return { ...base, error: hasQueue && base.checksWait.status !== "conflicting" ? `${reWaitError} \u2014 ${prQueueReadHint(prNumber, repo)}` : reWaitError };
42498
+ prState = await readPrState();
42492
42499
  }
42500
+ if (isConflicting(prState)) return { ...base, error: conflictError() };
42493
42501
  if (hasQueue && !deps.enqueueQueue) throw new Error("queue-only enqueue adapter unavailable; no merge dispatched");
42494
42502
  const merge = await mergeAutoWithTransientRetry(prNumber, repo, hasQueue ? { ...deps, mergeAuto: (pr, target) => deps.enqueueQueue(pr, target, pinned) } : deps);
42495
42503
  base.mergeStatus = merge.mergeStatus;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/cli",
3
- "version": "4.6.29",
3
+ "version": "4.6.30",
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",