@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.
Files changed (2) hide show
  1. package/dist/main.cjs +302 -55
  2. 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.38",
28409
- tag: "v4.6.38",
28410
- commit: "975581f0f6ce",
28411
- npm: "@mutmutco/cli@4.6.38"
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.38"
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.38 and redeploy the Hub Lambda from tag v4.6.38 (975581f0f6ce); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
28435
- v3Target: "v4.6.38 (@mutmutco/cli@4.6.38, tag commit 975581f0f6ce \u2014 last known-good release carrying the repo-index v4-only contract)"
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
- if (requiredBody && !prBodyPreservesOverrides && (method !== "SQUASH" || requiredBody.trim() !== body.trim())) {
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: "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"
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 result = await queueGraphql(
44503
- repo,
44504
- `pullRequest(number:${pr}) { state isInMergeQueue mergeQueueEntry { state position enqueuedAt headCommit { oid } } autoMergeRequest { enabledAt } headRefOid }`,
44505
- gh2
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 import_node_child_process12 = require("node:child_process");
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, import_node_child_process12.execFileSync)("git", args, { maxBuffer: 64 * 1024 * 1024, stdio: ["ignore", "pipe", "pipe"], windowsHide: true });
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, import_node_child_process12.spawnSync)("bash", [recipe], { input: script, encoding: "utf8", maxBuffer: 16 * 1024 * 1024, timeout: 18e4, windowsHide: true });
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 import_node_child_process19 = require("node:child_process");
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 import_node_child_process13 = require("node:child_process");
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, import_node_child_process13.execFileSync)("git", args, { cwd, encoding: "utf8", input: opts?.input, stdio: ["pipe", "pipe", "pipe"], maxBuffer: GIT_MAX_BUFFER }));
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, import_node_child_process13.execFileSync)("git", args, { cwd, encoding: "utf8", input: opts?.input, stdio: ["pipe", "pipe", "pipe"], maxBuffer: GIT_MAX_BUFFER }));
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 import_node_child_process18 = require("node:child_process");
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 spawn7 = overrides?.runner ?? apiReadRunner;
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 ? spawn7(args, ZIP_TIMEOUT_MS, env, true) : spawn7(args, timeoutMs, env),
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 import_node_child_process14 = require("node:child_process");
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, import_node_child_process14.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 });
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 import_node_child_process15 = require("node:child_process");
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, import_node_child_process15.spawn)("gh", ["pr", "diff", number, "--repo", repo], { windowsHide: true, stdio: ["ignore", "pipe", "pipe"] });
61171
- const git3 = (0, import_node_child_process15.spawn)("git", ["patch-id", "--stable"], { windowsHide: true, stdio: ["pipe", "pipe", "pipe"] });
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 import_node_child_process16 = require("node:child_process");
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, import_node_child_process16.spawn)("git", ["-C", root, "cat-file", "--batch", "--buffer"], { windowsHide: true });
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 import_node_child_process17 = require("node:child_process");
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)(import_node_child_process17.execFile);
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, import_node_child_process17.spawn)(bash, ["-c", up], {
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: import_node_child_process18.spawn, execPath: process.execPath, scriptPath: process.argv[1] }, { cwd: process.cwd() });
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, import_node_child_process19.fork)((0, import_node_path52.resolve)(process.argv[1]), ["devops", "suite", "member-rcand-internal", repo, previousRc ?? "", ...rcWasAbsent ? ["--rc-was-absent"] : []], {
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 import_node_child_process20 = require("node:child_process");
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)(import_node_child_process20.execFile);
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 import_node_child_process21 = require("node:child_process");
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 = import_node_child_process21.execFileSync) {
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 import_node_child_process22 = require("node:child_process");
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, import_node_child_process22.execFileSync)(process.execPath, ["build.mjs"], {
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 import_node_child_process23 = require("node:child_process");
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)(import_node_child_process23.execFile);
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 import_node_child_process24 = require("node:child_process");
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, import_node_child_process24.spawnSync)("git", ["ls-files", "-z", "--cached", "--others", "--exclude-standard"], {
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/cli",
3
- "version": "4.6.38",
3
+ "version": "4.6.40",
4
4
  "description": "MMI Future CLI — the org dev toolbox and shared cross-IDE engine for every registry-declared MMI coding surface.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",