lamps-code-review 0.2.0 → 0.2.3
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/cli/commands/review.js +5 -41
- package/dist/cli/commands/review.js.map +1 -1
- package/dist/cli/index.js +5 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/core/analyzer/ai/context.d.ts.map +1 -1
- package/dist/core/analyzer/ai/context.js +29 -66
- package/dist/core/analyzer/ai/context.js.map +1 -1
- package/dist/core/analyzer/ai/index.d.ts.map +1 -1
- package/dist/core/analyzer/ai/index.js +69 -41
- package/dist/core/analyzer/ai/index.js.map +1 -1
- package/dist/core/analyzer/ai/openrouter.js +3 -9
- package/dist/core/analyzer/ai/openrouter.js.map +1 -1
- package/dist/core/analyzer/ai/passes.d.ts.map +1 -1
- package/dist/core/analyzer/ai/passes.js +52 -38
- package/dist/core/analyzer/ai/passes.js.map +1 -1
- package/dist/core/analyzer/ai/prompts.js +3 -8
- package/dist/core/analyzer/ai/prompts.js.map +1 -1
- package/dist/core/analyzer/ai/slices.js +5 -12
- package/dist/core/analyzer/ai/slices.js.map +1 -1
- package/dist/core/analyzer/dependency/index.d.ts.map +1 -1
- package/dist/core/analyzer/dependency/index.js +27 -45
- package/dist/core/analyzer/dependency/index.js.map +1 -1
- package/dist/core/analyzer/index.js +12 -33
- package/dist/core/analyzer/index.js.map +1 -1
- package/dist/core/analyzer/static/index.js +3 -8
- package/dist/core/analyzer/static/index.js.map +1 -1
- package/dist/core/analyzer/types.js +1 -5
- package/dist/core/analyzer/types.js.map +1 -1
- package/dist/core/config/index.d.ts.map +1 -1
- package/dist/core/config/index.js +19 -51
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/detector/index.js +3 -39
- package/dist/core/detector/index.js.map +1 -1
- package/dist/core/reporter/formats/json.js +2 -6
- package/dist/core/reporter/formats/json.js.map +1 -1
- package/dist/core/reporter/index.js +6 -13
- package/dist/core/reporter/index.js.map +1 -1
- package/dist/core/scanner/ignore-rules.js +3 -39
- package/dist/core/scanner/ignore-rules.js.map +1 -1
- package/dist/core/scanner/index.js +14 -51
- package/dist/core/scanner/index.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -35
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -4
- package/dist/types/index.js.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 +15 -59
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.d.ts +17 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +47 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +2 -1
|
@@ -1,21 +1,18 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* AI Analyzer module
|
|
4
3
|
* Multi-pass AI-powered code review using OpenRouter
|
|
5
4
|
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const passes_js_1 = require("./passes.js");
|
|
14
|
-
const prompts_js_1 = require("./prompts.js");
|
|
5
|
+
import { BaseAnalyzer } from '../types.js';
|
|
6
|
+
import { chat, OpenRouterError } from './openrouter.js';
|
|
7
|
+
import { getOpenRouterKey, hasOpenRouterKey } from '../../config/index.js';
|
|
8
|
+
import { buildArchitectureContext, buildDeepDiveContext, buildSecurityContext, getDependencyGraphFromResults, createEmptyGraph, } from './context.js';
|
|
9
|
+
import { PASS_SYSTEM_PROMPTS, buildPassPrompt } from './passes.js';
|
|
10
|
+
import { parseAIResponse } from './prompts.js';
|
|
11
|
+
import { createLogger } from '../../../utils/logger.js';
|
|
15
12
|
/**
|
|
16
13
|
* Multi-pass AI-powered code analyzer using OpenRouter
|
|
17
14
|
*/
|
|
18
|
-
class AIAnalyzer extends
|
|
15
|
+
export class AIAnalyzer extends BaseAnalyzer {
|
|
19
16
|
constructor(config) {
|
|
20
17
|
super();
|
|
21
18
|
this.config = config;
|
|
@@ -27,8 +24,10 @@ class AIAnalyzer extends types_js_1.BaseAnalyzer {
|
|
|
27
24
|
}
|
|
28
25
|
async analyze(context) {
|
|
29
26
|
const startTime = Date.now();
|
|
27
|
+
const logger = context.logger || createLogger(false);
|
|
30
28
|
// Check for API key
|
|
31
|
-
if (!
|
|
29
|
+
if (!hasOpenRouterKey()) {
|
|
30
|
+
logger.warn('OPENROUTER_API_KEY not set - skipping AI analysis');
|
|
32
31
|
return this.createResult([
|
|
33
32
|
{
|
|
34
33
|
ruleId: 'ai/no-api-key',
|
|
@@ -39,51 +38,62 @@ class AIAnalyzer extends types_js_1.BaseAnalyzer {
|
|
|
39
38
|
], startTime, { skipped: true, reason: 'no-api-key' });
|
|
40
39
|
}
|
|
41
40
|
if (context.files.length === 0) {
|
|
41
|
+
logger.warn('No files to analyze');
|
|
42
42
|
return this.createResult([], startTime, {
|
|
43
43
|
skipped: true,
|
|
44
44
|
reason: 'no-files',
|
|
45
45
|
});
|
|
46
46
|
}
|
|
47
47
|
try {
|
|
48
|
+
logger.phase('AI Analysis (Multi-Pass)');
|
|
49
|
+
logger.step(`Model: ${this.config.model}`);
|
|
50
|
+
logger.step(`Files in codebase: ${context.files.length}`);
|
|
48
51
|
// Get dependency graph from static phase results (if available)
|
|
49
|
-
|
|
50
|
-
|
|
52
|
+
const graph = this.getDependencyGraph(context) || createEmptyGraph(context.files);
|
|
53
|
+
// Log graph stats
|
|
54
|
+
const graphStats = {
|
|
55
|
+
entryPoints: graph.entryPoints.length,
|
|
56
|
+
configFiles: graph.configFiles.length,
|
|
57
|
+
apiFiles: graph.apiFiles.length,
|
|
58
|
+
};
|
|
59
|
+
logger.detail(`Dependency graph: ${graphStats.entryPoints} entry points, ${graphStats.configFiles} configs, ${graphStats.apiFiles} API routes`);
|
|
51
60
|
// Collect static findings for context
|
|
52
61
|
this.staticFindings = this.getStaticFindings(context);
|
|
62
|
+
if (this.staticFindings.length > 0) {
|
|
63
|
+
logger.detail(`Static findings to incorporate: ${this.staticFindings.length}`);
|
|
64
|
+
}
|
|
53
65
|
// Run all passes
|
|
54
66
|
const allPassResults = [];
|
|
55
67
|
const allFindings = [];
|
|
56
|
-
// Log start
|
|
57
|
-
if (context.config.verbose) {
|
|
58
|
-
console.log('Starting multi-pass AI analysis...');
|
|
59
|
-
}
|
|
60
68
|
// Pass 1: Architecture
|
|
69
|
+
logger.step('Pass 1/3: Architecture Review');
|
|
61
70
|
const archResult = await this.runPass('architecture', context, graph, allFindings);
|
|
62
71
|
allPassResults.push(archResult);
|
|
63
72
|
allFindings.push(...archResult.findings);
|
|
64
|
-
|
|
65
|
-
console.log(` Architecture pass: ${archResult.findings.length} findings`);
|
|
66
|
-
}
|
|
73
|
+
logger.success(`Architecture: ${archResult.findings.length} findings`);
|
|
67
74
|
// Pass 2: Deep Dive
|
|
75
|
+
logger.step('Pass 2/3: Deep Dive Review');
|
|
68
76
|
const deepResult = await this.runPass('deep-dive', context, graph, allFindings);
|
|
69
77
|
allPassResults.push(deepResult);
|
|
70
78
|
allFindings.push(...deepResult.findings);
|
|
71
|
-
|
|
72
|
-
console.log(` Deep-dive pass: ${deepResult.findings.length} findings`);
|
|
73
|
-
}
|
|
79
|
+
logger.success(`Deep-dive: ${deepResult.findings.length} findings`);
|
|
74
80
|
// Pass 3: Security
|
|
81
|
+
logger.step('Pass 3/3: Security Review');
|
|
75
82
|
const secResult = await this.runPass('security', context, graph, allFindings);
|
|
76
83
|
allPassResults.push(secResult);
|
|
77
84
|
allFindings.push(...secResult.findings);
|
|
78
|
-
|
|
79
|
-
console.log(` Security pass: ${secResult.findings.length} findings`);
|
|
80
|
-
}
|
|
85
|
+
logger.success(`Security: ${secResult.findings.length} findings`);
|
|
81
86
|
// Deduplicate findings
|
|
82
87
|
const dedupedFindings = this.deduplicateFindings(allFindings);
|
|
88
|
+
if (allFindings.length !== dedupedFindings.length) {
|
|
89
|
+
logger.detail(`Deduplicated: ${allFindings.length} → ${dedupedFindings.length} findings`);
|
|
90
|
+
}
|
|
83
91
|
// Combine summaries
|
|
84
92
|
const combinedSummary = allPassResults
|
|
85
93
|
.map((r) => `**${r.pass}**: ${r.summary}`)
|
|
86
94
|
.join('\n\n');
|
|
95
|
+
const duration = Date.now() - startTime;
|
|
96
|
+
logger.success(`AI analysis complete in ${(duration / 1000).toFixed(1)}s`);
|
|
87
97
|
return this.createResult(dedupedFindings, startTime, {
|
|
88
98
|
model: this.config.model,
|
|
89
99
|
summary: combinedSummary,
|
|
@@ -94,11 +104,12 @@ class AIAnalyzer extends types_js_1.BaseAnalyzer {
|
|
|
94
104
|
}
|
|
95
105
|
catch (error) {
|
|
96
106
|
// Handle errors gracefully
|
|
97
|
-
const errorMessage = error instanceof
|
|
107
|
+
const errorMessage = error instanceof OpenRouterError
|
|
98
108
|
? error.message
|
|
99
109
|
: error instanceof Error
|
|
100
110
|
? error.message
|
|
101
111
|
: 'Unknown error during AI analysis';
|
|
112
|
+
logger.warn(`AI analysis failed: ${errorMessage}`);
|
|
102
113
|
return this.createResult([
|
|
103
114
|
{
|
|
104
115
|
ruleId: 'ai/error',
|
|
@@ -113,21 +124,36 @@ class AIAnalyzer extends types_js_1.BaseAnalyzer {
|
|
|
113
124
|
* Run a single AI pass
|
|
114
125
|
*/
|
|
115
126
|
async runPass(passType, context, graph, previousFindings) {
|
|
127
|
+
const logger = context.logger || createLogger(false);
|
|
116
128
|
// Build context for this pass
|
|
117
129
|
let reviewContext;
|
|
118
130
|
switch (passType) {
|
|
119
131
|
case 'architecture':
|
|
120
|
-
reviewContext = await
|
|
132
|
+
reviewContext = await buildArchitectureContext(context, graph);
|
|
121
133
|
break;
|
|
122
134
|
case 'deep-dive':
|
|
123
|
-
reviewContext = await
|
|
135
|
+
reviewContext = await buildDeepDiveContext(context, graph, this.staticFindings, previousFindings.filter((f) => f.ruleId.startsWith('ai/arch')));
|
|
124
136
|
break;
|
|
125
137
|
case 'security':
|
|
126
|
-
reviewContext = await
|
|
138
|
+
reviewContext = await buildSecurityContext(context, graph);
|
|
127
139
|
break;
|
|
128
140
|
}
|
|
141
|
+
// Log context details
|
|
142
|
+
logger.detail(`Sending ${reviewContext.files.length} files (~${Math.round(reviewContext.metadata.totalTokenEstimate / 1000)}K tokens)`);
|
|
143
|
+
if (reviewContext.files.length > 0 && reviewContext.files.length <= 5) {
|
|
144
|
+
for (const file of reviewContext.files) {
|
|
145
|
+
logger.detail(` ${file.path} (${file.reason})`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
else if (reviewContext.files.length > 5) {
|
|
149
|
+
for (const file of reviewContext.files.slice(0, 3)) {
|
|
150
|
+
logger.detail(` ${file.path} (${file.reason})`);
|
|
151
|
+
}
|
|
152
|
+
logger.detail(` ... and ${reviewContext.files.length - 3} more files`);
|
|
153
|
+
}
|
|
129
154
|
// Skip if no files to review
|
|
130
155
|
if (reviewContext.files.length === 0) {
|
|
156
|
+
logger.warn(`No relevant files for ${passType} review`);
|
|
131
157
|
return {
|
|
132
158
|
pass: passType,
|
|
133
159
|
findings: [],
|
|
@@ -135,13 +161,17 @@ class AIAnalyzer extends types_js_1.BaseAnalyzer {
|
|
|
135
161
|
};
|
|
136
162
|
}
|
|
137
163
|
// Build prompts
|
|
138
|
-
const systemPrompt =
|
|
139
|
-
const userPrompt =
|
|
164
|
+
const systemPrompt = PASS_SYSTEM_PROMPTS[passType];
|
|
165
|
+
const userPrompt = buildPassPrompt(reviewContext, this.config.customPrompt);
|
|
140
166
|
// Call AI
|
|
141
|
-
|
|
142
|
-
const
|
|
167
|
+
logger.detail('Calling AI...');
|
|
168
|
+
const callStart = Date.now();
|
|
169
|
+
const apiKey = getOpenRouterKey();
|
|
170
|
+
const response = await chat(systemPrompt, userPrompt, this.config, apiKey);
|
|
171
|
+
const callDuration = Date.now() - callStart;
|
|
172
|
+
logger.detail(`AI responded in ${(callDuration / 1000).toFixed(1)}s`);
|
|
143
173
|
// Parse response
|
|
144
|
-
const parsed =
|
|
174
|
+
const parsed = parseAIResponse(response);
|
|
145
175
|
// Convert to findings with proper severity types
|
|
146
176
|
const findings = parsed.findings.map((f) => ({
|
|
147
177
|
ruleId: f.ruleId,
|
|
@@ -165,7 +195,7 @@ class AIAnalyzer extends types_js_1.BaseAnalyzer {
|
|
|
165
195
|
// after the static phase runs
|
|
166
196
|
const metadata = context._previousResults;
|
|
167
197
|
if (metadata) {
|
|
168
|
-
return
|
|
198
|
+
return getDependencyGraphFromResults(metadata);
|
|
169
199
|
}
|
|
170
200
|
return null;
|
|
171
201
|
}
|
|
@@ -218,14 +248,12 @@ class AIAnalyzer extends types_js_1.BaseAnalyzer {
|
|
|
218
248
|
.slice(0, 50);
|
|
219
249
|
}
|
|
220
250
|
}
|
|
221
|
-
exports.AIAnalyzer = AIAnalyzer;
|
|
222
251
|
/**
|
|
223
252
|
* Create an AI analyzer with the given configuration
|
|
224
253
|
*/
|
|
225
|
-
function createAIAnalyzer(config) {
|
|
254
|
+
export function createAIAnalyzer(config) {
|
|
226
255
|
return new AIAnalyzer(config);
|
|
227
256
|
}
|
|
228
257
|
// Re-export for convenience
|
|
229
|
-
|
|
230
|
-
Object.defineProperty(exports, "OpenRouterError", { enumerable: true, get: function () { return openrouter_js_2.OpenRouterError; } });
|
|
258
|
+
export { OpenRouterError } from './openrouter.js';
|
|
231
259
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/analyzer/ai/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/analyzer/ai/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,11 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* OpenRouter API client
|
|
4
3
|
* Handles communication with OpenRouter for AI model access
|
|
5
4
|
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.OpenRouterError = void 0;
|
|
8
|
-
exports.callOpenRouter = callOpenRouter;
|
|
9
|
-
exports.chat = chat;
|
|
10
5
|
/** OpenRouter API endpoint */
|
|
11
6
|
const OPENROUTER_API_URL = 'https://openrouter.ai/api/v1/chat/completions';
|
|
12
7
|
/** Error from OpenRouter API */
|
|
13
|
-
class OpenRouterError extends Error {
|
|
8
|
+
export class OpenRouterError extends Error {
|
|
14
9
|
constructor(message, code, status) {
|
|
15
10
|
super(message);
|
|
16
11
|
this.code = code;
|
|
@@ -18,11 +13,10 @@ class OpenRouterError extends Error {
|
|
|
18
13
|
this.name = 'OpenRouterError';
|
|
19
14
|
}
|
|
20
15
|
}
|
|
21
|
-
exports.OpenRouterError = OpenRouterError;
|
|
22
16
|
/**
|
|
23
17
|
* Call OpenRouter API with a prompt
|
|
24
18
|
*/
|
|
25
|
-
async function callOpenRouter(messages, config, apiKey) {
|
|
19
|
+
export async function callOpenRouter(messages, config, apiKey) {
|
|
26
20
|
const response = await fetch(OPENROUTER_API_URL, {
|
|
27
21
|
method: 'POST',
|
|
28
22
|
headers: {
|
|
@@ -67,7 +61,7 @@ async function callOpenRouter(messages, config, apiKey) {
|
|
|
67
61
|
/**
|
|
68
62
|
* Simple helper to create a chat completion
|
|
69
63
|
*/
|
|
70
|
-
async function chat(systemPrompt, userPrompt, config, apiKey) {
|
|
64
|
+
export async function chat(systemPrompt, userPrompt, config, apiKey) {
|
|
71
65
|
const messages = [
|
|
72
66
|
{ role: 'system', content: systemPrompt },
|
|
73
67
|
{ role: 'user', content: userPrompt },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../../../src/core/analyzer/ai/openrouter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../../../src/core/analyzer/ai/openrouter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,8BAA8B;AAC9B,MAAM,kBAAkB,GAAG,+CAA+C,CAAC;AA6B3E,gCAAgC;AAChC,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YACE,OAAe,EACC,IAAa,EACb,MAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAS;QACb,WAAM,GAAN,MAAM,CAAS;QAG/B,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAuB,EACvB,MAAgB,EAChB,MAAc;IAEd,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kBAAkB,EAAE;QAC/C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,eAAe,EAAE,UAAU,MAAM,EAAE;YACnC,cAAc,EAAE,kBAAkB;YAClC,cAAc,EAAE,sCAAsC;YACtD,SAAS,EAAE,iBAAiB;SAC7B;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ;YACR,UAAU,EAAE,MAAM,CAAC,SAAS;YAC5B,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,YAAY,GAAG,yBAAyB,QAAQ,CAAC,MAAM,EAAE,CAAC;QAE9D,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;gBAC7B,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;YACzC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;YACjC,IAAI,SAAS,EAAE,CAAC;gBACd,YAAY,GAAG,SAAS,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,MAAM,IAAI,eAAe,CAAC,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAC;IAE3D,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,eAAe,CAAC,2BAA2B,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,YAAoB,EACpB,UAAkB,EAClB,MAAgB,EAChB,MAAc;IAEd,MAAM,QAAQ,GAAkB;QAC9B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;QACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE;KACtC,CAAC;IAEF,OAAO,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passes.d.ts","sourceRoot":"","sources":["../../../../src/core/analyzer/ai/passes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAe,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAEtF;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"passes.d.ts","sourceRoot":"","sources":["../../../../src/core/analyzer/ai/passes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAe,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAEtF;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CA+D1D,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAgCrF"}
|
|
@@ -1,62 +1,76 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Pass-Specific Prompts
|
|
4
3
|
* Tailored prompts for each AI review pass
|
|
5
4
|
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.PASS_SYSTEM_PROMPTS = void 0;
|
|
8
|
-
exports.buildPassPrompt = buildPassPrompt;
|
|
9
5
|
/**
|
|
10
6
|
* System prompts for each pass type
|
|
11
7
|
*/
|
|
12
|
-
|
|
8
|
+
export const PASS_SYSTEM_PROMPTS = {
|
|
13
9
|
architecture: `You are an expert software architect reviewing a codebase's structure and organization.
|
|
14
10
|
|
|
15
|
-
|
|
16
|
-
1. **Project Structure** - Is the organization logical? Are there missing directories or patterns?
|
|
17
|
-
2. **Dependencies** - Are there concerning dependencies? Version issues? Missing dependencies?
|
|
18
|
-
3. **Entry Points** - Are they well-organized? Clear application flow?
|
|
19
|
-
4. **Configuration** - Are configs complete? Missing environment handling?
|
|
20
|
-
5. **Architecture Patterns** - Consistent patterns? Clear separation of concerns?
|
|
21
|
-
6. **Scalability Concerns** - Any obvious bottlenecks or limitations?
|
|
11
|
+
IMPORTANT: The file tree provided shows ALL files that EXIST in this codebase. Do NOT report files as missing if they appear in the file tree - they exist. Only report genuinely missing files if the code imports something that doesn't exist in the tree.
|
|
22
12
|
|
|
23
|
-
|
|
13
|
+
Focus on REAL architectural issues:
|
|
14
|
+
1. **Dependency Issues** - Circular dependencies, outdated packages, missing peer deps
|
|
15
|
+
2. **Architecture Patterns** - Inconsistent patterns, poor separation of concerns
|
|
16
|
+
3. **Configuration** - Missing required configs, insecure defaults
|
|
17
|
+
4. **Scalability** - Obvious bottlenecks, hardcoded limits
|
|
18
|
+
|
|
19
|
+
DO NOT report:
|
|
20
|
+
- Files shown in the file tree as "missing" - they exist
|
|
21
|
+
- Style preferences or minor suggestions
|
|
22
|
+
- Anything that's working correctly
|
|
23
|
+
|
|
24
|
+
Keep findings to 5 or fewer. Only report significant architectural concerns.
|
|
24
25
|
|
|
25
26
|
Respond with valid JSON only. No markdown, no explanations outside the JSON.`,
|
|
26
|
-
'deep-dive': `You are an expert senior software engineer conducting a
|
|
27
|
+
'deep-dive': `You are an expert senior software engineer conducting a code review.
|
|
28
|
+
|
|
29
|
+
Focus ONLY on actual bugs and significant issues:
|
|
30
|
+
1. **Real Bugs** - Logic errors that will cause incorrect behavior
|
|
31
|
+
2. **Crash Risks** - Unhandled nulls that WILL throw, not theoretical ones
|
|
32
|
+
3. **Security Holes** - Actual vulnerabilities, not theoretical concerns
|
|
33
|
+
4. **Performance Problems** - Measurable issues like O(n²) in hot paths
|
|
27
34
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
35
|
+
DO NOT report:
|
|
36
|
+
- Style issues or formatting preferences
|
|
37
|
+
- "Could be improved" suggestions unless critical
|
|
38
|
+
- Missing error handling for unlikely edge cases
|
|
39
|
+
- Type annotations or documentation suggestions
|
|
40
|
+
- Things that are technically correct but could be "better"
|
|
34
41
|
|
|
35
|
-
|
|
42
|
+
QUALITY OVER QUANTITY: Report 10 or fewer findings. Only include issues that would fail a code review or cause production bugs. If the code is well-written, return fewer findings.
|
|
43
|
+
|
|
44
|
+
Be specific: include file paths and line numbers.
|
|
36
45
|
|
|
37
46
|
Respond with valid JSON only. No markdown, no explanations outside the JSON.`,
|
|
38
47
|
security: `You are a security expert conducting a security-focused code review.
|
|
39
48
|
|
|
40
|
-
Focus on
|
|
41
|
-
1. **Injection** - SQL,
|
|
42
|
-
2. **
|
|
43
|
-
3. **
|
|
44
|
-
4. **
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
Focus on ACTUAL vulnerabilities that could be exploited:
|
|
50
|
+
1. **Injection** - SQL, command injection with user input reaching dangerous functions
|
|
51
|
+
2. **Auth Issues** - Broken authentication, missing authorization checks
|
|
52
|
+
3. **Data Exposure** - Secrets in code, sensitive data in logs
|
|
53
|
+
4. **XSS** - User input rendered without sanitization
|
|
54
|
+
|
|
55
|
+
DO NOT report:
|
|
56
|
+
- Theoretical vulnerabilities without a realistic attack vector
|
|
57
|
+
- "Best practice" suggestions that aren't actual vulnerabilities
|
|
58
|
+
- Missing features (like rate limiting) unless there's clear risk
|
|
59
|
+
- Source maps or debug settings in dev tools
|
|
60
|
+
|
|
61
|
+
AVOID FALSE POSITIVES: Only report issues you're confident about. If uncertain, don't include it. Quality over quantity - 5 or fewer findings unless there are genuine security holes.
|
|
51
62
|
|
|
52
|
-
|
|
63
|
+
Severity guide:
|
|
64
|
+
- error: Exploitable vulnerability with clear attack vector
|
|
65
|
+
- warning: Potential vulnerability requiring specific conditions
|
|
66
|
+
- info: Security improvement suggestion (use sparingly)
|
|
53
67
|
|
|
54
68
|
Respond with valid JSON only. No markdown, no explanations outside the JSON.`,
|
|
55
69
|
};
|
|
56
70
|
/**
|
|
57
71
|
* Build the user prompt for a specific pass
|
|
58
72
|
*/
|
|
59
|
-
function buildPassPrompt(context, customPrompt) {
|
|
73
|
+
export function buildPassPrompt(context, customPrompt) {
|
|
60
74
|
let prompt = '';
|
|
61
75
|
// Add custom prompt if provided
|
|
62
76
|
if (customPrompt) {
|
|
@@ -68,10 +82,10 @@ function buildPassPrompt(context, customPrompt) {
|
|
|
68
82
|
prompt += `- **Files in This Review**: ${context.files.length}\n`;
|
|
69
83
|
prompt += `- **Frameworks**: ${context.metadata.frameworks.join(', ') || 'None detected'}\n`;
|
|
70
84
|
prompt += `- **Focus Areas**: ${context.metadata.focusAreas.join(', ')}\n\n`;
|
|
71
|
-
// Add file tree for architecture pass
|
|
72
|
-
if (context.pass === 'architecture') {
|
|
73
|
-
prompt += `## File Tree\n\`\`\`\n`;
|
|
74
|
-
prompt += context.
|
|
85
|
+
// Add full file tree for architecture pass (shows ALL existing files)
|
|
86
|
+
if (context.pass === 'architecture' && context.metadata.fullFileTree) {
|
|
87
|
+
prompt += `## Complete File Tree (${context.metadata.fullFileTree.length} files - these ALL EXIST)\n\`\`\`\n`;
|
|
88
|
+
prompt += context.metadata.fullFileTree.join('\n');
|
|
75
89
|
prompt += `\n\`\`\`\n\n`;
|
|
76
90
|
}
|
|
77
91
|
prompt += `## Files to Review\n\n`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passes.js","sourceRoot":"","sources":["../../../../src/core/analyzer/ai/passes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"passes.js","sourceRoot":"","sources":["../../../../src/core/analyzer/ai/passes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,11 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* AI review prompts
|
|
4
3
|
* Contains the system and user prompts for code review
|
|
5
4
|
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.DEFAULT_SYSTEM_PROMPT = void 0;
|
|
8
|
-
exports.buildUserPrompt = buildUserPrompt;
|
|
9
|
-
exports.parseAIResponse = parseAIResponse;
|
|
10
5
|
/**
|
|
11
6
|
* Default system prompt for code review
|
|
12
7
|
*/
|
|
13
|
-
|
|
8
|
+
export const DEFAULT_SYSTEM_PROMPT = `You are an expert senior software engineer conducting a thorough code review. Your goal is to identify issues that matter and provide actionable feedback.
|
|
14
9
|
|
|
15
10
|
Focus on:
|
|
16
11
|
1. **Security vulnerabilities** - SQL injection, XSS, command injection, auth issues, secrets exposure
|
|
@@ -26,7 +21,7 @@ You MUST respond with valid JSON only. No markdown, no explanations outside the
|
|
|
26
21
|
/**
|
|
27
22
|
* Build the user prompt with codebase content
|
|
28
23
|
*/
|
|
29
|
-
function buildUserPrompt(files, frameworks, customPrompt) {
|
|
24
|
+
export function buildUserPrompt(files, frameworks, customPrompt) {
|
|
30
25
|
const frameworkList = frameworks.frameworks
|
|
31
26
|
.map((f) => `${f.framework} (${Math.round(f.confidence * 100)}%)`)
|
|
32
27
|
.join(', ');
|
|
@@ -113,7 +108,7 @@ function getLanguageId(extension) {
|
|
|
113
108
|
/**
|
|
114
109
|
* Parse the AI response, handling various formats
|
|
115
110
|
*/
|
|
116
|
-
function parseAIResponse(response) {
|
|
111
|
+
export function parseAIResponse(response) {
|
|
117
112
|
// Try to extract JSON from the response
|
|
118
113
|
let jsonStr = response.trim();
|
|
119
114
|
// Remove markdown code blocks if present
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../../src/core/analyzer/ai/prompts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../../src/core/analyzer/ai/prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;sFAYiD,CAAC;AAEvF;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAiB,EACjB,UAA2B,EAC3B,YAAqB;IAErB,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU;SACxC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC;SACjE,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAErD,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,gCAAgC;IAChC,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,IAAI,sCAAsC,YAAY,MAAM,CAAC;IACrE,CAAC;IAED,MAAM,IAAI;2BACe,UAAU,CAAC,OAAO,IAAI,eAAe;wBACxC,aAAa,IAAI,eAAe;mBACrC,YAAY,IAAI,SAAS;yBACnB,KAAK,CAAC,MAAM;;;;CAIpC,CAAC;IAEA,oBAAoB;IACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,OAAO,IAAI,CAAC,YAAY,WAAW,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,OAAO,cAAc,CAAC;QAC5G,CAAC;IACH,CAAC;IAED,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4FAkCgF,CAAC;IAE3F,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,SAAiB;IACtC,MAAM,GAAG,GAA2B;QAClC,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,QAAQ;KACpB,CAAC;IACF,OAAO,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;AACxD,CAAC;AAiBD;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,wCAAwC;IACxC,IAAI,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE9B,yCAAyC;IACzC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAChE,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,0CAA0C;IAC1C,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACjD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAqB,CAAC;QAEvD,qBAAqB;QACrB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC;QAClE,CAAC;QAED,qBAAqB;QACrB,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5C,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,YAAY;YAChC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC;YACvC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,SAAS;YACzB,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACrD,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,yBAAyB;YAC/C,UAAU,EAAE,CAAC,CAAC,UAAU;SACzB,CAAC,CAAC,CAAC;QAEJ,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;QACzC,OAAO;YACL,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,+BAA+B,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SAClE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,QAAgB;IACzC,MAAM,UAAU,GAAG,QAAQ,EAAE,WAAW,EAAE,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,0BAA0B;IAC1B,IAAI,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC;IACvE,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9C,IAAI,UAAU,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC;IACxC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,14 +1,7 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Code Slicing Utilities
|
|
4
3
|
* Extract relevant portions of large files for AI analysis
|
|
5
4
|
*/
|
|
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
5
|
/** Context lines to include around a point of interest */
|
|
13
6
|
const CONTEXT_LINES = 10;
|
|
14
7
|
/** Maximum slice size in characters */
|
|
@@ -35,7 +28,7 @@ const IMPORTANT_PATTERNS = [
|
|
|
35
28
|
/**
|
|
36
29
|
* Extract relevant code slices from file content
|
|
37
30
|
*/
|
|
38
|
-
function extractSlices(content, filePath, options = {}) {
|
|
31
|
+
export function extractSlices(content, filePath, options = {}) {
|
|
39
32
|
const lines = content.split('\n');
|
|
40
33
|
const slices = [];
|
|
41
34
|
const { staticFindings = [], includeExports = true, includeSecurity = true, includeDefinitions = true, maxTotalSize = 20000, } = options;
|
|
@@ -190,7 +183,7 @@ function sliceOverlaps(existing, newSlice) {
|
|
|
190
183
|
/**
|
|
191
184
|
* Merge overlapping slices into contiguous blocks
|
|
192
185
|
*/
|
|
193
|
-
function mergeOverlappingSlices(slices) {
|
|
186
|
+
export function mergeOverlappingSlices(slices) {
|
|
194
187
|
if (slices.length === 0)
|
|
195
188
|
return [];
|
|
196
189
|
// Sort by start line
|
|
@@ -227,7 +220,7 @@ function combineReasons(reason1, reason2) {
|
|
|
227
220
|
* Reconstruct slice content from original file
|
|
228
221
|
* Used after merging to get correct content
|
|
229
222
|
*/
|
|
230
|
-
function reconstructSliceContent(content, slices) {
|
|
223
|
+
export function reconstructSliceContent(content, slices) {
|
|
231
224
|
const lines = content.split('\n');
|
|
232
225
|
return slices.map((slice) => ({
|
|
233
226
|
...slice,
|
|
@@ -238,13 +231,13 @@ function reconstructSliceContent(content, slices) {
|
|
|
238
231
|
* Estimate token count for content (rough approximation)
|
|
239
232
|
* Uses ~4 characters per token heuristic
|
|
240
233
|
*/
|
|
241
|
-
function estimateTokens(content) {
|
|
234
|
+
export function estimateTokens(content) {
|
|
242
235
|
return Math.ceil(content.length / 4);
|
|
243
236
|
}
|
|
244
237
|
/**
|
|
245
238
|
* Get a summary of what a file exports (for architecture pass)
|
|
246
239
|
*/
|
|
247
|
-
function getExportSummary(content, extension) {
|
|
240
|
+
export function getExportSummary(content, extension) {
|
|
248
241
|
const exports = [];
|
|
249
242
|
if (['.ts', '.tsx', '.js', '.jsx', '.mjs'].includes(extension)) {
|
|
250
243
|
// Named exports with types
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slices.js","sourceRoot":"","sources":["../../../../src/core/analyzer/ai/slices.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"slices.js","sourceRoot":"","sources":["../../../../src/core/analyzer/ai/slices.ts"],"names":[],"mappings":"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"}
|