@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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mmi",
3
3
  "displayName": "MMI",
4
- "version": "4.5.112",
4
+ "version": "4.5.114",
5
5
  "mmiCompat": "4.x",
6
6
  "description": "MMI workflow skills and org gates delivery.",
7
7
  "author": {
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 = 3e3;
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 = 5e3;
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 = 2e3;
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 markerClient = withAppClaimMarkerRead(client, appClient);
13854
- let evidence = await gatherClaimLiveness(markerClient, item.repository, item.number, openPullsFetcher(client));
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(markerClient, item.repository, item.number, openPullsFetcher(client));
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: ${holder} still shows live evidence of active work (${why}); --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)`
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.112",
17696
- tag: "v4.5.112",
17697
- commit: "45f0c868cba4",
17698
- npm: "@mutmutco/cli@4.5.112"
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.112"
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.112 and redeploy the Hub Lambda from tag v4.5.112 (45f0c868cba4); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
17722
- v3Target: "v4.5.112 (@mutmutco/cli@4.5.112, tag commit 45f0c868cba4 \u2014 last known-good release carrying the repo-index v4-only contract)"
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 = 2e3;
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 = 2e3;
39132
- var PR_LAND_MERGE_RETRY_DELAY_MS = 3e3;
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 = 3e3;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/cli",
3
- "version": "4.5.112",
3
+ "version": "4.5.114",
4
4
  "description": "MMI Future CLI — the org dev toolbox and shared cross-IDE engine for every registry-declared MMI coding surface.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/claude-plugin",
3
- "version": "4.5.112",
3
+ "version": "4.5.114",
4
4
  "description": "MMI workflow skills and org gates delivery.",
5
5
  "author": {
6
6
  "name": "MMI Future",