@mmnto/totem 1.14.12 → 1.14.13

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.
@@ -1,5 +1,10 @@
1
- import { describe, expect, it } from 'vitest';
1
+ import { beforeEach, describe, expect, it } from 'vitest';
2
2
  import { applyRules, applyRulesToAdditions, } from './compiler.js';
3
+ import { makeRuleEngineCtx } from './test-utils.js';
4
+ let ctx;
5
+ beforeEach(() => {
6
+ ctx = makeRuleEngineCtx();
7
+ });
3
8
  // ─── Adversarial Evaluation Harness ─────────────────
4
9
  //
5
10
  // Tests that compiled Totem rules catch planted bugs in realistic diffs.
@@ -37,7 +42,7 @@ describe('adversarial evaluation harness', () => {
37
42
  + - run: npm run test
38
43
  - run: pnpm build
39
44
  `;
40
- const violations = applyRules(ADVERSARIAL_RULES, diff);
45
+ const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
41
46
  expect(violations.length).toBeGreaterThan(0); // totem-ignore
42
47
  expect(violations.some((v) => v.rule.lessonHeading === 'Never use npm')).toBe(true);
43
48
  });
@@ -52,7 +57,7 @@ describe('adversarial evaluation harness', () => {
52
57
  + console.error(error);
53
58
  }
54
59
  `;
55
- const violations = applyRules(ADVERSARIAL_RULES, diff);
60
+ const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
56
61
  expect(violations.some((v) => v.rule.lessonHeading === 'Use err not error')).toBe(true);
57
62
  });
58
63
  it('catches debugger statements left in production code', () => {
@@ -66,7 +71,7 @@ describe('adversarial evaluation harness', () => {
66
71
  + debugger;
67
72
  return res.json();
68
73
  `;
69
- const violations = applyRules(ADVERSARIAL_RULES, diff);
74
+ const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
70
75
  const debugViolations = violations.filter((v) => v.rule.lessonHeading === 'No debugger in production');
71
76
  expect(debugViolations).toHaveLength(2);
72
77
  });
@@ -80,7 +85,7 @@ describe('adversarial evaluation harness', () => {
80
85
  + return fetchData().catch(() => {})
81
86
  }
82
87
  `;
83
- const violations = applyRules(ADVERSARIAL_RULES, diff);
88
+ const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
84
89
  expect(violations.some((v) => v.rule.lessonHeading === 'No empty catch blocks')).toBe(true);
85
90
  });
86
91
  it('catches TODO comments in new code', () => {
@@ -93,7 +98,7 @@ describe('adversarial evaluation harness', () => {
93
98
  + // FIXME: this is a temporary hack
94
99
  return validateToken(token);
95
100
  `;
96
- const violations = applyRules(ADVERSARIAL_RULES, diff);
101
+ const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
97
102
  const todoViolations = violations.filter((v) => v.rule.lessonHeading === 'No TODO in production');
98
103
  expect(todoViolations).toHaveLength(2);
99
104
  });
@@ -107,7 +112,7 @@ describe('adversarial evaluation harness', () => {
107
112
  + password: 'hunter2',
108
113
  };
109
114
  `;
110
- const violations = applyRules(ADVERSARIAL_RULES, diff);
115
+ const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
111
116
  expect(violations.some((v) => v.rule.lessonHeading === 'No hardcoded secrets')).toBe(true);
112
117
  });
113
118
  it('catches TypeScript any type', () => {
@@ -120,7 +125,7 @@ describe('adversarial evaluation harness', () => {
120
125
  + metadata: any;
121
126
  }
122
127
  `;
123
- const violations = applyRules(ADVERSARIAL_RULES, diff);
128
+ const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
124
129
  expect(violations.some((v) => v.rule.lessonHeading === 'No any types')).toBe(true);
125
130
  });
126
131
  it('passes a clean diff with no violations', () => {
@@ -133,7 +138,7 @@ describe('adversarial evaluation harness', () => {
133
138
  + return \`Hello, \${name}!\`;
134
139
  }
135
140
  `;
136
- const violations = applyRules(ADVERSARIAL_RULES, diff);
141
+ const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
137
142
  expect(violations).toHaveLength(0);
138
143
  });
139
144
  it('respects inline suppression (totem-ignore)', () => {
@@ -145,7 +150,7 @@ describe('adversarial evaluation harness', () => {
145
150
  + debugger; // totem-ignore
146
151
  run();
147
152
  `;
148
- const violations = applyRules(ADVERSARIAL_RULES, diff);
153
+ const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
149
154
  const debugViolations = violations.filter((v) => v.rule.lessonHeading === 'No debugger in production');
150
155
  expect(debugViolations).toHaveLength(0);
151
156
  });
@@ -165,7 +170,7 @@ describe('adversarial evaluation harness', () => {
165
170
  + const data: any = fetch('/api');
166
171
  }
167
172
  `;
168
- const violations = applyRules(ADVERSARIAL_RULES, diff);
173
+ const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
169
174
  // Should catch: debugger, TODO, error (not err), any
170
175
  expect(violations.length).toBeGreaterThanOrEqual(4); // totem-ignore
171
176
  const headings = new Set(violations.map((v) => v.rule.lessonHeading));
@@ -204,7 +209,7 @@ describe('AST gating suppresses false positives', () => {
204
209
  astContext: 'string',
205
210
  },
206
211
  ];
207
- const violations = applyRulesToAdditions(rules, additions);
212
+ const violations = applyRulesToAdditions(ctx, rules, additions);
208
213
  expect(violations).toHaveLength(0);
209
214
  });
210
215
  it('skips violations in comment-context additions', () => {
@@ -218,7 +223,7 @@ describe('AST gating suppresses false positives', () => {
218
223
  astContext: 'comment',
219
224
  },
220
225
  ];
221
- const violations = applyRulesToAdditions(rules, additions);
226
+ const violations = applyRulesToAdditions(ctx, rules, additions);
222
227
  expect(violations).toHaveLength(0);
223
228
  });
224
229
  it('still catches violations in code-context additions', () => {
@@ -232,7 +237,7 @@ describe('AST gating suppresses false positives', () => {
232
237
  astContext: 'code',
233
238
  },
234
239
  ];
235
- const violations = applyRulesToAdditions(rules, additions);
240
+ const violations = applyRulesToAdditions(ctx, rules, additions);
236
241
  expect(violations.length).toBeGreaterThan(0); // totem-ignore
237
242
  expect(violations.some((v) => v.rule.lessonHeading === 'No debugger in production')).toBe(true);
238
243
  });
@@ -248,7 +253,7 @@ describe('AST gating suppresses false positives', () => {
248
253
  // astContext is undefined
249
254
  },
250
255
  ];
251
- const violations = applyRulesToAdditions(rules, additions);
256
+ const violations = applyRulesToAdditions(ctx, rules, additions);
252
257
  expect(violations.length).toBeGreaterThan(0); // totem-ignore
253
258
  });
254
259
  });
@@ -1 +1 @@
1
- {"version":3,"file":"adversarial.test.js","sourceRoot":"","sources":["../src/adversarial.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adversarial.test.js","sourceRoot":"","sources":["../src/adversarial.test.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ import type { AstGrepYamlRule, CompiledRule, CompiledRulesFile, CompilerOutput,
11
11
  export type { AstContext, AstGrepYamlRule, CompiledRule, CompiledRulesFile, CompilerOutput, DiffAddition, NapiConfig, NonCompilableEntry, NonCompilableReasonCode, RegexValidation, RuleEventCallback, RuleEventContext, Violation, } from './compiler-schema.js';
12
12
  export { AstGrepYamlRuleSchema, CompiledRuleSchema, CompiledRulesFileSchema, CompilerOutputSchema, NapiConfigSchema, NonCompilableEntryReadSchema, NonCompilableEntryWriteSchema, NonCompilableReasonCodeSchema, } from './compiler-schema.js';
13
13
  export { extractAddedLines } from './diff-parser.js';
14
- export { applyAstRulesToAdditions, applyRules, applyRulesToAdditions, type CoreLogger, extractJustification, matchesGlob, setCoreLogger, } from './rule-engine.js';
14
+ export { applyAstRulesToAdditions, applyRules, applyRulesToAdditions, type CoreLogger, extractJustification, matchesGlob, type RuleEngineContext, } from './rule-engine.js';
15
15
  /** Hash a lesson's heading + body to detect changes since compilation. */
16
16
  export declare function hashLesson(heading: string, body: string): string;
17
17
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,cAAc,EAEd,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAU9B,YAAY,EACV,UAAU,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,GACV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,4BAA4B,EAC5B,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EACL,wBAAwB,EACxB,UAAU,EACV,qBAAqB,EACrB,KAAK,UAAU,EACf,oBAAoB,EACpB,WAAW,EACX,aAAa,GACd,MAAM,kBAAkB,CAAC;AAM1B,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMhE;AAID;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAY9D;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC7B,YAAY,EAAE,CAmBhB;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC7B,iBAAiB,CAoBnB;AAED,0CAA0C;AAC1C,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI,CAMhF;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAuBtF;AAID;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAsB5D;AAwBD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,OAAO,GAAG,KAAK,EACvB,OAAO,EAAE,MAAM,GACd;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1C,wBAAgB,YAAY,CAC1B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACxC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,eAAe,CAAA;CAAE,CAAC;AAQnF,wBAAgB,YAAY,CAC1B,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,UAAU,EACpC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACxC;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AA2CF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CA4B7E"}
1
+ {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,cAAc,EAEd,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAU9B,YAAY,EACV,UAAU,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,GACV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,4BAA4B,EAC5B,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EACL,wBAAwB,EACxB,UAAU,EACV,qBAAqB,EACrB,KAAK,UAAU,EACf,oBAAoB,EACpB,WAAW,EACX,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAC;AAM1B,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMhE;AAID;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAY9D;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC7B,YAAY,EAAE,CAmBhB;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC7B,iBAAiB,CAoBnB;AAED,0CAA0C;AAC1C,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI,CAMhF;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAuBtF;AAID;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAsB5D;AAwBD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,OAAO,GAAG,KAAK,EACvB,OAAO,EAAE,MAAM,GACd;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1C,wBAAgB,YAAY,CAC1B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACxC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,eAAe,CAAA;CAAE,CAAC;AAQnF,wBAAgB,YAAY,CAC1B,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,UAAU,EACpC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACxC;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AA2CF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CA4B7E"}
package/dist/compiler.js CHANGED
@@ -15,7 +15,7 @@ import { CompiledRulesFileSchema, CompilerOutputSchema, NonCompilableEntryWriteS
15
15
  import { TotemParseError } from './errors.js';
16
16
  export { AstGrepYamlRuleSchema, CompiledRuleSchema, CompiledRulesFileSchema, CompilerOutputSchema, NapiConfigSchema, NonCompilableEntryReadSchema, NonCompilableEntryWriteSchema, NonCompilableReasonCodeSchema, } from './compiler-schema.js';
17
17
  export { extractAddedLines } from './diff-parser.js';
18
- export { applyAstRulesToAdditions, applyRules, applyRulesToAdditions, extractJustification, matchesGlob, setCoreLogger, } from './rule-engine.js';
18
+ export { applyAstRulesToAdditions, applyRules, applyRulesToAdditions, extractJustification, matchesGlob, } from './rule-engine.js';
19
19
  // ─── Hashing ────────────────────────────────────────
20
20
  const HASH_SLICE_LEN = 16;
21
21
  /** Hash a lesson's heading + body to detect changes since compilation. */
@@ -1 +1 @@
1
- {"version":3,"file":"compiler.js","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compiler.js","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,11 @@ import * as path from 'node:path';
4
4
  import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
5
  import { applyRules, engineFields, extractAddedLines, hashLesson, loadCompiledRules, loadCompiledRulesFile, parseCompilerResponse, sanitizeFileGlobs, saveCompiledRules, saveCompiledRulesFile, validateRegex, } from './compiler.js';
6
6
  import { CompiledRuleSchema } from './compiler-schema.js';
7
- import { cleanTmpDir } from './test-utils.js';
7
+ import { cleanTmpDir, makeRuleEngineCtx } from './test-utils.js';
8
+ let ctx;
9
+ beforeEach(() => {
10
+ ctx = makeRuleEngineCtx();
11
+ });
8
12
  // ─── hashLesson ──────────────────────────────────────
9
13
  describe('hashLesson', () => {
10
14
  it('returns a 16-char hex string', () => {
@@ -173,14 +177,14 @@ describe('applyRules', () => {
173
177
  `;
174
178
  it('detects a simple pattern violation', () => {
175
179
  const rules = [makeRule('\\bnpm\\.install\\b', 'Do not call npm.install directly')];
176
- const violations = applyRules(rules, diff);
180
+ const violations = applyRules(ctx, rules, diff);
177
181
  expect(violations).toHaveLength(1);
178
182
  expect(violations[0].rule.message).toBe('Do not call npm.install directly');
179
183
  expect(violations[0].file).toBe('src/app.ts');
180
184
  });
181
185
  it('returns no violations when patterns do not match', () => {
182
186
  const rules = [makeRule('\\byarn\\b', 'Do not use yarn')];
183
- const violations = applyRules(rules, diff);
187
+ const violations = applyRules(ctx, rules, diff);
184
188
  expect(violations).toHaveLength(0);
185
189
  });
186
190
  it('applies multiple rules', () => {
@@ -188,28 +192,28 @@ describe('applyRules', () => {
188
192
  makeRule('\\bnpm\\b', 'Do not use npm'),
189
193
  makeRule('\\berror\\b', 'Use err, not error'),
190
194
  ];
191
- const violations = applyRules(rules, diff);
195
+ const violations = applyRules(ctx, rules, diff);
192
196
  expect(violations).toHaveLength(2);
193
197
  });
194
198
  it('throws on rules with invalid regex patterns (mmnto/totem#1442 — no silent-compliance footgun)', () => {
195
199
  const rules = [makeRule('[invalid', 'Bad pattern')];
196
- expect(() => applyRules(rules, diff)).toThrow(/invalid regex pattern/);
200
+ expect(() => applyRules(ctx, rules, diff)).toThrow(/invalid regex pattern/);
197
201
  });
198
202
  it('returns empty for empty diff', () => {
199
203
  const rules = [makeRule('anything', 'test')];
200
- expect(applyRules(rules, '')).toEqual([]);
204
+ expect(applyRules(ctx, rules, '')).toEqual([]);
201
205
  });
202
206
  it('returns empty for empty rules', () => {
203
- expect(applyRules([], diff)).toEqual([]);
207
+ expect(applyRules(ctx, [], diff)).toEqual([]);
204
208
  });
205
209
  it('excludes files listed in excludeFiles', () => {
206
210
  const rules = [makeRule('\\bnpm\\.install\\b', 'Do not call npm.install directly')];
207
- const violations = applyRules(rules, diff, ['src/app.ts']);
211
+ const violations = applyRules(ctx, rules, diff, ['src/app.ts']);
208
212
  expect(violations).toHaveLength(0);
209
213
  });
210
214
  it('still detects violations in non-excluded files', () => {
211
215
  const rules = [makeRule('\\bnpm\\.install\\b', 'Do not call npm.install directly')];
212
- const violations = applyRules(rules, diff, ['other-file.ts']);
216
+ const violations = applyRules(ctx, rules, diff, ['other-file.ts']);
213
217
  expect(violations).toHaveLength(1);
214
218
  });
215
219
  // ─── fileGlobs scoping ─────────────────────────────
@@ -233,7 +237,7 @@ describe('applyRules', () => {
233
237
  ].join('\n');
234
238
  it('applies rule to all files when fileGlobs is absent', () => {
235
239
  const rules = [makeRule('\\$\\w+', 'Found a dollar-sign variable')];
236
- const violations = applyRules(rules, multiFileDiff);
240
+ const violations = applyRules(ctx, rules, multiFileDiff);
237
241
  expect(violations).toHaveLength(2); // matches in both .sh and .ts
238
242
  });
239
243
  it('restricts rule to matching file types via fileGlobs', () => {
@@ -243,7 +247,7 @@ describe('applyRules', () => {
243
247
  fileGlobs: ['*.sh', '*.bash'],
244
248
  },
245
249
  ];
246
- const violations = applyRules(rules, multiFileDiff);
250
+ const violations = applyRules(ctx, rules, multiFileDiff);
247
251
  expect(violations).toHaveLength(1);
248
252
  expect(violations[0].file).toBe('deploy.sh');
249
253
  });
@@ -254,7 +258,7 @@ describe('applyRules', () => {
254
258
  fileGlobs: ['*.py'],
255
259
  },
256
260
  ];
257
- const violations = applyRules(rules, multiFileDiff);
261
+ const violations = applyRules(ctx, rules, multiFileDiff);
258
262
  expect(violations).toHaveLength(0);
259
263
  });
260
264
  it('handles **/*.ext glob pattern', () => {
@@ -264,7 +268,7 @@ describe('applyRules', () => {
264
268
  fileGlobs: ['**/*.ts'],
265
269
  },
266
270
  ];
267
- const violations = applyRules(rules, multiFileDiff);
271
+ const violations = applyRules(ctx, rules, multiFileDiff);
268
272
  expect(violations).toHaveLength(1);
269
273
  expect(violations[0].file).toBe('src/utils.ts');
270
274
  });
@@ -275,7 +279,7 @@ describe('applyRules', () => {
275
279
  fileGlobs: [],
276
280
  },
277
281
  ];
278
- const violations = applyRules(rules, multiFileDiff);
282
+ const violations = applyRules(ctx, rules, multiFileDiff);
279
283
  expect(violations).toHaveLength(2);
280
284
  });
281
285
  it('excludes files matching negated glob patterns', () => {
@@ -285,7 +289,7 @@ describe('applyRules', () => {
285
289
  fileGlobs: ['*.sh', '*.ts', '!*.sh'],
286
290
  },
287
291
  ];
288
- const violations = applyRules(rules, multiFileDiff);
292
+ const violations = applyRules(ctx, rules, multiFileDiff);
289
293
  expect(violations).toHaveLength(1);
290
294
  expect(violations[0].file).toBe('src/utils.ts');
291
295
  });
@@ -320,7 +324,7 @@ describe('applyRules', () => {
320
324
  fileGlobs: ['packages/mcp/**/*.ts'],
321
325
  },
322
326
  ];
323
- const violations = applyRules(rules, monorepoMultiFileDiff);
327
+ const violations = applyRules(ctx, rules, monorepoMultiFileDiff);
324
328
  expect(violations).toHaveLength(2); // server.ts + tools.test.ts
325
329
  expect(violations.every((v) => v.file.startsWith('packages/mcp/'))).toBe(true);
326
330
  });
@@ -331,7 +335,7 @@ describe('applyRules', () => {
331
335
  fileGlobs: ['packages/mcp/**/*.ts', '!**/*.test.ts'],
332
336
  },
333
337
  ];
334
- const violations = applyRules(rules, monorepoMultiFileDiff);
338
+ const violations = applyRules(ctx, rules, monorepoMultiFileDiff);
335
339
  expect(violations).toHaveLength(1);
336
340
  expect(violations[0].file).toBe('packages/mcp/src/server.ts');
337
341
  });
@@ -342,7 +346,7 @@ describe('applyRules', () => {
342
346
  fileGlobs: ['packages/cli/**/*.ts'],
343
347
  },
344
348
  ];
345
- const violations = applyRules(rules, monorepoMultiFileDiff);
349
+ const violations = applyRules(ctx, rules, monorepoMultiFileDiff);
346
350
  expect(violations).toHaveLength(0);
347
351
  });
348
352
  // ─── Inline suppression (totem-ignore) ─────────────
@@ -357,7 +361,7 @@ describe('applyRules', () => {
357
361
  ' export default x;',
358
362
  ].join('\n');
359
363
  const rules = [makeRule('\\bnpm\\.install\\b', 'Do not call npm.install directly')];
360
- const violations = applyRules(rules, suppressedDiff);
364
+ const violations = applyRules(ctx, rules, suppressedDiff);
361
365
  expect(violations).toHaveLength(0);
362
366
  });
363
367
  it('suppresses next-line violation with totem-ignore-next-line (both added)', () => {
@@ -372,7 +376,7 @@ describe('applyRules', () => {
372
376
  ' export default x;',
373
377
  ].join('\n');
374
378
  const rules = [makeRule('\\bnpm\\.install\\b', 'Do not call npm.install directly')];
375
- const violations = applyRules(rules, suppressedDiff);
379
+ const violations = applyRules(ctx, rules, suppressedDiff);
376
380
  expect(violations).toHaveLength(0);
377
381
  });
378
382
  it('suppresses next-line violation when directive is a context line', () => {
@@ -389,7 +393,7 @@ describe('applyRules', () => {
389
393
  ' export default x;',
390
394
  ].join('\n');
391
395
  const rules = [makeRule('\\bnpm\\.install\\b', 'Do not call npm.install directly')];
392
- const violations = applyRules(rules, suppressedDiff);
396
+ const violations = applyRules(ctx, rules, suppressedDiff);
393
397
  expect(violations).toHaveLength(0);
394
398
  });
395
399
  it('does not suppress when there is no directive', () => {
@@ -403,7 +407,7 @@ describe('applyRules', () => {
403
407
  ' export default x;',
404
408
  ].join('\n');
405
409
  const rules = [makeRule('\\bnpm\\.install\\b', 'Do not call npm.install directly')];
406
- const violations = applyRules(rules, plainDiff);
410
+ const violations = applyRules(ctx, rules, plainDiff);
407
411
  expect(violations).toHaveLength(1);
408
412
  });
409
413
  it('supports hash-style comment suppression', () => {
@@ -418,7 +422,7 @@ describe('applyRules', () => {
418
422
  ' exit 0',
419
423
  ].join('\n');
420
424
  const rules = [makeRule('\\$[A-Z_]+', 'Quote shell variables')];
421
- const violations = applyRules(rules, suppressedDiff);
425
+ const violations = applyRules(ctx, rules, suppressedDiff);
422
426
  expect(violations).toHaveLength(0);
423
427
  });
424
428
  it('supports HTML comment suppression', () => {
@@ -432,7 +436,7 @@ describe('applyRules', () => {
432
436
  ' More text',
433
437
  ].join('\n');
434
438
  const rules = [makeRule('\\bnpm\\.install\\b', 'Do not call npm.install')];
435
- const violations = applyRules(rules, suppressedDiff);
439
+ const violations = applyRules(ctx, rules, suppressedDiff);
436
440
  expect(violations).toHaveLength(0);
437
441
  });
438
442
  it('suppresses all rule violations on a single ignored line', () => {
@@ -449,7 +453,7 @@ describe('applyRules', () => {
449
453
  makeRule('\\bnpm\\.install\\b', 'Do not call npm.install'),
450
454
  makeRule('\\berror\\b', 'Use err, not error'),
451
455
  ];
452
- const violations = applyRules(rules, suppressedDiff);
456
+ const violations = applyRules(ctx, rules, suppressedDiff);
453
457
  expect(violations).toHaveLength(0);
454
458
  });
455
459
  it('handles suppression at first line of hunk (no preceding line)', () => {
@@ -463,7 +467,7 @@ describe('applyRules', () => {
463
467
  ' export default x;',
464
468
  ].join('\n');
465
469
  const rules = [makeRule('\\bnpm\\.install\\b', 'Do not call npm.install')];
466
- const violations = applyRules(rules, suppressedDiff);
470
+ const violations = applyRules(ctx, rules, suppressedDiff);
467
471
  expect(violations).toHaveLength(0);
468
472
  });
469
473
  it('excludes test files with negated glob while matching source files', () => {
@@ -489,7 +493,7 @@ describe('applyRules', () => {
489
493
  fileGlobs: ['*.ts', '!*.test.ts', '!*.spec.ts'],
490
494
  },
491
495
  ];
492
- const violations = applyRules(rules, testFileDiff);
496
+ const violations = applyRules(ctx, rules, testFileDiff);
493
497
  expect(violations).toHaveLength(1);
494
498
  expect(violations[0].file).toBe('src/utils.ts');
495
499
  });
@@ -647,7 +651,7 @@ describe('compiled rules file I/O', () => {
647
651
  '+const first = "the active rule must fire here";',
648
652
  '+const second = "the archived rule must not fire here";',
649
653
  ].join('\n');
650
- const violations = applyRules(rules, diff);
654
+ const violations = applyRules(ctx, rules, diff);
651
655
  expect(violations).toHaveLength(1);
652
656
  expect(violations[0].rule.lessonHash).toBe(activeRule.lessonHash);
653
657
  expect(violations.some((v) => v.rule.lessonHash === archivedRule.lessonHash)).toBe(false);