@stll/oxlint-config 1.0.2 → 1.2.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 (49) hide show
  1. package/README.md +97 -4
  2. package/dist/cloud-setup-cli.cjs +62 -21
  3. package/dist/cloud-setup-cli.cjs.map +1 -1
  4. package/dist/cloud-setup-cli.mjs +63 -22
  5. package/dist/cloud-setup-cli.mjs.map +1 -1
  6. package/dist/consumer-compat-cli.cjs +7 -6
  7. package/dist/consumer-compat-cli.cjs.map +1 -1
  8. package/dist/consumer-compat-cli.mjs +7 -6
  9. package/dist/consumer-compat-cli.mjs.map +1 -1
  10. package/dist/git-tracked-output.cjs.map +1 -1
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/publish-build-target-vite-dts-helper.mjs +1 -2
  13. package/dist/publish-build-target-vite-dts-helper2.cjs +5 -5
  14. package/dist/publish-build-target-vite-dts-helper2.cjs.map +1 -1
  15. package/dist/publish-contract-cli.cjs +17 -16
  16. package/dist/publish-contract-cli.cjs.map +1 -1
  17. package/dist/publish-contract-cli.mjs +6 -5
  18. package/dist/publish-contract-cli.mjs.map +1 -1
  19. package/dist/publish-contract.cjs +1 -1
  20. package/dist/publish-contract.cjs.map +1 -1
  21. package/dist/publish-contract.mjs +1 -1
  22. package/dist/rolldown-runtime.cjs +1 -1
  23. package/dist/toolchain-changed.cjs +25 -15
  24. package/dist/toolchain-changed.cjs.map +1 -1
  25. package/dist/toolchain-changed.mjs +27 -17
  26. package/dist/toolchain-changed.mjs.map +1 -1
  27. package/dist/toolchain-check-cli.cjs.map +1 -1
  28. package/dist/toolchain-check-cli.mjs.map +1 -1
  29. package/dist/toolchain-guard.cjs +72 -48
  30. package/dist/toolchain-guard.cjs.map +1 -1
  31. package/dist/toolchain-guard.mjs +79 -55
  32. package/dist/toolchain-guard.mjs.map +1 -1
  33. package/dist/toolchain-inputs.cjs +803 -40
  34. package/dist/toolchain-inputs.cjs.map +1 -1
  35. package/dist/toolchain-inputs.mjs +768 -41
  36. package/dist/toolchain-inputs.mjs.map +1 -1
  37. package/dist/toolchain-schema.cjs +1 -1
  38. package/dist/toolchain-schema.cjs.map +1 -1
  39. package/dist/toolchain-schema.mjs +2 -2
  40. package/dist/typecheck-parity-cli.cjs.map +1 -1
  41. package/dist/typecheck-parity-cli.mjs.map +1 -1
  42. package/dist/typecheck-parity.cjs +8 -7
  43. package/dist/typecheck-parity.cjs.map +1 -1
  44. package/dist/typecheck-parity.mjs +6 -5
  45. package/dist/typecheck-parity.mjs.map +1 -1
  46. package/dist/typecheck-probe-cli.cjs +1 -1
  47. package/dist/typecheck-probe-cli.cjs.map +1 -1
  48. package/dist/typecheck-probe-cli.mjs +1 -1
  49. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"toolchain-check-cli.cjs","names":["parseToolchainPolicy","checkToolchain"],"sources":["../src/toolchain-check-cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { readFileSync } from \"node:fs\";\n\nimport { checkToolchain } from \"./toolchain-guard\";\nimport { parseToolchainPolicy } from \"./toolchain-schema\";\n\ntry {\n const args = process.argv.slice(2);\n if (args.length === 1 && args[0] === \"--help\") {\n process.stdout.write(\n \"Usage: stll-toolchain-check (opt-outs: tracked stll-toolchain.json)\\n\",\n );\n process.exit(0);\n }\n if (args.length !== 0) throw new Error(`unexpected argument: ${args.at(0)}`);\n const policy = parseToolchainPolicy(\n JSON.parse(\n readFileSync(new URL(\"../toolchain.json\", import.meta.url), \"utf8\"),\n ),\n );\n const diagnostics = checkToolchain({\n root: process.cwd(),\n policy,\n onDelegated: ({ path, line, tool, selector, ref }) =>\n process.stdout.write(\n `${path}:${line}: [runtime-delegated] setup-${tool} ${selector} delegates its version to checkout ref ${ref}\\n`,\n ),\n });\n for (const diagnostic of diagnostics)\n process.stderr.write(\n `${diagnostic.path}:${diagnostic.line}: [${diagnostic.rule}] ${diagnostic.message}\\n`,\n );\n if (diagnostics.length > 0) process.exitCode = 1;\n} catch (error) {\n process.stderr.write(\n `toolchain-check:1: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n process.exitCode = 1;\n}\n"],"mappings":";;;;;;AAMA,IAAI;CACF,MAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;CACjC,IAAI,KAAK,WAAW,KAAK,KAAK,OAAO,UAAU;EAC7C,QAAQ,OAAO,MACb,uEACF;EACA,QAAQ,KAAK,CAAC;CAChB;CACA,IAAI,KAAK,WAAW,GAAG,MAAM,IAAI,MAAM,wBAAwB,KAAK,GAAG,CAAC,GAAG;CAC3E,MAAM,SAASA,yBAAAA,qBACb,KAAK,OAAA,GAAA,QAAA,aAAA,CACU,IAAI,IAAI,qBAAA,QAAA,KAAA,CAAA,CAAA,cAAA,UAAA,CAAA,CAAA,IAAoC,GAAG,MAAM,CACpE,CACF;CACA,MAAM,cAAcC,wBAAAA,eAAe;EACjC,MAAM,QAAQ,IAAI;EAClB;EACA,cAAc,EAAE,MAAM,MAAM,MAAM,UAAU,UAC1C,QAAQ,OAAO,MACb,GAAG,KAAK,GAAG,KAAK,8BAA8B,KAAK,GAAG,SAAS,yCAAyC,IAAI,GAC9G;CACJ,CAAC;CACD,KAAK,MAAM,cAAc,aACvB,QAAQ,OAAO,MACb,GAAG,WAAW,KAAK,GAAG,WAAW,KAAK,KAAK,WAAW,KAAK,IAAI,WAAW,QAAQ,GACpF;CACF,IAAI,YAAY,SAAS,GAAG,QAAQ,WAAW;AACjD,SAAS,OAAO;CACd,QAAQ,OAAO,MACb,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAC/E;CACA,QAAQ,WAAW;AACrB"}
1
+ {"version":3,"file":"toolchain-check-cli.cjs","names":["parseToolchainPolicy","readFileSync","checkToolchain"],"sources":["../src/toolchain-check-cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { readFileSync } from \"node:fs\";\n\nimport { checkToolchain } from \"./toolchain-guard\";\nimport { parseToolchainPolicy } from \"./toolchain-schema\";\n\ntry {\n const args = process.argv.slice(2);\n if (args.length === 1 && args[0] === \"--help\") {\n process.stdout.write(\n \"Usage: stll-toolchain-check (opt-outs: tracked stll-toolchain.json)\\n\",\n );\n process.exit(0);\n }\n if (args.length !== 0) throw new Error(`unexpected argument: ${args.at(0)}`);\n const policy = parseToolchainPolicy(\n JSON.parse(\n readFileSync(new URL(\"../toolchain.json\", import.meta.url), \"utf8\"),\n ),\n );\n const diagnostics = checkToolchain({\n root: process.cwd(),\n policy,\n onDelegated: ({ path, line, tool, selector, ref }) =>\n process.stdout.write(\n `${path}:${line}: [runtime-delegated] setup-${tool} ${selector} delegates its version to checkout ref ${ref}\\n`,\n ),\n });\n for (const diagnostic of diagnostics)\n process.stderr.write(\n `${diagnostic.path}:${diagnostic.line}: [${diagnostic.rule}] ${diagnostic.message}\\n`,\n );\n if (diagnostics.length > 0) process.exitCode = 1;\n} catch (error) {\n process.stderr.write(\n `toolchain-check:1: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n process.exitCode = 1;\n}\n"],"mappings":";;;;;;AAMA,IAAI;CACF,MAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;CACjC,IAAI,KAAK,WAAW,KAAK,KAAK,OAAO,UAAU;EAC7C,QAAQ,OAAO,MACb,uEACF;EACA,QAAQ,KAAK,CAAC;CAChB;CACA,IAAI,KAAK,WAAW,GAAG,MAAM,IAAI,MAAM,wBAAwB,KAAK,GAAG,CAAC,GAAG;CAC3E,MAAM,SAASA,yBAAAA,qBACb,KAAK,OAAA,GACHC,QAAAA,aAAAA,CAAa,IAAI,IAAI,qBAAA,QAAA,KAAA,CAAA,CAAA,cAAA,UAAA,CAAA,CAAA,IAAoC,GAAG,MAAM,CACpE,CACF;CACA,MAAM,cAAcC,wBAAAA,eAAe;EACjC,MAAM,QAAQ,IAAI;EAClB;EACA,cAAc,EAAE,MAAM,MAAM,MAAM,UAAU,UAC1C,QAAQ,OAAO,MACb,GAAG,KAAK,GAAG,KAAK,8BAA8B,KAAK,GAAG,SAAS,yCAAyC,IAAI,GAC9G;CACJ,CAAC;CACD,KAAK,MAAM,cAAc,aACvB,QAAQ,OAAO,MACb,GAAG,WAAW,KAAK,GAAG,WAAW,KAAK,KAAK,WAAW,KAAK,IAAI,WAAW,QAAQ,GACpF;CACF,IAAI,YAAY,SAAS,GAAG,QAAQ,WAAW;AACjD,SAAS,OAAO;CACd,QAAQ,OAAO,MACb,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAC/E;CACA,QAAQ,WAAW;AACrB"}
@@ -1 +1 @@
1
- {"version":3,"file":"toolchain-check-cli.mjs","names":[],"sources":["../src/toolchain-check-cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { readFileSync } from \"node:fs\";\n\nimport { checkToolchain } from \"./toolchain-guard\";\nimport { parseToolchainPolicy } from \"./toolchain-schema\";\n\ntry {\n const args = process.argv.slice(2);\n if (args.length === 1 && args[0] === \"--help\") {\n process.stdout.write(\n \"Usage: stll-toolchain-check (opt-outs: tracked stll-toolchain.json)\\n\",\n );\n process.exit(0);\n }\n if (args.length !== 0) throw new Error(`unexpected argument: ${args.at(0)}`);\n const policy = parseToolchainPolicy(\n JSON.parse(\n readFileSync(new URL(\"../toolchain.json\", import.meta.url), \"utf8\"),\n ),\n );\n const diagnostics = checkToolchain({\n root: process.cwd(),\n policy,\n onDelegated: ({ path, line, tool, selector, ref }) =>\n process.stdout.write(\n `${path}:${line}: [runtime-delegated] setup-${tool} ${selector} delegates its version to checkout ref ${ref}\\n`,\n ),\n });\n for (const diagnostic of diagnostics)\n process.stderr.write(\n `${diagnostic.path}:${diagnostic.line}: [${diagnostic.rule}] ${diagnostic.message}\\n`,\n );\n if (diagnostics.length > 0) process.exitCode = 1;\n} catch (error) {\n process.stderr.write(\n `toolchain-check:1: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n process.exitCode = 1;\n}\n"],"mappings":";;;;;AAMA,IAAI;CACF,MAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;CACjC,IAAI,KAAK,WAAW,KAAK,KAAK,OAAO,UAAU;EAC7C,QAAQ,OAAO,MACb,uEACF;EACA,QAAQ,KAAK,CAAC;CAChB;CACA,IAAI,KAAK,WAAW,GAAG,MAAM,IAAI,MAAM,wBAAwB,KAAK,GAAG,CAAC,GAAG;CAC3E,MAAM,SAAS,qBACb,KAAK,MACH,aAAa,IAAI,IAAI,qBAAqB,OAAO,KAAK,GAAG,GAAG,MAAM,CACpE,CACF;CACA,MAAM,cAAc,eAAe;EACjC,MAAM,QAAQ,IAAI;EAClB;EACA,cAAc,EAAE,MAAM,MAAM,MAAM,UAAU,UAC1C,QAAQ,OAAO,MACb,GAAG,KAAK,GAAG,KAAK,8BAA8B,KAAK,GAAG,SAAS,yCAAyC,IAAI,GAC9G;CACJ,CAAC;CACD,KAAK,MAAM,cAAc,aACvB,QAAQ,OAAO,MACb,GAAG,WAAW,KAAK,GAAG,WAAW,KAAK,KAAK,WAAW,KAAK,IAAI,WAAW,QAAQ,GACpF;CACF,IAAI,YAAY,SAAS,GAAG,QAAQ,WAAW;AACjD,SAAS,OAAO;CACd,QAAQ,OAAO,MACb,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAC/E;CACA,QAAQ,WAAW;AACrB"}
1
+ {"version":3,"file":"toolchain-check-cli.mjs","names":[],"sources":["../src/toolchain-check-cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { readFileSync } from \"node:fs\";\n\nimport { checkToolchain } from \"./toolchain-guard\";\nimport { parseToolchainPolicy } from \"./toolchain-schema\";\n\ntry {\n const args = process.argv.slice(2);\n if (args.length === 1 && args[0] === \"--help\") {\n process.stdout.write(\n \"Usage: stll-toolchain-check (opt-outs: tracked stll-toolchain.json)\\n\",\n );\n process.exit(0);\n }\n if (args.length !== 0) throw new Error(`unexpected argument: ${args.at(0)}`);\n const policy = parseToolchainPolicy(\n JSON.parse(\n readFileSync(new URL(\"../toolchain.json\", import.meta.url), \"utf8\"),\n ),\n );\n const diagnostics = checkToolchain({\n root: process.cwd(),\n policy,\n onDelegated: ({ path, line, tool, selector, ref }) =>\n process.stdout.write(\n `${path}:${line}: [runtime-delegated] setup-${tool} ${selector} delegates its version to checkout ref ${ref}\\n`,\n ),\n });\n for (const diagnostic of diagnostics)\n process.stderr.write(\n `${diagnostic.path}:${diagnostic.line}: [${diagnostic.rule}] ${diagnostic.message}\\n`,\n );\n if (diagnostics.length > 0) process.exitCode = 1;\n} catch (error) {\n process.stderr.write(\n `toolchain-check:1: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n process.exitCode = 1;\n}\n"],"mappings":";;;;;AAMA,IAAI;CACF,MAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;CACjC,IAAI,KAAK,WAAW,KAAK,KAAK,OAAO,UAAU;EAC7C,QAAQ,OAAO,MACb,uEACF;EACA,QAAQ,KAAK,CAAC;CAChB;CACA,IAAI,KAAK,WAAW,GAAG,MAAM,IAAI,MAAM,wBAAwB,KAAK,GAAG,CAAC,GAAG;CAC3E,MAAM,SAAS,qBACb,KAAK,MACH,aAAa,IAAI,IAAI,qBAAqB,YAAY,GAAG,GAAG,MAAM,CACpE,CACF;CACA,MAAM,cAAc,eAAe;EACjC,MAAM,QAAQ,IAAI;EAClB;EACA,cAAc,EAAE,MAAM,MAAM,MAAM,UAAU,UAC1C,QAAQ,OAAO,MACb,GAAG,KAAK,GAAG,KAAK,8BAA8B,KAAK,GAAG,SAAS,yCAAyC,IAAI,GAC9G;CACJ,CAAC;CACD,KAAK,MAAM,cAAc,aACvB,QAAQ,OAAO,MACb,GAAG,WAAW,KAAK,GAAG,WAAW,KAAK,KAAK,WAAW,KAAK,IAAI,WAAW,QAAQ,GACpF;CACF,IAAI,YAAY,SAAS,GAAG,QAAQ,WAAW;AACjD,SAAS,OAAO;CACd,QAAQ,OAAO,MACb,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAC/E;CACA,QAAQ,WAAW;AACrB"}
@@ -7,13 +7,13 @@ let node_child_process = require("node:child_process");
7
7
  let node_path = require("node:path");
8
8
  node_path = require_rolldown_runtime.__toESM(node_path, 1);
9
9
  let semver = require("semver");
10
+ let smol_toml = require("smol-toml");
10
11
  let yaml = require("yaml");
11
12
  let picomatch = require("picomatch");
12
13
  picomatch = require_rolldown_runtime.__toESM(picomatch, 1);
13
- let smol_toml = require("smol-toml");
14
14
  //#endregion
15
15
  //#region src/toolchain-consumer-checks.ts
16
- const consumerRunnerVersion = "1.0.2";
16
+ const consumerRunnerVersion = "1.2.0";
17
17
  const consumerCheckWorkflow = "stella/.github/.github/workflows/package-consumer-compat.yml";
18
18
  const record$7 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
19
19
  const repositoryDirectory = (value) => typeof value === "string" && value !== "" && !value.includes("\\") && !value.includes("${{") && !value.split("").some((character) => {
@@ -195,7 +195,8 @@ const checkConsumerChecks = ({ declarations, files, policy }) => {
195
195
  const fixtureManifest = node_path.default.posix.join(declaration.fixturePath, "consumer-compat.json");
196
196
  const fixtureSource = files[fixtureManifest];
197
197
  if (fixtureSource === void 0) throw new Error(`consumerChecks fixture configuration must be tracked: ${fixtureManifest}`);
198
- const fixtures = require_toolchain_schema.parseConsumerFixtures(JSON.parse(fixtureSource));
198
+ const fixtureConfiguration = JSON.parse(fixtureSource);
199
+ const fixtures = require_toolchain_schema.parseConsumerFixtures(fixtureConfiguration);
199
200
  require_toolchain_schema.assertConsumerFixtureSelection({
200
201
  selected: declaration.packages,
201
202
  fixtures
@@ -1108,14 +1109,15 @@ const shellCommandSegments = (command, grouping = "boundaries") => {
1108
1109
  for (const source of sources) {
1109
1110
  const firstSegment = segments.length;
1110
1111
  segments.push([]);
1111
- for (const { kind, value: word } of shellArgumentTokens(shellTokens(source))) if (kind === "boundary") if ([
1112
- "(",
1113
- ")",
1114
- "{",
1115
- "}"
1116
- ].includes(word) && grouping === "tokens") segments.at(-1)?.push(word);
1117
- else segments.push([]);
1118
- else segments.at(-1)?.push(word);
1112
+ for (const { kind, value: word } of shellArgumentTokens(shellTokens(source))) if (kind === "boundary") {
1113
+ if ([
1114
+ "(",
1115
+ ")",
1116
+ "{",
1117
+ "}"
1118
+ ].includes(word) && grouping === "tokens") segments.at(-1)?.push(word);
1119
+ else segments.push([]);
1120
+ } else segments.at(-1)?.push(word);
1119
1121
  for (const words of segments.slice(firstSegment)) {
1120
1122
  const body = shellCommandBody(words);
1121
1123
  if (body === void 0) continue;
@@ -1609,7 +1611,8 @@ const checkPackageFiles = ({ files, policy }) => {
1609
1611
  if (resolved === specifier) return false;
1610
1612
  if (qualifier === void 0 || (0, semver.validRange)(qualifier) === null) return true;
1611
1613
  if (typeof specifier !== "string") return false;
1612
- const release = (0, semver.valid)(specifier.startsWith("npm:") ? specifier.slice(specifier.lastIndexOf("@") + 1) : specifier);
1614
+ const versionSpecifier = specifier.startsWith("npm:") ? specifier.slice(specifier.lastIndexOf("@") + 1) : specifier;
1615
+ const release = (0, semver.valid)(versionSpecifier);
1613
1616
  return release !== null && (0, semver.satisfies)(release, qualifier);
1614
1617
  }) && typeof resolved === "string" && tsSpecifiers.get(name)?.has(resolved)) add({
1615
1618
  file,
@@ -1873,7 +1876,9 @@ const checkRustReferences = (options) => {
1873
1876
  const version = tag === void 0 ? void 0 : rustImageVersion(tag);
1874
1877
  select(version, "Rust service image", lineOf(value));
1875
1878
  } else if (Array.isArray(value)) value.forEach(images);
1876
- else if (record$2(value)) Object.values(value).forEach(images);
1879
+ else if (record$2(value)) {
1880
+ for (const [key, entry] of Object.entries(value)) if (key !== "name") images(entry);
1881
+ }
1877
1882
  };
1878
1883
  try {
1879
1884
  images(JSON.parse(text));
@@ -2204,28 +2209,30 @@ const checkRuntimeFile = ({ file, text, policy, trackedFiles, readFile, reposito
2204
2209
  if (record$1(defaults) && defaults["rust-version"] !== void 0) rustFloor(defaults["rust-version"]);
2205
2210
  const pkg = parsed["package"];
2206
2211
  const version = record$1(pkg) ? pkg["rust-version"] : void 0;
2207
- if (version !== void 0) if (!record$1(version)) rustFloor(version);
2208
- else {
2209
- let inherited;
2210
- if (version["workspace"] === true && record$1(pkg)) {
2211
- const explicit = pkg["workspace"];
2212
- let directory = node_path.default.posix.dirname(file);
2213
- const explicitPath = typeof explicit === "string" && !explicit.includes("\\") && !explicit.includes(":") && !explicit.includes("${{") && !node_path.default.posix.isAbsolute(explicit) ? node_path.default.posix.normalize(node_path.default.posix.join(directory, explicit)) : void 0;
2214
- if (explicit === void 0 || explicitPath !== void 0 && explicitPath !== ".." && !explicitPath.startsWith("../")) {
2215
- if (explicitPath !== void 0) directory = explicitPath;
2216
- while (true) {
2217
- const table = readManifest(node_path.default.posix.join(directory, "Cargo.toml"))?.["workspace"];
2218
- if (record$1(table)) {
2219
- const fields = table["package"];
2220
- inherited = record$1(fields) ? fields["rust-version"] : void 0;
2221
- break;
2212
+ if (version !== void 0) {
2213
+ if (!record$1(version)) rustFloor(version);
2214
+ else {
2215
+ let inherited;
2216
+ if (version["workspace"] === true && record$1(pkg)) {
2217
+ const explicit = pkg["workspace"];
2218
+ let directory = node_path.default.posix.dirname(file);
2219
+ const explicitPath = typeof explicit === "string" && !explicit.includes("\\") && !explicit.includes(":") && !explicit.includes("${{") && !node_path.default.posix.isAbsolute(explicit) ? node_path.default.posix.normalize(node_path.default.posix.join(directory, explicit)) : void 0;
2220
+ if (explicit === void 0 || explicitPath !== void 0 && explicitPath !== ".." && !explicitPath.startsWith("../")) {
2221
+ if (explicitPath !== void 0) directory = explicitPath;
2222
+ while (true) {
2223
+ const table = readManifest(node_path.default.posix.join(directory, "Cargo.toml"))?.["workspace"];
2224
+ if (record$1(table)) {
2225
+ const fields = table["package"];
2226
+ inherited = record$1(fields) ? fields["rust-version"] : void 0;
2227
+ break;
2228
+ }
2229
+ if (explicit !== void 0 || directory === ".") break;
2230
+ directory = node_path.default.posix.dirname(directory);
2222
2231
  }
2223
- if (explicit !== void 0 || directory === ".") break;
2224
- directory = node_path.default.posix.dirname(directory);
2225
2232
  }
2226
2233
  }
2234
+ rustFloor(inherited);
2227
2235
  }
2228
- rustFloor(inherited);
2229
2236
  }
2230
2237
  }
2231
2238
  }
@@ -2846,9 +2853,10 @@ const checkRuntimeFile = ({ file, text, policy, trackedFiles, readFile, reposito
2846
2853
  for (let index = start + 3; index < value.length; index++) {
2847
2854
  const character = value.at(index);
2848
2855
  if (quote !== void 0) {
2849
- if (character === quote) if (quote === "'" && value.at(index + 1) === "'") index++;
2850
- else quote = void 0;
2851
- else if (quote === "\"" && character === "\\") index++;
2856
+ if (character === quote) {
2857
+ if (quote === "'" && value.at(index + 1) === "'") index++;
2858
+ else quote = void 0;
2859
+ } else if (quote === "\"" && character === "\\") index++;
2852
2860
  continue;
2853
2861
  }
2854
2862
  if (character === "'" || character === "\"") quote = character;
@@ -3342,26 +3350,42 @@ const checkToolchain = ({ root, policy, onDelegated }) => {
3342
3350
  line: 1,
3343
3351
  message: "cloud setup script requires an explicit cloud declaration in stll-toolchain.json"
3344
3352
  });
3345
- if (cloud !== void 0) try {
3346
- const nodeVersion = files[".node-version"];
3347
- if (nodeVersion === void 0) throw new Error("cloud setup requires a tracked root .node-version with an exact stable release");
3348
- if (script !== require_toolchain_inputs.generateCloudSetup({
3349
- policy,
3350
- cloud,
3351
- nodeVersion: nodeVersion.trim()
3352
- })) diagnostics.push({
3353
+ if (cloud !== void 0) {
3354
+ if (!require_toolchain_inputs.hasCloudSessionStartHook(files[".claude/settings.json"])) diagnostics.push({
3353
3355
  rule: "cloud-setup-drift",
3354
- path: require_toolchain_inputs.cloudSetupPath,
3356
+ path: require_toolchain_inputs.cloudClaudeSettingsPath,
3355
3357
  line: 1,
3356
- message: "cloud setup script is missing or differs from shared policy; run stll-cloud-setup"
3358
+ message: `tracked Claude cloud SessionStart hook is missing, disabled or differs from shared policy; run stll-cloud-setup; if automatic merge is unsafe, ${require_toolchain_inputs.cloudSessionStartFix}`
3357
3359
  });
3358
- } catch (error) {
3359
- diagnostics.push({
3360
+ if (!require_toolchain_inputs.hasCloudAttribution(files[".claude/settings.json"])) diagnostics.push({
3360
3361
  rule: "cloud-setup-drift",
3361
- path: require_toolchain_inputs.cloudSetupPath,
3362
+ path: require_toolchain_inputs.cloudClaudeSettingsPath,
3362
3363
  line: 1,
3363
- message: error instanceof Error ? error.message : String(error)
3364
+ message: `tracked Claude attribution is missing or differs from shared policy; run stll-cloud-setup; if automatic merge is unsafe, ${require_toolchain_inputs.cloudAttributionFix}`
3364
3365
  });
3366
+ try {
3367
+ const nodeVersion = files[".node-version"];
3368
+ if (nodeVersion === void 0) throw new Error("cloud setup requires a tracked root .node-version with an exact stable release");
3369
+ if (script !== require_toolchain_inputs.generateCloudSetup({
3370
+ policy,
3371
+ cloud,
3372
+ nodeVersion: nodeVersion.trim(),
3373
+ files,
3374
+ rustExceptions: configuration.rustExceptions
3375
+ })) diagnostics.push({
3376
+ rule: "cloud-setup-drift",
3377
+ path: require_toolchain_inputs.cloudSetupPath,
3378
+ line: 1,
3379
+ message: "cloud setup script is missing or differs from shared policy; run stll-cloud-setup"
3380
+ });
3381
+ } catch (error) {
3382
+ diagnostics.push({
3383
+ rule: "cloud-setup-drift",
3384
+ path: require_toolchain_inputs.cloudSetupPath,
3385
+ line: 1,
3386
+ message: error instanceof Error ? error.message : String(error)
3387
+ });
3388
+ }
3365
3389
  }
3366
3390
  const exercisedFloors = /* @__PURE__ */ new Set();
3367
3391
  const mismatchedFloors = /* @__PURE__ */ new Set();