@mutmutco/codex-plugin 4.5.92 → 4.5.94
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 +88 -41
- package/cli/package.json +1 -1
- package/package.json +1 -1
package/cli/dist/main.cjs
CHANGED
|
@@ -6347,6 +6347,9 @@ async function pollRestPrChecks(prNumber, repo, gh2 = defaultGhApi, requiredCont
|
|
|
6347
6347
|
const { relevant } = partitionByRequired(entries, requiredContexts);
|
|
6348
6348
|
return derivePollState(relevant);
|
|
6349
6349
|
}
|
|
6350
|
+
async function pollRestCommitChecks(sha, repo, gh2 = defaultGhApi) {
|
|
6351
|
+
return derivePollState(partitionByRequired(await fetchHeadCheckEntries(sha, repo, gh2), null).relevant);
|
|
6352
|
+
}
|
|
6350
6353
|
async function pollRestPrMergeable(prNumber, repo, gh2 = defaultGhApi) {
|
|
6351
6354
|
try {
|
|
6352
6355
|
return (await fetchRestPrSnapshot(prNumber, repo, gh2)).mergeable;
|
|
@@ -17252,10 +17255,10 @@ var rollout_plan_default = {
|
|
|
17252
17255
|
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)."
|
|
17253
17256
|
},
|
|
17254
17257
|
baseline: {
|
|
17255
|
-
version: "4.5.
|
|
17256
|
-
tag: "v4.5.
|
|
17257
|
-
commit: "
|
|
17258
|
-
npm: "@mutmutco/cli@4.5.
|
|
17258
|
+
version: "4.5.94",
|
|
17259
|
+
tag: "v4.5.94",
|
|
17260
|
+
commit: "f01a89cb9110",
|
|
17261
|
+
npm: "@mutmutco/cli@4.5.94"
|
|
17259
17262
|
},
|
|
17260
17263
|
exitCriterion: "fleet-n-of-n",
|
|
17261
17264
|
hubOnlyShortcut: "forbidden",
|
|
@@ -17272,14 +17275,14 @@ var rollout_plan_default = {
|
|
|
17272
17275
|
repo: "mutmutco/mmi-hub",
|
|
17273
17276
|
role: "canary",
|
|
17274
17277
|
schedule: "train",
|
|
17275
|
-
v3Target: "v4.5.
|
|
17278
|
+
v3Target: "v4.5.94"
|
|
17276
17279
|
}
|
|
17277
17280
|
],
|
|
17278
17281
|
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.",
|
|
17279
17282
|
rollback: {
|
|
17280
17283
|
independent: true,
|
|
17281
|
-
mechanism: "npm dist-tag latest -> 4.5.
|
|
17282
|
-
v3Target: "v4.5.
|
|
17284
|
+
mechanism: "npm dist-tag latest -> 4.5.94 and redeploy the Hub Lambda from tag v4.5.94 (f01a89cb9110); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
|
|
17285
|
+
v3Target: "v4.5.94 (@mutmutco/cli@4.5.94, tag commit f01a89cb9110 \u2014 last known-good release carrying the repo-index v4-only contract)"
|
|
17283
17286
|
}
|
|
17284
17287
|
},
|
|
17285
17288
|
{
|
|
@@ -36067,7 +36070,7 @@ function readSuiteCut(path2) {
|
|
|
36067
36070
|
} catch {
|
|
36068
36071
|
throw new Error(`suite cut record unreadable at ${path2}; repair it, never recut`);
|
|
36069
36072
|
}
|
|
36070
|
-
if (record.schema !== SCHEMA || record.lead !== SUITE_REPO || !SHA2.test(record.leadDevelopment) || !SHA2.test(record.leadPreviousRc) || !Array.isArray(record.members) || record.members.length === 0 || record.pinPr !== void 0 && (typeof record.pinPr !== "string" || !record.pinPr.startsWith("https://github.com/mutmutco/MM-Work/pull/")) || record.pinMerged !== void 0 && (record.pinMerged !== true && record.pinMerged !== false || !record.pinPr) || record.leadRcTag !== void 0 && (!RC_TAG.test(record.leadRcTag) || !SHA2.test(record.leadRcSha ?? "") || !record.pinMerged) || record.leadReleased !== void 0 && (record.leadReleased !== true || !record.leadRcTag) || record.announcement !== void 0 && (!["pending", "sent", "skipped"].includes(record.announcement) || !record.leadReleased) || record.heldMembers !== void 0 && (!Array.isArray(record.heldMembers) || record.heldMembers.some((h) => !h.id || !h.repo || typeof h.reason !== "string" || !h.reason.trim() || h.since !== void 0 && typeof h.since !== "string" || record.members.some((m) => m.id === h.id))) || record.members.some((m) => !m.id || !m.repo || !m.backend || !m.host || !SHA2.test(m.development) || !SHA2.test(m.previousRc) || m.rcWasAbsent !== void 0 && m.rcWasAbsent !== true || m.tag !== void 0 && (!RC_TAG.test(m.tag) || !SHA2.test(m.sha ?? "")) || m.published !== void 0 && (m.published !== true || !m.tag) || m.released !== void 0 && (m.released !== true || !m.published) || m.mainPublished !== void 0 && (m.mainPublished !== true || !m.released || !!m.carried) || m.backendAfterRelease !== void 0 && (!m.released || typeof m.backendAfterRelease !== "string") || m.carried !== void 0 && (m.carried !== true || m.tag !== void 0 || m.published !== void 0 || !isPin(m.rcPin) || !isPin(m.mainPin)) || m.carried === void 0 && (m.rcPin !== void 0 || m.mainPin !== void 0)))
|
|
36073
|
+
if (record.schema !== SCHEMA || record.lead !== SUITE_REPO || !SHA2.test(record.leadDevelopment) || !SHA2.test(record.leadPreviousRc) || !Array.isArray(record.members) || record.members.length === 0 || record.pinPr !== void 0 && (typeof record.pinPr !== "string" || !record.pinPr.startsWith("https://github.com/mutmutco/MM-Work/pull/")) || record.pinsUnchanged !== void 0 && (record.pinsUnchanged !== true || record.pinPr !== void 0) || record.pinMerged !== void 0 && (record.pinMerged !== true && record.pinMerged !== false || !record.pinPr && !record.pinsUnchanged) || record.leadRcTag !== void 0 && (!RC_TAG.test(record.leadRcTag) || !SHA2.test(record.leadRcSha ?? "") || !record.pinMerged) || record.leadReleased !== void 0 && (record.leadReleased !== true || !record.leadRcTag) || record.announcement !== void 0 && (!["pending", "sent", "skipped"].includes(record.announcement) || !record.leadReleased) || record.heldMembers !== void 0 && (!Array.isArray(record.heldMembers) || record.heldMembers.some((h) => !h.id || !h.repo || typeof h.reason !== "string" || !h.reason.trim() || h.since !== void 0 && typeof h.since !== "string" || record.members.some((m) => m.id === h.id))) || record.members.some((m) => !m.id || !m.repo || !m.backend || !m.host || !SHA2.test(m.development) || !SHA2.test(m.previousRc) || m.rcWasAbsent !== void 0 && m.rcWasAbsent !== true || m.tag !== void 0 && (!RC_TAG.test(m.tag) || !SHA2.test(m.sha ?? "")) || m.published !== void 0 && (m.published !== true || !m.tag) || m.released !== void 0 && (m.released !== true || !m.published) || m.mainPublished !== void 0 && (m.mainPublished !== true || !m.released || !!m.carried) || m.backendAfterRelease !== void 0 && (!m.released || typeof m.backendAfterRelease !== "string") || m.carried !== void 0 && (m.carried !== true || m.tag !== void 0 || m.published !== void 0 || !isPin(m.rcPin) || !isPin(m.mainPin)) || m.carried === void 0 && (m.rcPin !== void 0 || m.mainPin !== void 0)))
|
|
36071
36074
|
throw new Error(`suite cut record has unknown or invalid state at ${path2}; repair it, never recut`);
|
|
36072
36075
|
return record;
|
|
36073
36076
|
}
|
|
@@ -36198,7 +36201,7 @@ async function suiteRcand(deps, opts) {
|
|
|
36198
36201
|
(0, import_node_fs29.renameSync)(deps.recordPath, archive);
|
|
36199
36202
|
record = void 0;
|
|
36200
36203
|
}
|
|
36201
|
-
if (record && !record.pinPr && record.members.every((m) => !m.tag)) {
|
|
36204
|
+
if (record && !record.pinPr && !record.leadRcTag && record.members.every((m) => !m.tag)) {
|
|
36202
36205
|
(0, import_node_fs29.rmSync)(deps.recordPath, { force: true });
|
|
36203
36206
|
record = void 0;
|
|
36204
36207
|
}
|
|
@@ -36314,13 +36317,18 @@ Each module must ship a live release that bind-mounts <deployPath>/data read-onl
|
|
|
36314
36317
|
if (!member.carried && !member.priorMain && prior && pinVersion(prior) !== suiteReleaseTag(member.tag)) member.priorMain = prior;
|
|
36315
36318
|
}
|
|
36316
36319
|
writeSuiteCut(deps.recordPath, record);
|
|
36317
|
-
const pr = await deps.pin({ cut: record.leadDevelopment, pins, heldIds: record.heldMembers?.map((h) => h.id) });
|
|
36320
|
+
const pr = await deps.pin({ cut: record.leadDevelopment, pins, heldIds: record.heldMembers?.map((h) => h.id), carriedOnly: record.members.every((m) => m.carried) });
|
|
36318
36321
|
await deps.verifyLeadCut(record.leadDevelopment);
|
|
36319
|
-
if (
|
|
36320
|
-
|
|
36321
|
-
|
|
36322
|
+
if (pr.status === "unchanged") {
|
|
36323
|
+
record.pinsUnchanged = true;
|
|
36324
|
+
record.pinMerged = true;
|
|
36325
|
+
} else {
|
|
36326
|
+
if (record.pinPr && record.pinPr !== pr.pr) throw new Error(`pin PR changed from ${record.pinPr} to ${pr.pr}; stop`);
|
|
36327
|
+
record.pinPr = pr.pr;
|
|
36328
|
+
record.pinMerged = pr.status === "merged";
|
|
36329
|
+
}
|
|
36322
36330
|
writeSuiteCut(deps.recordPath, record);
|
|
36323
|
-
if (!record.pinMerged) throw new Error(`suite pin PR ${
|
|
36331
|
+
if (!record.pinMerged) throw new Error(`suite pin PR ${record.pinPr} is pending; merge it on development, then rerun suite rcand --owner-go (member tags are reused)`);
|
|
36324
36332
|
if (!record.leadRcTag) {
|
|
36325
36333
|
const leadCut = await deps.rcand(SUITE_REPO, record.leadPreviousRc);
|
|
36326
36334
|
if (!RC_TAG.test(leadCut.tag) || !SHA2.test(leadCut.sha) || !await deps.contains(SUITE_REPO, record.leadDevelopment, leadCut.sha))
|
|
@@ -40241,7 +40249,10 @@ async function openSuiteCutPinPr(deps, input) {
|
|
|
40241
40249
|
return row?.bundles.rc === p.rc && row?.bundles.main === p.main;
|
|
40242
40250
|
});
|
|
40243
40251
|
if (prs.length && matches(await registry2(branch))) return { status: "pending", pr: prs[0].url };
|
|
40244
|
-
if (!prs.length && matches(rows))
|
|
40252
|
+
if (!prs.length && matches(rows)) {
|
|
40253
|
+
if (input.carriedOnly) return { status: "unchanged" };
|
|
40254
|
+
throw new Error("pins already match without a merged cut PR \u2014 provenance unverified");
|
|
40255
|
+
}
|
|
40245
40256
|
await (0, import_promises6.mkdir)((0, import_node_path34.join)(deps.root, "tmp"), { recursive: true });
|
|
40246
40257
|
scratch = await (0, import_promises6.mkdtemp)((0, import_node_path34.join)(deps.root, "tmp", "suite-pin-"));
|
|
40247
40258
|
const run = (file, args) => deps.run(file, args, scratch);
|
|
@@ -45194,6 +45205,30 @@ ${list}`);
|
|
|
45194
45205
|
if (wait.checksUrl) lines2.push(`${context}: PR checks: ${wait.checksUrl}`);
|
|
45195
45206
|
return lines2;
|
|
45196
45207
|
}
|
|
45208
|
+
function printChecksWaitResult(label, result, json) {
|
|
45209
|
+
if (json) printLine(JSON.stringify(result));
|
|
45210
|
+
else if (result.status === "conflicting") {
|
|
45211
|
+
printLine(`${label}: conflicting \u2014 ${result.reason}`);
|
|
45212
|
+
} else if (result.status === "timeout") {
|
|
45213
|
+
const stuckQueuing = /no-checks-reported/i.test(result.detail ?? "");
|
|
45214
|
+
printLine(
|
|
45215
|
+
`${label}: timeout \u2014 waited ${Math.round((result.waitedMs ?? 0) / 6e4)}m, last state: ${result.detail ?? "pending"}. No check failed; re-run to keep waiting, or pass --timeout <minutes>.` + (stuckQueuing ? " Tip: check-runs never appeared \u2014 if `gh api repos/<owner>/<repo>/actions/runs?head_sha=<sha>` shows total_count=0, see docs/Guides/gh-runner-runbook.md \xA7 Zero workflow runs; otherwise mmi-live may be saturated or Actions may be failing before checkout (docs/Guides/gh-runner-runbook.md)." : "")
|
|
45216
|
+
);
|
|
45217
|
+
} else if (result.status === "rate-limited") {
|
|
45218
|
+
printLine(`${label}: rate-limited \u2014 ${result.reason ?? "REST pool below floor"}. No check failed; re-run after the pool resets.`);
|
|
45219
|
+
} else if (result.detail === "runner-infra") {
|
|
45220
|
+
printLine(`${label}: failure (runner infrastructure, NOT a test failure) \u2014 ${result.reason}`);
|
|
45221
|
+
} else if (result.detail === "stale-head") {
|
|
45222
|
+
printLine(`${label}: failure (stale PR head, NOT a test failure) \u2014 ${result.reason}`);
|
|
45223
|
+
} else if (result.detail === "zero-runs") {
|
|
45224
|
+
printLine(`${label}: failure (zero workflow runs delivered, NOT pending checks) \u2014 ${result.reason}`);
|
|
45225
|
+
} else {
|
|
45226
|
+
printLine(`${label}: ${result.status}${result.reason ? ` \u2014 ${result.reason}` : ""}${result.detail ? ` (${result.detail})` : ""}`);
|
|
45227
|
+
for (const line of failedChecksReceiptLines(label, result)) printLine(line);
|
|
45228
|
+
}
|
|
45229
|
+
if (result.status === "failure" || result.status === "conflicting") process.exitCode = 1;
|
|
45230
|
+
if (result.status === "timeout" || result.status === "rate-limited") process.exitCode = PR_CHECKS_TIMEOUT_EXIT_CODE;
|
|
45231
|
+
}
|
|
45197
45232
|
async function waitLoopHeadWorkflowRunCount(label, prNumber, repo) {
|
|
45198
45233
|
let snapshot;
|
|
45199
45234
|
try {
|
|
@@ -45259,28 +45294,7 @@ ${list}`);
|
|
|
45259
45294
|
// an agent harness kills it on its own (shorter) deadline before the verdict ever prints (#2940).
|
|
45260
45295
|
progress: ({ state, elapsedMs, remainingMs }) => console.warn(`pr checks-wait: ${state} \u2014 ${Math.round(elapsedMs / 1e3)}s elapsed, ${Math.round(remainingMs / 6e4)}m left`)
|
|
45261
45296
|
});
|
|
45262
|
-
|
|
45263
|
-
else if (result.status === "conflicting") {
|
|
45264
|
-
printLine(`pr checks-wait: conflicting \u2014 ${result.reason}`);
|
|
45265
|
-
} else if (result.status === "timeout") {
|
|
45266
|
-
const stuckQueuing = /no-checks-reported/i.test(result.detail ?? "");
|
|
45267
|
-
printLine(
|
|
45268
|
-
`pr checks-wait: timeout \u2014 waited ${Math.round((result.waitedMs ?? 0) / 6e4)}m, last state: ${result.detail ?? "pending"}. No check failed; re-run to keep waiting, or pass --timeout <minutes>.` + (stuckQueuing ? " Tip: check-runs never appeared \u2014 if `gh api repos/<owner>/<repo>/actions/runs?head_sha=<sha>` shows total_count=0, see docs/Guides/gh-runner-runbook.md \xA7 Zero workflow runs; otherwise mmi-live may be saturated or Actions may be failing before checkout (docs/Guides/gh-runner-runbook.md)." : "")
|
|
45269
|
-
);
|
|
45270
|
-
} else if (result.status === "rate-limited") {
|
|
45271
|
-
printLine(`pr checks-wait: rate-limited \u2014 ${result.reason ?? "REST pool below floor"}. No check failed; re-run after the pool resets.`);
|
|
45272
|
-
} else if (result.detail === "runner-infra") {
|
|
45273
|
-
printLine(`pr checks-wait: failure (runner infrastructure, NOT a test failure) \u2014 ${result.reason}`);
|
|
45274
|
-
} else if (result.detail === "stale-head") {
|
|
45275
|
-
printLine(`pr checks-wait: failure (stale PR head, NOT a test failure) \u2014 ${result.reason}`);
|
|
45276
|
-
} else if (result.detail === "zero-runs") {
|
|
45277
|
-
printLine(`pr checks-wait: failure (zero workflow runs delivered, NOT pending checks) \u2014 ${result.reason}`);
|
|
45278
|
-
} else {
|
|
45279
|
-
printLine(`pr checks-wait: ${result.status}${result.reason ? ` \u2014 ${result.reason}` : ""}${result.detail ? ` (${result.detail})` : ""}`);
|
|
45280
|
-
for (const line of failedChecksReceiptLines("pr checks-wait", result)) printLine(line);
|
|
45281
|
-
}
|
|
45282
|
-
if (result.status === "failure" || result.status === "conflicting") process.exitCode = 1;
|
|
45283
|
-
if (result.status === "timeout" || result.status === "rate-limited") process.exitCode = PR_CHECKS_TIMEOUT_EXIT_CODE;
|
|
45297
|
+
printChecksWaitResult("pr checks-wait", result, o.json);
|
|
45284
45298
|
});
|
|
45285
45299
|
pr.command("review-check <number>").description("read-only trusted review verdict check for an exact PR head").requiredOption("--repo <owner/repo>", "target repository").requiredOption("--head <sha>", "exact expected head SHA").option("--json", "machine-readable output").action(async (number, o) => {
|
|
45286
45300
|
const result = await checkPrReview(number, o.repo, o.head);
|
|
@@ -45942,6 +45956,37 @@ ${list}`);
|
|
|
45942
45956
|
}
|
|
45943
45957
|
process.exitCode = (partialCleanup.length ? 1 : void 0) ?? prMergeLocalCleanupExitCode(localCleanup) ?? postMergeReconExitCode({ boardAdvance, crossRepoFilingIssue }) ?? process.exitCode;
|
|
45944
45958
|
});
|
|
45959
|
+
return (ci2) => {
|
|
45960
|
+
ci2.command("checks-wait").description(`bounded wait for ALL check runs and commit statuses on one commit SHA \u2014 replaces raw \`gh run watch\` / \`gh pr checks --watch\` loops, which charge a request per tick and exhausted the shared 5,000/hr token (#7843). REST-only polling with ETag-cached reads and a pool floor (#3024); fails early on a confirmed zero-workflow-runs commit (#5400). Default budget ${PR_CHECKS_TIMEOUT_MS / 6e4}m; --timeout raises it. Exit 1 = a check FAILED or GitHub delivered zero runs; exit ${PR_CHECKS_TIMEOUT_EXIT_CODE} = the wait window expired or the API pool ran dry (re-arm)`).requiredOption("--sha <sha>", "full 40-hex commit SHA to wait on").option("--json", "machine-readable output").option("--repo <owner/repo>", "target repo (defaults to the current repo)").option("--timeout <minutes>", `wait budget in minutes (default ${PR_CHECKS_TIMEOUT_MS / 6e4})`).action(async (o) => {
|
|
45961
|
+
if (!/^[0-9a-f]{40}$/i.test(o.sha)) return fail("ci checks-wait: --sha must be a full 40-hex commit SHA");
|
|
45962
|
+
let timeoutMs;
|
|
45963
|
+
if (o.timeout !== void 0) {
|
|
45964
|
+
const minutes = Number(o.timeout);
|
|
45965
|
+
if (!Number.isFinite(minutes) || minutes <= 0) return fail("ci checks-wait: --timeout must be a positive number of minutes");
|
|
45966
|
+
timeoutMs = Math.round(minutes * 6e4);
|
|
45967
|
+
}
|
|
45968
|
+
const repo = await requireRepo(o.repo);
|
|
45969
|
+
const sha = o.sha.toLowerCase();
|
|
45970
|
+
const result = await waitForPrChecks({
|
|
45971
|
+
resolvePolicy: () => resolveMergeCiPolicyForCheckout(o.repo),
|
|
45972
|
+
pollChecks: () => pollRestCommitChecks(sha, repo),
|
|
45973
|
+
pollRateLimit: () => waitLoopCorePool("ci checks-wait"),
|
|
45974
|
+
checksUrl: `https://github.com/${repo}/commit/${sha}/checks`,
|
|
45975
|
+
checksDiagnosticCommand: `gh api repos/${repo}/commits/${sha}/check-runs`,
|
|
45976
|
+
pollHeadWorkflowRunCount: async () => {
|
|
45977
|
+
const read = await countHeadWorkflowRuns(sha, repo);
|
|
45978
|
+
if (read.state === "ok") return read.count;
|
|
45979
|
+
console.warn(`ci checks-wait: zero-runs probe FAILED (${read.error}) \u2014 not treating as delivery failure this cycle`);
|
|
45980
|
+
return null;
|
|
45981
|
+
},
|
|
45982
|
+
sleep: (ms) => new Promise((resolve7) => setTimeout(resolve7, ms)),
|
|
45983
|
+
log: (message2) => console.warn(message2),
|
|
45984
|
+
timeoutMs: timeoutMs ?? PR_CHECKS_TIMEOUT_MS,
|
|
45985
|
+
progress: ({ state, elapsedMs, remainingMs }) => console.warn(`ci checks-wait: ${state} \u2014 ${Math.round(elapsedMs / 1e3)}s elapsed, ${Math.round(remainingMs / 6e4)}m left`)
|
|
45986
|
+
});
|
|
45987
|
+
printChecksWaitResult("ci checks-wait", result, o.json);
|
|
45988
|
+
});
|
|
45989
|
+
};
|
|
45945
45990
|
}
|
|
45946
45991
|
|
|
45947
45992
|
// src/command-register-train-operations.ts
|
|
@@ -47014,9 +47059,10 @@ function rcRunCauseFromLog(log) {
|
|
|
47014
47059
|
function memberAnnounceSummaryFile(repo, summaryFile, memberSummaryFiles) {
|
|
47015
47060
|
return repo === SUITE_REPO ? summaryFile : memberSummaryFiles[repo];
|
|
47016
47061
|
}
|
|
47062
|
+
var suiteStateDir = (root) => (0, import_node_path43.join)(resolvePrimaryGitDir(root), "mmi-runtime", "suite");
|
|
47017
47063
|
function suiteTrainIo(root, summaryFile, memberSummaryFiles = {}) {
|
|
47018
|
-
const recordPath =
|
|
47019
|
-
const base = (0, import_node_path43.join)(
|
|
47064
|
+
const recordPath = (0, import_node_path43.join)(suiteStateDir(root), "cut.json");
|
|
47065
|
+
const base = (0, import_node_path43.join)(suiteStateDir(root), "checkouts");
|
|
47020
47066
|
const checkout = async (repo) => {
|
|
47021
47067
|
if (repo === SUITE_REPO) return root;
|
|
47022
47068
|
const target = (0, import_node_path43.join)(base, repo.split("/")[1]);
|
|
@@ -47326,7 +47372,7 @@ function suiteTrainIo(root, summaryFile, memberSummaryFiles = {}) {
|
|
|
47326
47372
|
recordMapping: async (leadTag, mapping) => {
|
|
47327
47373
|
const body = await gh(["release", "view", leadTag, "--repo", SUITE_REPO, "--json", "body", "--jq", ".body"]);
|
|
47328
47374
|
if (parseSuiteMapping(body)) return;
|
|
47329
|
-
const dir =
|
|
47375
|
+
const dir = suiteStateDir(root);
|
|
47330
47376
|
(0, import_node_fs43.mkdirSync)(dir, { recursive: true });
|
|
47331
47377
|
const file = (0, import_node_path43.join)(dir, `notes-${leadTag}.md`);
|
|
47332
47378
|
(0, import_node_fs43.writeFileSync)(file, `${body}
|
|
@@ -54485,7 +54531,7 @@ oauth.command("verify").description("probe Google authorize with an arbitrary po
|
|
|
54485
54531
|
}
|
|
54486
54532
|
if (mismatches.length) process.exitCode = 1;
|
|
54487
54533
|
});
|
|
54488
|
-
registerCollaborationCommands(program2);
|
|
54534
|
+
var registerCiChecksWait = registerCollaborationCommands(program2);
|
|
54489
54535
|
function ciAuditDeps2() {
|
|
54490
54536
|
const cfgPromise = loadConfig();
|
|
54491
54537
|
const root = hubRoot2();
|
|
@@ -54537,6 +54583,7 @@ ci.command("audit").description("read-only fleet scan: gate workflow, ruleset co
|
|
|
54537
54583
|
else console.log(renderCiAuditText(report));
|
|
54538
54584
|
if (!report.ok) process.exitCode = 1;
|
|
54539
54585
|
});
|
|
54586
|
+
registerCiChecksWait(ci);
|
|
54540
54587
|
ci.command("reconcile").description("audit + optionally apply merge settings and product ruleset activation (master-admin)").option("--json", "machine-readable output").option("--repo <owner/repo>", "reconcile one repo instead of the full registry").option("--apply", "PATCH merge settings + activate product ruleset when missing (master role required); activation is skipped while the repo's gate has never passed (#3694)").option("--park-ruleset", "stop the product ruleset enforcing without deleting it \u2014 keeps its required contexts (master role required)").action(async (o) => {
|
|
54541
54588
|
if (o.apply && o.parkRuleset) {
|
|
54542
54589
|
return fail("ci reconcile: --apply and --park-ruleset ask for opposite things; pass one");
|
package/cli/package.json
CHANGED