@mutmutco/cli 3.121.0 → 3.123.0

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.
Files changed (2) hide show
  1. package/dist/main.cjs +26 -21
  2. package/package.json +1 -1
package/dist/main.cjs CHANGED
@@ -15851,10 +15851,10 @@ var rollout_plan_default = {
15851
15851
  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)."
15852
15852
  },
15853
15853
  baseline: {
15854
- version: "3.121.0",
15855
- tag: "v3.121.0",
15856
- commit: "3fc99b89d353",
15857
- npm: "@mutmutco/cli@3.121.0"
15854
+ version: "3.123.0",
15855
+ tag: "v3.123.0",
15856
+ commit: "825593f55f12",
15857
+ npm: "@mutmutco/cli@3.123.0"
15858
15858
  },
15859
15859
  exitCriterion: "fleet-n-of-n",
15860
15860
  hubOnlyShortcut: "forbidden",
@@ -15871,14 +15871,14 @@ var rollout_plan_default = {
15871
15871
  repo: "mutmutco/mmi-hub",
15872
15872
  role: "canary",
15873
15873
  schedule: "train",
15874
- v3Target: "v3.121.0"
15874
+ v3Target: "v3.123.0"
15875
15875
  }
15876
15876
  ],
15877
15877
  rollbackTrigger: "Any red inside the post-cut soak window: `devops train gate` FAIL attributable to the v4 doors, Hub endpoint health probe failure, a v3 client refused while the compat window must still admit it (SUPPORTED_MINOR_WINDOW=2, MIN_CLIENT_VERSION 0.0.0 \u2014 D6a), or npm consumer install/doctor failure on the v4 dist.",
15878
15878
  rollback: {
15879
15879
  independent: true,
15880
- mechanism: "npm dist-tag latest -> 3.121.0 and redeploy the Hub Lambda from tag v3.121.0 (3fc99b89d353); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
15881
- v3Target: "v3.121.0 (@mutmutco/cli@3.121.0, tag commit 3fc99b89d353 \u2014 the preserved latest-v3 distribution, D6b)"
15880
+ mechanism: "npm dist-tag latest -> 3.123.0 and redeploy the Hub Lambda from tag v3.123.0 (825593f55f12); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
15881
+ v3Target: "v3.123.0 (@mutmutco/cli@3.123.0, tag commit 825593f55f12 \u2014 the preserved latest-v3 distribution, D6b)"
15882
15882
  }
15883
15883
  },
15884
15884
  {
@@ -22837,13 +22837,9 @@ function partitionBoardItems(items, viewer, currentRepo, writableRepos) {
22837
22837
  sortBuckets(groups.secondary);
22838
22838
  return groups;
22839
22839
  }
22840
- function detailCandidates(report) {
22841
- return [
22842
- ...report.primary.userOwned,
22843
- ...report.primary.claimable,
22844
- ...report.secondary.userOwned,
22845
- ...report.secondary.claimable
22846
- ].filter((item) => item.contentType === "Issue");
22840
+ function detailCandidates(report, options = {}) {
22841
+ const scopes = [report.primary, report.secondary];
22842
+ return scopes.flatMap((scope) => options.all ? [...scope.userOwned, ...scope.claimable, ...scope.taken, ...scope.unownedInFlight] : [...scope.userOwned, ...scope.claimable]).filter((item) => item.contentType === "Issue");
22847
22843
  }
22848
22844
  function boardNotFoundError(ref, board, opts = {}) {
22849
22845
  const verb = opts.verb ?? "is not on";
@@ -23139,8 +23135,8 @@ async function readBoard(options, deps = {}) {
23139
23135
  freshness,
23140
23136
  ...sourceReason ? { sourceReason } : {}
23141
23137
  };
23142
- if (options.includeBundleDetails) {
23143
- await attachBundleDetails(report, client, options.allowPartial ?? false);
23138
+ if (options.includeBundleDetails || options.includeAllBodies) {
23139
+ await attachBundleDetails(report, client, options.allowPartial ?? false, { all: options.includeAllBodies });
23144
23140
  }
23145
23141
  for (const scope of ["primary", "secondary"]) {
23146
23142
  const filtered = await filterDependencyBlockedClaimables(report[scope].claimable, client, {
@@ -23767,8 +23763,8 @@ function nodeToItem(node, cfg) {
23767
23763
  function isSupportedContent(content) {
23768
23764
  return Boolean(content && (content.__typename === "Issue" || content.__typename === "PullRequest"));
23769
23765
  }
23770
- async function attachBundleDetails(report, client, allowPartial) {
23771
- const candidates = detailCandidates(report);
23766
+ async function attachBundleDetails(report, client, allowPartial, options = {}) {
23767
+ const candidates = detailCandidates(report, options);
23772
23768
  if (candidates.length === 0) return;
23773
23769
  let next = 0;
23774
23770
  const worker = async () => {
@@ -27643,6 +27639,8 @@ function evaluateCloudStatus(status, golden) {
27643
27639
  }
27644
27640
  async function runRepoIndexHealth(opts) {
27645
27641
  const findings = [];
27642
+ const searchAttempts = Math.max(1, opts.searchRetry?.attempts ?? 3);
27643
+ const sleep3 = opts.searchRetry?.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
27646
27644
  if (opts.live) {
27647
27645
  if (!opts.queriesOnly) {
27648
27646
  const st = await opts.live.status();
@@ -27653,13 +27651,19 @@ async function runRepoIndexHealth(opts) {
27653
27651
  }
27654
27652
  }
27655
27653
  for (const q of opts.golden.queries) {
27656
- const res = await opts.live.search(q.q, q.mode);
27654
+ let res = await opts.live.search(q.q, q.mode);
27655
+ let attempts = 1;
27656
+ while (!res.ok && attempts < searchAttempts) {
27657
+ await sleep3(500 * attempts);
27658
+ res = await opts.live.search(q.q, q.mode);
27659
+ attempts += 1;
27660
+ }
27657
27661
  if (!res.ok) {
27658
27662
  const semantic503 = q.mode === "semantic" && (res.status === 503 || /semantic unavailable|503/i.test(res.error));
27659
27663
  findings.push({
27660
27664
  ok: false,
27661
27665
  code: semantic503 ? "semantic-503" : "search-error",
27662
- detail: `${q.id}: ${res.error}`
27666
+ detail: `${q.id}: ${res.error}${attempts > 1 ? ` (no answer after ${attempts} attempts)` : ""}`
27663
27667
  });
27664
27668
  continue;
27665
27669
  }
@@ -32395,6 +32399,7 @@ function registerBoardCommands(program3) {
32395
32399
  config: await loadConfigForRepo(o.repo),
32396
32400
  repo: o.repo,
32397
32401
  includeBundleDetails: o.bundleDetails,
32402
+ includeAllBodies: o.bodies,
32398
32403
  allowPartial: o.allowPartial,
32399
32404
  live: o.live
32400
32405
  });
@@ -32407,7 +32412,7 @@ function registerBoardCommands(program3) {
32407
32412
  return alreadyClaimed ? `Check ${ref}: claimed and In Progress, no live contest - claim would renew the lease (nothing written)` : `Check ${ref}: free - claim would proceed (nothing written)`;
32408
32413
  }
32409
32414
  const board = program3.command("board").description("read, claim, show, and move Project v2 work items for the current repo");
32410
- board.command("read", { isDefault: true }).description("read the board and print user-owned, claimable, and taken items").option("--json", "machine-readable output").option("--repo <owner/repo>", "current repo (defaults to git origin)").option("--bundle-details", "fetch body/comments only for user-owned and claimable issues").option("--allow-partial", "return partial board results when later page/detail reads fail").option("--live", "bypass the projection and read the authoritative GitHub Project v2 board").addHelpText("after", "\nBy default, read uses the explicitly-stale Hub projection and prints its watermark. --live is authoritative.\n--allow-partial applies to the live paginated path and detail reads; the projection row itself is atomic.\n").action((o) => runBoardRead(o));
32415
+ board.command("read", { isDefault: true }).description("read the board and print user-owned, claimable, and taken items").option("--json", "machine-readable output").option("--repo <owner/repo>", "current repo (defaults to git origin)").option("--bundle-details", "fetch body/comments only for user-owned and claimable issues").option("--bodies", "fetch body/comments for EVERY scoped row, including taken and unowned in-flight ones \u2014 for consumers that scope by Status rather than ownership (#4861); implies --bundle-details and costs one extra read per row").option("--allow-partial", "return partial board results when later page/detail reads fail").option("--live", "bypass the projection and read the authoritative GitHub Project v2 board").addHelpText("after", "\nBy default, read uses the explicitly-stale Hub projection and prints its watermark. --live is authoritative.\n--allow-partial applies to the live paginated path and detail reads; the projection row itself is atomic.\n").action((o) => runBoardRead(o));
32411
32416
  withExamples(mutating(
32412
32417
  board.command("claim <issues...>").description("claim issues: assign them and move their Project v2 Status to In Progress \u2014 idempotent, so an item already yours and In Progress succeeds unchanged (one or more refs)").option("--json", "machine-readable output").option("--repo <owner/repo>", "current repo for local issue numbers (defaults to git origin)").option("--for <login>", "assign to this login instead of @me \u2014 agent claims on behalf of the master").option("--force", "take an item already claimed by another lane that shows live evidence of active work (#3727)").option("--check", "read-only: run every claim gate and report the verdict, writing nothing \u2014 exits 1 with the same refusal a real claim would raise (#4511)").option("--allow-partial", "return success JSON if assignment succeeds but the status move fails"),
32413
32418
  (_opts, args) => ({ command: "board claim", issues: args[0] ?? [] })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/cli",
3
- "version": "3.121.0",
3
+ "version": "3.123.0",
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",