@mmnto/totem 1.14.11 → 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.
- package/dist/adversarial.test.js +20 -15
- package/dist/adversarial.test.js.map +1 -1
- package/dist/compile-lesson.d.ts +58 -2
- package/dist/compile-lesson.d.ts.map +1 -1
- package/dist/compile-lesson.js +307 -29
- package/dist/compile-lesson.js.map +1 -1
- package/dist/compile-lesson.test.js +491 -19
- package/dist/compile-lesson.test.js.map +1 -1
- package/dist/compiler-schema.d.ts +154 -9
- package/dist/compiler-schema.d.ts.map +1 -1
- package/dist/compiler-schema.js +88 -10
- package/dist/compiler-schema.js.map +1 -1
- package/dist/compiler.d.ts +12 -4
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +25 -5
- package/dist/compiler.js.map +1 -1
- package/dist/compiler.test.js +194 -50
- package/dist/compiler.test.js.map +1 -1
- package/dist/config-schema.d.ts +45 -0
- package/dist/config-schema.d.ts.map +1 -1
- package/dist/config-schema.js +21 -0
- package/dist/config-schema.js.map +1 -1
- package/dist/config-schema.test.js +50 -1
- package/dist/config-schema.test.js.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/rule-engine.d.ts +56 -13
- package/dist/rule-engine.d.ts.map +1 -1
- package/dist/rule-engine.js +62 -40
- package/dist/rule-engine.js.map +1 -1
- package/dist/rule-engine.test.js +87 -56
- package/dist/rule-engine.test.js.map +1 -1
- package/dist/rule-metrics.d.ts +40 -0
- package/dist/rule-metrics.d.ts.map +1 -1
- package/dist/rule-metrics.js +28 -0
- package/dist/rule-metrics.js.map +1 -1
- package/dist/rule-metrics.test.js +104 -3
- package/dist/rule-metrics.test.js.map +1 -1
- package/dist/rule-tester.d.ts.map +1 -1
- package/dist/rule-tester.js +9 -3
- package/dist/rule-tester.js.map +1 -1
- package/dist/test-utils.d.ts +9 -0
- package/dist/test-utils.d.ts.map +1 -1
- package/dist/test-utils.js +13 -0
- package/dist/test-utils.js.map +1 -1
- package/package.json +1 -1
package/dist/rule-engine.js
CHANGED
|
@@ -80,23 +80,12 @@ const CONTEXT_MARKER = 'totem-context:';
|
|
|
80
80
|
const CONTEXT_RE = /totem-context:\s*(.+)/;
|
|
81
81
|
const LEGACY_CONTEXT_MARKER = 'shield-context:';
|
|
82
82
|
const LEGACY_CONTEXT_RE = /shield-context:\s*(.+)/;
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
shieldContextDeprecationWarned = true;
|
|
88
|
-
coreLogger.warn('⚠ Deprecation: "// shield-context:" is deprecated. Use "// totem-context:" instead. (See ADR-071)');
|
|
83
|
+
function warnShieldContextDeprecation(ctx) {
|
|
84
|
+
if (!ctx.state.hasWarnedShieldContext) {
|
|
85
|
+
ctx.state.hasWarnedShieldContext = true;
|
|
86
|
+
ctx.logger.warn('⚠ Deprecation: "// shield-context:" is deprecated. Use "// totem-context:" instead. (See ADR-071)');
|
|
89
87
|
}
|
|
90
88
|
}
|
|
91
|
-
/** Set the logger for core diagnostics. CLI should call this at startup. */
|
|
92
|
-
export function setCoreLogger(logger) {
|
|
93
|
-
coreLogger = logger;
|
|
94
|
-
}
|
|
95
|
-
/** @internal — exposed for testing only */
|
|
96
|
-
export function resetShieldContextWarning() {
|
|
97
|
-
shieldContextDeprecationWarned = false;
|
|
98
|
-
coreLogger = { warn: () => { } };
|
|
99
|
-
}
|
|
100
89
|
/**
|
|
101
90
|
* Check if a line should be suppressed via inline directives.
|
|
102
91
|
* Supports three forms:
|
|
@@ -107,40 +96,40 @@ export function resetShieldContextWarning() {
|
|
|
107
96
|
* Syntax-agnostic: works with any comment style (//, #, HTML comments, block comments).
|
|
108
97
|
*/
|
|
109
98
|
/** Check if a line contains a context directive (totem-context or legacy shield-context). */
|
|
110
|
-
function hasContextDirective(l) {
|
|
99
|
+
function hasContextDirective(ctx, l) {
|
|
111
100
|
if (l.includes(CONTEXT_MARKER))
|
|
112
101
|
return true;
|
|
113
102
|
if (l.includes(LEGACY_CONTEXT_MARKER)) {
|
|
114
|
-
warnShieldContextDeprecation();
|
|
103
|
+
warnShieldContextDeprecation(ctx);
|
|
115
104
|
return true;
|
|
116
105
|
}
|
|
117
106
|
return false;
|
|
118
107
|
}
|
|
119
108
|
/** Extract justification from a context directive on a single line, or null if none. */
|
|
120
|
-
function matchContextDirective(l) {
|
|
109
|
+
function matchContextDirective(ctx, l) {
|
|
121
110
|
const primary = l.match(CONTEXT_RE);
|
|
122
111
|
if (primary)
|
|
123
112
|
return primary[1].trim();
|
|
124
113
|
const legacy = l.match(LEGACY_CONTEXT_RE);
|
|
125
114
|
if (legacy) {
|
|
126
|
-
warnShieldContextDeprecation();
|
|
115
|
+
warnShieldContextDeprecation(ctx);
|
|
127
116
|
return legacy[1].trim();
|
|
128
117
|
}
|
|
129
118
|
return null;
|
|
130
119
|
}
|
|
131
|
-
function isSuppressed(line, precedingLine) {
|
|
120
|
+
function isSuppressed(ctx, line, precedingLine) {
|
|
132
121
|
// Same-line: 'totem-ignore' substring also matches 'totem-ignore-next-line',
|
|
133
122
|
// so directive lines themselves are inherently suppressed.
|
|
134
123
|
if (line.includes(SUPPRESS_MARKER))
|
|
135
124
|
return true;
|
|
136
125
|
// Same-line: totem-context: or shield-context: (legacy)
|
|
137
|
-
if (hasContextDirective(line))
|
|
126
|
+
if (hasContextDirective(ctx, line))
|
|
138
127
|
return true;
|
|
139
128
|
// Next-line: preceding line contains the next-line directive
|
|
140
129
|
if (precedingLine != null && precedingLine.includes(SUPPRESS_NEXT_LINE_MARKER))
|
|
141
130
|
return true;
|
|
142
131
|
// Next-line: preceding line contains a context directive
|
|
143
|
-
if (precedingLine != null && hasContextDirective(precedingLine))
|
|
132
|
+
if (precedingLine != null && hasContextDirective(ctx, precedingLine))
|
|
144
133
|
return true;
|
|
145
134
|
return false;
|
|
146
135
|
}
|
|
@@ -148,15 +137,23 @@ function isSuppressed(line, precedingLine) {
|
|
|
148
137
|
* Extract justification text from totem-context: directives.
|
|
149
138
|
* Checks both the current line and the preceding line.
|
|
150
139
|
* Returns empty string for plain totem-ignore (no justification).
|
|
140
|
+
*
|
|
141
|
+
* @param ctx - Per-invocation rule engine context. Required so that the legacy
|
|
142
|
+
* `shield-context:` deprecation path (reached via `matchContextDirective`)
|
|
143
|
+
* uses the caller's logger and per-ctx latch instead of module state.
|
|
144
|
+
* @param line - The line being evaluated.
|
|
145
|
+
* @param precedingLine - The line immediately before, or null at start of file.
|
|
146
|
+
* @returns The justification text, or empty string if the line carries a plain
|
|
147
|
+
* `totem-ignore` or no directive at all.
|
|
151
148
|
*/
|
|
152
|
-
export function extractJustification(line, precedingLine) {
|
|
149
|
+
export function extractJustification(ctx, line, precedingLine) {
|
|
153
150
|
// Check current line for context directive
|
|
154
|
-
const sameLine = matchContextDirective(line);
|
|
151
|
+
const sameLine = matchContextDirective(ctx, line);
|
|
155
152
|
if (sameLine)
|
|
156
153
|
return sameLine;
|
|
157
154
|
// Check preceding line for context directive
|
|
158
155
|
if (precedingLine) {
|
|
159
|
-
const prevLine = matchContextDirective(precedingLine);
|
|
156
|
+
const prevLine = matchContextDirective(ctx, precedingLine);
|
|
160
157
|
if (prevLine)
|
|
161
158
|
return prevLine;
|
|
162
159
|
}
|
|
@@ -165,11 +162,20 @@ export function extractJustification(line, precedingLine) {
|
|
|
165
162
|
}
|
|
166
163
|
// ─── Regex rule execution ───────────────────────────
|
|
167
164
|
/**
|
|
168
|
-
* Apply compiled rules against pre-extracted diff additions.
|
|
165
|
+
* Apply compiled regex-engine rules against pre-extracted diff additions.
|
|
169
166
|
* Skips additions with non-code AST context (strings, comments, regex).
|
|
170
|
-
*
|
|
167
|
+
*
|
|
168
|
+
* @param ctx - Per-invocation rule engine context. Replaces the module-level
|
|
169
|
+
* logger / deprecation-warning latch that existed pre-#1441. Callers build
|
|
170
|
+
* one ctx per linting invocation: `{ logger, state: { hasWarnedShieldContext: false } }`.
|
|
171
|
+
* @param rules - The full rule list. This function filters to regex-engine
|
|
172
|
+
* rules internally.
|
|
173
|
+
* @param additions - The diff additions to evaluate.
|
|
174
|
+
* @param onRuleEvent - Optional observability callback for metrics collection
|
|
175
|
+
* on trigger / suppress / failure events.
|
|
176
|
+
* @returns All regex-based violations found.
|
|
171
177
|
*/
|
|
172
|
-
export function applyRulesToAdditions(rules, additions, onRuleEvent) {
|
|
178
|
+
export function applyRulesToAdditions(ctx, rules, additions, onRuleEvent) {
|
|
173
179
|
if (additions.length === 0 || rules.length === 0)
|
|
174
180
|
return [];
|
|
175
181
|
const violations = [];
|
|
@@ -198,12 +204,12 @@ export function applyRulesToAdditions(rules, additions, onRuleEvent) {
|
|
|
198
204
|
continue;
|
|
199
205
|
}
|
|
200
206
|
// Skip if suppressed via inline directive
|
|
201
|
-
if (isSuppressed(addition.line, addition.precedingLine)) {
|
|
207
|
+
if (isSuppressed(ctx, addition.line, addition.precedingLine)) {
|
|
202
208
|
if (re.test(addition.line)) {
|
|
203
209
|
onRuleEvent?.('suppress', rule.lessonHash, {
|
|
204
210
|
file: addition.file,
|
|
205
211
|
line: addition.lineNumber,
|
|
206
|
-
justification: extractJustification(addition.line, addition.precedingLine),
|
|
212
|
+
justification: extractJustification(ctx, addition.line, addition.precedingLine),
|
|
207
213
|
immutable: rule.immutable,
|
|
208
214
|
});
|
|
209
215
|
}
|
|
@@ -236,8 +242,23 @@ export function applyRulesToAdditions(rules, additions, onRuleEvent) {
|
|
|
236
242
|
* Handles both Tree-sitter S-expression ('ast') and ast-grep ('ast-grep') engines.
|
|
237
243
|
* Async because it reads files and runs Tree-sitter queries.
|
|
238
244
|
* Handles fileGlobs filtering and suppression same as regex rules.
|
|
245
|
+
*
|
|
246
|
+
* @param ctx - Per-invocation rule engine context (see {@link RuleEngineContext}).
|
|
247
|
+
* @param rules - The full rule list. This function filters to ast / ast-grep
|
|
248
|
+
* rules internally.
|
|
249
|
+
* @param additions - The diff additions to evaluate.
|
|
250
|
+
* @param workingDirectory - Absolute path used to resolve file reads. Callers
|
|
251
|
+
* must pass the repo root, not `process.cwd()` (#1304).
|
|
252
|
+
* @param onRuleEvent - Optional observability callback for trigger / suppress
|
|
253
|
+
* / failure events.
|
|
254
|
+
* @param onWarn - Optional AST-path warning sink ("AST query skipped",
|
|
255
|
+
* "Skipped file outside project", etc.). Follow-up #1552 tracks consolidating
|
|
256
|
+
* this into `ctx.logger.warn`.
|
|
257
|
+
* @param readStrategy - Optional async reader for staged / virtual file
|
|
258
|
+
* content. When omitted, reads from disk.
|
|
259
|
+
* @returns All AST-based violations found.
|
|
239
260
|
*/
|
|
240
|
-
export async function applyAstRulesToAdditions(rules, additions, workingDirectory, onRuleEvent, onWarn, readStrategy) {
|
|
261
|
+
export async function applyAstRulesToAdditions(ctx, rules, additions, workingDirectory, onRuleEvent, onWarn, readStrategy) {
|
|
241
262
|
const treeSitterRules = rules.filter((r) => r.engine === 'ast' && r.astQuery);
|
|
242
263
|
// Widen to include compound rules (mmnto/totem#1408). A rule is runnable
|
|
243
264
|
// when EITHER `astGrepPattern` (string) or `astGrepYamlRule` (NapiConfig
|
|
@@ -306,11 +327,11 @@ export async function applyAstRulesToAdditions(rules, additions, workingDirector
|
|
|
306
327
|
const matches = batchResults[i] ?? [];
|
|
307
328
|
for (const match of matches) {
|
|
308
329
|
const addition = fileAdditions.find((a) => a.lineNumber === match.lineNumber);
|
|
309
|
-
if (addition && isSuppressed(addition.line, addition.precedingLine)) {
|
|
330
|
+
if (addition && isSuppressed(ctx, addition.line, addition.precedingLine)) {
|
|
310
331
|
onRuleEvent?.('suppress', rule.lessonHash, {
|
|
311
332
|
file,
|
|
312
333
|
line: match.lineNumber,
|
|
313
|
-
justification: extractJustification(addition.line, addition.precedingLine),
|
|
334
|
+
justification: extractJustification(ctx, addition.line, addition.precedingLine),
|
|
314
335
|
immutable: rule.immutable,
|
|
315
336
|
});
|
|
316
337
|
continue;
|
|
@@ -389,12 +410,12 @@ export async function applyAstRulesToAdditions(rules, additions, workingDirector
|
|
|
389
410
|
const matches = batchResults[i] ?? [];
|
|
390
411
|
for (const match of matches) {
|
|
391
412
|
const addition = fileAdditions.find((a) => a.lineNumber === match.lineNumber);
|
|
392
|
-
if (addition && isSuppressed(addition.line, addition.precedingLine)) {
|
|
413
|
+
if (addition && isSuppressed(ctx, addition.line, addition.precedingLine)) {
|
|
393
414
|
onRuleEvent?.('suppress', rule.lessonHash, {
|
|
394
415
|
file,
|
|
395
416
|
line: match.lineNumber,
|
|
396
417
|
justification: addition
|
|
397
|
-
? extractJustification(addition.line, addition.precedingLine)
|
|
418
|
+
? extractJustification(ctx, addition.line, addition.precedingLine)
|
|
398
419
|
: '',
|
|
399
420
|
immutable: rule.immutable,
|
|
400
421
|
});
|
|
@@ -424,12 +445,13 @@ export async function applyAstRulesToAdditions(rules, additions, workingDirector
|
|
|
424
445
|
* This is a convenience wrapper that only handles 'regex' engine rules.
|
|
425
446
|
* For 'ast' and 'ast-grep' rules, call `applyAstRulesToAdditions` separately.
|
|
426
447
|
*
|
|
427
|
-
* @param
|
|
428
|
-
* @param
|
|
429
|
-
* @param
|
|
448
|
+
* @param ctx - Per-invocation rule engine context (see {@link RuleEngineContext}).
|
|
449
|
+
* @param rules - The full list of compiled rules. This function filters to regex rules.
|
|
450
|
+
* @param diff - The unified diff string.
|
|
451
|
+
* @param excludeFiles - File paths to skip (e.g., compiled-rules.json to avoid self-matches).
|
|
430
452
|
* @returns All regex-based violations found.
|
|
431
453
|
*/
|
|
432
|
-
export function applyRules(rules, diff, excludeFiles) {
|
|
454
|
+
export function applyRules(ctx, rules, diff, excludeFiles) {
|
|
433
455
|
let additions = extractAddedLines(diff);
|
|
434
456
|
if (additions.length === 0 || rules.length === 0)
|
|
435
457
|
return [];
|
|
@@ -437,6 +459,6 @@ export function applyRules(rules, diff, excludeFiles) {
|
|
|
437
459
|
const excluded = new Set(excludeFiles);
|
|
438
460
|
additions = additions.filter((a) => !excluded.has(a.file));
|
|
439
461
|
}
|
|
440
|
-
return applyRulesToAdditions(rules, additions);
|
|
462
|
+
return applyRulesToAdditions(ctx, rules, additions);
|
|
441
463
|
}
|
|
442
464
|
//# sourceMappingURL=rule-engine.js.map
|
package/dist/rule-engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-engine.js","sourceRoot":"","sources":["../src/rule-engine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rule-engine.js","sourceRoot":"","sources":["../src/rule-engine.ts"],"names":[],"mappings":"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"}
|
package/dist/rule-engine.test.js
CHANGED
|
@@ -2,17 +2,18 @@ import * as fs from 'node:fs';
|
|
|
2
2
|
import * as os from 'node:os';
|
|
3
3
|
import * as path from 'node:path';
|
|
4
4
|
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
|
-
import { applyAstRulesToAdditions, applyRulesToAdditions, extractJustification, matchesGlob,
|
|
6
|
-
import { cleanTmpDir } from './test-utils.js';
|
|
5
|
+
import { applyAstRulesToAdditions, applyRulesToAdditions, extractJustification, matchesGlob, } from './rule-engine.js';
|
|
6
|
+
import { cleanTmpDir, makeRuleEngineCtx } from './test-utils.js';
|
|
7
7
|
// ─── Helpers ────────────────────────────────────────
|
|
8
8
|
let tmpDir;
|
|
9
|
+
let ctx;
|
|
9
10
|
beforeEach(() => {
|
|
10
11
|
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-rule-engine-'));
|
|
11
12
|
fs.mkdirSync(path.join(tmpDir, 'src'), { recursive: true });
|
|
13
|
+
ctx = makeRuleEngineCtx();
|
|
12
14
|
});
|
|
13
15
|
afterEach(() => {
|
|
14
16
|
cleanTmpDir(tmpDir);
|
|
15
|
-
resetShieldContextWarning();
|
|
16
17
|
});
|
|
17
18
|
function makeRule(overrides) {
|
|
18
19
|
return {
|
|
@@ -40,7 +41,7 @@ describe('applyAstRulesToAdditions', () => {
|
|
|
40
41
|
// Bad queries return empty results with a warning — prevents TS-specific node names
|
|
41
42
|
// from crashing lint when run against JS files (#988)
|
|
42
43
|
const warnings = [];
|
|
43
|
-
const violations = await applyAstRulesToAdditions([rule], additions, tmpDir, undefined, (msg) => warnings.push(msg));
|
|
44
|
+
const violations = await applyAstRulesToAdditions(ctx, [rule], additions, tmpDir, undefined, (msg) => warnings.push(msg));
|
|
44
45
|
expect(violations).toEqual([]);
|
|
45
46
|
expect(warnings.length).toBeGreaterThan(0);
|
|
46
47
|
expect(warnings[0]).toContain('AST query skipped');
|
|
@@ -60,7 +61,7 @@ describe('applyAstRulesToAdditions', () => {
|
|
|
60
61
|
});
|
|
61
62
|
const additions = [makeAddition('src/app.ts', 'const x = 1;', 1)];
|
|
62
63
|
const events = [];
|
|
63
|
-
const violations = await applyAstRulesToAdditions([rule], additions, tmpDir, (event, hash, ctx) => {
|
|
64
|
+
const violations = await applyAstRulesToAdditions(ctx, [rule], additions, tmpDir, (event, hash, ctx) => {
|
|
64
65
|
events.push({ event, hash, reason: ctx?.failureReason });
|
|
65
66
|
});
|
|
66
67
|
expect(violations).toEqual([]);
|
|
@@ -87,7 +88,7 @@ describe('applyAstRulesToAdditions', () => {
|
|
|
87
88
|
makeAddition('src/app.ts', 'const x = 1;', 3),
|
|
88
89
|
];
|
|
89
90
|
const events = [];
|
|
90
|
-
const violations = await applyAstRulesToAdditions([badRule, goodRule], additions, tmpDir, (event, hash) => events.push({ event, hash }));
|
|
91
|
+
const violations = await applyAstRulesToAdditions(ctx, [badRule, goodRule], additions, tmpDir, (event, hash) => events.push({ event, hash }));
|
|
91
92
|
expect(violations).toHaveLength(1);
|
|
92
93
|
expect(violations[0].rule.lessonHash).toBe('good-rule');
|
|
93
94
|
expect(events.some((e) => e.event === 'failure' && e.hash === 'bad-rule')).toBe(true);
|
|
@@ -127,7 +128,7 @@ describe('applyAstRulesToAdditions', () => {
|
|
|
127
128
|
makeAddition('src/app.ts', '} catch (err) {', 3),
|
|
128
129
|
makeAddition('src/app.ts', '}', 4),
|
|
129
130
|
];
|
|
130
|
-
const violations = await applyAstRulesToAdditions([compoundRule], additions, tmpDir);
|
|
131
|
+
const violations = await applyAstRulesToAdditions(ctx, [compoundRule], additions, tmpDir);
|
|
131
132
|
expect(violations.length).toBeGreaterThanOrEqual(1);
|
|
132
133
|
// The outer catch_clause spans lines 3-4; the first overlapping added
|
|
133
134
|
// line (3) is where the violation gets reported.
|
|
@@ -144,7 +145,7 @@ describe('applyAstRulesToAdditions', () => {
|
|
|
144
145
|
});
|
|
145
146
|
const additions = [makeAddition('src/app.ts', 'const x = 1;', 1)];
|
|
146
147
|
const events = [];
|
|
147
|
-
const violations = await applyAstRulesToAdditions([compoundRule], additions, tmpDir, (event, hash, ctx) => events.push({ event, hash, reason: ctx?.failureReason }));
|
|
148
|
+
const violations = await applyAstRulesToAdditions(ctx, [compoundRule], additions, tmpDir, (event, hash, ctx) => events.push({ event, hash, reason: ctx?.failureReason }));
|
|
148
149
|
expect(violations).toEqual([]);
|
|
149
150
|
const failure = events.find((e) => e.event === 'failure');
|
|
150
151
|
expect(failure).toBeDefined();
|
|
@@ -157,7 +158,7 @@ describe('applyAstRulesToAdditions', () => {
|
|
|
157
158
|
astGrepPattern: 'console.log($$$)',
|
|
158
159
|
});
|
|
159
160
|
const additions = [makeAddition('src/app.ts', 'console.log("hello");', 1)];
|
|
160
|
-
const violations = await applyAstRulesToAdditions([rule], additions, tmpDir);
|
|
161
|
+
const violations = await applyAstRulesToAdditions(ctx, [rule], additions, tmpDir);
|
|
161
162
|
expect(violations).toHaveLength(1);
|
|
162
163
|
expect(violations[0].lineNumber).toBe(1);
|
|
163
164
|
});
|
|
@@ -175,7 +176,7 @@ describe('applyAstRulesToAdditions', () => {
|
|
|
175
176
|
return 'console.log("staged content");\n';
|
|
176
177
|
return null;
|
|
177
178
|
};
|
|
178
|
-
const violations = await applyAstRulesToAdditions([rule], additions, tmpDir, undefined, undefined, mockReadStrategy);
|
|
179
|
+
const violations = await applyAstRulesToAdditions(ctx, [rule], additions, tmpDir, undefined, undefined, mockReadStrategy);
|
|
179
180
|
expect(violations).toHaveLength(1);
|
|
180
181
|
expect(violations[0].line).toBe('console.log("staged content");');
|
|
181
182
|
});
|
|
@@ -188,7 +189,7 @@ describe('applyAstRulesToAdditions', () => {
|
|
|
188
189
|
const additions = [makeAddition('src/app.ts', 'console.log("disk content");', 1)];
|
|
189
190
|
// readStrategy returns null (simulating a symlink or unreadable file)
|
|
190
191
|
const mockReadStrategyReturningNull = async () => null;
|
|
191
|
-
const violations = await applyAstRulesToAdditions([rule], additions, tmpDir, undefined, undefined, mockReadStrategyReturningNull);
|
|
192
|
+
const violations = await applyAstRulesToAdditions(ctx, [rule], additions, tmpDir, undefined, undefined, mockReadStrategyReturningNull);
|
|
192
193
|
expect(violations).toHaveLength(0); // Violation from disk content is ignored because readStrategy returned null
|
|
193
194
|
});
|
|
194
195
|
it('uses disk read when no readStrategy provided (Invariant #4 backward compat)', async () => {
|
|
@@ -199,7 +200,7 @@ describe('applyAstRulesToAdditions', () => {
|
|
|
199
200
|
});
|
|
200
201
|
const additions = [makeAddition('src/app.ts', 'console.log("disk content");', 1)];
|
|
201
202
|
// No readStrategy argument passed
|
|
202
|
-
const violations = await applyAstRulesToAdditions([rule], additions, tmpDir);
|
|
203
|
+
const violations = await applyAstRulesToAdditions(ctx, [rule], additions, tmpDir);
|
|
203
204
|
expect(violations).toHaveLength(1);
|
|
204
205
|
expect(violations[0].line).toBe('console.log("disk content");');
|
|
205
206
|
});
|
|
@@ -215,7 +216,7 @@ describe('applyAstRulesToAdditions', () => {
|
|
|
215
216
|
});
|
|
216
217
|
const additions = [makeAddition('src/app.ts', 'console.log("hello");', 1)];
|
|
217
218
|
// We pass repoRoot as the workingDirectory. If it uses something else (like process.cwd()), it will fail to read the file.
|
|
218
|
-
const violations = await applyAstRulesToAdditions([rule], additions, repoRoot);
|
|
219
|
+
const violations = await applyAstRulesToAdditions(ctx, [rule], additions, repoRoot);
|
|
219
220
|
expect(violations).toHaveLength(1);
|
|
220
221
|
});
|
|
221
222
|
it('emits suppress event for ast-grep rules on totem-ignore lines', async () => {
|
|
@@ -237,7 +238,7 @@ describe('applyAstRulesToAdditions', () => {
|
|
|
237
238
|
const onRuleEvent = (event, hash) => {
|
|
238
239
|
events.push({ event, hash });
|
|
239
240
|
};
|
|
240
|
-
const violations = await applyAstRulesToAdditions([rule], additions, tmpDir, onRuleEvent);
|
|
241
|
+
const violations = await applyAstRulesToAdditions(ctx, [rule], additions, tmpDir, onRuleEvent);
|
|
241
242
|
expect(violations).toHaveLength(0);
|
|
242
243
|
expect(events).toEqual([{ event: 'suppress', hash: 'suppress-ast-grep-test' }]);
|
|
243
244
|
});
|
|
@@ -260,7 +261,7 @@ describe('applyAstRulesToAdditions', () => {
|
|
|
260
261
|
const onRuleEvent = (event, hash) => {
|
|
261
262
|
events.push({ event, hash });
|
|
262
263
|
};
|
|
263
|
-
const violations = await applyAstRulesToAdditions([rule], additions, tmpDir, onRuleEvent);
|
|
264
|
+
const violations = await applyAstRulesToAdditions(ctx, [rule], additions, tmpDir, onRuleEvent);
|
|
264
265
|
expect(violations).toHaveLength(0);
|
|
265
266
|
expect(events).toEqual([{ event: 'suppress', hash: 'suppress-tree-sitter-test' }]);
|
|
266
267
|
});
|
|
@@ -285,7 +286,7 @@ describe('applyRulesToAdditions — event context', () => {
|
|
|
285
286
|
const onRuleEvent = (event, hash, context) => {
|
|
286
287
|
events.push({ event, hash, context });
|
|
287
288
|
};
|
|
288
|
-
const violations = applyRulesToAdditions([rule], additions, onRuleEvent);
|
|
289
|
+
const violations = applyRulesToAdditions(ctx, [rule], additions, onRuleEvent);
|
|
289
290
|
expect(violations).toHaveLength(0);
|
|
290
291
|
expect(events).toHaveLength(1);
|
|
291
292
|
expect(events[0].event).toBe('suppress');
|
|
@@ -320,7 +321,7 @@ describe('applyRulesToAdditions — event context', () => {
|
|
|
320
321
|
const onRuleEvent = (event, hash, context) => {
|
|
321
322
|
events.push({ event, hash, context });
|
|
322
323
|
};
|
|
323
|
-
applyRulesToAdditions([rule], additions, onRuleEvent);
|
|
324
|
+
applyRulesToAdditions(ctx, [rule], additions, onRuleEvent);
|
|
324
325
|
expect(events).toHaveLength(1);
|
|
325
326
|
expect(events[0].event).toBe('suppress');
|
|
326
327
|
expect(events[0].context?.immutable).toBe(true);
|
|
@@ -343,7 +344,7 @@ describe('applyRulesToAdditions — event context', () => {
|
|
|
343
344
|
const onRuleEvent = (event, hash, context) => {
|
|
344
345
|
events.push({ event, hash, context });
|
|
345
346
|
};
|
|
346
|
-
const violations = applyRulesToAdditions([rule], additions, onRuleEvent);
|
|
347
|
+
const violations = applyRulesToAdditions(ctx, [rule], additions, onRuleEvent);
|
|
347
348
|
expect(violations).toHaveLength(1);
|
|
348
349
|
expect(events).toHaveLength(1);
|
|
349
350
|
expect(events[0].event).toBe('trigger');
|
|
@@ -370,7 +371,7 @@ describe('applyRulesToAdditions — event context', () => {
|
|
|
370
371
|
const onRuleEvent = (event, hash, context) => {
|
|
371
372
|
events.push({ event, hash, context });
|
|
372
373
|
};
|
|
373
|
-
const violations = applyRulesToAdditions([rule], additions, onRuleEvent);
|
|
374
|
+
const violations = applyRulesToAdditions(ctx, [rule], additions, onRuleEvent);
|
|
374
375
|
expect(violations).toHaveLength(0);
|
|
375
376
|
expect(events).toHaveLength(1);
|
|
376
377
|
expect(events[0].event).toBe('suppress');
|
|
@@ -398,7 +399,7 @@ describe('applyRulesToAdditions — event context', () => {
|
|
|
398
399
|
const onRuleEvent = (event, hash, context) => {
|
|
399
400
|
events.push({ event, hash, context });
|
|
400
401
|
};
|
|
401
|
-
const violations = applyRulesToAdditions([rule], additions, onRuleEvent);
|
|
402
|
+
const violations = applyRulesToAdditions(ctx, [rule], additions, onRuleEvent);
|
|
402
403
|
expect(violations).toHaveLength(0);
|
|
403
404
|
expect(events).toHaveLength(1);
|
|
404
405
|
expect(events[0].event).toBe('suppress');
|
|
@@ -409,9 +410,6 @@ describe('applyRulesToAdditions — event context', () => {
|
|
|
409
410
|
});
|
|
410
411
|
});
|
|
411
412
|
it('shield-context: legacy alias suppresses rule with deprecation warning', () => {
|
|
412
|
-
resetShieldContextWarning();
|
|
413
|
-
const warnings = [];
|
|
414
|
-
setCoreLogger({ warn: (msg) => warnings.push(msg) });
|
|
415
413
|
const rule = makeRule({
|
|
416
414
|
engine: 'regex',
|
|
417
415
|
pattern: 'console\\.log',
|
|
@@ -425,16 +423,12 @@ describe('applyRulesToAdditions — event context', () => {
|
|
|
425
423
|
precedingLine: null,
|
|
426
424
|
},
|
|
427
425
|
];
|
|
428
|
-
const violations = applyRulesToAdditions([rule], additions);
|
|
426
|
+
const violations = applyRulesToAdditions(ctx, [rule], additions);
|
|
429
427
|
expect(violations).toHaveLength(0);
|
|
430
|
-
expect(warnings).toHaveLength(1);
|
|
431
|
-
expect(warnings[0]).toContain('shield-context');
|
|
432
|
-
resetShieldContextWarning();
|
|
428
|
+
expect(ctx.warnings).toHaveLength(1);
|
|
429
|
+
expect(ctx.warnings[0]).toContain('shield-context');
|
|
433
430
|
});
|
|
434
431
|
it('shield-context: on preceding line suppresses with deprecation warning', () => {
|
|
435
|
-
resetShieldContextWarning();
|
|
436
|
-
const warnings = [];
|
|
437
|
-
setCoreLogger({ warn: (msg) => warnings.push(msg) });
|
|
438
432
|
const rule = makeRule({
|
|
439
433
|
engine: 'regex',
|
|
440
434
|
pattern: 'console\\.log',
|
|
@@ -448,54 +442,91 @@ describe('applyRulesToAdditions — event context', () => {
|
|
|
448
442
|
precedingLine: '// shield-context: legacy preceding reason',
|
|
449
443
|
},
|
|
450
444
|
];
|
|
451
|
-
const violations = applyRulesToAdditions([rule], additions);
|
|
445
|
+
const violations = applyRulesToAdditions(ctx, [rule], additions);
|
|
452
446
|
expect(violations).toHaveLength(0);
|
|
453
|
-
expect(warnings).toHaveLength(1);
|
|
454
|
-
|
|
447
|
+
expect(ctx.warnings).toHaveLength(1);
|
|
448
|
+
});
|
|
449
|
+
it('isolates deprecation-warning state across distinct ctx instances (mmnto/totem#1441)', () => {
|
|
450
|
+
// Concurrency-isolation invariant: two sequential applyRulesToAdditions
|
|
451
|
+
// calls with distinct ctx objects each see their own one-shot deprecation
|
|
452
|
+
// warning. Pre-#1441, module-level `shieldContextDeprecationWarned` would
|
|
453
|
+
// latch after the first call and silently swallow the second.
|
|
454
|
+
const rule = makeRule({
|
|
455
|
+
engine: 'regex',
|
|
456
|
+
pattern: 'console\\.log',
|
|
457
|
+
lessonHash: 'isolation-test',
|
|
458
|
+
});
|
|
459
|
+
const additions = [
|
|
460
|
+
{
|
|
461
|
+
file: 'src/app.ts',
|
|
462
|
+
line: 'console.log("hi"); // shield-context: reason',
|
|
463
|
+
lineNumber: 1,
|
|
464
|
+
precedingLine: null,
|
|
465
|
+
},
|
|
466
|
+
];
|
|
467
|
+
const ctxA = makeRuleEngineCtx();
|
|
468
|
+
const ctxB = makeRuleEngineCtx();
|
|
469
|
+
applyRulesToAdditions(ctxA, [rule], additions);
|
|
470
|
+
applyRulesToAdditions(ctxB, [rule], additions);
|
|
471
|
+
expect(ctxA.warnings).toHaveLength(1);
|
|
472
|
+
expect(ctxB.warnings).toHaveLength(1);
|
|
473
|
+
expect(ctxA.state.hasWarnedShieldContext).toBe(true);
|
|
474
|
+
expect(ctxB.state.hasWarnedShieldContext).toBe(true);
|
|
475
|
+
});
|
|
476
|
+
it('latches deprecation warning per ctx (repeat hits on same ctx warn once)', () => {
|
|
477
|
+
const rule = makeRule({
|
|
478
|
+
engine: 'regex',
|
|
479
|
+
pattern: 'console\\.log',
|
|
480
|
+
lessonHash: 'latch-test',
|
|
481
|
+
});
|
|
482
|
+
const additions = [
|
|
483
|
+
{
|
|
484
|
+
file: 'src/app.ts',
|
|
485
|
+
line: 'console.log("a"); // shield-context: one',
|
|
486
|
+
lineNumber: 1,
|
|
487
|
+
precedingLine: null,
|
|
488
|
+
},
|
|
489
|
+
{
|
|
490
|
+
file: 'src/app.ts',
|
|
491
|
+
line: 'console.log("b"); // shield-context: two',
|
|
492
|
+
lineNumber: 2,
|
|
493
|
+
precedingLine: null,
|
|
494
|
+
},
|
|
495
|
+
];
|
|
496
|
+
applyRulesToAdditions(ctx, [rule], additions);
|
|
497
|
+
expect(ctx.warnings).toHaveLength(1);
|
|
455
498
|
});
|
|
456
499
|
});
|
|
457
500
|
// ─── extractJustification ────────────────────────────
|
|
458
501
|
describe('extractJustification', () => {
|
|
459
502
|
it('returns empty string for plain totem-ignore', () => {
|
|
460
|
-
expect(extractJustification('code(); // totem-ignore', null)).toBe('');
|
|
503
|
+
expect(extractJustification(ctx, 'code(); // totem-ignore', null)).toBe('');
|
|
461
504
|
});
|
|
462
505
|
it('extracts justification from same-line totem-context:', () => {
|
|
463
|
-
expect(extractJustification('code(); // totem-context: needed for DLP', null)).toBe('needed for DLP');
|
|
506
|
+
expect(extractJustification(ctx, 'code(); // totem-context: needed for DLP', null)).toBe('needed for DLP');
|
|
464
507
|
});
|
|
465
508
|
it('extracts justification from preceding line totem-context:', () => {
|
|
466
|
-
expect(extractJustification('code();', '// totem-context: audit trail')).toBe('audit trail');
|
|
509
|
+
expect(extractJustification(ctx, 'code();', '// totem-context: audit trail')).toBe('audit trail');
|
|
467
510
|
});
|
|
468
511
|
it('prefers same-line over preceding line', () => {
|
|
469
|
-
expect(extractJustification('code(); // totem-context: same-line reason', '// totem-context: preceding reason')).toBe('same-line reason');
|
|
512
|
+
expect(extractJustification(ctx, 'code(); // totem-context: same-line reason', '// totem-context: preceding reason')).toBe('same-line reason');
|
|
470
513
|
});
|
|
471
514
|
it('trims whitespace from justification', () => {
|
|
472
|
-
expect(extractJustification('code(); // totem-context: extra spaces ', null)).toBe('extra spaces');
|
|
515
|
+
expect(extractJustification(ctx, 'code(); // totem-context: extra spaces ', null)).toBe('extra spaces');
|
|
473
516
|
});
|
|
474
517
|
it('extracts justification from same-line shield-context: (legacy)', () => {
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
setCoreLogger({ warn: (msg) => warnings.push(msg) });
|
|
478
|
-
expect(extractJustification('code(); // shield-context: legacy DLP', null)).toBe('legacy DLP');
|
|
479
|
-
expect(warnings).toHaveLength(1);
|
|
480
|
-
resetShieldContextWarning();
|
|
518
|
+
expect(extractJustification(ctx, 'code(); // shield-context: legacy DLP', null)).toBe('legacy DLP');
|
|
519
|
+
expect(ctx.warnings).toHaveLength(1);
|
|
481
520
|
});
|
|
482
521
|
it('extracts justification from preceding line shield-context: (legacy)', () => {
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
setCoreLogger({ warn: (msg) => warnings.push(msg) });
|
|
486
|
-
expect(extractJustification('code();', '// shield-context: legacy audit')).toBe('legacy audit');
|
|
487
|
-
expect(warnings).toHaveLength(1);
|
|
488
|
-
resetShieldContextWarning();
|
|
522
|
+
expect(extractJustification(ctx, 'code();', '// shield-context: legacy audit')).toBe('legacy audit');
|
|
523
|
+
expect(ctx.warnings).toHaveLength(1);
|
|
489
524
|
});
|
|
490
525
|
it('prefers totem-context: over shield-context: (precedence)', () => {
|
|
491
|
-
resetShieldContextWarning();
|
|
492
|
-
const warnings = [];
|
|
493
|
-
setCoreLogger({ warn: (msg) => warnings.push(msg) });
|
|
494
526
|
// Same-line totem-context wins over preceding-line shield-context
|
|
495
|
-
expect(extractJustification('code(); // totem-context: new reason', '// shield-context: old reason')).toBe('new reason');
|
|
527
|
+
expect(extractJustification(ctx, 'code(); // totem-context: new reason', '// shield-context: old reason')).toBe('new reason');
|
|
496
528
|
// totem-context matched first — shield-context deprecation warning should NOT fire
|
|
497
|
-
expect(warnings).toHaveLength(0);
|
|
498
|
-
resetShieldContextWarning();
|
|
529
|
+
expect(ctx.warnings).toHaveLength(0);
|
|
499
530
|
});
|
|
500
531
|
});
|
|
501
532
|
// ─── matchesGlob ──────────────────────────────────
|