@codyswann/lisa 3.47.5 → 3.47.7

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 (105) hide show
  1. package/all/copy-overwrite/scripts/lib/gate-failure-diagnosis.mjs +270 -0
  2. package/all/copy-overwrite/scripts/lisa-gates.mjs +30 -0
  3. package/all/copy-overwrite/scripts/lisa-run-gates.mjs +294 -34
  4. package/all/copy-overwrite/scripts/lisa-work-item.mjs +83 -26
  5. package/dist/configs/eslint/expo.d.ts +50 -1
  6. package/dist/configs/eslint/expo.d.ts.map +1 -1
  7. package/dist/configs/eslint/expo.js +86 -5
  8. package/dist/configs/eslint/expo.js.map +1 -1
  9. package/dist/core/downstream-names.d.ts +83 -0
  10. package/dist/core/downstream-names.d.ts.map +1 -0
  11. package/dist/core/downstream-names.js +289 -0
  12. package/dist/core/downstream-names.js.map +1 -0
  13. package/dist/core/downstream-references.d.ts +21 -6
  14. package/dist/core/downstream-references.d.ts.map +1 -1
  15. package/dist/core/downstream-references.js +19 -16
  16. package/dist/core/downstream-references.js.map +1 -1
  17. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  18. package/dist/core/lisa-owned-hash-ledger.js +14 -0
  19. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  20. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  21. package/dist/core/upstream-evidence-manifest.js +27 -13
  22. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  23. package/dist/migrations/ensure-tsconfig-local-includes.d.ts +1 -1
  24. package/dist/migrations/ensure-tsconfig-local-includes.js +1 -1
  25. package/expo/copy-overwrite/eslint.config.ts +9 -0
  26. package/expo/copy-overwrite/eslint.expo.ts +92 -4
  27. package/package.json +5 -2
  28. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  30. package/plugins/lisa/rules/reference/design-value-binding.md +4 -0
  31. package/plugins/lisa/scripts/automation-run-record.mjs +124 -4
  32. package/plugins/lisa/scripts/automation-status-claude-adapter.mjs +9 -1
  33. package/plugins/lisa/scripts/automation-status-codex-adapter.mjs +9 -1
  34. package/plugins/lisa/scripts/automation-status-run-history.mjs +34 -3
  35. package/plugins/lisa-agy/plugin.json +1 -1
  36. package/plugins/lisa-agy/scripts/automation-run-record.mjs +124 -4
  37. package/plugins/lisa-agy/scripts/automation-status-claude-adapter.mjs +9 -1
  38. package/plugins/lisa-agy/scripts/automation-status-codex-adapter.mjs +9 -1
  39. package/plugins/lisa-agy/scripts/automation-status-run-history.mjs +34 -3
  40. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  42. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  43. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-copilot/rules/reference/design-value-binding.md +4 -0
  47. package/plugins/lisa-copilot/scripts/automation-run-record.mjs +124 -4
  48. package/plugins/lisa-copilot/scripts/automation-status-claude-adapter.mjs +9 -1
  49. package/plugins/lisa-copilot/scripts/automation-status-codex-adapter.mjs +9 -1
  50. package/plugins/lisa-copilot/scripts/automation-status-run-history.mjs +34 -3
  51. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-cursor/rules/design-value-binding-reference.mdc +4 -0
  53. package/plugins/lisa-cursor/scripts/automation-run-record.mjs +124 -4
  54. package/plugins/lisa-cursor/scripts/automation-status-claude-adapter.mjs +9 -1
  55. package/plugins/lisa-cursor/scripts/automation-status-codex-adapter.mjs +9 -1
  56. package/plugins/lisa-cursor/scripts/automation-status-run-history.mjs +34 -3
  57. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  59. package/plugins/lisa-expo-agy/plugin.json +1 -1
  60. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  64. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  65. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  69. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  70. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  74. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  75. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  79. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  80. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  82. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  84. package/plugins/lisa-rails-agy/plugin.json +1 -1
  85. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  86. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  87. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  88. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  89. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  90. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  91. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  92. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  93. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  94. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  95. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  96. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  97. package/plugins/src/base/rules/reference/design-value-binding.md +4 -0
  98. package/plugins/src/base/scripts/automation-run-record.mjs +124 -4
  99. package/plugins/src/base/scripts/automation-status-claude-adapter.mjs +9 -1
  100. package/plugins/src/base/scripts/automation-status-codex-adapter.mjs +9 -1
  101. package/plugins/src/base/scripts/automation-status-run-history.mjs +34 -3
  102. package/scripts/lisa-mutation.mjs +13 -0
  103. package/typescript/copy-contents/.husky/pre-push +7 -1
  104. package/typescript/copy-overwrite/scripts/lisa-mutation.mjs +496 -122
  105. package/typescript/package-lisa/package.lisa.json +1 -0
@@ -1,5 +1,46 @@
1
1
  import { defaultIgnores, defaultThresholds, getBaseConfigs, getBaseLanguageOptions, getSharedRules } from "./typescript.js";
2
2
  export { defaultIgnores, defaultThresholds, getBaseConfigs, getBaseLanguageOptions, getSharedRules, };
3
+ /**
4
+ * Axes a project declares typed, read from its own `.lisa.config.json`.
5
+ *
6
+ * #2807: the design-value rule shipped installed, severity `"off"`, and arming
7
+ * it needed a severity AND a `typedAxes` option hand-written into
8
+ * `eslint.config.local.ts`. Nothing carried `design.tokens.axes` from
9
+ * `.lisa.config.json` to the rule, so a project could declare every axis,
10
+ * install the policy, pass every test, and enforce nothing.
11
+ *
12
+ * It is read HERE, at ESLint **config** load, rather than inside the rule at
13
+ * **rule** load. That distinction is what makes it unremarkable: the managed
14
+ * `eslint.config.ts` already reads `eslint.thresholds.json` and
15
+ * `eslint.ignore.config.json` from disk at exactly this moment, so this adds no
16
+ * new class of behaviour and gives ESLint's config cache nothing to fight. A
17
+ * rule reading project files on every `create()` would do both.
18
+ *
19
+ * It also needs no generation step, which is what the alternative — emitting
20
+ * rule options into a generated file during `lisa apply` — would have cost. A
21
+ * generated file can go stale against the config it was generated from; a value
22
+ * read at load cannot.
23
+ * @param projectRoot - Directory holding the project's `.lisa.config.json`.
24
+ * @returns The declared axes, or an empty list when none are declared.
25
+ * @throws {TypeError} When `design.tokens.axes` is present but is not a list of strings.
26
+ */
27
+ export declare function readTypedAxes(projectRoot: string): string[];
28
+ /**
29
+ * The `ui-standards/no-unbound-design-value` entry for a set of typed axes.
30
+ *
31
+ * Silence-by-default is deliberate and unchanged: an axis with no published
32
+ * variable collection behind it has no token to bind to, and a rule that fires
33
+ * on every project is a rule that gets switched off. What changes is that
34
+ * declaring an axis is now SUFFICIENT to arm it. Previously nothing was.
35
+ *
36
+ * An axis name outside the rule's fixed vocabulary is passed through rather
37
+ * than filtered out, so ESLint's own schema validation rejects it by name. A
38
+ * filter would turn a typo into silent non-enforcement, which is the defect
39
+ * this function exists to remove.
40
+ * @param typedAxes - Axes the project declares typed.
41
+ * @returns `"off"` when none are declared, an armed error entry otherwise.
42
+ */
43
+ export declare function getDesignValueBindingRule(typedAxes: readonly string[]): import("eslint").Linter.RuleEntry;
3
44
  /**
4
45
  * Creates the Expo ESLint configuration.
5
46
  * @param {object} options - Configuration options
@@ -7,9 +48,10 @@ export { defaultIgnores, defaultThresholds, getBaseConfigs, getBaseLanguageOptio
7
48
  * @param {string[]} [options.ignorePatterns] - Patterns to ignore
8
49
  * @param {object} [options.thresholds] - Threshold overrides
9
50
  * @param {string} [options.sourceRoot] - Prefix for source-relative file globs (e.g. `"src/"` for the SDK 55+/56 `/src` convention; defaults to `""`)
51
+ * @param {string[]} [options.typedAxes] - Axes the project declares typed, mirroring `design.tokens.axes`. Empty leaves the design-value rule off.
10
52
  * @returns {import("eslint").Linter.Config[]} ESLint flat config array
11
53
  */
12
- export declare function getExpoConfig({ tsconfigRootDir, ignorePatterns, thresholds, sourceRoot, }: {
54
+ export declare function getExpoConfig({ tsconfigRootDir, ignorePatterns, thresholds, sourceRoot, typedAxes, }: {
13
55
  tsconfigRootDir: string;
14
56
  ignorePatterns?: string[];
15
57
  thresholds?: typeof defaultThresholds;
@@ -21,5 +63,12 @@ export declare function getExpoConfig({ tsconfigRootDir, ignorePatterns, thresho
21
63
  * `src/features`, etc. Globs anchored with a leading globstar are unaffected.
22
64
  */
23
65
  sourceRoot?: string;
66
+ /**
67
+ * Axes the project declares typed, mirroring `design.tokens.axes` in
68
+ * `.lisa.config.json`. Read by the managed `eslint.config.ts` via
69
+ * {@link readTypedAxes}. Empty — the default — leaves
70
+ * `ui-standards/no-unbound-design-value` off.
71
+ */
72
+ typedAxes?: readonly string[];
24
73
  }): import("eslint").Linter.Config[];
25
74
  //# sourceMappingURL=expo.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"expo.d.ts","sourceRoot":"","sources":["../../../src/configs/eslint/expo.ts"],"names":[],"mappings":"AAsBA,OAAO,EAEL,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EAItB,cAAc,EAIf,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,CAAC;AAwBF;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,EAC5B,eAAe,EACf,cAA+B,EAC/B,UAA8B,EAC9B,UAAe,GAChB,EAAE;IACD,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,iBAAiB,CAAC;IACtC;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CA6QnC"}
1
+ {"version":3,"file":"expo.d.ts","sourceRoot":"","sources":["../../../src/configs/eslint/expo.ts"],"names":[],"mappings":"AAwBA,OAAO,EAEL,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EAItB,cAAc,EAIf,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,CAAC;AAwCF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAe3D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,OAAO,QAAQ,EAAE,MAAM,CAAC,SAAS,CAInC;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,EAC5B,eAAe,EACf,cAA+B,EAC/B,UAA8B,EAC9B,UAAe,EACf,SAAc,GACf,EAAE;IACD,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,iBAAiB,CAAC;IACtC;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,GAAG,OAAO,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAgRnC"}
@@ -16,7 +16,9 @@
16
16
  import oxlint from "eslint-plugin-oxlint";
17
17
  import react from "eslint-plugin-react";
18
18
  import reactCompiler from "eslint-plugin-react-compiler";
19
+ import { readFileSync } from "fs";
19
20
  import { createRequire } from "module";
21
+ import path from "path";
20
22
  import { fileURLToPath } from "url";
21
23
  // Import TypeScript config and utilities
22
24
  import { codeOrganization, defaultIgnores, defaultThresholds, getBaseConfigs, getBaseLanguageOptions, getJsFilesOverride, getScriptsFilesOverride, getSharedFilesOverride, getSharedRules, getTestFilesOverride, getTsFilesOverride, getTsTestFilesOverride, } from "./typescript.js";
@@ -32,6 +34,82 @@ const expoConfig = require("eslint-config-expo/flat");
32
34
  const reactPerf = require("eslint-plugin-react-perf");
33
35
  const jsxA11y = require("eslint-plugin-jsx-a11y");
34
36
  const tailwind = require("eslint-plugin-tailwindcss");
37
+ /**
38
+ * A project's `.lisa.config.json`, when it has one.
39
+ *
40
+ * Absence is not an error: a project that has never run `lisa apply` has no
41
+ * such file and declares no axes.
42
+ * @param file - Absolute path to the candidate `.lisa.config.json`.
43
+ * @returns Its text, or undefined when the project has no such file.
44
+ */
45
+ function readConfigText(file) {
46
+ try {
47
+ return readFileSync(file, "utf8");
48
+ }
49
+ catch {
50
+ return undefined;
51
+ }
52
+ }
53
+ /**
54
+ * Axes a project declares typed, read from its own `.lisa.config.json`.
55
+ *
56
+ * #2807: the design-value rule shipped installed, severity `"off"`, and arming
57
+ * it needed a severity AND a `typedAxes` option hand-written into
58
+ * `eslint.config.local.ts`. Nothing carried `design.tokens.axes` from
59
+ * `.lisa.config.json` to the rule, so a project could declare every axis,
60
+ * install the policy, pass every test, and enforce nothing.
61
+ *
62
+ * It is read HERE, at ESLint **config** load, rather than inside the rule at
63
+ * **rule** load. That distinction is what makes it unremarkable: the managed
64
+ * `eslint.config.ts` already reads `eslint.thresholds.json` and
65
+ * `eslint.ignore.config.json` from disk at exactly this moment, so this adds no
66
+ * new class of behaviour and gives ESLint's config cache nothing to fight. A
67
+ * rule reading project files on every `create()` would do both.
68
+ *
69
+ * It also needs no generation step, which is what the alternative — emitting
70
+ * rule options into a generated file during `lisa apply` — would have cost. A
71
+ * generated file can go stale against the config it was generated from; a value
72
+ * read at load cannot.
73
+ * @param projectRoot - Directory holding the project's `.lisa.config.json`.
74
+ * @returns The declared axes, or an empty list when none are declared.
75
+ * @throws {TypeError} When `design.tokens.axes` is present but is not a list of strings.
76
+ */
77
+ export function readTypedAxes(projectRoot) {
78
+ const file = path.join(projectRoot, ".lisa.config.json");
79
+ const raw = readConfigText(file);
80
+ if (raw === undefined)
81
+ return [];
82
+ const axes = JSON.parse(raw)
83
+ .design?.tokens?.axes;
84
+ if (axes === undefined)
85
+ return [];
86
+ if (!Array.isArray(axes) || axes.some(axis => typeof axis !== "string")) {
87
+ // Coercing a malformed declaration to "no axes" would disarm the rule
88
+ // silently — #2807 reproduced one layer down. Refuse loudly instead.
89
+ throw new TypeError(`${file}: design.tokens.axes must be an array of axis names, e.g. ["color"].`);
90
+ }
91
+ return axes;
92
+ }
93
+ /**
94
+ * The `ui-standards/no-unbound-design-value` entry for a set of typed axes.
95
+ *
96
+ * Silence-by-default is deliberate and unchanged: an axis with no published
97
+ * variable collection behind it has no token to bind to, and a rule that fires
98
+ * on every project is a rule that gets switched off. What changes is that
99
+ * declaring an axis is now SUFFICIENT to arm it. Previously nothing was.
100
+ *
101
+ * An axis name outside the rule's fixed vocabulary is passed through rather
102
+ * than filtered out, so ESLint's own schema validation rejects it by name. A
103
+ * filter would turn a typo into silent non-enforcement, which is the defect
104
+ * this function exists to remove.
105
+ * @param typedAxes - Axes the project declares typed.
106
+ * @returns `"off"` when none are declared, an armed error entry otherwise.
107
+ */
108
+ export function getDesignValueBindingRule(typedAxes) {
109
+ return typedAxes.length > 0
110
+ ? ["error", { typedAxes: [...typedAxes] }]
111
+ : "off";
112
+ }
35
113
  /**
36
114
  * Creates the Expo ESLint configuration.
37
115
  * @param {object} options - Configuration options
@@ -39,9 +117,10 @@ const tailwind = require("eslint-plugin-tailwindcss");
39
117
  * @param {string[]} [options.ignorePatterns] - Patterns to ignore
40
118
  * @param {object} [options.thresholds] - Threshold overrides
41
119
  * @param {string} [options.sourceRoot] - Prefix for source-relative file globs (e.g. `"src/"` for the SDK 55+/56 `/src` convention; defaults to `""`)
120
+ * @param {string[]} [options.typedAxes] - Axes the project declares typed, mirroring `design.tokens.axes`. Empty leaves the design-value rule off.
42
121
  * @returns {import("eslint").Linter.Config[]} ESLint flat config array
43
122
  */
44
- export function getExpoConfig({ tsconfigRootDir, ignorePatterns = defaultIgnores, thresholds = defaultThresholds, sourceRoot = "", }) {
123
+ export function getExpoConfig({ tsconfigRootDir, ignorePatterns = defaultIgnores, thresholds = defaultThresholds, sourceRoot = "", typedAxes = [], }) {
45
124
  return [
46
125
  // Global ignores
47
126
  {
@@ -84,10 +163,12 @@ export function getExpoConfig({ tsconfigRootDir, ignorePatterns = defaultIgnores
84
163
  "ui-standards/no-classname-outside-ui": "off",
85
164
  "ui-standards/no-direct-rn-imports": "off",
86
165
  // Regime-aware by declaration: silent until the project names the axes
87
- // it publishes design variables for. Activate per axis in
88
- // eslint.config.local.ts, mirroring `design.tokens.axes` in
89
- // .lisa.config.json e.g. ["error", { typedAxes: ["color"] }].
90
- "ui-standards/no-unbound-design-value": "off",
166
+ // it publishes design variables for. Declaring `design.tokens.axes` in
167
+ // .lisa.config.json is what arms it — the managed eslint.config.ts
168
+ // reads that key and hands it here (#2807). Declaring nothing leaves
169
+ // the rule off, which is the correct default and was previously the
170
+ // ONLY reachable state.
171
+ "ui-standards/no-unbound-design-value": getDesignValueBindingRule(typedAxes),
91
172
  // Tailwind
92
173
  "tailwindcss/classnames-order": [
93
174
  "error",
@@ -1 +1 @@
1
- {"version":3,"file":"expo.js","sourceRoot":"","sources":["../../../src/configs/eslint/expo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"expo.js","sourceRoot":"","sources":["../../../src/configs/eslint/expo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Shortest name that may be added at runtime.
3
+ *
4
+ * A three-character entry matches an initialism somewhere in almost any
5
+ * repository. Refusing it is the difference between a list with no
6
+ * false-positive problem and a list that reintroduces the one the shape guard
7
+ * was written to avoid.
8
+ */
9
+ export declare const MIN_NAME_LENGTH = 5;
10
+ /**
11
+ * Strip a name to the form the digests are taken over.
12
+ *
13
+ * Case and separators are spelling, not identity: `Some-Host`, `some host` and
14
+ * `SomeHost` are one name.
15
+ * @param raw - A name or a candidate span of source text.
16
+ * @returns Lowercased, alphanumerics only.
17
+ */
18
+ export declare function normalizeName(raw: string): string;
19
+ /**
20
+ * The stored form of one name: its normalized length, then its digest.
21
+ *
22
+ * The length is carried in the clear on purpose. It is what lets a scan reject
23
+ * the overwhelming majority of candidate spellings with an integer comparison
24
+ * instead of a hash, and knowing that some name is eight characters long
25
+ * identifies nobody.
26
+ * @param raw - The name to encode.
27
+ * @returns `"<length>:<digest>"`.
28
+ */
29
+ export declare function nameEntry(raw: string): string;
30
+ /**
31
+ * Host org and company names, as entries.
32
+ *
33
+ * Org and company slugs only. The two other identity shapes this repository
34
+ * carries — host repository names and a host tracker's project-key prefix — are
35
+ * deliberately absent; arming them is a several-hundred-file rewrite and an
36
+ * owner decision, not a cleanup. See
37
+ * `.agents/rules/never-name-downstream-projects.md` for how to add one.
38
+ *
39
+ * Sorted, so the order of this array says nothing about the order the names
40
+ * were added or how they relate to each other.
41
+ */
42
+ export declare const HOST_NAME_ENTRIES: readonly string[];
43
+ /** Environment variable carrying extra names, comma-separated, in plaintext. */
44
+ export declare const NAME_ENV_VAR = "LISA_DOWNSTREAM_NAMES";
45
+ /**
46
+ * Everything a scan needs to test a candidate span, prepared once.
47
+ *
48
+ * `lengths` is not a convenience: deriving it per line would cost more than the
49
+ * matching does, and it is the filter that lets almost every candidate be
50
+ * rejected on an integer comparison instead of a hash.
51
+ */
52
+ export interface NameMatcher {
53
+ /** `"<length>:<digest>"` for every known name. */
54
+ readonly entries: ReadonlySet<string>;
55
+ /** Every normalized length present in {@link entries}. */
56
+ readonly lengths: ReadonlySet<number>;
57
+ /** The longest normalized length present, used to stop widening a window. */
58
+ readonly maxLength: number;
59
+ }
60
+ /**
61
+ * The matcher a scan should use: the committed entries plus any supplied by
62
+ * the environment.
63
+ *
64
+ * Environment names shorter than {@link MIN_NAME_LENGTH} are dropped rather
65
+ * than rejected loudly — a scan is not the place to fail a run over a malformed
66
+ * environment variable, and a silently-ignored short name is visible the moment
67
+ * anyone checks whether the guard bites.
68
+ * @param env - Environment to read; defaults to the process environment.
69
+ * @returns A prepared matcher.
70
+ */
71
+ export declare function hostNameEntries(env?: NodeJS.ProcessEnv): NameMatcher;
72
+ /**
73
+ * Every span of one line that spells a known host name.
74
+ *
75
+ * Matching is anchored to word boundaries at both ends, which is what keeps a
76
+ * name from firing inside a longer word: an entry for `somehost` does not match
77
+ * `somehosting`.
78
+ * @param text - The line to scan.
79
+ * @param matcher - Prepared matcher from {@link hostNameEntries}.
80
+ * @returns The matched source spans, in order.
81
+ */
82
+ export declare function findHostNames(text: string, matcher: NameMatcher): readonly string[];
83
+ //# sourceMappingURL=downstream-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downstream-names.d.ts","sourceRoot":"","sources":["../../src/core/downstream-names.ts"],"names":[],"mappings":"AAgFA;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,IAAI,CAAC;AAEjC;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ7C;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAQ9C,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,YAAY,0BAA0B,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AA+CD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,GAAG,GAAE,MAAM,CAAC,UAA6B,GACxC,WAAW,CAQb;AA0FD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,GACnB,SAAS,MAAM,EAAE,CAKnB"}
@@ -0,0 +1,289 @@
1
+ /**
2
+ * The fixed list of host-project names the shape guard cannot see, stored so
3
+ * the list itself is never published.
4
+ *
5
+ * `downstream-references.ts` detects a *shape* — `github.com/owner/repo` and
6
+ * workflow `uses:` — and deliberately refuses to match bare `a/b` in prose,
7
+ * because that shape collides with file paths, date fractions and option
8
+ * syntax, and a guard with false positives gets disabled. That reasoning is
9
+ * sound and is left intact. It is also, measured on this repository, blind to
10
+ * every occurrence that actually happens: a host name in running prose, in a
11
+ * code comment, or inside a local absolute path, with no `github.com` in front
12
+ * of it and frequently no slash anywhere in it.
13
+ *
14
+ * A known list has no false-positive problem at all, which is the entire
15
+ * objection to widening the regex — a token either is one of a handful of known
16
+ * names or it is not, and `2026/08/20`, `src/core/index.ts` and `--flag=a/b`
17
+ * are none of them. The recorded objection to a list was different: a plaintext
18
+ * denylist in a public repository publishes the very names it exists to
19
+ * protect.
20
+ *
21
+ * **So the names are stored as truncated salted digests.** Be precise about
22
+ * what that buys, because overclaiming here would be worse than not doing it:
23
+ *
24
+ * - It prevents *enumeration*. Nobody can read this file, grep it, or receive
25
+ * it in an npm tarball and come away with a list of names.
26
+ * - It does **not** prevent *confirmation*. Anyone holding a specific guess can
27
+ * hash it and check. That is unavoidable for any in-tree denylist — the guard
28
+ * must be able to answer "is this token a host name?", and so must anyone
29
+ * holding the data that lets it. Truncation to 40 bits blunts even that:
30
+ * a brute force over plausible slugs returns thousands of preimages per
31
+ * digest, so a recovered candidate is not a recovered name.
32
+ *
33
+ * A name too sensitive to appear even as a digest belongs in
34
+ * `LISA_DOWNSTREAM_NAMES` instead — an out-of-tree, environment-supplied
35
+ * extension. The cost of that choice is stated plainly: an environment
36
+ * variable absent from required CI means the guard bites locally and not in
37
+ * CI, so it is the weaker of the two placements, not the stronger.
38
+ * @module core/downstream-names
39
+ */
40
+ import { createHash } from "node:crypto";
41
+ /**
42
+ * Domain separator mixed into every digest.
43
+ *
44
+ * Not a secret — it ships in this file and must, because required CI has to
45
+ * reproduce the digests. Its job is to make these values specific to this
46
+ * guard, so a digest here cannot be matched against a digest computed anywhere
47
+ * else for any other purpose.
48
+ */
49
+ const DIGEST_SALT = "lisa/downstream-name/v1";
50
+ /**
51
+ * Hex characters kept from each SHA-256 digest — 40 bits.
52
+ *
53
+ * Chosen against two opposing errors. Too wide and each digest has a single
54
+ * preimage, which turns "you can test a guess" into "you can recover the
55
+ * name". Too narrow and unrelated text collides: the tracked tree yields on the
56
+ * order of 10^7 candidate spellings per scan, so at 32 bits a handful of
57
+ * entries would be expected to produce a spurious hit roughly once every few
58
+ * dozen runs — a flaky guard, which is a disabled guard.
59
+ */
60
+ const DIGEST_HEX_LENGTH = 10;
61
+ /**
62
+ * Most words one name may span.
63
+ *
64
+ * Covers a company name written out in full (`Some Host Systems`) without
65
+ * paying for windows nobody uses.
66
+ */
67
+ const MAX_NAME_WORDS = 3;
68
+ /**
69
+ * The single characters allowed to sit between two words of one name.
70
+ *
71
+ * A name may be written spaced, hyphenated, underscored, dotted or slashed, and
72
+ * all of those must reach the same entry. A sentence boundary must not: `". "`
73
+ * is two characters, so `…the api. Creator of…` cannot join into `apicreator`.
74
+ */
75
+ const NAME_SEPARATORS = new Set([" ", "-", "_", ".", "/", "\\"]);
76
+ /**
77
+ * Shortest name that may be added at runtime.
78
+ *
79
+ * A three-character entry matches an initialism somewhere in almost any
80
+ * repository. Refusing it is the difference between a list with no
81
+ * false-positive problem and a list that reintroduces the one the shape guard
82
+ * was written to avoid.
83
+ */
84
+ export const MIN_NAME_LENGTH = 5;
85
+ /**
86
+ * Strip a name to the form the digests are taken over.
87
+ *
88
+ * Case and separators are spelling, not identity: `Some-Host`, `some host` and
89
+ * `SomeHost` are one name.
90
+ * @param raw - A name or a candidate span of source text.
91
+ * @returns Lowercased, alphanumerics only.
92
+ */
93
+ export function normalizeName(raw) {
94
+ return raw.toLowerCase().replaceAll(/[^a-z0-9]+/gu, "");
95
+ }
96
+ /**
97
+ * The stored form of one name: its normalized length, then its digest.
98
+ *
99
+ * The length is carried in the clear on purpose. It is what lets a scan reject
100
+ * the overwhelming majority of candidate spellings with an integer comparison
101
+ * instead of a hash, and knowing that some name is eight characters long
102
+ * identifies nobody.
103
+ * @param raw - The name to encode.
104
+ * @returns `"<length>:<digest>"`.
105
+ */
106
+ export function nameEntry(raw) {
107
+ const normalized = normalizeName(raw);
108
+ const digest = createHash("sha256")
109
+ .update(DIGEST_SALT)
110
+ .update(normalized)
111
+ .digest("hex")
112
+ .slice(0, DIGEST_HEX_LENGTH);
113
+ return `${normalized.length}:${digest}`;
114
+ }
115
+ /**
116
+ * Host org and company names, as entries.
117
+ *
118
+ * Org and company slugs only. The two other identity shapes this repository
119
+ * carries — host repository names and a host tracker's project-key prefix — are
120
+ * deliberately absent; arming them is a several-hundred-file rewrite and an
121
+ * owner decision, not a cleanup. See
122
+ * `.agents/rules/never-name-downstream-projects.md` for how to add one.
123
+ *
124
+ * Sorted, so the order of this array says nothing about the order the names
125
+ * were added or how they relate to each other.
126
+ */
127
+ export const HOST_NAME_ENTRIES = [
128
+ "10:53a6dbd968",
129
+ "12:b6c1d2ff60",
130
+ "14:503e0725ea",
131
+ "6:cd2afeda7f",
132
+ "7:bf13141dea",
133
+ "8:3ad5ab7f19",
134
+ "8:c712a72605",
135
+ ];
136
+ /** Environment variable carrying extra names, comma-separated, in plaintext. */
137
+ export const NAME_ENV_VAR = "LISA_DOWNSTREAM_NAMES";
138
+ /**
139
+ * Read the process environment through one narrow, reviewable exception.
140
+ *
141
+ * The ban exists so application code reaches configuration through a config
142
+ * service. This is a repository scanner with no project config to reach, and
143
+ * the variable it reads is the escape hatch for a name too sensitive to commit
144
+ * even as a digest.
145
+ * @returns The current process environment.
146
+ */
147
+ function readProcessEnv() {
148
+ // eslint-disable-next-line no-restricted-syntax -- a repository scanner has no config service to read
149
+ return process.env;
150
+ }
151
+ /**
152
+ * Matchers already built, keyed by the environment value they were built from.
153
+ *
154
+ * Returning the same object for the same environment is what makes the
155
+ * per-matcher answer cache reachable across files; rebuilding per file would
156
+ * leave every scan hashing from cold. In practice this holds one entry.
157
+ */
158
+ const built = new Map();
159
+ /**
160
+ * Assemble a matcher from the committed entries plus a raw environment value.
161
+ * @param raw - Comma-separated extra names, possibly empty.
162
+ * @returns A prepared matcher.
163
+ */
164
+ function buildMatcher(raw) {
165
+ const extra = raw
166
+ .split(",")
167
+ .map(part => normalizeName(part))
168
+ .filter(name => name.length >= MIN_NAME_LENGTH)
169
+ .map(name => nameEntry(name));
170
+ const entries = new Set([...HOST_NAME_ENTRIES, ...extra]);
171
+ const lengths = [...entries].map(entry => Number(entry.slice(0, entry.indexOf(":"))));
172
+ return {
173
+ entries,
174
+ lengths: new Set(lengths),
175
+ maxLength: Math.max(0, ...lengths),
176
+ };
177
+ }
178
+ /**
179
+ * The matcher a scan should use: the committed entries plus any supplied by
180
+ * the environment.
181
+ *
182
+ * Environment names shorter than {@link MIN_NAME_LENGTH} are dropped rather
183
+ * than rejected loudly — a scan is not the place to fail a run over a malformed
184
+ * environment variable, and a silently-ignored short name is visible the moment
185
+ * anyone checks whether the guard bites.
186
+ * @param env - Environment to read; defaults to the process environment.
187
+ * @returns A prepared matcher.
188
+ */
189
+ export function hostNameEntries(env = readProcessEnv()) {
190
+ const raw = env[NAME_ENV_VAR] ?? "";
191
+ const existing = built.get(raw);
192
+ if (existing !== undefined)
193
+ return existing;
194
+ const matcher = buildMatcher(raw);
195
+ // eslint-disable-next-line functional/immutable-data -- a pure memo of a pure function; it changes how long an answer takes, never the answer
196
+ built.set(raw, matcher);
197
+ return matcher;
198
+ }
199
+ /** Maximal runs of alphanumerics — the only thing a name can be made of. */
200
+ const WORD = /[A-Za-z0-9]+/gu;
201
+ /**
202
+ * Per-matcher memo of which candidate spellings are names.
203
+ *
204
+ * A repository scan asks about the same handful of words several million times,
205
+ * and a digest costs three orders of magnitude more than a map lookup. Keyed by
206
+ * matcher rather than globally, because the answer depends on which entries are
207
+ * loaded — one shared cache would let a matcher answer another matcher's
208
+ * question, which is how a guard starts reporting a stale verdict.
209
+ */
210
+ const answered = new WeakMap();
211
+ /**
212
+ * Whether a candidate spelling is one of the known names.
213
+ * @param candidate - Alphanumerics only, in whatever case the source used.
214
+ * @param matcher - Prepared matcher.
215
+ * @returns True when the candidate hashes to a known entry.
216
+ */
217
+ function isKnownName(candidate, matcher) {
218
+ const cache = answered.get(matcher) ?? new Map();
219
+ if (!answered.has(matcher))
220
+ answered.set(matcher, cache);
221
+ const remembered = cache.get(candidate);
222
+ if (remembered !== undefined)
223
+ return remembered;
224
+ const known = matcher.entries.has(nameEntry(candidate));
225
+ // eslint-disable-next-line functional/immutable-data -- same memo, same guarantee
226
+ cache.set(candidate, known);
227
+ return known;
228
+ }
229
+ /**
230
+ * Whether `next` continues the name that `previous` started.
231
+ *
232
+ * Exactly one separator may sit between them. A sentence boundary is two
233
+ * characters, so `the api. Creator of` cannot join into `apicreator`.
234
+ * @param text - The line both words came from.
235
+ * @param previous - The earlier word match.
236
+ * @param next - The later word match.
237
+ * @returns True when the two words belong to one name.
238
+ */
239
+ function continues(text, previous, next) {
240
+ const gap = previous.index + previous[0].length;
241
+ return next.index - gap === 1 && NAME_SEPARATORS.has(text[gap] ?? "");
242
+ }
243
+ /* eslint-disable functional/no-let, functional/immutable-data -- a scan this size cannot afford an allocation per word, and neither accumulator escapes the call */
244
+ /**
245
+ * Every span starting at one word that spells a known host name.
246
+ *
247
+ * The window stops widening as soon as it is longer than the longest known
248
+ * name, because adding a word can only make it longer still.
249
+ * @param text - The line being scanned.
250
+ * @param words - Every word on the line.
251
+ * @param first - Index of the word the window starts at.
252
+ * @param matcher - Prepared matcher.
253
+ * @returns The matched source spans.
254
+ */
255
+ function namesStartingAt(text, words, first, matcher) {
256
+ const start = words[first]?.index ?? 0;
257
+ const found = [];
258
+ let candidate = "";
259
+ let previous;
260
+ for (const word of words.slice(first, first + MAX_NAME_WORDS)) {
261
+ if (previous !== undefined && !continues(text, previous, word))
262
+ break;
263
+ previous = word;
264
+ candidate += word[0];
265
+ if (candidate.length > matcher.maxLength)
266
+ break;
267
+ if (matcher.lengths.has(candidate.length) &&
268
+ isKnownName(candidate, matcher)) {
269
+ found.push(text.slice(start, word.index + word[0].length));
270
+ }
271
+ }
272
+ return found;
273
+ }
274
+ /* eslint-enable functional/no-let, functional/immutable-data -- back to repository defaults */
275
+ /**
276
+ * Every span of one line that spells a known host name.
277
+ *
278
+ * Matching is anchored to word boundaries at both ends, which is what keeps a
279
+ * name from firing inside a longer word: an entry for `somehost` does not match
280
+ * `somehosting`.
281
+ * @param text - The line to scan.
282
+ * @param matcher - Prepared matcher from {@link hostNameEntries}.
283
+ * @returns The matched source spans, in order.
284
+ */
285
+ export function findHostNames(text, matcher) {
286
+ const words = [...text.matchAll(WORD)];
287
+ return words.flatMap((_word, first) => namesStartingAt(text, words, first, matcher));
288
+ }
289
+ //# sourceMappingURL=downstream-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downstream-names.js","sourceRoot":"","sources":["../../src/core/downstream-names.ts"],"names":[],"mappings":"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"}
@@ -5,13 +5,26 @@
5
5
  * public and `dist/` is in the npm `files` allowlist, so a comment in `src/` is
6
6
  * published twice — on github.com and to every consumer that installs.
7
7
  *
8
- * **Shape detection, not a name list.** A guard that enumerated the client
9
- * names would publish the very list it exists to protect, in the same public
10
- * repository. So this allowlists the orgs that are legitimately public and
11
- * flags everything else, which also means a NEW downstream project is caught
12
- * without anyone remembering to add it.
8
+ * **Two detectors, because one shape was never the whole problem.**
9
+ *
10
+ * The first is shape detection: allowlist the orgs that are legitimately
11
+ * public, flag every other `github.com/owner/repo` or workflow `uses:`, and a
12
+ * newly onboarded downstream project is caught without anyone remembering to
13
+ * add it. That reach is real and it is kept.
14
+ *
15
+ * The second is a known-name check, added because the first measured zero
16
+ * violations on a tree that had them. Every occurrence that actually happens is
17
+ * a bare name in prose, in a code comment, or inside a local absolute path —
18
+ * no `github.com` in front of it, and frequently no slash in it at all. Shape
19
+ * detection cannot reach that without matching bare `a/b` everywhere, which
20
+ * collides with file paths, date fractions and option syntax; a guard with
21
+ * false positives gets disabled, which is worse than a known blind spot. A
22
+ * fixed list has no false-positive problem to trade against, and the objection
23
+ * to a list — that it publishes the names — is answered by storing digests
24
+ * rather than names. See `./downstream-names.js`.
13
25
  * @module core/downstream-references
14
26
  */
27
+ import type { NameMatcher } from "./downstream-names.js";
15
28
  /**
16
29
  * GitHub orgs this repository may legitimately name.
17
30
  *
@@ -46,7 +59,9 @@ export interface DownstreamReference {
46
59
  /**
47
60
  * Find downstream-project references in one file's contents.
48
61
  * @param contents - The file's text.
62
+ * @param matcher - Name matcher to use; defaults to the committed list plus
63
+ * anything the environment adds.
49
64
  * @returns Every violation found, in line order.
50
65
  */
51
- export declare function findDownstreamReferences(contents: string): readonly DownstreamReference[];
66
+ export declare function findDownstreamReferences(contents: string, matcher?: NameMatcher): readonly DownstreamReference[];
52
67
  //# sourceMappingURL=downstream-references.d.ts.map