@mutmutco/cli 4.5.33 → 4.5.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.
Files changed (2) hide show
  1. package/dist/main.cjs +27 -12
  2. package/package.json +1 -1
package/dist/main.cjs CHANGED
@@ -5485,7 +5485,7 @@ function isSnapshotShape(body) {
5485
5485
  const staleValid = b?.stale === void 0 || typeof b.stale === "object" && b.stale !== null && Number.isFinite(b.stale.ageMs) && b.stale.ageMs >= 0;
5486
5486
  const githubValid = b?.github === void 0 || b.github.credential === "app_installation" && (rate === void 0 || Number.isFinite(rate?.limit) && Number.isFinite(rate?.remaining) && Number.isFinite(rate?.cost) && typeof rate?.resetAt === "string");
5487
5487
  return Boolean(
5488
- b && typeof b === "object" && typeof b.project?.id === "string" && typeof b.project?.title === "string" && typeof b.viewer === "string" && b.viewer.length > 0 && Array.isArray(b.nodes) && Array.isArray(b.writableRepos) && Array.isArray(b.unreadableRepos) && Array.isArray(b.pullRequests) && Array.isArray(b.warnings) && typeof b.partial === "boolean" && githubValid && staleValid
5488
+ b && typeof b === "object" && typeof b.project?.id === "string" && typeof b.project?.title === "string" && typeof b.viewer === "string" && b.viewer.length > 0 && Array.isArray(b.nodes) && Array.isArray(b.writableRepos) && Array.isArray(b.unreadableRepos) && Array.isArray(b.pullRequests) && Array.isArray(b.warnings) && typeof b.partial === "boolean" && (b.eventCursor === void 0 || Number.isInteger(b.eventCursor) && b.eventCursor >= 0) && githubValid && staleValid
5489
5489
  );
5490
5490
  }
5491
5491
  async function fetchHubBoardSnapshot(request, deps) {
@@ -12541,6 +12541,7 @@ async function readBoard(options, deps = {}) {
12541
12541
  const { collected, snapshot } = await collectBoardPreferringSnapshot(cfg, options, deps);
12542
12542
  let writable;
12543
12543
  let pullRequests;
12544
+ let eventCursor;
12544
12545
  let github;
12545
12546
  if (snapshot) {
12546
12547
  for (const unreadable of snapshot.unreadableRepos) {
@@ -12552,6 +12553,7 @@ async function readBoard(options, deps = {}) {
12552
12553
  unknown: new Set(snapshot.unreadableRepos.map((entry) => entry.repo.toLowerCase()))
12553
12554
  };
12554
12555
  pullRequests = snapshot.pullRequests;
12556
+ eventCursor = snapshot.eventCursor;
12555
12557
  github = snapshot.github && { ...snapshot.github, ...snapshot.quotaResetAt ? { quotaResetAt: snapshot.quotaResetAt } : {} };
12556
12558
  } else {
12557
12559
  const probed = await resolveWritableReposForClaimables(collected.items, client);
@@ -12569,6 +12571,7 @@ async function readBoard(options, deps = {}) {
12569
12571
  partial: collected.partial,
12570
12572
  source: "live",
12571
12573
  ...pullRequests ? { pullRequests } : {},
12574
+ ...eventCursor !== void 0 ? { eventCursor } : {},
12572
12575
  ...github ? { github } : {}
12573
12576
  };
12574
12577
  if (options.includeBundleDetails || options.includeAllBodies) {
@@ -16837,10 +16840,10 @@ var rollout_plan_default = {
16837
16840
  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)."
16838
16841
  },
16839
16842
  baseline: {
16840
- version: "4.5.33",
16841
- tag: "v4.5.33",
16842
- commit: "43f256b77935",
16843
- npm: "@mutmutco/cli@4.5.33"
16843
+ version: "4.5.34",
16844
+ tag: "v4.5.34",
16845
+ commit: "fe244fb48abc",
16846
+ npm: "@mutmutco/cli@4.5.34"
16844
16847
  },
16845
16848
  exitCriterion: "fleet-n-of-n",
16846
16849
  hubOnlyShortcut: "forbidden",
@@ -16857,14 +16860,14 @@ var rollout_plan_default = {
16857
16860
  repo: "mutmutco/mmi-hub",
16858
16861
  role: "canary",
16859
16862
  schedule: "train",
16860
- v3Target: "v4.5.33"
16863
+ v3Target: "v4.5.34"
16861
16864
  }
16862
16865
  ],
16863
16866
  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.",
16864
16867
  rollback: {
16865
16868
  independent: true,
16866
- mechanism: "npm dist-tag latest -> 4.5.33 and redeploy the Hub Lambda from tag v4.5.33 (43f256b77935); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
16867
- v3Target: "v4.5.33 (@mutmutco/cli@4.5.33, tag commit 43f256b77935 \u2014 last known-good release carrying the repo-index v4-only contract)"
16869
+ mechanism: "npm dist-tag latest -> 4.5.34 and redeploy the Hub Lambda from tag v4.5.34 (fe244fb48abc); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
16870
+ v3Target: "v4.5.34 (@mutmutco/cli@4.5.34, tag commit fe244fb48abc \u2014 last known-good release carrying the repo-index v4-only contract)"
16868
16871
  }
16869
16872
  },
16870
16873
  {
@@ -23544,7 +23547,8 @@ async function supersedeContentCausedDeployLeg(deps, cwd) {
23544
23547
  `release --supersede-deploy: origin reports ${prior.tag} at ${liveSha.slice(0, 12) || "no tag"} but the ledger anchors ${prior.tagSha.slice(0, 12)} \u2014 an absent or divergent release is NOT supersedeable (release --abort --apply is the unpublished candidate's own exit); nothing was written (#6553)`
23545
23548
  );
23546
23549
  }
23547
- const note = `superseded: content-caused deploy failure on the immutable promoted ${prior.tag} \u2014 the cause fix rides the next patch train (master-approved closure, #6553)`;
23550
+ const failed = prior.phases.deploy.state === "failed";
23551
+ const note = failed ? `superseded: content-caused deploy failure on the immutable promoted ${prior.tag} \u2014 the cause fix rides the next patch train (master-approved closure, #6553)` : `superseded: ${prior.tag} deploy outcome uncorrelatable from the release SHA (no failure recorded) \u2014 closed on the owner's evidence (master-approved closure, #6553, #7327)`;
23548
23552
  await fence(() => atomicWriteJson(path2, {
23549
23553
  ...prior,
23550
23554
  phases: {
@@ -23558,7 +23562,7 @@ async function supersedeContentCausedDeployLeg(deps, cwd) {
23558
23562
  repo: prior.repo,
23559
23563
  tag: prior.tag,
23560
23564
  tagSha: prior.tagSha,
23561
- note: `closed the ${prior.tag} deploy leg as superseded (skipped) \u2014 the ledger is phases-green; rerun the train doctor to confirm, then run the next patch train (hotfix or release) to carry the cause fix`
23565
+ note: failed ? `closed the ${prior.tag} deploy leg as superseded (skipped) \u2014 the ledger is phases-green; rerun the train doctor to confirm, then run the next patch train (hotfix or release) to carry the cause fix` : `closed the ${prior.tag} uncorrelatable deploy leg as superseded (skipped) \u2014 the ledger is phases-green; rerun the train doctor to confirm`
23562
23566
  };
23563
23567
  });
23564
23568
  }
@@ -25929,6 +25933,14 @@ Nothing was written. Inspect ${ledger.path} (or clear it only after proving the
25929
25933
  }
25930
25934
  if (persisted?.phases.deploy.superseded === true) phaseInputs.deploy = persisted.phases.deploy;
25931
25935
  if (persisted?.phases.publish.superseded === true) phaseInputs.publish = persisted.phases.publish;
25936
+ for (const leg of ["deploy", "publish"]) {
25937
+ const kept = persisted?.phases[leg];
25938
+ if (kept?.state === "complete" && kept.runId != null && phaseInputs[leg].state === "pending") phaseInputs[leg] = kept;
25939
+ }
25940
+ if (!companion && phaseInputs.deploy.state === "complete" && (phaseInputs.publish.state === "complete" || phaseInputs.publish.state === "skipped")) {
25941
+ dispatch2.deployStatus = "success";
25942
+ dispatch2.note = `historical ${deployModel} deploy/publish status: success (re-verified by the recorded run)`;
25943
+ }
25932
25944
  if (persisted) {
25933
25945
  if (persisted.phases.deploy.superseded !== true) {
25934
25946
  await recordPhase(ledger, deps, anchors, "deploy", phaseEntry(phaseInputs.deploy), { strict: true, landed: "the verified GitHub Release and origin/main at the immutable tag SHA" });
@@ -37585,8 +37597,11 @@ function readRepoVersion() {
37585
37597
  }
37586
37598
  function registerTrainCommands(program3, trainDeps) {
37587
37599
  const train = program3.command("train").description("release-train observability \u2014 track position, version lag, and the shared preflight-and-heal doctor (#2688, #6067)");
37588
- train.command("doctor").description("one shared preflight-and-heal verdict for the release, rcand and hotfix lanes; read-only unless --heal (#6067)").addOption(new Option("--lane <lane>", "train lane to check (defaults from the release track: direct \u2192 release)").choices([...TRAIN_LANES])).option("--dev", "judge the `release --dev` lane (development -> main, skipping rc): the lane starts from development and is read on development's workflows (#6318)").option("--heal", "repair safe local reconstructible state (scratch gitignore, churn, stray local tags, ff-only branch lag, finished scratch branches, stale alignment ledger leg); it never clears a ledger-pending, ledger-failed or branch-mismatch blocker (#6404, #6401, #6399) \u2014 those need `mmi-cli devops release --resume` (or, with fresh approval, `--abort --apply`) and `git checkout <start branch>`, so exit 1 after --heal is the gate working, not a failed heal").option("--repo <owner/repo>", "target repo (defaults to the current checkout)").option("--json", "machine-readable output").option("--out <path>", "write the verdict to this file as UTF-8 (no BOM) instead of stdout \u2014 the shell-free receipt path (#5802/#6563); pair with --json for a machine-readable file (e.g. `--json --out .jerv/tmp/train-doctor.json`); the file is written even when the verdict is NOT READY").addHelpText("after", "\nExit codes:\n 0 ready \u2014 no blocker and origin verified\n 1 a blocker remains, or origin could not be verified (never green on an unread origin)\n\nEvery finding carries code, severity (blocker|warning|healed|info), source (local|origin), remedy and a\ndocs/Guides/train-troubleshooting.md#<code> anchor. `release --apply` and `rcand --apply` run this at step 0 with --heal.\n").action(async (o) => {
37600
+ train.command("doctor").description("one shared preflight-and-heal verdict for the release, rcand and hotfix lanes; read-only unless --heal (#6067)").addOption(new Option("--lane <lane>", "train lane to check (defaults from the release track: direct \u2192 release)").choices([...TRAIN_LANES])).option("--dev", "judge the `release --dev` lane (development -> main, skipping rc): the lane starts from development and is read on development's workflows (#6318)").option("--heal", "repair safe local reconstructible state (scratch gitignore, churn, stray local tags, ff-only branch lag, finished scratch branches, stale alignment ledger leg); it never clears a ledger-pending, ledger-failed or branch-mismatch blocker (#6404, #6401, #6399) \u2014 those need `mmi-cli devops release --resume` (or, with fresh approval, `--abort --apply`) and `git checkout <start branch>`, so exit 1 after --heal is the gate working, not a failed heal").option("--repo <owner/repo>", "target repo (defaults to the current checkout)").option("--suite-solo", "judge an owner-approved solo release of one suite module, as `release --suite-solo --owner-go` does (requires --owner-go; never on rcand, #7327)").option("--owner-go", "explicit owner approval for the suite-solo lane (requires --suite-solo)").option("--json", "machine-readable output").option("--out <path>", "write the verdict to this file as UTF-8 (no BOM) instead of stdout \u2014 the shell-free receipt path (#5802/#6563); pair with --json for a machine-readable file (e.g. `--json --out .jerv/tmp/train-doctor.json`); the file is written even when the verdict is NOT READY").addHelpText("after", "\nExit codes:\n 0 ready \u2014 no blocker and origin verified\n 1 a blocker remains, or origin could not be verified (never green on an unread origin)\n\nEvery finding carries code, severity (blocker|warning|healed|info), source (local|origin), remedy and a\ndocs/Guides/train-troubleshooting.md#<code> anchor. `release --apply` and `rcand --apply` run this at step 0 with --heal.\n").action(async (o) => {
37589
37601
  try {
37602
+ if (o.suiteSolo !== o.ownerGo || o.lane === "rcand" && o.suiteSolo) {
37603
+ return failGraceful("train doctor: a suite-solo verdict needs BOTH --suite-solo --owner-go, and never on the rcand lane");
37604
+ }
37590
37605
  if (o.dev && o.lane && o.lane !== "release") {
37591
37606
  return failGraceful(`train doctor: --dev applies only to the release lane \u2014 it names the development -> main variant that skips rc, which the ${o.lane} lane does not have`);
37592
37607
  }
@@ -37607,7 +37622,7 @@ function registerTrainCommands(program3, trainDeps) {
37607
37622
  }
37608
37623
  }
37609
37624
  };
37610
- const verdict = await runTrainDoctor({ lane: o.lane, dev: o.dev === true, heal: o.heal === true, train: deps, repo: o.repo, cwd: root, argv: INVOKED_ARGV });
37625
+ const verdict = await runTrainDoctor({ lane: o.lane, dev: o.dev === true, heal: o.heal === true, train: deps, repo: o.repo, cwd: root, argv: INVOKED_ARGV, suiteSolo: o.suiteSolo === true });
37611
37626
  if (verdict.reexecCode !== void 0) return process.exit(verdict.reexecCode);
37612
37627
  const output = o.json ? JSON.stringify(verdict, null, 2) : formatTrainDoctor(verdict);
37613
37628
  if (!o.out) console.log(output);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/cli",
3
- "version": "4.5.33",
3
+ "version": "4.5.34",
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",