activo 0.4.3 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/README.md +203 -1
  2. package/data/2026-03-04_20-54.json +181 -0
  3. package/data/2026-03-04_20-56.json +181 -0
  4. package/data/apex-rulesets/egov.yaml +469 -0
  5. package/data/apex-rulesets/modernize.yaml +687 -0
  6. package/data/apex-rulesets/quality.yaml +1677 -0
  7. package/data/apex-rulesets/rule-schema.yaml +587 -0
  8. package/data/apex-rulesets/secure.yaml +1688 -0
  9. package/data/apex-rulesets/spring.yaml +455 -0
  10. package/data/apex-rulesets/sql-format.yaml +99 -0
  11. package/data/apex-rulesets/sql-oracle.yaml +281 -0
  12. package/data/apex-rulesets/sql.yaml +1660 -0
  13. package/dist/cli/headless.d.ts.map +1 -1
  14. package/dist/cli/headless.js +32 -10
  15. package/dist/cli/headless.js.map +1 -1
  16. package/dist/cli/index.js +31 -3
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/core/agent.d.ts +3 -3
  19. package/dist/core/agent.d.ts.map +1 -1
  20. package/dist/core/agent.js +255 -17
  21. package/dist/core/agent.js.map +1 -1
  22. package/dist/core/commands.d.ts +2 -1
  23. package/dist/core/commands.d.ts.map +1 -1
  24. package/dist/core/commands.js +61 -9
  25. package/dist/core/commands.js.map +1 -1
  26. package/dist/core/config.d.ts +14 -0
  27. package/dist/core/config.d.ts.map +1 -1
  28. package/dist/core/config.js +41 -4
  29. package/dist/core/config.js.map +1 -1
  30. package/dist/core/conversation.d.ts +2 -2
  31. package/dist/core/conversation.d.ts.map +1 -1
  32. package/dist/core/conversation.js.map +1 -1
  33. package/dist/core/intentRouter.d.ts +43 -0
  34. package/dist/core/intentRouter.d.ts.map +1 -0
  35. package/dist/core/intentRouter.js +804 -0
  36. package/dist/core/intentRouter.js.map +1 -0
  37. package/dist/core/llm/anthropic.d.ts +24 -0
  38. package/dist/core/llm/anthropic.d.ts.map +1 -0
  39. package/dist/core/llm/anthropic.js +226 -0
  40. package/dist/core/llm/anthropic.js.map +1 -0
  41. package/dist/core/llm/ollama.d.ts +5 -14
  42. package/dist/core/llm/ollama.d.ts.map +1 -1
  43. package/dist/core/llm/ollama.js +3 -0
  44. package/dist/core/llm/ollama.js.map +1 -1
  45. package/dist/core/llm/types.d.ts +22 -0
  46. package/dist/core/llm/types.d.ts.map +1 -0
  47. package/dist/core/llm/types.js +2 -0
  48. package/dist/core/llm/types.js.map +1 -0
  49. package/dist/core/mcp/client.d.ts +6 -0
  50. package/dist/core/mcp/client.d.ts.map +1 -1
  51. package/dist/core/mcp/client.js +16 -0
  52. package/dist/core/mcp/client.js.map +1 -1
  53. package/dist/core/mcp/init.d.ts +12 -0
  54. package/dist/core/mcp/init.d.ts.map +1 -0
  55. package/dist/core/mcp/init.js +55 -0
  56. package/dist/core/mcp/init.js.map +1 -0
  57. package/dist/core/mcp/logger.d.ts +14 -0
  58. package/dist/core/mcp/logger.d.ts.map +1 -0
  59. package/dist/core/mcp/logger.js +50 -0
  60. package/dist/core/mcp/logger.js.map +1 -0
  61. package/dist/core/tools/analyzeAll.d.ts.map +1 -1
  62. package/dist/core/tools/analyzeAll.js +16 -28
  63. package/dist/core/tools/analyzeAll.js.map +1 -1
  64. package/dist/core/tools/analyzePatterns.d.ts +3 -0
  65. package/dist/core/tools/analyzePatterns.d.ts.map +1 -0
  66. package/dist/core/tools/analyzePatterns.js +293 -0
  67. package/dist/core/tools/analyzePatterns.js.map +1 -0
  68. package/dist/core/tools/apexPaths.d.ts +14 -0
  69. package/dist/core/tools/apexPaths.d.ts.map +1 -0
  70. package/dist/core/tools/apexPaths.js +54 -0
  71. package/dist/core/tools/apexPaths.js.map +1 -0
  72. package/dist/core/tools/apexUtils.d.ts +36 -0
  73. package/dist/core/tools/apexUtils.d.ts.map +1 -0
  74. package/dist/core/tools/apexUtils.js +83 -0
  75. package/dist/core/tools/apexUtils.js.map +1 -0
  76. package/dist/core/tools/explainIssue.d.ts +3 -0
  77. package/dist/core/tools/explainIssue.d.ts.map +1 -0
  78. package/dist/core/tools/explainIssue.js +181 -0
  79. package/dist/core/tools/explainIssue.js.map +1 -0
  80. package/dist/core/tools/fixGen.d.ts +3 -0
  81. package/dist/core/tools/fixGen.d.ts.map +1 -0
  82. package/dist/core/tools/fixGen.js +338 -0
  83. package/dist/core/tools/fixGen.js.map +1 -0
  84. package/dist/core/tools/generateImprovements.d.ts +21 -0
  85. package/dist/core/tools/generateImprovements.d.ts.map +1 -0
  86. package/dist/core/tools/generateImprovements.js +602 -0
  87. package/dist/core/tools/generateImprovements.js.map +1 -0
  88. package/dist/core/tools/generateReport.d.ts +3 -0
  89. package/dist/core/tools/generateReport.d.ts.map +1 -0
  90. package/dist/core/tools/generateReport.js +315 -0
  91. package/dist/core/tools/generateReport.js.map +1 -0
  92. package/dist/core/tools/index.d.ts +7 -0
  93. package/dist/core/tools/index.d.ts.map +1 -1
  94. package/dist/core/tools/index.js +62 -23
  95. package/dist/core/tools/index.js.map +1 -1
  96. package/dist/core/tools/javaAst.d.ts.map +1 -1
  97. package/dist/core/tools/javaAst.js +191 -0
  98. package/dist/core/tools/javaAst.js.map +1 -1
  99. package/dist/core/tools/recommendProfile.d.ts +3 -0
  100. package/dist/core/tools/recommendProfile.d.ts.map +1 -0
  101. package/dist/core/tools/recommendProfile.js +334 -0
  102. package/dist/core/tools/recommendProfile.js.map +1 -0
  103. package/dist/core/tools/ruleGen.d.ts +3 -0
  104. package/dist/core/tools/ruleGen.d.ts.map +1 -0
  105. package/dist/core/tools/ruleGen.js +1103 -0
  106. package/dist/core/tools/ruleGen.js.map +1 -0
  107. package/dist/core/tools/standards.d.ts.map +1 -1
  108. package/dist/core/tools/standards.js +7 -3
  109. package/dist/core/tools/standards.js.map +1 -1
  110. package/dist/ui/App.d.ts.map +1 -1
  111. package/dist/ui/App.js +86 -35
  112. package/dist/ui/App.js.map +1 -1
  113. package/dist/ui/components/InputBox.d.ts +1 -3
  114. package/dist/ui/components/InputBox.d.ts.map +1 -1
  115. package/dist/ui/components/InputBox.js +146 -5
  116. package/dist/ui/components/InputBox.js.map +1 -1
  117. package/dist/ui/components/MessageList.d.ts +3 -1
  118. package/dist/ui/components/MessageList.d.ts.map +1 -1
  119. package/dist/ui/components/MessageList.js +13 -7
  120. package/dist/ui/components/MessageList.js.map +1 -1
  121. package/dist/ui/components/StatusBar.d.ts +1 -1
  122. package/dist/ui/components/StatusBar.d.ts.map +1 -1
  123. package/dist/ui/components/StatusBar.js +3 -2
  124. package/dist/ui/components/StatusBar.js.map +1 -1
  125. package/dist/ui/components/ToolStatus.d.ts +3 -1
  126. package/dist/ui/components/ToolStatus.d.ts.map +1 -1
  127. package/dist/ui/components/ToolStatus.js +19 -4
  128. package/dist/ui/components/ToolStatus.js.map +1 -1
  129. package/package.json +7 -1
  130. package/demo.gif +0 -0
  131. package/demo.tape +0 -53
  132. package/screenshot.png +0 -0
  133. package/src/cli/banner.ts +0 -38
  134. package/src/cli/headless.ts +0 -63
  135. package/src/cli/index.ts +0 -57
  136. package/src/core/agent.ts +0 -237
  137. package/src/core/commands.ts +0 -118
  138. package/src/core/config.ts +0 -98
  139. package/src/core/conversation.ts +0 -235
  140. package/src/core/llm/ollama.ts +0 -351
  141. package/src/core/mcp/client.ts +0 -143
  142. package/src/core/tools/analyzeAll.ts +0 -494
  143. package/src/core/tools/ast.ts +0 -826
  144. package/src/core/tools/builtIn.ts +0 -221
  145. package/src/core/tools/cache.ts +0 -570
  146. package/src/core/tools/cssAnalysis.ts +0 -324
  147. package/src/core/tools/dependencyAnalysis.ts +0 -363
  148. package/src/core/tools/embeddings.ts +0 -746
  149. package/src/core/tools/frontendAst.ts +0 -802
  150. package/src/core/tools/htmlAnalysis.ts +0 -466
  151. package/src/core/tools/index.ts +0 -160
  152. package/src/core/tools/javaAst.ts +0 -812
  153. package/src/core/tools/memory.ts +0 -655
  154. package/src/core/tools/mybatisAnalysis.ts +0 -322
  155. package/src/core/tools/openapiAnalysis.ts +0 -431
  156. package/src/core/tools/pythonAnalysis.ts +0 -477
  157. package/src/core/tools/sqlAnalysis.ts +0 -298
  158. package/src/core/tools/standards.test.ts +0 -186
  159. package/src/core/tools/standards.ts +0 -889
  160. package/src/core/tools/types.ts +0 -38
  161. package/src/ui/App.tsx +0 -334
  162. package/src/ui/components/InputBox.tsx +0 -37
  163. package/src/ui/components/MessageList.tsx +0 -80
  164. package/src/ui/components/StatusBar.tsx +0 -36
  165. package/src/ui/components/ToolStatus.tsx +0 -38
  166. package/tsconfig.json +0 -21
@@ -0,0 +1,602 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { loadApexReport, createLLMClient } from "./apexUtils.js";
4
+ // ─── Constants ───
5
+ const SEVERITY_WEIGHT = {
6
+ critical: 4,
7
+ high: 3,
8
+ medium: 2,
9
+ low: 1,
10
+ };
11
+ const CONTEXT_LINES = 7;
12
+ const MAX_PROMPT_CHARS = 4000;
13
+ // ─── Helpers ───
14
+ function formatDate() {
15
+ const now = new Date();
16
+ const pad = (n) => n.toString().padStart(2, "0");
17
+ return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())} ${pad(now.getHours())}:${pad(now.getMinutes())}`;
18
+ }
19
+ function formatTimestamp() {
20
+ const now = new Date();
21
+ const pad = (n) => n.toString().padStart(2, "0");
22
+ return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}_${pad(now.getHours())}-${pad(now.getMinutes())}`;
23
+ }
24
+ function detectLang(filepath) {
25
+ const ext = path.extname(filepath).toLowerCase();
26
+ const langMap = {
27
+ ".ts": "typescript", ".tsx": "typescript",
28
+ ".js": "javascript", ".jsx": "javascript",
29
+ ".java": "java", ".py": "python", ".go": "go",
30
+ ".css": "css", ".scss": "scss",
31
+ ".html": "html", ".jsp": "jsp", ".vue": "vue",
32
+ ".xml": "xml", ".sql": "sql",
33
+ };
34
+ return langMap[ext] || "text";
35
+ }
36
+ function readSourceLines(filepath) {
37
+ try {
38
+ return fs.readFileSync(filepath, "utf-8").split("\n");
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ function extractContext(lines, issueLine, context = CONTEXT_LINES) {
45
+ const start = Math.max(0, issueLine - 1 - context);
46
+ const end = Math.min(lines.length, issueLine + context);
47
+ return lines
48
+ .slice(start, end)
49
+ .map((line, i) => `${start + i + 1}: ${line}`)
50
+ .join("\n");
51
+ }
52
+ // ─── Feature 1: Representative Case Report ───
53
+ /**
54
+ * Group issues by rule_id and select a representative for each.
55
+ */
56
+ function groupByRuleId(issues) {
57
+ const map = new Map();
58
+ for (const issue of issues) {
59
+ const key = issue.rule_id || "unknown";
60
+ if (!map.has(key))
61
+ map.set(key, []);
62
+ map.get(key).push(issue);
63
+ }
64
+ const groups = [];
65
+ for (const [rule_id, ruleIssues] of map) {
66
+ const severity = ruleIssues[0].severity;
67
+ const weight = SEVERITY_WEIGHT[severity] ?? 1;
68
+ const frequency = ruleIssues.length;
69
+ const affectedFiles = [...new Set(ruleIssues.map((i) => i.file))];
70
+ // Select representative: prefer file with most issues of this rule
71
+ const fileCounts = new Map();
72
+ for (const issue of ruleIssues) {
73
+ fileCounts.set(issue.file, (fileCounts.get(issue.file) || 0) + 1);
74
+ }
75
+ // Sort files by count descending
76
+ const sortedFiles = [...fileCounts.entries()].sort((a, b) => b[1] - a[1]);
77
+ // Pick representative from the file with most occurrences, preferring existing files
78
+ let representative = ruleIssues[0];
79
+ for (const [file] of sortedFiles) {
80
+ try {
81
+ if (fs.existsSync(file)) {
82
+ representative = ruleIssues.find((i) => i.file === file);
83
+ break;
84
+ }
85
+ }
86
+ catch { /* skip */ }
87
+ }
88
+ groups.push({
89
+ rule_id,
90
+ severity,
91
+ category: ruleIssues[0].category,
92
+ message: ruleIssues[0].message,
93
+ issues: ruleIssues,
94
+ frequency,
95
+ impactScore: weight * frequency,
96
+ affectedFiles,
97
+ representative,
98
+ });
99
+ }
100
+ // Sort by impact score descending
101
+ groups.sort((a, b) => b.impactScore - a.impactScore);
102
+ return groups;
103
+ }
104
+ /**
105
+ * Generate improvement for a single rule_id using its representative issue.
106
+ */
107
+ async function generateRuleImprovement(group) {
108
+ const { representative, rule_id } = group;
109
+ const filepath = representative.file;
110
+ const sourceLines = readSourceLines(filepath);
111
+ if (!sourceLines) {
112
+ return { rule_id, improvements: "", error: "파일 없음" };
113
+ }
114
+ const lang = detectLang(filepath);
115
+ const codeContext = extractContext(sourceLines, representative.line);
116
+ let prompt = `당신은 코드 품질 개선 전문가입니다.
117
+ 아래 코드에서 발견된 이슈에 대해 개선된 코드를 작성해주세요.
118
+
119
+ [파일: ${filepath}:${representative.line}]
120
+ [규칙: ${rule_id}] ${representative.message}
121
+ [심각도: ${representative.severity}]
122
+
123
+ \`\`\`${lang}
124
+ ${codeContext}
125
+ \`\`\`
126
+
127
+ 다음 형식으로 답변하세요:
128
+ **문제 코드:**
129
+ \`\`\`${lang}
130
+ {이슈가 있는 부분만}
131
+ \`\`\`
132
+ **개선 코드:**
133
+ \`\`\`${lang}
134
+ {수정된 코드}
135
+ \`\`\`
136
+ **설명:** {왜 이렇게 바꿔야 하는지 1-2문장}`;
137
+ if (prompt.length > MAX_PROMPT_CHARS) {
138
+ prompt = prompt.slice(0, MAX_PROMPT_CHARS) + "\n// ... (truncated)";
139
+ }
140
+ try {
141
+ const client = createLLMClient();
142
+ const response = await client.chat([{ role: "user", content: prompt }]);
143
+ return { rule_id, improvements: response.content };
144
+ }
145
+ catch (err) {
146
+ return { rule_id, improvements: "", error: `LLM 오류: ${err}` };
147
+ }
148
+ }
149
+ /**
150
+ * Assemble the representative-case markdown report.
151
+ */
152
+ function assembleRepresentativeReport(report, groups, results) {
153
+ const dateStr = formatDate();
154
+ let md = `# 코드 개선 보고서\n\n`;
155
+ md += `- 생성일시: ${dateStr}\n`;
156
+ md += `- 분석 대상: ${report.summary.files_analyzed}개 파일, 총 ${report.summary.total_issues}건\n`;
157
+ md += `- 개선 유형: ${groups.length}종류\n`;
158
+ md += `\n---\n\n`;
159
+ let idx = 0;
160
+ for (const group of groups) {
161
+ idx++;
162
+ const result = results.get(group.rule_id);
163
+ const filesStr = group.affectedFiles
164
+ .map((f) => {
165
+ const count = group.issues.filter((i) => i.file === f).length;
166
+ return `${f}(${count}건)`;
167
+ })
168
+ .join(", ");
169
+ md += `## ${idx}. ${group.rule_id} (${group.frequency}건, ${group.affectedFiles.length}개 파일) — ${group.severity}\n`;
170
+ md += `> ${group.message}\n\n`;
171
+ md += `**임팩트:** ${group.category} 관련 이슈 ${group.frequency}곳\n`;
172
+ md += `**영향 파일:** ${filesStr}\n\n`;
173
+ if (result?.error) {
174
+ md += `> ⚠️ ${result.error}\n\n`;
175
+ }
176
+ else if (result?.improvements) {
177
+ md += `**대표 사례: ${group.representative.file}:${group.representative.line}**\n\n`;
178
+ md += result.improvements;
179
+ md += `\n\n`;
180
+ }
181
+ md += `---\n\n`;
182
+ }
183
+ md += `*Generated by ACTIVO*\n`;
184
+ return md;
185
+ }
186
+ /**
187
+ * Detect if input is tab-separated Excel paste.
188
+ */
189
+ export function isExcelPaste(text) {
190
+ const lines = text.trim().split("\n").filter((l) => l.trim());
191
+ if (lines.length === 0)
192
+ return false;
193
+ // Must have tabs and at least one rule_id pattern
194
+ const hasTab = lines.some((l) => l.includes("\t"));
195
+ const hasRuleId = /[a-zA-Z]+-[a-zA-Z]+-\w+/.test(text);
196
+ return hasTab && hasRuleId;
197
+ }
198
+ /**
199
+ * Parse tab-separated Excel paste into issues.
200
+ * Auto-detects column positions by content patterns.
201
+ */
202
+ export function parseExcelPaste(text) {
203
+ const lines = text.trim().split("\n").filter((l) => l.trim());
204
+ if (lines.length === 0)
205
+ return [];
206
+ const results = [];
207
+ for (const line of lines) {
208
+ const cols = line.split("\t").map((c) => c.trim());
209
+ if (cols.length < 3)
210
+ continue;
211
+ // Auto-detect columns
212
+ let rule_id = "";
213
+ let severity = "";
214
+ let category = "";
215
+ let file = "";
216
+ let lineNum = 0;
217
+ let message = "";
218
+ for (const col of cols) {
219
+ if (!col)
220
+ continue;
221
+ // rule_id pattern: word-word-word or word-word-digits
222
+ if (!rule_id && /^[a-zA-Z]+-[a-zA-Z]+-\w+$/.test(col)) {
223
+ rule_id = col;
224
+ continue;
225
+ }
226
+ // severity
227
+ if (!severity && /^(critical|high|medium|low)$/i.test(col)) {
228
+ severity = col.toLowerCase();
229
+ continue;
230
+ }
231
+ // file path (contains / or \)
232
+ if (!file && (col.includes("/") || col.includes("\\"))) {
233
+ file = col;
234
+ continue;
235
+ }
236
+ // line number (pure digits)
237
+ if (!lineNum && /^\d+$/.test(col)) {
238
+ lineNum = parseInt(col, 10);
239
+ continue;
240
+ }
241
+ // category (short alphanumeric word)
242
+ if (!category && /^[a-zA-Z_-]+$/.test(col) && col.length < 20) {
243
+ category = col;
244
+ continue;
245
+ }
246
+ // message (remaining text)
247
+ if (!message && col.length > 2) {
248
+ message = col;
249
+ }
250
+ }
251
+ // Skip header rows or incomplete rows
252
+ if (!rule_id || !file)
253
+ continue;
254
+ results.push({
255
+ rule_id,
256
+ severity: severity || "medium",
257
+ category: category || "",
258
+ file,
259
+ line: lineNum || 1,
260
+ message: message || rule_id,
261
+ });
262
+ }
263
+ return results;
264
+ }
265
+ /**
266
+ * Generate improvements for paste-mode issues.
267
+ * Groups by file for efficient LLM calls.
268
+ */
269
+ async function generatePasteImprovements(issues) {
270
+ const dateStr = formatDate();
271
+ let md = `# 코드 개선 보고서 (선택 이슈)\n\n`;
272
+ md += `- 생성일시: ${dateStr}\n`;
273
+ md += `- 선택 이슈: ${issues.length}건\n`;
274
+ md += `\n---\n\n`;
275
+ // Group by file
276
+ const fileGroups = new Map();
277
+ for (const issue of issues) {
278
+ if (!fileGroups.has(issue.file))
279
+ fileGroups.set(issue.file, []);
280
+ fileGroups.get(issue.file).push(issue);
281
+ }
282
+ let idx = 0;
283
+ for (const [filepath, fileIssues] of fileGroups) {
284
+ const sourceLines = readSourceLines(filepath);
285
+ const lang = detectLang(filepath);
286
+ for (const issue of fileIssues) {
287
+ idx++;
288
+ if (!sourceLines) {
289
+ md += `## ${idx}. ${issue.rule_id} — ${filepath}:${issue.line}\n`;
290
+ md += `> ⚠️ 파일 없음\n\n---\n\n`;
291
+ continue;
292
+ }
293
+ const codeContext = extractContext(sourceLines, issue.line);
294
+ let prompt = `당신은 코드 품질 개선 전문가입니다.
295
+ 아래 코드에서 발견된 이슈에 대해 개선된 코드를 작성해주세요.
296
+
297
+ [파일: ${filepath}:${issue.line}]
298
+ [규칙: ${issue.rule_id}] ${issue.message}
299
+ [심각도: ${issue.severity}]
300
+
301
+ \`\`\`${lang}
302
+ ${codeContext}
303
+ \`\`\`
304
+
305
+ 다음 형식으로 답변하세요:
306
+ **문제 코드:**
307
+ \`\`\`${lang}
308
+ {이슈가 있는 부분만}
309
+ \`\`\`
310
+ **개선 코드:**
311
+ \`\`\`${lang}
312
+ {수정된 코드}
313
+ \`\`\`
314
+ **설명:** {왜 이렇게 바꿔야 하는지 1-2문장}`;
315
+ if (prompt.length > MAX_PROMPT_CHARS) {
316
+ prompt = prompt.slice(0, MAX_PROMPT_CHARS) + "\n// ... (truncated)";
317
+ }
318
+ md += `## ${idx}. ${issue.rule_id} — ${filepath}:${issue.line}\n`;
319
+ md += `> ${issue.message} (${issue.severity})\n\n`;
320
+ try {
321
+ const client = createLLMClient();
322
+ const response = await client.chat([{ role: "user", content: prompt }]);
323
+ md += response.content;
324
+ md += `\n\n`;
325
+ }
326
+ catch (err) {
327
+ md += `> ⚠️ LLM 오류: ${err}\n\n`;
328
+ }
329
+ md += `---\n\n`;
330
+ }
331
+ }
332
+ md += `*Generated by ACTIVO*\n`;
333
+ return md;
334
+ }
335
+ function detectInputMode(report) {
336
+ const trimmed = report.trim();
337
+ // JSON string
338
+ if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
339
+ return "json";
340
+ }
341
+ // Tab-separated paste with rule_id pattern
342
+ if (isExcelPaste(trimmed)) {
343
+ return "paste";
344
+ }
345
+ // File path
346
+ return "file";
347
+ }
348
+ // ─── Feature 3: File-Batch Mode (모든 이슈 처리) ───
349
+ const SEVERITY_ORDER = { critical: 4, high: 3, medium: 2, low: 1 };
350
+ /**
351
+ * Filter issues by minimum severity.
352
+ */
353
+ function filterBySeverity(issues, minSeverity) {
354
+ const minScore = SEVERITY_ORDER[minSeverity.toLowerCase()] ?? 0;
355
+ return issues.filter((i) => (SEVERITY_ORDER[i.severity?.toLowerCase()] ?? 0) >= minScore);
356
+ }
357
+ /**
358
+ * Generate improvements for all issues in a single file via one LLM call.
359
+ * Returns structured markdown with before/after for each issue.
360
+ */
361
+ async function generateFileBatchImprovement(filepath, issues) {
362
+ const sourceLines = readSourceLines(filepath);
363
+ if (!sourceLines) {
364
+ return { filepath, issueCount: issues.length, markdown: "", error: "파일 없음" };
365
+ }
366
+ const lang = detectLang(filepath);
367
+ // Build issue list with code context for each
368
+ const issueDescs = issues.map((issue, idx) => {
369
+ const ctx = extractContext(sourceLines, issue.line, 5);
370
+ return `### 이슈 ${idx + 1} [line ${issue.line}] ${issue.rule_id} (${issue.severity})
371
+ 설명: ${issue.message}
372
+ ${issue.suggestion ? `권장: ${issue.suggestion}` : ""}
373
+ \`\`\`${lang}
374
+ ${ctx}
375
+ \`\`\``;
376
+ }).join("\n\n");
377
+ const prompt = `당신은 코드 품질 개선 전문가입니다. 아래 파일에서 발견된 모든 이슈에 대해 개선 코드를 작성해주세요.
378
+
379
+ 파일: ${filepath}
380
+ 언어: ${lang}
381
+ 이슈 수: ${issues.length}건
382
+
383
+ ${issueDescs}
384
+
385
+ 각 이슈에 대해 다음 형식으로 답변하세요:
386
+
387
+ ### 이슈 1 개선
388
+ **문제 코드:**
389
+ \`\`\`${lang}
390
+ {이슈가 있는 코드 부분}
391
+ \`\`\`
392
+ **개선 코드:**
393
+ \`\`\`${lang}
394
+ {수정된 코드}
395
+ \`\`\`
396
+ **설명:** {1-2문장}
397
+
398
+ ### 이슈 2 개선
399
+ ...
400
+
401
+ 모든 이슈(${issues.length}건)에 대해 순서대로 답변해주세요.`;
402
+ const truncated = prompt.length > 6000 ? prompt.slice(0, 6000) + "\n// ... (truncated)" : prompt;
403
+ try {
404
+ const client = createLLMClient();
405
+ const response = await client.chat([{ role: "user", content: truncated }]);
406
+ // Assemble per-file markdown
407
+ let md = `## 📄 ${path.basename(filepath)} (${issues.length}건)\n`;
408
+ md += `> 경로: \`${filepath}\`\n\n`;
409
+ // Add issue table
410
+ md += "| # | 라인 | 규칙ID | 심각도 | 메시지 |\n";
411
+ md += "|---|------|--------|--------|--------|\n";
412
+ for (let i = 0; i < issues.length; i++) {
413
+ const iss = issues[i];
414
+ md += `| ${i + 1} | ${iss.line} | ${iss.rule_id} | ${iss.severity} | ${iss.message.slice(0, 60)} |\n`;
415
+ }
416
+ md += "\n";
417
+ md += response.content;
418
+ md += "\n\n---\n\n";
419
+ return { filepath, issueCount: issues.length, markdown: md };
420
+ }
421
+ catch (err) {
422
+ return { filepath, issueCount: issues.length, markdown: "", error: `LLM 오류: ${err}` };
423
+ }
424
+ }
425
+ /**
426
+ * Generate full improvement report (all issues, file-batch mode).
427
+ */
428
+ async function generateFullImprovementReport(report, minSeverity, maxFiles) {
429
+ const dateStr = formatDate();
430
+ // Filter by severity
431
+ const filtered = filterBySeverity(report.issues, minSeverity);
432
+ // Group by file, sort by issue count descending (hotspots first)
433
+ const fileMap = new Map();
434
+ for (const issue of filtered) {
435
+ const f = issue.file || "unknown";
436
+ if (!fileMap.has(f))
437
+ fileMap.set(f, []);
438
+ fileMap.get(f).push(issue);
439
+ }
440
+ const sortedFiles = [...fileMap.entries()]
441
+ .sort((a, b) => b[1].length - a[1].length)
442
+ .slice(0, maxFiles);
443
+ const totalFiles = sortedFiles.length;
444
+ const totalIssues = sortedFiles.reduce((sum, [, iss]) => sum + iss.length, 0);
445
+ let md = `# 코드 개선 보고서 (전체)\n\n`;
446
+ md += `- 생성일시: ${dateStr}\n`;
447
+ md += `- 분석 대상: ${report.summary.files_analyzed}개 파일, 총 ${report.summary.total_issues}건\n`;
448
+ md += `- 처리 범위: ${minSeverity} 이상, ${totalFiles}개 파일, ${totalIssues}건\n`;
449
+ md += `- 처리 방식: 파일별 배치 (LLM ${totalFiles}회 호출)\n`;
450
+ md += `\n---\n\n`;
451
+ // TOC
452
+ md += "## 목차\n\n";
453
+ for (let i = 0; i < sortedFiles.length; i++) {
454
+ const [fp, iss] = sortedFiles[i];
455
+ md += `${i + 1}. [${path.basename(fp)}](#) — ${iss.length}건\n`;
456
+ }
457
+ md += "\n---\n\n";
458
+ let successCount = 0;
459
+ let failCount = 0;
460
+ for (const [filepath, issues] of sortedFiles) {
461
+ // Sort issues within file by line number
462
+ const sorted = [...issues].sort((a, b) => a.line - b.line);
463
+ const result = await generateFileBatchImprovement(filepath, sorted);
464
+ if (result.error) {
465
+ md += `## 📄 ${path.basename(filepath)} (${issues.length}건)\n`;
466
+ md += `> ⚠️ ${result.error}\n\n---\n\n`;
467
+ failCount++;
468
+ }
469
+ else {
470
+ md += result.markdown;
471
+ successCount++;
472
+ }
473
+ }
474
+ md += `*Generated by ACTIVO — 파일 ${successCount}/${totalFiles} 성공, ${failCount} 실패*\n`;
475
+ return {
476
+ markdown: md,
477
+ stats: { totalFiles, totalIssues, successCount, failCount },
478
+ };
479
+ }
480
+ // ─── Tool Definition ───
481
+ const generateImprovementReportTool = {
482
+ name: "generate_improvement_report",
483
+ description: "apex 분석 결과(JSON)에서 이슈별 '문제 코드 → 개선 코드' 보고서를 생성합니다. " +
484
+ "mode='representative'(기본): rule_id별 대표사례 (빠름). " +
485
+ "mode='full': 파일별 배치로 모든 이슈 처리 (LLM 호출 = 이슈 있는 파일 수). " +
486
+ "엑셀 행 복붙도 지원합니다. " +
487
+ "Use when user asks: '개선', '코드개선', '개선보고서', '전체개선', 'improvement', 'before after', '감리'.",
488
+ parameters: {
489
+ type: "object",
490
+ required: ["report"],
491
+ properties: {
492
+ report: {
493
+ type: "string",
494
+ description: "apex 분석 결과 JSON 파일 경로, 인라인 JSON, 또는 엑셀에서 복사한 탭 구분 텍스트",
495
+ },
496
+ output_dir: {
497
+ type: "string",
498
+ description: "출력 디렉토리 (기본: 현재 디렉토리)",
499
+ },
500
+ mode: {
501
+ type: "string",
502
+ description: "'representative'(기본, 빠름) | 'full'(모든 이슈, 파일별 배치)",
503
+ },
504
+ min_severity: {
505
+ type: "string",
506
+ description: "최소 심각도 필터: 'low'(기본) | 'medium' | 'high' | 'critical'",
507
+ },
508
+ max_files: {
509
+ type: "number",
510
+ description: "full 모드에서 처리할 최대 파일 수 (기본: 50)",
511
+ },
512
+ },
513
+ },
514
+ handler: async (args) => {
515
+ try {
516
+ const reportArg = args.report;
517
+ const outputDir = args.output_dir || ".";
518
+ const generationMode = args.mode || "representative";
519
+ const minSeverity = args.min_severity || "low";
520
+ const maxFiles = args.max_files || 50;
521
+ const inputMode = detectInputMode(reportArg);
522
+ fs.mkdirSync(outputDir, { recursive: true });
523
+ const timestamp = formatTimestamp();
524
+ // ── Paste mode ──
525
+ if (inputMode === "paste") {
526
+ const pasteIssues = parseExcelPaste(reportArg);
527
+ if (pasteIssues.length === 0) {
528
+ return { success: false, content: "", error: "인식할 수 없는 형식입니다. 탭 구분 텍스트에 rule_id와 파일 경로가 필요합니다." };
529
+ }
530
+ const markdown = await generatePasteImprovements(pasteIssues);
531
+ const mdPath = path.join(outputDir, `improvement_${timestamp}.md`);
532
+ fs.writeFileSync(mdPath, markdown, "utf-8");
533
+ return {
534
+ success: true,
535
+ content: JSON.stringify({
536
+ mode: "paste",
537
+ report_path: mdPath,
538
+ issues_processed: pasteIssues.length,
539
+ message: `선택 이슈 ${pasteIssues.length}건의 개선 보고서가 생성되었습니다: ${mdPath}`,
540
+ }, null, 2),
541
+ };
542
+ }
543
+ const report = loadApexReport(reportArg);
544
+ if (report.issues.length === 0) {
545
+ return {
546
+ success: true,
547
+ content: JSON.stringify({ message: "개선할 이슈가 없습니다." }),
548
+ };
549
+ }
550
+ // ── Full mode: 파일별 배치, 모든 이슈 처리 ──
551
+ if (generationMode === "full") {
552
+ const { markdown, stats } = await generateFullImprovementReport(report, minSeverity, maxFiles);
553
+ const mdPath = path.join(outputDir, `improvement_full_${timestamp}.md`);
554
+ fs.writeFileSync(mdPath, markdown, "utf-8");
555
+ return {
556
+ success: true,
557
+ content: JSON.stringify({
558
+ mode: "full",
559
+ report_path: mdPath,
560
+ total_issues: report.summary.total_issues,
561
+ processed_issues: stats.totalIssues,
562
+ processed_files: stats.totalFiles,
563
+ llm_calls: stats.totalFiles,
564
+ successful: stats.successCount,
565
+ failed: stats.failCount,
566
+ min_severity: minSeverity,
567
+ message: `전체 개선 보고서가 생성되었습니다: ${mdPath} (${stats.totalFiles}개 파일, ${stats.totalIssues}건, LLM ${stats.totalFiles}회 호출)`,
568
+ }, null, 2),
569
+ };
570
+ }
571
+ // ── Representative mode (기존, 기본값) ──
572
+ const groups = groupByRuleId(report.issues);
573
+ const results = new Map();
574
+ for (const group of groups) {
575
+ const result = await generateRuleImprovement(group);
576
+ results.set(group.rule_id, result);
577
+ }
578
+ const markdown = assembleRepresentativeReport(report, groups, results);
579
+ const mdPath = path.join(outputDir, `improvement_${timestamp}.md`);
580
+ fs.writeFileSync(mdPath, markdown, "utf-8");
581
+ const successCount = [...results.values()].filter((r) => !r.error).length;
582
+ return {
583
+ success: true,
584
+ content: JSON.stringify({
585
+ mode: "representative",
586
+ report_path: mdPath,
587
+ total_issues: report.summary.total_issues,
588
+ rule_types: groups.length,
589
+ llm_calls: groups.length,
590
+ successful: successCount,
591
+ failed: groups.length - successCount,
592
+ message: `대표사례 개선 보고서가 생성되었습니다: ${mdPath} (${groups.length}종 rule_id, LLM ${groups.length}회 호출)`,
593
+ }, null, 2),
594
+ };
595
+ }
596
+ catch (error) {
597
+ return { success: false, content: "", error: String(error) };
598
+ }
599
+ },
600
+ };
601
+ export const generateImprovementTools = [generateImprovementReportTool];
602
+ //# sourceMappingURL=generateImprovements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateImprovements.js","sourceRoot":"","sources":["../../../src/core/tools/generateImprovements.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Tool } from "./types.js";
2
+ export declare const generateReportTools: Tool[];
3
+ //# sourceMappingURL=generateReport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateReport.d.ts","sourceRoot":"","sources":["../../../src/core/tools/generateReport.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AA0W9C,eAAO,MAAM,mBAAmB,EAAE,IAAI,EAAyB,CAAC"}