@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.
- package/dist/main.cjs +31 -23
- 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.
|
|
28252
|
-
tag: "v4.6.
|
|
28253
|
-
commit: "
|
|
28254
|
-
npm: "@mutmutco/cli@4.6.
|
|
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.
|
|
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.
|
|
28278
|
-
v3Target: "v4.6.
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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