lamps-code-review 0.1.0 → 0.2.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.
@@ -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;AAoE3C;;;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;IAuBhE;;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"}