vigiles 2.0.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 (156) hide show
  1. package/.claude/settings.json +46 -0
  2. package/.claude/settings.local.json +8 -0
  3. package/.claude-plugin/hooks/post-edit.sh +34 -0
  4. package/.claude-plugin/hooks/pre-edit.sh +40 -0
  5. package/.claude-plugin/hooks/session-start.sh +38 -0
  6. package/.claude-plugin/marketplace.json +14 -0
  7. package/.claude-plugin/plugin.json +47 -0
  8. package/.github/workflows/ci.yml +81 -0
  9. package/.prettierignore +1 -0
  10. package/.vigiles/generated.d.ts +205 -0
  11. package/CLAUDE.md +95 -0
  12. package/CLAUDE.md.spec.ts +142 -0
  13. package/CONTRIBUTING.md +121 -0
  14. package/LICENSE +21 -0
  15. package/README.md +377 -0
  16. package/action.yml +25 -0
  17. package/dist/action.d.ts +7 -0
  18. package/dist/action.d.ts.map +1 -0
  19. package/dist/action.js +180 -0
  20. package/dist/action.js.map +1 -0
  21. package/dist/cli.d.ts +12 -0
  22. package/dist/cli.d.ts.map +1 -0
  23. package/dist/cli.js +1267 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/cli.test.d.ts +2 -0
  26. package/dist/cli.test.d.ts.map +1 -0
  27. package/dist/cli.test.js +650 -0
  28. package/dist/cli.test.js.map +1 -0
  29. package/dist/compile.d.ts +101 -0
  30. package/dist/compile.d.ts.map +1 -0
  31. package/dist/compile.js +503 -0
  32. package/dist/compile.js.map +1 -0
  33. package/dist/evolve.d.ts +132 -0
  34. package/dist/evolve.d.ts.map +1 -0
  35. package/dist/evolve.js +599 -0
  36. package/dist/evolve.js.map +1 -0
  37. package/dist/freshness.d.ts +67 -0
  38. package/dist/freshness.d.ts.map +1 -0
  39. package/dist/freshness.js +244 -0
  40. package/dist/freshness.js.map +1 -0
  41. package/dist/freshness.test.d.ts +2 -0
  42. package/dist/freshness.test.d.ts.map +1 -0
  43. package/dist/freshness.test.js +356 -0
  44. package/dist/freshness.test.js.map +1 -0
  45. package/dist/generate-types.d.ts +34 -0
  46. package/dist/generate-types.d.ts.map +1 -0
  47. package/dist/generate-types.js +381 -0
  48. package/dist/generate-types.js.map +1 -0
  49. package/dist/inline.d.ts +58 -0
  50. package/dist/inline.d.ts.map +1 -0
  51. package/dist/inline.js +142 -0
  52. package/dist/inline.js.map +1 -0
  53. package/dist/inline.test.d.ts +5 -0
  54. package/dist/inline.test.d.ts.map +1 -0
  55. package/dist/inline.test.js +152 -0
  56. package/dist/inline.test.js.map +1 -0
  57. package/dist/linters.d.ts +38 -0
  58. package/dist/linters.d.ts.map +1 -0
  59. package/dist/linters.js +588 -0
  60. package/dist/linters.js.map +1 -0
  61. package/dist/proofs.d.ts +272 -0
  62. package/dist/proofs.d.ts.map +1 -0
  63. package/dist/proofs.js +622 -0
  64. package/dist/proofs.js.map +1 -0
  65. package/dist/proofs.test.d.ts +9 -0
  66. package/dist/proofs.test.d.ts.map +1 -0
  67. package/dist/proofs.test.js +952 -0
  68. package/dist/proofs.test.js.map +1 -0
  69. package/dist/spec.d.ts +258 -0
  70. package/dist/spec.d.ts.map +1 -0
  71. package/dist/spec.js +113 -0
  72. package/dist/spec.js.map +1 -0
  73. package/dist/spec.test.d.ts +2 -0
  74. package/dist/spec.test.d.ts.map +1 -0
  75. package/dist/spec.test.js +1222 -0
  76. package/dist/spec.test.js.map +1 -0
  77. package/dist/types.d.ts +101 -0
  78. package/dist/types.d.ts.map +1 -0
  79. package/dist/types.js +3 -0
  80. package/dist/types.js.map +1 -0
  81. package/dist/validate.d.ts +10 -0
  82. package/dist/validate.d.ts.map +1 -0
  83. package/dist/validate.js +286 -0
  84. package/dist/validate.js.map +1 -0
  85. package/dist/validate.test.d.ts +2 -0
  86. package/dist/validate.test.d.ts.map +1 -0
  87. package/dist/validate.test.js +531 -0
  88. package/dist/validate.test.js.map +1 -0
  89. package/docs/agent-setup.md +85 -0
  90. package/docs/agent-workflows.md +103 -0
  91. package/docs/comparison.md +71 -0
  92. package/docs/freshness.md +124 -0
  93. package/docs/inline-mode.md +119 -0
  94. package/docs/linter-support.md +166 -0
  95. package/docs/spec-format.md +194 -0
  96. package/eslint.config.mjs +79 -0
  97. package/examples/CLAUDE.md +54 -0
  98. package/examples/CLAUDE.md.spec.ts +65 -0
  99. package/examples/SKILL.md +50 -0
  100. package/examples/SKILL.md.spec.ts +57 -0
  101. package/fixtures/example-project/CLAUDE.md +11 -0
  102. package/fixtures/example-project/package.json +9 -0
  103. package/fixtures/example-project/src/index.ts +3 -0
  104. package/fixtures/example-project/src/utils.test.ts +2 -0
  105. package/fixtures/example-project/src/utils.ts +3 -0
  106. package/logo.png +0 -0
  107. package/package.json +42 -0
  108. package/research/adoption-strategy.md +111 -0
  109. package/research/agent-integration.md +145 -0
  110. package/research/ai-code-quality.md +197 -0
  111. package/research/code-search-for-agents.md +313 -0
  112. package/research/competitive-landscape.md +163 -0
  113. package/research/doc-freshness.md +516 -0
  114. package/research/executable-specs.md +368 -0
  115. package/research/feature-ideas.md +464 -0
  116. package/research/formal-proofs-for-agents.md +338 -0
  117. package/research/fp-for-agent-harness.md +150 -0
  118. package/research/fp-for-deterministic-ai.md +131 -0
  119. package/research/self-evolving-specs.md +298 -0
  120. package/schemas/claude-md-strict.yml +18 -0
  121. package/schemas/claude-md.yml +6 -0
  122. package/schemas/skill-strict.yml +12 -0
  123. package/schemas/skill.yml +5 -0
  124. package/skills/audit-feedback-loop/SKILL.md +76 -0
  125. package/skills/edit-spec/SKILL.md +131 -0
  126. package/skills/enforce-rules-format/SKILL.md +71 -0
  127. package/skills/generate-logo/SKILL.md +102 -0
  128. package/skills/generate-rule/SKILL.md +90 -0
  129. package/skills/linter-docs/clippy.md +241 -0
  130. package/skills/linter-docs/eslint.md +384 -0
  131. package/skills/linter-docs/pylint.md +288 -0
  132. package/skills/linter-docs/rubocop.md +277 -0
  133. package/skills/linter-docs/ruff.md +187 -0
  134. package/skills/linter-docs/stylelint.md +247 -0
  135. package/skills/migrate-to-spec/SKILL.md +124 -0
  136. package/skills/pr-to-lint-rule/SKILL.md +97 -0
  137. package/skills/strengthen/SKILL.md +168 -0
  138. package/src/action.ts +214 -0
  139. package/src/cli.test.ts +914 -0
  140. package/src/cli.ts +1631 -0
  141. package/src/compile.ts +691 -0
  142. package/src/evolve.ts +781 -0
  143. package/src/freshness.test.ts +449 -0
  144. package/src/freshness.ts +299 -0
  145. package/src/generate-types.ts +448 -0
  146. package/src/inline.test.ts +206 -0
  147. package/src/inline.ts +164 -0
  148. package/src/linters.ts +739 -0
  149. package/src/proofs.test.ts +1314 -0
  150. package/src/proofs.ts +849 -0
  151. package/src/spec.test.ts +1471 -0
  152. package/src/spec.ts +427 -0
  153. package/src/types.ts +117 -0
  154. package/src/validate.test.ts +701 -0
  155. package/src/validate.ts +381 -0
  156. package/tsconfig.json +23 -0
@@ -0,0 +1,588 @@
1
+ "use strict";
2
+ /**
3
+ * Linter cross-referencing engine.
4
+ *
5
+ * Verifies that linter rule references (e.g., "eslint/no-console") point to
6
+ * real rules that exist and are enabled in project config. Supports:
7
+ * ESLint, Stylelint (Node API), Ruff, Clippy, Pylint, RuboCop (CLI).
8
+ *
9
+ * This is the core moat — no other tool resolves rules against 6 linter APIs
10
+ * and checks config-enabled status.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.extractLinterName = extractLinterName;
14
+ exports.extractRuleName = extractRuleName;
15
+ exports.checkLinterRule = checkLinterRule;
16
+ const node_fs_1 = require("node:fs");
17
+ const node_path_1 = require("node:path");
18
+ const node_child_process_1 = require("node:child_process");
19
+ const node_module_1 = require("node:module");
20
+ const glob_1 = require("glob");
21
+ // ---------------------------------------------------------------------------
22
+ // Parsing enforcement references
23
+ // ---------------------------------------------------------------------------
24
+ /** @internal */ function extractLinterName(enforcedBy) {
25
+ const colonIdx = enforcedBy.indexOf("::");
26
+ const slashIdx = enforcedBy.indexOf("/");
27
+ if (colonIdx === -1 && slashIdx === -1)
28
+ return enforcedBy;
29
+ if (colonIdx === -1)
30
+ return enforcedBy.substring(0, slashIdx);
31
+ if (slashIdx === -1)
32
+ return enforcedBy.substring(0, colonIdx);
33
+ return enforcedBy.substring(0, Math.min(slashIdx, colonIdx));
34
+ }
35
+ /** @internal */ function extractRuleName(enforcedBy) {
36
+ const colonIdx = enforcedBy.indexOf("::");
37
+ const slashIdx = enforcedBy.indexOf("/");
38
+ if (colonIdx === -1 && slashIdx === -1)
39
+ return null;
40
+ if (colonIdx === -1)
41
+ return enforcedBy.substring(slashIdx + 1);
42
+ if (slashIdx === -1)
43
+ return enforcedBy.substring(colonIdx + 2);
44
+ const idx = Math.min(slashIdx, colonIdx);
45
+ const sep = idx === colonIdx ? 2 : 1;
46
+ return enforcedBy.substring(idx + sep);
47
+ }
48
+ const SAFE_RULE_NAME_RE = /^[a-zA-Z0-9_\-/.:#]+$/;
49
+ // ---------------------------------------------------------------------------
50
+ // ESLint plugin resolution
51
+ // ---------------------------------------------------------------------------
52
+ function eslintPluginPkgNames(pluginName) {
53
+ if (pluginName.startsWith("@")) {
54
+ const parts = pluginName.split("/");
55
+ if (parts.length === 1)
56
+ return [`${parts[0]}/eslint-plugin`];
57
+ return [
58
+ `${parts[0]}/eslint-plugin-${parts[1]}`,
59
+ `${parts[0]}/eslint-plugin`,
60
+ ];
61
+ }
62
+ return [`eslint-plugin-${pluginName}`];
63
+ }
64
+ function tryResolvePlugin(req, pkg) {
65
+ try {
66
+ const plugin = req(pkg);
67
+ const rules = plugin.rules ?? plugin.default?.rules;
68
+ if (rules)
69
+ return new Set(Object.keys(rules));
70
+ return null;
71
+ }
72
+ catch {
73
+ return null;
74
+ }
75
+ }
76
+ function resolveEslintPluginRules(pluginName, basePath) {
77
+ try {
78
+ const req = (0, node_module_1.createRequire)((0, node_path_1.resolve)(basePath, "package.json"));
79
+ const pkgNames = eslintPluginPkgNames(pluginName);
80
+ for (const pkg of pkgNames) {
81
+ const result = tryResolvePlugin(req, pkg);
82
+ if (result)
83
+ return result;
84
+ }
85
+ return null;
86
+ }
87
+ catch {
88
+ return null;
89
+ }
90
+ }
91
+ // ---------------------------------------------------------------------------
92
+ // Built-in resolvers (Node API)
93
+ // ---------------------------------------------------------------------------
94
+ const LINTER_RESOLVERS = {
95
+ eslint(basePath) {
96
+ const req = (0, node_module_1.createRequire)((0, node_path_1.resolve)(basePath, "package.json"));
97
+ const { builtinRules } = req("eslint/use-at-your-own-risk");
98
+ const rules = new Set(builtinRules.keys());
99
+ rules._basePath = basePath;
100
+ rules._isEslint = true;
101
+ return rules;
102
+ },
103
+ stylelint(basePath) {
104
+ const req = (0, node_module_1.createRequire)((0, node_path_1.resolve)(basePath, "package.json"));
105
+ const mod = req("stylelint");
106
+ return new Set(Object.keys(mod.rules));
107
+ },
108
+ };
109
+ // ---------------------------------------------------------------------------
110
+ // CLI-based per-rule checks
111
+ // ---------------------------------------------------------------------------
112
+ const CLI_RULE_CHECKS = {
113
+ ruff(ruleName) {
114
+ (0, node_child_process_1.execSync)(`ruff rule ${ruleName}`, { stdio: "ignore" });
115
+ },
116
+ clippy(ruleName) {
117
+ (0, node_child_process_1.execSync)(`cargo clippy --explain ${ruleName}`, { stdio: "ignore" });
118
+ },
119
+ pylint(ruleName) {
120
+ const output = (0, node_child_process_1.execSync)(`pylint --help-msg=${ruleName}`, {
121
+ encoding: "utf-8",
122
+ stdio: ["pipe", "pipe", "pipe"],
123
+ });
124
+ if (output.includes("No such message id")) {
125
+ throw new Error(`Unknown pylint message: ${ruleName}`);
126
+ }
127
+ },
128
+ rubocop(ruleName) {
129
+ const output = (0, node_child_process_1.execSync)(`rubocop --show-cops ${ruleName}`, {
130
+ encoding: "utf-8",
131
+ stdio: ["pipe", "pipe", "ignore"],
132
+ });
133
+ if (!output || output.trim().length === 0) {
134
+ throw new Error(`Unknown cop: ${ruleName}`);
135
+ }
136
+ },
137
+ };
138
+ function createCachedChecker(loadConfigFn) {
139
+ const cache = new Map();
140
+ return (ruleName, basePath) => {
141
+ if (!cache.has(basePath)) {
142
+ try {
143
+ cache.set(basePath, loadConfigFn(basePath));
144
+ }
145
+ catch {
146
+ cache.set(basePath, null);
147
+ }
148
+ }
149
+ const config = cache.get(basePath);
150
+ if (!config)
151
+ return "unknown";
152
+ return config(ruleName);
153
+ };
154
+ }
155
+ const LINTER_CONFIG_CHECKERS = {
156
+ eslint: createCachedChecker((basePath) => {
157
+ try {
158
+ const script = `
159
+ const { loadESLint } = require("eslint");
160
+ (async () => {
161
+ try {
162
+ const ESLint = await loadESLint();
163
+ const eslint = new ESLint({ cwd: ${JSON.stringify(basePath)} });
164
+ const config = await eslint.calculateConfigForFile("dummy.js");
165
+ console.log(JSON.stringify(config.rules || {}));
166
+ } catch(e) {
167
+ console.log("{}");
168
+ }
169
+ })();
170
+ `;
171
+ const output = (0, node_child_process_1.execSync)(`node -e '${script.replace(/'/g, "'\\''")}'`, {
172
+ encoding: "utf-8",
173
+ cwd: basePath,
174
+ stdio: ["pipe", "pipe", "pipe"],
175
+ timeout: 15000,
176
+ });
177
+ const rules = JSON.parse(output.trim() || "{}");
178
+ return (ruleName) => {
179
+ if (!(ruleName in rules))
180
+ return "unknown";
181
+ const setting = rules[ruleName];
182
+ const severity = Array.isArray(setting) ? setting[0] : setting;
183
+ if (severity === 0 || severity === "off")
184
+ return "disabled";
185
+ return "enabled";
186
+ };
187
+ }
188
+ catch {
189
+ return null;
190
+ }
191
+ }),
192
+ stylelint: createCachedChecker((basePath) => {
193
+ try {
194
+ const script = `
195
+ const stylelint = require("stylelint");
196
+ (async () => {
197
+ try {
198
+ const linter = stylelint.createLinter({});
199
+ const result = await linter.getConfigForFile(${JSON.stringify((0, node_path_1.resolve)(basePath, "dummy.css"))});
200
+ console.log(JSON.stringify(result.config.rules || {}));
201
+ } catch(e) {
202
+ console.log("{}");
203
+ }
204
+ })();
205
+ `;
206
+ const output = (0, node_child_process_1.execSync)(`node -e '${script.replace(/'/g, "'\\''")}'`, {
207
+ encoding: "utf-8",
208
+ cwd: basePath,
209
+ stdio: ["pipe", "pipe", "pipe"],
210
+ timeout: 15000,
211
+ });
212
+ const rules = JSON.parse(output.trim() || "{}");
213
+ return (ruleName) => {
214
+ if (!(ruleName in rules))
215
+ return "unknown";
216
+ const setting = rules[ruleName];
217
+ if (setting === null || (Array.isArray(setting) && setting[0] === null))
218
+ return "disabled";
219
+ return "enabled";
220
+ };
221
+ }
222
+ catch {
223
+ return null;
224
+ }
225
+ }),
226
+ ruff: createCachedChecker((basePath) => {
227
+ try {
228
+ const dummyPath = (0, node_path_1.resolve)(basePath, "dummy.py");
229
+ const output = (0, node_child_process_1.execSync)(`ruff check --show-settings ${dummyPath}`, {
230
+ encoding: "utf-8",
231
+ cwd: basePath,
232
+ stdio: ["pipe", "pipe", "pipe"],
233
+ timeout: 10000,
234
+ });
235
+ const enabledMatch = output.match(/linter\.rules\.enabled\s*=\s*\[([\s\S]*?)\]/);
236
+ const enabledCodes = new Set();
237
+ if (enabledMatch?.[1]) {
238
+ const codeRe = /\(([A-Z]+\d*)\)/g;
239
+ let m;
240
+ while ((m = codeRe.exec(enabledMatch[1])) !== null) {
241
+ enabledCodes.add(m[1]);
242
+ }
243
+ }
244
+ return (ruleName) => {
245
+ if (enabledCodes.has(ruleName))
246
+ return "enabled";
247
+ for (const code of enabledCodes) {
248
+ if (code.startsWith(ruleName))
249
+ return "enabled";
250
+ }
251
+ return "disabled";
252
+ };
253
+ }
254
+ catch {
255
+ return null;
256
+ }
257
+ }),
258
+ pylint: createCachedChecker((basePath) => {
259
+ try {
260
+ const output = (0, node_child_process_1.execSync)("pylint --list-msgs-enabled", {
261
+ encoding: "utf-8",
262
+ cwd: basePath,
263
+ stdio: ["pipe", "pipe", "pipe"],
264
+ timeout: 15000,
265
+ });
266
+ const disabledIdx = output.indexOf("Disabled messages:");
267
+ const enabledSection = disabledIdx >= 0 ? output.substring(0, disabledIdx) : output;
268
+ const disabledSection = disabledIdx >= 0 ? output.substring(disabledIdx) : "";
269
+ return (ruleName) => {
270
+ if (disabledSection.includes(ruleName))
271
+ return "disabled";
272
+ if (enabledSection.includes(ruleName))
273
+ return "enabled";
274
+ return "unknown";
275
+ };
276
+ }
277
+ catch {
278
+ return null;
279
+ }
280
+ }),
281
+ rubocop(ruleName, basePath) {
282
+ try {
283
+ const output = (0, node_child_process_1.execSync)(`rubocop --show-cops ${ruleName}`, {
284
+ encoding: "utf-8",
285
+ cwd: basePath,
286
+ stdio: ["pipe", "pipe", "ignore"],
287
+ });
288
+ if (!output || output.trim().length === 0)
289
+ return "unknown";
290
+ const enabledMatch = output.match(/Enabled:\s*(true|false|pending)/);
291
+ if (!enabledMatch)
292
+ return "unknown";
293
+ return enabledMatch[1] === "true" ? "enabled" : "disabled";
294
+ }
295
+ catch {
296
+ return "unknown";
297
+ }
298
+ },
299
+ clippy: createCachedChecker((basePath) => {
300
+ try {
301
+ const cargoPath = (0, node_path_1.resolve)(basePath, "Cargo.toml");
302
+ if (!(0, node_fs_1.existsSync)(cargoPath))
303
+ return null;
304
+ const content = (0, node_fs_1.readFileSync)(cargoPath, "utf-8");
305
+ const sectionMatch = content.match(/\[lints\.clippy\]([\s\S]*?)(?=\n\[|$)/);
306
+ if (!sectionMatch?.[1])
307
+ return null;
308
+ const section = sectionMatch[1];
309
+ return (ruleName) => {
310
+ const shortName = ruleName.replace(/^clippy::/, "");
311
+ const ruleMatch = section.match(new RegExp(`${shortName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s*=\\s*"(\\w+)"`));
312
+ if (!ruleMatch?.[1])
313
+ return "unknown";
314
+ return ruleMatch[1] === "allow" ? "disabled" : "enabled";
315
+ };
316
+ }
317
+ catch {
318
+ return null;
319
+ }
320
+ }),
321
+ };
322
+ function cliAvailable(command) {
323
+ try {
324
+ (0, node_child_process_1.execSync)(`which ${command}`, { stdio: "ignore" });
325
+ return true;
326
+ }
327
+ catch {
328
+ return false;
329
+ }
330
+ }
331
+ const CLI_TOOL_FOR_LINTER = {
332
+ ruff: "ruff",
333
+ clippy: "cargo",
334
+ pylint: "pylint",
335
+ rubocop: "rubocop",
336
+ };
337
+ // ---------------------------------------------------------------------------
338
+ // Custom linter support (rulesDir)
339
+ // ---------------------------------------------------------------------------
340
+ function ruleFileExists(ruleName, rulesDir, basePath) {
341
+ const dir = (0, node_path_1.resolve)(basePath, rulesDir);
342
+ if (!(0, node_fs_1.existsSync)(dir))
343
+ return null;
344
+ const matches = (0, glob_1.globSync)(`${ruleName}.*`, { cwd: dir });
345
+ return matches.length > 0;
346
+ }
347
+ function makeResult(ctx, exists, enabled = "unknown", error) {
348
+ return { exists, enabled, linter: ctx.linterName, rule: ctx.ruleName, error };
349
+ }
350
+ /**
351
+ * Levenshtein distance for short-string typo detection. Rule names are
352
+ * short so edit distance is more appropriate than NCD (which is tuned
353
+ * for longer texts).
354
+ */
355
+ function editDistance(a, b) {
356
+ if (a === b)
357
+ return 0;
358
+ const m = a.length;
359
+ const n = b.length;
360
+ if (m === 0)
361
+ return n;
362
+ if (n === 0)
363
+ return m;
364
+ const dp = Array.from({ length: n + 1 }, (_, i) => i);
365
+ for (let i = 1; i <= m; i++) {
366
+ let prev = dp[0];
367
+ dp[0] = i;
368
+ for (let j = 1; j <= n; j++) {
369
+ const tmp = dp[j];
370
+ dp[j] =
371
+ a[i - 1] === b[j - 1] ? prev : 1 + Math.min(prev, dp[j], dp[j - 1]);
372
+ prev = tmp;
373
+ }
374
+ }
375
+ return dp[n];
376
+ }
377
+ /** Top-N closest rule names by edit distance, filtered by a max distance. */
378
+ function closestRuleNames(target, candidates, limit = 3, maxDistance = 4) {
379
+ const scored = [];
380
+ for (const c of candidates) {
381
+ const d = editDistance(target, c);
382
+ if (d <= maxDistance)
383
+ scored.push({ name: c, dist: d });
384
+ }
385
+ scored.sort((a, b) => a.dist - b.dist);
386
+ return scored.slice(0, limit).map((s) => s.name);
387
+ }
388
+ /** @internal */ function tryNodeResolver(ctx) {
389
+ const resolver = LINTER_RESOLVERS[ctx.linterName];
390
+ if (!resolver)
391
+ return null;
392
+ try {
393
+ const resolved = resolver(ctx.basePath);
394
+ const eslintSet = resolved;
395
+ if (!resolved.has(ctx.ruleName)) {
396
+ const foundInPlugin = eslintSet._isEslint &&
397
+ ctx.ruleName.includes("/") &&
398
+ isEslintPluginRule(ctx.ruleName, eslintSet._basePath ?? ctx.basePath);
399
+ if (!foundInPlugin) {
400
+ const suggestions = closestRuleNames(ctx.ruleName, resolved);
401
+ const hint = suggestions.length > 0
402
+ ? ` Did you mean: ${suggestions.map((s) => `"${ctx.linterName}/${s}"`).join(", ")}?`
403
+ : "";
404
+ return makeResult(ctx, false, "unknown", `Rule "${ctx.ruleName}" not found in ${ctx.linterName}.${hint}`);
405
+ }
406
+ }
407
+ const enabled = checkConfigEnabled(ctx.linterName, ctx.ruleName, ctx.basePath, ctx.catalogOnly);
408
+ return makeResult(ctx, true, enabled);
409
+ }
410
+ catch {
411
+ return null;
412
+ }
413
+ }
414
+ function isEslintPluginRule(ruleName, basePath) {
415
+ const pluginPrefix = ruleName.substring(0, ruleName.indexOf("/"));
416
+ const pluginRuleName = ruleName.substring(ruleName.indexOf("/") + 1);
417
+ const pluginRules = resolveEslintPluginRules(pluginPrefix, basePath);
418
+ return pluginRules?.has(pluginRuleName) === true;
419
+ }
420
+ /** @internal */ function tryScopedPlugin(ctx) {
421
+ const pluginRules = resolveEslintPluginRules(ctx.linterName, ctx.basePath);
422
+ if (!pluginRules)
423
+ return null;
424
+ if (!pluginRules.has(ctx.ruleName)) {
425
+ return makeResult(ctx, false, "unknown", `Rule "${ctx.ruleName}" not found in ${ctx.linterName}`);
426
+ }
427
+ const enabled = checkConfigEnabled("eslint", `${ctx.linterName}/${ctx.ruleName}`, ctx.basePath, ctx.catalogOnly);
428
+ return makeResult(ctx, true, enabled);
429
+ }
430
+ /**
431
+ * Enumerate all rules for a CLI-based linter so `tryCliCheck` can emit
432
+ * closest-match suggestions on typos. Result is cached per (linter,
433
+ * basePath) so each linter's discovery CLI runs at most once per audit.
434
+ */
435
+ const CLI_RULE_SET_CACHE = new Map();
436
+ function getCliRuleSet(linterName, basePath) {
437
+ const key = `${linterName}:${basePath}`;
438
+ const cached = CLI_RULE_SET_CACHE.get(key);
439
+ if (cached)
440
+ return cached;
441
+ const rules = new Set();
442
+ try {
443
+ if (linterName === "ruff") {
444
+ const output = (0, node_child_process_1.execSync)(`ruff check --show-settings ${(0, node_path_1.resolve)(basePath, "dummy.py")}`, { encoding: "utf-8", cwd: basePath, stdio: ["pipe", "pipe", "pipe"] });
445
+ const enabledMatch = output.match(/linter\.rules\.enabled\s*=\s*\[([\s\S]*?)\]/);
446
+ if (enabledMatch?.[1]) {
447
+ const codeRe = /\(([A-Z]+\d*)\)/g;
448
+ let m;
449
+ while ((m = codeRe.exec(enabledMatch[1])) !== null) {
450
+ rules.add(m[1]);
451
+ }
452
+ }
453
+ }
454
+ else if (linterName === "pylint") {
455
+ const output = (0, node_child_process_1.execSync)("pylint --list-msgs-enabled", {
456
+ encoding: "utf-8",
457
+ cwd: basePath,
458
+ stdio: ["pipe", "pipe", "pipe"],
459
+ });
460
+ const codeRe = /\b([a-z][a-z0-9-]+)\s*\([A-Z]\d+\)/g;
461
+ let m;
462
+ while ((m = codeRe.exec(output)) !== null) {
463
+ rules.add(m[1]);
464
+ }
465
+ }
466
+ else if (linterName === "rubocop") {
467
+ const output = (0, node_child_process_1.execSync)("rubocop --show-cops", {
468
+ encoding: "utf-8",
469
+ cwd: basePath,
470
+ stdio: ["pipe", "pipe", "pipe"],
471
+ });
472
+ const copRe = /^([A-Z][A-Za-z]+\/[A-Z][A-Za-z0-9]+):/gm;
473
+ let m;
474
+ while ((m = copRe.exec(output)) !== null) {
475
+ rules.add(m[1]);
476
+ }
477
+ }
478
+ else if (linterName === "clippy") {
479
+ // Read Cargo.toml [lints.clippy] section — same source of truth
480
+ // generate-types uses. Full clippy catalogue is enormous and
481
+ // only partially enabled per project.
482
+ const cargoPath = (0, node_path_1.resolve)(basePath, "Cargo.toml");
483
+ if ((0, node_fs_1.existsSync)(cargoPath)) {
484
+ const content = (0, node_fs_1.readFileSync)(cargoPath, "utf-8");
485
+ const sectionMatch = content.match(/\[lints\.clippy\]([\s\S]*?)(?=\n\[|$)/);
486
+ if (sectionMatch?.[1]) {
487
+ const ruleRe = /^([a-z][a-z_]*)\s*=/gm;
488
+ let m;
489
+ while ((m = ruleRe.exec(sectionMatch[1])) !== null) {
490
+ rules.add(m[1]);
491
+ }
492
+ }
493
+ }
494
+ }
495
+ }
496
+ catch {
497
+ // CLI failed — return empty set, caller will just skip suggestions
498
+ }
499
+ CLI_RULE_SET_CACHE.set(key, rules);
500
+ return rules;
501
+ }
502
+ /** @internal */ function tryCliCheck(ctx) {
503
+ const cliCheck = CLI_RULE_CHECKS[ctx.linterName];
504
+ if (!cliCheck)
505
+ return null;
506
+ const tool = CLI_TOOL_FOR_LINTER[ctx.linterName];
507
+ if (tool && !cliAvailable(tool)) {
508
+ return makeResult(ctx, false, "unknown", `${ctx.linterName} CLI tool "${tool}" not found on PATH`);
509
+ }
510
+ try {
511
+ cliCheck(ctx.ruleName);
512
+ const enabled = checkConfigEnabled(ctx.linterName, ctx.ruleName, ctx.basePath, ctx.catalogOnly);
513
+ return makeResult(ctx, true, enabled);
514
+ }
515
+ catch {
516
+ // Rule not found — try to suggest closest matches from the full
517
+ // rule set. Uses the same edit-distance helper as the Node
518
+ // resolver path; caching means this runs the CLI at most once.
519
+ const ruleSet = getCliRuleSet(ctx.linterName, ctx.basePath);
520
+ const suggestions = ruleSet.size > 0 ? closestRuleNames(ctx.ruleName, ruleSet) : [];
521
+ const hint = suggestions.length > 0
522
+ ? ` Did you mean: ${suggestions.map((s) => `"${ctx.linterName}/${s}"`).join(", ")}?`
523
+ : "";
524
+ return makeResult(ctx, false, "unknown", `Rule "${ctx.ruleName}" not found in ${ctx.linterName}.${hint}`);
525
+ }
526
+ }
527
+ /** @internal */ function tryCustomRulesDir(ctx) {
528
+ const linterCfg = ctx.linters?.[ctx.linterName];
529
+ if (!linterCfg?.rulesDir)
530
+ return null;
531
+ const dirs = Array.isArray(linterCfg.rulesDir)
532
+ ? linterCfg.rulesDir
533
+ : [linterCfg.rulesDir];
534
+ for (const dir of dirs) {
535
+ const found = ruleFileExists(ctx.ruleName, dir, ctx.basePath);
536
+ if (found)
537
+ return makeResult(ctx, true);
538
+ }
539
+ return makeResult(ctx, false, "unknown", `Rule file for "${ctx.ruleName}" not found in ${ctx.linterName} rulesDir`);
540
+ }
541
+ // ---------------------------------------------------------------------------
542
+ // Public API
543
+ // ---------------------------------------------------------------------------
544
+ /**
545
+ * Check a single linter rule reference (e.g., "eslint/no-console").
546
+ *
547
+ * Verifies: (1) rule exists in linter, (2) rule is enabled in project config.
548
+ * Returns a result with exists/enabled status.
549
+ */
550
+ function checkLinterRule(enforcedBy, basePath, options) {
551
+ const linterName = extractLinterName(enforcedBy);
552
+ const ruleName = extractRuleName(enforcedBy);
553
+ if (!ruleName || !SAFE_RULE_NAME_RE.test(ruleName)) {
554
+ return {
555
+ exists: false,
556
+ enabled: "unknown",
557
+ linter: linterName,
558
+ rule: ruleName ?? enforcedBy,
559
+ error: `Invalid rule reference: "${enforcedBy}"`,
560
+ };
561
+ }
562
+ const ctx = {
563
+ linterName,
564
+ ruleName,
565
+ basePath,
566
+ catalogOnly: options?.catalogOnly,
567
+ linters: options?.linters,
568
+ };
569
+ return (tryNodeResolver(ctx) ??
570
+ tryScopedPlugin(ctx) ??
571
+ tryCliCheck(ctx) ??
572
+ tryCustomRulesDir(ctx) ??
573
+ makeResult(ctx, false, "unknown", `Unknown linter: "${linterName}"`));
574
+ }
575
+ function checkConfigEnabled(linterName, ruleName, basePath, catalogOnly) {
576
+ if (catalogOnly)
577
+ return "unknown";
578
+ const checker = LINTER_CONFIG_CHECKERS[linterName];
579
+ if (!checker)
580
+ return "unknown";
581
+ try {
582
+ return checker(ruleName, basePath);
583
+ }
584
+ catch {
585
+ return "unknown";
586
+ }
587
+ }
588
+ //# sourceMappingURL=linters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linters.js","sourceRoot":"","sources":["../src/linters.ts"],"names":[],"mappings":"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"}