@mutmutco/cli 4.1.5 → 4.1.6

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 +71 -9
  2. package/package.json +1 -1
package/dist/main.cjs CHANGED
@@ -13152,10 +13152,10 @@ var rollout_plan_default = {
13152
13152
  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)."
13153
13153
  },
13154
13154
  baseline: {
13155
- version: "4.1.5",
13156
- tag: "v4.1.5",
13157
- commit: "1cc8a83f5646",
13158
- npm: "@mutmutco/cli@4.1.5"
13155
+ version: "4.1.6",
13156
+ tag: "v4.1.6",
13157
+ commit: "45c61a1dd6f6",
13158
+ npm: "@mutmutco/cli@4.1.6"
13159
13159
  },
13160
13160
  exitCriterion: "fleet-n-of-n",
13161
13161
  hubOnlyShortcut: "forbidden",
@@ -13172,14 +13172,14 @@ var rollout_plan_default = {
13172
13172
  repo: "mutmutco/mmi-hub",
13173
13173
  role: "canary",
13174
13174
  schedule: "train",
13175
- v3Target: "v4.1.5"
13175
+ v3Target: "v4.1.6"
13176
13176
  }
13177
13177
  ],
13178
13178
  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.",
13179
13179
  rollback: {
13180
13180
  independent: true,
13181
- mechanism: "npm dist-tag latest -> 4.1.5 and redeploy the Hub Lambda from tag v4.1.5 (1cc8a83f5646); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
13182
- v3Target: "v4.1.5 (@mutmutco/cli@4.1.5, tag commit 1cc8a83f5646 \u2014 last known-good release carrying the repo-index v4-only contract)"
13181
+ mechanism: "npm dist-tag latest -> 4.1.6 and redeploy the Hub Lambda from tag v4.1.6 (45c61a1dd6f6); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
13182
+ v3Target: "v4.1.6 (@mutmutco/cli@4.1.6, tag commit 45c61a1dd6f6 \u2014 last known-good release carrying the repo-index v4-only contract)"
13183
13183
  }
13184
13184
  },
13185
13185
  {
@@ -26381,17 +26381,28 @@ async function gcRepoIndexCloud(deps) {
26381
26381
  { attempts: 1, timeoutMs, sleep: deps.retrySleep }
26382
26382
  );
26383
26383
  const body = await res.json().catch(() => ({}));
26384
- if (!res.ok) return { ok: false, error: body.error ?? `gc HTTP ${res.status}` };
26384
+ if (!res.ok) {
26385
+ const detail = typeof body.error === "string" ? body.error : `gc HTTP ${res.status}`;
26386
+ return { ok: false, error: detail };
26387
+ }
26388
+ if (body.ok === false) {
26389
+ return { ok: false, error: typeof body.error === "string" ? body.error : "repo-index gc failed" };
26390
+ }
26385
26391
  const removed = Array.isArray(body.removed) ? body.removed.filter((repo) => typeof repo === "string") : [];
26386
26392
  const kept = Number(body.kept);
26393
+ const pendingRepos = Array.isArray(body.pendingRepos) ? body.pendingRepos.filter((repo) => typeof repo === "string") : void 0;
26394
+ const repoErrors = body.repoErrors && typeof body.repoErrors === "object" && !Array.isArray(body.repoErrors) ? Object.fromEntries(Object.entries(body.repoErrors).filter((entry) => typeof entry[1] === "string")) : void 0;
26387
26395
  return {
26388
26396
  ok: true,
26397
+ ...body.partial === true ? { partial: true } : {},
26389
26398
  removed,
26390
26399
  kept: Number.isFinite(kept) ? kept : 0,
26391
26400
  v4: {
26392
26401
  dryRun: body.v4?.dryRun === true,
26393
26402
  repos: normalizeGcV4Repos(body.v4?.repos)
26394
- }
26403
+ },
26404
+ ...pendingRepos?.length ? { pendingRepos } : {},
26405
+ ...repoErrors && Object.keys(repoErrors).length ? { repoErrors } : {}
26395
26406
  };
26396
26407
  } catch (e) {
26397
26408
  const msg = e.message || String(e);
@@ -35423,6 +35434,7 @@ Next command: ${report.nextCommand}`);
35423
35434
  // src/explain-command.ts
35424
35435
  init_cli_shared();
35425
35436
  init_error_codes();
35437
+ init_house_map();
35426
35438
  var LOOP_PLAYBOOKS = {
35427
35439
  agent: {
35428
35440
  title: "Agent",
@@ -35613,7 +35625,50 @@ function explainCommandManifest(manifest, command, opts = {}) {
35613
35625
  }
35614
35626
  };
35615
35627
  }
35628
+ function houseEntryAsChild(entry, house) {
35629
+ return {
35630
+ name: entry.path.split(" ").pop() ?? entry.path,
35631
+ path: entry.canonical,
35632
+ flat_path: entry.path,
35633
+ house,
35634
+ canonical: entry.canonical,
35635
+ ...entry.description ? { description: entry.description } : {},
35636
+ arguments: [],
35637
+ options: [],
35638
+ subcommands: [],
35639
+ category: "core",
35640
+ discovery: "primary",
35641
+ help_group: "Plan and work",
35642
+ module_owner: "unclassified",
35643
+ consumer: "unclassified"
35644
+ };
35645
+ }
35646
+ function houseRootAsParent(manifest, house) {
35647
+ const subcommands = house.commands.map(
35648
+ (entry) => findCommandInManifest(manifest, entry.canonical) ?? houseEntryAsChild(entry, house.root)
35649
+ );
35650
+ return {
35651
+ name: house.root,
35652
+ path: house.root,
35653
+ flat_path: house.root,
35654
+ house: house.root,
35655
+ canonical: house.root,
35656
+ description: HOUSE_QUESTIONS[house.root],
35657
+ arguments: [],
35658
+ options: [],
35659
+ subcommands,
35660
+ category: "core",
35661
+ discovery: "primary",
35662
+ help_group: "Plan and work",
35663
+ module_owner: "unclassified",
35664
+ consumer: "unclassified"
35665
+ };
35666
+ }
35616
35667
  function findCommandInManifest(manifest, commandPath3) {
35668
+ if (isHouseRoot(commandPath3)) {
35669
+ const house = manifest.houses.find((entry) => entry.root === commandPath3);
35670
+ return house ? houseRootAsParent(manifest, house) : void 0;
35671
+ }
35617
35672
  const visit = (command) => {
35618
35673
  if (command.path === commandPath3 || command.flat_path === commandPath3) return command;
35619
35674
  for (const child2 of command.subcommands) {
@@ -40687,6 +40742,13 @@ repoIndex.command("gc").description("remove v4 cloud authority material for repo
40687
40742
  console.log(
40688
40743
  `repo-index: gc tombstoned ${res.removed.length} orphan authorit${res.removed.length === 1 ? "y" : "ies"}, removed ${artifactsRemoved} artifact(s); kept ${res.kept} authorit${res.kept === 1 ? "y" : "ies"}, ${artifactsKept} artifact(s)`
40689
40744
  );
40745
+ if (res.partial) {
40746
+ const pending = res.pendingRepos?.length ?? 0;
40747
+ const errors = res.repoErrors ? Object.keys(res.repoErrors).length : 0;
40748
+ console.warn(
40749
+ `repo-index: gc partial \u2014 ${pending} repo(s) pending${errors ? `, ${errors} repo error(s)` : ""}; retry gc until pendingRepos is empty`
40750
+ );
40751
+ }
40690
40752
  } catch (e) {
40691
40753
  return await failGraceful(e.message);
40692
40754
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/cli",
3
- "version": "4.1.5",
3
+ "version": "4.1.6",
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",