@mutmutco/cli 4.3.62 → 4.3.64

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 +95 -16
  2. package/package.json +1 -1
package/dist/main.cjs CHANGED
@@ -13772,7 +13772,7 @@ function walk(dir, root, out) {
13772
13772
  return out;
13773
13773
  }
13774
13774
  function defaultListDocs(root) {
13775
- const docs = ["docs", "skills/org-guide", "skills/mmi-help"].flatMap((path2) => {
13775
+ const docs = ["docs", "skills/org-guide", "skills/mmi-help", "skills/brand"].flatMap((path2) => {
13776
13776
  const directory = (0, import_node_path12.join)(root, path2);
13777
13777
  return (0, import_node_fs14.existsSync)(directory) ? walk(directory, root, []) : [];
13778
13778
  }).filter(
@@ -15801,10 +15801,10 @@ var rollout_plan_default = {
15801
15801
  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)."
15802
15802
  },
15803
15803
  baseline: {
15804
- version: "4.3.62",
15805
- tag: "v4.3.62",
15806
- commit: "d664b30d09d7",
15807
- npm: "@mutmutco/cli@4.3.62"
15804
+ version: "4.3.64",
15805
+ tag: "v4.3.64",
15806
+ commit: "91fe5c009629",
15807
+ npm: "@mutmutco/cli@4.3.64"
15808
15808
  },
15809
15809
  exitCriterion: "fleet-n-of-n",
15810
15810
  hubOnlyShortcut: "forbidden",
@@ -15821,14 +15821,14 @@ var rollout_plan_default = {
15821
15821
  repo: "mutmutco/mmi-hub",
15822
15822
  role: "canary",
15823
15823
  schedule: "train",
15824
- v3Target: "v4.3.62"
15824
+ v3Target: "v4.3.64"
15825
15825
  }
15826
15826
  ],
15827
15827
  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.",
15828
15828
  rollback: {
15829
15829
  independent: true,
15830
- mechanism: "npm dist-tag latest -> 4.3.62 and redeploy the Hub Lambda from tag v4.3.62 (d664b30d09d7); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
15831
- v3Target: "v4.3.62 (@mutmutco/cli@4.3.62, tag commit d664b30d09d7 \u2014 last known-good release carrying the repo-index v4-only contract)"
15830
+ mechanism: "npm dist-tag latest -> 4.3.64 and redeploy the Hub Lambda from tag v4.3.64 (91fe5c009629); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
15831
+ v3Target: "v4.3.64 (@mutmutco/cli@4.3.64, tag commit 91fe5c009629 \u2014 last known-good release carrying the repo-index v4-only contract)"
15832
15832
  }
15833
15833
  },
15834
15834
  {
@@ -19606,12 +19606,21 @@ function readHermesPluginEvidence(env = process.env) {
19606
19606
  skills = (0, import_node_fs19.existsSync)((0, import_node_path17.join)(root, "skills")) && (0, import_node_fs19.statSync)((0, import_node_path17.join)(root, "skills")).isDirectory();
19607
19607
  } catch {
19608
19608
  }
19609
+ let provisioned = false;
19610
+ const provisionedRoot = (0, import_node_path17.join)(host, "skills", "mmi");
19611
+ try {
19612
+ provisioned = (0, import_node_fs19.existsSync)(provisionedRoot) && (0, import_node_fs19.statSync)(provisionedRoot).isDirectory();
19613
+ } catch {
19614
+ }
19615
+ const treeOk = (0, import_node_fs19.existsSync)((0, import_node_path17.join)(root, "__init__.py")) && skills && manifest === "valid";
19616
+ const receipt = treeOk && !provisioned ? `hermes-skills-unprovisioned:${provisionedRoot}` : void 0;
19609
19617
  return {
19610
19618
  hostPresent: (0, import_node_fs19.existsSync)(host),
19611
19619
  installRecordPresent,
19612
19620
  manifest,
19613
- payloadPresent: (0, import_node_fs19.existsSync)((0, import_node_path17.join)(root, "__init__.py")) && skills && manifest === "valid",
19614
- ...installedVersion ? { installedVersion } : {}
19621
+ payloadPresent: treeOk && provisioned,
19622
+ ...installedVersion ? { installedVersion } : {},
19623
+ ...receipt ? { receipt } : {}
19615
19624
  };
19616
19625
  }
19617
19626
  function installedSurfacePluginVersion(surface) {
@@ -21505,9 +21514,45 @@ async function supersedeContentCausedPublishLeg(deps, cwd) {
21505
21514
  throw new Error(`release --supersede-publish: could not prove ${prior.tag} live on origin (${e instanceof Error ? e.message : String(e)}) \u2014 refusing to close the leg on an unproven state; retry when origin answers (#6638)`);
21506
21515
  }
21507
21516
  if (liveSha.toLowerCase() !== prior.tagSha.toLowerCase()) {
21508
- throw new Error(
21509
- `release --supersede-publish: 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 (#6638)`
21510
- );
21517
+ if (liveSha) {
21518
+ throw new Error(
21519
+ `release --supersede-publish: origin reports ${prior.tag} at ${liveSha.slice(0, 12)} but the ledger anchors ${prior.tagSha.slice(0, 12)} \u2014 a divergent release is NOT supersedeable; nothing was written (#6638)`
21520
+ );
21521
+ }
21522
+ let repository;
21523
+ try {
21524
+ repository = JSON.parse(await deps.run("gh", ["repo", "view", prior.repo, "--json", "nameWithOwner"]));
21525
+ } catch (e) {
21526
+ throw new Error(`release --supersede-publish: could not prove repository access for ${prior.repo} (${e instanceof Error ? e.message.split("\n")[0] : String(e)}) \u2014 a Release 404 is untrusted without that proof; nothing was written (#6638)`);
21527
+ }
21528
+ if (repository.nameWithOwner !== prior.repo) {
21529
+ throw new Error(`release --supersede-publish: repository access proof named ${String(repository.nameWithOwner || "(missing)")}, not ${prior.repo} \u2014 nothing was written (#6638)`);
21530
+ }
21531
+ let releaseAbsent = false;
21532
+ try {
21533
+ await deps.run("gh", ["release", "view", prior.tag, "--repo", prior.repo, "--json", "tagName"]);
21534
+ } catch (e) {
21535
+ const detail = `${e instanceof Error ? e.message : String(e)} ${String(e.stderr ?? "")}`;
21536
+ releaseAbsent = /release not found|HTTP 404|\(404\)/i.test(detail);
21537
+ if (!releaseAbsent) {
21538
+ throw new Error(`release --supersede-publish: could not prove the GitHub Release for ${prior.tag} absent (${detail.split("\n")[0]}) \u2014 refusing to close on an unproven state; nothing was written (#6638)`);
21539
+ }
21540
+ }
21541
+ if (!releaseAbsent) {
21542
+ throw new Error(`release --supersede-publish: origin no longer has ${prior.tag} but its GitHub Release still exists \u2014 resolve the mixed external state before closing the ledger; nothing was written (#6638)`);
21543
+ }
21544
+ const archivePath = (0, import_node_path21.join)((0, import_node_path21.dirname)(path2), `phases.archive-${prior.tag}.json`);
21545
+ if ((0, import_node_fs21.existsSync)(archivePath)) {
21546
+ throw new Error(`release --supersede-publish: archive already exists at ${archivePath} \u2014 preserving both ledger records; resolve the collision by hand; nothing was written (#6638)`);
21547
+ }
21548
+ (0, import_node_fs21.renameSync)(path2, archivePath);
21549
+ return {
21550
+ command: "release-supersede-publish",
21551
+ repo: prior.repo,
21552
+ tag: prior.tag,
21553
+ tagSha: prior.tagSha,
21554
+ note: `closed the deleted ${prior.tag} publish failure by archiving its ledger after origin and GitHub both proved absent; start a fresh release train to carry the cause fix`
21555
+ };
21511
21556
  }
21512
21557
  const note = `superseded: content-caused publish failure on the immutable promoted ${prior.tag} \u2014 the cause fix rides the next patch train (master-approved closure, #6638)`;
21513
21558
  atomicWriteJson(path2, {
@@ -31877,7 +31922,7 @@ var surfaces_default = {
31877
31922
  },
31878
31923
  enforcementCeilings: [
31879
31924
  "MMI ships no Hermes hooks (#5908): the plugin contributes skills and the /mmi command only; enforcement is host-side.",
31880
- "Hermes user plugins are opt-in through plugins.enabled; operator consent and host process isolation remain Hermes-owned.",
31925
+ "Hermes user plugins are opt-in through plugins.enabled (#6656): after a verified converge MMI-Hub enables its OWN mmi key through Hermes' own `hermes plugins enable mmi --no-allow-tool-override` command, and never reads, reorders, or writes another operator entry. Built-in tool override is explicitly declined, since MMI ships no Hermes hooks. Host process isolation remains Hermes-owned.",
31881
31926
  "npm is MMI transport only: MMI-Hub extracts @mutmutco/hermes-plugin into $HERMES_HOME/plugins/mmi and provisions the canonical skills into $HERMES_HOME/skills/mmi/; a fresh Hermes Agent process is required for discovery."
31882
31927
  ]
31883
31928
  }
@@ -42726,6 +42771,13 @@ function summaryFileLines(content, neutralize = true) {
42726
42771
  return escapeMrkdwn(neutralize ? neutralizeHubProductBrands(bare) : bare);
42727
42772
  }).filter(Boolean).map((l) => `\u2022 ${l}`);
42728
42773
  }
42774
+ function announceSummaryFidelity(lines2, rangeLog) {
42775
+ const shipped = new Set(rangeLog.match(/#\d+/g) ?? []);
42776
+ if (shipped.size === 0) return null;
42777
+ const invented = [...new Set(lines2.flatMap((l) => l.match(/#\d+/g) ?? []))].filter((ref) => !shipped.has(ref));
42778
+ if (invented.length === 0) return null;
42779
+ return `--announce-summary-file cites ${invented.join(", ")}, which ship in no commit of this release range \u2014 a summary line must describe work that actually shipped. Rebuild the summary from \`git log origin/main..HEAD\` (read commit BODIES too: a bundled PR closes issues its subject never names), then rerun the same release command \u2014 see docs/Guides/train-troubleshooting.md#announce-summary-missing`;
42780
+ }
42729
42781
  async function resolveAnnounceTarget(deps, repo) {
42730
42782
  if (repo.toLowerCase() === ANNOUNCE_REPO.toLowerCase()) return { kind: "alerts" };
42731
42783
  const target = deps.fetchReleaseTarget ? await deps.fetchReleaseTarget(slugOf(repo)) : { channel: null, language: "en" };
@@ -43449,6 +43501,14 @@ async function runHotfixRelease(deps, versionInput, options = {}, doctor = runTr
43449
43501
  if (lines2.length < 3 || lines2.length > 6) {
43450
43502
  throw new Error(`--announce-summary-file must contain 3-6 non-empty LLM-curated lines (found ${lines2.length}) \u2014 see docs/Guides/train-troubleshooting.md#announce-summary-missing`);
43451
43503
  }
43504
+ let rangeLog;
43505
+ try {
43506
+ rangeLog = await deps.run("git", ["log", "--format=%B", "origin/main..HEAD"]);
43507
+ } catch (e) {
43508
+ throw new Error(`could not read the hotfix commit range (git log origin/main..HEAD: ${e.message}) \u2014 the --announce-summary-file lines cannot be checked against what actually ships; fix the checkout, then rerun`);
43509
+ }
43510
+ const invented = announceSummaryFidelity(lines2, rangeLog);
43511
+ if (invented) throw new Error(invented);
43452
43512
  }
43453
43513
  const anchors = { repo: ctx.repo, tag, tagSha: mergedSha };
43454
43514
  const start = await startReleaseLedger(ledger, anchors, { lane: "hotfix" });
@@ -44173,7 +44233,25 @@ async function announceSummaryRefusal(path2) {
44173
44233
  if (lines2.length < 3 || lines2.length > 6) {
44174
44234
  return `release: --announce-summary-file must contain 3-6 non-empty LLM-curated lines (found ${lines2.length}) \u2014 see docs/Guides/train-troubleshooting.md#announce-summary-missing`;
44175
44235
  }
44176
- return null;
44236
+ try {
44237
+ await execFileP("git", ["fetch", "origin"], { timeout: GIT_TIMEOUT_MS });
44238
+ } catch (e) {
44239
+ return `release: could not fetch origin to check the --announce-summary-file lines (git fetch origin: ${e.message}) \u2014 the lines cannot be checked against what actually ships; fix the checkout, then rerun the same release command`;
44240
+ }
44241
+ const revs = ["HEAD"];
44242
+ try {
44243
+ const upstream = await execFileP("git", ["rev-parse", "--verify", "--quiet", "@{upstream}"], { timeout: GIT_TIMEOUT_MS });
44244
+ if (upstream.stdout.trim()) revs.push("@{upstream}");
44245
+ } catch {
44246
+ }
44247
+ let rangeLog;
44248
+ try {
44249
+ rangeLog = (await execFileP("git", ["log", "--format=%B", ...revs, "--not", "origin/main"], { timeout: GIT_TIMEOUT_MS })).stdout;
44250
+ } catch (e) {
44251
+ return `release: could not read the release commit range (git log ${revs.join(" ")} --not origin/main: ${e.message}) \u2014 the --announce-summary-file lines cannot be checked against what actually ships; fix the checkout, then rerun`;
44252
+ }
44253
+ const invented = announceSummaryFidelity(lines2, rangeLog);
44254
+ return invented ? `release: ${invented}` : null;
44177
44255
  }
44178
44256
  function trainApplyDeps() {
44179
44257
  return {
@@ -44999,7 +45077,8 @@ function mmiDoctorDeps(opts = {}) {
44999
45077
  manifest: hermes?.manifest ?? (installedVersion ? "valid" : snapshot.installRecordPresent ? "invalid" : "missing"),
45000
45078
  guardState: buildPluginGuardDecision(snapshot).state,
45001
45079
  ...installedVersion ? { installedVersion } : {},
45002
- ...stagedVersion ? { stagedVersion } : {}
45080
+ ...stagedVersion ? { stagedVersion } : {},
45081
+ ...hermes?.receipt ? { receipt: hermes.receipt } : {}
45003
45082
  };
45004
45083
  return surfaceEvidence;
45005
45084
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/cli",
3
- "version": "4.3.62",
3
+ "version": "4.3.64",
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",