codeguard-testgen 1.0.10 ā 1.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +297 -2
- package/dist/config.d.ts +26 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +68 -2
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1425 -507
- package/dist/index.js.map +1 -1
- package/dist/reviewEngine.d.ts +38 -0
- package/dist/reviewEngine.d.ts.map +1 -0
- package/dist/reviewEngine.js +571 -0
- package/dist/reviewEngine.js.map +1 -0
- package/dist/toolExecutors.d.ts +82 -0
- package/dist/toolExecutors.d.ts.map +1 -0
- package/dist/toolExecutors.js +354 -0
- package/dist/toolExecutors.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { ReviewStep, ToolConfig } from './config';
|
|
2
|
+
/**
|
|
3
|
+
* Semgrep finding structure
|
|
4
|
+
*/
|
|
5
|
+
export interface SemgrepFinding {
|
|
6
|
+
check_id: string;
|
|
7
|
+
path: string;
|
|
8
|
+
start: {
|
|
9
|
+
line: number;
|
|
10
|
+
col: number;
|
|
11
|
+
};
|
|
12
|
+
end: {
|
|
13
|
+
line: number;
|
|
14
|
+
col: number;
|
|
15
|
+
};
|
|
16
|
+
extra: {
|
|
17
|
+
message: string;
|
|
18
|
+
severity: string;
|
|
19
|
+
metadata?: any;
|
|
20
|
+
lines?: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Semgrep result structure
|
|
25
|
+
*/
|
|
26
|
+
export interface SemgrepResult {
|
|
27
|
+
results: SemgrepFinding[];
|
|
28
|
+
errors: any[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Structured finding for review
|
|
32
|
+
*/
|
|
33
|
+
export interface ToolFinding {
|
|
34
|
+
tool: string;
|
|
35
|
+
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
36
|
+
category: string;
|
|
37
|
+
message: string;
|
|
38
|
+
file: string;
|
|
39
|
+
line: number;
|
|
40
|
+
code?: string;
|
|
41
|
+
ruleId: string;
|
|
42
|
+
validated?: boolean;
|
|
43
|
+
aiExplanation?: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Execute semgrep on specified files
|
|
47
|
+
*/
|
|
48
|
+
export declare function executeSemgrep(files: string[], config: ToolConfig, stepConfig?: any): Promise<SemgrepResult>;
|
|
49
|
+
/**
|
|
50
|
+
* Parse semgrep results into structured findings
|
|
51
|
+
*/
|
|
52
|
+
export declare function parseSemgrepResults(semgrepResult: SemgrepResult, changedFunctions: Map<string, {
|
|
53
|
+
start: number;
|
|
54
|
+
end: number;
|
|
55
|
+
}[]>): ToolFinding[];
|
|
56
|
+
/**
|
|
57
|
+
* Validate tool findings using AI to filter false positives
|
|
58
|
+
*/
|
|
59
|
+
export declare function validateToolFindings(findings: ToolFinding[], validationPrompt: string, aiValidationFunction: (prompt: string) => Promise<any>): Promise<ToolFinding[]>;
|
|
60
|
+
/**
|
|
61
|
+
* Execute a tool-based review step
|
|
62
|
+
*/
|
|
63
|
+
export declare function executeToolStep(step: ReviewStep, files: Array<{
|
|
64
|
+
filePath: string;
|
|
65
|
+
diff: string;
|
|
66
|
+
functions: string[];
|
|
67
|
+
}>, toolConfig: ToolConfig, changedFunctions: Map<string, {
|
|
68
|
+
start: number;
|
|
69
|
+
end: number;
|
|
70
|
+
}[]>, aiValidationFunction?: (prompt: string) => Promise<string>): Promise<ToolFinding[]>;
|
|
71
|
+
/**
|
|
72
|
+
* Extract changed function line ranges from git diff
|
|
73
|
+
*/
|
|
74
|
+
export declare function extractChangedFunctionRanges(files: Array<{
|
|
75
|
+
filePath: string;
|
|
76
|
+
diff: string;
|
|
77
|
+
functions: string[];
|
|
78
|
+
}>): Map<string, {
|
|
79
|
+
start: number;
|
|
80
|
+
end: number;
|
|
81
|
+
}[]>;
|
|
82
|
+
//# sourceMappingURL=toolExecutors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolExecutors.d.ts","sourceRoot":"","sources":["../src/toolExecutors.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAIlD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,GAAG,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,EAAE,GAAG,EAAE,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,UAAU,EAClB,UAAU,CAAC,EAAE,GAAG,GACf,OAAO,CAAC,aAAa,CAAC,CA2ExB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,GAC9D,WAAW,EAAE,CA2Df;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,WAAW,EAAE,EACvB,gBAAgB,EAAE,MAAM,EACxB,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,GACrD,OAAO,CAAC,WAAW,EAAE,CAAC,CA8FxB;AAmDD;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAC,CAAC,EACnE,UAAU,EAAE,UAAU,EACtB,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,EAC/D,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GACzD,OAAO,CAAC,WAAW,EAAE,CAAC,CAqCxB;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAC,CAAC,GAClE,GAAG,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CA0B/C"}
|
|
@@ -0,0 +1,354 @@
|
|
|
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.executeSemgrep = executeSemgrep;
|
|
37
|
+
exports.parseSemgrepResults = parseSemgrepResults;
|
|
38
|
+
exports.validateToolFindings = validateToolFindings;
|
|
39
|
+
exports.executeToolStep = executeToolStep;
|
|
40
|
+
exports.extractChangedFunctionRanges = extractChangedFunctionRanges;
|
|
41
|
+
const child_process_1 = require("child_process");
|
|
42
|
+
const util_1 = require("util");
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
45
|
+
/**
|
|
46
|
+
* Execute semgrep on specified files
|
|
47
|
+
*/
|
|
48
|
+
async function executeSemgrep(files, config, stepConfig) {
|
|
49
|
+
if (files.length === 0) {
|
|
50
|
+
return { results: [], errors: [] };
|
|
51
|
+
}
|
|
52
|
+
const rulesets = stepConfig?.rulesets || ['p/default'];
|
|
53
|
+
const severity = stepConfig?.severity || ['ERROR', 'WARNING'];
|
|
54
|
+
const excludeRules = stepConfig?.excludeRules || [];
|
|
55
|
+
try {
|
|
56
|
+
// Build semgrep command
|
|
57
|
+
const configArgs = rulesets.map(r => `--config ${r}`).join(' ');
|
|
58
|
+
const severityArgs = severity.map(s => `--severity ${s}`).join(' ');
|
|
59
|
+
const excludeArgs = excludeRules.length > 0
|
|
60
|
+
? excludeRules.map(r => `--exclude-rule ${r}`).join(' ')
|
|
61
|
+
: '';
|
|
62
|
+
const fileArgs = files.join(' ');
|
|
63
|
+
const timeoutMs = (config.timeout || 60) * 1000;
|
|
64
|
+
const cmd = `${config.binaryPath} ${configArgs} ${severityArgs} ${excludeArgs} --json ${fileArgs}`;
|
|
65
|
+
console.log(` Running: semgrep with ${rulesets.join(', ')}`);
|
|
66
|
+
const { stdout, stderr } = await execAsync(cmd, {
|
|
67
|
+
timeout: timeoutMs,
|
|
68
|
+
maxBuffer: 10 * 1024 * 1024 // 10MB buffer
|
|
69
|
+
});
|
|
70
|
+
if (stderr && !stderr.includes('Scanning')) {
|
|
71
|
+
console.warn(` Semgrep warnings: ${stderr}`);
|
|
72
|
+
}
|
|
73
|
+
const result = JSON.parse(stdout);
|
|
74
|
+
// Filter out warnings (level: 'warn') from errors - these are Pro-only rules
|
|
75
|
+
if (result.errors && result.errors.length > 0) {
|
|
76
|
+
const actualErrors = result.errors.filter((e) => e.level !== 'warn');
|
|
77
|
+
const warnings = result.errors.filter((e) => e.level === 'warn');
|
|
78
|
+
if (warnings.length > 0) {
|
|
79
|
+
console.log(` ā¹ļø ${warnings.length} Pro-only rule(s) skipped (upgrade for full coverage)`);
|
|
80
|
+
}
|
|
81
|
+
// Only keep actual errors
|
|
82
|
+
result.errors = actualErrors;
|
|
83
|
+
}
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
// Check if semgrep is not installed
|
|
88
|
+
if (error.code === 'ENOENT' || error.message.includes('not found')) {
|
|
89
|
+
console.warn(`ā ļø Semgrep not found. Please install: pip install semgrep`);
|
|
90
|
+
return { results: [], errors: [{ message: 'Semgrep not installed' }] };
|
|
91
|
+
}
|
|
92
|
+
// Timeout error
|
|
93
|
+
if (error.killed || error.signal === 'SIGTERM') {
|
|
94
|
+
console.warn(`ā ļø Semgrep timeout after ${config.timeout}s`);
|
|
95
|
+
return { results: [], errors: [{ message: 'Timeout' }] };
|
|
96
|
+
}
|
|
97
|
+
// Try to parse partial results
|
|
98
|
+
if (error.stdout) {
|
|
99
|
+
try {
|
|
100
|
+
const result = JSON.parse(error.stdout);
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// Couldn't parse, return error
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
console.error(` Semgrep error: ${error.message}`);
|
|
108
|
+
return { results: [], errors: [{ message: error.message }] };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Parse semgrep results into structured findings
|
|
113
|
+
*/
|
|
114
|
+
function parseSemgrepResults(semgrepResult, changedFunctions) {
|
|
115
|
+
const findings = [];
|
|
116
|
+
for (const result of semgrepResult.results) {
|
|
117
|
+
// Normalize file path
|
|
118
|
+
const filePath = result.path.startsWith('./')
|
|
119
|
+
? result.path.substring(2)
|
|
120
|
+
: result.path;
|
|
121
|
+
// Check if finding is in a changed function
|
|
122
|
+
const functionRanges = changedFunctions.get(filePath) || [];
|
|
123
|
+
const isInChangedFunction = functionRanges.some(range => result.start.line >= range.start && result.start.line <= range.end);
|
|
124
|
+
// Only include findings in changed code
|
|
125
|
+
if (!isInChangedFunction && functionRanges.length > 0) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
// Map semgrep severity to our severity levels
|
|
129
|
+
let severity;
|
|
130
|
+
const semgrepSev = result.extra.severity?.toUpperCase();
|
|
131
|
+
if (semgrepSev === 'ERROR') {
|
|
132
|
+
severity = 'high';
|
|
133
|
+
}
|
|
134
|
+
else if (semgrepSev === 'WARNING') {
|
|
135
|
+
severity = 'medium';
|
|
136
|
+
}
|
|
137
|
+
else if (semgrepSev === 'INFO') {
|
|
138
|
+
severity = 'low';
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
severity = 'medium';
|
|
142
|
+
}
|
|
143
|
+
// Determine category from metadata or rule ID
|
|
144
|
+
let category = 'security';
|
|
145
|
+
const ruleId = result.check_id.toLowerCase();
|
|
146
|
+
if (ruleId.includes('performance')) {
|
|
147
|
+
category = 'performance';
|
|
148
|
+
}
|
|
149
|
+
else if (ruleId.includes('bug') || ruleId.includes('correctness')) {
|
|
150
|
+
category = 'bugs';
|
|
151
|
+
}
|
|
152
|
+
else if (ruleId.includes('style') || ruleId.includes('best-practice')) {
|
|
153
|
+
category = 'quality';
|
|
154
|
+
}
|
|
155
|
+
findings.push({
|
|
156
|
+
tool: 'semgrep',
|
|
157
|
+
severity,
|
|
158
|
+
category,
|
|
159
|
+
message: result.extra.message,
|
|
160
|
+
file: filePath,
|
|
161
|
+
line: result.start.line,
|
|
162
|
+
code: result.extra.lines,
|
|
163
|
+
ruleId: result.check_id,
|
|
164
|
+
validated: false
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return findings;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Validate tool findings using AI to filter false positives
|
|
171
|
+
*/
|
|
172
|
+
async function validateToolFindings(findings, validationPrompt, aiValidationFunction) {
|
|
173
|
+
if (findings.length === 0) {
|
|
174
|
+
return [];
|
|
175
|
+
}
|
|
176
|
+
// Group findings by file for efficient validation
|
|
177
|
+
const findingsByFile = new Map();
|
|
178
|
+
for (const finding of findings) {
|
|
179
|
+
if (!findingsByFile.has(finding.file)) {
|
|
180
|
+
findingsByFile.set(finding.file, []);
|
|
181
|
+
}
|
|
182
|
+
findingsByFile.get(finding.file).push(finding);
|
|
183
|
+
}
|
|
184
|
+
const validatedFindings = [];
|
|
185
|
+
// Validate findings file by file
|
|
186
|
+
for (const [file, fileFindings] of findingsByFile.entries()) {
|
|
187
|
+
try {
|
|
188
|
+
// Read file content for context
|
|
189
|
+
let fileContent = '';
|
|
190
|
+
try {
|
|
191
|
+
fileContent = fs.readFileSync(file, 'utf-8');
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// If can't read file, skip validation for these findings
|
|
195
|
+
validatedFindings.push(...fileFindings.map(f => ({ ...f, validated: true })));
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
// Build validation prompt
|
|
199
|
+
const findingsDescription = fileFindings.map((f, idx) => `${idx + 1}. [${f.severity.toUpperCase()}] ${f.ruleId}
|
|
200
|
+
Line ${f.line}: ${f.message}
|
|
201
|
+
Code: ${f.code || 'N/A'}`).join('\n\n');
|
|
202
|
+
const prompt = `${validationPrompt}
|
|
203
|
+
|
|
204
|
+
File: ${file}
|
|
205
|
+
Total findings: ${fileFindings.length}
|
|
206
|
+
|
|
207
|
+
Findings to validate:
|
|
208
|
+
${findingsDescription}
|
|
209
|
+
|
|
210
|
+
File content (relevant sections):
|
|
211
|
+
\`\`\`
|
|
212
|
+
${getRelevantCodeSections(fileContent, fileFindings)}
|
|
213
|
+
\`\`\`
|
|
214
|
+
|
|
215
|
+
For each finding, respond with:
|
|
216
|
+
1. Finding number
|
|
217
|
+
2. Status: REAL or FALSE_POSITIVE
|
|
218
|
+
3. Brief explanation (one sentence)
|
|
219
|
+
|
|
220
|
+
Format:
|
|
221
|
+
1. REAL - [explanation]
|
|
222
|
+
2. FALSE_POSITIVE - [explanation]
|
|
223
|
+
...`;
|
|
224
|
+
// Call AI for validation
|
|
225
|
+
const response = await aiValidationFunction(prompt);
|
|
226
|
+
// Parse AI response to determine which are false positives
|
|
227
|
+
const validationResults = parseValidationResponse(response);
|
|
228
|
+
// Mark findings based on AI validation
|
|
229
|
+
for (let i = 0; i < fileFindings.length; i++) {
|
|
230
|
+
const validation = validationResults.get(i + 1);
|
|
231
|
+
if (validation) {
|
|
232
|
+
fileFindings[i].validated = validation.isReal;
|
|
233
|
+
fileFindings[i].aiExplanation = validation.explanation;
|
|
234
|
+
if (validation.isReal) {
|
|
235
|
+
validatedFindings.push(fileFindings[i]);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
// If AI didn't validate, include it to be safe
|
|
240
|
+
fileFindings[i].validated = true;
|
|
241
|
+
validatedFindings.push(fileFindings[i]);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
console.warn(` Warning: Could not validate findings for ${file}, including all`);
|
|
247
|
+
// On error, include all findings to be safe
|
|
248
|
+
validatedFindings.push(...fileFindings.map(f => ({ ...f, validated: true })));
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
const filteredCount = findings.length - validatedFindings.length;
|
|
252
|
+
if (filteredCount > 0) {
|
|
253
|
+
console.log(` AI filtered out ${filteredCount} false positive(s)`);
|
|
254
|
+
}
|
|
255
|
+
return validatedFindings;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Get relevant code sections around findings
|
|
259
|
+
*/
|
|
260
|
+
function getRelevantCodeSections(fileContent, findings) {
|
|
261
|
+
const lines = fileContent.split('\n');
|
|
262
|
+
const sections = [];
|
|
263
|
+
const contextLines = 5;
|
|
264
|
+
for (const finding of findings) {
|
|
265
|
+
const startLine = Math.max(0, finding.line - contextLines - 1);
|
|
266
|
+
const endLine = Math.min(lines.length, finding.line + contextLines);
|
|
267
|
+
const section = lines.slice(startLine, endLine)
|
|
268
|
+
.map((line, idx) => {
|
|
269
|
+
const lineNum = startLine + idx + 1;
|
|
270
|
+
const marker = lineNum === finding.line ? '>' : ' ';
|
|
271
|
+
return `${marker} ${lineNum.toString().padStart(4)} | ${line}`;
|
|
272
|
+
})
|
|
273
|
+
.join('\n');
|
|
274
|
+
sections.push(`\n// Around line ${finding.line}:\n${section}`);
|
|
275
|
+
}
|
|
276
|
+
return sections.join('\n\n');
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Parse AI validation response
|
|
280
|
+
*/
|
|
281
|
+
function parseValidationResponse(response) {
|
|
282
|
+
const results = new Map();
|
|
283
|
+
// Look for patterns like "1. REAL - explanation" or "2. FALSE_POSITIVE - explanation"
|
|
284
|
+
const lines = response.split('\n');
|
|
285
|
+
for (const line of lines) {
|
|
286
|
+
const match = line.match(/^(\d+)\.\s*(REAL|FALSE_POSITIVE)\s*[-:]\s*(.+)$/i);
|
|
287
|
+
if (match) {
|
|
288
|
+
const findingNum = parseInt(match[1], 10);
|
|
289
|
+
const isReal = match[2].toUpperCase() === 'REAL';
|
|
290
|
+
const explanation = match[3].trim();
|
|
291
|
+
results.set(findingNum, { isReal, explanation });
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return results;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Execute a tool-based review step
|
|
298
|
+
*/
|
|
299
|
+
async function executeToolStep(step, files, toolConfig, changedFunctions, aiValidationFunction) {
|
|
300
|
+
console.log(`\nš§ Executing tool step: ${step.name}`);
|
|
301
|
+
if (step.tool === 'semgrep') {
|
|
302
|
+
// Execute semgrep
|
|
303
|
+
const filePaths = files.map(f => f.filePath);
|
|
304
|
+
const semgrepResult = await executeSemgrep(filePaths, toolConfig, step.config);
|
|
305
|
+
if (semgrepResult.errors.length > 0) {
|
|
306
|
+
console.error(` ā ${semgrepResult.errors.length} error(s) during scan`);
|
|
307
|
+
for (const error of semgrepResult.errors.slice(0, 2)) {
|
|
308
|
+
console.error(` ${error.message?.substring(0, 80)}...`);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
console.log(` ā Found ${semgrepResult.results.length} potential issue(s)`);
|
|
312
|
+
// Parse results
|
|
313
|
+
const findings = parseSemgrepResults(semgrepResult, changedFunctions);
|
|
314
|
+
console.log(` ${findings.length} finding(s) in changed code`);
|
|
315
|
+
// Validate with AI if enabled
|
|
316
|
+
if (step.config?.aiValidation && aiValidationFunction && findings.length > 0) {
|
|
317
|
+
console.log(` Validating findings with AI...`);
|
|
318
|
+
const validationPrompt = step.config.aiValidationPrompt ||
|
|
319
|
+
'Review these static analysis findings and determine which are real issues vs false positives.';
|
|
320
|
+
const validated = await validateToolFindings(findings, validationPrompt, aiValidationFunction);
|
|
321
|
+
console.log(` ā ${validated.length} validated finding(s)`);
|
|
322
|
+
return validated;
|
|
323
|
+
}
|
|
324
|
+
return findings;
|
|
325
|
+
}
|
|
326
|
+
console.warn(` Unknown tool: ${step.tool}`);
|
|
327
|
+
return [];
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Extract changed function line ranges from git diff
|
|
331
|
+
*/
|
|
332
|
+
function extractChangedFunctionRanges(files) {
|
|
333
|
+
const rangeMap = new Map();
|
|
334
|
+
for (const file of files) {
|
|
335
|
+
const ranges = [];
|
|
336
|
+
// Parse diff to find changed line ranges
|
|
337
|
+
const diffLines = file.diff.split('\n');
|
|
338
|
+
let currentLine = 0;
|
|
339
|
+
for (const line of diffLines) {
|
|
340
|
+
// Look for chunk headers like @@ -10,5 +10,7 @@
|
|
341
|
+
const chunkMatch = line.match(/^@@\s+-\d+,?\d*\s+\+(\d+),?(\d*)\s+@@/);
|
|
342
|
+
if (chunkMatch) {
|
|
343
|
+
currentLine = parseInt(chunkMatch[1], 10);
|
|
344
|
+
const count = chunkMatch[2] ? parseInt(chunkMatch[2], 10) : 1;
|
|
345
|
+
ranges.push({ start: currentLine, end: currentLine + count });
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
if (ranges.length > 0) {
|
|
349
|
+
rangeMap.set(file.filePath, ranges);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return rangeMap;
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=toolExecutors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolExecutors.js","sourceRoot":"","sources":["../src/toolExecutors.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED