@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.
Files changed (67) hide show
  1. package/dist/ai/v4/index.d.ts +3 -1
  2. package/dist/ai/v4/index.d.ts.map +1 -1
  3. package/dist/ai/v4/index.js +2 -0
  4. package/dist/ai/v4/index.js.map +1 -1
  5. package/dist/ai/v4/llm/index.d.ts +1 -0
  6. package/dist/ai/v4/llm/index.d.ts.map +1 -1
  7. package/dist/ai/v4/llm/index.js +1 -0
  8. package/dist/ai/v4/llm/index.js.map +1 -1
  9. package/dist/ai/v4/llm/provider-factory.d.ts +59 -0
  10. package/dist/ai/v4/llm/provider-factory.d.ts.map +1 -0
  11. package/dist/ai/v4/llm/provider-factory.js +87 -0
  12. package/dist/ai/v4/llm/provider-factory.js.map +1 -0
  13. package/dist/ai/v4/pipeline.d.ts.map +1 -1
  14. package/dist/ai/v4/pipeline.js +2 -8
  15. package/dist/ai/v4/pipeline.js.map +1 -1
  16. package/dist/ai/v4/types.d.ts +42 -7
  17. package/dist/ai/v4/types.d.ts.map +1 -1
  18. package/dist/ai/v4/types.js +40 -1
  19. package/dist/ai/v4/types.js.map +1 -1
  20. package/dist/ai-healer/auto-fix-engine.d.ts +98 -0
  21. package/dist/ai-healer/auto-fix-engine.d.ts.map +1 -0
  22. package/dist/ai-healer/auto-fix-engine.js +409 -0
  23. package/dist/ai-healer/auto-fix-engine.js.map +1 -0
  24. package/dist/ai-healer/heal-reporter.d.ts +22 -0
  25. package/dist/ai-healer/heal-reporter.d.ts.map +1 -0
  26. package/dist/ai-healer/heal-reporter.js +137 -0
  27. package/dist/ai-healer/heal-reporter.js.map +1 -0
  28. package/dist/ai-healer/ide-rules-generator.d.ts +46 -0
  29. package/dist/ai-healer/ide-rules-generator.d.ts.map +1 -0
  30. package/dist/ai-healer/ide-rules-generator.js +214 -0
  31. package/dist/ai-healer/ide-rules-generator.js.map +1 -0
  32. package/dist/config/v4-config.d.ts +3 -1
  33. package/dist/config/v4-config.d.ts.map +1 -1
  34. package/dist/config/v4-config.js.map +1 -1
  35. package/dist/detectors/registry/go-packages.d.ts +16 -0
  36. package/dist/detectors/registry/go-packages.d.ts.map +1 -0
  37. package/dist/detectors/registry/go-packages.js +181 -0
  38. package/dist/detectors/registry/go-packages.js.map +1 -0
  39. package/dist/detectors/registry/java-packages.d.ts +16 -0
  40. package/dist/detectors/registry/java-packages.d.ts.map +1 -0
  41. package/dist/detectors/registry/java-packages.js +144 -0
  42. package/dist/detectors/registry/java-packages.js.map +1 -0
  43. package/dist/detectors/registry/kotlin-packages.d.ts +15 -0
  44. package/dist/detectors/registry/kotlin-packages.d.ts.map +1 -0
  45. package/dist/detectors/registry/kotlin-packages.js +125 -0
  46. package/dist/detectors/registry/kotlin-packages.js.map +1 -0
  47. package/dist/detectors/registry/python-packages.d.ts +16 -0
  48. package/dist/detectors/registry/python-packages.d.ts.map +1 -0
  49. package/dist/detectors/registry/python-packages.js +113 -0
  50. package/dist/detectors/registry/python-packages.js.map +1 -0
  51. package/dist/detectors/v4/index.d.ts +5 -0
  52. package/dist/detectors/v4/index.d.ts.map +1 -1
  53. package/dist/detectors/v4/index.js +10 -0
  54. package/dist/detectors/v4/index.js.map +1 -1
  55. package/dist/detectors/v4/language-specific.d.ts +47 -0
  56. package/dist/detectors/v4/language-specific.d.ts.map +1 -0
  57. package/dist/detectors/v4/language-specific.js +560 -0
  58. package/dist/detectors/v4/language-specific.js.map +1 -0
  59. package/dist/index.d.ts +6 -1
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +4 -0
  62. package/dist/index.js.map +1 -1
  63. package/dist/scanner/v4-scanner.d.ts +3 -1
  64. package/dist/scanner/v4-scanner.d.ts.map +1 -1
  65. package/dist/scanner/v4-scanner.js +1 -0
  66. package/dist/scanner/v4-scanner.js.map +1 -1
  67. 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"}