@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.
- package/dist/main.cjs +95 -16
- 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.
|
|
15805
|
-
tag: "v4.3.
|
|
15806
|
-
commit: "
|
|
15807
|
-
npm: "@mutmutco/cli@4.3.
|
|
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.
|
|
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.
|
|
15831
|
-
v3Target: "v4.3.
|
|
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:
|
|
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
|
-
|
|
21509
|
-
|
|
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
|
|
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
|
-
|
|
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