@mutmutco/codex-plugin 4.5.97 → 4.5.98
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/.codex-plugin/plugin.json +1 -1
- package/cli/dist/main.cjs +45 -9
- package/cli/package.json +1 -1
- package/package.json +1 -1
package/cli/dist/main.cjs
CHANGED
|
@@ -17345,10 +17345,10 @@ var rollout_plan_default = {
|
|
|
17345
17345
|
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)."
|
|
17346
17346
|
},
|
|
17347
17347
|
baseline: {
|
|
17348
|
-
version: "4.5.
|
|
17349
|
-
tag: "v4.5.
|
|
17350
|
-
commit: "
|
|
17351
|
-
npm: "@mutmutco/cli@4.5.
|
|
17348
|
+
version: "4.5.98",
|
|
17349
|
+
tag: "v4.5.98",
|
|
17350
|
+
commit: "125c59187d10",
|
|
17351
|
+
npm: "@mutmutco/cli@4.5.98"
|
|
17352
17352
|
},
|
|
17353
17353
|
exitCriterion: "fleet-n-of-n",
|
|
17354
17354
|
hubOnlyShortcut: "forbidden",
|
|
@@ -17365,14 +17365,14 @@ var rollout_plan_default = {
|
|
|
17365
17365
|
repo: "mutmutco/mmi-hub",
|
|
17366
17366
|
role: "canary",
|
|
17367
17367
|
schedule: "train",
|
|
17368
|
-
v3Target: "v4.5.
|
|
17368
|
+
v3Target: "v4.5.98"
|
|
17369
17369
|
}
|
|
17370
17370
|
],
|
|
17371
17371
|
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.",
|
|
17372
17372
|
rollback: {
|
|
17373
17373
|
independent: true,
|
|
17374
|
-
mechanism: "npm dist-tag latest -> 4.5.
|
|
17375
|
-
v3Target: "v4.5.
|
|
17374
|
+
mechanism: "npm dist-tag latest -> 4.5.98 and redeploy the Hub Lambda from tag v4.5.98 (125c59187d10); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
|
|
17375
|
+
v3Target: "v4.5.98 (@mutmutco/cli@4.5.98, tag commit 125c59187d10 \u2014 last known-good release carrying the repo-index v4-only contract)"
|
|
17376
17376
|
}
|
|
17377
17377
|
},
|
|
17378
17378
|
{
|
|
@@ -30962,7 +30962,7 @@ init_hub_auth();
|
|
|
30962
30962
|
init_github_client();
|
|
30963
30963
|
|
|
30964
30964
|
// src/project-set.ts
|
|
30965
|
-
var UNSET_KEYS = ["projectAdmins", "installer", "oauth", "requiredRuntimeSecrets", "requiredBuildSecrets", "tenantTasks", "secrets", "edgeDomains", "requiredGcpApis", "publishRequired", "publishDir", "releaseChannel", "releaseLanguage", "dsManifestPath", "consumesDesignSystem", "ci", "requiredChecks", "requiredCheckBranches", "ciExemptReason", "gate", "seedCanary", "notifyOnDeploy", "vercelVersionEnv", "stageAllowlist", "suiteHold"];
|
|
30965
|
+
var UNSET_KEYS = ["projectAdmins", "installer", "oauth", "requiredRuntimeSecrets", "requiredBuildSecrets", "tenantTasks", "secrets", "edgeDomains", "requiredGcpApis", "publishRequired", "publishDir", "releaseChannel", "releaseLanguage", "dsManifestPath", "consumesDesignSystem", "ci", "requiredChecks", "requiredCheckBranches", "ciExemptReason", "gate", "seedCanary", "notifyOnDeploy", "vercelVersionEnv", "stageAllowlist", "suiteHold", "internalPeers"];
|
|
30966
30966
|
var UNSET_KEY_SET = new Set(UNSET_KEYS);
|
|
30967
30967
|
var RUNTIME_SECRET_STAGES = ["dev", "rc", "main"];
|
|
30968
30968
|
var SECRET_CONSUMERS = ["runtime", "build", "lambda", "actions", "agent", "box"];
|
|
@@ -31497,6 +31497,7 @@ var SETTABLE_VAR_KEYS = [
|
|
|
31497
31497
|
"requiredRuntimeSecrets",
|
|
31498
31498
|
"requiredBuildSecrets",
|
|
31499
31499
|
"tenantTasks",
|
|
31500
|
+
"internalPeers",
|
|
31500
31501
|
"edgeDomains",
|
|
31501
31502
|
"statusFieldId",
|
|
31502
31503
|
"statusOptions",
|
|
@@ -31535,6 +31536,7 @@ var SETTABLE_VAR_HINTS = {
|
|
|
31535
31536
|
requiredRuntimeSecrets: 'JSON stage map, e.g. {"dev":["KEY"],"rc":["KEY"],"main":["KEY"]}',
|
|
31536
31537
|
requiredBuildSecrets: 'JSON flat array, e.g. ["NODE_AUTH_TOKEN=@github-packages-token"]',
|
|
31537
31538
|
tenantTasks: 'JSON map {name:{service,command[],stages[],timeoutSeconds?,artifact?:"required",secretOutput?:{path,vault:{repo,key},overwrite?}}} \u2014 merged per entry, at most 20 stored in total; retire ONE task with --unset-task NAME; use {artifact} in argv when required; a secretOutput is master-only',
|
|
31539
|
+
internalPeers: "JSON {owner/repo:[dev|rc|main]} \u2014 same-box suite peers via the box Caddy; clear with --unset internalPeers (#7886)",
|
|
31538
31540
|
secrets: "JSON catalog map keyed by KEY {key,purpose,group,owner,stages[],consumers[]} \u2014 merged per entry; drop ONE entry with --unset-secret KEY; clear ALL with --unset secrets --confirm-clear-secrets; prefer --secrets-file",
|
|
31539
31541
|
edgeDomains: "JSON {dev,rc,main} domain map",
|
|
31540
31542
|
statusOptions: "JSON name\u2192id map",
|
|
@@ -31611,6 +31613,26 @@ function clearSecretsConfirmationError(unsets, existing, confirmed) {
|
|
|
31611
31613
|
if (confirmed) return null;
|
|
31612
31614
|
return `org project set: --unset secrets clears the WHOLE catalog for ${existing?.slug ?? "this project"} (${count} declared entr${count === 1 ? "y" : "ies"} would be removed). To drop ONE entry use --unset-secret <KEY>; re-run with --confirm-clear-secrets to wipe all ${count}.`;
|
|
31613
31615
|
}
|
|
31616
|
+
function parseInternalPeersVar(raw) {
|
|
31617
|
+
let parsed;
|
|
31618
|
+
try {
|
|
31619
|
+
parsed = JSON.parse(raw);
|
|
31620
|
+
} catch {
|
|
31621
|
+
throw new Error("org project set: internalPeers must be valid JSON");
|
|
31622
|
+
}
|
|
31623
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) throw new Error("org project set: internalPeers must be a JSON object");
|
|
31624
|
+
const entries = Object.entries(parsed);
|
|
31625
|
+
if (entries.length < 1 || entries.length > 20) throw new Error("org project set: internalPeers holds 1-20 peer declarations");
|
|
31626
|
+
const repoRe = /^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/;
|
|
31627
|
+
const validStages = /* @__PURE__ */ new Set(["dev", "rc", "main"]);
|
|
31628
|
+
const out = {};
|
|
31629
|
+
for (const [repo, rawStages] of entries) {
|
|
31630
|
+
if (!repoRe.test(repo)) throw new Error("org project set: internalPeers key must look like owner/name \u2014 got " + JSON.stringify(repo));
|
|
31631
|
+
if (!Array.isArray(rawStages) || rawStages.length < 1 || rawStages.length > 3 || rawStages.some((stg) => typeof stg !== "string" || !validStages.has(stg)) || new Set(rawStages).size !== rawStages.length) throw new Error("org project set: internalPeers stages must be a non-empty array of unique dev/rc/main values");
|
|
31632
|
+
out[repo] = rawStages;
|
|
31633
|
+
}
|
|
31634
|
+
return out;
|
|
31635
|
+
}
|
|
31614
31636
|
function parseSuiteHoldVar(raw) {
|
|
31615
31637
|
let parsed;
|
|
31616
31638
|
try {
|
|
@@ -31673,6 +31695,8 @@ function buildProjectSetPatch(input) {
|
|
|
31673
31695
|
patch[key] = parseBuildSecretsVar(raw);
|
|
31674
31696
|
} else if (key === "tenantTasks") {
|
|
31675
31697
|
patch[key] = parseTenantTasksVar(raw);
|
|
31698
|
+
} else if (key === "internalPeers") {
|
|
31699
|
+
patch[key] = parseInternalPeersVar(raw);
|
|
31676
31700
|
} else if (key === "secrets") {
|
|
31677
31701
|
patch[key] = parseSecretsCatalogVar(raw);
|
|
31678
31702
|
} else if (key === "edgeDomains") {
|
|
@@ -36547,7 +36571,7 @@ function readSuiteHotfix(path2) {
|
|
|
36547
36571
|
} catch {
|
|
36548
36572
|
throw new Error(`suite hotfix record unreadable at ${path2}; repair it, never restart`);
|
|
36549
36573
|
}
|
|
36550
|
-
if (r.schema !== "mmi-suite-hotfix/v1" || !r.repo || !r.member || !r.from || r.tag !== void 0 && !RELEASE_TAG.test(r.tag) || r.released && !r.tag || r.pinMerged && !r.released || r.leadTag !== void 0 && (!RELEASE_TAG.test(r.leadTag) || !r.pinMerged) || r.leadReleased && !r.leadTag || r.mapped && !r.leadReleased)
|
|
36574
|
+
if (r.schema !== "mmi-suite-hotfix/v1" || !r.repo || !r.member || !r.from || r.tag !== void 0 && !RELEASE_TAG.test(r.tag) || r.released && !r.tag || r.pinMerged && !r.released || r.mainPublished && !r.released || r.leadTag !== void 0 && (!RELEASE_TAG.test(r.leadTag) || !r.pinMerged) || r.leadReleased && !r.leadTag || r.mapped && !r.leadReleased)
|
|
36551
36575
|
throw new Error(`suite hotfix record has unknown or invalid state at ${path2}; repair it, never restart`);
|
|
36552
36576
|
return r;
|
|
36553
36577
|
}
|
|
@@ -36562,8 +36586,10 @@ async function suiteHotfix(deps, opts) {
|
|
|
36562
36586
|
if (found.repo === SUITE_REPO) throw new Error(`${SUITE_REPO} is the suite lead; hotfix a member, this command cuts the lead; nothing was written`);
|
|
36563
36587
|
const held = await deps.hold(found);
|
|
36564
36588
|
if (held) throw new Error(`${found.repo} is HELD (${held.reason}); clear it with suite hold clear before a suite hotfix; nothing was written`);
|
|
36589
|
+
const mainPath = mainBundlePath(found.bundles);
|
|
36565
36590
|
const plan = [
|
|
36566
36591
|
`${found.repo}: hotfix start --from ${opts.from} + release (suite-solo, in-process)`,
|
|
36592
|
+
`${found.repo}: publish main bundle (module-rc-publish channel=main) at ${mainPath}`,
|
|
36567
36593
|
`${SUITE_REPO}: main pin PR for ${found.id}, wait for merge`,
|
|
36568
36594
|
`${SUITE_REPO}: hotfix (patch) carrying only the merged pin PR onto main`,
|
|
36569
36595
|
`${SUITE_REPO}: record suite version -> member versions on its release`
|
|
@@ -36582,6 +36608,7 @@ async function suiteHotfix(deps, opts) {
|
|
|
36582
36608
|
const save = () => writeSuiteHotfix(path2, rec);
|
|
36583
36609
|
save();
|
|
36584
36610
|
const resume = `rerun suite hotfix ${found.id} --from ${rec.from} --owner-go to resume`;
|
|
36611
|
+
if (!rec.released) await deps.preflightMain(found.repo, mainPath);
|
|
36585
36612
|
if (!rec.tag) {
|
|
36586
36613
|
const started = await deps.hotfixStart(found.repo, { from: rec.from, ack: rec.ack });
|
|
36587
36614
|
if (!RELEASE_TAG.test(started.tag)) throw new Error(`${found.repo}: hotfix start returned no vX.Y.Z tag`);
|
|
@@ -36599,6 +36626,15 @@ async function suiteHotfix(deps, opts) {
|
|
|
36599
36626
|
rec.released = true;
|
|
36600
36627
|
save();
|
|
36601
36628
|
}
|
|
36629
|
+
if (!rec.mainPublished) {
|
|
36630
|
+
try {
|
|
36631
|
+
await deps.publishMain(found.repo, rec.tag, mainPath);
|
|
36632
|
+
} catch (e) {
|
|
36633
|
+
throw new Error(`${found.repo}: main bundle publish failed (${e.message}); ${rec.tag} is released: ${resume}`);
|
|
36634
|
+
}
|
|
36635
|
+
rec.mainPublished = true;
|
|
36636
|
+
save();
|
|
36637
|
+
}
|
|
36602
36638
|
if (!rec.pinMerged) {
|
|
36603
36639
|
const pin = await deps.soloPin(found.repo, rec.tag);
|
|
36604
36640
|
if (pin.status === "superseded") throw new Error(`${found.id} pin at ${rec.tag} is superseded by ${pin.pr}; a newer ${found.id} release owns the pin; stop`);
|
package/cli/package.json
CHANGED