@mutmutco/claude-plugin 4.6.33 → 4.6.34
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 +40 -28
- package/cli/package.json +1 -1
- package/package.json +1 -1
package/cli/dist/main.cjs
CHANGED
|
@@ -28366,10 +28366,10 @@ var rollout_plan_default = {
|
|
|
28366
28366
|
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)."
|
|
28367
28367
|
},
|
|
28368
28368
|
baseline: {
|
|
28369
|
-
version: "4.6.
|
|
28370
|
-
tag: "v4.6.
|
|
28371
|
-
commit: "
|
|
28372
|
-
npm: "@mutmutco/cli@4.6.
|
|
28369
|
+
version: "4.6.34",
|
|
28370
|
+
tag: "v4.6.34",
|
|
28371
|
+
commit: "a094b40adf8d",
|
|
28372
|
+
npm: "@mutmutco/cli@4.6.34"
|
|
28373
28373
|
},
|
|
28374
28374
|
exitCriterion: "fleet-n-of-n",
|
|
28375
28375
|
hubOnlyShortcut: "forbidden",
|
|
@@ -28386,14 +28386,14 @@ var rollout_plan_default = {
|
|
|
28386
28386
|
repo: "mutmutco/mmi-hub",
|
|
28387
28387
|
role: "canary",
|
|
28388
28388
|
schedule: "train",
|
|
28389
|
-
v3Target: "v4.6.
|
|
28389
|
+
v3Target: "v4.6.34"
|
|
28390
28390
|
}
|
|
28391
28391
|
],
|
|
28392
28392
|
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.",
|
|
28393
28393
|
rollback: {
|
|
28394
28394
|
independent: true,
|
|
28395
|
-
mechanism: "npm dist-tag latest -> 4.6.
|
|
28396
|
-
v3Target: "v4.6.
|
|
28395
|
+
mechanism: "npm dist-tag latest -> 4.6.34 and redeploy the Hub Lambda from tag v4.6.34 (a094b40adf8d); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
|
|
28396
|
+
v3Target: "v4.6.34 (@mutmutco/cli@4.6.34, tag commit a094b40adf8d \u2014 last known-good release carrying the repo-index v4-only contract)"
|
|
28397
28397
|
}
|
|
28398
28398
|
},
|
|
28399
28399
|
{
|
|
@@ -61128,9 +61128,10 @@ async function preparePrCreate(input, deps = createPreparationDeps(input)) {
|
|
|
61128
61128
|
const reads = await Promise.allSettled([
|
|
61129
61129
|
deps.claims(refs.candidate),
|
|
61130
61130
|
refs.candidate ? deps.docs(refs.candidate) : Promise.resolve(void 0),
|
|
61131
|
-
observePolicy(deps, refs.candidate)
|
|
61131
|
+
observePolicy(deps, refs.candidate),
|
|
61132
|
+
refs.candidate ? deps.queueWaiver?.(refs.candidate) : Promise.resolve(void 0)
|
|
61132
61133
|
]);
|
|
61133
|
-
const [claims, docs, policy] = reads;
|
|
61134
|
+
const [claims, docs, policy, waiver] = reads;
|
|
61134
61135
|
if (claims.status === "fulfilled") {
|
|
61135
61136
|
observations.push(...claims.value.findings.length ? claims.value.findings.map((detail) => ({ check: "claims", state: "failed", detail })) : [{ check: "claims", state: "passed", detail: "issue and claim evidence read" }]);
|
|
61136
61137
|
} else observations.push({ check: "claims", state: "unavailable", detail: `issue/claim evidence unavailable (${rejectionReason(claims.reason)}); retry the read` });
|
|
@@ -61138,6 +61139,8 @@ async function preparePrCreate(input, deps = createPreparationDeps(input)) {
|
|
|
61138
61139
|
else if (docs.value) observations.push({ check: "docs", state: docs.value.state, detail: [docs.value.detail, docs.value.fix].filter(Boolean).join(" \u2014 ") });
|
|
61139
61140
|
if (policy.status === "rejected") observations.push({ check: "policy", state: "unavailable", detail: `committed test-policy observation unavailable (${rejectionReason(policy.reason)}); check policy validity and fetch full candidate history before retrying` });
|
|
61140
61141
|
else if (policy.value) observations.push(policy.value);
|
|
61142
|
+
if (waiver.status === "rejected") observations.push({ check: "queue", state: "skipped", detail: `the queue squash waiver placement was not checked (${rejectionReason(waiver.reason)}); this is non-blocking` });
|
|
61143
|
+
else if (waiver.value) observations.push(waiver.value);
|
|
61141
61144
|
const findings = observations.filter((item) => item.state === "failed" || item.state === "unavailable");
|
|
61142
61145
|
let attempted = false;
|
|
61143
61146
|
return {
|
|
@@ -61238,6 +61241,34 @@ function createPreparationDeps(input, io = {}) {
|
|
|
61238
61241
|
return {
|
|
61239
61242
|
candidate: readCandidate,
|
|
61240
61243
|
publish: (proof) => publishPreparedPrHead(proof, exec3),
|
|
61244
|
+
// #9831/#9968: publication happens only in commit(), after this read-only preparation, so the queue's
|
|
61245
|
+
// buried-waiver refusal is decided here — with the queue's own reader and setting reads — before an
|
|
61246
|
+
// absent remote head is pushed and a PR opened. A range or setting it cannot read is a skip (#9968).
|
|
61247
|
+
queueWaiver: async (candidate) => {
|
|
61248
|
+
const result = (state, detail) => ({ check: "queue", state, detail });
|
|
61249
|
+
if (!candidate.root) return void 0;
|
|
61250
|
+
const range = await exec3("git", ["-C", candidate.root, "log", "--reverse", "--format=%B%x00", `${candidate.baseSha}..${candidate.headSha}`], { timeout: GIT_TIMEOUT_MS }).then((read) => ({ log: read.stdout }), (error) => ({ reason: rejectionReason(error) }));
|
|
61251
|
+
if (!("log" in range)) return result("skipped", `candidate commits ${candidate.baseSha}..${candidate.headSha} could not be read (${range.reason}), so the queue squash waiver placement was not checked; this is non-blocking`);
|
|
61252
|
+
const messages = range.log.split("\0").filter((message2) => message2.trim()).map((message2) => {
|
|
61253
|
+
const [headline, ...body] = message2.trim().split("\n");
|
|
61254
|
+
return { headline, body: body.join("\n") };
|
|
61255
|
+
});
|
|
61256
|
+
const refusal = checkQueueSquashOverride("Candidate PR", "0", messages, candidate.root);
|
|
61257
|
+
if (!refusal) return void 0;
|
|
61258
|
+
const [owner, name] = candidate.repo.split("/");
|
|
61259
|
+
const setting = await (async () => {
|
|
61260
|
+
const metadata = await client.graphql(
|
|
61261
|
+
"query($owner:String!,$name:String!,$base:String!) { repository(owner:$owner,name:$name) { squashMergeCommitMessage mergeQueue(branch:$base) { configuration { mergeMethod } } } }",
|
|
61262
|
+
{ owner, name, base: candidate.base }
|
|
61263
|
+
);
|
|
61264
|
+
const rules = await client.restPaginate(`repos/${candidate.repo}/rules/branches/${encodeURIComponent(candidate.base)}?per_page=100`);
|
|
61265
|
+
const methods = [...new Set(rules.filter((rule) => rule.type === "merge_queue").map((rule) => rule.parameters?.merge_method))];
|
|
61266
|
+
const method = methods.length === 1 ? methods[0] : !methods.length ? metadata.repository.mergeQueue?.configuration?.mergeMethod : void 0;
|
|
61267
|
+
return method === "SQUASH" && metadata.repository.squashMergeCommitMessage === "COMMIT_MESSAGES";
|
|
61268
|
+
})().then((squash) => squash, (error) => rejectionReason(error));
|
|
61269
|
+
if (typeof setting === "string") return result("skipped", `the repository's queue squash-message setting could not be read (${setting}), so the queue squash waiver placement was not checked; this is non-blocking`);
|
|
61270
|
+
return setting ? result("failed", `${refusal.error} \u2014 ${refusal.preparation.nextAction}`) : void 0;
|
|
61271
|
+
},
|
|
61241
61272
|
// #9946: the retry needs the exact candidate objects. Fetch each ref on its own so a fork-only head
|
|
61242
61273
|
// that origin cannot resolve never costs the base fetch too, and never surface a fetch failure as the
|
|
61243
61274
|
// reason the policy read stayed unreadable.
|
|
@@ -61258,25 +61289,6 @@ function createPreparationDeps(input, io = {}) {
|
|
|
61258
61289
|
if (!await docs.refResolves(candidate.root, candidate.headSha) || !await docs.refResolves(candidate.root, candidate.baseSha)) {
|
|
61259
61290
|
return result("skipped", "exact remote candidate objects are not available locally; committed test policy was not checked");
|
|
61260
61291
|
}
|
|
61261
|
-
const log = (await exec3("git", ["-C", candidate.root, "log", "--reverse", "--format=%B%x00", `${candidate.baseSha}..${candidate.headSha}`], { timeout: GIT_TIMEOUT_MS })).stdout;
|
|
61262
|
-
const messages = log.split("\0").filter((message2) => message2.trim()).map((message2) => {
|
|
61263
|
-
const [headline, ...body] = message2.trim().split("\n");
|
|
61264
|
-
return { headline, body: body.join("\n") };
|
|
61265
|
-
});
|
|
61266
|
-
const refusal = checkQueueSquashOverride("Candidate PR", "0", messages, candidate.root);
|
|
61267
|
-
if (refusal) {
|
|
61268
|
-
const [owner, name] = candidate.repo.split("/");
|
|
61269
|
-
const metadata = await client.graphql(
|
|
61270
|
-
"query($owner:String!,$name:String!,$base:String!) { repository(owner:$owner,name:$name) { squashMergeCommitMessage mergeQueue(branch:$base) { configuration { mergeMethod } } } }",
|
|
61271
|
-
{ owner, name, base: candidate.base }
|
|
61272
|
-
);
|
|
61273
|
-
const rules = await client.restPaginate(`repos/${candidate.repo}/rules/branches/${encodeURIComponent(candidate.base)}?per_page=100`);
|
|
61274
|
-
const methods = [...new Set(rules.filter((rule) => rule.type === "merge_queue").map((rule) => rule.parameters?.merge_method))];
|
|
61275
|
-
const method = methods.length === 1 ? methods[0] : !methods.length ? metadata.repository.mergeQueue?.configuration?.mergeMethod : void 0;
|
|
61276
|
-
if (method === "SQUASH" && metadata.repository.squashMergeCommitMessage === "COMMIT_MESSAGES") {
|
|
61277
|
-
return result("failed", `${refusal.error} \u2014 ${refusal.preparation.nextAction}`);
|
|
61278
|
-
}
|
|
61279
|
-
}
|
|
61280
61292
|
let policy;
|
|
61281
61293
|
try {
|
|
61282
61294
|
policy = runTestPolicy(candidate.root, { candidate: { head: candidate.headSha, base: candidate.baseSha } });
|
package/cli/package.json
CHANGED