@aicqtools/guardrail 1.0.0-alpha.8 → 1.0.0-beta.1

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 (75) hide show
  1. package/dist/docs/render-rule-md.d.ts.map +1 -1
  2. package/dist/docs/render-rule-md.js +80 -0
  3. package/dist/docs/render-rule-md.js.map +1 -1
  4. package/dist/index.d.ts +2 -2
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +1 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/matcher/yaml-rule.d.ts +13 -0
  9. package/dist/matcher/yaml-rule.d.ts.map +1 -1
  10. package/dist/matcher/yaml-rule.js +32 -0
  11. package/dist/matcher/yaml-rule.js.map +1 -1
  12. package/dist/rules-default/camelcase-migration-column.d.ts.map +1 -1
  13. package/dist/rules-default/camelcase-migration-column.js +26 -2
  14. package/dist/rules-default/camelcase-migration-column.js.map +1 -1
  15. package/dist/rules-default/index.js +1 -1
  16. package/dist/rules-default/index.js.map +1 -1
  17. package/dist/rules-default/mask-pii-in-ai-prompt.d.ts.map +1 -1
  18. package/dist/rules-default/mask-pii-in-ai-prompt.js +44 -7
  19. package/dist/rules-default/mask-pii-in-ai-prompt.js.map +1 -1
  20. package/dist/rules-default/no-console-log.d.ts +6 -0
  21. package/dist/rules-default/no-console-log.d.ts.map +1 -1
  22. package/dist/rules-default/no-console-log.js +30 -1
  23. package/dist/rules-default/no-console-log.js.map +1 -1
  24. package/dist/rules-default/no-empty-catch.d.ts +11 -0
  25. package/dist/rules-default/no-empty-catch.d.ts.map +1 -1
  26. package/dist/rules-default/no-empty-catch.js +48 -0
  27. package/dist/rules-default/no-empty-catch.js.map +1 -1
  28. package/dist/rules-default/no-fstring-sql.d.ts.map +1 -1
  29. package/dist/rules-default/no-fstring-sql.js +51 -2
  30. package/dist/rules-default/no-fstring-sql.js.map +1 -1
  31. package/dist/rules-default/no-id-overwrite.d.ts +2 -1
  32. package/dist/rules-default/no-id-overwrite.d.ts.map +1 -1
  33. package/dist/rules-default/no-id-overwrite.js +2 -1
  34. package/dist/rules-default/no-id-overwrite.js.map +1 -1
  35. package/dist/rules-default/no-magic-number.d.ts +1 -0
  36. package/dist/rules-default/no-magic-number.d.ts.map +1 -1
  37. package/dist/rules-default/no-magic-number.js +35 -5
  38. package/dist/rules-default/no-magic-number.js.map +1 -1
  39. package/dist/rules-default/no-print-in-prod.yaml +8 -0
  40. package/dist/runner/apply-rule-config.d.ts +79 -13
  41. package/dist/runner/apply-rule-config.d.ts.map +1 -1
  42. package/dist/runner/apply-rule-config.js +175 -44
  43. package/dist/runner/apply-rule-config.js.map +1 -1
  44. package/dist/runner/context.d.ts +7 -0
  45. package/dist/runner/context.d.ts.map +1 -1
  46. package/dist/runner/context.js +2 -0
  47. package/dist/runner/context.js.map +1 -1
  48. package/dist/runner/index.d.ts +4 -2
  49. package/dist/runner/index.d.ts.map +1 -1
  50. package/dist/runner/index.js +2 -1
  51. package/dist/runner/index.js.map +1 -1
  52. package/dist/runner/resolve-rule-options.d.ts +28 -0
  53. package/dist/runner/resolve-rule-options.d.ts.map +1 -0
  54. package/dist/runner/resolve-rule-options.js +27 -0
  55. package/dist/runner/resolve-rule-options.js.map +1 -0
  56. package/dist/runner/run-file.d.ts +16 -2
  57. package/dist/runner/run-file.d.ts.map +1 -1
  58. package/dist/runner/run-file.js +49 -7
  59. package/dist/runner/run-file.js.map +1 -1
  60. package/dist/runner/run-project.d.ts +20 -0
  61. package/dist/runner/run-project.d.ts.map +1 -1
  62. package/dist/runner/run-project.js +33 -5
  63. package/dist/runner/run-project.js.map +1 -1
  64. package/dist/runner/suppressions.d.ts +46 -1
  65. package/dist/runner/suppressions.d.ts.map +1 -1
  66. package/dist/runner/suppressions.js +101 -15
  67. package/dist/runner/suppressions.js.map +1 -1
  68. package/dist/suggest/analyze.js +3 -0
  69. package/dist/suggest/analyze.js.map +1 -1
  70. package/dist/suggest/format.d.ts.map +1 -1
  71. package/dist/suggest/format.js +9 -0
  72. package/dist/suggest/format.js.map +1 -1
  73. package/dist/suggest/types.d.ts +7 -0
  74. package/dist/suggest/types.d.ts.map +1 -1
  75. package/package.json +3 -3
@@ -1,22 +1,41 @@
1
1
  import micromatch from 'micromatch';
2
+ import { resolveRuleOptions } from './resolve-rule-options.js';
2
3
  const LEVEL_TO_SEVERITY = {
3
4
  warn: 'warning',
4
5
  error: 'error',
5
6
  };
7
+ function extractLevel(entry) {
8
+ if (typeof entry === 'string')
9
+ return entry;
10
+ return entry.severity;
11
+ }
12
+ function extractOptions(entry) {
13
+ if (typeof entry === 'string')
14
+ return undefined;
15
+ return entry.options;
16
+ }
6
17
  /**
7
18
  * Apply the user-supplied `rules:` map to a loaded rule list.
8
19
  *
9
20
  * - `off` → drop the rule from the returned list
10
21
  * - `warn`/`error` → return a copy of the rule with `severity` overridden
22
+ * - object shape (alpha.14) → optional `severity` override + optional `options` validated
23
+ * against the rule's own zod schema; resolved options attached via `ruleOptions` map.
11
24
  * - missing entry → rule passes through unchanged
12
25
  *
13
- * Map keys that don't correspond to any loaded rule are collected in `unknownIds`. The function
14
- * never throws; an invalid level value (should already be rejected by zod) is treated as "no
15
- * override" rather than crashing the run.
26
+ * Map keys that don't correspond to any loaded rule are collected in `unknownIds`. Unknown
27
+ * option keys (typos inside `options`) land in `unknownOptions`. Zod parse failures land in
28
+ * `optionParseErrors` the rule still runs with its `defaults`, never crashing the scan.
16
29
  */
17
30
  export function applyRuleConfig(rules, cfgMap) {
18
31
  if (!cfgMap || Object.keys(cfgMap).length === 0) {
19
- return { rules, unknownIds: [] };
32
+ return {
33
+ rules,
34
+ unknownIds: [],
35
+ ruleOptions: new Map(),
36
+ unknownOptions: [],
37
+ optionParseErrors: new Map(),
38
+ };
20
39
  }
21
40
  const knownIds = new Set(rules.map((r) => r.id));
22
41
  const unknownIds = [];
@@ -25,82 +44,180 @@ export function applyRuleConfig(rules, cfgMap) {
25
44
  unknownIds.push(id);
26
45
  }
27
46
  const out = [];
47
+ const ruleOptions = new Map();
48
+ const unknownOptions = [];
49
+ const optionParseErrors = new Map();
28
50
  for (const rule of rules) {
29
- const level = cfgMap[rule.id];
30
- if (level === undefined) {
31
- out.push(rule);
32
- continue;
33
- }
34
- if (level === 'off')
35
- continue;
36
- const severity = LEVEL_TO_SEVERITY[level];
37
- if (!severity) {
38
- // Unrecognized level treat as no override, never crash.
39
- out.push(rule);
40
- continue;
41
- }
42
- // Copy with overridden severity. `Rule` is a discriminated union; preserve the union
43
- // by re-spreading per branch.
44
- if (rule.kind === 'function') {
45
- out.push({ ...rule, severity });
51
+ const entry = cfgMap[rule.id];
52
+ let nextRule = rule;
53
+ if (entry !== undefined) {
54
+ const level = extractLevel(entry);
55
+ if (level === 'off')
56
+ continue;
57
+ if (level !== undefined) {
58
+ const severity = LEVEL_TO_SEVERITY[level];
59
+ if (severity) {
60
+ // Discriminated union: re-spread per branch to preserve `kind` narrowing.
61
+ if (rule.kind === 'function') {
62
+ nextRule = { ...rule, severity };
63
+ }
64
+ else {
65
+ nextRule = { ...rule, severity };
66
+ }
67
+ }
68
+ }
69
+ const userOptions = extractOptions(entry);
70
+ const resolved = resolveRuleOptions(rule, userOptions);
71
+ if (resolved.options !== undefined) {
72
+ ruleOptions.set(rule.id, resolved.options);
73
+ }
74
+ if (resolved.unknownKeys.length > 0) {
75
+ unknownOptions.push({ ruleId: rule.id, unknownKeys: resolved.unknownKeys });
76
+ }
77
+ if (resolved.parseError) {
78
+ optionParseErrors.set(rule.id, resolved.parseError);
79
+ }
46
80
  }
47
81
  else {
48
- out.push({ ...rule, severity });
82
+ // No config entry but rule may declare defaults — attach them so `ctx.options` works.
83
+ const resolved = resolveRuleOptions(rule, undefined);
84
+ if (resolved.options !== undefined) {
85
+ ruleOptions.set(rule.id, resolved.options);
86
+ }
49
87
  }
88
+ out.push(nextRule);
50
89
  }
51
- return { rules: out, unknownIds };
90
+ return { rules: out, unknownIds, ruleOptions, unknownOptions, optionParseErrors };
91
+ }
92
+ /**
93
+ * Auto-anchor a single `overrides.paths` glob (alpha.10).
94
+ *
95
+ * `fast-glob` returns absolute file paths, so a user-written `scripts/**` would silently never
96
+ * match. We prepend `**\/` unless the glob already carries an anchor token, mirroring the
97
+ * ESLint mental model where `paths: ['scripts/**']` means "any `scripts/` in the project":
98
+ *
99
+ * - leading `**` (with or without `/`) — already anchored, leave alone
100
+ * - leading `/` — Unix absolute path, user opted out of auto-anchor
101
+ * - leading `<letter>:/` — Windows drive path, same
102
+ * - leading `!` — negation; preserve the marker, normalize the body
103
+ *
104
+ * The function is pure and never throws. Empty input returns empty.
105
+ */
106
+ export function normalizeOverridePath(glob) {
107
+ if (!glob)
108
+ return glob;
109
+ let negation = '';
110
+ let body = glob;
111
+ if (body.startsWith('!')) {
112
+ negation = '!';
113
+ body = body.slice(1);
114
+ }
115
+ if (!body)
116
+ return negation;
117
+ if (body.startsWith('**'))
118
+ return negation + body;
119
+ if (body.startsWith('/'))
120
+ return negation + body;
121
+ if (/^[A-Za-z]:\//.test(body))
122
+ return negation + body;
123
+ return negation + '**/' + body;
52
124
  }
53
125
  /**
54
126
  * Apply per-path `overrides` (alpha.8) on top of an already-globally-resolved rule list.
55
127
  *
56
128
  * For each override entry whose `paths` globs match `filePath`, merge its `rules` map into a
57
- * per-file effective level map. Later matching entries win for the same rule id (ESLint semantics).
129
+ * per-file effective entry map. Later matching entries win for the same rule id (ESLint semantics).
58
130
  * `off` drops the rule for this file; `warn`/`error` copies the rule with overridden severity.
59
131
  *
132
+ * Alpha.14: override entries can also carry the object shape `{ severity?, options? }`. The
133
+ * resolved options override the global ones for the matched files. The function returns an
134
+ * augmented baseline-options map (cloned, never mutates the caller's map) so the runner can
135
+ * thread the per-file options into `RuleContext.options`.
136
+ *
60
137
  * Fast path: if no overrides are configured, returns the input list unchanged so the file loop
61
138
  * stays cheap when this feature is unused.
139
+ *
140
+ * Alpha.10: `paths` globs are auto-anchored via `normalizeOverridePath` so users can write
141
+ * `scripts/**` instead of `**\/scripts/**` and get the expected ESLint semantics. When the
142
+ * optional `matchCounts` array is provided, each matched override entry's slot is incremented;
143
+ * the caller (CLI) reads zero-valued slots to emit "matched no files — ignored." warnings.
62
144
  */
63
- export function applyOverridesForFile(baselineRules, overrides, filePath) {
64
- if (overrides.length === 0)
65
- return baselineRules;
145
+ /**
146
+ * Alpha.8/10 signature — returns `readonly Rule[]`. Preserved verbatim for back-compat with
147
+ * tests and external callers that don't need per-rule options. For runner usage (which threads
148
+ * options into RuleContext), call `applyOverridesForFileResolved` instead.
149
+ */
150
+ export function applyOverridesForFile(baselineRules, overrides, filePath, matchCounts) {
151
+ return applyOverridesForFileResolved(baselineRules, overrides, filePath, matchCounts).rules;
152
+ }
153
+ export function applyOverridesForFileResolved(baselineRules, overrides, filePath, matchCounts, baselineRuleOptions) {
154
+ const baselineOpts = baselineRuleOptions ?? new Map();
155
+ if (overrides.length === 0) {
156
+ return { rules: baselineRules, ruleOptions: baselineOpts };
157
+ }
66
158
  const normalized = filePath.replace(/\\/g, '/');
67
159
  const effective = new Map();
68
160
  let anyMatch = false;
69
- for (const ov of overrides) {
70
- const paths = [...ov.paths];
161
+ for (let i = 0; i < overrides.length; i++) {
162
+ const ov = overrides[i];
163
+ if (!ov)
164
+ continue;
165
+ const paths = ov.paths.map(normalizeOverridePath);
71
166
  const matched = micromatch.isMatch(normalized, paths, { dot: true }) ||
72
167
  micromatch.isMatch(filePath, paths, { dot: true });
73
168
  if (!matched)
74
169
  continue;
75
170
  anyMatch = true;
76
- for (const [id, level] of Object.entries(ov.rules)) {
77
- effective.set(id, level);
171
+ if (matchCounts)
172
+ matchCounts[i] = (matchCounts[i] ?? 0) + 1;
173
+ for (const [id, entry] of Object.entries(ov.rules)) {
174
+ effective.set(id, entry);
78
175
  }
79
176
  }
80
177
  if (!anyMatch)
81
- return baselineRules;
178
+ return { rules: baselineRules, ruleOptions: baselineOpts };
179
+ const ruleById = new Map(baselineRules.map((r) => [r.id, r]));
82
180
  const out = [];
181
+ const perFileOpts = new Map(baselineOpts);
83
182
  for (const rule of baselineRules) {
84
- const level = effective.get(rule.id);
85
- if (level === undefined) {
183
+ const entry = effective.get(rule.id);
184
+ if (entry === undefined) {
86
185
  out.push(rule);
87
186
  continue;
88
187
  }
89
- if (level === 'off')
90
- continue;
91
- const severity = LEVEL_TO_SEVERITY[level];
92
- if (!severity) {
93
- out.push(rule);
188
+ const level = extractLevel(entry);
189
+ if (level === 'off') {
190
+ perFileOpts.delete(rule.id);
94
191
  continue;
95
192
  }
96
- if (rule.kind === 'function') {
97
- out.push({ ...rule, severity });
193
+ let nextRule = rule;
194
+ if (level !== undefined) {
195
+ const severity = LEVEL_TO_SEVERITY[level];
196
+ if (severity) {
197
+ if (rule.kind === 'function') {
198
+ nextRule = { ...rule, severity };
199
+ }
200
+ else {
201
+ nextRule = { ...rule, severity };
202
+ }
203
+ }
98
204
  }
99
- else {
100
- out.push({ ...rule, severity });
205
+ const userOptions = extractOptions(entry);
206
+ if (userOptions !== undefined) {
207
+ const resolved = resolveRuleOptions(rule, userOptions);
208
+ if (resolved.options !== undefined) {
209
+ perFileOpts.set(rule.id, resolved.options);
210
+ }
101
211
  }
212
+ out.push(nextRule);
102
213
  }
103
- return out;
214
+ // Drop options for rules dropped from `out` (off'd by overrides).
215
+ const finalIds = new Set(out.map((r) => r.id));
216
+ for (const id of Array.from(perFileOpts.keys())) {
217
+ if (!finalIds.has(id) && !ruleById.has(id))
218
+ perFileOpts.delete(id);
219
+ }
220
+ return { rules: out, ruleOptions: perFileOpts };
104
221
  }
105
222
  export function collectUnknownOverrideIds(baselineRules, overrides) {
106
223
  if (overrides.length === 0)
@@ -118,4 +235,18 @@ export function collectUnknownOverrideIds(baselineRules, overrides) {
118
235
  }
119
236
  return out;
120
237
  }
238
+ export function collectNegationPaths(overrides) {
239
+ if (overrides.length === 0)
240
+ return [];
241
+ const out = [];
242
+ for (let i = 0; i < overrides.length; i++) {
243
+ const ov = overrides[i];
244
+ if (!ov)
245
+ continue;
246
+ const negations = ov.paths.filter((p) => p.startsWith('!'));
247
+ if (negations.length > 0)
248
+ out.push({ index: i, paths: negations });
249
+ }
250
+ return out;
251
+ }
121
252
  //# sourceMappingURL=apply-rule-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"apply-rule-config.js","sourceRoot":"","sources":["../../src/runner/apply-rule-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"apply-rule-config.js","sourceRoot":"","sources":["../../src/runner/apply-rule-config.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,13 @@ export interface RunContext {
7
7
  readonly source: string;
8
8
  readonly language: Language;
9
9
  readonly diagnostics: Diagnostic[];
10
+ readonly skipBuiltinSkips?: boolean;
11
+ /**
12
+ * Alpha.14 — resolved options for the rule currently being run on this file. The caller
13
+ * (`run-file.ts`) builds one `RunContext` per rule and looks up `ruleOptions.get(rule.id)`.
14
+ * Undefined when the rule has no options declaration.
15
+ */
16
+ readonly options?: Readonly<Record<string, unknown>>;
10
17
  }
11
18
  export declare function makeRuleContext(run: RunContext, meta: RuleMeta): RuleContext;
12
19
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/runner/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAY,MAAM,iBAAiB,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAc,MAAM,qBAAqB,CAAC;AAE7E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,KAAK,CAK1D;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC;CACpC;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,WAAW,CA0B5E"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/runner/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAY,MAAM,iBAAiB,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAc,MAAM,qBAAqB,CAAC;AAE7E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,KAAK,CAK1D;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC;IACnC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,WAAW,CA4B5E"}
@@ -9,6 +9,8 @@ export function makeRuleContext(run, meta) {
9
9
  filePath: run.filePath,
10
10
  source: run.source,
11
11
  language: run.language,
12
+ skipBuiltinSkips: run.skipBuiltinSkips ?? false,
13
+ ...(run.options !== undefined ? { options: run.options } : {}),
12
14
  textOf(node) {
13
15
  return run.source.slice(node.startIndex, node.endIndex);
14
16
  },
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/runner/context.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,WAAW,CAAC,IAAuB;IACjD,OAAO;QACL,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;QAClF,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;KAC7E,CAAC;AACJ,CAAC;AASD,MAAM,UAAU,eAAe,CAAC,GAAe,EAAE,IAAc;IAC7D,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,CAAC,IAAI;YACT,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,CAAC,IAAI;YACV,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,CAAC,IAAgB;YACrB,MAAM,UAAU,GAAe;gBAC7B,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAoB;gBACnC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;gBACrC,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS;oBAClC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE;oBACjD,CAAC,CAAC,EAAE,CAAC;gBACP,IAAI,EAAE,GAAG,CAAC,QAAQ;gBAClB,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC7B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5B,CAAC;YAChB,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/runner/context.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,WAAW,CAAC,IAAuB;IACjD,OAAO;QACL,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;QAClF,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;KAC7E,CAAC;AACJ,CAAC;AAgBD,MAAM,UAAU,eAAe,CAAC,GAAe,EAAE,IAAc;IAC7D,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,IAAI,KAAK;QAC/C,GAAG,CAAC,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,MAAM,CAAC,IAAI;YACT,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,CAAC,IAAI;YACV,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,CAAC,IAAgB;YACrB,MAAM,UAAU,GAAe;gBAC7B,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAoB;gBACnC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;gBACrC,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS;oBAClC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE;oBACjD,CAAC,CAAC,EAAE,CAAC;gBACP,IAAI,EAAE,GAAG,CAAC,QAAQ;gBAClB,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC7B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5B,CAAC;YAChB,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -2,8 +2,10 @@ export { runFile, runFileWithSource } from './run-file.js';
2
2
  export { runProject, resolveIgnores } from './run-project.js';
3
3
  export { runRule } from './run-rule.js';
4
4
  export { ruleSignature, rulesetSignature } from './ruleset-signature.js';
5
- export { applyRuleConfig, applyOverridesForFile, collectUnknownOverrideIds } from './apply-rule-config.js';
6
- export type { ApplyRuleConfigResult, UnknownOverrideId } from './apply-rule-config.js';
5
+ export { applyRuleConfig, applyOverridesForFile, applyOverridesForFileResolved, collectUnknownOverrideIds, collectNegationPaths, normalizeOverridePath } from './apply-rule-config.js';
6
+ export type { ApplyRuleConfigResult, ApplyOverridesResult, UnknownOverrideId, NegationOverridePath } from './apply-rule-config.js';
7
+ export { resolveRuleOptions } from './resolve-rule-options.js';
8
+ export type { UnknownRuleOption, ResolveRuleOptionsResult } from './resolve-rule-options.js';
7
9
  export type { RunFileResult } from './run-file.js';
8
10
  export type { RunProjectOptions } from './run-project.js';
9
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAC3G,YAAY,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACvF,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACvL,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnI,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC7F,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -2,5 +2,6 @@ export { runFile, runFileWithSource } from './run-file.js';
2
2
  export { runProject, resolveIgnores } from './run-project.js';
3
3
  export { runRule } from './run-rule.js';
4
4
  export { ruleSignature, rulesetSignature } from './ruleset-signature.js';
5
- export { applyRuleConfig, applyOverridesForFile, collectUnknownOverrideIds } from './apply-rule-config.js';
5
+ export { applyRuleConfig, applyOverridesForFile, applyOverridesForFileResolved, collectUnknownOverrideIds, collectNegationPaths, normalizeOverridePath } from './apply-rule-config.js';
6
+ export { resolveRuleOptions } from './resolve-rule-options.js';
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEvL,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { Rule } from '@aicqtools/rule-sdk';
2
+ /**
3
+ * Alpha.14 — per-rule options framework.
4
+ *
5
+ * `resolveRuleOptions(rule, userOptions)`:
6
+ * 1. Rule with no `options` declaration → returns `{ options: undefined }`.
7
+ * 2. Rule has options but user supplied none → returns the rule's `defaults`.
8
+ * 3. Rule has options + user supplied some → merges `{ ...defaults, ...user }`, runs the
9
+ * rule's zod schema in `safeParse` mode, and:
10
+ * - on success: returns parsed data + any unknown keys the user supplied that are not
11
+ * in `defaults` (typo surface).
12
+ * - on failure: returns `defaults` as a safe fallback + the zod error message + any
13
+ * unknown keys. The caller surfaces the error via stderr; the rule keeps running.
14
+ *
15
+ * The runner never throws when option resolution fails — guardrail's job is to keep scanning
16
+ * even when one rule's config is broken (mirrors alpha.7's "unknown rule id ignored" pattern).
17
+ */
18
+ export interface UnknownRuleOption {
19
+ readonly ruleId: string;
20
+ readonly unknownKeys: readonly string[];
21
+ }
22
+ export interface ResolveRuleOptionsResult {
23
+ readonly options: Readonly<Record<string, unknown>> | undefined;
24
+ readonly unknownKeys: readonly string[];
25
+ readonly parseError?: string;
26
+ }
27
+ export declare function resolveRuleOptions(rule: Rule, userOptions: Readonly<Record<string, unknown>> | undefined): ResolveRuleOptionsResult;
28
+ //# sourceMappingURL=resolve-rule-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-rule-options.d.ts","sourceRoot":"","sources":["../../src/runner/resolve-rule-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAEhD;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAChE,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,GACzD,wBAAwB,CA4B1B"}
@@ -0,0 +1,27 @@
1
+ export function resolveRuleOptions(rule, userOptions) {
2
+ if (!rule.options) {
3
+ return { options: undefined, unknownKeys: [] };
4
+ }
5
+ if (!userOptions || Object.keys(userOptions).length === 0) {
6
+ return { options: rule.options.defaults, unknownKeys: [] };
7
+ }
8
+ const knownKeys = new Set(Object.keys(rule.options.defaults));
9
+ const unknownKeys = Object.keys(userOptions).filter((k) => !knownKeys.has(k));
10
+ const merged = { ...rule.options.defaults, ...userOptions };
11
+ const parsed = rule.options.schema.safeParse(merged);
12
+ if (parsed.success) {
13
+ return {
14
+ options: parsed.data,
15
+ unknownKeys,
16
+ };
17
+ }
18
+ const parseError = parsed.error.issues
19
+ .map((i) => `${i.path.join('.') || '(root)'}: ${i.message}`)
20
+ .join('; ');
21
+ return {
22
+ options: rule.options.defaults,
23
+ unknownKeys,
24
+ parseError,
25
+ };
26
+ }
27
+ //# sourceMappingURL=resolve-rule-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-rule-options.js","sourceRoot":"","sources":["../../src/runner/resolve-rule-options.ts"],"names":[],"mappings":"AA8BA,MAAM,UAAU,kBAAkB,CAChC,IAAU,EACV,WAA0D;IAE1D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IACjD,CAAC;IACD,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAC7D,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9E,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,WAAW,EAAE,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,IAAyC;YACzD,WAAW;SACZ,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;SACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;SAC3D,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;QAC9B,WAAW;QACX,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -5,6 +5,20 @@ export interface RunFileResult {
5
5
  readonly language: Language | null;
6
6
  readonly diagnostics: readonly Diagnostic[];
7
7
  }
8
- export declare function runFile(filePath: string, rules: readonly Rule[]): Promise<RunFileResult>;
9
- export declare function runFileWithSource(filePath: string, source: string, language: Language, rules: readonly Rule[]): RunFileResult;
8
+ export interface RunFileOptions {
9
+ readonly skipBuiltinSkips?: boolean;
10
+ /**
11
+ * Alpha.14 — per-rule resolved options for this file. Keyed by ruleId. The runner pulls the
12
+ * matching entry per rule and threads it into `RuleContext.options` via `makeRuleContext`.
13
+ */
14
+ readonly ruleOptions?: ReadonlyMap<string, Readonly<Record<string, unknown>>>;
15
+ /**
16
+ * Alpha.17 opt-in — when `true`, the runner emits one `@aicq/unused-suppression` info
17
+ * diagnostic per `aicq-disable-*` directive that matched zero violations in this file.
18
+ * Default `false` keeps the pre-alpha.17 output exactly (TalkUp dogfood regression guard).
19
+ */
20
+ readonly reportUnusedSuppressions?: boolean;
21
+ }
22
+ export declare function runFile(filePath: string, rules: readonly Rule[], opts?: RunFileOptions): Promise<RunFileResult>;
23
+ export declare function runFileWithSource(filePath: string, source: string, language: Language, rules: readonly Rule[], opts?: RunFileOptions): RunFileResult;
10
24
  //# sourceMappingURL=run-file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-file.d.ts","sourceRoot":"","sources":["../../src/runner/run-file.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE5D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAIhD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CAC7C;AAED,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAM9F;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,SAAS,IAAI,EAAE,GACrB,aAAa,CAsBf"}
1
+ {"version":3,"file":"run-file.d.ts","sourceRoot":"","sources":["../../src/runner/run-file.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE5D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAQhD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9E;;;;OAIG;IACH,QAAQ,CAAC,wBAAwB,CAAC,EAAE,OAAO,CAAC;CAC7C;AAED,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC,aAAa,CAAC,CAMxB;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,IAAI,CAAC,EAAE,cAAc,GACpB,aAAa,CAyCf"}
@@ -1,19 +1,29 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { detectLanguage, parseSource } from '@aicqtools/core';
3
3
  import { runRule } from './run-rule.js';
4
- import { applySuppressions, parseSuppressions } from './suppressions.js';
5
- export async function runFile(filePath, rules) {
4
+ import { applySuppressions, parseSuppressions, } from './suppressions.js';
5
+ export async function runFile(filePath, rules, opts) {
6
6
  const language = detectLanguage(filePath);
7
7
  if (!language)
8
8
  return { filePath, language: null, diagnostics: [] };
9
9
  const source = await readFile(filePath, 'utf-8');
10
- return runFileWithSource(filePath, source, language, rules);
10
+ return runFileWithSource(filePath, source, language, rules, opts);
11
11
  }
12
- export function runFileWithSource(filePath, source, language, rules) {
12
+ export function runFileWithSource(filePath, source, language, rules, opts) {
13
13
  const tree = parseSource(language, source);
14
14
  const diagnostics = [];
15
- const run = { filePath, source, language, diagnostics };
15
+ const ruleOptions = opts?.ruleOptions;
16
+ const skipBuiltinSkips = opts?.skipBuiltinSkips ?? false;
16
17
  for (const rule of rules) {
18
+ const resolvedOptions = ruleOptions?.get(rule.id);
19
+ const run = {
20
+ filePath,
21
+ source,
22
+ language,
23
+ diagnostics,
24
+ skipBuiltinSkips,
25
+ ...(resolvedOptions !== undefined ? { options: resolvedOptions } : {}),
26
+ };
17
27
  try {
18
28
  runRule(rule, run, tree);
19
29
  }
@@ -23,10 +33,19 @@ export function runFileWithSource(filePath, source, language, rules) {
23
33
  }
24
34
  // Apply inline-suppression directives last so they catch diagnostics from every rule
25
35
  // (function rules, YAML pattern rules, and synthetic `@aicq/parse-failed`/rule-failed).
26
- let suppressed = diagnostics;
36
+ let suppressed = [...diagnostics];
27
37
  try {
28
38
  const suppressions = parseSuppressions(tree, source, language);
29
- suppressed = applySuppressions(diagnostics, suppressions);
39
+ const result = applySuppressions(diagnostics, suppressions);
40
+ suppressed = result.filtered;
41
+ // Alpha.17 — opt-in `@aicq/unused-suppression` info diagnostics. The synthetic id lives
42
+ // outside the rules map (no `Rule` object), so user disable goes through the runner flag
43
+ // (`reportUnusedSuppressions: false`) rather than `rules: { '@aicq/unused-suppression': off }`.
44
+ if (opts?.reportUnusedSuppressions) {
45
+ for (const dir of result.unused) {
46
+ suppressed.push(unusedSuppressionDiagnostic(filePath, dir));
47
+ }
48
+ }
30
49
  }
31
50
  catch {
32
51
  // Suppression parsing must never abort a run. If the tree shape surprises us,
@@ -45,4 +64,27 @@ function ruleFailedDiagnostic(filePath, ruleId, err) {
45
64
  range: { start: { line: 1, column: 1 }, end: { line: 1, column: 1 } },
46
65
  };
47
66
  }
67
+ /**
68
+ * Alpha.17 — synthetic info diagnostic emitted when an `aicq-disable-*` directive matched zero
69
+ * violations during the run. Mirrors the `@aicq/parse-failed` shape with messages hardcoded in
70
+ * both locales (en + ko) — the i18n table treats user-facing diagnostic text as static.
71
+ *
72
+ * `range` points at the directive comment itself (1-based line + column from `parseSuppressions`)
73
+ * so editors / SARIF viewers land the user directly on the suppression that needs cleanup.
74
+ */
75
+ function unusedSuppressionDiagnostic(filePath, dir) {
76
+ const ruleList = dir.ruleIds === '*' ? 'all rules' : Array.from(dir.ruleIds).sort().join(', ');
77
+ const ruleListKo = dir.ruleIds === '*' ? '모든 룰' : ruleList;
78
+ return {
79
+ ruleId: '@aicq/unused-suppression',
80
+ severity: 'info',
81
+ message: `aicq-disable-${dir.scope} (${ruleList}) matched zero violations — remove the directive or fix the rule id.`,
82
+ messageKo: `aicq-disable-${dir.scope} (${ruleListKo}) 디렉티브가 위반을 0건 적중 — 디렉티브 제거 또는 룰 이름 확인이 필요합니다.`,
83
+ file: filePath,
84
+ range: {
85
+ start: { line: dir.commentLine, column: dir.commentColumn },
86
+ end: { line: dir.commentLine, column: dir.commentColumn },
87
+ },
88
+ };
89
+ }
48
90
  //# sourceMappingURL=run-file.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-file.js","sourceRoot":"","sources":["../../src/runner/run-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAQzE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAAgB,EAAE,KAAsB;IACpE,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAEpE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjD,OAAO,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAAgB,EAChB,MAAc,EACd,QAAkB,EAClB,KAAsB;IAEtB,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IACD,qFAAqF;IACrF,wFAAwF;IACxF,IAAI,UAAU,GAA0B,WAAW,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/D,UAAU,GAAG,iBAAiB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,8EAA8E;QAC9E,gDAAgD;IAClD,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAgB,EAAE,MAAc,EAAE,GAAY;IAC1E,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO;QACL,MAAM,EAAE,oBAAoB;QAC5B,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,yBAAyB,MAAM,KAAK,OAAO,EAAE;QACtD,SAAS,EAAE,YAAY,MAAM,MAAM,OAAO,EAAE;QAC5C,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;KACtE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"run-file.js","sourceRoot":"","sources":["../../src/runner/run-file.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,26 @@ export interface RunProjectOptions {
19
19
  * (or omitted) is the fast path — runner falls back to the baseline list unchanged.
20
20
  */
21
21
  readonly overrides?: readonly RuleOverride[];
22
+ /**
23
+ * Alpha.13 escape hatch. When `true`, built-in `SKIP_FILE_RE` guards inside default rules
24
+ * (`no-console-log` / `no-empty-catch` / `no-magic-number`) are bypassed for the whole run.
25
+ * Default `false` preserves alpha.10~12 behavior. Forwarded into each `runFile` call so the
26
+ * rule body can read it from `ctx.skipBuiltinSkips`.
27
+ */
28
+ readonly skipBuiltinSkips?: boolean;
29
+ /**
30
+ * Alpha.14 — pre-resolved per-rule options from `applyRuleConfig`. The runner threads these
31
+ * into each `runFile` call so rule bodies can read `ctx.options`. Per-file overrides may
32
+ * further augment this map via `applyOverridesForFile`. Empty map / omitted = no options
33
+ * (every rule sees `ctx.options === undefined` or its own declared defaults).
34
+ */
35
+ readonly ruleOptions?: ReadonlyMap<string, Readonly<Record<string, unknown>>>;
36
+ /**
37
+ * Alpha.17 opt-in — when `true`, the runner emits `@aicq/unused-suppression` info diagnostics
38
+ * for `aicq-disable-*` directives that matched zero violations in each file. Default `false`
39
+ * keeps the pre-alpha.17 output exactly. Forwarded into each `runFile` call.
40
+ */
41
+ readonly reportUnusedSuppressions?: boolean;
22
42
  }
23
43
  export declare function runProject(opts: RunProjectOptions): Promise<CheckResult>;
24
44
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"run-project.d.ts","sourceRoot":"","sources":["../../src/runner/run-project.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAc,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAwB,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAKhD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;CAC9C;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CA6D9E;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,gBAAgB,EAAE,OAAO,GACxB,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBnB"}
1
+ {"version":3,"file":"run-project.d.ts","sourceRoot":"","sources":["../../src/runner/run-project.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAc,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAwB,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAKhD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAC7C;;;;;OAKG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9E;;;;OAIG;IACH,QAAQ,CAAC,wBAAwB,CAAC,EAAE,OAAO,CAAC;CAC7C;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAqF9E;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,gBAAgB,EAAE,OAAO,GACxB,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBnB"}