@mutmutco/cli 4.5.184 → 4.5.186
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 +26 -19
- package/package.json +1 -1
package/dist/main.cjs
CHANGED
|
@@ -7356,11 +7356,12 @@ async function readAppVaultSecret(read) {
|
|
|
7356
7356
|
try {
|
|
7357
7357
|
return await read();
|
|
7358
7358
|
} catch (e) {
|
|
7359
|
-
const reason = e.message;
|
|
7360
|
-
|
|
7361
|
-
|
|
7359
|
+
const reason = e instanceof Error ? e.message : String(e);
|
|
7360
|
+
const unwrapped = reason.replace(/^Hub vault read failed:\s*/, "");
|
|
7361
|
+
if (/^(Hub GitHub App allowance used up|rate limited)/.test(unwrapped)) {
|
|
7362
|
+
throw new AppActorError(`app actor: the vault could not read the App credentials because GitHub is rate-limited, not a denial: ${unwrapped}`, "mint-failed");
|
|
7362
7363
|
}
|
|
7363
|
-
if (/^authority refused|\(HTTP 40[
|
|
7364
|
+
if (/^authority refused|\(HTTP 40[134]\b/.test(unwrapped)) return null;
|
|
7364
7365
|
throw new AppActorError(`app actor: the vault read of the App credentials failed, not a denial: ${reason}`, "mint-failed");
|
|
7365
7366
|
}
|
|
7366
7367
|
}
|
|
@@ -19192,10 +19193,10 @@ var rollout_plan_default = {
|
|
|
19192
19193
|
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)."
|
|
19193
19194
|
},
|
|
19194
19195
|
baseline: {
|
|
19195
|
-
version: "4.5.
|
|
19196
|
-
tag: "v4.5.
|
|
19197
|
-
commit: "
|
|
19198
|
-
npm: "@mutmutco/cli@4.5.
|
|
19196
|
+
version: "4.5.186",
|
|
19197
|
+
tag: "v4.5.186",
|
|
19198
|
+
commit: "f75f2099b6e1",
|
|
19199
|
+
npm: "@mutmutco/cli@4.5.186"
|
|
19199
19200
|
},
|
|
19200
19201
|
exitCriterion: "fleet-n-of-n",
|
|
19201
19202
|
hubOnlyShortcut: "forbidden",
|
|
@@ -19212,14 +19213,14 @@ var rollout_plan_default = {
|
|
|
19212
19213
|
repo: "mutmutco/mmi-hub",
|
|
19213
19214
|
role: "canary",
|
|
19214
19215
|
schedule: "train",
|
|
19215
|
-
v3Target: "v4.5.
|
|
19216
|
+
v3Target: "v4.5.186"
|
|
19216
19217
|
}
|
|
19217
19218
|
],
|
|
19218
19219
|
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.",
|
|
19219
19220
|
rollback: {
|
|
19220
19221
|
independent: true,
|
|
19221
|
-
mechanism: "npm dist-tag latest -> 4.5.
|
|
19222
|
-
v3Target: "v4.5.
|
|
19222
|
+
mechanism: "npm dist-tag latest -> 4.5.186 and redeploy the Hub Lambda from tag v4.5.186 (f75f2099b6e1); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
|
|
19223
|
+
v3Target: "v4.5.186 (@mutmutco/cli@4.5.186, tag commit f75f2099b6e1 \u2014 last known-good release carrying the repo-index v4-only contract)"
|
|
19223
19224
|
}
|
|
19224
19225
|
},
|
|
19225
19226
|
{
|
|
@@ -26866,6 +26867,8 @@ function enforceBumpRules(input) {
|
|
|
26866
26867
|
return decision();
|
|
26867
26868
|
}
|
|
26868
26869
|
if (proposal.breaking.length && effective === "patch") {
|
|
26870
|
+
if (input.suite && input.revamp) return decision();
|
|
26871
|
+
if (input.suite) throw new Error(`range carries breaking changes (${evidence}): suite versions auto-mint as patch (#8224), so release it as an owner-approved revamp with --owner-go --big, or ship a shim (#8666)`);
|
|
26869
26872
|
throw new Error(input.preOneZero ? `range carries breaking changes (${evidence}): this repo is held on 0.x.y, so declare MMI_BUMP_INTENT=minor with MMI_BUMP_REASON, or ship a shim (patch) (#8499)` : `range carries breaking changes (${evidence}): ship a shim (patch) or declare an owner-gated major (MMI_BUMP_INTENT=major, MMI_BUMP_REASON, MMI_MAJOR_APPROVED=<version>) (#8499)`);
|
|
26870
26873
|
}
|
|
26871
26874
|
if (proposal.breaking.length && !input.preOneZero) {
|
|
@@ -29958,7 +29961,7 @@ async function resolveTrainBumpIntent(deps, env = process.env, latestRelease, pr
|
|
|
29958
29961
|
}
|
|
29959
29962
|
return "patch";
|
|
29960
29963
|
}
|
|
29961
|
-
async function enforceTrainBump(deps, env, intent, preOneZero, source) {
|
|
29964
|
+
async function enforceTrainBump(deps, env, intent, preOneZero, source, suite = { suite: false, revamp: false }) {
|
|
29962
29965
|
const raw = await deps.run("git", ["log", `origin/main..${source}`, RANGE_LOG_FORMAT]);
|
|
29963
29966
|
const proposal = proposeBump(parseRangeLog(raw), { preOneZero });
|
|
29964
29967
|
let majorTarget;
|
|
@@ -29967,7 +29970,7 @@ async function enforceTrainBump(deps, env, intent, preOneZero, source) {
|
|
|
29967
29970
|
const latest = await latestLocalReleaseTag(deps, void 0, preOneZero);
|
|
29968
29971
|
majorTarget = explicit || `${latest.major + 1}.0.0`;
|
|
29969
29972
|
}
|
|
29970
|
-
return enforceBumpRules({ intent, env, proposal, preOneZero, majorTarget });
|
|
29973
|
+
return enforceBumpRules({ intent, env, proposal, preOneZero, majorTarget, ...suite });
|
|
29971
29974
|
}
|
|
29972
29975
|
async function resolveHotfixVersion(deps, env = process.env, preOneZero = false) {
|
|
29973
29976
|
const latest = await latestLocalReleaseTag(deps, "origin/main", preOneZero);
|
|
@@ -30022,7 +30025,8 @@ async function runTrainApplyLocked(command, deps, options = {}) {
|
|
|
30022
30025
|
process.env,
|
|
30023
30026
|
declaredIntent,
|
|
30024
30027
|
preOneZeroInForce(meta),
|
|
30025
|
-
command === "release" && !directTrack && options.dev !== true ? "origin/rc" : "origin/development"
|
|
30028
|
+
command === "release" && !directTrack && options.dev !== true ? "origin/rc" : "origin/development",
|
|
30029
|
+
{ suite: !!meta.suite, revamp: command === "release" && options.big === true }
|
|
30026
30030
|
);
|
|
30027
30031
|
const bumpIntent = bump.intent;
|
|
30028
30032
|
const bumpReceipt = { intent: bump.intent, reason: bump.reason, proposed: bump.proposed, breaking: bump.breaking };
|
|
@@ -30486,6 +30490,7 @@ function trackUnauditableReads(deps) {
|
|
|
30486
30490
|
if (reason) return;
|
|
30487
30491
|
const err = e;
|
|
30488
30492
|
if (err?.rateLimited) reason = `GitHub App rate-limited: ${err.message ?? "rate limit exceeded"}`;
|
|
30493
|
+
else if (err?.name === "AppActorError" || err?.code === "mint-failed") reason = err.message ?? "GitHub App token mint failed";
|
|
30489
30494
|
else if (err?.status === 403 || err?.status === 429) reason = `HTTP ${err.status}${err.message ? `: ${err.message}` : ""}`;
|
|
30490
30495
|
};
|
|
30491
30496
|
const client = {
|
|
@@ -57941,9 +57946,10 @@ async function reportWrite(label, res) {
|
|
|
57941
57946
|
return failGraceful(`${label}: HTTP ${res.status}${detail ? ` \u2014 ${detail}` : ""}`);
|
|
57942
57947
|
}
|
|
57943
57948
|
var tenant = program2.command("tenant").description("tenant runtime control through Hub authority");
|
|
57944
|
-
tenant.command("control <owner/repo> <stage> <action>").description("bounded tenant control plus value-free vault/broker verification; dev/main retire needs master and exact data-loss confirmation").option("--watch", "block on the dispatched run and report its conclusion (status/retire/verify-secrets/verify-broker/logs watch by default)").option("--lines <n>", "logs only: trailing lines of the tenant service to return (1-2000, default 200)").option("--since <utc>", "logs only: read the journal from this UTC time, e.g. 2026-10-07T13:10Z (includes replaced containers)").option("--until <utc>", "logs only: read the journal up to this UTC time").option("--edge", "logs only: Caddy journal for this stage\u2019s hosts (default window: last 15 minutes)").option("--task <name>", "run-task only: registry-declared task name (never a command)").option("--artifact <id>", "run-task only: opaque id returned by tenant artifact put").option("--resume <run-id>", "run-task only: re-attach to an already-dispatched run (read-only, never re-dispatches) and print its receipt").option("--confirm-data-loss <owner/repo/stage>", "dev/main retire only: exact target to decommission; without it show the dry-run plan").option("--json", "machine-readable output").action(async (repo, stage, action, o) => {
|
|
57949
|
+
tenant.command("control <owner/repo> <stage> <action>").description("bounded tenant control plus value-free vault/broker verification; dev/main retire needs master and exact data-loss confirmation").option("--watch", "block on the dispatched run and report its conclusion (status/retire/verify-secrets/verify-broker/logs watch by default)").option("--lines <n>", "logs only: trailing lines of the tenant service to return (1-2000, default 200)").option("--since <utc>", "logs only: read the journal from this UTC time, e.g. 2026-10-07T13:10Z (includes replaced containers)").option("--until <utc>", "logs only: read the journal up to this UTC time").option("--edge", "logs only: Caddy journal for this stage\u2019s hosts (default window: last 15 minutes)").option("--task <name>", "run-task only: registry-declared task name (never a command)").option("--artifact <id>", "run-task only: opaque id returned by tenant artifact put").option("--input <file>", "run-task only: upload this file as the task artifact (same as tenant artifact put), then run with its id").option("--resume <run-id>", "run-task only: re-attach to an already-dispatched run (read-only, never re-dispatches) and print its receipt").option("--confirm-data-loss <owner/repo/stage>", "dev/main retire only: exact target to decommission; without it show the dry-run plan").option("--json", "machine-readable output").action(async (repo, stage, action, o) => {
|
|
57945
57950
|
try {
|
|
57946
|
-
if (o.resume !== void 0 && (action !== "run-task" || !/^\d+$/.test(o.resume) || o.task || o.artifact)) return fail("runtime tenant control: --resume <run-id> is run-task-only, takes a numeric run id, and cannot be combined with --task/--artifact");
|
|
57951
|
+
if (o.resume !== void 0 && (action !== "run-task" || !/^\d+$/.test(o.resume) || o.task || o.artifact || o.input)) return fail("runtime tenant control: --resume <run-id> is run-task-only, takes a numeric run id, and cannot be combined with --task/--artifact/--input");
|
|
57952
|
+
if (o.input !== void 0 && o.artifact !== void 0) return fail("runtime tenant control: pass --input <file> or --artifact <id>, not both");
|
|
57947
57953
|
if (o.confirmDataLoss !== void 0 && (action !== "retire" || stage === "rc")) return fail("runtime tenant control: --confirm-data-loss is dev/main retire-only");
|
|
57948
57954
|
if (action === "retire" && (stage === "dev" || stage === "main")) {
|
|
57949
57955
|
if (o.confirmDataLoss !== void 0 && o.confirmDataLoss !== `${repo}/${stage}`) return fail(`runtime tenant control: --confirm-data-loss must match ${repo}/${stage} exactly`);
|
|
@@ -57969,10 +57975,11 @@ Dry run: pass --confirm-data-loss ${repo}/${stage} to decommission.`);
|
|
|
57969
57975
|
}
|
|
57970
57976
|
if (action === "run-task") {
|
|
57971
57977
|
if (!o.task && o.resume === void 0) return fail("runtime tenant control: run-task requires --task <declared-name>");
|
|
57972
|
-
} else if (o.task || o.artifact) {
|
|
57973
|
-
return fail("runtime tenant control: --task/--artifact are valid only for run-task");
|
|
57978
|
+
} else if (o.task || o.artifact || o.input) {
|
|
57979
|
+
return fail("runtime tenant control: --task/--artifact/--input are valid only for run-task");
|
|
57974
57980
|
}
|
|
57975
|
-
const
|
|
57981
|
+
const artifact = o.input === void 0 ? o.artifact : (await putTenantArtifact(repo, stage, o.input, registryClientDeps(await loadConfig()))).artifactId;
|
|
57982
|
+
const result = await runTenantControl(trainApplyDeps(), { repo, stage, action, watch: o.watch, lines: lines2, edge: o.edge, logSince: o.since, logUntil: o.until, task: o.task, artifact, confirmDataLoss: o.confirmDataLoss, resume: o.resume === void 0 ? void 0 : Number(o.resume) });
|
|
57976
57983
|
if (!o.json && action === "verify-secrets" && result.secrets) {
|
|
57977
57984
|
const body = { ok: result.conclusion === "success", secrets: result.secrets, ssmStatus: result.conclusion === "success" ? "Success" : "Failed", raw: result.secretsRaw };
|
|
57978
57985
|
const { lines: lines3, failure } = renderVerifySecrets(body);
|
package/package.json
CHANGED