@aicqtools/guardrail 1.0.0-alpha.16 → 1.0.0-alpha.18

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.
@@ -9,12 +9,22 @@ declare const yamlRuleSchema: z.ZodObject<{
9
9
  docs: z.ZodOptional<z.ZodString>;
10
10
  pathExclude: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
11
11
  query: z.ZodString;
12
+ options: z.ZodOptional<z.ZodObject<{
13
+ defaults: z.ZodRecord<z.ZodString, z.ZodUnknown>;
14
+ }, "strict", z.ZodTypeAny, {
15
+ defaults: Record<string, unknown>;
16
+ }, {
17
+ defaults: Record<string, unknown>;
18
+ }>>;
12
19
  }, "strip", z.ZodTypeAny, {
13
20
  language: "typescript" | "javascript" | "tsx" | "python" | ("typescript" | "javascript" | "tsx" | "python")[];
14
21
  query: string;
15
22
  id: string;
16
23
  message: string;
17
24
  severity: "error" | "warning" | "info";
25
+ options?: {
26
+ defaults: Record<string, unknown>;
27
+ } | undefined;
18
28
  messageKo?: string | undefined;
19
29
  docs?: string | undefined;
20
30
  pathExclude?: string[] | undefined;
@@ -24,6 +34,9 @@ declare const yamlRuleSchema: z.ZodObject<{
24
34
  id: string;
25
35
  message: string;
26
36
  severity: "error" | "warning" | "info";
37
+ options?: {
38
+ defaults: Record<string, unknown>;
39
+ } | undefined;
27
40
  messageKo?: string | undefined;
28
41
  docs?: string | undefined;
29
42
  pathExclude?: string[] | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"yaml-rule.d.ts","sourceRoot":"","sources":["../../src/matcher/yaml-rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAMvD,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;EASlB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE3D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAgBzD"}
1
+ {"version":3,"file":"yaml-rule.d.ts","sourceRoot":"","sources":["../../src/matcher/yaml-rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAmB,MAAM,KAAK,CAAC;AAEzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAmBvD,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUlB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAiB3D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAuBzD"}
@@ -2,6 +2,18 @@ import { z } from 'zod';
2
2
  import { parse as parseYaml } from 'yaml';
3
3
  const languageSchema = z.enum(['typescript', 'javascript', 'tsx', 'python']);
4
4
  const severitySchema = z.enum(['error', 'warning', 'info']);
5
+ /**
6
+ * Alpha.18 — YAML PatternRule 옵션 framework 편입. YAML rule이 `options.defaults` (Record)
7
+ * 만 적으면 runtime에 그 키 set으로 strict object schema를 자동 합성. 사용자가 config의
8
+ * `rules.<id>.options`로 override 가능 (알파.14 framework 통과). YAML 작성자가 zod schema를
9
+ * 직접 적을 수 없으므로 값 타입 검증은 `z.unknown()`까지만 — strict object가 typo 키만 캐치.
10
+ * Query 동적 substitution은 v1.0+ 후속 사이클.
11
+ */
12
+ const yamlOptionsSchema = z
13
+ .object({
14
+ defaults: z.record(z.unknown()),
15
+ })
16
+ .strict();
5
17
  const yamlRuleSchema = z.object({
6
18
  id: z.string().min(1),
7
19
  language: z.union([languageSchema, z.array(languageSchema).min(1)]),
@@ -11,9 +23,28 @@ const yamlRuleSchema = z.object({
11
23
  docs: z.string().url().optional(),
12
24
  pathExclude: z.array(z.string().min(1)).optional(),
13
25
  query: z.string().min(1),
26
+ options: yamlOptionsSchema.optional(),
14
27
  });
28
+ /**
29
+ * Build a strict zod object schema from a defaults record. Each key gets `z.unknown()` so YAML
30
+ * rule writers can declare option shapes without a zod DSL — typo keys are still caught at run
31
+ * time by the `.strict()` modifier when users override the option in `aicq.config.yaml`.
32
+ */
33
+ function buildOptionsSchemaFromDefaults(defaults) {
34
+ const shape = {};
35
+ for (const key of Object.keys(defaults)) {
36
+ shape[key] = z.unknown();
37
+ }
38
+ return z.object(shape).strict();
39
+ }
15
40
  export function parseYamlRule(source) {
16
41
  const parsed = yamlRuleSchema.parse(parseYaml(source));
42
+ const options = parsed.options
43
+ ? {
44
+ schema: buildOptionsSchemaFromDefaults(parsed.options.defaults),
45
+ defaults: { ...parsed.options.defaults },
46
+ }
47
+ : undefined;
17
48
  const rule = {
18
49
  kind: 'pattern',
19
50
  id: parsed.id,
@@ -26,6 +57,7 @@ export function parseYamlRule(source) {
26
57
  ...(parsed.pathExclude !== undefined && parsed.pathExclude.length > 0
27
58
  ? { pathExclude: parsed.pathExclude }
28
59
  : {}),
60
+ ...(options !== undefined ? { options } : {}),
29
61
  };
30
62
  return rule;
31
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"yaml-rule.js","sourceRoot":"","sources":["../../src/matcher/yaml-rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAI1C,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC7E,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;AAE5D,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,QAAQ,EAAE,cAAc;IACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACjC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACzB,CAAC,CAAC;AAIH,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACvD,MAAM,IAAI,GAAgB;QACxB,IAAI,EAAE,SAAS;QACf,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,QAAQ,EAAE,MAAM,CAAC,QAA0C;QAC3D,QAAQ,EAAE,MAAM,CAAC,QAAoB;QACrC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,GAAG,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YACnE,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE;YACrC,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"yaml-rule.js","sourceRoot":"","sources":["../../src/matcher/yaml-rule.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,14 @@ language: python
3
3
  severity: warning
4
4
  message: Avoid bare print() in production code; use the standard `logging` module.
5
5
  messageKo: 운영 코드에서 print() 사용 지양 — 표준 `logging` 모듈을 사용하세요.
6
+ options:
7
+ # Alpha.18 — YAML PatternRule framework consistency demo. The `query` below is static
8
+ # (`print` literal), so `disallowedFunctions` doesn't drive matching today; it's exposed
9
+ # purely so users can see the option via `aicq rules suggest` and override it in their
10
+ # config. Dynamic query substitution is deferred to a v1.0+ release.
11
+ defaults:
12
+ disallowedFunctions:
13
+ - print
6
14
  query: |
7
15
  (call
8
16
  function: (identifier) @fn
@@ -12,6 +12,12 @@ export interface RunFileOptions {
12
12
  * matching entry per rule and threads it into `RuleContext.options` via `makeRuleContext`.
13
13
  */
14
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;
15
21
  }
16
22
  export declare function runFile(filePath: string, rules: readonly Rule[], opts?: RunFileOptions): Promise<RunFileResult>;
17
23
  export declare function runFileWithSource(filePath: string, source: string, language: Language, rules: readonly Rule[], opts?: RunFileOptions): RunFileResult;
@@ -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,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;CAC/E;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,CAgCf"}
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,7 +1,7 @@
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';
4
+ import { applySuppressions, parseSuppressions, } from './suppressions.js';
5
5
  export async function runFile(filePath, rules, opts) {
6
6
  const language = detectLanguage(filePath);
7
7
  if (!language)
@@ -33,10 +33,19 @@ export function runFileWithSource(filePath, source, language, rules, opts) {
33
33
  }
34
34
  // Apply inline-suppression directives last so they catch diagnostics from every rule
35
35
  // (function rules, YAML pattern rules, and synthetic `@aicq/parse-failed`/rule-failed).
36
- let suppressed = diagnostics;
36
+ let suppressed = [...diagnostics];
37
37
  try {
38
38
  const suppressions = parseSuppressions(tree, source, language);
39
- 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
+ }
40
49
  }
41
50
  catch {
42
51
  // Suppression parsing must never abort a run. If the tree shape surprises us,
@@ -55,4 +64,27 @@ function ruleFailedDiagnostic(filePath, ruleId, err) {
55
64
  range: { start: { line: 1, column: 1 }, end: { line: 1, column: 1 } },
56
65
  };
57
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
+ }
58
90
  //# sourceMappingURL=run-file.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-file.js","sourceRoot":"","sources":["../../src/runner/run-file.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-file.js","sourceRoot":"","sources":["../../src/runner/run-file.ts"],"names":[],"mappings":"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"}
@@ -33,6 +33,12 @@ export interface RunProjectOptions {
33
33
  * (every rule sees `ctx.options === undefined` or its own declared defaults).
34
34
  */
35
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;
36
42
  }
37
43
  export declare function runProject(opts: RunProjectOptions): Promise<CheckResult>;
38
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;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;CAC/E;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CA+E9E;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"}
@@ -19,6 +19,7 @@ export async function runProject(opts) {
19
19
  const overrides = opts.overrides ?? [];
20
20
  const baselineRuleOptions = opts.ruleOptions ?? new Map();
21
21
  const skipBuiltinSkips = opts.skipBuiltinSkips ?? false;
22
+ const reportUnusedSuppressions = opts.reportUnusedSuppressions ?? false;
22
23
  // Per-entry match counters (alpha.10). Allocated only when overrides is non-empty so the
23
24
  // unused-feature fast path stays allocation-free. Slots that remain 0 after the scan are
24
25
  // reported by the CLI as "matched no files — ignored." warnings.
@@ -33,13 +34,18 @@ export async function runProject(opts) {
33
34
  'overrides=' + JSON.stringify(overrides),
34
35
  'skipBuiltinSkips=' + String(skipBuiltinSkips),
35
36
  'ruleOptions=' + serializeRuleOptions(baselineRuleOptions),
37
+ 'reportUnusedSuppressions=' + String(reportUnusedSuppressions),
36
38
  ])
37
39
  : '';
38
40
  const diagnostics = [];
39
41
  for (const file of files) {
40
42
  try {
41
43
  const { rules: fileRules, ruleOptions: fileRuleOptions } = applyOverridesForFileResolved(opts.rules, overrides, file, matchCounts, baselineRuleOptions);
42
- const runFileOpts = { skipBuiltinSkips, ruleOptions: fileRuleOptions };
44
+ const runFileOpts = {
45
+ skipBuiltinSkips,
46
+ ruleOptions: fileRuleOptions,
47
+ reportUnusedSuppressions,
48
+ };
43
49
  if (cache) {
44
50
  const st = await stat(file);
45
51
  const cached = cache.get({
@@ -1 +1 @@
1
- {"version":3,"file":"run-project.js","sourceRoot":"","sources":["../../src/runner/run-project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-project.js","sourceRoot":"","sources":["../../src/runner/run-project.ts"],"names":[],"mappings":"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"}
@@ -14,11 +14,51 @@ import type { Diagnostic, Language } from '@aicqtools/core';
14
14
  * accepted (a project may rename rules; we don't want a stale directive to crash the run).
15
15
  */
16
16
  export type Scope = number | 'file';
17
+ /**
18
+ * Alpha.17 — a single parsed `aicq-disable-*` directive. Preserved on `Suppressions` so the
19
+ * runner can detect directives that matched zero diagnostics (`@aicq/unused-suppression`).
20
+ *
21
+ * `targetLine` is the line the directive applies to:
22
+ * - `line` scope → the comment's own line(s)
23
+ * - `next-line` → the line after the comment ends
24
+ * - `file` scope → encoded as the special `'file'` sentinel via `targetScope`
25
+ * `commentLine` / `commentColumn` always points at the directive comment itself (1-based) so
26
+ * the synthetic diagnostic can be located in the user's editor.
27
+ */
28
+ export interface SuppressionDirective {
29
+ readonly scope: 'line' | 'next-line' | 'file';
30
+ /** 1-based line of the directive comment itself (anchoring point for the synthetic diagnostic). */
31
+ readonly commentLine: number;
32
+ /** 1-based column of the directive comment. Falls back to 1 when unknown. */
33
+ readonly commentColumn: number;
34
+ /** Rule ids the directive suppresses. `'*'` = bare directive (all rules). */
35
+ readonly ruleIds: ReadonlySet<string> | '*';
36
+ }
17
37
  export interface Suppressions {
18
38
  /** Per-line maps: line number → set of rule ids ('*' = all). */
19
39
  readonly byLine: Map<number, Set<string> | '*'>;
20
40
  /** File-wide suppressions. */
21
41
  readonly fileLevel: Set<string> | '*' | null;
42
+ /**
43
+ * Alpha.17 — flat list of every directive `parseSuppressions` saw, in source order. The byLine
44
+ * / fileLevel maps stay the fast path for filtering; `directives` is consumed only by the
45
+ * unused-suppression reporter. Reading order matches source order so diagnostic ranges are
46
+ * stable in the user's editor.
47
+ */
48
+ readonly directives: readonly SuppressionDirective[];
49
+ }
50
+ /**
51
+ * Result of `applySuppressions` (alpha.17 shape). Kept as a struct so the runner can decide
52
+ * whether to emit `@aicq/unused-suppression` diagnostics without an extra pass over the data.
53
+ *
54
+ * - `filtered` — the diagnostics that survived suppression (this is what the caller pushes onto
55
+ * the report).
56
+ * - `unused` — the subset of `suppressions.directives` whose `ruleIds` matched zero diagnostics
57
+ * in this file. Empty list when every directive was used at least once.
58
+ */
59
+ export interface ApplySuppressionsResult {
60
+ readonly filtered: Diagnostic[];
61
+ readonly unused: readonly SuppressionDirective[];
22
62
  }
23
63
  /**
24
64
  * Walk the tree's comment nodes and produce a Suppressions map. Never throws — if the grammar
@@ -32,6 +72,11 @@ export declare function parseSuppressions(tree: Parser.Tree, source: string, lan
32
72
  * either file-wide or on its specific line are removed. `@aicq/parse-failed` (and any other
33
73
  * synthetic diagnostic emitted by the runner) is treated like any other rule and can be
34
74
  * suppressed by id or with a bare directive.
75
+ *
76
+ * Alpha.17: returns `{ filtered, unused }` so the runner can emit `@aicq/unused-suppression`
77
+ * info diagnostics for directives that matched zero violations. A directive is "used" when at
78
+ * least one diagnostic in the file matches its scope (file / line) AND its rule-id list (or it
79
+ * was a bare `'*'` directive on a line/file that had any diagnostic at all).
35
80
  */
36
- export declare function applySuppressions(diagnostics: readonly Diagnostic[], suppressions: Suppressions): Diagnostic[];
81
+ export declare function applySuppressions(diagnostics: readonly Diagnostic[], suppressions: Suppressions): ApplySuppressionsResult;
37
82
  //# sourceMappingURL=suppressions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"suppressions.d.ts","sourceRoot":"","sources":["../../src/runner/suppressions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG5D;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpC,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;IAChD,8BAA8B;IAC9B,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;CAC9C;AAMD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,GACjB,YAAY,CA0Dd;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,SAAS,UAAU,EAAE,EAClC,YAAY,EAAE,YAAY,GACzB,UAAU,EAAE,CAed"}
1
+ {"version":3,"file":"suppressions.d.ts","sourceRoot":"","sources":["../../src/runner/suppressions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG5D;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpC;;;;;;;;;;GAUG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC9C,mGAAmG;IACnG,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;CAC7C;AAED,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;IAChD,8BAA8B;IAC9B,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;IAC7C;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACtD;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,SAAS,oBAAoB,EAAE,CAAC;CAClD;AAMD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,GACjB,YAAY,CAmEd;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,SAAS,UAAU,EAAE,EAClC,YAAY,EAAE,YAAY,GACzB,uBAAuB,CA2CzB"}
@@ -12,6 +12,7 @@ export function parseSuppressions(tree, source, language) {
12
12
  void language; // currently uniform across supported languages
13
13
  const byLine = new Map();
14
14
  let fileLevel = null;
15
+ const directives = [];
15
16
  const mergeAtLine = (line, ids) => {
16
17
  const existing = byLine.get(line);
17
18
  if (existing === undefined) {
@@ -50,12 +51,20 @@ export function parseSuppressions(tree, source, language) {
50
51
  if (!verb)
51
52
  return;
52
53
  const ids = parseRuleIds(m[2] ?? '');
54
+ const commentLine = node.startPosition.row + 1;
55
+ const commentColumn = node.startPosition.column + 1;
56
+ directives.push({
57
+ scope: verb,
58
+ commentLine,
59
+ commentColumn,
60
+ ruleIds: ids,
61
+ });
53
62
  if (verb === 'file') {
54
63
  mergeFile(ids);
55
64
  return;
56
65
  }
57
66
  // Lines are 1-based to match Diagnostic.range.start.line
58
- const startLine = node.startPosition.row + 1;
67
+ const startLine = commentLine;
59
68
  const endLine = node.endPosition.row + 1;
60
69
  if (verb === 'next-line') {
61
70
  mergeAtLine(endLine + 1, ids);
@@ -68,33 +77,110 @@ export function parseSuppressions(tree, source, language) {
68
77
  mergeAtLine(l, ids);
69
78
  }
70
79
  });
71
- return { byLine, fileLevel };
80
+ return { byLine, fileLevel, directives };
72
81
  }
73
82
  /**
74
83
  * Filter diagnostics through the parsed suppressions. Diagnostics whose `ruleId` is suppressed
75
84
  * either file-wide or on its specific line are removed. `@aicq/parse-failed` (and any other
76
85
  * synthetic diagnostic emitted by the runner) is treated like any other rule and can be
77
86
  * suppressed by id or with a bare directive.
87
+ *
88
+ * Alpha.17: returns `{ filtered, unused }` so the runner can emit `@aicq/unused-suppression`
89
+ * info diagnostics for directives that matched zero violations. A directive is "used" when at
90
+ * least one diagnostic in the file matches its scope (file / line) AND its rule-id list (or it
91
+ * was a bare `'*'` directive on a line/file that had any diagnostic at all).
78
92
  */
79
93
  export function applySuppressions(diagnostics, suppressions) {
80
- if (suppressions.fileLevel === '*')
81
- return [];
94
+ const usedKeys = new Set();
95
+ const noSuppressions = suppressions.fileLevel === null &&
96
+ suppressions.byLine.size === 0 &&
97
+ suppressions.directives.length === 0;
98
+ if (noSuppressions)
99
+ return { filtered: [...diagnostics], unused: [] };
100
+ const filtered = [];
82
101
  const fileSet = suppressions.fileLevel instanceof Set ? suppressions.fileLevel : null;
83
- const hasAnyLine = suppressions.byLine.size > 0;
84
- if (!fileSet && !hasAnyLine)
85
- return [...diagnostics];
86
- const out = [];
102
+ const fileIsWildcard = suppressions.fileLevel === '*';
87
103
  for (const d of diagnostics) {
88
- if (fileSet && fileSet.has(d.ruleId))
89
- continue;
90
- const lineMap = suppressions.byLine.get(d.range.start.line);
91
- if (lineMap === '*')
104
+ let suppressed = false;
105
+ if (fileIsWildcard) {
106
+ usedKeys.add('file:*');
107
+ suppressed = true;
108
+ }
109
+ else if (fileSet && fileSet.has(d.ruleId)) {
110
+ usedKeys.add('file:' + d.ruleId);
111
+ suppressed = true;
112
+ }
113
+ if (!suppressed) {
114
+ const lineMap = suppressions.byLine.get(d.range.start.line);
115
+ if (lineMap === '*') {
116
+ usedKeys.add('line:' + d.range.start.line + ':*');
117
+ suppressed = true;
118
+ }
119
+ else if (lineMap && lineMap.has(d.ruleId)) {
120
+ usedKeys.add('line:' + d.range.start.line + ':' + d.ruleId);
121
+ suppressed = true;
122
+ }
123
+ }
124
+ if (!suppressed)
125
+ filtered.push(d);
126
+ }
127
+ // For each parsed directive, decide whether at least one usedKey matches its scope+ruleIds.
128
+ // The directive's target line for `next-line` / `line` scope is derived the same way as in
129
+ // `parseSuppressions` so the matching is consistent.
130
+ const unused = [];
131
+ for (const dir of suppressions.directives) {
132
+ if (directiveWasUsed(dir, usedKeys))
92
133
  continue;
93
- if (lineMap && lineMap.has(d.ruleId))
134
+ unused.push(dir);
135
+ }
136
+ return { filtered, unused };
137
+ }
138
+ /**
139
+ * Internal — check whether a directive's scope+ruleIds intersect with any `usedKeys` recorded
140
+ * during the filter pass. A wildcard (`'*'`) directive is "used" if anything was suppressed at
141
+ * its scope; a named-rule directive is "used" if at least one of its ids was suppressed.
142
+ */
143
+ function directiveWasUsed(dir, usedKeys) {
144
+ if (dir.scope === 'file') {
145
+ if (dir.ruleIds === '*')
146
+ return usedKeys.has('file:*');
147
+ for (const id of dir.ruleIds) {
148
+ if (usedKeys.has('file:' + id))
149
+ return true;
150
+ }
151
+ return false;
152
+ }
153
+ // For line / next-line: the byLine map merges multiple directives at the same target line,
154
+ // so a single `usedKeys` entry can satisfy any directive targeting that line. We approximate
155
+ // by checking every line for which the directive could fire — for `line` scope the comment's
156
+ // own line; for `next-line` the line after. The bare directive case ('*') matches when ANY
157
+ // diagnostic on that line was suppressed via the wildcard or via any rule id (this would only
158
+ // happen if multiple directives merged, which we already accounted for above).
159
+ const candidateLines = candidateLinesForDirective(dir);
160
+ for (const line of candidateLines) {
161
+ if (dir.ruleIds === '*') {
162
+ if (usedKeys.has('line:' + line + ':*'))
163
+ return true;
164
+ // Wildcard merged with a named directive on the same line — accept any line-keyed hit.
165
+ for (const key of usedKeys) {
166
+ if (key.startsWith('line:' + line + ':'))
167
+ return true;
168
+ }
94
169
  continue;
95
- out.push(d);
170
+ }
171
+ for (const id of dir.ruleIds) {
172
+ if (usedKeys.has('line:' + line + ':' + id))
173
+ return true;
174
+ }
96
175
  }
97
- return out;
176
+ return false;
177
+ }
178
+ function candidateLinesForDirective(dir) {
179
+ if (dir.scope === 'file')
180
+ return [];
181
+ if (dir.scope === 'next-line')
182
+ return [dir.commentLine + 1];
183
+ return [dir.commentLine];
98
184
  }
99
185
  function stripCommentDelimiters(raw) {
100
186
  // `//foo` → `foo`, `# foo` → `foo`, `/* foo */` → `foo`, `<!-- foo -->` (just in case) → `foo`
@@ -1 +1 @@
1
- {"version":3,"file":"suppressions.js","sourceRoot":"","sources":["../../src/runner/suppressions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"suppressions.js","sourceRoot":"","sources":["../../src/runner/suppressions.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aicqtools/guardrail",
3
- "version": "1.0.0-alpha.16",
3
+ "version": "1.0.0-alpha.18",
4
4
  "type": "module",
5
5
  "description": "Deterministic AI code guardrail engine — 37 built-in rules, hybrid YAML/function DSL, MCP server, .cursorrules sync, sqlite cache.",
6
6
  "keywords": [
@@ -45,8 +45,8 @@
45
45
  "micromatch": "^4.0.8",
46
46
  "yaml": "^2.6.1",
47
47
  "zod": "^3.23.8",
48
- "@aicqtools/core": "1.0.0-alpha.16",
49
- "@aicqtools/rule-sdk": "1.0.0-alpha.16"
48
+ "@aicqtools/core": "1.0.0-alpha.18",
49
+ "@aicqtools/rule-sdk": "1.0.0-alpha.18"
50
50
  },
51
51
  "peerDependencies": {
52
52
  "tree-sitter": "~0.22.4"