@mutmutco/claude-plugin 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/.claude-plugin/plugin.json +1 -1
- package/cli/dist/main.cjs +31 -23
- package/cli/package.json +1 -1
- package/package.json +1 -1
- package/skills/hotfix/suite.md +1 -1
- package/skills/rcand/suite.md +1 -1
package/cli/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/cli/package.json
CHANGED
package/package.json
CHANGED
package/skills/hotfix/suite.md
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
In the suite lead (MM-Work) a plain rcand, release or hotfix refuses: run `mmi-cli devops suite rcand --owner-go` or `mmi-cli devops suite release --owner-go` instead (a lead-only cut needs `--suite-solo --owner-go`). On your own, run only the read-only previews `mmi-cli devops suite rcand --dry-run` and `mmi-cli devops suite hotfix <member> --dry-run`; `suite release` and `suite abandon` have no dry-run, so never run them yourself. A real suite rcand, release, hotfix or abandon runs only on the owner's go, executed by the owner or the suite orchestrator. A suite member cannot run standalone rcand, release or hotfix: cut from the suite lead; only a backward-compatible solo backend release/hotfix with explicit owner approval may pass `--suite-solo --owner-go`, and its MM-Work development pin PR must land before the suite is in sync.
|
|
1
|
+
In the suite lead (MM-Work) a plain rcand, release or hotfix refuses: run `mmi-cli devops suite rcand --owner-go` or `mmi-cli devops suite release --owner-go` instead (a lead-only cut needs `--suite-solo --owner-go`). On your own, run only the read-only previews `mmi-cli devops suite rcand --dry-run` and `mmi-cli devops suite hotfix <member> --dry-run`; `suite release` and `suite abandon` have no dry-run, so never run them yourself. A real suite rcand, release, hotfix or abandon runs only on the owner's go, executed by the owner or the suite orchestrator. A suite member cannot run standalone rcand, release or hotfix: cut from the suite lead; only a backward-compatible solo backend release/hotfix with explicit owner approval may pass `--suite-solo --owner-go`, and its MM-Work development pin PR must land before the suite is in sync. A suite member never asks for, proposes or prompts an rc, release or hotfix — the suite orchestrator is the only voice that brings a cut to Jervaise, so a member session states what landed and stops instead of offering a cut.
|
|
2
2
|
|
package/skills/rcand/suite.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
In the suite lead (MM-Work) a plain rcand, release or hotfix refuses: the suite path is `mmi-cli devops suite rcand --owner-go` or `mmi-cli devops suite release --owner-go` (a lead-only cut needs `--suite-solo --owner-go`). `--owner-go` records Jervaise's explicit go for that one cut; it is never the agent's own flag. Never pass it on your own authority: a held train or a stale MM-Work cut (`suite abandon --owner-go`, then `suite rcand --owner-go`) is handed to the suite orchestrator with that exact command sequence, and runs only after the owner says go. On your own, run only the read-only previews `mmi-cli devops suite rcand --dry-run` and `mmi-cli devops suite hotfix <member> --dry-run`; `suite release` and `suite abandon` have no dry-run, so never run them yourself. A real suite rcand, release, hotfix or abandon runs only on the owner's go, executed by the owner or the suite orchestrator. A suite member cannot run standalone rcand, release or hotfix: cut from the suite lead; only a backward-compatible solo backend release/hotfix with explicit owner approval may pass `--suite-solo --owner-go`, and its MM-Work development pin PR must land before the suite is in sync.
|
|
1
|
+
In the suite lead (MM-Work) a plain rcand, release or hotfix refuses: the suite path is `mmi-cli devops suite rcand --owner-go` or `mmi-cli devops suite release --owner-go` (a lead-only cut needs `--suite-solo --owner-go`). `--owner-go` records Jervaise's explicit go for that one cut; it is never the agent's own flag. Never pass it on your own authority: a held train or a stale MM-Work cut (`suite abandon --owner-go`, then `suite rcand --owner-go`) is handed to the suite orchestrator with that exact command sequence, and runs only after the owner says go. On your own, run only the read-only previews `mmi-cli devops suite rcand --dry-run` and `mmi-cli devops suite hotfix <member> --dry-run`; `suite release` and `suite abandon` have no dry-run, so never run them yourself. A real suite rcand, release, hotfix or abandon runs only on the owner's go, executed by the owner or the suite orchestrator. A suite member cannot run standalone rcand, release or hotfix: cut from the suite lead; only a backward-compatible solo backend release/hotfix with explicit owner approval may pass `--suite-solo --owner-go`, and its MM-Work development pin PR must land before the suite is in sync. A suite member never asks for, proposes or prompts an rc, release or hotfix — the suite orchestrator is the only voice that brings a cut to Jervaise, so a member session states what landed and stops instead of offering a cut.
|
|
2
2
|
|
|
3
3
|
Support sessions (MMI-Hub, Jerv-Hub, Jerv-JervCode) are not suite members and hold standing owner authorization (2026-10-25) to cut and ship releases at their discretion during suite runs without repeated per-release approval, and under the owner's 2026-11-01 ruling each support session strives during a suite run to finish its own board and cut a patch release for landed-but-unreleased merges so suite members pick the update up in that run instead of waiting for a later cut, keeping all standard release preflight, gate, and verification checks.
|
|
4
4
|
|