@mutmutco/cli 4.6.38 → 4.6.40
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 +302 -55
- package/package.json +1 -1
package/dist/main.cjs
CHANGED
|
@@ -19611,6 +19611,48 @@ function isValidSecretKey(key) {
|
|
|
19611
19611
|
function stripTrailingCRLF(value) {
|
|
19612
19612
|
return value.replace(/\r\n$|\r$|\n$/, "");
|
|
19613
19613
|
}
|
|
19614
|
+
function countCaptureGroups(source) {
|
|
19615
|
+
let count = 0;
|
|
19616
|
+
let inClass = false;
|
|
19617
|
+
for (let i = 0; i < source.length; i += 1) {
|
|
19618
|
+
const ch = source[i];
|
|
19619
|
+
if (ch === "\\") {
|
|
19620
|
+
i += 1;
|
|
19621
|
+
continue;
|
|
19622
|
+
}
|
|
19623
|
+
if (inClass) {
|
|
19624
|
+
if (ch === "]") inClass = false;
|
|
19625
|
+
continue;
|
|
19626
|
+
}
|
|
19627
|
+
if (ch === "[") {
|
|
19628
|
+
inClass = true;
|
|
19629
|
+
continue;
|
|
19630
|
+
}
|
|
19631
|
+
if (ch !== "(") continue;
|
|
19632
|
+
if (source[i + 1] !== "?") {
|
|
19633
|
+
count += 1;
|
|
19634
|
+
continue;
|
|
19635
|
+
}
|
|
19636
|
+
if (source[i + 2] === "<" && source[i + 3] !== "=" && source[i + 3] !== "!") count += 1;
|
|
19637
|
+
}
|
|
19638
|
+
return count;
|
|
19639
|
+
}
|
|
19640
|
+
function compileExtractRegex(source) {
|
|
19641
|
+
let re;
|
|
19642
|
+
try {
|
|
19643
|
+
re = new RegExp(source);
|
|
19644
|
+
} catch {
|
|
19645
|
+
return { ok: false, reason: "syntax" };
|
|
19646
|
+
}
|
|
19647
|
+
if (countCaptureGroups(source) !== 1) return { ok: false, reason: "capture-groups" };
|
|
19648
|
+
return { ok: true, re };
|
|
19649
|
+
}
|
|
19650
|
+
function extractSingleMatch(text, re) {
|
|
19651
|
+
const flags = re.flags.includes("g") ? re.flags : `${re.flags}g`;
|
|
19652
|
+
const all = [...text.matchAll(new RegExp(re.source, flags))];
|
|
19653
|
+
if (all.length !== 1) return { ok: false, count: all.length };
|
|
19654
|
+
return { ok: true, value: all[0][1] ?? "" };
|
|
19655
|
+
}
|
|
19614
19656
|
var ORG_WIDE_SLUGS = /* @__PURE__ */ new Set([ORG_INFRA_SLUG, "shared", "cloudflare", "docs", "mmi-hub"]);
|
|
19615
19657
|
function classifyTier(slug, _key) {
|
|
19616
19658
|
return ORG_WIDE_SLUGS.has(slug) ? "org" : "project";
|
|
@@ -21231,6 +21273,64 @@ async function secretsSet(deps, key, opts) {
|
|
|
21231
21273
|
}
|
|
21232
21274
|
return putSecret(deps, key, value, opts);
|
|
21233
21275
|
}
|
|
21276
|
+
async function secretsSetFromClipboard(deps, key, opts) {
|
|
21277
|
+
let value;
|
|
21278
|
+
try {
|
|
21279
|
+
if (!isValidSecretKey(key)) {
|
|
21280
|
+
deps.err(`invalid secret key ${JSON.stringify(key)}`);
|
|
21281
|
+
return false;
|
|
21282
|
+
}
|
|
21283
|
+
let re;
|
|
21284
|
+
if (opts.extract !== void 0) {
|
|
21285
|
+
const compiled = compileExtractRegex(opts.extract);
|
|
21286
|
+
if (!compiled.ok) {
|
|
21287
|
+
deps.err(
|
|
21288
|
+
compiled.reason === "syntax" ? "secrets set: --extract is not a valid regular expression \u2014 aborted (nothing written)" : "secrets set: --extract must contain exactly one capture group, e.g. '--token\\s+(\\S+)' \u2014 aborted (nothing written)"
|
|
21289
|
+
);
|
|
21290
|
+
return false;
|
|
21291
|
+
}
|
|
21292
|
+
re = compiled.re;
|
|
21293
|
+
}
|
|
21294
|
+
if (!deps.readClipboard) {
|
|
21295
|
+
deps.err("secrets set: --from-clipboard is not available in this build \u2014 aborted (nothing written)");
|
|
21296
|
+
return false;
|
|
21297
|
+
}
|
|
21298
|
+
let text;
|
|
21299
|
+
try {
|
|
21300
|
+
text = await deps.readClipboard();
|
|
21301
|
+
} catch (e) {
|
|
21302
|
+
deps.err(`secrets set: --from-clipboard: ${e.message}`);
|
|
21303
|
+
return false;
|
|
21304
|
+
}
|
|
21305
|
+
if (re) {
|
|
21306
|
+
const matched = extractSingleMatch(text, re);
|
|
21307
|
+
if (!matched.ok) {
|
|
21308
|
+
deps.err(
|
|
21309
|
+
matched.count === 0 ? "secrets set: --from-clipboard: --extract found no match (0 matches) \u2014 aborted (nothing written)" : `secrets set: --from-clipboard: --extract matched ${matched.count} times \u2014 need exactly one; aborted (nothing written)`
|
|
21310
|
+
);
|
|
21311
|
+
return false;
|
|
21312
|
+
}
|
|
21313
|
+
value = stripTrailingCRLF(matched.value);
|
|
21314
|
+
} else {
|
|
21315
|
+
value = stripTrailingCRLF(text);
|
|
21316
|
+
}
|
|
21317
|
+
if (!value) {
|
|
21318
|
+
deps.err(`secrets set: --from-clipboard: empty value for ${key} \u2014 aborted (nothing written)`);
|
|
21319
|
+
return false;
|
|
21320
|
+
}
|
|
21321
|
+
const ok = await putSecret(deps, key, value, opts);
|
|
21322
|
+
if (ok) deps.log(`set ${key} (${value.length} chars)`);
|
|
21323
|
+
return ok;
|
|
21324
|
+
} finally {
|
|
21325
|
+
if (deps.writeClipboard) {
|
|
21326
|
+
try {
|
|
21327
|
+
await deps.writeClipboard("");
|
|
21328
|
+
} catch (e) {
|
|
21329
|
+
deps.err(`secrets set: warning: could not clear the clipboard \u2014 ${e.message}`);
|
|
21330
|
+
}
|
|
21331
|
+
}
|
|
21332
|
+
}
|
|
21333
|
+
}
|
|
21234
21334
|
var DECLARE_KEY_RE = /^[A-Za-z][A-Za-z0-9_]*$/;
|
|
21235
21335
|
var DECLARE_STAGES = /* @__PURE__ */ new Set(["dev", "rc", "main"]);
|
|
21236
21336
|
var DECLARE_CONSUMERS = /* @__PURE__ */ new Set(["runtime", "build", "lambda", "actions", "agent", "box"]);
|
|
@@ -28405,10 +28505,10 @@ var rollout_plan_default = {
|
|
|
28405
28505
|
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)."
|
|
28406
28506
|
},
|
|
28407
28507
|
baseline: {
|
|
28408
|
-
version: "4.6.
|
|
28409
|
-
tag: "v4.6.
|
|
28410
|
-
commit: "
|
|
28411
|
-
npm: "@mutmutco/cli@4.6.
|
|
28508
|
+
version: "4.6.40",
|
|
28509
|
+
tag: "v4.6.40",
|
|
28510
|
+
commit: "0c850872865f",
|
|
28511
|
+
npm: "@mutmutco/cli@4.6.40"
|
|
28412
28512
|
},
|
|
28413
28513
|
exitCriterion: "fleet-n-of-n",
|
|
28414
28514
|
hubOnlyShortcut: "forbidden",
|
|
@@ -28425,14 +28525,14 @@ var rollout_plan_default = {
|
|
|
28425
28525
|
repo: "mutmutco/mmi-hub",
|
|
28426
28526
|
role: "canary",
|
|
28427
28527
|
schedule: "train",
|
|
28428
|
-
v3Target: "v4.6.
|
|
28528
|
+
v3Target: "v4.6.40"
|
|
28429
28529
|
}
|
|
28430
28530
|
],
|
|
28431
28531
|
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.",
|
|
28432
28532
|
rollback: {
|
|
28433
28533
|
independent: true,
|
|
28434
|
-
mechanism: "npm dist-tag latest -> 4.6.
|
|
28435
|
-
v3Target: "v4.6.
|
|
28534
|
+
mechanism: "npm dist-tag latest -> 4.6.40 and redeploy the Hub Lambda from tag v4.6.40 (0c850872865f); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
|
|
28535
|
+
v3Target: "v4.6.40 (@mutmutco/cli@4.6.40, tag commit 0c850872865f \u2014 last known-good release carrying the repo-index v4-only contract)"
|
|
28436
28536
|
}
|
|
28437
28537
|
},
|
|
28438
28538
|
{
|
|
@@ -44015,7 +44115,7 @@ async function submitQueueAdmission(pr, repo, head, read, write, options, resume
|
|
|
44015
44115
|
for (let readAttempt = 0; readAttempt < maxReads; readAttempt++) {
|
|
44016
44116
|
if (readAttempt) await sleep3(readAttempt * 1e3);
|
|
44017
44117
|
try {
|
|
44018
|
-
const observed = await readPrMergeQueue(pr, repo, read);
|
|
44118
|
+
const observed = await readPrMergeQueue(pr, repo, read, options.sleep);
|
|
44019
44119
|
if (observed.state === "MERGED" && observed.headRefOid === head) return markReenqueued({ mergeStatus: "merged" });
|
|
44020
44120
|
if (observed.isInMergeQueue && observed.headRefOid === head) {
|
|
44021
44121
|
const entry = observed.mergeQueueEntry;
|
|
@@ -44057,13 +44157,13 @@ async function submitQueueAdmission(pr, repo, head, read, write, options, resume
|
|
|
44057
44157
|
if (receipt && (receipt.state === "enqueued" || receipt.state === "merged")) {
|
|
44058
44158
|
if (receipt.head.toLowerCase() !== head.toLowerCase()) {
|
|
44059
44159
|
try {
|
|
44060
|
-
const observed = await readPrMergeQueue(pr, repo, read);
|
|
44160
|
+
const observed = await readPrMergeQueue(pr, repo, read, options.sleep);
|
|
44061
44161
|
superseded = observed.state === "OPEN" && !observed.isInMergeQueue;
|
|
44062
44162
|
} catch {
|
|
44063
44163
|
}
|
|
44064
44164
|
} else {
|
|
44065
44165
|
try {
|
|
44066
|
-
const observed = await readPrMergeQueue(pr, repo, read);
|
|
44166
|
+
const observed = await readPrMergeQueue(pr, repo, read, options.sleep);
|
|
44067
44167
|
if (observed.state === "OPEN" && !observed.isInMergeQueue && observed.headRefOid?.toLowerCase() === receipt.head.toLowerCase()) {
|
|
44068
44168
|
const boundMs = receipt.queueEntry ? Date.parse(receipt.queueEntry.enqueuedAt) : receipt.observedAt + UNWITNESSED_EJECTION_GRACE_MS;
|
|
44069
44169
|
const events = await readArrayPages(
|
|
@@ -44266,6 +44366,15 @@ ${list}
|
|
|
44266
44366
|
Co-authored-by: GitHub <noreply@github.com>
|
|
44267
44367
|
`;
|
|
44268
44368
|
}
|
|
44369
|
+
var WAIVER_KEYS = /^(?:Test-Policy-Override|Runbook-Unaffected)\s*:/i;
|
|
44370
|
+
function clipTrailer(trailer) {
|
|
44371
|
+
return trailer.length > 120 ? `${trailer.slice(0, 117)}...` : trailer;
|
|
44372
|
+
}
|
|
44373
|
+
function describeWaiverText(label, message2, cwd) {
|
|
44374
|
+
const block = parseTrailers(message2, cwd).filter((trailer) => WAIVER_KEYS.test(trailer));
|
|
44375
|
+
const found = block.length ? `final trailer block holds ${block.map((trailer) => `\`${clipTrailer(trailer)}\``).join(" and ")}` : "git parses no Test-Policy-Override or Runbook-Unaffected trailer there";
|
|
44376
|
+
return `${label}: ${found}`;
|
|
44377
|
+
}
|
|
44269
44378
|
function checkQueueSquashOverride(title, pr, messages, root) {
|
|
44270
44379
|
if (messages.length <= 1 || !messages.some((message2) => /^\s*Test-Policy-Override\s*:/im.test(`${message2.headline}
|
|
44271
44380
|
${message2.body}`)) || readMessageOverride2(githubQueueSquashMessage(title, pr, messages), root)) return void 0;
|
|
@@ -44399,7 +44508,8 @@ ${pull.body}`;
|
|
|
44399
44508
|
}
|
|
44400
44509
|
const requiredBody = options.bodyText ?? composedBody;
|
|
44401
44510
|
const prBodyPreservesOverrides = requiredBody != null && method === "SQUASH" && policy.body === "PR_BODY" && options.bodyText == null && prBodyPreservesCommitOverrides(messages, headline, pull.body, process.cwd());
|
|
44402
|
-
|
|
44511
|
+
const queueKeepsWaiver = options.bodyText == null && method !== "SQUASH" && Boolean(readMessageOverride2(actualMessage, process.cwd()));
|
|
44512
|
+
if (requiredBody && !prBodyPreservesOverrides && !queueKeepsWaiver && (method !== "SQUASH" || requiredBody.trim() !== body.trim())) {
|
|
44403
44513
|
if (method === "SQUASH" && policy.body === "PR_BODY" && options.bodyText == null) {
|
|
44404
44514
|
return {
|
|
44405
44515
|
kind: "refused",
|
|
@@ -44411,7 +44521,9 @@ ${pull.body}`;
|
|
|
44411
44521
|
issueTargets: [],
|
|
44412
44522
|
nextAction: `PR author: this repository squashes with PR_BODY, so place the required Test-Policy-Override trailer(s) in the PR body final trailer block (e.g. \`mmi-cli devops pr edit ${pr} --repo ${repo} --body-file .jerv/tmp/pr-${pr}-body.md\`) without a body override, then rerun \`pr land\`. Keep repository settings unchanged.`
|
|
44413
44523
|
},
|
|
44414
|
-
error:
|
|
44524
|
+
error: `queue preparation needed: repository squash policy is PR_BODY, and the PR body does not carry the required Test-Policy-Override trailer(s) in its final Git-recognized trailer block \u2014 ${describeWaiverText("the PR body", pull.body, process.cwd())}; ${describeWaiverText("the source commit messages", messages.map((message2) => `${message2.headline}
|
|
44525
|
+
|
|
44526
|
+
${message2.body}`).join("\n\n"), process.cwd())}`
|
|
44415
44527
|
}
|
|
44416
44528
|
};
|
|
44417
44529
|
}
|
|
@@ -44420,9 +44532,12 @@ ${pull.body}`;
|
|
|
44420
44532
|
return keys.length ? keys.join(", ") : "none";
|
|
44421
44533
|
};
|
|
44422
44534
|
const source = options.bodyText != null ? "the explicit body override" : "the body composed from the source commit messages";
|
|
44535
|
+
const sentLabel = method === "SQUASH" ? `squash ${policy.body ?? "unknown"}, ${messages.length} commit message${messages.length === 1 ? "" : "s"}` : `${method}${repository.merge_commit_message === "PR_BODY" ? " + PR body" : ""}`;
|
|
44423
44536
|
const detail = `the requested sanitized body or trailer arrangement cannot be sent to queue admission: queue merge method ${method}, squash body policy ${policy.body ?? "unknown"}; required body is ${source} (trailer keys: ${trailerKeys(`${headline}
|
|
44424
44537
|
|
|
44425
|
-
${requiredBody}`)}), but the message the queue would send carries trailer keys: ${trailerKeys(actualMessage)}
|
|
44538
|
+
${requiredBody}`)}), but the message the queue would send carries trailer keys: ${trailerKeys(actualMessage)}. ${describeWaiverText(`the message the queue sends (${sentLabel})`, actualMessage, process.cwd())}; ${describeWaiverText("the source commit messages", messages.map((message2) => `${message2.headline}
|
|
44539
|
+
|
|
44540
|
+
${message2.body}`).join("\n\n"), process.cwd())}.`;
|
|
44426
44541
|
const next = options.bodyText != null ? `PR author: a merge queue accepts no body override; drop --body/--squash-body-file and place the required trailer(s) where the queue's ${method}${method === "SQUASH" ? ` (${policy.body})` : ""} message reads them, then rerun \`mmi-cli devops pr land ${pr} --repo ${repo}\`. Keep repository settings unchanged.` : method !== "SQUASH" ? `PR author: the queue's ${method} method keeps the original commit messages, so the required trailer(s) must sit in a source commit message's final trailer block; amend the commit, push, re-run checks and \`mmi-cli devops pr land ${pr} --repo ${repo}\`. Keep repository settings unchanged.` : policy.body === "BLANK" ? `PR author: squash body policy BLANK sends an empty body, so no trailer from the commits or PR body reaches the queue commit; the waiver cannot survive queue admission with unchanged repository settings \u2014 remove the need for the override or ask a maintainer. Keep repository settings unchanged.` : `PR author: squash body policy ${policy.body} does not reproduce the composed body; consolidate the required trailer(s) into one source commit message's final trailer block, push, re-run checks and \`mmi-cli devops pr land ${pr} --repo ${repo}\`. Keep repository settings unchanged.`;
|
|
44427
44542
|
const caveat = " GitHub may append coauthors even to one source commit, so source consolidation alone does not prove the generated message passes test policy; the combined queue candidate must pass with the shared trailer reader.";
|
|
44428
44543
|
return { kind: "refused", result: preparation("queue-message-override", [], detail, next + caveat) };
|
|
@@ -44472,7 +44587,7 @@ async function abandonQueueAdmission(pr, repo, options = {}) {
|
|
|
44472
44587
|
}
|
|
44473
44588
|
let snapshot;
|
|
44474
44589
|
try {
|
|
44475
|
-
snapshot = await readPrMergeQueue(pr, repo, options.read ?? actorReadApi);
|
|
44590
|
+
snapshot = await readPrMergeQueue(pr, repo, options.read ?? actorReadApi, options.sleep);
|
|
44476
44591
|
} catch (error) {
|
|
44477
44592
|
return refuse(`the PR and queue state could not be read (${error.message}); the admission is unchanged`);
|
|
44478
44593
|
}
|
|
@@ -44497,13 +44612,19 @@ function decideQueueMergeRoute(hasQueue, method, headRef) {
|
|
|
44497
44612
|
if (!hasQueue) return "normal";
|
|
44498
44613
|
return method === "--merge" && /^(release-align|hotfix-fold)\//.test(headRef) ? "admin-true-merge" : "pr-land";
|
|
44499
44614
|
}
|
|
44500
|
-
async function readPrMergeQueue(pr, repo, gh2 = actorReadApi) {
|
|
44615
|
+
async function readPrMergeQueue(pr, repo, gh2 = actorReadApi, sleep2 = (ms) => new Promise((resolve8) => setTimeout(resolve8, ms))) {
|
|
44501
44616
|
if (!/^\d+$/.test(pr)) throw new Error("merge queue read requires a PR number");
|
|
44502
|
-
const
|
|
44503
|
-
|
|
44504
|
-
|
|
44505
|
-
|
|
44506
|
-
|
|
44617
|
+
const fields = `pullRequest(number:${pr}) { state isInMergeQueue mergeQueueEntry { state position enqueuedAt headCommit { oid } } autoMergeRequest { enabledAt } headRefOid }`;
|
|
44618
|
+
let result;
|
|
44619
|
+
for (let attempt = 0; ; attempt++) {
|
|
44620
|
+
try {
|
|
44621
|
+
result = await queueGraphql(repo, fields, gh2);
|
|
44622
|
+
break;
|
|
44623
|
+
} catch (error) {
|
|
44624
|
+
if (attempt >= 2 || !isUpstreamGitHubFault(execErrorText(error))) throw error;
|
|
44625
|
+
await sleep2(2e3 * (attempt + 1));
|
|
44626
|
+
}
|
|
44627
|
+
}
|
|
44507
44628
|
if (!result.pullRequest) throw new Error(`merge queue PR #${pr} not found`);
|
|
44508
44629
|
const entry = result.pullRequest.mergeQueueEntry;
|
|
44509
44630
|
if (entry && (entry.enqueuedAt !== void 0 && !Number.isFinite(Date.parse(entry.enqueuedAt)) || entry.headCommit && !/^[a-f0-9]{40}$/i.test(entry.headCommit.oid))) throw new Error("queue entry identity is unreadable");
|
|
@@ -44932,7 +45053,7 @@ async function dispatchWorkflow(repo, workflow, ref, inputs, deps) {
|
|
|
44932
45053
|
const fields = ["-f", `ref=${ref}`];
|
|
44933
45054
|
const names = /* @__PURE__ */ new Set();
|
|
44934
45055
|
for (const input of inputs) {
|
|
44935
|
-
const match = /^([A-Za-z_][A-Za-z0-9_]{0,63})=([^\r\n]{0,2048})$/.exec(input);
|
|
45056
|
+
const match = /^([A-Za-z_][A-Za-z0-9_-]{0,63})=([^\r\n]{0,2048})$/.exec(input);
|
|
44936
45057
|
if (!match || names.has(match[1])) throw new Error("run dispatch: invalid or duplicate input");
|
|
44937
45058
|
names.add(match[1]);
|
|
44938
45059
|
fields.push("-f", `inputs[${match[1]}]=${match[2]}`);
|
|
@@ -47169,7 +47290,7 @@ async function assignPersistedPortRange(repo, slug, reg, opts) {
|
|
|
47169
47290
|
|
|
47170
47291
|
// src/box-commands.ts
|
|
47171
47292
|
var import_node_fs39 = require("node:fs");
|
|
47172
|
-
var
|
|
47293
|
+
var import_node_child_process13 = require("node:child_process");
|
|
47173
47294
|
var import_node_os20 = require("node:os");
|
|
47174
47295
|
var import_node_path36 = require("node:path");
|
|
47175
47296
|
|
|
@@ -47397,6 +47518,7 @@ init_cli_shared();
|
|
|
47397
47518
|
|
|
47398
47519
|
// src/secrets-commands.ts
|
|
47399
47520
|
var import_node_fs37 = require("node:fs");
|
|
47521
|
+
var import_node_child_process12 = require("node:child_process");
|
|
47400
47522
|
var import_node_path34 = require("node:path");
|
|
47401
47523
|
var import_node_os19 = require("node:os");
|
|
47402
47524
|
init_cli_shared();
|
|
@@ -48663,9 +48785,122 @@ function makeSecretsDeps(cfg) {
|
|
|
48663
48785
|
slug: async () => (await repoProject(cfg)).toLowerCase(),
|
|
48664
48786
|
readSecretValue: () => readSecretStdin(),
|
|
48665
48787
|
log: (m) => console.log(m),
|
|
48666
|
-
err: (m) => console.error(m)
|
|
48788
|
+
err: (m) => console.error(m),
|
|
48789
|
+
// #10056: the sanctioned clipboard handoff — read/write the OS clipboard directly, never through a
|
|
48790
|
+
// shell, so a pasted value cannot be re-parsed by cmd.exe/PowerShell.
|
|
48791
|
+
readClipboard: () => readClipboardText(),
|
|
48792
|
+
writeClipboard: (value) => clearClipboard(value)
|
|
48667
48793
|
};
|
|
48668
48794
|
}
|
|
48795
|
+
var CLIPBOARD_TIMEOUT_MS = 1e4;
|
|
48796
|
+
function clipboardReadCommands(platform2) {
|
|
48797
|
+
if (platform2 === "win32") return [{ cmd: "powershell", args: ["-NoProfile", "-Command", "Get-Clipboard -Raw"] }];
|
|
48798
|
+
if (platform2 === "darwin") return [{ cmd: "pbpaste", args: [] }];
|
|
48799
|
+
return [
|
|
48800
|
+
{ cmd: "wl-paste", args: ["-n"] },
|
|
48801
|
+
{ cmd: "xclip", args: ["-selection", "clipboard", "-o"] }
|
|
48802
|
+
];
|
|
48803
|
+
}
|
|
48804
|
+
function clipboardClearCommands(platform2) {
|
|
48805
|
+
if (platform2 === "win32") return [{ cmd: "powershell", args: ["-NoProfile", "-Command", "Set-Clipboard -Value ' '"] }];
|
|
48806
|
+
if (platform2 === "darwin") return [{ cmd: "pbcopy", args: [], input: "" }];
|
|
48807
|
+
return [
|
|
48808
|
+
{ cmd: "wl-copy", args: ["--clear"] },
|
|
48809
|
+
{ cmd: "xclip", args: ["-selection", "clipboard"], input: "" }
|
|
48810
|
+
];
|
|
48811
|
+
}
|
|
48812
|
+
function clipboardFailure(command, error) {
|
|
48813
|
+
const code = error.code;
|
|
48814
|
+
if (code === "ENOENT") return `${command.cmd}: not found`;
|
|
48815
|
+
if (typeof code === "number") return `${command.cmd}: exit ${code}`;
|
|
48816
|
+
return `${command.cmd}: could not run`;
|
|
48817
|
+
}
|
|
48818
|
+
function runClipboardCommand(command) {
|
|
48819
|
+
return new Promise((resolveRun, rejectRun) => {
|
|
48820
|
+
const child2 = (0, import_node_child_process12.spawn)(command.cmd, command.args, {
|
|
48821
|
+
shell: false,
|
|
48822
|
+
windowsHide: true,
|
|
48823
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
48824
|
+
});
|
|
48825
|
+
const out = [];
|
|
48826
|
+
let settled2 = false;
|
|
48827
|
+
const settle = (error, value) => {
|
|
48828
|
+
if (settled2) return;
|
|
48829
|
+
settled2 = true;
|
|
48830
|
+
clearTimeout(timer);
|
|
48831
|
+
if (error) rejectRun(error);
|
|
48832
|
+
else resolveRun(value ?? "");
|
|
48833
|
+
};
|
|
48834
|
+
const timer = setTimeout(() => {
|
|
48835
|
+
child2.kill();
|
|
48836
|
+
settle(new Error(`${command.cmd}: timed out`));
|
|
48837
|
+
}, CLIPBOARD_TIMEOUT_MS);
|
|
48838
|
+
timer.unref?.();
|
|
48839
|
+
child2.stdout?.on("data", (chunk) => out.push(chunk));
|
|
48840
|
+
child2.stderr?.on("data", () => {
|
|
48841
|
+
});
|
|
48842
|
+
child2.on("error", (e) => settle(e instanceof Error ? e : new Error(String(e))));
|
|
48843
|
+
child2.on("close", (code) => {
|
|
48844
|
+
if (code === 0) settle(void 0, Buffer.concat(out).toString("utf8"));
|
|
48845
|
+
else settle(Object.assign(new Error(`${command.cmd}: exit ${code}`), { code }));
|
|
48846
|
+
});
|
|
48847
|
+
child2.stdin?.on("error", () => {
|
|
48848
|
+
});
|
|
48849
|
+
child2.stdin?.end(command.input ?? "");
|
|
48850
|
+
});
|
|
48851
|
+
}
|
|
48852
|
+
async function readClipboardText(platform2 = process.platform) {
|
|
48853
|
+
const failures = [];
|
|
48854
|
+
for (const command of clipboardReadCommands(platform2)) {
|
|
48855
|
+
try {
|
|
48856
|
+
return await runClipboardCommand(command);
|
|
48857
|
+
} catch (e) {
|
|
48858
|
+
failures.push(clipboardFailure(command, e));
|
|
48859
|
+
}
|
|
48860
|
+
}
|
|
48861
|
+
throw new Error(`could not read the clipboard (${failures.join(", ")})`);
|
|
48862
|
+
}
|
|
48863
|
+
async function clearClipboard(value, platform2 = process.platform) {
|
|
48864
|
+
const failures = [];
|
|
48865
|
+
for (const command of clipboardClearCommands(platform2)) {
|
|
48866
|
+
try {
|
|
48867
|
+
await runClipboardCommand({ ...command, ...command.input !== void 0 ? { input: value } : {} });
|
|
48868
|
+
return;
|
|
48869
|
+
} catch (e) {
|
|
48870
|
+
failures.push(clipboardFailure(command, e));
|
|
48871
|
+
}
|
|
48872
|
+
}
|
|
48873
|
+
throw new Error(`${failures.join(", ")}`);
|
|
48874
|
+
}
|
|
48875
|
+
function clipboardSourceRefusal(fromClipboard, stdinHasData) {
|
|
48876
|
+
if (!fromClipboard || !stdinHasData) return null;
|
|
48877
|
+
return "secrets set: --from-clipboard conflicts with piped stdin \u2014 remove the pipe (the value comes from the clipboard), or drop --from-clipboard and pipe it";
|
|
48878
|
+
}
|
|
48879
|
+
async function stdinCarriesData(timeoutMs = 50) {
|
|
48880
|
+
const stdin = process.stdin;
|
|
48881
|
+
if (stdin.isTTY) return false;
|
|
48882
|
+
if (stdin.readableLength > 0) return true;
|
|
48883
|
+
return new Promise((resolveProbe) => {
|
|
48884
|
+
let settled2 = false;
|
|
48885
|
+
const finish = (value) => {
|
|
48886
|
+
if (settled2) return;
|
|
48887
|
+
settled2 = true;
|
|
48888
|
+
clearTimeout(timer);
|
|
48889
|
+
stdin.off("readable", onReadable);
|
|
48890
|
+
stdin.off("end", onEnd);
|
|
48891
|
+
resolveProbe(value);
|
|
48892
|
+
};
|
|
48893
|
+
const onReadable = () => {
|
|
48894
|
+
if (stdin.readableLength > 0) finish(true);
|
|
48895
|
+
};
|
|
48896
|
+
const onEnd = () => finish(false);
|
|
48897
|
+
const timer = setTimeout(() => finish(stdin.readableLength > 0), timeoutMs);
|
|
48898
|
+
timer.unref?.();
|
|
48899
|
+
stdin.once("readable", onReadable);
|
|
48900
|
+
stdin.once("end", onEnd);
|
|
48901
|
+
stdin.once("error", () => finish(false));
|
|
48902
|
+
});
|
|
48903
|
+
}
|
|
48669
48904
|
async function withSecrets(run) {
|
|
48670
48905
|
const cfg = await loadConfig();
|
|
48671
48906
|
if (!cfg.sagaApiUrl) {
|
|
@@ -48812,10 +49047,22 @@ function registerSecretsCommands(program3) {
|
|
|
48812
49047
|
if (!ok) process.exitCode = 1;
|
|
48813
49048
|
}));
|
|
48814
49049
|
const setHandler = (key, o) => withSecrets(async (d) => {
|
|
49050
|
+
if (o.fromClipboard) {
|
|
49051
|
+
const refusal = clipboardSourceRefusal(true, await stdinCarriesData());
|
|
49052
|
+
if (refusal) return fail(refusal);
|
|
49053
|
+
const ok2 = await secretsSetFromClipboard(d, key, {
|
|
49054
|
+
...o.repo !== void 0 ? { repo: o.repo } : {},
|
|
49055
|
+
...o.slug !== void 0 ? { slug: o.slug } : {},
|
|
49056
|
+
...o.extract !== void 0 ? { extract: o.extract } : {}
|
|
49057
|
+
});
|
|
49058
|
+
if (!ok2) process.exitCode = 1;
|
|
49059
|
+
return;
|
|
49060
|
+
}
|
|
49061
|
+
if (o.extract !== void 0) return fail("secrets set: --extract needs --from-clipboard (it isolates the value inside copied text)");
|
|
48815
49062
|
const ok = await secretsSet(d, key, o);
|
|
48816
49063
|
if (!ok) process.exitCode = 1;
|
|
48817
49064
|
});
|
|
48818
|
-
secrets.command("set <key>").description("write/rotate a secret; value from stdin (never an argument). DECLARE-FIRST (#2528): the key must be a declared catalog coordinate \u2014 bare <KEY> = the stageless canonical, <stage>/<KEY> = a declared per-stage override; undeclared writes are rejected with the fix. --slug _org writes an org-infra <provider>/<KEY> coordinate (#3298) \u2014 master or an exact grant, declare-first enforced server-side").option("--repo <owner/repo>", "target repo (defaults to the current repo)").option("--slug <slug>", "org-infra namespace (e.g. _org) for the value write \u2014 master or an exact grant (#3298)").action(setHandler);
|
|
49065
|
+
secrets.command("set <key>").description("write/rotate a secret; value from stdin (never an argument). DECLARE-FIRST (#2528): the key must be a declared catalog coordinate \u2014 bare <KEY> = the stageless canonical, <stage>/<KEY> = a declared per-stage override; undeclared writes are rejected with the fix. --slug _org writes an org-infra <provider>/<KEY> coordinate (#3298) \u2014 master or an exact grant, declare-first enforced server-side. --from-clipboard takes the value from the OS clipboard instead of stdin, extracts it with --extract, and CLEARS the clipboard afterwards \u2014 the sanctioned handoff for a secret embedded in copied text (#10056)").option("--repo <owner/repo>", "target repo (defaults to the current repo)").option("--slug <slug>", "org-infra namespace (e.g. _org) for the value write \u2014 master or an exact grant (#3298)").option("--from-clipboard", "read the value from the OS clipboard instead of stdin: powershell Get-Clipboard / pbpaste / wl-paste (xclip fallback). The clipboard is overwritten on EVERY path (success, no match, failed write). Conflicts with piped stdin").option("--extract <regex>", "with --from-clipboard: a regex with EXACTLY ONE capture group whose single match inside the copied text is the value, e.g. --extract '--token\\s+(\\S+)'. Zero or 2+ matches are refused (the count is reported, the text never is). Without --extract the whole clipboard, minus one trailing newline, is the value").action(setHandler);
|
|
48819
49066
|
secrets.command("copy").description("copy provider keys between stages in your own project vault (audit-logged; encryption keys blocked)").requiredOption("--from <stage>", "source tier: dev, rc, or main").requiredOption("--to <stage>", "destination tier: dev, rc, or main").requiredOption("--keys <names>", "comma-separated secret names (encryption keys blocked)").option("--dry-run", "report copies without writing").option("--repo <owner/repo>", "target repo (defaults to the current repo)").action((o) => withSecrets(async (d) => {
|
|
48820
49067
|
const stages = ["dev", "rc", "main"];
|
|
48821
49068
|
if (!stages.includes(o.from) || !stages.includes(o.to)) {
|
|
@@ -49641,7 +49888,7 @@ var UsageError = class extends Error {
|
|
|
49641
49888
|
var UnreadableError = class extends Error {
|
|
49642
49889
|
};
|
|
49643
49890
|
function hubGitShow(ref) {
|
|
49644
|
-
const git3 = (args) => (0,
|
|
49891
|
+
const git3 = (args) => (0, import_node_child_process13.execFileSync)("git", args, { maxBuffer: 64 * 1024 * 1024, stdio: ["ignore", "pipe", "pipe"], windowsHide: true });
|
|
49645
49892
|
try {
|
|
49646
49893
|
git3(["cat-file", "-e", `HEAD:${MANIFEST_PATH}`]);
|
|
49647
49894
|
} catch {
|
|
@@ -49655,7 +49902,7 @@ function runOnBox(found, script) {
|
|
|
49655
49902
|
try {
|
|
49656
49903
|
const recipe = (0, import_node_path36.join)(dir, "recipe.sh");
|
|
49657
49904
|
(0, import_node_fs39.writeFileSync)(recipe, sshRecipeScript(found, "sh -s"), "utf8");
|
|
49658
|
-
const r = (0,
|
|
49905
|
+
const r = (0, import_node_child_process13.spawnSync)("bash", [recipe], { input: script, encoding: "utf8", maxBuffer: 16 * 1024 * 1024, timeout: 18e4, windowsHide: true });
|
|
49659
49906
|
if (r.status !== 0) {
|
|
49660
49907
|
throw new UnreadableError(`box control: the ssh session to ${found.name} failed (exit ${r.status ?? r.signal}): ${(r.stderr || "").trim().split("\n").slice(-3).join(" | ")}`);
|
|
49661
49908
|
}
|
|
@@ -54412,7 +54659,7 @@ async function runRcDataSwitch(deps, opts) {
|
|
|
54412
54659
|
}
|
|
54413
54660
|
|
|
54414
54661
|
// src/suite-train-io.ts
|
|
54415
|
-
var
|
|
54662
|
+
var import_node_child_process20 = require("node:child_process");
|
|
54416
54663
|
var import_node_path52 = require("node:path");
|
|
54417
54664
|
var import_node_fs55 = require("node:fs");
|
|
54418
54665
|
var import_node_path53 = require("node:path");
|
|
@@ -56001,13 +56248,13 @@ async function findInFlightHotfixVersion(deps, ctx, latestMainTag, workflows = H
|
|
|
56001
56248
|
}
|
|
56002
56249
|
|
|
56003
56250
|
// src/hotfix-coverage.ts
|
|
56004
|
-
var
|
|
56251
|
+
var import_node_child_process14 = require("node:child_process");
|
|
56005
56252
|
var CHERRY_TRAILER = /\(cherry picked from commit ([0-9a-f]{7,40})\)/g;
|
|
56006
56253
|
var GIT_MAX_BUFFER = 512 * 1024 * 1024;
|
|
56007
56254
|
function checkHotfixCoverage(options = {}) {
|
|
56008
56255
|
const { cwd = process.cwd(), mainRef = "origin/main", rcRef = "origin/rc", manifestPaths = [] } = options;
|
|
56009
56256
|
const ack = (options.ack ?? []).filter(Boolean);
|
|
56010
|
-
const git3 = options.git ?? ((args, opts) => (0,
|
|
56257
|
+
const git3 = options.git ?? ((args, opts) => (0, import_node_child_process14.execFileSync)("git", args, { cwd, encoding: "utf8", input: opts?.input, stdio: ["pipe", "pipe", "pipe"], maxBuffer: GIT_MAX_BUFFER }));
|
|
56011
56258
|
const revList = (range) => {
|
|
56012
56259
|
const out = git3(["rev-list", "--no-merges", range]).trim();
|
|
56013
56260
|
return out ? out.split("\n") : [];
|
|
@@ -56075,7 +56322,7 @@ function checkHotfixCoverage(options = {}) {
|
|
|
56075
56322
|
}
|
|
56076
56323
|
function checkHotfixCarries(options) {
|
|
56077
56324
|
const { cwd = process.cwd(), branch, baseRef, targets } = options;
|
|
56078
|
-
const git3 = options.git ?? ((args, opts) => (0,
|
|
56325
|
+
const git3 = options.git ?? ((args, opts) => (0, import_node_child_process14.execFileSync)("git", args, { cwd, encoding: "utf8", input: opts?.input, stdio: ["pipe", "pipe", "pipe"], maxBuffer: GIT_MAX_BUFFER }));
|
|
56079
56326
|
const isAncestor = (sha, ref) => {
|
|
56080
56327
|
try {
|
|
56081
56328
|
git3(["merge-base", "--is-ancestor", sha, ref]);
|
|
@@ -57962,7 +58209,7 @@ function prTitleRefusal(title) {
|
|
|
57962
58209
|
}
|
|
57963
58210
|
|
|
57964
58211
|
// src/command-register-collaboration.ts
|
|
57965
|
-
var
|
|
58212
|
+
var import_node_child_process19 = require("node:child_process");
|
|
57966
58213
|
var import_node_fs54 = require("node:fs");
|
|
57967
58214
|
var import_promises9 = require("node:fs/promises");
|
|
57968
58215
|
init_clean_exit();
|
|
@@ -59500,7 +59747,7 @@ async function readAppApi(path2, runner = apiReadRunner) {
|
|
|
59500
59747
|
return log ? Buffer.from(body, "latin1").toString("utf8") : out;
|
|
59501
59748
|
}
|
|
59502
59749
|
function registerApiReadCommands(program3, overrides) {
|
|
59503
|
-
const
|
|
59750
|
+
const spawn8 = overrides?.runner ?? apiReadRunner;
|
|
59504
59751
|
const jqRun = overrides?.jqRunner ?? systemJqRunner;
|
|
59505
59752
|
let bindings = [];
|
|
59506
59753
|
const runGet = async (req, o) => {
|
|
@@ -59520,7 +59767,7 @@ function registerApiReadCommands(program3, overrides) {
|
|
|
59520
59767
|
let body;
|
|
59521
59768
|
try {
|
|
59522
59769
|
body = await runApiGet(
|
|
59523
|
-
async (args, timeoutMs) => zip ?
|
|
59770
|
+
async (args, timeoutMs) => zip ? spawn8(args, ZIP_TIMEOUT_MS, env, true) : spawn8(args, timeoutMs, env),
|
|
59524
59771
|
req.path,
|
|
59525
59772
|
o.accept
|
|
59526
59773
|
);
|
|
@@ -59766,7 +60013,7 @@ function registerRunLogRead(run, runner) {
|
|
|
59766
60013
|
|
|
59767
60014
|
// src/app-read-broker.ts
|
|
59768
60015
|
init_cli_shared();
|
|
59769
|
-
var
|
|
60016
|
+
var import_node_child_process15 = require("node:child_process");
|
|
59770
60017
|
var OWNER_REPO_RE = /^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/;
|
|
59771
60018
|
var JSON_FIELD_RE = /^[A-Za-z0-9_,]+$/;
|
|
59772
60019
|
var ID_RE = /^\d+$/;
|
|
@@ -59852,7 +60099,7 @@ function formatJqFailureMessage(code, stderr) {
|
|
|
59852
60099
|
return `${base} \u2014 the expression is handed to jq verbatim (mmi-cli never re-quotes it), so if a shell or seat layer collapsed a backslash, use an escape-free form such as \`test("bundle[.]css")\` or \`contains("bundle.css")\`, or drop --jq and filter the JSON locally`;
|
|
59853
60100
|
}
|
|
59854
60101
|
var systemJqRunner = (expr, input, env, bindings) => new Promise((resolveOut, reject2) => {
|
|
59855
|
-
const child2 = (0,
|
|
60102
|
+
const child2 = (0, import_node_child_process15.spawn)("jq", [...process.platform === "win32" ? ["--binary"] : [], "-r", "-c", ...(bindings ?? []).flatMap((b) => [b.kind, b.name, b.value]), expr], { env, stdio: ["pipe", "pipe", "pipe"], windowsHide: true });
|
|
59856
60103
|
let stdout = "";
|
|
59857
60104
|
let stderr = "";
|
|
59858
60105
|
child2.stdout.setEncoding("utf8").on("data", (chunk) => {
|
|
@@ -61067,7 +61314,7 @@ function registerPrLifecycleCommands(program3) {
|
|
|
61067
61314
|
}
|
|
61068
61315
|
|
|
61069
61316
|
// src/review-verdict.ts
|
|
61070
|
-
var
|
|
61317
|
+
var import_node_child_process16 = require("node:child_process");
|
|
61071
61318
|
var import_node_fs49 = require("node:fs");
|
|
61072
61319
|
var import_node_os25 = require("node:os");
|
|
61073
61320
|
var import_node_path46 = require("node:path");
|
|
@@ -61167,8 +61414,8 @@ async function checkPrReview(number, repo, head, deps = {
|
|
|
61167
61414
|
}
|
|
61168
61415
|
function computePrPatchId(number, repo) {
|
|
61169
61416
|
return new Promise((resolve8, reject2) => {
|
|
61170
|
-
const gh2 = (0,
|
|
61171
|
-
const git3 = (0,
|
|
61417
|
+
const gh2 = (0, import_node_child_process16.spawn)("gh", ["pr", "diff", number, "--repo", repo], { windowsHide: true, stdio: ["ignore", "pipe", "pipe"] });
|
|
61418
|
+
const git3 = (0, import_node_child_process16.spawn)("git", ["patch-id", "--stable"], { windowsHide: true, stdio: ["pipe", "pipe", "pipe"] });
|
|
61172
61419
|
let out = "";
|
|
61173
61420
|
let ghErr = "";
|
|
61174
61421
|
let gitErr = "";
|
|
@@ -61393,7 +61640,7 @@ async function observePrCreateClaims(body, repoOption, deps = {}) {
|
|
|
61393
61640
|
}
|
|
61394
61641
|
|
|
61395
61642
|
// src/pr-create-docs-check.ts
|
|
61396
|
-
var
|
|
61643
|
+
var import_node_child_process17 = require("node:child_process");
|
|
61397
61644
|
init_cli_shared();
|
|
61398
61645
|
var GIT_TIMEOUT_MS2 = 15e3;
|
|
61399
61646
|
function catFileBatch(root, ref, paths) {
|
|
@@ -61401,7 +61648,7 @@ function catFileBatch(root, ref, paths) {
|
|
|
61401
61648
|
return new Promise((resolve8) => {
|
|
61402
61649
|
const chunks = [];
|
|
61403
61650
|
let settled2 = false;
|
|
61404
|
-
const child2 = (0,
|
|
61651
|
+
const child2 = (0, import_node_child_process17.spawn)("git", ["-C", root, "cat-file", "--batch", "--buffer"], { windowsHide: true });
|
|
61405
61652
|
const finish = (ok = false) => {
|
|
61406
61653
|
if (settled2) return;
|
|
61407
61654
|
settled2 = true;
|
|
@@ -61740,7 +61987,7 @@ var import_node_path49 = require("node:path");
|
|
|
61740
61987
|
init_cli_shared();
|
|
61741
61988
|
|
|
61742
61989
|
// src/stage-runner.ts
|
|
61743
|
-
var
|
|
61990
|
+
var import_node_child_process18 = require("node:child_process");
|
|
61744
61991
|
var import_node_fs51 = require("node:fs");
|
|
61745
61992
|
var import_node_path48 = require("node:path");
|
|
61746
61993
|
var import_node_net = require("node:net");
|
|
@@ -61911,7 +62158,7 @@ function stageComposeFileEnv(files) {
|
|
|
61911
62158
|
}
|
|
61912
62159
|
|
|
61913
62160
|
// src/stage-runner.ts
|
|
61914
|
-
var execFileP3 = (0, import_node_util5.promisify)(
|
|
62161
|
+
var execFileP3 = (0, import_node_util5.promisify)(import_node_child_process18.execFile);
|
|
61915
62162
|
var DOCKER_TIMEOUT_MS = 15e3;
|
|
61916
62163
|
function stageBash() {
|
|
61917
62164
|
if (process.platform !== "win32") return "bash";
|
|
@@ -62555,7 +62802,7 @@ async function startStage(config = {}, opts = {}) {
|
|
|
62555
62802
|
let up = sub(config.up.trim());
|
|
62556
62803
|
if (opts.forceRecreate) up = appendForceRecreate(up);
|
|
62557
62804
|
const identity = await resolveStageIdentity(cwd);
|
|
62558
|
-
const child2 = (0,
|
|
62805
|
+
const child2 = (0, import_node_child_process18.spawn)(bash, ["-c", up], {
|
|
62559
62806
|
cwd,
|
|
62560
62807
|
// POSIX-only: the process group exists for the group-kill in stopStage. On win32 teardown is
|
|
62561
62808
|
// `taskkill /T /F` (no group needed), and detached+shell defeats windowsHide — every spawn would
|
|
@@ -63688,7 +63935,7 @@ function scheduleRelatedDiscovery(o) {
|
|
|
63688
63935
|
try {
|
|
63689
63936
|
const args = ["issue", "discover-related", "--number", String(o.number), "--title", o.title, "--body", o.body, "--fail-soft"];
|
|
63690
63937
|
if (o.repo) args.push("--repo", o.repo);
|
|
63691
|
-
spawnDetachedSelf(args, { spawn:
|
|
63938
|
+
spawnDetachedSelf(args, { spawn: import_node_child_process19.spawn, execPath: process.execPath, scriptPath: process.argv[1] }, { cwd: process.cwd() });
|
|
63692
63939
|
} catch {
|
|
63693
63940
|
}
|
|
63694
63941
|
}
|
|
@@ -66672,7 +66919,7 @@ function suiteTrainIo(root, summaryFile, memberSummaryFiles = {}, summaryFileTr,
|
|
|
66672
66919
|
if (repo === SUITE_REPO) return inTrain(repo, (deps) => rcandInCheckout(repo, deps, previousRc, rcWasAbsent));
|
|
66673
66920
|
const target = await checkout(repo);
|
|
66674
66921
|
return new Promise((resolveResult, reject2) => {
|
|
66675
|
-
const child2 = (0,
|
|
66922
|
+
const child2 = (0, import_node_child_process20.fork)((0, import_node_path52.resolve)(process.argv[1]), ["devops", "suite", "member-rcand-internal", repo, previousRc ?? "", ...rcWasAbsent ? ["--rc-was-absent"] : []], {
|
|
66676
66923
|
cwd: target,
|
|
66677
66924
|
stdio: ["ignore", "inherit", "inherit", "ipc"],
|
|
66678
66925
|
execArgv: []
|
|
@@ -67293,7 +67540,7 @@ function registerJevCommands(program3) {
|
|
|
67293
67540
|
}
|
|
67294
67541
|
|
|
67295
67542
|
// src/packages-adopt-export.ts
|
|
67296
|
-
var
|
|
67543
|
+
var import_node_child_process21 = require("node:child_process");
|
|
67297
67544
|
var import_node_fs57 = require("node:fs");
|
|
67298
67545
|
var import_node_os26 = require("node:os");
|
|
67299
67546
|
var import_node_path54 = require("node:path");
|
|
@@ -67950,7 +68197,7 @@ async function adoptExport(opts, deps) {
|
|
|
67950
68197
|
(0, import_node_fs57.rmSync)(work, { recursive: true, force: true });
|
|
67951
68198
|
}
|
|
67952
68199
|
}
|
|
67953
|
-
var execFileBuffer = (0, import_node_util6.promisify)(
|
|
68200
|
+
var execFileBuffer = (0, import_node_util6.promisify)(import_node_child_process21.execFile);
|
|
67954
68201
|
var MAX_OUTPUT = 200 * 1024 * 1024;
|
|
67955
68202
|
async function findPython() {
|
|
67956
68203
|
for (const bin of ["python3", "python"]) {
|
|
@@ -72516,7 +72763,7 @@ async function resolveWhoami(deps) {
|
|
|
72516
72763
|
var import_node_path64 = require("node:path");
|
|
72517
72764
|
|
|
72518
72765
|
// src/doc-refs-command-source.ts
|
|
72519
|
-
var
|
|
72766
|
+
var import_node_child_process22 = require("node:child_process");
|
|
72520
72767
|
var import_node_fs62 = require("node:fs");
|
|
72521
72768
|
var import_node_path58 = require("node:path");
|
|
72522
72769
|
var IN_PROCESS_SOURCE = "in-process";
|
|
@@ -72537,7 +72784,7 @@ function inventoryFromManifest(manifest, source) {
|
|
|
72537
72784
|
collect(body?.tree);
|
|
72538
72785
|
return { commandPaths, commandOptions, source };
|
|
72539
72786
|
}
|
|
72540
|
-
function readBundleManifest(bundle, exec3 =
|
|
72787
|
+
function readBundleManifest(bundle, exec3 = import_node_child_process22.execFileSync) {
|
|
72541
72788
|
try {
|
|
72542
72789
|
const text = exec3(process.execPath, [bundle, "commands", "--all", "--json"], {
|
|
72543
72790
|
cwd: (0, import_node_path58.dirname)(bundle),
|
|
@@ -72706,7 +72953,7 @@ async function executeWaveLand(plan, deps) {
|
|
|
72706
72953
|
}
|
|
72707
72954
|
|
|
72708
72955
|
// src/dist-drift.ts
|
|
72709
|
-
var
|
|
72956
|
+
var import_node_child_process23 = require("node:child_process");
|
|
72710
72957
|
var import_node_crypto26 = require("node:crypto");
|
|
72711
72958
|
var import_node_fs64 = require("node:fs");
|
|
72712
72959
|
var import_node_os28 = require("node:os");
|
|
@@ -72852,7 +73099,7 @@ function bomPathFor(root) {
|
|
|
72852
73099
|
}
|
|
72853
73100
|
}
|
|
72854
73101
|
function rebuildTo(packageRoot, outDir) {
|
|
72855
|
-
(0,
|
|
73102
|
+
(0, import_node_child_process23.execFileSync)(process.execPath, ["build.mjs"], {
|
|
72856
73103
|
cwd: packageRoot,
|
|
72857
73104
|
env: { ...process.env, MMI_DIST_OUTDIR: outDir },
|
|
72858
73105
|
windowsHide: true,
|
|
@@ -72976,9 +73223,9 @@ async function runLiveDocRefs(root, deps, live) {
|
|
|
72976
73223
|
}
|
|
72977
73224
|
|
|
72978
73225
|
// src/doc-refs-live-io.ts
|
|
72979
|
-
var
|
|
73226
|
+
var import_node_child_process24 = require("node:child_process");
|
|
72980
73227
|
var import_node_util7 = require("node:util");
|
|
72981
|
-
var exec2 = (0, import_node_util7.promisify)(
|
|
73228
|
+
var exec2 = (0, import_node_util7.promisify)(import_node_child_process24.execFile);
|
|
72982
73229
|
function createRunbookLiveDeps(cliBin) {
|
|
72983
73230
|
const json = async (args) => {
|
|
72984
73231
|
const { stdout } = await exec2(process.execPath, [cliBin, ...args, "--json"], { windowsHide: true, timeout: 3e4, maxBuffer: 4 * 1024 * 1024 });
|
|
@@ -73289,7 +73536,7 @@ function registerSchedulesLiftCommand(program3, deps = {}) {
|
|
|
73289
73536
|
}
|
|
73290
73537
|
|
|
73291
73538
|
// src/spawn-policy-core.ts
|
|
73292
|
-
var
|
|
73539
|
+
var import_node_child_process25 = require("node:child_process");
|
|
73293
73540
|
var import_node_fs65 = require("node:fs");
|
|
73294
73541
|
var import_node_path63 = require("node:path");
|
|
73295
73542
|
var SPAWNERS = ["spawn", "spawnSync", "exec", "execSync", "execFile", "execFileSync"];
|
|
@@ -73360,7 +73607,7 @@ function findViolationsInSource(raw) {
|
|
|
73360
73607
|
return found;
|
|
73361
73608
|
}
|
|
73362
73609
|
function policedFiles(root) {
|
|
73363
|
-
const r = (0,
|
|
73610
|
+
const r = (0, import_node_child_process25.spawnSync)("git", ["ls-files", "-z", "--cached", "--others", "--exclude-standard"], {
|
|
73364
73611
|
cwd: root,
|
|
73365
73612
|
encoding: "utf8",
|
|
73366
73613
|
windowsHide: true,
|
package/package.json
CHANGED