@avinashchby/aireview 0.1.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.
- package/LICENSE +21 -0
- package/README.md +157 -0
- package/bin/aireview.js +2 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +79 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +78 -0
- package/dist/config.js.map +1 -0
- package/dist/fixer/index.d.ts +4 -0
- package/dist/fixer/index.d.ts.map +1 -0
- package/dist/fixer/index.js +54 -0
- package/dist/fixer/index.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/index.d.ts +8 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +47 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/python-parser.d.ts +4 -0
- package/dist/parsers/python-parser.d.ts.map +1 -0
- package/dist/parsers/python-parser.js +235 -0
- package/dist/parsers/python-parser.js.map +1 -0
- package/dist/parsers/typescript-parser.d.ts +4 -0
- package/dist/parsers/typescript-parser.d.ts.map +1 -0
- package/dist/parsers/typescript-parser.js +300 -0
- package/dist/parsers/typescript-parser.js.map +1 -0
- package/dist/reporters/ci-reporter.d.ts +4 -0
- package/dist/reporters/ci-reporter.d.ts.map +1 -0
- package/dist/reporters/ci-reporter.js +49 -0
- package/dist/reporters/ci-reporter.js.map +1 -0
- package/dist/reporters/index.d.ts +6 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +15 -0
- package/dist/reporters/index.js.map +1 -0
- package/dist/reporters/json-reporter.d.ts +4 -0
- package/dist/reporters/json-reporter.d.ts.map +1 -0
- package/dist/reporters/json-reporter.js +8 -0
- package/dist/reporters/json-reporter.js.map +1 -0
- package/dist/reporters/text-reporter.d.ts +4 -0
- package/dist/reporters/text-reporter.d.ts.map +1 -0
- package/dist/reporters/text-reporter.js +110 -0
- package/dist/reporters/text-reporter.js.map +1 -0
- package/dist/rules/confidence-patterns.d.ts +4 -0
- package/dist/rules/confidence-patterns.d.ts.map +1 -0
- package/dist/rules/confidence-patterns.js +186 -0
- package/dist/rules/confidence-patterns.js.map +1 -0
- package/dist/rules/engine.d.ts +19 -0
- package/dist/rules/engine.d.ts.map +1 -0
- package/dist/rules/engine.js +58 -0
- package/dist/rules/engine.js.map +1 -0
- package/dist/rules/error-handling.d.ts +4 -0
- package/dist/rules/error-handling.d.ts.map +1 -0
- package/dist/rules/error-handling.js +162 -0
- package/dist/rules/error-handling.js.map +1 -0
- package/dist/rules/hallucinated-apis.d.ts +4 -0
- package/dist/rules/hallucinated-apis.d.ts.map +1 -0
- package/dist/rules/hallucinated-apis.js +196 -0
- package/dist/rules/hallucinated-apis.js.map +1 -0
- package/dist/rules/index.d.ts +4 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +27 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/phantom-imports.d.ts +4 -0
- package/dist/rules/phantom-imports.d.ts.map +1 -0
- package/dist/rules/phantom-imports.js +300 -0
- package/dist/rules/phantom-imports.js.map +1 -0
- package/dist/rules/placeholder-code.d.ts +4 -0
- package/dist/rules/placeholder-code.d.ts.map +1 -0
- package/dist/rules/placeholder-code.js +113 -0
- package/dist/rules/placeholder-code.js.map +1 -0
- package/dist/rules/security-antipatterns.d.ts +4 -0
- package/dist/rules/security-antipatterns.d.ts.map +1 -0
- package/dist/rules/security-antipatterns.js +174 -0
- package/dist/rules/security-antipatterns.js.map +1 -0
- package/dist/rules/type-safety.d.ts +4 -0
- package/dist/rules/type-safety.d.ts.map +1 -0
- package/dist/rules/type-safety.js +148 -0
- package/dist/rules/type-safety.js.map +1 -0
- package/dist/scanner/discovery.d.ts +3 -0
- package/dist/scanner/discovery.d.ts.map +1 -0
- package/dist/scanner/discovery.js +76 -0
- package/dist/scanner/discovery.js.map +1 -0
- package/dist/scanner/git-diff.d.ts +8 -0
- package/dist/scanner/git-diff.d.ts.map +1 -0
- package/dist/scanner/git-diff.js +58 -0
- package/dist/scanner/git-diff.js.map +1 -0
- package/dist/scanner/index.d.ts +4 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +110 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/types.d.ts +150 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handling.js","sourceRoot":"","sources":["../../src/rules/error-handling.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hallucinated-apis.d.ts","sourceRoot":"","sources":["../../src/rules/hallucinated-apis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAuC,MAAM,aAAa,CAAC;AAwNxE,kCAAkC;AAClC,eAAO,MAAM,oBAAoB,EAAE,IA0BlC,CAAC"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hallucinatedApisRule = void 0;
|
|
4
|
+
/** JS/TS hallucinated API database. */
|
|
5
|
+
const JS_APIS = [
|
|
6
|
+
{ object: 'fs', method: 'readFileAsync', message: "'fs.readFileAsync' does not exist", fix: "Use 'fs.promises.readFile'", severity: 'error' },
|
|
7
|
+
{ object: 'fs', method: 'writeFileAsync', message: "'fs.writeFileAsync' does not exist", fix: "Use 'fs.promises.writeFile'", severity: 'error' },
|
|
8
|
+
{ object: 'fs', method: 'existsAsync', message: "'fs.existsAsync' does not exist", fix: "Use 'fs.promises.access'", severity: 'error' },
|
|
9
|
+
{ object: '', method: 'flatten', message: "'array.flatten()' does not exist", fix: "Use 'array.flat()' instead", severity: 'error' },
|
|
10
|
+
{ object: '', method: 'contains', message: "'.contains()' is not a standard JS method", fix: "Use '.includes()' instead", severity: 'error' },
|
|
11
|
+
{ object: 'Buffer', method: 'constructor', message: "'new Buffer()' is deprecated and insecure", fix: "Use 'Buffer.from()' or 'Buffer.alloc()'", severity: 'warning' },
|
|
12
|
+
{ object: 'crypto', method: 'createCipher', message: "'crypto.createCipher' is deprecated", fix: "Use 'crypto.createCipheriv' with an IV", severity: 'warning' },
|
|
13
|
+
{ object: 'process.env', method: 'get', message: "'process.env.get()' does not exist", fix: "Access env vars directly: process.env.KEY", severity: 'error' },
|
|
14
|
+
{ object: 'Math', method: 'clamp', message: "'Math.clamp()' does not exist", fix: "Use 'Math.min(Math.max(value, min), max)'", severity: 'error' },
|
|
15
|
+
{ object: 'console', method: 'warning', message: "'console.warning()' does not exist", fix: "Use 'console.warn()'", severity: 'error' },
|
|
16
|
+
{ object: 'Promise', method: 'allResolved', message: "'Promise.allResolved' does not exist", fix: "Use 'Promise.allSettled()'", severity: 'error' },
|
|
17
|
+
{ object: 'document', method: 'query', message: "'document.query()' does not exist", fix: "Use 'document.querySelector()'", severity: 'error' },
|
|
18
|
+
{ object: 'object', method: 'hasKey', message: "'.hasKey()' does not exist in JS", fix: "Use 'Object.hasOwn(obj, key)' or 'obj.hasOwnProperty(key)'", severity: 'error' },
|
|
19
|
+
{ object: 'path', method: 'exists', message: "'path.exists' does not exist", fix: "Use 'fs.existsSync()' or 'fs.promises.access()'", severity: 'error' },
|
|
20
|
+
];
|
|
21
|
+
/** Python hallucinated API database. */
|
|
22
|
+
const PY_APIS = [
|
|
23
|
+
{ object: 'pd', method: 'read_yaml', message: "'pd.read_yaml' does not exist in pandas", fix: "Use 'yaml.safe_load()' with PyYAML, then 'pd.DataFrame()'", severity: 'error' },
|
|
24
|
+
{ object: 'pd.DataFrame', method: 'to_yaml', message: "'DataFrame.to_yaml' is not a built-in method", fix: "Use 'yaml.dump(df.to_dict())'", severity: 'error' },
|
|
25
|
+
{ object: 'os.path', method: 'makedirs', message: "'os.path.makedirs' does not exist", fix: "Use 'os.makedirs()'", severity: 'error' },
|
|
26
|
+
{ object: '', method: 'add', message: "'list.add()' does not exist in Python", fix: "Use 'list.append()' or 'set.add()'", severity: 'error' },
|
|
27
|
+
{ object: 'dict', method: 'has_key', message: "'dict.has_key()' was removed in Python 3", fix: "Use 'key in dict' instead", severity: 'error' },
|
|
28
|
+
{ object: 'requests.get()', method: 'body', message: "'response.body' does not exist in requests", fix: "Use 'response.text' or 'response.content'", severity: 'error' },
|
|
29
|
+
{ object: 'np.array', method: 'shape', message: "'np.array.shape()' — shape is a property, not a method", fix: "Use 'array.shape' without parentheses", severity: 'error' },
|
|
30
|
+
{ object: 'torch.cuda', method: 'memory', message: "'torch.cuda.memory()' does not exist", fix: "Use 'torch.cuda.memory_allocated()'", severity: 'error' },
|
|
31
|
+
];
|
|
32
|
+
/**
|
|
33
|
+
* Build a lookup key from object and method.
|
|
34
|
+
* For entries with empty object, the match is method-only.
|
|
35
|
+
*/
|
|
36
|
+
function buildKey(obj, method) {
|
|
37
|
+
return obj ? `${obj}.${method}` : `.${method}`;
|
|
38
|
+
}
|
|
39
|
+
/** Build lookup maps for fast matching. */
|
|
40
|
+
function buildLookup(entries) {
|
|
41
|
+
const map = new Map();
|
|
42
|
+
for (const entry of entries) {
|
|
43
|
+
map.set(buildKey(entry.object, entry.method), entry);
|
|
44
|
+
}
|
|
45
|
+
return map;
|
|
46
|
+
}
|
|
47
|
+
const jsLookup = buildLookup(JS_APIS);
|
|
48
|
+
const pyLookup = buildLookup(PY_APIS);
|
|
49
|
+
/** Check a function call against an API database. */
|
|
50
|
+
function matchCall(call, lookup) {
|
|
51
|
+
// Try exact match with object
|
|
52
|
+
if (call.object) {
|
|
53
|
+
const exactKey = buildKey(call.object, call.method);
|
|
54
|
+
const exact = lookup.get(exactKey);
|
|
55
|
+
if (exact)
|
|
56
|
+
return exact;
|
|
57
|
+
}
|
|
58
|
+
// Try method-only match (entries with empty object)
|
|
59
|
+
const methodKey = buildKey('', call.method);
|
|
60
|
+
return lookup.get(methodKey) ?? null;
|
|
61
|
+
}
|
|
62
|
+
/** Detect "new Buffer" pattern from function calls. */
|
|
63
|
+
function isNewBuffer(call) {
|
|
64
|
+
return call.object === 'Buffer' && call.method === 'constructor';
|
|
65
|
+
}
|
|
66
|
+
/** Create a finding for a hallucinated API call. */
|
|
67
|
+
function createFinding(call, entry, filePath) {
|
|
68
|
+
const snippet = call.object
|
|
69
|
+
? `${call.object}.${call.method}()`
|
|
70
|
+
: `${call.method}()`;
|
|
71
|
+
return {
|
|
72
|
+
ruleId: 'hallucinated-apis',
|
|
73
|
+
category: 'hallucinated-apis',
|
|
74
|
+
severity: entry.severity,
|
|
75
|
+
message: entry.message,
|
|
76
|
+
filePath,
|
|
77
|
+
line: call.line,
|
|
78
|
+
column: call.column,
|
|
79
|
+
snippet,
|
|
80
|
+
explanation: entry.fix,
|
|
81
|
+
fix: {
|
|
82
|
+
description: entry.fix,
|
|
83
|
+
line: call.line,
|
|
84
|
+
column: call.column,
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Additional line-based checks for patterns hard to catch
|
|
90
|
+
* via parsed function calls alone.
|
|
91
|
+
*/
|
|
92
|
+
function checkLinePatterns(lines, isPython, filePath) {
|
|
93
|
+
const findings = [];
|
|
94
|
+
for (let i = 0; i < lines.length; i++) {
|
|
95
|
+
const line = lines[i];
|
|
96
|
+
const lineNum = i + 1;
|
|
97
|
+
if (!isPython) {
|
|
98
|
+
checkJsLinePattern(line, lineNum, filePath, findings);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
checkPyLinePattern(line, lineNum, filePath, findings);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return findings;
|
|
105
|
+
}
|
|
106
|
+
/** Check JS-specific line patterns. */
|
|
107
|
+
function checkJsLinePattern(line, lineNum, filePath, findings) {
|
|
108
|
+
// new Buffer() pattern
|
|
109
|
+
if (/\bnew\s+Buffer\s*\(/.test(line)) {
|
|
110
|
+
findings.push({
|
|
111
|
+
ruleId: 'hallucinated-apis',
|
|
112
|
+
category: 'hallucinated-apis',
|
|
113
|
+
severity: 'warning',
|
|
114
|
+
message: "'new Buffer()' is deprecated and insecure",
|
|
115
|
+
filePath,
|
|
116
|
+
line: lineNum,
|
|
117
|
+
column: line.indexOf('new Buffer') + 1,
|
|
118
|
+
snippet: line.trim(),
|
|
119
|
+
explanation: "Use 'Buffer.from()' or 'Buffer.alloc()'",
|
|
120
|
+
fix: { description: "Use 'Buffer.from()' or 'Buffer.alloc()'", line: lineNum },
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
// element.on() without jQuery context
|
|
124
|
+
if (/\.on\s*\(\s*['"]/.test(line) && !/\$|\bjQuery\b/.test(line)) {
|
|
125
|
+
if (/\belement\b|\bdocument\b|\bwindow\b/.test(line)) {
|
|
126
|
+
findings.push({
|
|
127
|
+
ruleId: 'hallucinated-apis',
|
|
128
|
+
category: 'hallucinated-apis',
|
|
129
|
+
severity: 'warning',
|
|
130
|
+
message: "'.on()' is jQuery syntax, not native DOM",
|
|
131
|
+
filePath,
|
|
132
|
+
line: lineNum,
|
|
133
|
+
column: line.indexOf('.on(') + 1,
|
|
134
|
+
snippet: line.trim(),
|
|
135
|
+
explanation: "Use 'addEventListener()' for native DOM elements",
|
|
136
|
+
fix: { description: "Use 'addEventListener()' instead", line: lineNum },
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/** Check Python-specific line patterns. */
|
|
142
|
+
function checkPyLinePattern(line, lineNum, filePath, findings) {
|
|
143
|
+
// json.loads(file) when json.load(file) is intended
|
|
144
|
+
if (/\bjson\.loads\s*\(\s*(?:f|file|fp|fh|open)\b/.test(line)) {
|
|
145
|
+
findings.push({
|
|
146
|
+
ruleId: 'hallucinated-apis',
|
|
147
|
+
category: 'hallucinated-apis',
|
|
148
|
+
severity: 'warning',
|
|
149
|
+
message: "'json.loads()' takes a string, not a file object",
|
|
150
|
+
filePath,
|
|
151
|
+
line: lineNum,
|
|
152
|
+
column: line.indexOf('json.loads') + 1,
|
|
153
|
+
snippet: line.trim(),
|
|
154
|
+
explanation: "Use 'json.load(file)' for file objects, 'json.loads(string)' for strings",
|
|
155
|
+
fix: { description: "Use 'json.load()' for file objects", line: lineNum },
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
// asyncio.create_task outside async context (heuristic)
|
|
159
|
+
if (/\basyncio\.create_task\b/.test(line)) {
|
|
160
|
+
findings.push({
|
|
161
|
+
ruleId: 'hallucinated-apis',
|
|
162
|
+
category: 'hallucinated-apis',
|
|
163
|
+
severity: 'warning',
|
|
164
|
+
message: "'asyncio.create_task()' requires a running event loop",
|
|
165
|
+
filePath,
|
|
166
|
+
line: lineNum,
|
|
167
|
+
column: line.indexOf('asyncio.create_task') + 1,
|
|
168
|
+
snippet: line.trim(),
|
|
169
|
+
explanation: "Ensure this is called within an async function with a running event loop",
|
|
170
|
+
fix: { description: "Call within an 'async def' function while the event loop is running", line: lineNum },
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/** The hallucinated-apis rule. */
|
|
175
|
+
exports.hallucinatedApisRule = {
|
|
176
|
+
id: 'hallucinated-apis',
|
|
177
|
+
category: 'hallucinated-apis',
|
|
178
|
+
severity: 'error',
|
|
179
|
+
languages: ['javascript', 'typescript', 'python'],
|
|
180
|
+
description: 'Detect function/method calls commonly hallucinated by LLMs.',
|
|
181
|
+
check(parserResult, filePath) {
|
|
182
|
+
const isPython = parserResult.language === 'python';
|
|
183
|
+
const lookup = isPython ? pyLookup : jsLookup;
|
|
184
|
+
const findings = [];
|
|
185
|
+
for (const call of parserResult.functionCalls) {
|
|
186
|
+
const entry = matchCall(call, lookup);
|
|
187
|
+
if (entry) {
|
|
188
|
+
findings.push(createFinding(call, entry, filePath));
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
const lineFindings = checkLinePatterns(parserResult.lines, isPython, filePath);
|
|
192
|
+
findings.push(...lineFindings);
|
|
193
|
+
return findings;
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
//# sourceMappingURL=hallucinated-apis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hallucinated-apis.js","sourceRoot":"","sources":["../../src/rules/hallucinated-apis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmBtD,wBAAgB,WAAW,IAAI,IAAI,EAAE,CAEpC;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,EAAE,CAEjE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAllRules = getAllRules;
|
|
4
|
+
exports.getRulesByCategory = getRulesByCategory;
|
|
5
|
+
const phantom_imports_js_1 = require("./phantom-imports.js");
|
|
6
|
+
const hallucinated_apis_js_1 = require("./hallucinated-apis.js");
|
|
7
|
+
const placeholder_code_js_1 = require("./placeholder-code.js");
|
|
8
|
+
const confidence_patterns_js_1 = require("./confidence-patterns.js");
|
|
9
|
+
const security_antipatterns_js_1 = require("./security-antipatterns.js");
|
|
10
|
+
const type_safety_js_1 = require("./type-safety.js");
|
|
11
|
+
const error_handling_js_1 = require("./error-handling.js");
|
|
12
|
+
const ALL_RULES = [
|
|
13
|
+
phantom_imports_js_1.phantomImportsRule,
|
|
14
|
+
hallucinated_apis_js_1.hallucinatedApisRule,
|
|
15
|
+
placeholder_code_js_1.placeholderCodeRule,
|
|
16
|
+
confidence_patterns_js_1.confidencePatternsRule,
|
|
17
|
+
security_antipatterns_js_1.securityAntipatternsRule,
|
|
18
|
+
type_safety_js_1.typeSafetyRule,
|
|
19
|
+
error_handling_js_1.errorHandlingRule,
|
|
20
|
+
];
|
|
21
|
+
function getAllRules() {
|
|
22
|
+
return [...ALL_RULES];
|
|
23
|
+
}
|
|
24
|
+
function getRulesByCategory(category) {
|
|
25
|
+
return ALL_RULES.filter((rule) => rule.category === category);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":";;AAmBA,kCAEC;AAED,gDAEC;AAxBD,6DAA0D;AAC1D,iEAA8D;AAC9D,+DAA4D;AAC5D,qEAAkE;AAClE,yEAAsE;AACtE,qDAAkD;AAClD,2DAAwD;AAExD,MAAM,SAAS,GAAW;IACxB,uCAAkB;IAClB,2CAAoB;IACpB,yCAAmB;IACnB,+CAAsB;IACtB,mDAAwB;IACxB,+BAAc;IACd,qCAAiB;CAClB,CAAC;AAEF,SAAgB,WAAW;IACzB,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;AACxB,CAAC;AAED,SAAgB,kBAAkB,CAAC,QAAsB;IACvD,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phantom-imports.d.ts","sourceRoot":"","sources":["../../src/rules/phantom-imports.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAA2D,MAAM,aAAa,CAAC;AAiS5F,gCAAgC;AAChC,eAAO,MAAM,kBAAkB,EAAE,IA4BhC,CAAC"}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.phantomImportsRule = void 0;
|
|
37
|
+
const fs = __importStar(require("node:fs"));
|
|
38
|
+
const path = __importStar(require("node:path"));
|
|
39
|
+
/** JS/TS packages commonly hallucinated by LLMs. */
|
|
40
|
+
const JS_HALLUCINATED = new Set([
|
|
41
|
+
'langchain-core',
|
|
42
|
+
'openai-functions',
|
|
43
|
+
'react-query',
|
|
44
|
+
'axios-retry-interceptor',
|
|
45
|
+
'express-validator-sanitizer',
|
|
46
|
+
'mongoose-paginate-v3',
|
|
47
|
+
'lodash.deepmerge',
|
|
48
|
+
'fs-extra-promise',
|
|
49
|
+
'node-fetch-retry',
|
|
50
|
+
]);
|
|
51
|
+
/** Python packages commonly hallucinated by LLMs. */
|
|
52
|
+
const PY_HALLUCINATED = new Set([
|
|
53
|
+
'langchain_experimental',
|
|
54
|
+
'openai.functions',
|
|
55
|
+
'pandas_profiling',
|
|
56
|
+
'sklearn.metrics.plot_confusion_matrix',
|
|
57
|
+
'torch.cuda.memory',
|
|
58
|
+
]);
|
|
59
|
+
/** Well-known Python stdlib modules (partial list covering common ones). */
|
|
60
|
+
const PY_STDLIB = new Set([
|
|
61
|
+
'os', 'sys', 'json', 'math', 'random', 're', 'datetime', 'collections',
|
|
62
|
+
'itertools', 'functools', 'pathlib', 'typing', 'abc', 'io', 'copy',
|
|
63
|
+
'hashlib', 'hmac', 'secrets', 'csv', 'sqlite3', 'subprocess', 'shutil',
|
|
64
|
+
'tempfile', 'glob', 'fnmatch', 'logging', 'unittest', 'threading',
|
|
65
|
+
'multiprocessing', 'asyncio', 'socket', 'http', 'urllib', 'email',
|
|
66
|
+
'html', 'xml', 'argparse', 'configparser', 'dataclasses', 'enum',
|
|
67
|
+
'string', 'textwrap', 'struct', 'codecs', 'pprint', 'traceback',
|
|
68
|
+
'warnings', 'contextlib', 'inspect', 'dis', 'pickle', 'shelve',
|
|
69
|
+
'marshal', 'dbm', 'gzip', 'bz2', 'lzma', 'zipfile', 'tarfile',
|
|
70
|
+
'stat', 'fileinput', 'time', 'calendar', 'heapq', 'bisect', 'array',
|
|
71
|
+
'weakref', 'types', 'operator', 'decimal', 'fractions', 'statistics',
|
|
72
|
+
'cmath', 'signal', 'mmap', 'ctypes', 'concurrent', 'queue',
|
|
73
|
+
'sched', 'select', 'selectors', 'ssl', 'ftplib', 'imaplib',
|
|
74
|
+
'smtplib', 'uuid', 'xmlrpc', 'ipaddress', 'base64', 'binascii',
|
|
75
|
+
'token', 'tokenize', 'ast', 'compileall', 'pdb', 'profile', 'timeit',
|
|
76
|
+
'importlib', 'pkgutil', 'site', 'venv', 'platform', 'errno',
|
|
77
|
+
'builtins', '__future__',
|
|
78
|
+
]);
|
|
79
|
+
/**
|
|
80
|
+
* Walk upward from startDir to find package.json
|
|
81
|
+
* and return its dependencies + devDependencies as a Set.
|
|
82
|
+
*/
|
|
83
|
+
function findJsDependencies(startDir) {
|
|
84
|
+
let dir = startDir;
|
|
85
|
+
for (let i = 0; i < 20; i++) {
|
|
86
|
+
const pkgPath = path.join(dir, 'package.json');
|
|
87
|
+
if (fs.existsSync(pkgPath)) {
|
|
88
|
+
return parsePackageJson(pkgPath);
|
|
89
|
+
}
|
|
90
|
+
const parent = path.dirname(dir);
|
|
91
|
+
if (parent === dir)
|
|
92
|
+
break;
|
|
93
|
+
dir = parent;
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
/** Parse package.json and return combined dependency names. */
|
|
98
|
+
function parsePackageJson(pkgPath) {
|
|
99
|
+
try {
|
|
100
|
+
const raw = fs.readFileSync(pkgPath, 'utf-8');
|
|
101
|
+
const pkg = JSON.parse(raw);
|
|
102
|
+
const deps = new Set();
|
|
103
|
+
for (const field of ['dependencies', 'devDependencies', 'peerDependencies']) {
|
|
104
|
+
const obj = pkg[field];
|
|
105
|
+
if (obj && typeof obj === 'object') {
|
|
106
|
+
for (const name of Object.keys(obj)) {
|
|
107
|
+
deps.add(name);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return deps;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return new Set();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Walk upward from startDir to find requirements.txt or pyproject.toml
|
|
119
|
+
* and return declared dependency names as a Set.
|
|
120
|
+
*/
|
|
121
|
+
function findPyDependencies(startDir) {
|
|
122
|
+
let dir = startDir;
|
|
123
|
+
const deps = new Set();
|
|
124
|
+
for (let i = 0; i < 20; i++) {
|
|
125
|
+
collectPyDeps(path.join(dir, 'requirements.txt'), deps);
|
|
126
|
+
collectPyDeps(path.join(dir, 'pyproject.toml'), deps);
|
|
127
|
+
if (deps.size > 0)
|
|
128
|
+
return deps;
|
|
129
|
+
const parent = path.dirname(dir);
|
|
130
|
+
if (parent === dir)
|
|
131
|
+
break;
|
|
132
|
+
dir = parent;
|
|
133
|
+
}
|
|
134
|
+
return deps;
|
|
135
|
+
}
|
|
136
|
+
/** Parse requirements.txt or pyproject.toml for dependency names. */
|
|
137
|
+
function collectPyDeps(filePath, deps) {
|
|
138
|
+
if (!fs.existsSync(filePath))
|
|
139
|
+
return;
|
|
140
|
+
try {
|
|
141
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
142
|
+
if (filePath.endsWith('.txt')) {
|
|
143
|
+
parseRequirementsTxt(content, deps);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
parsePyprojectToml(content, deps);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// Ignore read errors.
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/** Extract package names from requirements.txt lines. */
|
|
154
|
+
function parseRequirementsTxt(content, deps) {
|
|
155
|
+
for (const line of content.split('\n')) {
|
|
156
|
+
const trimmed = line.trim();
|
|
157
|
+
if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('-'))
|
|
158
|
+
continue;
|
|
159
|
+
const name = trimmed.split(/[>=<!~\s]/)[0];
|
|
160
|
+
if (name)
|
|
161
|
+
deps.add(name.toLowerCase());
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/** Extract package names from pyproject.toml (simple heuristic). */
|
|
165
|
+
function parsePyprojectToml(content, deps) {
|
|
166
|
+
const depPattern = /^\s*"([^">=<!\s]+)/;
|
|
167
|
+
for (const line of content.split('\n')) {
|
|
168
|
+
const match = depPattern.exec(line.trim());
|
|
169
|
+
if (match?.[1]) {
|
|
170
|
+
deps.add(match[1].toLowerCase());
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/** Extract the top-level package name from an import source. */
|
|
175
|
+
function topLevelPkg(source) {
|
|
176
|
+
if (source.startsWith('@')) {
|
|
177
|
+
const parts = source.split('/');
|
|
178
|
+
return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : source;
|
|
179
|
+
}
|
|
180
|
+
return source.split('/')[0];
|
|
181
|
+
}
|
|
182
|
+
/** Check a single JS/TS import against known deps and hallucinated list. */
|
|
183
|
+
function checkJsImport(imp, filePath, jsDeps) {
|
|
184
|
+
if (imp.isRelative) {
|
|
185
|
+
return makeFinding(imp.line, imp.column, imp.source, `Relative import '${imp.source}' — verify the file exists`, 'Ensure the referenced module is present in the project.', 'info', filePath);
|
|
186
|
+
}
|
|
187
|
+
const pkg = topLevelPkg(imp.source);
|
|
188
|
+
if (JS_HALLUCINATED.has(pkg)) {
|
|
189
|
+
return makeFinding(imp.line, imp.column, imp.source, `'${pkg}' is a commonly hallucinated package — it likely does not exist`, knownHallucinationHint(pkg), 'error', filePath);
|
|
190
|
+
}
|
|
191
|
+
if (jsDeps && !jsDeps.has(pkg) && !isNodeBuiltin(pkg)) {
|
|
192
|
+
return makeFinding(imp.line, imp.column, imp.source, `'${pkg}' not found in package.json — possible phantom import`, 'Add the package to dependencies or verify the package name.', 'warning', filePath);
|
|
193
|
+
}
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
/** Check a single Python import against known deps and hallucinated list. */
|
|
197
|
+
function checkPyImport(imp, filePath, pyDeps) {
|
|
198
|
+
if (imp.isRelative) {
|
|
199
|
+
return makeFinding(imp.line, imp.column, imp.source, `Relative import '${imp.source}' — verify the module exists`, 'Ensure the referenced module is present in the project.', 'info', filePath);
|
|
200
|
+
}
|
|
201
|
+
const fullSource = imp.source;
|
|
202
|
+
const topLevel = fullSource.split('.')[0];
|
|
203
|
+
if (PY_HALLUCINATED.has(fullSource) || PY_HALLUCINATED.has(topLevel)) {
|
|
204
|
+
return makeFinding(imp.line, imp.column, fullSource, `'${fullSource}' is a commonly hallucinated Python package`, pyHallucinationHint(fullSource), 'error', filePath);
|
|
205
|
+
}
|
|
206
|
+
if (PY_STDLIB.has(topLevel))
|
|
207
|
+
return null;
|
|
208
|
+
if (pyDeps.size > 0 && !pyDeps.has(topLevel.toLowerCase())) {
|
|
209
|
+
return makeFinding(imp.line, imp.column, fullSource, `'${topLevel}' not found in requirements — possible phantom import`, 'Add the package to requirements.txt or pyproject.toml.', 'warning', filePath);
|
|
210
|
+
}
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
/** Known Node.js built-in modules (module-level constant to avoid re-allocation). */
|
|
214
|
+
const NODE_BUILTINS = new Set([
|
|
215
|
+
'node:fs', 'node:path', 'node:os', 'node:crypto', 'node:http',
|
|
216
|
+
'node:https', 'node:url', 'node:util', 'node:stream', 'node:events',
|
|
217
|
+
'node:child_process', 'node:buffer', 'node:assert', 'node:net',
|
|
218
|
+
'node:tls', 'node:dns', 'node:zlib', 'node:querystring', 'node:readline',
|
|
219
|
+
'node:worker_threads', 'node:cluster', 'node:perf_hooks', 'node:timers',
|
|
220
|
+
'node:v8', 'node:vm', 'node:async_hooks', 'node:diagnostics_channel',
|
|
221
|
+
'node:test', 'node:module',
|
|
222
|
+
'fs', 'path', 'os', 'crypto', 'http', 'https', 'url', 'util',
|
|
223
|
+
'stream', 'events', 'child_process', 'buffer', 'assert', 'net',
|
|
224
|
+
'tls', 'dns', 'zlib', 'querystring', 'readline', 'worker_threads',
|
|
225
|
+
'cluster', 'perf_hooks', 'timers', 'v8', 'vm', 'async_hooks',
|
|
226
|
+
'diagnostics_channel', 'test', 'module', 'console', 'process',
|
|
227
|
+
'timers/promises', 'fs/promises', 'stream/promises', 'dns/promises',
|
|
228
|
+
'readline/promises',
|
|
229
|
+
]);
|
|
230
|
+
function isNodeBuiltin(pkg) {
|
|
231
|
+
return NODE_BUILTINS.has(pkg);
|
|
232
|
+
}
|
|
233
|
+
/** Create a Finding for phantom-imports rule. */
|
|
234
|
+
function makeFinding(line, column, snippet, message, explanation, severity, filePath) {
|
|
235
|
+
return {
|
|
236
|
+
ruleId: 'phantom-imports',
|
|
237
|
+
category: 'phantom-imports',
|
|
238
|
+
severity,
|
|
239
|
+
message,
|
|
240
|
+
filePath,
|
|
241
|
+
line,
|
|
242
|
+
column,
|
|
243
|
+
snippet,
|
|
244
|
+
explanation,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
/** Provide correction hints for known JS hallucinated packages. */
|
|
248
|
+
function knownHallucinationHint(pkg) {
|
|
249
|
+
const hints = {
|
|
250
|
+
'react-query': "Use '@tanstack/react-query' instead.",
|
|
251
|
+
'openai-functions': "Use the 'openai' package — functions API is built in.",
|
|
252
|
+
'langchain-core': "Use '@langchain/core' (scoped package).",
|
|
253
|
+
'lodash.deepmerge': "Use 'lodash.merge' or 'deepmerge' package.",
|
|
254
|
+
'fs-extra-promise': "Use 'fs-extra' — it already supports promises.",
|
|
255
|
+
'node-fetch-retry': "Use 'node-fetch' with custom retry logic or 'fetch-retry'.",
|
|
256
|
+
};
|
|
257
|
+
return hints[pkg] ?? 'This package does not exist on npm. Verify the correct name.';
|
|
258
|
+
}
|
|
259
|
+
/** Provide correction hints for known Python hallucinated packages. */
|
|
260
|
+
function pyHallucinationHint(pkg) {
|
|
261
|
+
const hints = {
|
|
262
|
+
'pandas_profiling': "Use 'ydata-profiling' (renamed).",
|
|
263
|
+
'sklearn.metrics.plot_confusion_matrix': "Use 'sklearn.metrics.ConfusionMatrixDisplay.from_estimator'.",
|
|
264
|
+
'torch.cuda.memory': "Use 'torch.cuda.memory_allocated()' or 'torch.cuda.memory_reserved()'.",
|
|
265
|
+
'openai.functions': "Functions API is part of the main 'openai' package.",
|
|
266
|
+
'langchain_experimental': "Verify exact package name — may be 'langchain-experimental' on PyPI.",
|
|
267
|
+
};
|
|
268
|
+
return hints[pkg] ?? 'This package may not exist. Verify the correct name.';
|
|
269
|
+
}
|
|
270
|
+
/** The phantom-imports rule. */
|
|
271
|
+
exports.phantomImportsRule = {
|
|
272
|
+
id: 'phantom-imports',
|
|
273
|
+
category: 'phantom-imports',
|
|
274
|
+
severity: 'warning',
|
|
275
|
+
languages: ['javascript', 'typescript', 'python'],
|
|
276
|
+
description: 'Detect imports of packages that likely do not exist or are hallucinated.',
|
|
277
|
+
check(parserResult, filePath) {
|
|
278
|
+
const findings = [];
|
|
279
|
+
const dir = path.dirname(filePath);
|
|
280
|
+
const isPython = parserResult.language === 'python';
|
|
281
|
+
if (isPython) {
|
|
282
|
+
const pyDeps = findPyDependencies(dir);
|
|
283
|
+
for (const imp of parserResult.imports) {
|
|
284
|
+
const f = checkPyImport(imp, filePath, pyDeps);
|
|
285
|
+
if (f)
|
|
286
|
+
findings.push(f);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
const jsDeps = findJsDependencies(dir);
|
|
291
|
+
for (const imp of parserResult.imports) {
|
|
292
|
+
const f = checkJsImport(imp, filePath, jsDeps);
|
|
293
|
+
if (f)
|
|
294
|
+
findings.push(f);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return findings;
|
|
298
|
+
},
|
|
299
|
+
};
|
|
300
|
+
//# sourceMappingURL=phantom-imports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phantom-imports.js","sourceRoot":"","sources":["../../src/rules/phantom-imports.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"placeholder-code.d.ts","sourceRoot":"","sources":["../../src/rules/placeholder-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmC,MAAM,aAAa,CAAC;AAwLpE,iCAAiC;AACjC,eAAO,MAAM,mBAAmB,EAAE,IAcjC,CAAC"}
|