@mutmutco/codex-plugin 4.5.186 → 4.5.188
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/cli/dist/main.cjs
CHANGED
|
@@ -19193,10 +19193,10 @@ var rollout_plan_default = {
|
|
|
19193
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)."
|
|
19194
19194
|
},
|
|
19195
19195
|
baseline: {
|
|
19196
|
-
version: "4.5.
|
|
19197
|
-
tag: "v4.5.
|
|
19198
|
-
commit: "
|
|
19199
|
-
npm: "@mutmutco/cli@4.5.
|
|
19196
|
+
version: "4.5.188",
|
|
19197
|
+
tag: "v4.5.188",
|
|
19198
|
+
commit: "51a0fa98e02d",
|
|
19199
|
+
npm: "@mutmutco/cli@4.5.188"
|
|
19200
19200
|
},
|
|
19201
19201
|
exitCriterion: "fleet-n-of-n",
|
|
19202
19202
|
hubOnlyShortcut: "forbidden",
|
|
@@ -19213,14 +19213,14 @@ var rollout_plan_default = {
|
|
|
19213
19213
|
repo: "mutmutco/mmi-hub",
|
|
19214
19214
|
role: "canary",
|
|
19215
19215
|
schedule: "train",
|
|
19216
|
-
v3Target: "v4.5.
|
|
19216
|
+
v3Target: "v4.5.188"
|
|
19217
19217
|
}
|
|
19218
19218
|
],
|
|
19219
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.",
|
|
19220
19220
|
rollback: {
|
|
19221
19221
|
independent: true,
|
|
19222
|
-
mechanism: "npm dist-tag latest -> 4.5.
|
|
19223
|
-
v3Target: "v4.5.
|
|
19222
|
+
mechanism: "npm dist-tag latest -> 4.5.188 and redeploy the Hub Lambda from tag v4.5.188 (51a0fa98e02d); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
|
|
19223
|
+
v3Target: "v4.5.188 (@mutmutco/cli@4.5.188, tag commit 51a0fa98e02d \u2014 last known-good release carrying the repo-index v4-only contract)"
|
|
19224
19224
|
}
|
|
19225
19225
|
},
|
|
19226
19226
|
{
|
|
@@ -23886,6 +23886,7 @@ async function dispatchCanary(deps, targetRepo2, nonce) {
|
|
|
23886
23886
|
);
|
|
23887
23887
|
}
|
|
23888
23888
|
var HOSTED_LABEL_RE = /\b(?:ubuntu|windows|macos)-(?:latest|\d[\w.-]*)\b/;
|
|
23889
|
+
var FALLBACK_EXPR_GLOBAL_RE = /\$\{\{\s*vars\.MMI_RUNNER_FALLBACK\s*==\s*'hosted'\s*&&\s*'(?:ubuntu|windows|macos)-(?:latest|\d[\w.-]*)'\s*\|\|\s*fromJSON\('\[[^\n']+\]'\)\s*\}\}/g;
|
|
23889
23890
|
var AUTOMATIC_TRIGGERS = /* @__PURE__ */ new Set(["push", "pull_request", "pull_request_target", "release", "schedule", "workflow_run", "merge_group", "create", "deployment", "repository_dispatch", "check_run", "check_suite", "issues", "issue_comment"]);
|
|
23890
23891
|
function workflowTriggers(yaml) {
|
|
23891
23892
|
const lines2 = yaml.split(/\r?\n/);
|
|
@@ -23902,7 +23903,7 @@ function workflowTriggers(yaml) {
|
|
|
23902
23903
|
return out;
|
|
23903
23904
|
}
|
|
23904
23905
|
function workflowNeedsHostedRunner(yaml) {
|
|
23905
|
-
const body = yaml.split(/\r?\n/).filter((l) => !/^\s*#/.test(l)).join("\n");
|
|
23906
|
+
const body = yaml.split(/\r?\n/).filter((l) => !/^\s*#/.test(l)).join("\n").replace(FALLBACK_EXPR_GLOBAL_RE, "");
|
|
23906
23907
|
return HOSTED_LABEL_RE.test(body) && workflowTriggers(yaml).some((t) => AUTOMATIC_TRIGGERS.has(t));
|
|
23907
23908
|
}
|
|
23908
23909
|
async function hostedWorkflowsOf(deps, repo) {
|
|
@@ -30072,6 +30073,33 @@ function registryRepoKey(repo) {
|
|
|
30072
30073
|
return repo.toLowerCase();
|
|
30073
30074
|
}
|
|
30074
30075
|
|
|
30076
|
+
// ../shared/runner-fallback.ts
|
|
30077
|
+
var RUNNER_FALLBACK_EXPR_RE = /^\$\{\{\s*vars\.MMI_RUNNER_FALLBACK\s*==\s*'hosted'\s*&&\s*'((?:ubuntu|windows|macos)-(?:latest|\d[\w.-]*))'\s*\|\|\s*fromJSON\('(\[[^\n']+\])'\)\s*\}\}$/;
|
|
30078
|
+
var FLEET_ONLY_RUNNER_JOBS = {
|
|
30079
|
+
"backup-health.yml:judge": "SSH backup inventory; hosted source-IP access unverified",
|
|
30080
|
+
"browser-pass.yml:browser-pass": "owner-bounded two-lane browser capacity",
|
|
30081
|
+
"app-publish.yml:publish": "SSH tenant publish; hosted source-IP access unverified",
|
|
30082
|
+
"get-publish.yml:publish": "SSH installer publish; hosted source-IP access unverified",
|
|
30083
|
+
"get-publish-desktop.yml:publish": "SSH installer publish; hosted source-IP access unverified",
|
|
30084
|
+
"hetzner-knownhosts-pin.yml:pin": "SSH host-key probe; hosted source-IP access unverified",
|
|
30085
|
+
"module-rc-publish.yml:publish": "SSH live-container snapshot and tenant persistent state",
|
|
30086
|
+
"tenant-control.yml:control": "SSH tenant control; hosted source-IP access unverified",
|
|
30087
|
+
"tenant-deploy.yml:deploy": "SSH tenant deploy; hosted source-IP access unverified",
|
|
30088
|
+
"tenant-reconcile.yml:reconcile": "SSH tenant reconciliation; hosted source-IP access unverified"
|
|
30089
|
+
};
|
|
30090
|
+
function parseRunnerFallbackExpression(runsOn) {
|
|
30091
|
+
const match = RUNNER_FALLBACK_EXPR_RE.exec(runsOn.trim());
|
|
30092
|
+
if (!match) return void 0;
|
|
30093
|
+
try {
|
|
30094
|
+
const parsed = JSON.parse(match[2]);
|
|
30095
|
+
if (!Array.isArray(parsed) || !parsed.length || !parsed.every((item) => typeof item === "string")) return void 0;
|
|
30096
|
+
if (!parsed.some((item) => item.toLowerCase() === "self-hosted")) return void 0;
|
|
30097
|
+
return { hosted: match[1], labels: parsed };
|
|
30098
|
+
} catch {
|
|
30099
|
+
return void 0;
|
|
30100
|
+
}
|
|
30101
|
+
}
|
|
30102
|
+
|
|
30075
30103
|
// src/ci-audit.ts
|
|
30076
30104
|
var HUB_REPO4 = "mutmutco/MMI-Hub";
|
|
30077
30105
|
var HUB_GATE_CONTEXTS = ["cli", "infra", "docs"];
|
|
@@ -30131,6 +30159,30 @@ var NPM_PUBLISH_SAFE_FLOOR_SHA = "b5632c8b940d8025fdb5630e576502e1397c4552";
|
|
|
30131
30159
|
var SHARED_ACTION_PINS = [
|
|
30132
30160
|
{ path: "npm-publish", floor: NPM_PUBLISH_SAFE_FLOOR_SHA }
|
|
30133
30161
|
];
|
|
30162
|
+
function auditRunnerFallbacks(repo, files) {
|
|
30163
|
+
const checks = [];
|
|
30164
|
+
for (const { path: path2, body } of files) {
|
|
30165
|
+
const jobs = parseWorkflowJobs(body.split(/\r?\n/).filter((line) => !/^\s*#/.test(line)).join("\n"));
|
|
30166
|
+
for (const job of jobs) {
|
|
30167
|
+
const runsOn = /^ runs-on:\s*(.+)$/m.exec(job.body)?.[1] ?? "";
|
|
30168
|
+
const runnerSection = /^ runs-on:([^\n]*(?:\n {6,}[^\n]*)*)/m.exec(job.body)?.[1] ?? "";
|
|
30169
|
+
const fallback = parseRunnerFallbackExpression(runsOn);
|
|
30170
|
+
const selfHosted = !!fallback || /self-hosted/i.test(runnerSection) || /matrix\./.test(runsOn) && /self-hosted/i.test(job.body);
|
|
30171
|
+
if (!selfHosted) continue;
|
|
30172
|
+
const key = `${path2.split("/").pop()}:${job.id}`;
|
|
30173
|
+
const marked = /#\s*mmi-runner:\s*fleet-only\s*[—–-]+\s*(\S.*?)\s*$/.exec(runsOn)?.[1];
|
|
30174
|
+
const exemption = (repo === HUB_REPO4 ? FLEET_ONLY_RUNNER_JOBS[key] : void 0) ?? marked;
|
|
30175
|
+
const safe = !!fallback;
|
|
30176
|
+
checks.push({
|
|
30177
|
+
ok: !!exemption || safe,
|
|
30178
|
+
label: `runner has hosted backup (#8671): ${path2}:${job.id}`,
|
|
30179
|
+
detail: exemption ? `fleet-only: ${exemption}` : safe ? void 0 : "self-hosted runner does not use the vars.MMI_RUNNER_FALLBACK backup expression",
|
|
30180
|
+
remediation: exemption || safe ? void 0 : `Use runs-on: \${{ vars.MMI_RUNNER_FALLBACK == 'hosted' && 'ubuntu-latest' || fromJSON('["self-hosted","linux","x64","mmi-live"]') }} (keeping the job's original self-hosted tuple). See gh-runner-runbook.md.`
|
|
30181
|
+
});
|
|
30182
|
+
}
|
|
30183
|
+
}
|
|
30184
|
+
return checks;
|
|
30185
|
+
}
|
|
30134
30186
|
function slugFromRepo(repo) {
|
|
30135
30187
|
return (repo.includes("/") ? repo.split("/")[1] : repo).toLowerCase();
|
|
30136
30188
|
}
|
|
@@ -30824,9 +30876,12 @@ async function auditRepoCi(repo, callerDeps) {
|
|
|
30824
30876
|
}
|
|
30825
30877
|
}
|
|
30826
30878
|
}
|
|
30827
|
-
|
|
30879
|
+
{
|
|
30828
30880
|
const workflows = await getBranchWorkflows();
|
|
30829
|
-
if (workflows)
|
|
30881
|
+
if (workflows) {
|
|
30882
|
+
checks.push(...auditRunnerFallbacks(repo, workflows));
|
|
30883
|
+
if (repoClass !== "hub") checks.push(...await auditSharedActionPins(workflows, deps));
|
|
30884
|
+
}
|
|
30830
30885
|
}
|
|
30831
30886
|
if (meta?.deployModel === "tenant-container" && deps.getDeployFacts) {
|
|
30832
30887
|
const fresh = await auditDevStageFreshness(repo, deps);
|
package/cli/package.json
CHANGED
package/package.json
CHANGED
|
@@ -27,11 +27,7 @@ name: gate
|
|
|
27
27
|
# checks ruleset on main cannot be silently skipped by a future bootstrap (#4113).
|
|
28
28
|
# GATE_BUDGET_SHA is rendered by the CLI from its blessed run-with-budget pin — not an operator knob.
|
|
29
29
|
# GATE_RUNNER_SHA pins the org runner-checkout / runner-node-toolchain actions (#5610).
|
|
30
|
-
#
|
|
31
|
-
# Do not add a windows-compat (or any other) job that runs-on GH-hosted Windows. Linux self-hosted
|
|
32
|
-
# (mmi-live / mmi-heavy) is the only CI merge gate. Rare Windows proof stays on the owner's machine or
|
|
33
|
-
# a future self-hosted Windows runner — never windows-latest.
|
|
34
|
-
# (seed touch: keep BOM digests in lockstep after classifier land.)
|
|
30
|
+
# #8671 owner ruling (23 Oct 2026): GitHub-hosted backup is permitted on every OS via vars.MMI_RUNNER_FALLBACK.
|
|
35
31
|
on:
|
|
36
32
|
pull_request:
|
|
37
33
|
merge_group:
|
|
@@ -65,7 +61,7 @@ jobs:
|
|
|
65
61
|
# that runs the full job; main must never become skippable via bootstrap vars alone while the
|
|
66
62
|
# org ruleset still requires `gate` on main.
|
|
67
63
|
if: ${{ github.event_name != 'push' || github.ref_name == '{{GATE_FULL_RUN_BRANCH}}' || github.ref_name == 'main' || github.ref_type == 'tag' }}
|
|
68
|
-
runs-on: [self-hosted,
|
|
64
|
+
runs-on: ${{ vars.MMI_RUNNER_FALLBACK == 'hosted' && 'ubuntu-latest' || fromJSON('["self-hosted","linux","x64","mmi-live"]') }}
|
|
69
65
|
defaults:
|
|
70
66
|
run: { working-directory: {{GATE_WORKDIR}} }{{GATE_SERVICES_YAML}}
|
|
71
67
|
steps:
|
|
@@ -16,7 +16,7 @@ permissions:
|
|
|
16
16
|
packages: read
|
|
17
17
|
jobs:
|
|
18
18
|
gate:
|
|
19
|
-
runs-on: [self-hosted,
|
|
19
|
+
runs-on: ${{ vars.MMI_RUNNER_FALLBACK == 'hosted' && 'ubuntu-latest' || fromJSON('["self-hosted","linux","x64","mmi-live"]') }}
|
|
20
20
|
timeout-minutes: 10
|
|
21
21
|
steps:
|
|
22
22
|
# #8206: keep a fresh successful tag gate; promote the exact development verdict, not a ref.
|