@mmnto/totem 1.14.8 → 1.14.10
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/ast-grep-query.d.ts +22 -2
- package/dist/ast-grep-query.d.ts.map +1 -1
- package/dist/ast-grep-query.js +34 -5
- package/dist/ast-grep-query.js.map +1 -1
- package/dist/ast-grep-query.test.js +45 -1
- package/dist/ast-grep-query.test.js.map +1 -1
- package/dist/compile-lesson.d.ts +24 -1
- package/dist/compile-lesson.d.ts.map +1 -1
- package/dist/compile-lesson.js +131 -60
- package/dist/compile-lesson.js.map +1 -1
- package/dist/compile-lesson.test.js +283 -14
- package/dist/compile-lesson.test.js.map +1 -1
- package/dist/compile-manifest.d.ts +14 -1
- package/dist/compile-manifest.d.ts.map +1 -1
- package/dist/compile-manifest.js +107 -3
- package/dist/compile-manifest.js.map +1 -1
- package/dist/compile-manifest.test.js +123 -1
- package/dist/compile-manifest.test.js.map +1 -1
- package/dist/compile-smoke-gate.d.ts +42 -0
- package/dist/compile-smoke-gate.d.ts.map +1 -0
- package/dist/compile-smoke-gate.js +135 -0
- package/dist/compile-smoke-gate.js.map +1 -0
- package/dist/compile-smoke-gate.test.d.ts +2 -0
- package/dist/compile-smoke-gate.test.d.ts.map +1 -0
- package/dist/compile-smoke-gate.test.js +202 -0
- package/dist/compile-smoke-gate.test.js.map +1 -0
- package/dist/compiler-schema.d.ts +286 -24
- package/dist/compiler-schema.d.ts.map +1 -1
- package/dist/compiler-schema.js +128 -5
- package/dist/compiler-schema.js.map +1 -1
- package/dist/compiler-schema.test.d.ts +2 -0
- package/dist/compiler-schema.test.d.ts.map +1 -0
- package/dist/compiler-schema.test.js +263 -0
- package/dist/compiler-schema.test.js.map +1 -0
- package/dist/compiler.d.ts +22 -5
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +9 -3
- package/dist/compiler.js.map +1 -1
- package/dist/compiler.test.js +19 -5
- package/dist/compiler.test.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/ledger.d.ts +1 -1
- package/dist/lesson-pattern.d.ts +64 -1
- package/dist/lesson-pattern.d.ts.map +1 -1
- package/dist/lesson-pattern.js +153 -6
- package/dist/lesson-pattern.js.map +1 -1
- package/dist/lesson-pattern.test.js +237 -1
- package/dist/lesson-pattern.test.js.map +1 -1
- package/dist/rule-engine.d.ts.map +1 -1
- package/dist/rule-engine.js +36 -10
- package/dist/rule-engine.js.map +1 -1
- package/dist/rule-engine.test.js +98 -4
- package/dist/rule-engine.test.js.map +1 -1
- package/dist/rule-tester.d.ts.map +1 -1
- package/dist/rule-tester.js +9 -2
- package/dist/rule-tester.js.map +1 -1
- package/dist/rule-tester.test.js +41 -0
- package/dist/rule-tester.test.js.map +1 -1
- package/dist/store/lance-store.d.ts +55 -1
- package/dist/store/lance-store.d.ts.map +1 -1
- package/dist/store/lance-store.js +140 -25
- package/dist/store/lance-store.js.map +1 -1
- package/dist/store/lance-store.test.js +77 -0
- package/dist/store/lance-store.test.js.map +1 -1
- package/dist/sys/git.d.ts +12 -1
- package/dist/sys/git.d.ts.map +1 -1
- package/dist/sys/git.js +59 -5
- package/dist/sys/git.js.map +1 -1
- package/dist/sys/git.test.js +23 -3
- package/dist/sys/git.test.js.map +1 -1
- package/package.json +1 -1
package/dist/lesson-pattern.js
CHANGED
|
@@ -3,12 +3,14 @@
|
|
|
3
3
|
* Pipeline 1 (Proposal 186 / ADR-058): zero-LLM compilation.
|
|
4
4
|
*
|
|
5
5
|
* Supported fields (case-insensitive, bold or plain):
|
|
6
|
-
* **Pattern:** <regex or ast-grep pattern>
|
|
6
|
+
* **Pattern:** <regex or flat ast-grep pattern> OR fenced ```yaml block below the marker (compound ast-grep)
|
|
7
7
|
* **Engine:** regex | ast | ast-grep
|
|
8
8
|
* **Scope:** glob, glob, !negated-glob
|
|
9
9
|
* **Severity:** error | warning
|
|
10
10
|
* **Message:** <single-line OR multi-line remediation message> (#1265)
|
|
11
11
|
*/
|
|
12
|
+
import YAML from 'yaml';
|
|
13
|
+
import { TotemParseError } from './errors.js';
|
|
12
14
|
export function extractField(body, field) {
|
|
13
15
|
// Match all common bold/colon variants (#1282 — caught by Shield AI as a
|
|
14
16
|
// partial-fix consequence of extending extractMultilineField):
|
|
@@ -97,15 +99,132 @@ export function extractMultilineField(body, field) {
|
|
|
97
99
|
const trimmed = valueLines.join('\n').trim();
|
|
98
100
|
return trimmed || undefined;
|
|
99
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Extract the contents of a fenced code block that follows a `### Bad Example`
|
|
104
|
+
* heading in a lesson body. Used by the compile-time smoke gate
|
|
105
|
+
* (mmnto/totem#1408) to verify Pipeline 1 rules against their own bad
|
|
106
|
+
* example. Mirrors `extractBadGoodSnippets` for Pipeline 3 but targets a
|
|
107
|
+
* markdown heading rather than a bold field marker because Pipeline 1
|
|
108
|
+
* lessons conventionally use headings for worked examples.
|
|
109
|
+
*
|
|
110
|
+
* Returns `undefined` when:
|
|
111
|
+
* - No `### Bad Example` heading is present
|
|
112
|
+
* - The heading is present but no fenced code block follows before the
|
|
113
|
+
* next heading or EOF
|
|
114
|
+
* - The code block is empty
|
|
115
|
+
*
|
|
116
|
+
* Both ``` and ~~~ fence styles are accepted to stay aligned with
|
|
117
|
+
* `extractCodeBlock`.
|
|
118
|
+
*/
|
|
119
|
+
export function extractBadExample(body) {
|
|
120
|
+
// Match `### Bad Example` through the first fenced block that follows.
|
|
121
|
+
// The heading-stop lookahead keeps the capture from sliding into a
|
|
122
|
+
// Good Example block when the Bad block is missing its fence.
|
|
123
|
+
const re = /(?:^|\n)#{2,6}\s*Bad\s+Example\s*\n([\s\S]*?)(?=\n#{2,6}\s|\n---\s*\n|$)/i;
|
|
124
|
+
const section = body.match(re);
|
|
125
|
+
if (!section)
|
|
126
|
+
return undefined;
|
|
127
|
+
const slice = section[1] ?? '';
|
|
128
|
+
const fence = slice.match(/(?:^|\n)(```|~~~)[^\n]*\n([\s\S]*?)\n?\1/);
|
|
129
|
+
if (!fence)
|
|
130
|
+
return undefined;
|
|
131
|
+
const content = (fence[2] ?? '').trim();
|
|
132
|
+
return content.length > 0 ? content : undefined;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Extract a yaml-tagged fenced code block following a `**Field:**` marker.
|
|
136
|
+
*
|
|
137
|
+
* Scan starts on the line after the field marker and stops at the first
|
|
138
|
+
* subsequent bold-field marker (same terminator used by extractMultilineField)
|
|
139
|
+
* or EOF. Only yaml-tagged fences (```yaml or ~~~yaml, case-insensitive) are
|
|
140
|
+
* accepted — a bare ``` fence is ignored so lessons can still include prose
|
|
141
|
+
* code blocks below the pattern without accidentally being parsed as a rule.
|
|
142
|
+
*
|
|
143
|
+
* Returns the parsed object on success. Returns null when:
|
|
144
|
+
* - The field marker is absent
|
|
145
|
+
* - No yaml fence appears before the next field marker or EOF
|
|
146
|
+
* - The fence content fails to parse as YAML
|
|
147
|
+
* - The parsed value is not a plain object (string / array / null rejected)
|
|
148
|
+
*
|
|
149
|
+
* Motivation: Pipeline 1 (manual) authoring for compound ast-grep rules
|
|
150
|
+
* (`astGrepYamlRule` on CompiledRule). The flat string pattern captured by
|
|
151
|
+
* extractField cannot carry nested `inside:` / `has:` / `not:` combinators;
|
|
152
|
+
* a yaml fence can. Pack authors need a zero-LLM path to author compound
|
|
153
|
+
* rules ahead of the 1.15.0 Pack Distribution milestone.
|
|
154
|
+
*/
|
|
155
|
+
export function extractYamlRuleAfterField(body, field) {
|
|
156
|
+
// Replacer function — `'\\$&'` would still parse correctly because `$&`
|
|
157
|
+
// expanding to the matched char is exactly the intent, but the function
|
|
158
|
+
// form is the safer idiom in substitution-sensitive contexts (matches the
|
|
159
|
+
// broader repo convention, GCA catch on mmnto/totem#1454).
|
|
160
|
+
const safeField = field.replace(/[.*+?^${}()|[\]\\]/g, (ch) => '\\' + ch);
|
|
161
|
+
const startRe = new RegExp(`^(?:\\*{2})?${safeField}(?:\\*{2})?:(?:\\*{2})?.*$`, 'i');
|
|
162
|
+
// Section terminator — any bold field marker OR any markdown heading stops
|
|
163
|
+
// the YAML scan. CR catch on mmnto/totem#1454: without the heading guard,
|
|
164
|
+
// a lesson that omits **Message:** and lands on `### Bad Example` with a
|
|
165
|
+
// yaml fence below would have the unrelated block parsed as the rule.
|
|
166
|
+
const sectionEndRe = /^(?:\*{2}[A-Za-z][\w\s-]*(?::\*{2}|\*{2}:|:)|#{2,6}\s)/;
|
|
167
|
+
const fenceStartRe = /^\s*(```|~~~)yaml\s*$/i;
|
|
168
|
+
// Split on both LF and CRLF so Windows-authored lessons don't leave trailing
|
|
169
|
+
// \r characters that break line-anchored regexes. Same reasoning as
|
|
170
|
+
// extractMultilineField.
|
|
171
|
+
const lines = body.split(/\r?\n/);
|
|
172
|
+
let startIdx = -1;
|
|
173
|
+
for (let i = 0; i < lines.length; i++) {
|
|
174
|
+
if (startRe.test(lines[i])) {
|
|
175
|
+
startIdx = i;
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (startIdx === -1)
|
|
180
|
+
return null;
|
|
181
|
+
let fenceStartIdx = -1;
|
|
182
|
+
let fenceChar = '';
|
|
183
|
+
for (let i = startIdx + 1; i < lines.length; i++) {
|
|
184
|
+
const line = lines[i];
|
|
185
|
+
if (sectionEndRe.test(line))
|
|
186
|
+
return null;
|
|
187
|
+
const m = line.match(fenceStartRe);
|
|
188
|
+
if (m) {
|
|
189
|
+
fenceStartIdx = i;
|
|
190
|
+
fenceChar = m[1];
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (fenceStartIdx === -1)
|
|
195
|
+
return null;
|
|
196
|
+
const fenceEndRe = new RegExp(`^\\s*${fenceChar}\\s*$`);
|
|
197
|
+
const yamlLines = [];
|
|
198
|
+
let fenceClosed = false;
|
|
199
|
+
for (let i = fenceStartIdx + 1; i < lines.length; i++) {
|
|
200
|
+
if (fenceEndRe.test(lines[i])) {
|
|
201
|
+
fenceClosed = true;
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
yamlLines.push(lines[i]);
|
|
205
|
+
}
|
|
206
|
+
if (!fenceClosed)
|
|
207
|
+
return null;
|
|
208
|
+
const yamlSrc = yamlLines.join('\n').trim();
|
|
209
|
+
if (yamlSrc.length === 0)
|
|
210
|
+
return null;
|
|
211
|
+
let parsed;
|
|
212
|
+
try {
|
|
213
|
+
parsed = YAML.parse(yamlSrc);
|
|
214
|
+
// totem-context: malformed YAML is a soft failure for an optional compound rule — caller treats null as "no compound rule present" (GCA #1454)
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
220
|
+
return null;
|
|
221
|
+
return parsed;
|
|
222
|
+
}
|
|
100
223
|
/**
|
|
101
224
|
* Try to extract manual pattern fields from a lesson body.
|
|
102
225
|
* Returns null if the lesson doesn't contain a Pattern: field.
|
|
103
226
|
*/
|
|
104
227
|
export function extractManualPattern(body) {
|
|
105
|
-
const rawPattern = extractField(body, 'Pattern');
|
|
106
|
-
if (!rawPattern)
|
|
107
|
-
return null;
|
|
108
|
-
const pattern = stripInlineCode(rawPattern);
|
|
109
228
|
const engineRaw = extractField(body, 'Engine')?.toLowerCase();
|
|
110
229
|
const engine = engineRaw === 'ast' ? 'ast' : engineRaw === 'ast-grep' ? 'ast-grep' : 'regex';
|
|
111
230
|
const scopeRaw = extractField(body, 'Scope');
|
|
@@ -120,7 +239,35 @@ export function extractManualPattern(body) {
|
|
|
120
239
|
// #1265: rich message field with multi-line support. Backward compatible — undefined
|
|
121
240
|
// when absent, and `buildManualRule` falls back to `lesson.heading` in that case.
|
|
122
241
|
const message = extractMultilineField(body, 'Message');
|
|
123
|
-
|
|
242
|
+
// mmnto/totem#1408: optional Bad Example block for the compile-time smoke gate.
|
|
243
|
+
const badExample = extractBadExample(body);
|
|
244
|
+
// Compound path: a yaml-tagged fenced block immediately below **Pattern:**.
|
|
245
|
+
// Only valid for engine: ast-grep — a compound YAML rule has no meaning for
|
|
246
|
+
// regex or tree-sitter-query engines. Authoring error (yaml fence + wrong
|
|
247
|
+
// engine) fails loud instead of silently falling through to Pipeline 2/3,
|
|
248
|
+
// because a lesson that went to the trouble of writing yaml clearly
|
|
249
|
+
// intended manual compound compilation (CR catch on mmnto/totem#1454).
|
|
250
|
+
const yamlRule = extractYamlRuleAfterField(body, 'Pattern');
|
|
251
|
+
if (yamlRule) {
|
|
252
|
+
if (engine !== 'ast-grep') {
|
|
253
|
+
throw new TotemParseError(`Lesson authoring error: yaml-tagged \`**Pattern:**\` fence found but \`**Engine:**\` is \`${engine}\`. Compound yaml rules only compile under \`ast-grep\`.`, 'Set `**Engine:** ast-grep` on the lesson, or replace the yaml fence with a flat one-line pattern matching the chosen engine.');
|
|
254
|
+
}
|
|
255
|
+
return {
|
|
256
|
+
pattern: '',
|
|
257
|
+
engine: 'ast-grep',
|
|
258
|
+
fileGlobs,
|
|
259
|
+
severity,
|
|
260
|
+
message,
|
|
261
|
+
badExample,
|
|
262
|
+
astGrepYamlRule: yamlRule,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
// Flat path (existing behavior).
|
|
266
|
+
const rawPattern = extractField(body, 'Pattern');
|
|
267
|
+
if (!rawPattern)
|
|
268
|
+
return null;
|
|
269
|
+
const pattern = stripInlineCode(rawPattern);
|
|
270
|
+
return { pattern, engine, fileGlobs, severity, message, badExample };
|
|
124
271
|
}
|
|
125
272
|
/**
|
|
126
273
|
* Extract ALL values for a repeated field from a lesson body.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lesson-pattern.js","sourceRoot":"","sources":["../src/lesson-pattern.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"lesson-pattern.js","sourceRoot":"","sources":["../src/lesson-pattern.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { extractAllFields, extractBadGoodSnippets, extractManualPattern, extractMultilineField, extractRuleExamples, stripInlineCode, } from './lesson-pattern.js';
|
|
2
|
+
import { extractAllFields, extractBadGoodSnippets, extractManualPattern, extractMultilineField, extractRuleExamples, extractYamlRuleAfterField, stripInlineCode, } from './lesson-pattern.js';
|
|
3
3
|
describe('extractManualPattern', () => {
|
|
4
4
|
it('extracts all fields from a well-formed lesson body', () => {
|
|
5
5
|
const body = [
|
|
@@ -60,6 +60,78 @@ describe('extractManualPattern', () => {
|
|
|
60
60
|
const result = extractManualPattern(body);
|
|
61
61
|
expect(result?.pattern).toBe('process.kill($PID, 0)');
|
|
62
62
|
});
|
|
63
|
+
// ─── Bad Example extraction (mmnto/totem#1408) ───────
|
|
64
|
+
it('extracts a Bad Example section into badExample when present', () => {
|
|
65
|
+
const body = [
|
|
66
|
+
'**Pattern:** console\\.log',
|
|
67
|
+
'**Engine:** regex',
|
|
68
|
+
'**Severity:** warning',
|
|
69
|
+
'',
|
|
70
|
+
'### Bad Example',
|
|
71
|
+
'',
|
|
72
|
+
'```ts',
|
|
73
|
+
'console.log("debug")',
|
|
74
|
+
'console.log(x)',
|
|
75
|
+
'```',
|
|
76
|
+
].join('\n');
|
|
77
|
+
const result = extractManualPattern(body);
|
|
78
|
+
expect(result).not.toBeNull();
|
|
79
|
+
expect(result?.badExample).toBe('console.log("debug")\nconsole.log(x)');
|
|
80
|
+
});
|
|
81
|
+
it('returns badExample undefined when no Bad Example section is present', () => {
|
|
82
|
+
const body = '**Pattern:** console\\.log\n**Engine:** regex';
|
|
83
|
+
const result = extractManualPattern(body);
|
|
84
|
+
expect(result).not.toBeNull();
|
|
85
|
+
expect(result?.badExample).toBeUndefined();
|
|
86
|
+
});
|
|
87
|
+
it('treats an empty Bad Example block as absent', () => {
|
|
88
|
+
const body = [
|
|
89
|
+
'**Pattern:** foo',
|
|
90
|
+
'**Engine:** regex',
|
|
91
|
+
'',
|
|
92
|
+
'### Bad Example',
|
|
93
|
+
'',
|
|
94
|
+
'```ts',
|
|
95
|
+
'```',
|
|
96
|
+
].join('\n');
|
|
97
|
+
const result = extractManualPattern(body);
|
|
98
|
+
expect(result?.badExample).toBeUndefined();
|
|
99
|
+
});
|
|
100
|
+
it('accepts ~~~ fences as well as ``` fences for the Bad Example block', () => {
|
|
101
|
+
const body = [
|
|
102
|
+
'**Pattern:** foo',
|
|
103
|
+
'**Engine:** regex',
|
|
104
|
+
'',
|
|
105
|
+
'### Bad Example',
|
|
106
|
+
'',
|
|
107
|
+
'~~~ts',
|
|
108
|
+
'foo()',
|
|
109
|
+
'~~~',
|
|
110
|
+
].join('\n');
|
|
111
|
+
const result = extractManualPattern(body);
|
|
112
|
+
expect(result?.badExample).toBe('foo()');
|
|
113
|
+
});
|
|
114
|
+
it('stops the Bad Example capture at the next heading', () => {
|
|
115
|
+
const body = [
|
|
116
|
+
'**Pattern:** foo',
|
|
117
|
+
'**Engine:** regex',
|
|
118
|
+
'',
|
|
119
|
+
'### Bad Example',
|
|
120
|
+
'',
|
|
121
|
+
'```ts',
|
|
122
|
+
'foo()',
|
|
123
|
+
'```',
|
|
124
|
+
'',
|
|
125
|
+
'### Good Example',
|
|
126
|
+
'',
|
|
127
|
+
'```ts',
|
|
128
|
+
'bar()',
|
|
129
|
+
'```',
|
|
130
|
+
].join('\n');
|
|
131
|
+
const result = extractManualPattern(body);
|
|
132
|
+
expect(result?.badExample).toBe('foo()');
|
|
133
|
+
expect(result?.badExample).not.toContain('bar()');
|
|
134
|
+
});
|
|
63
135
|
it('extracts fields with no whitespace after the closing bold marker (#1282 GCA)', () => {
|
|
64
136
|
// Pre-fix, extractField required \s+ which silently rejected **Pattern:**foo
|
|
65
137
|
// (no space). The lesson would fall through to Pipeline 2 instead of taking
|
|
@@ -447,4 +519,168 @@ describe('extractBadGoodSnippets', () => {
|
|
|
447
519
|
expect(result.good).toEqual(['const x = 1;', 'logger.info(x);']);
|
|
448
520
|
});
|
|
449
521
|
});
|
|
522
|
+
describe('extractYamlRuleAfterField', () => {
|
|
523
|
+
it('parses a yaml-tagged fenced block following **Pattern:**', () => {
|
|
524
|
+
const body = [
|
|
525
|
+
'**Pattern:**',
|
|
526
|
+
'```yaml',
|
|
527
|
+
'rule:',
|
|
528
|
+
' kind: catch_clause',
|
|
529
|
+
' not:',
|
|
530
|
+
' has:',
|
|
531
|
+
' kind: throw_statement',
|
|
532
|
+
' stopBy: end',
|
|
533
|
+
'```',
|
|
534
|
+
'',
|
|
535
|
+
'**Engine:** ast-grep',
|
|
536
|
+
].join('\n');
|
|
537
|
+
const result = extractYamlRuleAfterField(body, 'Pattern');
|
|
538
|
+
expect(result).toEqual({
|
|
539
|
+
rule: {
|
|
540
|
+
kind: 'catch_clause',
|
|
541
|
+
not: {
|
|
542
|
+
has: {
|
|
543
|
+
kind: 'throw_statement',
|
|
544
|
+
stopBy: 'end',
|
|
545
|
+
},
|
|
546
|
+
},
|
|
547
|
+
},
|
|
548
|
+
});
|
|
549
|
+
});
|
|
550
|
+
it('accepts ~~~yaml fence style', () => {
|
|
551
|
+
const body = ['**Pattern:**', '~~~yaml', 'rule:', ' kind: catch_clause', '~~~'].join('\n');
|
|
552
|
+
const result = extractYamlRuleAfterField(body, 'Pattern');
|
|
553
|
+
expect(result).toEqual({ rule: { kind: 'catch_clause' } });
|
|
554
|
+
});
|
|
555
|
+
it('ignores a bare ``` fence without yaml tag (so prose code blocks pass through)', () => {
|
|
556
|
+
const body = ['**Pattern:**', '```', 'this is not a yaml rule', '```'].join('\n');
|
|
557
|
+
expect(extractYamlRuleAfterField(body, 'Pattern')).toBeNull();
|
|
558
|
+
});
|
|
559
|
+
it('returns null when the yaml parses to a non-object (array/string/null)', () => {
|
|
560
|
+
const arrayBody = ['**Pattern:**', '```yaml', '- foo', '- bar', '```'].join('\n');
|
|
561
|
+
const stringBody = ['**Pattern:**', '```yaml', '"just a string"', '```'].join('\n');
|
|
562
|
+
expect(extractYamlRuleAfterField(arrayBody, 'Pattern')).toBeNull();
|
|
563
|
+
expect(extractYamlRuleAfterField(stringBody, 'Pattern')).toBeNull();
|
|
564
|
+
});
|
|
565
|
+
it('returns null when the yaml is malformed', () => {
|
|
566
|
+
const body = ['**Pattern:**', '```yaml', '{ unterminated:', '```'].join('\n');
|
|
567
|
+
expect(extractYamlRuleAfterField(body, 'Pattern')).toBeNull();
|
|
568
|
+
});
|
|
569
|
+
it('stops scanning at the next bold field marker (does not cross into later sections)', () => {
|
|
570
|
+
// The yaml fence here lives AFTER a **Message:** marker, so the Pattern
|
|
571
|
+
// scanner must stop before reaching it. This guards against a lesson
|
|
572
|
+
// whose Pattern field is missing from producing a surprise match on a
|
|
573
|
+
// yaml block intended for a different field.
|
|
574
|
+
const body = [
|
|
575
|
+
'**Pattern:**',
|
|
576
|
+
'plain line, not a fence',
|
|
577
|
+
'**Message:** prose',
|
|
578
|
+
'```yaml',
|
|
579
|
+
'rule:',
|
|
580
|
+
' kind: catch_clause',
|
|
581
|
+
'```',
|
|
582
|
+
].join('\n');
|
|
583
|
+
expect(extractYamlRuleAfterField(body, 'Pattern')).toBeNull();
|
|
584
|
+
});
|
|
585
|
+
it('stops scanning at a markdown heading (CR #1454 — no cross-section YAML parsing)', () => {
|
|
586
|
+
// A lesson that omits **Message:** and jumps straight to `### Bad Example`
|
|
587
|
+
// or `## Why this needs to be compound` must NOT have a yaml fence under
|
|
588
|
+
// those headings parsed as the rule body. Without the heading terminator,
|
|
589
|
+
// the scanner would scoop the first yaml fence it finds anywhere after
|
|
590
|
+
// **Pattern:**, even if the author intended the block as an illustration.
|
|
591
|
+
const body = [
|
|
592
|
+
'**Pattern:**',
|
|
593
|
+
'plain line, not a fence',
|
|
594
|
+
'',
|
|
595
|
+
'### Bad Example',
|
|
596
|
+
'',
|
|
597
|
+
'```yaml',
|
|
598
|
+
'this: is-an-illustration',
|
|
599
|
+
'not: a-rule',
|
|
600
|
+
'```',
|
|
601
|
+
].join('\n');
|
|
602
|
+
expect(extractYamlRuleAfterField(body, 'Pattern')).toBeNull();
|
|
603
|
+
});
|
|
604
|
+
it('stops at level-2 headings too', () => {
|
|
605
|
+
const body = [
|
|
606
|
+
'**Pattern:**',
|
|
607
|
+
'plain line',
|
|
608
|
+
'',
|
|
609
|
+
'## Why this needs to be compound',
|
|
610
|
+
'',
|
|
611
|
+
'```yaml',
|
|
612
|
+
'rule:',
|
|
613
|
+
' kind: catch_clause',
|
|
614
|
+
'```',
|
|
615
|
+
].join('\n');
|
|
616
|
+
expect(extractYamlRuleAfterField(body, 'Pattern')).toBeNull();
|
|
617
|
+
});
|
|
618
|
+
it('returns null when the fence never closes', () => {
|
|
619
|
+
const body = [
|
|
620
|
+
'**Pattern:**',
|
|
621
|
+
'```yaml',
|
|
622
|
+
'rule:',
|
|
623
|
+
' kind: catch_clause',
|
|
624
|
+
'(EOF with no closing fence)',
|
|
625
|
+
].join('\n');
|
|
626
|
+
expect(extractYamlRuleAfterField(body, 'Pattern')).toBeNull();
|
|
627
|
+
});
|
|
628
|
+
it('handles CRLF line endings (Windows-authored lessons)', () => {
|
|
629
|
+
const body = ['**Pattern:**', '```yaml', 'rule:', ' kind: catch_clause', '```'].join('\r\n');
|
|
630
|
+
const result = extractYamlRuleAfterField(body, 'Pattern');
|
|
631
|
+
expect(result).toEqual({ rule: { kind: 'catch_clause' } });
|
|
632
|
+
});
|
|
633
|
+
});
|
|
634
|
+
describe('extractManualPattern — compound ast-grep path', () => {
|
|
635
|
+
it('returns a ManualPattern with astGrepYamlRule when the Pattern field has a yaml fence', () => {
|
|
636
|
+
const body = [
|
|
637
|
+
'**Tags:** tenet-4, fail-loud',
|
|
638
|
+
'**Engine:** ast-grep',
|
|
639
|
+
'**Scope:** packages/**/*.ts, !**/*.test.ts',
|
|
640
|
+
'**Severity:** error',
|
|
641
|
+
'**Pattern:**',
|
|
642
|
+
'```yaml',
|
|
643
|
+
'rule:',
|
|
644
|
+
' kind: catch_clause',
|
|
645
|
+
' not:',
|
|
646
|
+
' has:',
|
|
647
|
+
' kind: throw_statement',
|
|
648
|
+
' stopBy: end',
|
|
649
|
+
'```',
|
|
650
|
+
'',
|
|
651
|
+
'**Message:** never swallow errors',
|
|
652
|
+
].join('\n');
|
|
653
|
+
const result = extractManualPattern(body);
|
|
654
|
+
expect(result).not.toBeNull();
|
|
655
|
+
expect(result.engine).toBe('ast-grep');
|
|
656
|
+
expect(result.pattern).toBe('');
|
|
657
|
+
expect(result.severity).toBe('error');
|
|
658
|
+
expect(result.fileGlobs).toEqual(['packages/**/*.ts', '!**/*.test.ts']);
|
|
659
|
+
expect(result.message).toBe('never swallow errors');
|
|
660
|
+
expect(result.astGrepYamlRule).toEqual({
|
|
661
|
+
rule: {
|
|
662
|
+
kind: 'catch_clause',
|
|
663
|
+
not: { has: { kind: 'throw_statement', stopBy: 'end' } },
|
|
664
|
+
},
|
|
665
|
+
});
|
|
666
|
+
});
|
|
667
|
+
it('throws TotemParseError when yaml fence present but Engine is not ast-grep (CR #1454 — fail-loud on authoring mismatch)', () => {
|
|
668
|
+
const body = [
|
|
669
|
+
'**Engine:** regex',
|
|
670
|
+
'**Pattern:**',
|
|
671
|
+
'```yaml',
|
|
672
|
+
'rule:',
|
|
673
|
+
' kind: catch_clause',
|
|
674
|
+
'```',
|
|
675
|
+
].join('\n');
|
|
676
|
+
expect(() => extractManualPattern(body)).toThrow(/Lesson authoring error/);
|
|
677
|
+
});
|
|
678
|
+
it('still parses flat **Pattern:** values when no yaml fence is present (regression guard)', () => {
|
|
679
|
+
const body = ['**Pattern:** new Error($$$)', '**Engine:** ast-grep'].join('\n');
|
|
680
|
+
const result = extractManualPattern(body);
|
|
681
|
+
expect(result).not.toBeNull();
|
|
682
|
+
expect(result.pattern).toBe('new Error($$$)');
|
|
683
|
+
expect(result.astGrepYamlRule).toBeUndefined();
|
|
684
|
+
});
|
|
685
|
+
});
|
|
450
686
|
//# sourceMappingURL=lesson-pattern.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lesson-pattern.test.js","sourceRoot":"","sources":["../src/lesson-pattern.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,IAAI,GAAG;YACX,uBAAuB;YACvB,+BAA+B;YAC/B,mBAAmB;YACnB,2CAA2C;YAC3C,uBAAuB;YACvB,EAAE;YACF,iEAAiE;SAClE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,OAAO,EAAE,kBAAkB;YAC3B,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,CAAC,aAAa,EAAE,mBAAmB,CAAC;YAC/C,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,mDAAmD,CAAC;QACjE,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,IAAI,GAAG,+BAA+B,CAAC;QAC7C,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,+BAA+B,CAAC;QAC7C,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,IAAI,GAAG,mDAAmD,CAAC;QACjE,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,IAAI,GAAG,yDAAyD,CAAC;QACvE,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAG,6DAA6D,CAAC;QAC3E,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,wBAAwB,CAAC;QACtC,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,IAAI,GAAG,4DAA4D,CAAC;QAC1E,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,6EAA6E;QAC7E,4EAA4E;QAC5E,8EAA8E;QAC9E,wDAAwD;QACxD,MAAM,IAAI,GAAG,sEAAsE,CAAC;QACpF,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,0EAA0E;QAC1E,sEAAsE;QACtE,4EAA4E;QAC5E,sCAAsC;QACtC,MAAM,IAAI,GAAG,iCAAiC,CAAC;QAC/C,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,uEAAuE;QACvE,2EAA2E;QAC3E,6EAA6E;QAC7E,sEAAsE;QACtE,MAAM,IAAI,GAAG;YACX,+BAA+B;YAC/B,mBAAmB;YACnB,wBAAwB;YACxB,uBAAuB;YACvB,mEAAmE;SACpE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG;YACX,+BAA+B;YAC/B,mBAAmB;YACnB,uBAAuB;YACvB,uEAAuE;SACxE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,IAAI,GAAG;YACX,6DAA6D;YAC7D,mBAAmB;YACnB,uBAAuB;YACvB,8DAA8D;YAC9D,EAAE;YACF,qEAAqE;YACrE,kEAAkE;YAClE,mCAAmC;SACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,iDAAiD,CAAC,CAAC;QACrF,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACpE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,8EAA8E;QAC9E,gEAAgE;QAChE,MAAM,IAAI,GAAG;YACX,sBAAsB;YACtB,mBAAmB;YACnB,kDAAkD;YAClD,qCAAqC;YACrC,qBAAqB;YACrB,oBAAoB;SACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,8EAA8E;QAC9E,uFAAuF;QACvF,mEAAmE;QACnE,MAAM,IAAI,GAAG;YACX,+BAA+B;YAC/B,mBAAmB;YACnB,uBAAuB;SACxB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,IAAI,GAAG,mCAAmC,CAAC;QACjD,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,IAAI,GAAG;YACX,8CAA8C;YAC9C,EAAE;YACF,wBAAwB;YACxB,EAAE;YACF,6BAA6B;SAC9B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAG;YACX,mCAAmC;YACnC,mBAAmB;YACnB,uBAAuB;YACvB,8BAA8B;SAC/B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,wEAAwE;QACxE,wDAAwD;QACxD,MAAM,IAAI,GAAG;YACX,yCAAyC;YACzC,wCAAwC;YACxC,8CAA8C;YAC9C,uBAAuB;SACxB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG,qCAAqC,CAAC;QACnD,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,6EAA6E;QAC7E,mFAAmF;QACnF,iCAAiC;QACjC,MAAM,IAAI,GAAG;YACX,kBAAkB;YAClB,mBAAmB;YACnB,cAAc;YACd,uBAAuB;SACxB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,mFAAmF;QACnF,kFAAkF;QAClF,gFAAgF;QAChF,4EAA4E;QAC5E,qDAAqD;QACrD,MAAM,IAAI,GAAG,8EAA8E,CAAC;QAC5F,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG;YACX,sBAAsB;YACtB,+BAA+B;YAC/B,qCAAqC;YACrC,qBAAqB;SACtB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACf,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,IAAI,GAAG;YACX,yDAAyD;YACzD,EAAE;YACF,wCAAwC;YACxC,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,gFAAgF,CACjF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,gFAAgF;QAChF,iFAAiF;QACjF,6EAA6E;QAC7E,sEAAsE;QACtE,MAAM,IAAI,GAAG;YACX,kBAAkB;YAClB,sDAAsD;YACtD,0BAA0B;YAC1B,uBAAuB;YACvB,8BAA8B;SAC/B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC;QACpE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,4EAA4E;QAC5E,uEAAuE;QACvE,8EAA8E;QAC9E,0EAA0E;QAC1E,6DAA6D;QAC7D,MAAM,IAAI,GAAG;YACX,yCAAyC;YACzC,mCAAmC;YACnC,qBAAqB,EAAE,oCAAoC;YAC3D,8BAA8B;SAC/B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,IAAI,GAAG;YACX,kBAAkB,EAAE,YAAY;YAChC,0BAA0B,EAAE,WAAW;YACvC,cAAc;YACd,uBAAuB,EAAE,uBAAuB;SACjD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GAAG,+EAA+E,CAAC;QAC7F,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,IAAI,GAAG,sCAAsC,CAAC;QACpD,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,IAAI,GAAG,0CAA0C,CAAC;QACxD,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,qFAAqF;QACrF,MAAM,IAAI,GACR,wFAAwF,CAAC;QAC3F,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC;YACpD,WAAW;YACX,eAAe;YACf,WAAW;SACZ,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,gFAAgF,CAAC;QAC9F,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,IAAI,EAAE,CAAC,oBAAoB,CAAC;YAC5B,MAAM,EAAE,CAAC,qBAAqB,CAAC;SAChC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAG,wCAAwC,CAAC;QACtD,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,MAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,IAAI,GAAG;YACX,UAAU;YACV,OAAO;YACP,qBAAqB;YACrB,KAAK;YACL,EAAE;YACF,WAAW;YACX,OAAO;YACP,sBAAsB;YACtB,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,MAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GAAG,gEAAgE,CAAC;QAC9E,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,MAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GAAG,mDAAmD,CAAC;QACjE,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GAAG,+BAA+B,CAAC;QAC7C,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GAAG,iCAAiC,CAAC;QAC/C,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG;YACX,UAAU;YACV,OAAO;YACP,qBAAqB;YACrB,KAAK;YACL,iCAAiC;SAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,MAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,IAAI,GAAG;YACX,UAAU;YACV,OAAO;YACP,EAAE;YACF,qBAAqB;YACrB,EAAE;YACF,KAAK;YACL,WAAW;YACX,OAAO;YACP,EAAE;YACF,sBAAsB;YACtB,EAAE;YACF,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,MAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,IAAI,GAAG;YACX,UAAU;YACV,OAAO;YACP,cAAc;YACd,iBAAiB;YACjB,KAAK;YACL,EAAE;YACF,WAAW;YACX,OAAO;YACP,cAAc;YACd,iBAAiB;YACjB,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,MAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"lesson-pattern.test.js","sourceRoot":"","sources":["../src/lesson-pattern.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-engine.d.ts","sourceRoot":"","sources":["../src/rule-engine.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACV,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"rule-engine.d.ts","sourceRoot":"","sources":["../src/rule-engine.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACV,MAAM,sBAAsB,CAAC;AAM9B;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAsDnE;AAqBD,sDAAsD;AACtD,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAcD,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAEtD;AAED,2CAA2C;AAC3C,wBAAgB,yBAAyB,IAAI,IAAI,CAGhD;AAkDD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAavF;AAID;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EAAE,EACrB,SAAS,EAAE,YAAY,EAAE,EACzB,WAAW,CAAC,EAAE,iBAAiB,GAC9B,SAAS,EAAE,CAoEb;AAID;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,YAAY,EAAE,EACrB,SAAS,EAAE,YAAY,EAAE,EACzB,gBAAgB,EAAE,MAAM,EACxB,WAAW,CAAC,EAAE,iBAAiB,EAC/B,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAC9B,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAC1D,OAAO,CAAC,SAAS,EAAE,CAAC,CAoMtB;AAID;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,YAAY,EAAE,EACrB,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,SAAS,EAAE,CAUb"}
|
package/dist/rule-engine.js
CHANGED
|
@@ -4,6 +4,7 @@ import { extensionToLanguage } from './ast-classifier.js';
|
|
|
4
4
|
import { matchAstGrepPatternsBatch } from './ast-grep-query.js';
|
|
5
5
|
import { matchAstQueriesBatch } from './ast-query.js';
|
|
6
6
|
import { extractAddedLines } from './diff-parser.js';
|
|
7
|
+
import { TotemParseError } from './errors.js';
|
|
7
8
|
// ─── File glob matching ─────────────────────────────
|
|
8
9
|
/**
|
|
9
10
|
* Check if a file path matches a single glob pattern.
|
|
@@ -179,9 +180,16 @@ export function applyRulesToAdditions(rules, additions, onRuleEvent) {
|
|
|
179
180
|
try {
|
|
180
181
|
re = new RegExp(rule.pattern);
|
|
181
182
|
}
|
|
182
|
-
catch {
|
|
183
|
-
//
|
|
184
|
-
|
|
183
|
+
catch (err) {
|
|
184
|
+
// Fail loud (mmnto/totem#1442): invalid regex in a compiled rule means
|
|
185
|
+
// the compile-time validator was bypassed or the manifest was edited
|
|
186
|
+
// by hand. Silently skipping would mark the diff "compliant" while a
|
|
187
|
+
// load-bearing rule is mute. Throw so the operator sees exactly which
|
|
188
|
+
// rule is broken and can fix or archive it. `TotemParseError` is the
|
|
189
|
+
// correct class here — an uncompilable compiled rule is a parse/
|
|
190
|
+
// compilation failure on the rule's source, not a generic check
|
|
191
|
+
// failure (GCA catch on mmnto/totem#1454).
|
|
192
|
+
throw new TotemParseError(`Rule ${rule.lessonHash} has an invalid regex pattern and cannot be evaluated.`, `Re-run 'totem lesson compile' to regenerate the rule, or archive it via 'totem doctor --pr' if the source lesson cannot produce a valid pattern. Pattern: ${JSON.stringify(rule.pattern)}`, err);
|
|
185
193
|
}
|
|
186
194
|
for (const addition of additions) {
|
|
187
195
|
// Skip if rule has fileGlobs and this file doesn't match
|
|
@@ -230,7 +238,12 @@ export function applyRulesToAdditions(rules, additions, onRuleEvent) {
|
|
|
230
238
|
*/
|
|
231
239
|
export async function applyAstRulesToAdditions(rules, additions, workingDirectory, onRuleEvent, onWarn, readStrategy) {
|
|
232
240
|
const treeSitterRules = rules.filter((r) => r.engine === 'ast' && r.astQuery);
|
|
233
|
-
|
|
241
|
+
// Widen to include compound rules (mmnto/totem#1408). A rule is runnable
|
|
242
|
+
// when EITHER `astGrepPattern` (string) or `astGrepYamlRule` (NapiConfig
|
|
243
|
+
// object) is populated. The mutual-exclusion superRefine on
|
|
244
|
+
// CompiledRuleSchema guarantees these do not coexist, so the per-rule
|
|
245
|
+
// dispatch below can safely use an if/else on presence alone.
|
|
246
|
+
const astGrepRules = rules.filter((r) => r.engine === 'ast-grep' && (r.astGrepPattern || r.astGrepYamlRule));
|
|
234
247
|
if ((treeSitterRules.length === 0 && astGrepRules.length === 0) || additions.length === 0) {
|
|
235
248
|
return [];
|
|
236
249
|
}
|
|
@@ -348,14 +361,27 @@ export async function applyAstRulesToAdditions(rules, additions, workingDirector
|
|
|
348
361
|
// Fall through — content stays null for standard file read failures
|
|
349
362
|
}
|
|
350
363
|
if (content) {
|
|
351
|
-
// Batch: parse file once, run all patterns
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
364
|
+
// Batch: parse file once, run all patterns.
|
|
365
|
+
// Each rule carries either astGrepPattern (string) or astGrepYamlRule
|
|
366
|
+
// (NapiConfig object); the batch helper polymorphically dispatches on
|
|
367
|
+
// type. Per-rule try/catch (mmnto/totem#1408 G-7) ensures one
|
|
368
|
+
// malformed rule does not kill the whole file pass: failures flow
|
|
369
|
+
// through the onRuleFailure sink, get mapped back to a lessonHash
|
|
370
|
+
// via the query index, and surface as 'failure' RuleEvent entries.
|
|
371
|
+
const queries = applicableAstGrep.map((rule) => ({
|
|
372
|
+
rule: (rule.astGrepPattern ?? rule.astGrepYamlRule),
|
|
356
373
|
addedLineNumbers,
|
|
357
374
|
}));
|
|
358
|
-
const batchResults = matchAstGrepPatternsBatch(content, ext, queries)
|
|
375
|
+
const batchResults = matchAstGrepPatternsBatch(content, ext, queries, (index, err) => {
|
|
376
|
+
const failedRule = applicableAstGrep[index];
|
|
377
|
+
if (!failedRule)
|
|
378
|
+
return;
|
|
379
|
+
onRuleEvent?.('failure', failedRule.lessonHash, {
|
|
380
|
+
file,
|
|
381
|
+
line: 0,
|
|
382
|
+
failureReason: err.message,
|
|
383
|
+
});
|
|
384
|
+
});
|
|
359
385
|
for (let i = 0; i < applicableAstGrep.length; i++) {
|
|
360
386
|
const rule = applicableAstGrep[i];
|
|
361
387
|
const matches = batchResults[i] ?? [];
|