lamps-code-review 0.1.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/analyzer/ai/context.d.ts +29 -0
- package/dist/core/analyzer/ai/context.d.ts.map +1 -0
- package/dist/core/analyzer/ai/context.js +413 -0
- package/dist/core/analyzer/ai/context.js.map +1 -0
- package/dist/core/analyzer/ai/index.d.ts +24 -6
- package/dist/core/analyzer/ai/index.d.ts.map +1 -1
- package/dist/core/analyzer/ai/index.js +191 -97
- package/dist/core/analyzer/ai/index.js.map +1 -1
- package/dist/core/analyzer/ai/passes.d.ts +14 -0
- package/dist/core/analyzer/ai/passes.d.ts.map +1 -0
- package/dist/core/analyzer/ai/passes.js +202 -0
- package/dist/core/analyzer/ai/passes.js.map +1 -0
- package/dist/core/analyzer/ai/slices.d.ts +40 -0
- package/dist/core/analyzer/ai/slices.d.ts.map +1 -0
- package/dist/core/analyzer/ai/slices.js +263 -0
- package/dist/core/analyzer/ai/slices.js.map +1 -0
- package/dist/core/analyzer/dependency/index.d.ts +64 -0
- package/dist/core/analyzer/dependency/index.d.ts.map +1 -0
- package/dist/core/analyzer/dependency/index.js +423 -0
- package/dist/core/analyzer/dependency/index.js.map +1 -0
- package/dist/core/analyzer/index.d.ts +1 -0
- package/dist/core/analyzer/index.d.ts.map +1 -1
- package/dist/core/analyzer/index.js +17 -8
- package/dist/core/analyzer/index.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +78 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.d.ts +19 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +62 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slices.d.ts","sourceRoot":"","sources":["../../../../src/core/analyzer/ai/slices.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AA6BlE,MAAM,WAAW,YAAY;IAC3B,oDAAoD;IACpD,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC;IAC3B,0BAA0B;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0CAA0C;IAC1C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,yCAAyC;IACzC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,YAAiB,GACzB,SAAS,EAAE,CA6Eb;AAyGD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAyBvE;AAWD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAOzF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAkB7E"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Code Slicing Utilities
|
|
4
|
+
* Extract relevant portions of large files for AI analysis
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.extractSlices = extractSlices;
|
|
8
|
+
exports.mergeOverlappingSlices = mergeOverlappingSlices;
|
|
9
|
+
exports.reconstructSliceContent = reconstructSliceContent;
|
|
10
|
+
exports.estimateTokens = estimateTokens;
|
|
11
|
+
exports.getExportSummary = getExportSummary;
|
|
12
|
+
/** Context lines to include around a point of interest */
|
|
13
|
+
const CONTEXT_LINES = 10;
|
|
14
|
+
/** Maximum slice size in characters */
|
|
15
|
+
const MAX_SLICE_SIZE = 5000;
|
|
16
|
+
/** Patterns for security-sensitive code */
|
|
17
|
+
const SECURITY_PATTERNS = [
|
|
18
|
+
/(?:password|secret|token|api[_-]?key|credential|auth)/i,
|
|
19
|
+
/(?:process\.env\.|environ\[|getenv\()/,
|
|
20
|
+
/(?:eval|exec|Function\(|subprocess|shell)/,
|
|
21
|
+
/(?:innerHTML|dangerouslySetInnerHTML|v-html)/,
|
|
22
|
+
/(?:sql|query|execute|raw\s*\()/i,
|
|
23
|
+
/(?:cookie|session|localStorage|sessionStorage)/,
|
|
24
|
+
/(?:cors|origin|access-control)/i,
|
|
25
|
+
/(?:jwt|bearer|oauth)/i,
|
|
26
|
+
/(?:bcrypt|argon|scrypt|pbkdf|hash)/i,
|
|
27
|
+
];
|
|
28
|
+
/** Patterns for important code constructs */
|
|
29
|
+
const IMPORTANT_PATTERNS = [
|
|
30
|
+
/^export\s+(?:default\s+)?(?:async\s+)?(?:function|class|const|interface|type)/m,
|
|
31
|
+
/^(?:async\s+)?function\s+\w+/m,
|
|
32
|
+
/^class\s+\w+/m,
|
|
33
|
+
/^(?:export\s+)?(?:default\s+)?(?:async\s+)?(?:\([^)]*\)\s*=>|\w+\s*=\s*(?:async\s+)?\([^)]*\)\s*=>)/m,
|
|
34
|
+
];
|
|
35
|
+
/**
|
|
36
|
+
* Extract relevant code slices from file content
|
|
37
|
+
*/
|
|
38
|
+
function extractSlices(content, filePath, options = {}) {
|
|
39
|
+
const lines = content.split('\n');
|
|
40
|
+
const slices = [];
|
|
41
|
+
const { staticFindings = [], includeExports = true, includeSecurity = true, includeDefinitions = true, maxTotalSize = 20000, } = options;
|
|
42
|
+
let totalSize = 0;
|
|
43
|
+
// 1. Extract slices around static analysis findings
|
|
44
|
+
for (const finding of staticFindings) {
|
|
45
|
+
if (finding.file === filePath && finding.line) {
|
|
46
|
+
const slice = extractContextSlice(lines, finding.line, 'Static analysis flagged this area');
|
|
47
|
+
if (slice && totalSize + slice.content.length <= maxTotalSize) {
|
|
48
|
+
slices.push(slice);
|
|
49
|
+
totalSize += slice.content.length;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// 2. Extract security-sensitive sections
|
|
54
|
+
if (includeSecurity) {
|
|
55
|
+
for (let i = 0; i < lines.length; i++) {
|
|
56
|
+
const line = lines[i];
|
|
57
|
+
for (const pattern of SECURITY_PATTERNS) {
|
|
58
|
+
if (pattern.test(line)) {
|
|
59
|
+
const slice = extractContextSlice(lines, i + 1, 'Security-sensitive code');
|
|
60
|
+
if (slice && totalSize + slice.content.length <= maxTotalSize) {
|
|
61
|
+
if (!sliceOverlaps(slices, slice)) {
|
|
62
|
+
slices.push(slice);
|
|
63
|
+
totalSize += slice.content.length;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// 3. Extract exports
|
|
72
|
+
if (includeExports) {
|
|
73
|
+
const exportSlices = extractExportSlices(lines);
|
|
74
|
+
for (const slice of exportSlices) {
|
|
75
|
+
if (totalSize + slice.content.length <= maxTotalSize) {
|
|
76
|
+
if (!sliceOverlaps(slices, slice)) {
|
|
77
|
+
slices.push(slice);
|
|
78
|
+
totalSize += slice.content.length;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// 4. Extract important definitions (functions, classes)
|
|
84
|
+
if (includeDefinitions) {
|
|
85
|
+
for (let i = 0; i < lines.length; i++) {
|
|
86
|
+
const line = lines[i];
|
|
87
|
+
for (const pattern of IMPORTANT_PATTERNS) {
|
|
88
|
+
if (pattern.test(line)) {
|
|
89
|
+
const slice = extractDefinitionSlice(lines, i + 1);
|
|
90
|
+
if (slice && totalSize + slice.content.length <= maxTotalSize) {
|
|
91
|
+
if (!sliceOverlaps(slices, slice)) {
|
|
92
|
+
slices.push(slice);
|
|
93
|
+
totalSize += slice.content.length;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Sort by line number and merge overlapping
|
|
102
|
+
return mergeOverlappingSlices(slices);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Extract a context slice around a specific line
|
|
106
|
+
*/
|
|
107
|
+
function extractContextSlice(lines, lineNum, reason) {
|
|
108
|
+
const startLine = Math.max(1, lineNum - CONTEXT_LINES);
|
|
109
|
+
const endLine = Math.min(lines.length, lineNum + CONTEXT_LINES);
|
|
110
|
+
const sliceLines = lines.slice(startLine - 1, endLine);
|
|
111
|
+
const content = sliceLines.join('\n');
|
|
112
|
+
if (content.length > MAX_SLICE_SIZE) {
|
|
113
|
+
// Truncate if too large
|
|
114
|
+
const truncated = content.slice(0, MAX_SLICE_SIZE) + '\n// ... truncated';
|
|
115
|
+
return { startLine, endLine, content: truncated, reason };
|
|
116
|
+
}
|
|
117
|
+
return { startLine, endLine, content, reason };
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Extract a slice containing a definition (function, class, etc.)
|
|
121
|
+
* Tries to capture the full definition including its body
|
|
122
|
+
*/
|
|
123
|
+
function extractDefinitionSlice(lines, startLineNum) {
|
|
124
|
+
let braceCount = 0;
|
|
125
|
+
let started = false;
|
|
126
|
+
let endLine = startLineNum;
|
|
127
|
+
// Look for opening brace and track nesting
|
|
128
|
+
for (let i = startLineNum - 1; i < lines.length; i++) {
|
|
129
|
+
const line = lines[i];
|
|
130
|
+
for (const char of line) {
|
|
131
|
+
if (char === '{' || char === '(') {
|
|
132
|
+
braceCount++;
|
|
133
|
+
started = true;
|
|
134
|
+
}
|
|
135
|
+
else if (char === '}' || char === ')') {
|
|
136
|
+
braceCount--;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
endLine = i + 1;
|
|
140
|
+
// Stop when we've closed all braces
|
|
141
|
+
if (started && braceCount === 0) {
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
// Safety: don't include more than 50 lines
|
|
145
|
+
if (i - startLineNum + 1 > 50) {
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const sliceLines = lines.slice(startLineNum - 1, endLine);
|
|
150
|
+
const content = sliceLines.join('\n');
|
|
151
|
+
if (content.length > MAX_SLICE_SIZE) {
|
|
152
|
+
return null; // Skip overly large definitions
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
startLine: startLineNum,
|
|
156
|
+
endLine,
|
|
157
|
+
content,
|
|
158
|
+
reason: 'Function/class definition',
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Extract export statement slices
|
|
163
|
+
*/
|
|
164
|
+
function extractExportSlices(lines) {
|
|
165
|
+
const slices = [];
|
|
166
|
+
for (let i = 0; i < lines.length; i++) {
|
|
167
|
+
const line = lines[i];
|
|
168
|
+
// Match export statements
|
|
169
|
+
if (/^export\s+/.test(line.trim())) {
|
|
170
|
+
const slice = extractDefinitionSlice(lines, i + 1);
|
|
171
|
+
if (slice) {
|
|
172
|
+
slice.reason = 'Export';
|
|
173
|
+
slices.push(slice);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return slices;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Check if a new slice overlaps with existing slices
|
|
181
|
+
*/
|
|
182
|
+
function sliceOverlaps(existing, newSlice) {
|
|
183
|
+
for (const slice of existing) {
|
|
184
|
+
if (newSlice.startLine <= slice.endLine && newSlice.endLine >= slice.startLine) {
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Merge overlapping slices into contiguous blocks
|
|
192
|
+
*/
|
|
193
|
+
function mergeOverlappingSlices(slices) {
|
|
194
|
+
if (slices.length === 0)
|
|
195
|
+
return [];
|
|
196
|
+
// Sort by start line
|
|
197
|
+
const sorted = [...slices].sort((a, b) => a.startLine - b.startLine);
|
|
198
|
+
const merged = [];
|
|
199
|
+
let current = { ...sorted[0] };
|
|
200
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
201
|
+
const next = sorted[i];
|
|
202
|
+
// Check if overlapping or adjacent
|
|
203
|
+
if (next.startLine <= current.endLine + 1) {
|
|
204
|
+
// Merge
|
|
205
|
+
current.endLine = Math.max(current.endLine, next.endLine);
|
|
206
|
+
current.reason = combineReasons(current.reason, next.reason);
|
|
207
|
+
// Content will be reconstructed
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
merged.push(current);
|
|
211
|
+
current = { ...next };
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
merged.push(current);
|
|
215
|
+
return merged;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Combine slice reasons
|
|
219
|
+
*/
|
|
220
|
+
function combineReasons(reason1, reason2) {
|
|
221
|
+
if (reason1 === reason2)
|
|
222
|
+
return reason1;
|
|
223
|
+
const reasons = new Set([reason1, reason2]);
|
|
224
|
+
return Array.from(reasons).join(', ');
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Reconstruct slice content from original file
|
|
228
|
+
* Used after merging to get correct content
|
|
229
|
+
*/
|
|
230
|
+
function reconstructSliceContent(content, slices) {
|
|
231
|
+
const lines = content.split('\n');
|
|
232
|
+
return slices.map((slice) => ({
|
|
233
|
+
...slice,
|
|
234
|
+
content: lines.slice(slice.startLine - 1, slice.endLine).join('\n'),
|
|
235
|
+
}));
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Estimate token count for content (rough approximation)
|
|
239
|
+
* Uses ~4 characters per token heuristic
|
|
240
|
+
*/
|
|
241
|
+
function estimateTokens(content) {
|
|
242
|
+
return Math.ceil(content.length / 4);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Get a summary of what a file exports (for architecture pass)
|
|
246
|
+
*/
|
|
247
|
+
function getExportSummary(content, extension) {
|
|
248
|
+
const exports = [];
|
|
249
|
+
if (['.ts', '.tsx', '.js', '.jsx', '.mjs'].includes(extension)) {
|
|
250
|
+
// Named exports with types
|
|
251
|
+
const namedRegex = /export\s+(const|let|var|function|class|interface|type|enum)\s+(\w+)/g;
|
|
252
|
+
let match;
|
|
253
|
+
while ((match = namedRegex.exec(content)) !== null) {
|
|
254
|
+
exports.push(`${match[1]} ${match[2]}`);
|
|
255
|
+
}
|
|
256
|
+
// Default export
|
|
257
|
+
if (/export\s+default/.test(content)) {
|
|
258
|
+
exports.push('default');
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return exports;
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=slices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slices.js","sourceRoot":"","sources":["../../../../src/core/analyzer/ai/slices.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Analyzer module
|
|
3
|
+
* Builds an import/export graph and categorizes files for smart context selection
|
|
4
|
+
*/
|
|
5
|
+
import type { AnalysisContext, AnalysisResult, DependencyGraph, FileNode } from '../../../types/index.js';
|
|
6
|
+
import { BaseAnalyzer } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Dependency Analyzer - builds import graph and categorizes files
|
|
9
|
+
* Runs in the static phase before AI analysis
|
|
10
|
+
*/
|
|
11
|
+
export declare class DependencyAnalyzer extends BaseAnalyzer {
|
|
12
|
+
readonly name = "dependency";
|
|
13
|
+
readonly phase: "static";
|
|
14
|
+
readonly description = "Analyzes import/export relationships and categorizes files";
|
|
15
|
+
analyze(context: AnalysisContext): Promise<AnalysisResult>;
|
|
16
|
+
/**
|
|
17
|
+
* Build the dependency graph from scanned files
|
|
18
|
+
*/
|
|
19
|
+
private buildGraph;
|
|
20
|
+
/**
|
|
21
|
+
* Categorize a file based on its path
|
|
22
|
+
*/
|
|
23
|
+
private categorizeFile;
|
|
24
|
+
/**
|
|
25
|
+
* Load file content for analysis
|
|
26
|
+
*/
|
|
27
|
+
private loadContent;
|
|
28
|
+
/**
|
|
29
|
+
* Extract import statements from file content
|
|
30
|
+
*/
|
|
31
|
+
private extractImports;
|
|
32
|
+
/**
|
|
33
|
+
* Extract export statements from file content
|
|
34
|
+
*/
|
|
35
|
+
private extractExports;
|
|
36
|
+
/**
|
|
37
|
+
* Resolve an import path to a file in the graph
|
|
38
|
+
*/
|
|
39
|
+
private resolveImportPath;
|
|
40
|
+
/**
|
|
41
|
+
* Calculate priority scores for each file
|
|
42
|
+
*/
|
|
43
|
+
private calculatePriorities;
|
|
44
|
+
/**
|
|
45
|
+
* Serialize graph for storage in metadata
|
|
46
|
+
* (Maps don't serialize to JSON well)
|
|
47
|
+
*/
|
|
48
|
+
private serializeGraph;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Deserialize graph from metadata
|
|
52
|
+
*/
|
|
53
|
+
export declare function deserializeGraph(data: {
|
|
54
|
+
files: Record<string, FileNode>;
|
|
55
|
+
entryPoints: string[];
|
|
56
|
+
configFiles: string[];
|
|
57
|
+
testFiles: string[];
|
|
58
|
+
apiFiles: string[];
|
|
59
|
+
}): DependencyGraph;
|
|
60
|
+
/**
|
|
61
|
+
* Create a dependency analyzer instance
|
|
62
|
+
*/
|
|
63
|
+
export declare function createDependencyAnalyzer(): DependencyAnalyzer;
|
|
64
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/analyzer/dependency/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EAEd,eAAe,EACf,QAAQ,EAGT,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAqE3C;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,KAAK,EAAG,QAAQ,CAAU;IACnC,QAAQ,CAAC,WAAW,gEAAgE;IAE9E,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAgDhE;;OAEG;YACW,UAAU;IAgDxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAkCtB;;OAEG;YACW,WAAW;IAUzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAkCtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAoCtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyCzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgC3B;;;OAGG;IACH,OAAO,CAAC,cAAc;CAcvB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,GAAG,eAAe,CAalB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,kBAAkB,CAE7D"}
|