veto-leash 0.1.3 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.md +110 -195
  2. package/dist/ast/builtins.d.ts +28 -0
  3. package/dist/ast/builtins.d.ts.map +1 -0
  4. package/dist/ast/builtins.js +361 -0
  5. package/dist/ast/builtins.js.map +1 -0
  6. package/dist/ast/checker.d.ts +17 -0
  7. package/dist/ast/checker.d.ts.map +1 -0
  8. package/dist/ast/checker.js +97 -0
  9. package/dist/ast/checker.js.map +1 -0
  10. package/dist/ast/index.d.ts +5 -0
  11. package/dist/ast/index.d.ts.map +1 -0
  12. package/dist/ast/index.js +7 -0
  13. package/dist/ast/index.js.map +1 -0
  14. package/dist/ast/parser.d.ts +55 -0
  15. package/dist/ast/parser.d.ts.map +1 -0
  16. package/dist/ast/parser.js +210 -0
  17. package/dist/ast/parser.js.map +1 -0
  18. package/dist/ast/query.d.ts +48 -0
  19. package/dist/ast/query.d.ts.map +1 -0
  20. package/dist/ast/query.js +102 -0
  21. package/dist/ast/query.js.map +1 -0
  22. package/dist/ast/validate-cli.d.ts +21 -0
  23. package/dist/ast/validate-cli.d.ts.map +1 -0
  24. package/dist/ast/validate-cli.js +73 -0
  25. package/dist/ast/validate-cli.js.map +1 -0
  26. package/dist/cli.js +105 -21
  27. package/dist/cli.js.map +1 -1
  28. package/dist/compiler/builtins.d.ts.map +1 -1
  29. package/dist/compiler/builtins.js +721 -4
  30. package/dist/compiler/builtins.js.map +1 -1
  31. package/dist/compiler/commands.d.ts +40 -0
  32. package/dist/compiler/commands.d.ts.map +1 -0
  33. package/dist/compiler/commands.js +311 -0
  34. package/dist/compiler/commands.js.map +1 -0
  35. package/dist/compiler/content.d.ts +160 -0
  36. package/dist/compiler/content.d.ts.map +1 -0
  37. package/dist/compiler/content.js +461 -0
  38. package/dist/compiler/content.js.map +1 -0
  39. package/dist/compiler/index.d.ts.map +1 -1
  40. package/dist/compiler/index.js +34 -7
  41. package/dist/compiler/index.js.map +1 -1
  42. package/dist/compiler/llm.d.ts.map +1 -1
  43. package/dist/compiler/llm.js +96 -9
  44. package/dist/compiler/llm.js.map +1 -1
  45. package/dist/compiler/prompt.d.ts +1 -1
  46. package/dist/compiler/prompt.d.ts.map +1 -1
  47. package/dist/compiler/prompt.js +247 -15
  48. package/dist/compiler/prompt.js.map +1 -1
  49. package/dist/config/leash-parser.d.ts +29 -0
  50. package/dist/config/leash-parser.d.ts.map +1 -0
  51. package/dist/config/leash-parser.js +70 -0
  52. package/dist/config/leash-parser.js.map +1 -0
  53. package/dist/config/loader.d.ts +2 -1
  54. package/dist/config/loader.d.ts.map +1 -1
  55. package/dist/config/loader.js +18 -8
  56. package/dist/config/loader.js.map +1 -1
  57. package/dist/config/schema.d.ts +8 -0
  58. package/dist/config/schema.d.ts.map +1 -1
  59. package/dist/config/schema.js +19 -0
  60. package/dist/config/schema.js.map +1 -1
  61. package/dist/config/watcher.d.ts +18 -0
  62. package/dist/config/watcher.d.ts.map +1 -0
  63. package/dist/config/watcher.js +102 -0
  64. package/dist/config/watcher.js.map +1 -0
  65. package/dist/matcher.d.ts +18 -0
  66. package/dist/matcher.d.ts.map +1 -1
  67. package/dist/matcher.js +43 -0
  68. package/dist/matcher.js.map +1 -1
  69. package/dist/native/claude-code.d.ts.map +1 -1
  70. package/dist/native/claude-code.js +294 -50
  71. package/dist/native/claude-code.js.map +1 -1
  72. package/dist/native/cursor.d.ts +14 -1
  73. package/dist/native/cursor.d.ts.map +1 -1
  74. package/dist/native/cursor.js +340 -34
  75. package/dist/native/cursor.js.map +1 -1
  76. package/dist/native/index.d.ts +5 -0
  77. package/dist/native/index.d.ts.map +1 -1
  78. package/dist/native/index.js +56 -10
  79. package/dist/native/index.js.map +1 -1
  80. package/dist/native/opencode.d.ts.map +1 -1
  81. package/dist/native/opencode.js +15 -3
  82. package/dist/native/opencode.js.map +1 -1
  83. package/dist/native/validator.d.ts +15 -0
  84. package/dist/native/validator.d.ts.map +1 -0
  85. package/dist/native/validator.js +343 -0
  86. package/dist/native/validator.js.map +1 -0
  87. package/dist/types.d.ts +114 -0
  88. package/dist/types.d.ts.map +1 -1
  89. package/dist/types.js.map +1 -1
  90. package/dist/wrapper/daemon.d.ts.map +1 -1
  91. package/dist/wrapper/daemon.js +31 -2
  92. package/dist/wrapper/daemon.js.map +1 -1
  93. package/languages/tree-sitter-javascript.wasm +0 -0
  94. package/languages/tree-sitter-tsx.wasm +0 -0
  95. package/languages/tree-sitter-typescript.wasm +0 -0
  96. package/package.json +5 -2
@@ -0,0 +1,461 @@
1
+ // src/compiler/content.ts
2
+ // Content pattern matching for Phase 2 content-aware enforcement
3
+ //
4
+ // DESIGN PRINCIPLES:
5
+ // 1. Builtins are comprehensive pattern SETS, not single regex
6
+ // 2. Each pattern has exceptions to prevent false positives
7
+ // 3. 'strict' mode strips comments/strings before matching
8
+ // 4. LLM generates per-user rules for custom restrictions
9
+ import micromatch from 'micromatch';
10
+ const { isMatch } = micromatch;
11
+ /**
12
+ * Strip single-line and multi-line comments from code.
13
+ * Preserves line numbers by replacing with spaces.
14
+ */
15
+ export function stripComments(content) {
16
+ // State machine to handle strings and comments
17
+ let result = '';
18
+ let i = 0;
19
+ let inString = null;
20
+ let inTemplate = false;
21
+ let templateDepth = 0;
22
+ while (i < content.length) {
23
+ const char = content[i];
24
+ const next = content[i + 1];
25
+ const prev = i > 0 ? content[i - 1] : '';
26
+ // Handle escape sequences in strings
27
+ if (inString && char === '\\') {
28
+ result += char + (next || '');
29
+ i += 2;
30
+ continue;
31
+ }
32
+ // Handle string boundaries
33
+ if (!inString && !inTemplate && (char === '"' || char === "'" || char === '`')) {
34
+ if (char === '`') {
35
+ inTemplate = true;
36
+ templateDepth = 1;
37
+ }
38
+ else {
39
+ inString = char;
40
+ }
41
+ result += char;
42
+ i++;
43
+ continue;
44
+ }
45
+ if (inString && char === inString) {
46
+ inString = null;
47
+ result += char;
48
+ i++;
49
+ continue;
50
+ }
51
+ // Handle template literal nesting
52
+ if (inTemplate) {
53
+ if (char === '`' && prev !== '\\') {
54
+ templateDepth--;
55
+ if (templateDepth === 0) {
56
+ inTemplate = false;
57
+ }
58
+ }
59
+ else if (char === '$' && next === '{') {
60
+ // Entering expression, but still in template
61
+ }
62
+ result += char;
63
+ i++;
64
+ continue;
65
+ }
66
+ // Skip if inside a string
67
+ if (inString) {
68
+ result += char;
69
+ i++;
70
+ continue;
71
+ }
72
+ // Handle single-line comments
73
+ if (char === '/' && next === '/') {
74
+ // Replace comment with spaces until newline
75
+ while (i < content.length && content[i] !== '\n') {
76
+ result += ' ';
77
+ i++;
78
+ }
79
+ continue;
80
+ }
81
+ // Handle multi-line comments
82
+ if (char === '/' && next === '*') {
83
+ result += ' '; // Replace /*
84
+ i += 2;
85
+ while (i < content.length) {
86
+ if (content[i] === '*' && content[i + 1] === '/') {
87
+ result += ' '; // Replace */
88
+ i += 2;
89
+ break;
90
+ }
91
+ // Preserve newlines for line number accuracy
92
+ result += content[i] === '\n' ? '\n' : ' ';
93
+ i++;
94
+ }
95
+ continue;
96
+ }
97
+ result += char;
98
+ i++;
99
+ }
100
+ return result;
101
+ }
102
+ /**
103
+ * Strip string literals from code, replacing with placeholder.
104
+ * Preserves line numbers.
105
+ */
106
+ export function stripStrings(content) {
107
+ let result = '';
108
+ let i = 0;
109
+ let inString = null;
110
+ while (i < content.length) {
111
+ const char = content[i];
112
+ const next = content[i + 1];
113
+ // Handle escape sequences
114
+ if (inString && char === '\\') {
115
+ result += ' '; // Replace escaped char
116
+ i += 2;
117
+ continue;
118
+ }
119
+ // String boundaries
120
+ if (!inString && (char === '"' || char === "'" || char === '`')) {
121
+ inString = char;
122
+ result += char;
123
+ i++;
124
+ continue;
125
+ }
126
+ if (inString && char === inString) {
127
+ inString = null;
128
+ result += char;
129
+ i++;
130
+ continue;
131
+ }
132
+ // Inside string - replace with space but preserve newlines
133
+ if (inString) {
134
+ result += char === '\n' ? '\n' : ' ';
135
+ i++;
136
+ continue;
137
+ }
138
+ result += char;
139
+ i++;
140
+ }
141
+ return result;
142
+ }
143
+ /**
144
+ * Check if a file path matches any of the file type patterns.
145
+ */
146
+ export function fileMatchesPatterns(filePath, patterns) {
147
+ if (!patterns || patterns.length === 0) {
148
+ return true;
149
+ }
150
+ const normalized = filePath.replace(/\\/g, '/');
151
+ const basename = normalized.split('/').pop() || normalized;
152
+ for (const pattern of patterns) {
153
+ if (pattern.startsWith('*.') && !pattern.includes('/')) {
154
+ if (basename.endsWith(pattern.slice(1))) {
155
+ return true;
156
+ }
157
+ continue;
158
+ }
159
+ if (isMatch(normalized, pattern, { nocase: true }) ||
160
+ isMatch(basename, pattern, { nocase: true })) {
161
+ return true;
162
+ }
163
+ }
164
+ return false;
165
+ }
166
+ /**
167
+ * Check if match is an exception (false positive).
168
+ */
169
+ function isException(content, matchIndex, matchText, exceptions) {
170
+ if (!exceptions || exceptions.length === 0) {
171
+ return false;
172
+ }
173
+ // Get context around match (100 chars before and after)
174
+ const start = Math.max(0, matchIndex - 100);
175
+ const end = Math.min(content.length, matchIndex + matchText.length + 100);
176
+ const context = content.slice(start, end);
177
+ for (const exception of exceptions) {
178
+ try {
179
+ const exceptionRegex = new RegExp(exception);
180
+ if (exceptionRegex.test(context)) {
181
+ return true;
182
+ }
183
+ }
184
+ catch {
185
+ // Invalid regex, skip
186
+ }
187
+ }
188
+ return false;
189
+ }
190
+ /**
191
+ * Check content against a single content rule.
192
+ */
193
+ export function checkContentRule(content, filePath, rule) {
194
+ if (!fileMatchesPatterns(filePath, rule.fileTypes)) {
195
+ return null;
196
+ }
197
+ // Apply mode-specific preprocessing
198
+ let processedContent = content;
199
+ const mode = rule.mode || 'fast';
200
+ if (mode === 'strict') {
201
+ processedContent = stripComments(content);
202
+ processedContent = stripStrings(processedContent);
203
+ }
204
+ let regex;
205
+ try {
206
+ regex = new RegExp(rule.pattern, 'gm');
207
+ }
208
+ catch {
209
+ return null;
210
+ }
211
+ let match;
212
+ while ((match = regex.exec(processedContent)) !== null) {
213
+ // Check exceptions
214
+ if (isException(content, match.index, match[0], rule.exceptions || [])) {
215
+ continue;
216
+ }
217
+ // Find line and column using original content positions
218
+ const beforeMatch = content.slice(0, match.index);
219
+ const lines = beforeMatch.split('\n');
220
+ const line = lines.length;
221
+ const column = (lines[lines.length - 1]?.length ?? 0) + 1;
222
+ return {
223
+ file: filePath,
224
+ line,
225
+ column,
226
+ match: match[0],
227
+ rule,
228
+ };
229
+ }
230
+ return null;
231
+ }
232
+ /**
233
+ * Check content against all content rules in a policy.
234
+ */
235
+ export function checkContent(content, filePath, policy) {
236
+ if (!policy.contentRules || policy.contentRules.length === 0) {
237
+ return { blocked: false };
238
+ }
239
+ for (const rule of policy.contentRules) {
240
+ const match = checkContentRule(content, filePath, rule);
241
+ if (match) {
242
+ return {
243
+ blocked: true,
244
+ rule,
245
+ line: match.line,
246
+ match: match.match,
247
+ };
248
+ }
249
+ }
250
+ return { blocked: false };
251
+ }
252
+ /**
253
+ * Check content against multiple policies.
254
+ */
255
+ export function checkContentAgainstPolicies(content, filePath, policies) {
256
+ for (const policy of policies) {
257
+ const result = checkContent(content, filePath, policy);
258
+ if (result.blocked) {
259
+ return { ...result, policy };
260
+ }
261
+ }
262
+ return { blocked: false };
263
+ }
264
+ /**
265
+ * Get all matches for a rule in content.
266
+ */
267
+ export function findAllMatches(content, filePath, rule) {
268
+ if (!fileMatchesPatterns(filePath, rule.fileTypes)) {
269
+ return [];
270
+ }
271
+ let processedContent = content;
272
+ if (rule.mode === 'strict') {
273
+ processedContent = stripComments(content);
274
+ processedContent = stripStrings(processedContent);
275
+ }
276
+ let regex;
277
+ try {
278
+ regex = new RegExp(rule.pattern, 'gm');
279
+ }
280
+ catch {
281
+ return [];
282
+ }
283
+ const matches = [];
284
+ let match;
285
+ while ((match = regex.exec(processedContent)) !== null) {
286
+ if (isException(content, match.index, match[0], rule.exceptions || [])) {
287
+ continue;
288
+ }
289
+ const beforeMatch = content.slice(0, match.index);
290
+ const lines = beforeMatch.split('\n');
291
+ const line = lines.length;
292
+ const column = (lines[lines.length - 1]?.length ?? 0) + 1;
293
+ matches.push({
294
+ file: filePath,
295
+ line,
296
+ column,
297
+ match: match[0],
298
+ rule,
299
+ });
300
+ }
301
+ return matches;
302
+ }
303
+ // ═══════════════════════════════════════════════════════════════════════════
304
+ // COMPREHENSIVE PATTERN SETS
305
+ // Each restriction type has MULTIPLE patterns to catch all variants
306
+ // ═══════════════════════════════════════════════════════════════════════════
307
+ /**
308
+ * Pattern set for detecting lodash usage.
309
+ * Covers: ES imports, CommonJS, dynamic imports, submodules, individual packages
310
+ */
311
+ export const LODASH_PATTERNS = {
312
+ // ES6 imports
313
+ esDefault: String.raw `import\s+\w+\s+from\s+['"]lodash['"]`,
314
+ esNamed: String.raw `import\s+\{[^}]+\}\s+from\s+['"]lodash['"]`,
315
+ esNamespace: String.raw `import\s+\*\s+as\s+\w+\s+from\s+['"]lodash['"]`,
316
+ esSubmodule: String.raw `import\s+\w+\s+from\s+['"]lodash\/[^'"]+['"]`,
317
+ // Individual lodash packages (lodash.map, lodash.filter, etc.)
318
+ esIndividual: String.raw `import\s+\w+\s+from\s+['"]lodash\.[a-z]+['"]`,
319
+ // lodash-es variant
320
+ esLodashEs: String.raw `import\s+.*\s+from\s+['"]lodash-es['"]`,
321
+ // CommonJS
322
+ cjsRequire: String.raw `require\s*\(\s*['"]lodash['"]\s*\)`,
323
+ cjsSubmodule: String.raw `require\s*\(\s*['"]lodash\/[^'"]+['"]\s*\)`,
324
+ cjsIndividual: String.raw `require\s*\(\s*['"]lodash\.[a-z]+['"]\s*\)`,
325
+ // Dynamic import
326
+ dynamicImport: String.raw `import\s*\(\s*['"]lodash`,
327
+ // Combined pattern (use this for simple matching)
328
+ any: String.raw `(?:import|require)\s*(?:\(|\s).*['"]lodash(?:[-./][^'"]*)?['"]`,
329
+ };
330
+ /**
331
+ * Pattern set for detecting TypeScript 'any' type usage.
332
+ * Covers: annotations, generics, assertions, type aliases, defaults
333
+ */
334
+ export const ANY_TYPE_PATTERNS = {
335
+ // Type annotations
336
+ annotation: String.raw `:\s*any\s*(?:[,;)\]=]|$)`,
337
+ annotationArray: String.raw `:\s*any\s*\[\s*\]`,
338
+ // Generic parameters
339
+ genericParam: String.raw `<\s*any\s*>`,
340
+ genericInArray: String.raw `Array\s*<\s*any\s*>`,
341
+ genericInRecord: String.raw `Record\s*<[^>]*,\s*any\s*>`,
342
+ genericInPromise: String.raw `Promise\s*<\s*any\s*>`,
343
+ genericInMap: String.raw `Map\s*<[^>]*,?\s*any\s*>`,
344
+ genericInSet: String.raw `Set\s*<\s*any\s*>`,
345
+ // Type assertions
346
+ asAny: String.raw `as\s+any\s*(?:[,;)\]]|$)`,
347
+ asUnknownAsAny: String.raw `as\s+unknown\s+as\s+any`,
348
+ // Type definitions
349
+ typeAlias: String.raw `type\s+\w+\s*=\s*any\s*;`,
350
+ typeAliasPartial: String.raw `type\s+\w+\s*=\s*[^;]*\|\s*any`,
351
+ // Generic defaults
352
+ genericDefault: String.raw `<[^>]*=\s*any\s*>`,
353
+ // Function return types
354
+ returnAny: String.raw `\)\s*:\s*any\s*(?:\{|=>)`,
355
+ // Extends/implements
356
+ extendsAny: String.raw `extends\s+any\b`,
357
+ // Intersection/union
358
+ intersectionAny: String.raw `&\s*any\b`,
359
+ unionAny: String.raw `\|\s*any\b`,
360
+ // Combined (most common cases)
361
+ common: String.raw `(?::\s*any\s*(?:[,;)\]=]|$)|<\s*any\s*>|as\s+any\b)`,
362
+ };
363
+ /**
364
+ * Pattern set for detecting console usage.
365
+ * Covers: direct calls, destructuring, aliasing, bracket notation
366
+ */
367
+ export const CONSOLE_PATTERNS = {
368
+ // Direct method calls
369
+ log: String.raw `\bconsole\s*\.\s*log\s*\(`,
370
+ warn: String.raw `\bconsole\s*\.\s*warn\s*\(`,
371
+ error: String.raw `\bconsole\s*\.\s*error\s*\(`,
372
+ info: String.raw `\bconsole\s*\.\s*info\s*\(`,
373
+ debug: String.raw `\bconsole\s*\.\s*debug\s*\(`,
374
+ trace: String.raw `\bconsole\s*\.\s*trace\s*\(`,
375
+ table: String.raw `\bconsole\s*\.\s*table\s*\(`,
376
+ dir: String.raw `\bconsole\s*\.\s*dir\s*\(`,
377
+ // Bracket notation
378
+ bracket: String.raw `\bconsole\s*\[\s*['"](?:log|warn|error|info|debug)['"]\s*\]`,
379
+ // Destructuring (const { log } = console)
380
+ destructure: String.raw `\{\s*(?:log|warn|error|info|debug)(?:\s*:\s*\w+)?\s*\}\s*=\s*console`,
381
+ // Aliasing (const l = console.log)
382
+ alias: String.raw `=\s*console\s*\.\s*(?:log|warn|error|info|debug)\s*[,;]`,
383
+ // Combined common patterns
384
+ anyMethod: String.raw `\bconsole\s*[.\[]\s*['"]?(?:log|warn|error|info|debug|trace|table|dir)`,
385
+ };
386
+ /**
387
+ * Pattern set for detecting React class components.
388
+ * Covers: Component, PureComponent, with/without React prefix
389
+ */
390
+ export const CLASS_COMPONENT_PATTERNS = {
391
+ component: String.raw `class\s+\w+\s+extends\s+(?:React\s*\.\s*)?Component\s*(?:<|{)`,
392
+ pureComponent: String.raw `class\s+\w+\s+extends\s+(?:React\s*\.\s*)?PureComponent\s*(?:<|{)`,
393
+ // Combined
394
+ any: String.raw `class\s+\w+\s+extends\s+(?:React\s*\.\s*)?(?:Pure)?Component\s*(?:<|{)`,
395
+ };
396
+ /**
397
+ * Pattern set for detecting eval usage.
398
+ * Covers: direct eval, Function constructor, setTimeout/setInterval with strings
399
+ */
400
+ export const EVAL_PATTERNS = {
401
+ direct: String.raw `\beval\s*\(`,
402
+ functionConstructor: String.raw `new\s+Function\s*\(`,
403
+ setTimeoutString: String.raw `setTimeout\s*\(\s*['"]`,
404
+ setIntervalString: String.raw `setInterval\s*\(\s*['"]`,
405
+ // Combined
406
+ any: String.raw `(?:\beval\s*\(|new\s+Function\s*\()`,
407
+ };
408
+ /**
409
+ * Pattern set for moment.js detection.
410
+ */
411
+ export const MOMENT_PATTERNS = {
412
+ esImport: String.raw `import\s+.*\s+from\s+['"]moment['"]`,
413
+ cjsRequire: String.raw `require\s*\(\s*['"]moment['"]\s*\)`,
414
+ dynamicImport: String.raw `import\s*\(\s*['"]moment['"]`,
415
+ any: String.raw `(?:import|require)\s*(?:\(|\s).*['"]moment['"]`,
416
+ };
417
+ // ═══════════════════════════════════════════════════════════════════════════
418
+ // LEGACY EXPORTS (for backwards compatibility)
419
+ // ═══════════════════════════════════════════════════════════════════════════
420
+ export const COMMON_PATTERNS = {
421
+ // Import patterns - USE LODASH_PATTERNS.any for comprehensive matching
422
+ lodashImport: LODASH_PATTERNS.esDefault,
423
+ lodashRequire: LODASH_PATTERNS.cjsRequire,
424
+ anyLodash: LODASH_PATTERNS.any,
425
+ // Console patterns - USE CONSOLE_PATTERNS.anyMethod for comprehensive matching
426
+ consoleLog: CONSOLE_PATTERNS.log,
427
+ consoleWarn: CONSOLE_PATTERNS.warn,
428
+ consoleError: CONSOLE_PATTERNS.error,
429
+ anyConsole: CONSOLE_PATTERNS.anyMethod,
430
+ // React patterns
431
+ classComponent: CLASS_COMPONENT_PATTERNS.any,
432
+ reactClass: CLASS_COMPONENT_PATTERNS.any,
433
+ // TypeScript patterns - USE ANY_TYPE_PATTERNS.common for comprehensive matching
434
+ anyType: ANY_TYPE_PATTERNS.annotation,
435
+ anyTypeGeneric: ANY_TYPE_PATTERNS.genericParam,
436
+ asAny: ANY_TYPE_PATTERNS.asAny,
437
+ // Deprecated patterns
438
+ momentImport: MOMENT_PATTERNS.any,
439
+ jqueryImport: String.raw `(?:import|require)\s*(?:\(|\s).*['"]jquery['"]`,
440
+ underscoreImport: String.raw `(?:import|require)\s*(?:\(|\s).*['"]underscore['"]`,
441
+ // Security patterns
442
+ eval: EVAL_PATTERNS.any,
443
+ innerHtml: String.raw `\.innerHTML\s*=`,
444
+ dangerouslySetInnerHTML: String.raw `dangerouslySetInnerHTML`,
445
+ // Code quality
446
+ todoComment: String.raw `//\s*TODO:?`,
447
+ fixmeComment: String.raw `//\s*FIXME:?`,
448
+ debugger: String.raw `\bdebugger\b`,
449
+ };
450
+ // ═══════════════════════════════════════════════════════════════════════════
451
+ // EXCEPTION PATTERNS (to prevent false positives)
452
+ // ═══════════════════════════════════════════════════════════════════════════
453
+ export const EXCEPTION_PATTERNS = {
454
+ // Don't flag 'any' in variable names like 'anyValue', 'company', 'many'
455
+ anyInVariableName: String.raw `(?:const|let|var|function)\s+\w*any\w*`,
456
+ // Don't flag console in test files (handled by fileTypes, but backup)
457
+ consoleInTest: String.raw `(?:describe|it|test|expect)\s*\(`,
458
+ // Don't flag lodash in comments about migration
459
+ lodashMigration: String.raw `(?:migrat|replac|remov|deprecat).*lodash`,
460
+ };
461
+ //# sourceMappingURL=content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/compiler/content.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,iEAAiE;AACjE,EAAE;AACF,qBAAqB;AACrB,+DAA+D;AAC/D,4DAA4D;AAC5D,2DAA2D;AAC3D,0DAA0D;AAE1D,OAAO,UAAU,MAAM,YAAY,CAAC;AAGpC,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC;AAa/B;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,+CAA+C;IAC/C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEzC,qCAAqC;QACrC,IAAI,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAC9B,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,2BAA2B;QAC3B,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC/E,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,UAAU,GAAG,IAAI,CAAC;gBAClB,aAAa,GAAG,CAAC,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;YACD,MAAM,IAAI,IAAI,CAAC;YACf,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClC,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,IAAI,IAAI,CAAC;YACf,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,kCAAkC;QAClC,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClC,aAAa,EAAE,CAAC;gBAChB,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;oBACxB,UAAU,GAAG,KAAK,CAAC;gBACrB,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACxC,6CAA6C;YAC/C,CAAC;YACD,MAAM,IAAI,IAAI,CAAC;YACf,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,0BAA0B;QAC1B,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,IAAI,CAAC;YACf,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,8BAA8B;QAC9B,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjC,4CAA4C;YAC5C,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,GAAG,CAAC;gBACd,CAAC,EAAE,CAAC;YACN,CAAC;YACD,SAAS;QACX,CAAC;QAED,6BAA6B;QAC7B,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjC,MAAM,IAAI,IAAI,CAAC,CAAC,aAAa;YAC7B,CAAC,IAAI,CAAC,CAAC;YACP,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC1B,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBACjD,MAAM,IAAI,IAAI,CAAC,CAAC,aAAa;oBAC7B,CAAC,IAAI,CAAC,CAAC;oBACP,MAAM;gBACR,CAAC;gBACD,6CAA6C;gBAC7C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC3C,CAAC,EAAE,CAAC;YACN,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,IAAI,IAAI,CAAC;QACf,CAAC,EAAE,CAAC;IACN,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,QAAQ,GAAkB,IAAI,CAAC;IAEnC,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE5B,0BAA0B;QAC1B,IAAI,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,IAAI,CAAC,CAAC,uBAAuB;YACvC,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAChE,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,IAAI,IAAI,CAAC;YACf,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClC,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,IAAI,IAAI,CAAC;YACf,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,2DAA2D;QAC3D,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YACrC,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,MAAM,IAAI,IAAI,CAAC;QACf,CAAC,EAAE,CAAC;IACN,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAgB,EAChB,QAAkB;IAElB,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,UAAU,CAAC;IAE3D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAC9C,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAClB,OAAe,EACf,UAAkB,EAClB,SAAiB,EACjB,UAAoB;IAEpB,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,wDAAwD;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,GAAG,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAE1C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7C,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,QAAgB,EAChB,IAAiB;IAEjB,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oCAAoC;IACpC,IAAI,gBAAgB,GAAG,OAAO,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC;IAEjC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,gBAAgB,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1C,gBAAgB,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACvD,mBAAmB;QACnB,IAAI,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;YACvE,SAAS;QACX,CAAC;QAED,wDAAwD;QACxD,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;QAC1B,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAE1D,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,IAAI;YACJ,MAAM;YACN,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YACf,IAAI;SACL,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,QAAgB,EAChB,MAAc;IAEd,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,KAAK,EAAE,CAAC;YACV,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI;gBACJ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAAe,EACf,QAAgB,EAChB,QAAkB;IAElB,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,QAAgB,EAChB,IAAiB;IAEjB,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACnD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,gBAAgB,GAAG,OAAO,CAAC;IAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,gBAAgB,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1C,gBAAgB,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACvD,IAAI,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;YACvE,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;QAC1B,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAE1D,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,QAAQ;YACd,IAAI;YACJ,MAAM;YACN,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YACf,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,6BAA6B;AAC7B,oEAAoE;AACpE,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,cAAc;IACd,SAAS,EAAE,MAAM,CAAC,GAAG,CAAA,sCAAsC;IAC3D,OAAO,EAAE,MAAM,CAAC,GAAG,CAAA,4CAA4C;IAC/D,WAAW,EAAE,MAAM,CAAC,GAAG,CAAA,gDAAgD;IACvE,WAAW,EAAE,MAAM,CAAC,GAAG,CAAA,8CAA8C;IACrE,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC,GAAG,CAAA,8CAA8C;IACtE,oBAAoB;IACpB,UAAU,EAAE,MAAM,CAAC,GAAG,CAAA,wCAAwC;IAC9D,WAAW;IACX,UAAU,EAAE,MAAM,CAAC,GAAG,CAAA,oCAAoC;IAC1D,YAAY,EAAE,MAAM,CAAC,GAAG,CAAA,4CAA4C;IACpE,aAAa,EAAE,MAAM,CAAC,GAAG,CAAA,4CAA4C;IACrE,iBAAiB;IACjB,aAAa,EAAE,MAAM,CAAC,GAAG,CAAA,0BAA0B;IACnD,kDAAkD;IAClD,GAAG,EAAE,MAAM,CAAC,GAAG,CAAA,gEAAgE;CAChF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,mBAAmB;IACnB,UAAU,EAAE,MAAM,CAAC,GAAG,CAAA,0BAA0B;IAChD,eAAe,EAAE,MAAM,CAAC,GAAG,CAAA,mBAAmB;IAC9C,qBAAqB;IACrB,YAAY,EAAE,MAAM,CAAC,GAAG,CAAA,aAAa;IACrC,cAAc,EAAE,MAAM,CAAC,GAAG,CAAA,qBAAqB;IAC/C,eAAe,EAAE,MAAM,CAAC,GAAG,CAAA,4BAA4B;IACvD,gBAAgB,EAAE,MAAM,CAAC,GAAG,CAAA,uBAAuB;IACnD,YAAY,EAAE,MAAM,CAAC,GAAG,CAAA,0BAA0B;IAClD,YAAY,EAAE,MAAM,CAAC,GAAG,CAAA,mBAAmB;IAC3C,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC,GAAG,CAAA,0BAA0B;IAC3C,cAAc,EAAE,MAAM,CAAC,GAAG,CAAA,yBAAyB;IACnD,mBAAmB;IACnB,SAAS,EAAE,MAAM,CAAC,GAAG,CAAA,0BAA0B;IAC/C,gBAAgB,EAAE,MAAM,CAAC,GAAG,CAAA,gCAAgC;IAC5D,mBAAmB;IACnB,cAAc,EAAE,MAAM,CAAC,GAAG,CAAA,mBAAmB;IAC7C,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC,GAAG,CAAA,0BAA0B;IAC/C,qBAAqB;IACrB,UAAU,EAAE,MAAM,CAAC,GAAG,CAAA,iBAAiB;IACvC,qBAAqB;IACrB,eAAe,EAAE,MAAM,CAAC,GAAG,CAAA,WAAW;IACtC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAA,YAAY;IAChC,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAA,qDAAqD;CACxE,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,sBAAsB;IACtB,GAAG,EAAE,MAAM,CAAC,GAAG,CAAA,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAC,GAAG,CAAA,4BAA4B;IAC5C,KAAK,EAAE,MAAM,CAAC,GAAG,CAAA,6BAA6B;IAC9C,IAAI,EAAE,MAAM,CAAC,GAAG,CAAA,4BAA4B;IAC5C,KAAK,EAAE,MAAM,CAAC,GAAG,CAAA,6BAA6B;IAC9C,KAAK,EAAE,MAAM,CAAC,GAAG,CAAA,6BAA6B;IAC9C,KAAK,EAAE,MAAM,CAAC,GAAG,CAAA,6BAA6B;IAC9C,GAAG,EAAE,MAAM,CAAC,GAAG,CAAA,2BAA2B;IAC1C,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC,GAAG,CAAA,6DAA6D;IAChF,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC,GAAG,CAAA,sEAAsE;IAC7F,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAA,yDAAyD;IAC1E,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC,GAAG,CAAA,wEAAwE;CAC9F,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAA,+DAA+D;IACpF,aAAa,EAAE,MAAM,CAAC,GAAG,CAAA,mEAAmE;IAC5F,WAAW;IACX,GAAG,EAAE,MAAM,CAAC,GAAG,CAAA,wEAAwE;CACxF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAA,aAAa;IAC/B,mBAAmB,EAAE,MAAM,CAAC,GAAG,CAAA,qBAAqB;IACpD,gBAAgB,EAAE,MAAM,CAAC,GAAG,CAAA,wBAAwB;IACpD,iBAAiB,EAAE,MAAM,CAAC,GAAG,CAAA,yBAAyB;IACtD,WAAW;IACX,GAAG,EAAE,MAAM,CAAC,GAAG,CAAA,qCAAqC;CACrD,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAA,qCAAqC;IACzD,UAAU,EAAE,MAAM,CAAC,GAAG,CAAA,oCAAoC;IAC1D,aAAa,EAAE,MAAM,CAAC,GAAG,CAAA,8BAA8B;IACvD,GAAG,EAAE,MAAM,CAAC,GAAG,CAAA,gDAAgD;CAChE,CAAC;AAEF,8EAA8E;AAC9E,+CAA+C;AAC/C,8EAA8E;AAE9E,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,uEAAuE;IACvE,YAAY,EAAE,eAAe,CAAC,SAAS;IACvC,aAAa,EAAE,eAAe,CAAC,UAAU;IACzC,SAAS,EAAE,eAAe,CAAC,GAAG;IAE9B,+EAA+E;IAC/E,UAAU,EAAE,gBAAgB,CAAC,GAAG;IAChC,WAAW,EAAE,gBAAgB,CAAC,IAAI;IAClC,YAAY,EAAE,gBAAgB,CAAC,KAAK;IACpC,UAAU,EAAE,gBAAgB,CAAC,SAAS;IAEtC,iBAAiB;IACjB,cAAc,EAAE,wBAAwB,CAAC,GAAG;IAC5C,UAAU,EAAE,wBAAwB,CAAC,GAAG;IAExC,gFAAgF;IAChF,OAAO,EAAE,iBAAiB,CAAC,UAAU;IACrC,cAAc,EAAE,iBAAiB,CAAC,YAAY;IAC9C,KAAK,EAAE,iBAAiB,CAAC,KAAK;IAE9B,sBAAsB;IACtB,YAAY,EAAE,eAAe,CAAC,GAAG;IACjC,YAAY,EAAE,MAAM,CAAC,GAAG,CAAA,gDAAgD;IACxE,gBAAgB,EAAE,MAAM,CAAC,GAAG,CAAA,oDAAoD;IAEhF,oBAAoB;IACpB,IAAI,EAAE,aAAa,CAAC,GAAG;IACvB,SAAS,EAAE,MAAM,CAAC,GAAG,CAAA,iBAAiB;IACtC,uBAAuB,EAAE,MAAM,CAAC,GAAG,CAAA,yBAAyB;IAE5D,eAAe;IACf,WAAW,EAAE,MAAM,CAAC,GAAG,CAAA,aAAa;IACpC,YAAY,EAAE,MAAM,CAAC,GAAG,CAAA,cAAc;IACtC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAA,cAAc;CAC1B,CAAC;AAEX,8EAA8E;AAC9E,kDAAkD;AAClD,8EAA8E;AAE9E,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,wEAAwE;IACxE,iBAAiB,EAAE,MAAM,CAAC,GAAG,CAAA,wCAAwC;IACrE,sEAAsE;IACtE,aAAa,EAAE,MAAM,CAAC,GAAG,CAAA,kCAAkC;IAC3D,gDAAgD;IAChD,eAAe,EAAE,MAAM,CAAC,GAAG,CAAA,0CAA0C;CACtE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/compiler/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAK1C,wBAAsB,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmDlE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/compiler/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAsB1C,wBAAsB,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiElE"}
@@ -2,10 +2,27 @@
2
2
  import { findBuiltin } from './builtins.js';
3
3
  import { getFromCache, saveToCache } from './cache.js';
4
4
  import { compileWithLLM } from './llm.js';
5
+ /**
6
+ * Detect if the restriction is about command/tool preferences
7
+ * rather than file protection
8
+ */
9
+ function isCommandPreference(phrase) {
10
+ const commandKeywords = [
11
+ /\b(prefer|use)\s+(pnpm|bun|yarn|npm)\b/,
12
+ /\b(pnpm|bun|yarn)\s+(over|not|instead)/,
13
+ /\bno\s+(sudo|force.?push|hard.?reset)\b/,
14
+ /\b(vitest|jest|pytest)\s+(over|not|instead)/,
15
+ /\buse\s+(vitest|pytest|docker.?compose)\b/,
16
+ /\bno\s+curl\b/,
17
+ ];
18
+ return commandKeywords.some(pattern => pattern.test(phrase));
19
+ }
5
20
  export async function compile(restriction) {
6
21
  const normalized = restriction.toLowerCase().trim();
22
+ // Check if this is a command preference (not file-based)
23
+ const isCommand = isCommandPreference(normalized);
7
24
  // Extract action from input
8
- let action = 'modify';
25
+ let action = isCommand ? 'execute' : 'modify';
9
26
  let targetPhrase = normalized;
10
27
  const actionPatterns = [
11
28
  [/^(don'?t\s+)?(delete|remove|rm)\s+/, 'delete'],
@@ -13,9 +30,11 @@ export async function compile(restriction) {
13
30
  [/^(don'?t\s+)?(run|execute|running|executing)\s+/, 'execute'],
14
31
  [/^(don'?t\s+)?(read|view|access)\s+/, 'read'],
15
32
  [/^(protect|preserve|keep|save)\s+/, 'modify'],
33
+ // Tool preferences default to execute
34
+ [/^(prefer|use)\s+/, 'execute'],
16
35
  // "no running X" → execute, "no X" (files) → modify
17
36
  [/^no\s+(running|executing)\s+/, 'execute'],
18
- [/^no\s+/, 'modify'], // Default "no X" to modify (protects files)
37
+ [/^no\s+/, isCommand ? 'execute' : 'modify'],
19
38
  ];
20
39
  for (const [pattern, act] of actionPatterns) {
21
40
  if (pattern.test(normalized)) {
@@ -24,16 +43,24 @@ export async function compile(restriction) {
24
43
  break;
25
44
  }
26
45
  }
27
- // Strip filler words
28
- targetPhrase = targetPhrase
29
- .replace(/^(any|all|the)\s+/g, '')
30
- .replace(/\s+(files?|directories?|folders?)$/g, '')
31
- .trim();
46
+ // Strip filler words (but preserve tool names)
47
+ if (!isCommand) {
48
+ targetPhrase = targetPhrase
49
+ .replace(/^(any|all|the)\s+/g, '')
50
+ .replace(/\s+(files?|directories?|folders?)$/g, '')
51
+ .trim();
52
+ }
32
53
  // Layer 1: Builtins (instant)
33
54
  const builtin = findBuiltin(targetPhrase);
34
55
  if (builtin) {
56
+ // Preserve commandRules from builtin
35
57
  return { action, ...builtin };
36
58
  }
59
+ // Also try the original restriction for builtins
60
+ const builtinOriginal = findBuiltin(normalized);
61
+ if (builtinOriginal) {
62
+ return { action, ...builtinOriginal };
63
+ }
37
64
  // Layer 2: Cache (instant)
38
65
  const cached = getFromCache(normalized);
39
66
  if (cached) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/compiler/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AAGxB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,WAAmB;IAC/C,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAEpD,4BAA4B;IAC5B,IAAI,MAAM,GAAqB,QAAQ,CAAC;IACxC,IAAI,YAAY,GAAG,UAAU,CAAC;IAE9B,MAAM,cAAc,GAAsC;QACxD,CAAC,oCAAoC,EAAE,QAAQ,CAAC;QAChD,CAAC,yDAAyD,EAAE,QAAQ,CAAC;QACrE,CAAC,iDAAiD,EAAE,SAAS,CAAC;QAC9D,CAAC,oCAAoC,EAAE,MAAM,CAAC;QAC9C,CAAC,kCAAkC,EAAE,QAAQ,CAAC;QAC9C,oDAAoD;QACpD,CAAC,8BAA8B,EAAE,SAAS,CAAC;QAC3C,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,4CAA4C;KACnE,CAAC;IAEF,KAAK,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC;QAC5C,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,CAAC;YACb,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACtD,MAAM;QACR,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,YAAY,GAAG,YAAY;SACxB,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC;SACjC,OAAO,CAAC,qCAAqC,EAAE,EAAE,CAAC;SAClD,IAAI,EAAE,CAAC;IAEV,8BAA8B;IAC9B,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAC1C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;IAChC,CAAC;IAED,2BAA2B;IAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACxC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,oCAAoC;IACpC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAEzD,8BAA8B;IAC9B,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAEhC,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/compiler/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/compiler/llm.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AA0C1C,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,GAChC,OAAO,CAAC,MAAM,CAAC,CAkCjB"}
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/compiler/llm.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAiI1C,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,GAChC,OAAO,CAAC,MAAM,CAAC,CAkCjB"}