@mutmutco/claude-plugin 4.5.112 → 4.5.114
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 +41 -20
- package/cli/package.json +1 -1
- package/package.json +1 -1
package/cli/dist/main.cjs
CHANGED
|
@@ -5989,7 +5989,7 @@ function pollStateFromParsed(parsed) {
|
|
|
5989
5989
|
return parsed === "error" ? "failure" : parsed;
|
|
5990
5990
|
}
|
|
5991
5991
|
var PR_MERGEABLE_UNKNOWN_POLL_RETRIES = 4;
|
|
5992
|
-
var PR_MERGEABLE_UNKNOWN_POLL_MS =
|
|
5992
|
+
var PR_MERGEABLE_UNKNOWN_POLL_MS = 15e3;
|
|
5993
5993
|
async function resolveSettledMergeableState(pollMergeable, sleep2) {
|
|
5994
5994
|
for (let attempt = 1; attempt <= PR_MERGEABLE_UNKNOWN_POLL_RETRIES; attempt++) {
|
|
5995
5995
|
const state = await pollMergeable();
|
|
@@ -6047,7 +6047,7 @@ function pollIntervalMs(elapsedMs) {
|
|
|
6047
6047
|
}
|
|
6048
6048
|
var PR_CHECKS_TIMEOUT_MS = 30 * 6e4;
|
|
6049
6049
|
var PR_CHECKS_SUCCESS_CONFIRMATIONS = 2;
|
|
6050
|
-
var PR_CHECKS_CONFIRM_MS =
|
|
6050
|
+
var PR_CHECKS_CONFIRM_MS = 3e4;
|
|
6051
6051
|
var PR_CHECKS_FAILURE_CONFIRMATIONS = 2;
|
|
6052
6052
|
var PR_CHECKS_RATELIMIT_FLOOR = 1e3;
|
|
6053
6053
|
var PR_CHECKS_RATELIMIT_JITTER_MAX_MS = 5e3;
|
|
@@ -6564,7 +6564,7 @@ async function fetchRestRepoMergeSettings(repo, gh2 = defaultGhApi, ambientGh =
|
|
|
6564
6564
|
}
|
|
6565
6565
|
}
|
|
6566
6566
|
var PR_SNAPSHOT_READ_RETRIES = 3;
|
|
6567
|
-
var PR_SNAPSHOT_READ_DELAY_MS =
|
|
6567
|
+
var PR_SNAPSHOT_READ_DELAY_MS = 15e3;
|
|
6568
6568
|
async function readRestPrSnapshotWithRetry(prNumber, repo, gh2 = defaultGhApi, options) {
|
|
6569
6569
|
const retries = options?.retries ?? PR_SNAPSHOT_READ_RETRIES;
|
|
6570
6570
|
const untilMs = options?.retryTransientUntilMs;
|
|
@@ -6885,6 +6885,20 @@ async function fetchRestCorePool(gh2 = defaultGhApi, nowMs = Date.now()) {
|
|
|
6885
6885
|
}
|
|
6886
6886
|
|
|
6887
6887
|
// src/claim-marker-client.ts
|
|
6888
|
+
async function selectLivenessClient(client, appClient) {
|
|
6889
|
+
if (appClient) return appClient;
|
|
6890
|
+
let token;
|
|
6891
|
+
try {
|
|
6892
|
+
token = await pollToken();
|
|
6893
|
+
} catch (e) {
|
|
6894
|
+
const failing = async () => {
|
|
6895
|
+
throw e;
|
|
6896
|
+
};
|
|
6897
|
+
return { ...client, rest: failing, restPaginate: failing, graphql: failing };
|
|
6898
|
+
}
|
|
6899
|
+
if (!token) return client;
|
|
6900
|
+
return createGitHubClient({ token: async () => token });
|
|
6901
|
+
}
|
|
6888
6902
|
function withAppClaimMarkerRead(client, appClient) {
|
|
6889
6903
|
const commentsPath = /^repos\/[^/]+\/[^/]+\/issues\/\d+\/comments$/;
|
|
6890
6904
|
return {
|
|
@@ -13850,10 +13864,10 @@ function laneResumeEvidence(evidence) {
|
|
|
13850
13864
|
return `prior claim by lane ${describeClaimMarker(evidence.marker)} (@${evidence.markerBy}, ${formatClaimAge(evidence.markerAgeMs)} old) is verifiably not running on this host \u2014 its local session transcript is gone or stale${artifacts.length ? `; resuming over ${artifacts.join("; ")}` : ""}`;
|
|
13851
13865
|
}
|
|
13852
13866
|
async function checkLaneContest(client, item, actor = describeSessionIdentity(), viewerLogin, appClient) {
|
|
13853
|
-
const
|
|
13854
|
-
let evidence = await gatherClaimLiveness(
|
|
13867
|
+
const livenessClient = await selectLivenessClient(client, appClient);
|
|
13868
|
+
let evidence = await gatherClaimLiveness(livenessClient, item.repository, item.number, openPullsFetcher(livenessClient));
|
|
13855
13869
|
if (evidence.failed.some((channel) => channel !== "session")) {
|
|
13856
|
-
evidence = await gatherClaimLiveness(
|
|
13870
|
+
evidence = await gatherClaimLiveness(livenessClient, item.repository, item.number, openPullsFetcher(livenessClient));
|
|
13857
13871
|
}
|
|
13858
13872
|
const ownership = laneOwnership(evidence.marker, actor);
|
|
13859
13873
|
const sameOwner = Boolean(viewerLogin && evidence.markerBy && evidence.markerBy.toLowerCase() === viewerLogin.toLowerCase());
|
|
@@ -13874,13 +13888,19 @@ async function checkLaneContest(client, item, actor = describeSessionIdentity(),
|
|
|
13874
13888
|
};
|
|
13875
13889
|
}
|
|
13876
13890
|
function laneContestParts(contest) {
|
|
13877
|
-
const holder = contest.marker ? `lane ${describeClaimMarker(contest.marker)}` : contest.unverifiable.includes("comments") ? "an unreadable lane (its claim-marker comments could not be read, so no holder can be named)" : "another lane";
|
|
13891
|
+
const holder = contest.marker ? `lane ${describeClaimMarker(contest.marker)}` : contest.unverifiable.includes("comments") ? "an unreadable lane (its claim-marker comments could not be read, so no holder can be named)" : contest.live.length === 0 && contest.unverifiable.length > 0 ? "an unknown holder (no claim marker was read and liveness could not be fully verified, so no holder can be named)" : "another lane";
|
|
13878
13892
|
const seen = contest.live.join("; ");
|
|
13879
13893
|
const unreadable = contest.unverifiable.length ? `liveness could not be fully verified (failed to read: ${contest.unverifiable.join(", ")})` : "";
|
|
13880
13894
|
return { holder, why: [seen, unreadable].filter(Boolean).join("; ") };
|
|
13881
13895
|
}
|
|
13896
|
+
function isUnknownHold(contest) {
|
|
13897
|
+
return !contest.marker && contest.live.length === 0 && contest.unverifiable.length > 0;
|
|
13898
|
+
}
|
|
13882
13899
|
function laneContestMessage(ref, contest, verb) {
|
|
13883
13900
|
const { holder, why } = laneContestParts(contest);
|
|
13901
|
+
if (isUnknownHold(contest)) {
|
|
13902
|
+
return verb === "claim" ? `${ref} cannot be verified as free: ${holder} (${why}); the liveness reads failed so the claim is refused fail-closed \u2014 re-run with --force to take it anyway` : `refusing to unclaim ${ref}: ${holder} (${why}); the liveness reads failed so the unclaim is refused fail-closed \u2014 re-run with --force --holder-dead once you have evidence the holder lane is dead, or wait for it to go stale (#6625)`;
|
|
13903
|
+
}
|
|
13884
13904
|
return verb === "claim" ? `${ref} is already claimed by ${holder} with live evidence of active work (${why}); re-run with --force to take it anyway` : `refusing to unclaim ${ref}: ${holder} shows live evidence of active work (${why}); re-run with --force --holder-dead once you have evidence the holder lane is dead, or wait for it to go stale (#6625)`;
|
|
13885
13905
|
}
|
|
13886
13906
|
function ghError(e) {
|
|
@@ -14547,8 +14567,9 @@ async function unclaimBoardIssue(options, deps = {}) {
|
|
|
14547
14567
|
}
|
|
14548
14568
|
if (!options.holderDead) {
|
|
14549
14569
|
const { holder, why } = laneContestParts(contest);
|
|
14570
|
+
const still = isUnknownHold(contest) ? `${holder} (${why}); the liveness reads failed` : `${holder} still shows live evidence of active work (${why})`;
|
|
14550
14571
|
throw new Error(withGatedWriteChainHint(
|
|
14551
|
-
`refusing to unclaim ${item.ref} with --force: ${
|
|
14572
|
+
`refusing to unclaim ${item.ref} with --force: ${still}; --force no longer overrides a live lane alone \u2014 re-run with --holder-dead once you have evidence the holder's session is dead, or wait for its lane to go stale (#6625)`
|
|
14552
14573
|
));
|
|
14553
14574
|
}
|
|
14554
14575
|
}
|
|
@@ -17692,10 +17713,10 @@ var rollout_plan_default = {
|
|
|
17692
17713
|
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)."
|
|
17693
17714
|
},
|
|
17694
17715
|
baseline: {
|
|
17695
|
-
version: "4.5.
|
|
17696
|
-
tag: "v4.5.
|
|
17697
|
-
commit: "
|
|
17698
|
-
npm: "@mutmutco/cli@4.5.
|
|
17716
|
+
version: "4.5.114",
|
|
17717
|
+
tag: "v4.5.114",
|
|
17718
|
+
commit: "d262796d0d3f",
|
|
17719
|
+
npm: "@mutmutco/cli@4.5.114"
|
|
17699
17720
|
},
|
|
17700
17721
|
exitCriterion: "fleet-n-of-n",
|
|
17701
17722
|
hubOnlyShortcut: "forbidden",
|
|
@@ -17712,14 +17733,14 @@ var rollout_plan_default = {
|
|
|
17712
17733
|
repo: "mutmutco/mmi-hub",
|
|
17713
17734
|
role: "canary",
|
|
17714
17735
|
schedule: "train",
|
|
17715
|
-
v3Target: "v4.5.
|
|
17736
|
+
v3Target: "v4.5.114"
|
|
17716
17737
|
}
|
|
17717
17738
|
],
|
|
17718
17739
|
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.",
|
|
17719
17740
|
rollback: {
|
|
17720
17741
|
independent: true,
|
|
17721
|
-
mechanism: "npm dist-tag latest -> 4.5.
|
|
17722
|
-
v3Target: "v4.5.
|
|
17742
|
+
mechanism: "npm dist-tag latest -> 4.5.114 and redeploy the Hub Lambda from tag v4.5.114 (d262796d0d3f); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
|
|
17743
|
+
v3Target: "v4.5.114 (@mutmutco/cli@4.5.114, tag commit d262796d0d3f \u2014 last known-good release carrying the repo-index v4-only contract)"
|
|
17723
17744
|
}
|
|
17724
17745
|
},
|
|
17725
17746
|
{
|
|
@@ -39091,7 +39112,7 @@ function protectedPrHeadRemedy(head, base) {
|
|
|
39091
39112
|
return `PR head \`${head}\` is a train branch \u2014 updating it from \`${base}\` would merge \`${base}\` into \`${head}\`, promoting every unreleased commit. Never do that and never hand-merge on \`${head}\`. This is the pre-#6288 alignment shape: close this PR and let the train rebuild the alignment on a \`${base}\`-based branch that merges \`${head}\` into it (\`mmi-cli devops release --resume\`), then land THAT with a true merge \u2014 https://github.com/mutmutco/MMI-Hub/blob/development/docs/Guides/train-troubleshooting.md#head-behind-base`;
|
|
39092
39113
|
}
|
|
39093
39114
|
var PR_HEAD_UPDATE_API_READ_RETRIES = 5;
|
|
39094
|
-
var PR_HEAD_UPDATE_API_READ_DELAY_MS =
|
|
39115
|
+
var PR_HEAD_UPDATE_API_READ_DELAY_MS = 15e3;
|
|
39095
39116
|
async function updatePrHeadFromBase(input) {
|
|
39096
39117
|
const remedy = prHeadUpdateRemedy(input.head, input.base);
|
|
39097
39118
|
if (isProtectedPrHead(input.head)) throw new Error(protectedPrHeadRemedy(input.head, input.base));
|
|
@@ -39128,8 +39149,8 @@ async function updatePrHeadFromBase(input) {
|
|
|
39128
39149
|
var PR_LAND_POLL_MS = 6e4;
|
|
39129
39150
|
var PR_LAND_ENQUEUE_TIMEOUT_MS = 10 * 6e4;
|
|
39130
39151
|
var PR_LAND_STATE_READ_RETRIES = 3;
|
|
39131
|
-
var PR_LAND_STATE_READ_DELAY_MS =
|
|
39132
|
-
var PR_LAND_MERGE_RETRY_DELAY_MS =
|
|
39152
|
+
var PR_LAND_STATE_READ_DELAY_MS = 15e3;
|
|
39153
|
+
var PR_LAND_MERGE_RETRY_DELAY_MS = 3e4;
|
|
39133
39154
|
async function mergeAutoWithTransientRetry(prNumber, repo, deps) {
|
|
39134
39155
|
const first = await deps.mergeAuto(prNumber, repo);
|
|
39135
39156
|
if (first.mergeStatus !== "failed") return first;
|
|
@@ -39142,7 +39163,7 @@ async function mergeAutoWithTransientRetry(prNumber, repo, deps) {
|
|
|
39142
39163
|
return { mergeStatus: "failed", error: `merge retry after transient failure also failed: ${retried.error ?? first.error ?? "unknown error"}` };
|
|
39143
39164
|
}
|
|
39144
39165
|
var AUTO_MERGE_CONFIRM_RETRIES = 3;
|
|
39145
|
-
var AUTO_MERGE_CONFIRM_DELAY_MS =
|
|
39166
|
+
var AUTO_MERGE_CONFIRM_DELAY_MS = 15e3;
|
|
39146
39167
|
async function confirmAutoMergeEnqueued(deps, options) {
|
|
39147
39168
|
const retries = options?.retries ?? AUTO_MERGE_CONFIRM_RETRIES;
|
|
39148
39169
|
const delayMs = options?.delayMs ?? AUTO_MERGE_CONFIRM_DELAY_MS;
|
|
@@ -43080,7 +43101,7 @@ async function prCreateClaimRefusal(body, repoOption, deps = {}) {
|
|
|
43080
43101
|
}
|
|
43081
43102
|
}
|
|
43082
43103
|
if (state?.toLowerCase() === "closed") continue;
|
|
43083
|
-
const contest = await checkContest(client, { repository: repo, number }, actor, viewerLogin);
|
|
43104
|
+
const contest = await checkContest(client, { repository: repo, number }, actor, viewerLogin, deps.appClient);
|
|
43084
43105
|
if (!contest.contested) continue;
|
|
43085
43106
|
const ref = `${repo}#${number}`;
|
|
43086
43107
|
const commentsPath = `repos/${repo}/issues/${number}/comments`;
|
package/cli/package.json
CHANGED