veto-leash 0.1.3 → 1.0.1
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/README.md +111 -196
- package/dist/ast/builtins.d.ts +28 -0
- package/dist/ast/builtins.d.ts.map +1 -0
- package/dist/ast/builtins.js +361 -0
- package/dist/ast/builtins.js.map +1 -0
- package/dist/ast/checker.d.ts +17 -0
- package/dist/ast/checker.d.ts.map +1 -0
- package/dist/ast/checker.js +97 -0
- package/dist/ast/checker.js.map +1 -0
- package/dist/ast/index.d.ts +5 -0
- package/dist/ast/index.d.ts.map +1 -0
- package/dist/ast/index.js +7 -0
- package/dist/ast/index.js.map +1 -0
- package/dist/ast/parser.d.ts +55 -0
- package/dist/ast/parser.d.ts.map +1 -0
- package/dist/ast/parser.js +210 -0
- package/dist/ast/parser.js.map +1 -0
- package/dist/ast/query.d.ts +48 -0
- package/dist/ast/query.d.ts.map +1 -0
- package/dist/ast/query.js +102 -0
- package/dist/ast/query.js.map +1 -0
- package/dist/ast/validate-cli.d.ts +21 -0
- package/dist/ast/validate-cli.d.ts.map +1 -0
- package/dist/ast/validate-cli.js +73 -0
- package/dist/ast/validate-cli.js.map +1 -0
- package/dist/cli.js +105 -21
- package/dist/cli.js.map +1 -1
- package/dist/compiler/builtins.d.ts.map +1 -1
- package/dist/compiler/builtins.js +721 -4
- package/dist/compiler/builtins.js.map +1 -1
- package/dist/compiler/commands.d.ts +40 -0
- package/dist/compiler/commands.d.ts.map +1 -0
- package/dist/compiler/commands.js +311 -0
- package/dist/compiler/commands.js.map +1 -0
- package/dist/compiler/content.d.ts +160 -0
- package/dist/compiler/content.d.ts.map +1 -0
- package/dist/compiler/content.js +461 -0
- package/dist/compiler/content.js.map +1 -0
- package/dist/compiler/index.d.ts.map +1 -1
- package/dist/compiler/index.js +34 -7
- package/dist/compiler/index.js.map +1 -1
- package/dist/compiler/llm.d.ts.map +1 -1
- package/dist/compiler/llm.js +96 -9
- package/dist/compiler/llm.js.map +1 -1
- package/dist/compiler/prompt.d.ts +1 -1
- package/dist/compiler/prompt.d.ts.map +1 -1
- package/dist/compiler/prompt.js +247 -15
- package/dist/compiler/prompt.js.map +1 -1
- package/dist/config/leash-parser.d.ts +29 -0
- package/dist/config/leash-parser.d.ts.map +1 -0
- package/dist/config/leash-parser.js +70 -0
- package/dist/config/leash-parser.js.map +1 -0
- package/dist/config/loader.d.ts +2 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +18 -8
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +8 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +19 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/config/watcher.d.ts +18 -0
- package/dist/config/watcher.d.ts.map +1 -0
- package/dist/config/watcher.js +102 -0
- package/dist/config/watcher.js.map +1 -0
- package/dist/matcher.d.ts +18 -0
- package/dist/matcher.d.ts.map +1 -1
- package/dist/matcher.js +43 -0
- package/dist/matcher.js.map +1 -1
- package/dist/native/claude-code.d.ts.map +1 -1
- package/dist/native/claude-code.js +294 -50
- package/dist/native/claude-code.js.map +1 -1
- package/dist/native/cursor.d.ts +14 -1
- package/dist/native/cursor.d.ts.map +1 -1
- package/dist/native/cursor.js +340 -34
- package/dist/native/cursor.js.map +1 -1
- package/dist/native/index.d.ts +5 -0
- package/dist/native/index.d.ts.map +1 -1
- package/dist/native/index.js +56 -10
- package/dist/native/index.js.map +1 -1
- package/dist/native/opencode.d.ts.map +1 -1
- package/dist/native/opencode.js +15 -3
- package/dist/native/opencode.js.map +1 -1
- package/dist/native/validator.d.ts +15 -0
- package/dist/native/validator.d.ts.map +1 -0
- package/dist/native/validator.js +368 -0
- package/dist/native/validator.js.map +1 -0
- package/dist/types.d.ts +114 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/wrapper/daemon.d.ts.map +1 -1
- package/dist/wrapper/daemon.js +31 -2
- package/dist/wrapper/daemon.js.map +1 -1
- package/languages/tree-sitter-javascript.wasm +0 -0
- package/languages/tree-sitter-tsx.wasm +0 -0
- package/languages/tree-sitter-typescript.wasm +0 -0
- 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":"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"}
|
|
@@ -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;
|
|
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"}
|
package/dist/compiler/index.js
CHANGED
|
@@ -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'],
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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;
|
|
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;
|
|
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"}
|