@stll/oxlint-config 1.3.0 → 1.4.0

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 (65) hide show
  1. package/README.md +254 -17
  2. package/dist/cloud-setup-cli.cjs +18 -38
  3. package/dist/cloud-setup-cli.cjs.map +1 -1
  4. package/dist/cloud-setup-cli.mjs +21 -41
  5. package/dist/cloud-setup-cli.mjs.map +1 -1
  6. package/dist/consumer-compat-cli.cjs +50 -249
  7. package/dist/consumer-compat-cli.cjs.map +1 -1
  8. package/dist/consumer-compat-cli.mjs +6 -205
  9. package/dist/consumer-compat-cli.mjs.map +1 -1
  10. package/dist/consumer-node-support.cjs +497 -0
  11. package/dist/consumer-node-support.cjs.map +1 -0
  12. package/dist/consumer-node-support.mjs +381 -0
  13. package/dist/consumer-node-support.mjs.map +1 -0
  14. package/dist/dependabot-cli.cjs +67 -0
  15. package/dist/dependabot-cli.cjs.map +1 -0
  16. package/dist/dependabot-cli.d.cts +1 -0
  17. package/dist/dependabot-cli.d.mts +1 -0
  18. package/dist/dependabot-cli.mjs +67 -0
  19. package/dist/dependabot-cli.mjs.map +1 -0
  20. package/dist/dependabot.cjs +5 -0
  21. package/dist/dependabot.d.cts +108 -0
  22. package/dist/dependabot.d.mts +108 -0
  23. package/dist/dependabot.mjs +3 -0
  24. package/dist/generated-file.cjs +61 -0
  25. package/dist/generated-file.cjs.map +1 -0
  26. package/dist/generated-file.mjs +44 -0
  27. package/dist/generated-file.mjs.map +1 -0
  28. package/dist/publish-artifact-syntax.cjs +1309 -0
  29. package/dist/publish-artifact-syntax.cjs.map +1 -0
  30. package/dist/publish-artifact-syntax.mjs +1265 -0
  31. package/dist/publish-artifact-syntax.mjs.map +1 -0
  32. package/dist/publish-contract-cli.cjs +53 -12
  33. package/dist/publish-contract-cli.cjs.map +1 -1
  34. package/dist/publish-contract-cli.mjs +49 -8
  35. package/dist/publish-contract-cli.mjs.map +1 -1
  36. package/dist/toolchain-changed.cjs +5 -1
  37. package/dist/toolchain-changed.cjs.map +1 -1
  38. package/dist/toolchain-changed.mjs +6 -2
  39. package/dist/toolchain-changed.mjs.map +1 -1
  40. package/dist/toolchain-dependabot.cjs +455 -0
  41. package/dist/toolchain-dependabot.cjs.map +1 -0
  42. package/dist/toolchain-dependabot.mjs +423 -0
  43. package/dist/toolchain-dependabot.mjs.map +1 -0
  44. package/dist/toolchain-guard.cjs +1096 -424
  45. package/dist/toolchain-guard.cjs.map +1 -1
  46. package/dist/toolchain-guard.mjs +1085 -413
  47. package/dist/toolchain-guard.mjs.map +1 -1
  48. package/dist/toolchain-inputs.cjs +122 -22
  49. package/dist/toolchain-inputs.cjs.map +1 -1
  50. package/dist/toolchain-inputs.mjs +117 -23
  51. package/dist/toolchain-inputs.mjs.map +1 -1
  52. package/dist/toolchain-schema.cjs +0 -493
  53. package/dist/toolchain-schema.cjs.map +1 -1
  54. package/dist/toolchain-schema.mjs +3 -379
  55. package/dist/toolchain-schema.mjs.map +1 -1
  56. package/dist/typecheck-parity.cjs +1 -1
  57. package/dist/typecheck-probe-cli.cjs +1 -1
  58. package/dist/typecheck-probe-cli.cjs.map +1 -1
  59. package/dist/typecheck-probe-cli.mjs +1 -1
  60. package/dist/typecheck-probe-cli.mjs.map +1 -1
  61. package/package.json +13 -1
  62. package/dist/publish-contract.cjs +0 -431
  63. package/dist/publish-contract.cjs.map +0 -1
  64. package/dist/publish-contract.mjs +0 -396
  65. package/dist/publish-contract.mjs.map +0 -1
@@ -375,6 +375,21 @@ const cloudSetupArtifacts = {
375
375
  binaries: { "rustup-init": "rustup-init" }
376
376
  }
377
377
  },
378
+ gitleaks: {
379
+ version: "8.30.1",
380
+ amd64: {
381
+ url: "https://github.com/gitleaks/gitleaks/releases/download/v8.30.1/gitleaks_8.30.1_linux_x64.tar.gz",
382
+ sha256: "551f6fc83ea457d62a0d98237cbad105af8d557003051f41f3e7ca7b3f2470eb",
383
+ archive: "tar.gz",
384
+ binaries: { gitleaks: "gitleaks" }
385
+ },
386
+ arm64: {
387
+ url: "https://github.com/gitleaks/gitleaks/releases/download/v8.30.1/gitleaks_8.30.1_linux_arm64.tar.gz",
388
+ sha256: "e4a487ee7ccd7d3a7f7ec08657610aa3606637dab924210b3aee62570fb4b080",
389
+ archive: "tar.gz",
390
+ binaries: { gitleaks: "gitleaks" }
391
+ }
392
+ },
378
393
  "cargo-nextest": {
379
394
  version: "0.9.148",
380
395
  amd64: {
@@ -442,7 +457,8 @@ const cloudSetupArtifactVersions = {
442
457
  "rustup-init": [cloudSetupArtifacts["rustup-init"]],
443
458
  "cargo-nextest": [cloudSetupArtifacts["cargo-nextest"]],
444
459
  "wasm-bindgen-cli": wasmBindgenArtifactReleases,
445
- uv: [cloudSetupArtifacts.uv]
460
+ uv: [cloudSetupArtifacts.uv],
461
+ gitleaks: [cloudSetupArtifacts.gitleaks]
446
462
  };
447
463
  /** A new version requires an explicit, verified catalog entry; never build from source. */
448
464
  const getCloudSetupArtifact = (tool, version) => {
@@ -497,11 +513,20 @@ const parseRust = (input) => {
497
513
  if (!object(input) || Object.keys(input).some((key) => ![
498
514
  "toolchain",
499
515
  "components",
500
- "targets"
501
- ].includes(key))) throw new Error("cloud.rust accepts only toolchain, components and targets");
516
+ "targets",
517
+ "additionalToolchains"
518
+ ].includes(key))) throw new Error("cloud.rust accepts only toolchain, components, targets and additionalToolchains");
502
519
  const toolchain = input["toolchain"];
503
520
  if (toolchain !== void 0 && !exactPin(toolchain)) throw new Error("cloud.rust.toolchain must be an exact stable release");
521
+ const additional = input["additionalToolchains"];
522
+ if (additional !== void 0 && !Array.isArray(additional)) throw new Error("cloud.rust.additionalToolchains requires exact stable releases");
523
+ const additionalToolchains = additional === void 0 ? [] : Array.from(additional, (pin) => {
524
+ if (!exactPin(pin)) throw new Error("cloud.rust.additionalToolchains requires exact stable releases");
525
+ return pin;
526
+ });
527
+ if (new Set(additionalToolchains).size !== additionalToolchains.length) throw new Error("cloud.rust.additionalToolchains contains duplicates");
504
528
  return {
529
+ additionalToolchains,
505
530
  ...toolchain === void 0 ? {} : { toolchain },
506
531
  components: parseCloudRustNames(input["components"], "components"),
507
532
  targets: parseCloudRustNames(input["targets"], "targets")
@@ -835,6 +860,11 @@ const resolveCloudToolchains = ({ cloud, files, rust, rustExceptions }) => {
835
860
  if (channel !== rust && !rustExceptions.some(({ pin }) => pin === channel)) throw new Error(`cloud Rust must use shared Rust ${rust} or a recorded rustExceptions pin`);
836
861
  if (cloud.rust?.toolchain !== void 0 && cloud.rust.toolchain !== channel) throw new Error("cloud.rust.toolchain conflicts with root Rust toolchain");
837
862
  }
863
+ const additionalToolchains = cloud.rust?.additionalToolchains ?? [];
864
+ for (const pin of additionalToolchains) {
865
+ if (pin === channel) throw new Error("cloud.rust.additionalToolchains must not repeat the primary toolchain");
866
+ if (pin !== rust && !rustExceptions.some(({ pin: authorized }) => authorized === pin)) throw new Error(`cloud.rust.additionalToolchains ${pin} requires an authorized rustExceptions pin`);
867
+ }
838
868
  const components = [.../* @__PURE__ */ new Set([...parseCloudRustNames(declared?.["components"], "components"), ...cloud.rust?.components ?? []])].sort();
839
869
  const targets = [.../* @__PURE__ */ new Set([...parseCloudRustNames(declared?.["targets"], "targets"), ...cloud.rust?.targets ?? []])].sort();
840
870
  const resolveTool = (tool, version) => {
@@ -865,6 +895,7 @@ const resolveCloudToolchains = ({ cloud, files, rust, rustExceptions }) => {
865
895
  return {
866
896
  rust: rustEnabled && typeof channel === "string" ? {
867
897
  channel,
898
+ additionalToolchains: [...additionalToolchains].sort(),
868
899
  components,
869
900
  targets,
870
901
  installer: cloudSetupArtifacts["rustup-init"]
@@ -901,7 +932,7 @@ rust_run() {
901
932
  *) fail 'Invalid Rust execution mode' ;;
902
933
  esac
903
934
  }
904
- rust_ready() {
935
+ primary_rust_ready() {
905
936
  local directory
906
937
  for directory in "$RUSTUP_HOME" "$CARGO_HOME"; do
907
938
  [[ -d "$directory" && ! -L "$directory" && "$(stat -c '%u' "$directory")" == "$OUTPUT_UID" ]] || return 1
@@ -915,13 +946,19 @@ rust_ready() {
915
946
  @VERIFY_TARGETS@
916
947
  return 0
917
948
  }
949
+ rust_ready() {
950
+ local additional_version
951
+ primary_rust_ready || return 1
952
+ @VERIFY_ADDITIONAL_TOOLCHAINS@
953
+ return 0
954
+ }
918
955
  verify_rust() { rust_ready || fail 'Pinned Rust, components or targets are unavailable; run install'; }
919
956
  install_rust() (
920
957
  if ! command -v cc >/dev/null || ! command -v ld >/dev/null || [[ ! -f /usr/include/stdlib.h ]]; then
921
958
  apt_refresh_for build-essential
922
959
  apt_install build-essential
923
960
  fi
924
- local artifact_url artifact_sha
961
+ local artifact_url artifact_sha additional_version
925
962
  # Subshell scope retains scratch for EXIT cleanup after a failed command.
926
963
  scratch="$(mktemp -d)"
927
964
  trap 'rm -rf -- "$scratch"' EXIT
@@ -940,9 +977,10 @@ install_rust() (
940
977
  rust_run network "$scratch/rustup-init" -y --no-modify-path --default-toolchain none --profile minimal
941
978
  fi
942
979
  rust_run local "$CARGO_HOME/bin/rustup" set auto-self-update disable
943
- if ! rust_ready; then
980
+ if ! primary_rust_ready; then
944
981
  rust_run network "$CARGO_HOME/bin/rustup" toolchain install @RUST@ --profile minimal --no-self-update @RUST_ARGS@
945
982
  fi
983
+ @INSTALL_ADDITIONAL_TOOLCHAINS@
946
984
  rust_run local "$CARGO_HOME/bin/rustup" default @RUST@
947
985
  verify_rust
948
986
  for tool in rustup cargo rustc rustdoc @RUST_PROXIES@; do
@@ -953,7 +991,7 @@ install_rust() (
953
991
  fi
954
992
  done
955
993
  )
956
- `.replaceAll("@RUSTUP@", rust.installer.version).replaceAll("@RUST@", rust.channel).replace("@RUSTUP_ARTIFACT@", artifactSelection(rust.installer)).replace("@RUST_ARGS@", args).replace("@RUST_PROXIES@", Object.entries(cloudRustComponentBinaries).flatMap(([component, binaries]) => rust.components.includes(component) ? Array.from(binaries) : []).join(" ")).replace("@VERIFY_COMPONENTS@", rust.components.map((name) => `rust_run local "$CARGO_HOME/bin/rustup" component list --toolchain ${quote(rust.channel)} --installed | awk -v name=${quote(name)} -v host="$host" '$1 == name || $1 == name "-" host { found=1 } END { exit !found }' || return 1`).join("\n ")).replace("@VERIFY_TARGETS@", rust.targets.map((name) => `rust_run local "$CARGO_HOME/bin/rustup" target list --toolchain ${quote(rust.channel)} --installed | awk -v name=${quote(name)} '$1 == name { found=1 } END { exit !found }' || return 1`).join("\n "));
994
+ `.replace("@VERIFY_ADDITIONAL_TOOLCHAINS@", rust.additionalToolchains.map((pin) => `additional_version="$(rust_run local "$CARGO_HOME/bin/rustc" +${pin} --version)" || return 1\n [[ "$additional_version" == 'rustc ${pin} '* ]] || return 1`).join("\n ")).replace("@INSTALL_ADDITIONAL_TOOLCHAINS@", rust.additionalToolchains.map((pin) => `if ! additional_version="$(rust_run local "$CARGO_HOME/bin/rustc" +${pin} --version)" || [[ "$additional_version" != 'rustc ${pin} '* ]]; then\n rust_run network "$CARGO_HOME/bin/rustup" toolchain install ${pin} --profile minimal --no-self-update\n fi`).join("\n ")).replaceAll("@RUSTUP@", rust.installer.version).replaceAll("@RUST@", rust.channel).replace("@RUSTUP_ARTIFACT@", artifactSelection(rust.installer)).replace("@RUST_ARGS@", args).replace("@RUST_PROXIES@", Object.entries(cloudRustComponentBinaries).flatMap(([component, binaries]) => rust.components.includes(component) ? Array.from(binaries) : []).join(" ")).replace("@VERIFY_COMPONENTS@", rust.components.map((name) => `rust_run local "$CARGO_HOME/bin/rustup" component list --toolchain ${quote(rust.channel)} --installed | awk -v name=${quote(name)} -v host="$host" '$1 == name || $1 == name "-" host { found=1 } END { exit !found }' || return 1`).join("\n ")).replace("@VERIFY_TARGETS@", rust.targets.map((name) => `rust_run local "$CARGO_HOME/bin/rustup" target list --toolchain ${quote(rust.channel)} --installed | awk -v name=${quote(name)} '$1 == name { found=1 } END { exit !found }' || return 1`).join("\n "));
957
995
  };
958
996
  const packageToolInstall = ({ tool, release }) => {
959
997
  const name = tool.replaceAll("-", "_");
@@ -976,7 +1014,7 @@ install_${name}() {
976
1014
  const artifactToolInstall = ({ tool, release }) => {
977
1015
  const directory = `/opt/stll-cloud/tools/${tool}/${release.version}`;
978
1016
  const command = tool === "wasm-bindgen-cli" ? "wasm-bindgen" : tool;
979
- const marker = `${tool === "cargo-nextest" ? "cargo-nextest" : command} ${release.version}`;
1017
+ const marker = `${tool === "gitleaks" ? "gitleaks version" : command} ${release.version}`;
980
1018
  return {
981
1019
  name: tool.replaceAll("-", "_"),
982
1020
  text: `verify_${tool.replaceAll("-", "_")}() {
@@ -1086,7 +1124,15 @@ OUTPUT_USER="$(getent passwd "$OUTPUT_UID" | cut -d: -f1)"
1086
1124
  OUTPUT_HOME="$(getent passwd "$OUTPUT_UID" | cut -d: -f6)"
1087
1125
  [[ -n "$OUTPUT_USER" && "$OUTPUT_HOME" == /* && -d "$OUTPUT_HOME" ]] || fail 'Invoking user requires an existing home directory'
1088
1126
  root() { "$@"; }
1089
- service_run() { runuser -u stll-cloud -- "$@" 9>&-; }
1127
+ # Service daemons outlive setup, so they inherit no descriptor beyond stdio: a cloud
1128
+ # runner can pass its terminal as extra descriptors and wait until every copy closes.
1129
+ service_run() (
1130
+ for descriptor in "/proc/$BASHPID/fd/"*; do
1131
+ descriptor="$(basename -- "$descriptor")"
1132
+ if [[ "$descriptor" =~ ^[0-9]+$ ]] && (( descriptor > 2 )); then eval "exec $descriptor>&-"; fi
1133
+ done
1134
+ exec runuser -u stll-cloud -- "$@"
1135
+ )
1090
1136
  BUN_VERSION='@BUN@'
1091
1137
  NODE_VERSION='@NODE@'
1092
1138
  NODE_DIR="/opt/stll-cloud/node/$NODE_VERSION"
@@ -1105,19 +1151,35 @@ esac
1105
1151
 
1106
1152
  @NETWORK@
1107
1153
 
1154
+ node_ready() {
1155
+ local node_version npm_version npx_version
1156
+ [[ -x "$NODE_DIR/bin/node" && -x "$NODE_DIR/bin/npm" && -x "$NODE_DIR/bin/npx" ]] || return 1
1157
+ node_version="$("$NODE_DIR/bin/node" --version)" || return 1
1158
+ [[ "$node_version" == "v$NODE_VERSION" ]] || return 1
1159
+ npm_version="$("$NODE_DIR/bin/npm" --version)" || return 1
1160
+ [[ "$npm_version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || return 1
1161
+ npx_version="$("$NODE_DIR/bin/npx" --version)" || return 1
1162
+ [[ "$npx_version" == "$npm_version" ]] || return 1
1163
+ }
1108
1164
  runtime_ready() {
1109
- [[ -x "$NODE_DIR/bin/node" && "$($NODE_DIR/bin/node --version)" == "v$NODE_VERSION" ]] || fail 'Pinned Node is unavailable; run install'
1165
+ node_ready || fail 'Pinned Node, npm or npx is unavailable; run install'
1110
1166
  [[ -x "$BUN_DIR/bun" && "$($BUN_DIR/bun --version)" == "$BUN_VERSION" ]] || fail 'Pinned Bun is unavailable; run install'
1111
1167
  }
1112
- install_runtimes() {
1168
+ install_runtimes() (
1169
+ if [[ ! -s /etc/ssl/certs/ca-certificates.crt ]]; then
1170
+ command -v update-ca-certificates >/dev/null || fail 'System CA certificate bundle is missing; restore ca-certificates in the base image offline before install'
1171
+ update-ca-certificates || fail 'System CA certificate bundle could not be repaired offline; restore ca-certificates in the base image before install'
1172
+ fi
1173
+ [[ -s /etc/ssl/certs/ca-certificates.crt ]] || fail 'System CA certificate bundle is unavailable after offline repair; restore ca-certificates in the base image before install'
1113
1174
  if ! command -v curl >/dev/null || ! command -v unzip >/dev/null || ! command -v xz >/dev/null || ! command -v openssl >/dev/null || ! command -v gpg >/dev/null || ! ldconfig -p | awk '$1 == "libatomic.so.1" { found=1 } END { exit !found }'; then
1114
1175
  apt_refresh_for ca-certificates curl unzip xz-utils openssl gnupg util-linux libatomic1
1115
1176
  DEBIAN_FRONTEND=noninteractive apt_install ca-certificates curl unzip xz-utils openssl gnupg util-linux libatomic1
1116
1177
  fi
1117
- local scratch node_archive bun_archive bun_folder
1178
+ local node_archive bun_archive bun_folder
1179
+ # Subshell scope retains scratch for EXIT cleanup after a failed command.
1118
1180
  scratch="$(mktemp -d)"
1119
- trap 'rm -rf -- "$scratch"' RETURN
1120
- if [[ ! -x "$NODE_DIR/bin/node" ]] || [[ "$($NODE_DIR/bin/node --version)" != "v$NODE_VERSION" ]]; then
1181
+ trap 'rm -rf -- "$scratch"' EXIT
1182
+ if ! node_ready; then
1121
1183
  node_archive="node-v$NODE_VERSION-linux-$NODE_ARCH.tar.xz"
1122
1184
  download_file "https://nodejs.org/dist/v$NODE_VERSION/$node_archive" "$scratch/$node_archive" 120
1123
1185
  download_file "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt" "$scratch/node-sums" 45
@@ -1140,9 +1202,7 @@ install_runtimes() {
1140
1202
  ln -sfnT -- "$NODE_DIR/bin/npm" /usr/local/bin/npm
1141
1203
  ln -sfnT -- "$NODE_DIR/bin/npx" /usr/local/bin/npx
1142
1204
  ln -sfnT -- "$BUN_DIR/bun" /usr/local/bin/bun
1143
- rm -rf -- "$scratch"
1144
- trap - RETURN
1145
- }
1205
+ )
1146
1206
 
1147
1207
  dependency_install() {
1148
1208
  local directory download_hosts
@@ -1306,16 +1366,16 @@ const generateCloudSetup = ({ policy, cloud, nodeVersion, files = {}, rustExcept
1306
1366
  valkey: policy.valkey
1307
1367
  })]
1308
1368
  ]);
1309
- return script.replace(/@[A-Z0-9_]+@/g, (token) => {
1369
+ return `${script.replace(/@[A-Z0-9_]+@/g, (token) => {
1310
1370
  const value = replacements.get(token);
1311
1371
  if (value === void 0) throw new Error(`Missing cloud setup field: ${token}`);
1312
1372
  return value;
1313
- });
1373
+ }).replace(/[ \t]+$/gm, "").trimEnd()}\n`;
1314
1374
  };
1315
1375
  //#endregion
1316
1376
  //#region src/cloud-setup-claude.ts
1317
1377
  const cloudClaudeSettingsPath = ".claude/settings.json";
1318
- const sessionStartHook = (script) => ({
1378
+ const releasedSessionStartHook = (script) => ({
1319
1379
  matcher: "",
1320
1380
  hooks: [{
1321
1381
  type: "command",
@@ -1332,8 +1392,30 @@ const sessionStartHook = (script) => ({
1332
1392
  fi`
1333
1393
  }]
1334
1394
  });
1395
+ const sessionStartHook = (script) => ({
1396
+ matcher: "",
1397
+ hooks: [{
1398
+ type: "command",
1399
+ command: `if [ "\${CLAUDE_CODE_REMOTE:-}" = "true" ]; then
1400
+ cloud_setup_incomplete() {
1401
+ printf '%s\\n' 'Cloud setup could not establish a verified session environment. From the repository root, run bash .agents/cloud-setup.sh install and then bash .agents/cloud-setup.sh start. Do not assume pinned tools or services are ready until start succeeds.'
1402
+ printf '%s\\n' "cloud-setup: $1" >&2
1403
+ exit 0
1404
+ }
1405
+ ${script} start >&2 || cloud_setup_incomplete 'startup failed; run install'
1406
+ if [ -n "\${CLAUDE_ENV_FILE:-}" ]; then
1407
+ if [ ! -s ${cloudShellProfilePath} ]; then
1408
+ cloud_setup_incomplete 'cloud shell profile is unavailable; run install'
1409
+ fi
1410
+ cloud_shell_exports="$(cat ${cloudShellProfilePath})" || cloud_setup_incomplete 'cloud shell profile could not be read; run install'
1411
+ [ -n "$cloud_shell_exports" ] || cloud_setup_incomplete 'cloud shell profile is unavailable; run install'
1412
+ printf '\\n%s\\n' "$cloud_shell_exports" >> "$CLAUDE_ENV_FILE" || cloud_setup_incomplete 'session environment could not be persisted; check its write access and rerun start'
1413
+ fi
1414
+ fi`
1415
+ }]
1416
+ });
1335
1417
  const cloudSessionStartHook = sessionStartHook(`bash "$CLAUDE_PROJECT_DIR/${cloudSetupPath}"`);
1336
- const previousCloudSessionStartHooks = [sessionStartHook(`bash ${cloudSetupPath}`)];
1418
+ const previousCloudSessionStartHooks = [releasedSessionStartHook(`bash ${cloudSetupPath}`), releasedSessionStartHook(`bash "$CLAUDE_PROJECT_DIR/${cloudSetupPath}"`)];
1337
1419
  const cloudAttribution = {
1338
1420
  commit: "",
1339
1421
  pr: ""
@@ -1567,6 +1649,18 @@ const javascriptDependencyLockfiles = [
1567
1649
  "yarn.lock",
1568
1650
  "pnpm-lock.yaml"
1569
1651
  ];
1652
+ const dependabotManifestEcosystems = {
1653
+ Gemfile: "bundler",
1654
+ "Gemfile.lock": "bundler",
1655
+ "composer.json": "composer",
1656
+ "composer.lock": "composer"
1657
+ };
1658
+ /** Share ecosystem inventory with snapshot selection; no dependency graph reads are needed. */
1659
+ const dependabotManifestEcosystem = (file) => {
1660
+ if (excludedInputPath(file)) return void 0;
1661
+ const basename = file.split("/").at(-1);
1662
+ for (const [name, ecosystem] of Object.entries(dependabotManifestEcosystems)) if (basename === name) return ecosystem;
1663
+ };
1570
1664
  /** Match project, environment, local, and fragment filenames recognized by mise. */
1571
1665
  const isMiseConfigPath = (file) => !excludedInputPath(file) && (/(?:^|\/)\.?mise(?:\.[^./][^/]*)?\.toml$/.test(file) || /(?:^|\/)(?:\.?mise|\.config\/mise)\/config(?:\.[^./][^/]*)?\.toml$/.test(file) || /(?:^|\/)(?:\.?mise|\.config\/mise)\/conf\.d\/[^./][^/]*\.toml$/.test(file));
1572
1666
  /** GitHub action metadata may live at the repository root or in any directory. */
@@ -1605,10 +1699,10 @@ const toolchainInputKind = (file, text = "") => {
1605
1699
  if (file === ".agents/cloud-setup.sh" || file === ".claude/settings.json" || file === "Cargo.lock") return "config";
1606
1700
  if (githubAutomationFileKind(file) !== void 0) return "config";
1607
1701
  if (excludedInputPath(file)) return void 0;
1608
- if (pythonDependencyManifestKind(file) === "pipfile-lock" || javascriptDependencyLockfiles.some((name) => file.split("/").at(-1) === name) || /(?:^|\/)uv\.lock$/.test(file)) return "presence";
1702
+ if (dependabotManifestEcosystem(file) !== void 0 || pythonDependencyManifestKind(file) === "pipfile-lock" || javascriptDependencyLockfiles.some((name) => file.split("/").at(-1) === name) || /(?:^|\/)uv\.lock$/.test(file)) return "presence";
1609
1703
  if (githubAutomationFileKind(file) !== void 0 || isShellScript(file, text) || /(?:^|\/)ci-service-images\.json$/.test(file) || isMiseConfigPath(file) || isPythonDependencyManifest(file) || isDockerDefinitionPath(file) || isComposeDefinitionPath(file) || isKubernetesDefinitionPath(file) || /(?:^|\/)(?:package\.json|consumer-compat\.json|pnpm-workspace\.yaml|stll-toolchain\.json|\.bun-version|\.node-version|\.nvmrc|\.python-version|rust-toolchain(?:\.toml)?|\.tool-versions|\.?mise\.toml|uv\.toml|\.uv\.toml|\.github\/dependabot\.ya?ml|Cargo\.toml)$/.test(file)) return "config";
1610
1704
  };
1611
1705
  //#endregion
1612
- export { nodeSelectorMatches as C, nodePolicyValid as S, parseCloudSetup as T, hasCloudAttribution as _, isPythonDependencyManifest as a, cloudSetupPath as b, pythonDependencyManifestKind as c, isComposeDefinitionPath as d, isKubernetesDefinitionPath as f, cloudSessionStartFix as g, cloudClaudeSettingsPath as h, isMiseConfigPath as i, toolchainInputKind as l, cloudAttributionFix as m, isDependabotGithubActionsPath as n, isShellScript as o, workspaceContains as p, isDockerDefinitionPath as r, javascriptDependencyLockfiles as s, githubAutomationFileKind as t, containerDocumentImages as u, hasCloudSessionStartHook as v, nodeSupportRangeMatches as w, generateCloudSetup as x, mergeCloudClaudeSettings as y };
1706
+ export { nodePolicyValid as C, parseCloudSetup as E, generateCloudSetup as S, nodeSupportRangeMatches as T, cloudSessionStartFix as _, isMiseConfigPath as a, mergeCloudClaudeSettings as b, javascriptDependencyLockfiles as c, containerDocumentImages as d, isComposeDefinitionPath as f, cloudClaudeSettingsPath as g, cloudAttributionFix as h, isDockerDefinitionPath as i, pythonDependencyManifestKind as l, workspaceContains as m, githubAutomationFileKind as n, isPythonDependencyManifest as o, isKubernetesDefinitionPath as p, isDependabotGithubActionsPath as r, isShellScript as s, dependabotManifestEcosystem as t, toolchainInputKind as u, hasCloudAttribution as v, nodeSelectorMatches as w, cloudSetupPath as x, hasCloudSessionStartHook as y };
1613
1707
 
1614
1708
  //# sourceMappingURL=toolchain-inputs.mjs.map