@opencodereview/core 2.0.2 → 2.1.1
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/ai/v4/index.d.ts +3 -1
- package/dist/ai/v4/index.d.ts.map +1 -1
- package/dist/ai/v4/index.js +2 -0
- package/dist/ai/v4/index.js.map +1 -1
- package/dist/ai/v4/llm/index.d.ts +1 -0
- package/dist/ai/v4/llm/index.d.ts.map +1 -1
- package/dist/ai/v4/llm/index.js +1 -0
- package/dist/ai/v4/llm/index.js.map +1 -1
- package/dist/ai/v4/llm/provider-factory.d.ts +59 -0
- package/dist/ai/v4/llm/provider-factory.d.ts.map +1 -0
- package/dist/ai/v4/llm/provider-factory.js +87 -0
- package/dist/ai/v4/llm/provider-factory.js.map +1 -0
- package/dist/ai/v4/pipeline.d.ts.map +1 -1
- package/dist/ai/v4/pipeline.js +2 -8
- package/dist/ai/v4/pipeline.js.map +1 -1
- package/dist/ai/v4/types.d.ts +42 -7
- package/dist/ai/v4/types.d.ts.map +1 -1
- package/dist/ai/v4/types.js +40 -1
- package/dist/ai/v4/types.js.map +1 -1
- package/dist/ai-healer/auto-fix-engine.d.ts +98 -0
- package/dist/ai-healer/auto-fix-engine.d.ts.map +1 -0
- package/dist/ai-healer/auto-fix-engine.js +409 -0
- package/dist/ai-healer/auto-fix-engine.js.map +1 -0
- package/dist/ai-healer/heal-reporter.d.ts +22 -0
- package/dist/ai-healer/heal-reporter.d.ts.map +1 -0
- package/dist/ai-healer/heal-reporter.js +137 -0
- package/dist/ai-healer/heal-reporter.js.map +1 -0
- package/dist/ai-healer/ide-rules-generator.d.ts +46 -0
- package/dist/ai-healer/ide-rules-generator.d.ts.map +1 -0
- package/dist/ai-healer/ide-rules-generator.js +214 -0
- package/dist/ai-healer/ide-rules-generator.js.map +1 -0
- package/dist/config/v4-config.d.ts +3 -1
- package/dist/config/v4-config.d.ts.map +1 -1
- package/dist/config/v4-config.js.map +1 -1
- package/dist/detectors/registry/go-packages.d.ts +16 -0
- package/dist/detectors/registry/go-packages.d.ts.map +1 -0
- package/dist/detectors/registry/go-packages.js +181 -0
- package/dist/detectors/registry/go-packages.js.map +1 -0
- package/dist/detectors/registry/java-packages.d.ts +16 -0
- package/dist/detectors/registry/java-packages.d.ts.map +1 -0
- package/dist/detectors/registry/java-packages.js +144 -0
- package/dist/detectors/registry/java-packages.js.map +1 -0
- package/dist/detectors/registry/kotlin-packages.d.ts +15 -0
- package/dist/detectors/registry/kotlin-packages.d.ts.map +1 -0
- package/dist/detectors/registry/kotlin-packages.js +125 -0
- package/dist/detectors/registry/kotlin-packages.js.map +1 -0
- package/dist/detectors/registry/python-packages.d.ts +16 -0
- package/dist/detectors/registry/python-packages.d.ts.map +1 -0
- package/dist/detectors/registry/python-packages.js +113 -0
- package/dist/detectors/registry/python-packages.js.map +1 -0
- package/dist/detectors/v4/index.d.ts +5 -0
- package/dist/detectors/v4/index.d.ts.map +1 -1
- package/dist/detectors/v4/index.js +10 -0
- package/dist/detectors/v4/index.js.map +1 -1
- package/dist/detectors/v4/language-specific.d.ts +47 -0
- package/dist/detectors/v4/language-specific.d.ts.map +1 -0
- package/dist/detectors/v4/language-specific.js +560 -0
- package/dist/detectors/v4/language-specific.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/scanner/v4-scanner.d.ts +3 -1
- package/dist/scanner/v4-scanner.d.ts.map +1 -1
- package/dist/scanner/v4-scanner.js +1 -0
- package/dist/scanner/v4-scanner.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Auto-Fix Engine
|
|
3
|
+
*
|
|
4
|
+
* Executes AI-powered fixes on files that scored below the threshold.
|
|
5
|
+
* Uses existing AI providers (Ollama/OpenAI) and PromptBuilder.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, writeFileSync, copyFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
8
|
+
import { resolve, dirname, join } from 'node:path';
|
|
9
|
+
import { OllamaProvider } from '../ai/ollama-provider.js';
|
|
10
|
+
import { PromptBuilder } from './prompt-builder.js';
|
|
11
|
+
import { createRemoteLLMProvider, createLocalLLMProvider } from '../ai/v4/llm/provider-factory.js';
|
|
12
|
+
import { ALL_LLM_PROVIDERS } from '../ai/v4/types.js';
|
|
13
|
+
// ─── Diff Utility ──────────────────────────────────────────────────
|
|
14
|
+
/**
|
|
15
|
+
* Generate a simple unified-style diff between two strings.
|
|
16
|
+
*/
|
|
17
|
+
export function simpleDiff(original, fixed, filename) {
|
|
18
|
+
const origLines = original.split('\n');
|
|
19
|
+
const fixedLines = fixed.split('\n');
|
|
20
|
+
const lines = [];
|
|
21
|
+
lines.push(`--- ${filename} (original)`);
|
|
22
|
+
lines.push(`+++ ${filename} (fixed)`);
|
|
23
|
+
// Simple line-by-line diff
|
|
24
|
+
const maxLen = Math.max(origLines.length, fixedLines.length);
|
|
25
|
+
let contextLines = 0;
|
|
26
|
+
let inHunk = false;
|
|
27
|
+
let hunkStart = 0;
|
|
28
|
+
for (let i = 0; i < maxLen; i++) {
|
|
29
|
+
const origLine = i < origLines.length ? origLines[i] : null;
|
|
30
|
+
const fixedLine = i < fixedLines.length ? fixedLines[i] : null;
|
|
31
|
+
if (origLine !== fixedLine) {
|
|
32
|
+
if (!inHunk) {
|
|
33
|
+
hunkStart = Math.max(0, i - 2);
|
|
34
|
+
lines.push(`@@ -${hunkStart + 1},${Math.min(3, origLines.length - hunkStart)} +${hunkStart + 1},${Math.min(3, fixedLines.length - hunkStart)} @@`);
|
|
35
|
+
// Context lines before
|
|
36
|
+
for (let c = hunkStart; c < i; c++) {
|
|
37
|
+
lines.push(` ${origLines[c]}`);
|
|
38
|
+
}
|
|
39
|
+
inHunk = true;
|
|
40
|
+
}
|
|
41
|
+
if (origLine !== null)
|
|
42
|
+
lines.push(`-${origLine}`);
|
|
43
|
+
if (fixedLine !== null)
|
|
44
|
+
lines.push(`+${fixedLine}`);
|
|
45
|
+
contextLines = 0;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
contextLines++;
|
|
49
|
+
if (inHunk && contextLines > 2) {
|
|
50
|
+
inHunk = false;
|
|
51
|
+
}
|
|
52
|
+
if (inHunk) {
|
|
53
|
+
lines.push(` ${origLine}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return lines.join('\n');
|
|
58
|
+
}
|
|
59
|
+
// ─── AI Code Generation ────────────────────────────────────────────
|
|
60
|
+
/**
|
|
61
|
+
* Call an AI provider to generate fixed code based on a prompt and source.
|
|
62
|
+
*/
|
|
63
|
+
async function generateFixedCode(prompt, source, filename, options) {
|
|
64
|
+
const fullPrompt = `${prompt}
|
|
65
|
+
|
|
66
|
+
Here is the file content to fix:
|
|
67
|
+
|
|
68
|
+
\`\`\`
|
|
69
|
+
${source}
|
|
70
|
+
\`\`\`
|
|
71
|
+
|
|
72
|
+
Return ONLY the complete fixed file content. Do NOT include explanations, markdown fences, or any text outside the code block. Return the raw code only.`;
|
|
73
|
+
const strategy = options.strategy || 'local-first';
|
|
74
|
+
const useProvider = options.provider;
|
|
75
|
+
// If a specific V4 provider is configured, use the provider factory
|
|
76
|
+
if (useProvider && ALL_LLM_PROVIDERS.includes(useProvider)) {
|
|
77
|
+
try {
|
|
78
|
+
const isOllama = useProvider === 'ollama';
|
|
79
|
+
let llmProvider;
|
|
80
|
+
if (isOllama) {
|
|
81
|
+
llmProvider = createLocalLLMProvider(options.ollamaModel || 'qwen3-coder', options.ollamaUrl || 'http://localhost:11434');
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
llmProvider = createRemoteLLMProvider({
|
|
85
|
+
provider: useProvider,
|
|
86
|
+
model: options.openaiModel || options.ollamaModel || 'gpt-4o-mini',
|
|
87
|
+
apiKey: options.openaiKey || process.env.OCR_API_KEY || '',
|
|
88
|
+
baseUrl: options.openaiEndpoint, // undefined = use preset default
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
const response = await llmProvider.complete(fullPrompt, {
|
|
92
|
+
temperature: 0.1,
|
|
93
|
+
maxTokens: 8192,
|
|
94
|
+
});
|
|
95
|
+
return {
|
|
96
|
+
code: response.content || '',
|
|
97
|
+
provider: useProvider,
|
|
98
|
+
model: options.openaiModel || options.ollamaModel || 'default',
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
if (strategy === 'remote-only')
|
|
103
|
+
throw err;
|
|
104
|
+
// When a specific provider was requested, don't fall through to legacy providers
|
|
105
|
+
// — re-throw the error so the file-level handler can report it
|
|
106
|
+
if (useProvider)
|
|
107
|
+
throw err;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Legacy fallback: Try providers based on strategy
|
|
111
|
+
if (strategy === 'local-first' || strategy === 'local-only') {
|
|
112
|
+
try {
|
|
113
|
+
const result = await callOllama(fullPrompt, options);
|
|
114
|
+
return { code: result, provider: 'ollama', model: options.ollamaModel || 'codellama:13b' };
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
if (strategy === 'local-only')
|
|
118
|
+
throw err;
|
|
119
|
+
// Fall through to remote
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (strategy === 'remote-first' || strategy === 'remote-only') {
|
|
123
|
+
try {
|
|
124
|
+
const result = await callOpenAI(fullPrompt, options);
|
|
125
|
+
return { code: result, provider: 'openai', model: options.openaiModel || 'gpt-4o-mini' };
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
if (strategy === 'remote-only')
|
|
129
|
+
throw err;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Try remaining provider as fallback
|
|
133
|
+
try {
|
|
134
|
+
const result = await callOllama(fullPrompt, options);
|
|
135
|
+
return { code: result, provider: 'ollama', model: options.ollamaModel || 'codellama:13b' };
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Fall through to OpenAI
|
|
139
|
+
}
|
|
140
|
+
const result = await callOpenAI(fullPrompt, options);
|
|
141
|
+
return { code: result, provider: 'openai', model: options.openaiModel || 'gpt-4o-mini' };
|
|
142
|
+
}
|
|
143
|
+
async function callOllama(prompt, options) {
|
|
144
|
+
const provider = new OllamaProvider({
|
|
145
|
+
endpoint: options.ollamaUrl || process.env.OCR_OLLAMA_URL,
|
|
146
|
+
model: options.ollamaModel || process.env.OCR_OLLAMA_MODEL || 'codellama:13b',
|
|
147
|
+
});
|
|
148
|
+
const controller = new AbortController();
|
|
149
|
+
const timeout = setTimeout(() => controller.abort(), 120_000);
|
|
150
|
+
try {
|
|
151
|
+
const res = await fetch(`${provider['endpoint']}/api/generate`, {
|
|
152
|
+
method: 'POST',
|
|
153
|
+
headers: { 'Content-Type': 'application/json' },
|
|
154
|
+
body: JSON.stringify({
|
|
155
|
+
model: provider['model'],
|
|
156
|
+
prompt,
|
|
157
|
+
stream: false,
|
|
158
|
+
options: { temperature: 0.1, num_predict: 8192 },
|
|
159
|
+
}),
|
|
160
|
+
signal: controller.signal,
|
|
161
|
+
});
|
|
162
|
+
clearTimeout(timeout);
|
|
163
|
+
if (!res.ok) {
|
|
164
|
+
const errText = await res.text().catch(() => 'unknown error');
|
|
165
|
+
throw new Error(`Ollama API error ${res.status}: ${errText}`);
|
|
166
|
+
}
|
|
167
|
+
const data = (await res.json());
|
|
168
|
+
return extractCode(data.response);
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
clearTimeout(timeout);
|
|
172
|
+
throw err;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
async function callOpenAI(prompt, options) {
|
|
176
|
+
const apiKey = options.openaiKey || process.env.OCR_API_KEY || process.env.OPENAI_API_KEY || '';
|
|
177
|
+
const model = options.openaiModel || 'gpt-4o-mini';
|
|
178
|
+
const endpoint = options.openaiEndpoint || 'https://api.openai.com/v1';
|
|
179
|
+
if (!apiKey) {
|
|
180
|
+
throw new Error('No API key configured for OpenAI. Set OCR_API_KEY or --ai-remote-key.');
|
|
181
|
+
}
|
|
182
|
+
const controller = new AbortController();
|
|
183
|
+
const timeout = setTimeout(() => controller.abort(), 120_000);
|
|
184
|
+
try {
|
|
185
|
+
const res = await fetch(`${endpoint}/chat/completions`, {
|
|
186
|
+
method: 'POST',
|
|
187
|
+
headers: {
|
|
188
|
+
'Content-Type': 'application/json',
|
|
189
|
+
Authorization: `Bearer ${apiKey}`,
|
|
190
|
+
},
|
|
191
|
+
body: JSON.stringify({
|
|
192
|
+
model,
|
|
193
|
+
messages: [
|
|
194
|
+
{ role: 'system', content: 'You are an expert code fixer. Return ONLY the fixed code, no explanations.' },
|
|
195
|
+
{ role: 'user', content: prompt },
|
|
196
|
+
],
|
|
197
|
+
temperature: 0.1,
|
|
198
|
+
max_tokens: 8192,
|
|
199
|
+
}),
|
|
200
|
+
signal: controller.signal,
|
|
201
|
+
});
|
|
202
|
+
clearTimeout(timeout);
|
|
203
|
+
if (!res.ok) {
|
|
204
|
+
const errText = await res.text().catch(() => 'unknown error');
|
|
205
|
+
throw new Error(`OpenAI API error ${res.status}: ${errText}`);
|
|
206
|
+
}
|
|
207
|
+
const data = (await res.json());
|
|
208
|
+
return extractCode(data.choices?.[0]?.message?.content || '');
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
clearTimeout(timeout);
|
|
212
|
+
throw err;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Extract code from AI response (may contain markdown fences or explanations).
|
|
217
|
+
*/
|
|
218
|
+
function extractCode(response) {
|
|
219
|
+
// Try to extract from code block
|
|
220
|
+
const codeBlockMatch = response.match(/```(?:\w+)?\s*\n([\s\S]*?)\n```/);
|
|
221
|
+
if (codeBlockMatch) {
|
|
222
|
+
return codeBlockMatch[1].trim();
|
|
223
|
+
}
|
|
224
|
+
// If response starts with code-like content, use it directly
|
|
225
|
+
const trimmed = response.trim();
|
|
226
|
+
if (trimmed.startsWith('import ') || trimmed.startsWith('const ') || trimmed.startsWith('function ') ||
|
|
227
|
+
trimmed.startsWith('export ') || trimmed.startsWith('class ') || trimmed.startsWith('#') ||
|
|
228
|
+
trimmed.startsWith('from ') || trimmed.startsWith('package ') || trimmed.startsWith('<') ||
|
|
229
|
+
trimmed.startsWith('"""') || trimmed.startsWith("'")) {
|
|
230
|
+
return trimmed;
|
|
231
|
+
}
|
|
232
|
+
// Fallback: return as-is
|
|
233
|
+
return trimmed;
|
|
234
|
+
}
|
|
235
|
+
// ─── AutoFixEngine ─────────────────────────────────────────────────
|
|
236
|
+
export class AutoFixEngine {
|
|
237
|
+
promptBuilder;
|
|
238
|
+
constructor() {
|
|
239
|
+
this.promptBuilder = new PromptBuilder();
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Heal all files with issues in a scan report.
|
|
243
|
+
*/
|
|
244
|
+
async heal(report, options) {
|
|
245
|
+
const threshold = options.threshold ?? 95;
|
|
246
|
+
const results = [];
|
|
247
|
+
const errors = [];
|
|
248
|
+
// Filter files that need healing
|
|
249
|
+
const filesToHeal = report.files.filter(f => f.totalScore < threshold);
|
|
250
|
+
if (filesToHeal.length === 0) {
|
|
251
|
+
return {
|
|
252
|
+
filesScanned: report.totalFiles,
|
|
253
|
+
filesToHeal: 0,
|
|
254
|
+
filesHealed: 0,
|
|
255
|
+
issuesFixed: 0,
|
|
256
|
+
avgScoreImprovement: 0,
|
|
257
|
+
results: [],
|
|
258
|
+
providerName: 'none',
|
|
259
|
+
modelName: 'none',
|
|
260
|
+
timestamp: new Date().toISOString(),
|
|
261
|
+
errors: [],
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
// Process each file
|
|
265
|
+
for (const file of filesToHeal) {
|
|
266
|
+
try {
|
|
267
|
+
const result = await this.healFile(file, options);
|
|
268
|
+
if (result) {
|
|
269
|
+
results.push(result);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
catch (err) {
|
|
273
|
+
const msg = `Failed to heal ${file.file}: ${err instanceof Error ? err.message : String(err)}`;
|
|
274
|
+
errors.push(msg);
|
|
275
|
+
// Continue with next file
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
// Compute report
|
|
279
|
+
const filesHealed = results.filter(r => r.patches.length > 0).length;
|
|
280
|
+
const totalImprovement = results.reduce((sum, r) => sum + (r.fixedScore - r.originalScore), 0);
|
|
281
|
+
const avgImprovement = results.length > 0 ? totalImprovement / results.length : 0;
|
|
282
|
+
// Count "issues fixed" by summing the score improvements
|
|
283
|
+
const issuesFixed = results.reduce((sum, r) => sum + r.changes, 0);
|
|
284
|
+
return {
|
|
285
|
+
filesScanned: report.totalFiles,
|
|
286
|
+
filesToHeal: filesToHeal.length,
|
|
287
|
+
filesHealed,
|
|
288
|
+
issuesFixed,
|
|
289
|
+
avgScoreImprovement: Math.round(avgImprovement * 10) / 10,
|
|
290
|
+
results,
|
|
291
|
+
providerName: results[0]?.patches[0] ? (options.provider || 'auto') : 'none',
|
|
292
|
+
modelName: results[0] ? 'n/a' : 'none',
|
|
293
|
+
timestamp: new Date().toISOString(),
|
|
294
|
+
errors,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Heal a single file.
|
|
299
|
+
*/
|
|
300
|
+
async healFile(file, options) {
|
|
301
|
+
const projectRoot = resolve(options.projectRoot);
|
|
302
|
+
const filePath = resolve(projectRoot, file.file);
|
|
303
|
+
// Read source
|
|
304
|
+
if (!existsSync(filePath)) {
|
|
305
|
+
throw new Error(`File not found: ${file.file}`);
|
|
306
|
+
}
|
|
307
|
+
const source = readFileSync(filePath, 'utf-8');
|
|
308
|
+
// Build fix prompt
|
|
309
|
+
const fixPrompt = this.buildFixPrompt(file, source);
|
|
310
|
+
// If output-prompts mode, just write the prompt file
|
|
311
|
+
if (options.outputPrompts) {
|
|
312
|
+
const outputDir = resolve(options.outputPrompts);
|
|
313
|
+
mkdirSync(outputDir, { recursive: true });
|
|
314
|
+
const promptPath = join(outputDir, `${file.file.replace(/[/\\]/g, '__')}.prompt.md`);
|
|
315
|
+
writeFileSync(promptPath, fixPrompt, 'utf-8');
|
|
316
|
+
return {
|
|
317
|
+
file: file.file,
|
|
318
|
+
originalScore: file.totalScore,
|
|
319
|
+
fixedScore: file.totalScore,
|
|
320
|
+
changes: 0,
|
|
321
|
+
patches: [],
|
|
322
|
+
errors: [],
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
// Call AI
|
|
326
|
+
const { code: fixedCode, provider: providerName, model: modelName } = await generateFixedCode(fixPrompt, source, file.file, options);
|
|
327
|
+
// Generate patch
|
|
328
|
+
const diff = simpleDiff(source, fixedCode, file.file);
|
|
329
|
+
const patch = {
|
|
330
|
+
file: file.file,
|
|
331
|
+
original: source,
|
|
332
|
+
fixed: fixedCode,
|
|
333
|
+
diff,
|
|
334
|
+
};
|
|
335
|
+
// Apply patch (unless dry-run)
|
|
336
|
+
if (!options.dryRun && source !== fixedCode) {
|
|
337
|
+
// Backup original
|
|
338
|
+
try {
|
|
339
|
+
copyFileSync(filePath, `${filePath}.bak`);
|
|
340
|
+
}
|
|
341
|
+
catch {
|
|
342
|
+
// Ignore backup errors
|
|
343
|
+
}
|
|
344
|
+
writeFileSync(filePath, fixedCode, 'utf-8');
|
|
345
|
+
}
|
|
346
|
+
// Count changes (lines changed)
|
|
347
|
+
const origLines = source.split('\n');
|
|
348
|
+
const fixedLines = fixedCode.split('\n');
|
|
349
|
+
let changes = 0;
|
|
350
|
+
const maxLen = Math.max(origLines.length, fixedLines.length);
|
|
351
|
+
for (let i = 0; i < maxLen; i++) {
|
|
352
|
+
if (origLines[i] !== fixedLines[i])
|
|
353
|
+
changes++;
|
|
354
|
+
}
|
|
355
|
+
return {
|
|
356
|
+
file: file.file,
|
|
357
|
+
originalScore: file.totalScore,
|
|
358
|
+
fixedScore: options.dryRun ? file.totalScore : Math.min(100, file.totalScore + Math.round(changes * 0.5)),
|
|
359
|
+
changes,
|
|
360
|
+
patches: source !== fixedCode ? [patch] : [],
|
|
361
|
+
errors: [],
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Apply patches to files (batch mode).
|
|
366
|
+
*/
|
|
367
|
+
async applyPatches(patches, projectRoot) {
|
|
368
|
+
for (const patch of patches) {
|
|
369
|
+
const filePath = resolve(projectRoot, patch.file);
|
|
370
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
371
|
+
try {
|
|
372
|
+
copyFileSync(filePath, `${filePath}.bak`);
|
|
373
|
+
}
|
|
374
|
+
catch {
|
|
375
|
+
// Ignore backup errors
|
|
376
|
+
}
|
|
377
|
+
writeFileSync(filePath, patch.fixed, 'utf-8');
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Build a fix prompt for a file using PromptBuilder + source context.
|
|
382
|
+
*/
|
|
383
|
+
buildFixPrompt(file, source) {
|
|
384
|
+
// Use PromptBuilder's prompt as the base
|
|
385
|
+
// Create a minimal AggregateScore for the single file
|
|
386
|
+
const miniReport = {
|
|
387
|
+
overallScore: file.totalScore,
|
|
388
|
+
grade: file.grade,
|
|
389
|
+
totalFiles: 1,
|
|
390
|
+
passedFiles: 0,
|
|
391
|
+
failedFiles: 1,
|
|
392
|
+
files: [file],
|
|
393
|
+
passed: false,
|
|
394
|
+
timestamp: new Date().toISOString(),
|
|
395
|
+
};
|
|
396
|
+
const prompts = this.promptBuilder.buildPrompts(miniReport);
|
|
397
|
+
if (prompts.length === 0)
|
|
398
|
+
return '';
|
|
399
|
+
let fixPrompt = prompts[0].prompt;
|
|
400
|
+
// Enhance with source file summary
|
|
401
|
+
const lines = source.split('\n');
|
|
402
|
+
fixPrompt += `\n\n### File Statistics\n`;
|
|
403
|
+
fixPrompt += `- Total lines: ${lines.length}\n`;
|
|
404
|
+
fixPrompt += `- File extension: ${file.file.split('.').pop()}\n`;
|
|
405
|
+
return fixPrompt;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
export default AutoFixEngine;
|
|
409
|
+
//# sourceMappingURL=auto-fix-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-fix-engine.js","sourceRoot":"","sources":["../../src/ai-healer/auto-fix-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heal Report Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates markdown reports for the AI auto-fix process.
|
|
5
|
+
*/
|
|
6
|
+
import type { HealReport } from './auto-fix-engine.js';
|
|
7
|
+
import type { AggregateScore } from '../scorer/scoring-engine.js';
|
|
8
|
+
export interface ReportOptions {
|
|
9
|
+
includeDiff?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare class HealReporter {
|
|
12
|
+
/**
|
|
13
|
+
* Generate a markdown report for the heal operation.
|
|
14
|
+
*/
|
|
15
|
+
generateReport(healReport: HealReport, options?: ReportOptions): string;
|
|
16
|
+
/**
|
|
17
|
+
* Generate a SARIF report for the heal operation.
|
|
18
|
+
*/
|
|
19
|
+
generateSARIF(healReport: HealReport, aggregateBefore?: AggregateScore): string;
|
|
20
|
+
}
|
|
21
|
+
export default HealReporter;
|
|
22
|
+
//# sourceMappingURL=heal-reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heal-reporter.d.ts","sourceRoot":"","sources":["../../src/ai-healer/heal-reporter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAIlE,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAID,qBAAa,YAAY;IACvB;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM;IA0EvE;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,eAAe,CAAC,EAAE,cAAc,GAAG,MAAM;CAwDhF;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heal Report Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates markdown reports for the AI auto-fix process.
|
|
5
|
+
*/
|
|
6
|
+
// ─── Reporter ──────────────────────────────────────────────────────
|
|
7
|
+
export class HealReporter {
|
|
8
|
+
/**
|
|
9
|
+
* Generate a markdown report for the heal operation.
|
|
10
|
+
*/
|
|
11
|
+
generateReport(healReport, options) {
|
|
12
|
+
const lines = [];
|
|
13
|
+
lines.push('# AI Auto-Fix Report');
|
|
14
|
+
lines.push('');
|
|
15
|
+
lines.push('## Summary');
|
|
16
|
+
lines.push('');
|
|
17
|
+
lines.push(`- Files scanned: ${healReport.filesScanned}`);
|
|
18
|
+
lines.push(`- Files healed: ${healReport.filesHealed}`);
|
|
19
|
+
lines.push(`- Issues fixed: ${healReport.issuesFixed}`);
|
|
20
|
+
lines.push(`- Average score improvement: +${healReport.avgScoreImprovement}`);
|
|
21
|
+
lines.push(`- AI provider: ${healReport.providerName}/${healReport.modelName}`);
|
|
22
|
+
lines.push('');
|
|
23
|
+
// Fixed files
|
|
24
|
+
const fixedFiles = healReport.results.filter(r => r.patches.length > 0);
|
|
25
|
+
if (fixedFiles.length > 0) {
|
|
26
|
+
lines.push('## Fixed Files');
|
|
27
|
+
lines.push('');
|
|
28
|
+
for (const result of fixedFiles) {
|
|
29
|
+
lines.push(`### ${result.file}`);
|
|
30
|
+
lines.push(`- Score: ${result.originalScore} → ${result.fixedScore} (+${result.fixedScore - result.originalScore})`);
|
|
31
|
+
lines.push(`- Changes: ${result.changes} line(s)`);
|
|
32
|
+
if (result.errors.length > 0) {
|
|
33
|
+
for (const err of result.errors) {
|
|
34
|
+
lines.push(`- ⚠ ${err}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
lines.push('');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Remaining issues
|
|
41
|
+
const failedFiles = healReport.results.filter(r => r.patches.length === 0);
|
|
42
|
+
if (failedFiles.length > 0) {
|
|
43
|
+
lines.push('## Remaining Issues');
|
|
44
|
+
lines.push('');
|
|
45
|
+
for (const result of failedFiles) {
|
|
46
|
+
lines.push(`### ${result.file}`);
|
|
47
|
+
lines.push(`- Score: ${result.originalScore} (not healed)`);
|
|
48
|
+
if (result.errors.length > 0) {
|
|
49
|
+
for (const err of result.errors) {
|
|
50
|
+
lines.push(`- Error: ${err}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
lines.push('');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Errors
|
|
57
|
+
if (healReport.errors.length > 0) {
|
|
58
|
+
lines.push('## Errors');
|
|
59
|
+
lines.push('');
|
|
60
|
+
for (const err of healReport.errors) {
|
|
61
|
+
lines.push(`- ${err}`);
|
|
62
|
+
}
|
|
63
|
+
lines.push('');
|
|
64
|
+
}
|
|
65
|
+
// Diff appendix
|
|
66
|
+
if (options?.includeDiff) {
|
|
67
|
+
lines.push('## Diffs');
|
|
68
|
+
lines.push('');
|
|
69
|
+
for (const result of fixedFiles) {
|
|
70
|
+
lines.push(`### ${result.file}`);
|
|
71
|
+
lines.push('```diff');
|
|
72
|
+
lines.push(result.patches[0].diff);
|
|
73
|
+
lines.push('```');
|
|
74
|
+
lines.push('');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return lines.join('\n');
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Generate a SARIF report for the heal operation.
|
|
81
|
+
*/
|
|
82
|
+
generateSARIF(healReport, aggregateBefore) {
|
|
83
|
+
const results = [];
|
|
84
|
+
for (const result of healReport.results) {
|
|
85
|
+
if (result.patches.length > 0) {
|
|
86
|
+
results.push({
|
|
87
|
+
ruleId: 'ocr-auto-fixed',
|
|
88
|
+
level: 'note',
|
|
89
|
+
message: {
|
|
90
|
+
text: `Auto-fixed by AI. Score: ${result.originalScore} → ${result.fixedScore} (+${result.fixedScore - result.originalScore}). Changes: ${result.changes} line(s).`,
|
|
91
|
+
},
|
|
92
|
+
locations: [{
|
|
93
|
+
physicalLocation: {
|
|
94
|
+
artifactLocation: { uri: result.file },
|
|
95
|
+
},
|
|
96
|
+
}],
|
|
97
|
+
fixNotifications: result.patches.map(patch => ({
|
|
98
|
+
description: {
|
|
99
|
+
text: `Applied fix to ${patch.file}`,
|
|
100
|
+
},
|
|
101
|
+
})),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const sarif = {
|
|
106
|
+
$schema: 'https://raw.githubusercontent.com/oasis-tcs/sarif-spec/main/sarif-2.1/schema/sarif-schema-2.1.0.json',
|
|
107
|
+
version: '2.1.0',
|
|
108
|
+
runs: [{
|
|
109
|
+
tool: {
|
|
110
|
+
driver: {
|
|
111
|
+
name: 'Open Code Review — AI Auto-Fix',
|
|
112
|
+
version: '2.0.0',
|
|
113
|
+
informationUri: 'https://github.com/raye-deng/open-code-review',
|
|
114
|
+
rules: [
|
|
115
|
+
{
|
|
116
|
+
id: 'ocr-auto-fixed',
|
|
117
|
+
shortDescription: { text: 'File auto-fixed by AI' },
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
results,
|
|
123
|
+
invocation: {
|
|
124
|
+
executionSuccessful: healReport.errors.length === 0,
|
|
125
|
+
endTimeUtc: healReport.timestamp,
|
|
126
|
+
toolConfigurationNotifications: healReport.errors.map(err => ({
|
|
127
|
+
level: 'error',
|
|
128
|
+
message: { text: err },
|
|
129
|
+
})),
|
|
130
|
+
},
|
|
131
|
+
}],
|
|
132
|
+
};
|
|
133
|
+
return JSON.stringify(sarif, null, 2);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
export default HealReporter;
|
|
137
|
+
//# sourceMappingURL=heal-reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heal-reporter.js","sourceRoot":"","sources":["../../src/ai-healer/heal-reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IDE Rules Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates rule files for AI coding assistants (Cursor, Copilot, Augment)
|
|
5
|
+
* based on scan/heal results so they avoid repeating detected issues.
|
|
6
|
+
*/
|
|
7
|
+
import type { AggregateScore } from '../scorer/scoring-engine.js';
|
|
8
|
+
import type { HealReport } from './auto-fix-engine.js';
|
|
9
|
+
export interface IDERulesOptions {
|
|
10
|
+
projectRoot: string;
|
|
11
|
+
/** Scan report (required) */
|
|
12
|
+
report: AggregateScore;
|
|
13
|
+
/** Optional heal report (includes fix details) */
|
|
14
|
+
healReport?: HealReport;
|
|
15
|
+
}
|
|
16
|
+
export declare class IDERulesGenerator {
|
|
17
|
+
/**
|
|
18
|
+
* Generate IDE rule files for all supported assistants.
|
|
19
|
+
*/
|
|
20
|
+
generateAll(options: IDERulesOptions): {
|
|
21
|
+
path: string;
|
|
22
|
+
content: string;
|
|
23
|
+
}[];
|
|
24
|
+
/**
|
|
25
|
+
* Write IDE rule files to disk.
|
|
26
|
+
*/
|
|
27
|
+
writeAll(options: IDERulesOptions): string[];
|
|
28
|
+
/**
|
|
29
|
+
* Generate Cursor rules file.
|
|
30
|
+
*/
|
|
31
|
+
generateCursorRules(options: IDERulesOptions): string;
|
|
32
|
+
/**
|
|
33
|
+
* Generate GitHub Copilot instructions file.
|
|
34
|
+
*/
|
|
35
|
+
generateCopilotInstructions(options: IDERulesOptions): string;
|
|
36
|
+
/**
|
|
37
|
+
* Generate Augment instructions file.
|
|
38
|
+
*/
|
|
39
|
+
generateAugmentInstructions(options: IDERulesOptions): string;
|
|
40
|
+
/**
|
|
41
|
+
* Extract common issue patterns from the report.
|
|
42
|
+
*/
|
|
43
|
+
private extractPatterns;
|
|
44
|
+
}
|
|
45
|
+
export default IDERulesGenerator;
|
|
46
|
+
//# sourceMappingURL=ide-rules-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ide-rules-generator.d.ts","sourceRoot":"","sources":["../../src/ai-healer/ide-rules-generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,6BAA6B,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIvD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,MAAM,EAAE,cAAc,CAAC;IACvB,kDAAkD;IAClD,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAID,qBAAa,iBAAiB;IAC5B;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE;IAe1E;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,EAAE;IAc5C;;OAEG;IACH,mBAAmB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM;IAsErD;;OAEG;IACH,2BAA2B,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM;IAmC7D;;OAEG;IACH,2BAA2B,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM;IA6B7D;;OAEG;IACH,OAAO,CAAC,eAAe;CAgDxB;AAED,eAAe,iBAAiB,CAAC"}
|