@mutmutco/cli 4.5.128 → 4.5.130
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 +27 -11
- package/package.json +1 -1
package/dist/main.cjs
CHANGED
|
@@ -15380,6 +15380,17 @@ function missingPlaceholders(rendered) {
|
|
|
15380
15380
|
function isPropagatableSeed(seed) {
|
|
15381
15381
|
return seed.ownership === "org" && seed.source === "self" || seed.managedBlock != null;
|
|
15382
15382
|
}
|
|
15383
|
+
function seedSourcePath(seed) {
|
|
15384
|
+
const source = seed.managedBlock?.source ?? seed.source;
|
|
15385
|
+
return source.startsWith("seed:") ? `skills/bootstrap/seeds/${source.slice(5)}` : seed.target;
|
|
15386
|
+
}
|
|
15387
|
+
var RUNBOOK_UNAFFECTED_PATH = "skills/bootstrap/seeds/runbook-unaffected.json";
|
|
15388
|
+
function runbookUnaffectedReason(declarations, target, sourceBlob) {
|
|
15389
|
+
const entry = declarations?.[target];
|
|
15390
|
+
if (!entry || entry.blob !== sourceBlob || typeof entry.reason !== "string") return void 0;
|
|
15391
|
+
const reason = entry.reason.trim();
|
|
15392
|
+
return reason && !/[\r\n]/.test(reason) ? reason : void 0;
|
|
15393
|
+
}
|
|
15383
15394
|
function sourceLines(content) {
|
|
15384
15395
|
const lines2 = [];
|
|
15385
15396
|
const newline = /\r\n|\n|\r/g;
|
|
@@ -17037,9 +17048,12 @@ function planSeedDelivery(branchRules, slug, baseBranch, branchPrefix = "bootstr
|
|
|
17037
17048
|
}
|
|
17038
17049
|
return { mode: "direct", ref: baseBranch, reason: decision.reason };
|
|
17039
17050
|
}
|
|
17040
|
-
function contentPutBody(path2, content, branch, sha) {
|
|
17051
|
+
function contentPutBody(path2, content, branch, sha, runbookUnaffected) {
|
|
17041
17052
|
const body = {
|
|
17042
|
-
|
|
17053
|
+
// #8169: a reviewed seed revision may declare it leaves runbooks correct; the tenant guard reads the trailer.
|
|
17054
|
+
message: `bootstrap: seed ${path2}${runbookUnaffected ? `
|
|
17055
|
+
|
|
17056
|
+
Runbook-Unaffected: ${runbookUnaffected}` : ""}`,
|
|
17043
17057
|
content: encodeGitHubContents(content),
|
|
17044
17058
|
branch
|
|
17045
17059
|
};
|
|
@@ -18244,10 +18258,10 @@ var rollout_plan_default = {
|
|
|
18244
18258
|
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)."
|
|
18245
18259
|
},
|
|
18246
18260
|
baseline: {
|
|
18247
|
-
version: "4.5.
|
|
18248
|
-
tag: "v4.5.
|
|
18249
|
-
commit: "
|
|
18250
|
-
npm: "@mutmutco/cli@4.5.
|
|
18261
|
+
version: "4.5.130",
|
|
18262
|
+
tag: "v4.5.130",
|
|
18263
|
+
commit: "6564bc03d8ee",
|
|
18264
|
+
npm: "@mutmutco/cli@4.5.130"
|
|
18251
18265
|
},
|
|
18252
18266
|
exitCriterion: "fleet-n-of-n",
|
|
18253
18267
|
hubOnlyShortcut: "forbidden",
|
|
@@ -18264,14 +18278,14 @@ var rollout_plan_default = {
|
|
|
18264
18278
|
repo: "mutmutco/mmi-hub",
|
|
18265
18279
|
role: "canary",
|
|
18266
18280
|
schedule: "train",
|
|
18267
|
-
v3Target: "v4.5.
|
|
18281
|
+
v3Target: "v4.5.130"
|
|
18268
18282
|
}
|
|
18269
18283
|
],
|
|
18270
18284
|
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.",
|
|
18271
18285
|
rollback: {
|
|
18272
18286
|
independent: true,
|
|
18273
|
-
mechanism: "npm dist-tag latest -> 4.5.
|
|
18274
|
-
v3Target: "v4.5.
|
|
18287
|
+
mechanism: "npm dist-tag latest -> 4.5.130 and redeploy the Hub Lambda from tag v4.5.130 (6564bc03d8ee); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
|
|
18288
|
+
v3Target: "v4.5.130 (@mutmutco/cli@4.5.130, tag commit 6564bc03d8ee \u2014 last known-good release carrying the repo-index v4-only contract)"
|
|
18275
18289
|
}
|
|
18276
18290
|
},
|
|
18277
18291
|
{
|
|
@@ -28689,6 +28703,7 @@ var UNBLOCKING_GATE_JOBS_LABEL = "every gate job can block a merge (#7012)";
|
|
|
28689
28703
|
var TAG_ADDRESSABLE_CONTEXTS_LABEL = "rc/main required contexts are tag-addressable (#3880)";
|
|
28690
28704
|
var RELEASE_BRANCH_REACHABLE_LABEL = "rc/main required contexts are reachable from a release-base head (#5193)";
|
|
28691
28705
|
var DEV_STAGE_FRESH_LABEL = "tenant dev stage runs the development tip (#7536)";
|
|
28706
|
+
var NO_CANCEL_WAIVER = /ci-audit:\s*allow-no-cancel-in-progress\b[^\n]*#\d+/i;
|
|
28692
28707
|
var DEV_STAGE_STALE_TOLERANCE_MS = 30 * 60 * 1e3;
|
|
28693
28708
|
function devStageFreshnessCheck(input) {
|
|
28694
28709
|
const { repo, deployedTag, tipSha, tipCommittedAt, nowMs } = input;
|
|
@@ -29372,7 +29387,6 @@ async function auditRepoCi(repo, callerDeps) {
|
|
|
29372
29387
|
detail: `${policy} (${reason})`
|
|
29373
29388
|
});
|
|
29374
29389
|
}
|
|
29375
|
-
const NO_CANCEL_WAIVER = /ci-audit:\s*allow-no-cancel-in-progress\b[^\n]*#\d+/i;
|
|
29376
29390
|
if (deployableGated || repoClass === "hub") {
|
|
29377
29391
|
const allPaths = await listWorkflowPaths(deps, repo, baseBranch) ?? [];
|
|
29378
29392
|
const prPaths = await filterPullRequestTriggered(deps, repo, baseBranch, allPaths);
|
|
@@ -36404,6 +36418,8 @@ LIVE apply to ${repo}:
|
|
|
36404
36418
|
if (o.execute) {
|
|
36405
36419
|
if (plan.refusedNoCanary) return fail("bootstrap propagate --execute: no canary declared for this target \u2014 refusing to write (set seedCanary:true on exactly one registry repo)");
|
|
36406
36420
|
const headSha = seedSource.sha;
|
|
36421
|
+
const sourceBlob = (await execGitForSeedSource(["rev-parse", `${headSha}:${seedSourcePath(seed)}`])).trim();
|
|
36422
|
+
const runbookUnaffected = (0, import_node_fs30.existsSync)(RUNBOOK_UNAFFECTED_PATH) ? runbookUnaffectedReason(JSON.parse((0, import_node_fs30.readFileSync)(RUNBOOK_UNAFFECTED_PATH, "utf8")), seed.target, sourceBlob) : void 0;
|
|
36407
36423
|
for (const rec of plan.records) {
|
|
36408
36424
|
if (rec.action !== "open-pr") continue;
|
|
36409
36425
|
const baseBranch = classOf(rec.repo) === "content" ? "main" : "development";
|
|
@@ -36428,7 +36444,7 @@ LIVE apply to ${repo}:
|
|
|
36428
36444
|
const tmp = (0, import_node_path29.join)((0, import_node_os18.tmpdir)(), `mmi-propagate-${process.pid}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}.json`);
|
|
36429
36445
|
const desiredContent = desiredByRepo.get(rec.repo);
|
|
36430
36446
|
if (desiredContent == null) return fail(`bootstrap propagate: no resolved content for ${rec.repo} ${seed.target} \u2014 refusing to write`);
|
|
36431
|
-
(0, import_node_fs30.writeFileSync)(tmp, JSON.stringify(contentPutBody(seed.target, desiredContent, branch, existingSha)), "utf8");
|
|
36447
|
+
(0, import_node_fs30.writeFileSync)(tmp, JSON.stringify(contentPutBody(seed.target, desiredContent, branch, existingSha, runbookUnaffected)), "utf8");
|
|
36432
36448
|
try {
|
|
36433
36449
|
await gh2(contentPutInputArgs(rec.repo, seed.target, tmp));
|
|
36434
36450
|
} finally {
|
package/package.json
CHANGED