@mutmutco/claude-plugin 4.5.113 → 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 +34 -13
- package/cli/package.json +1 -1
- package/package.json +1 -1
package/cli/dist/main.cjs
CHANGED
|
@@ -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
|
{
|
|
@@ -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