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.
- package/README.md +203 -1
- package/data/2026-03-04_20-54.json +181 -0
- package/data/2026-03-04_20-56.json +181 -0
- package/data/apex-rulesets/egov.yaml +469 -0
- package/data/apex-rulesets/modernize.yaml +687 -0
- package/data/apex-rulesets/quality.yaml +1677 -0
- package/data/apex-rulesets/rule-schema.yaml +587 -0
- package/data/apex-rulesets/secure.yaml +1688 -0
- package/data/apex-rulesets/spring.yaml +455 -0
- package/data/apex-rulesets/sql-format.yaml +99 -0
- package/data/apex-rulesets/sql-oracle.yaml +281 -0
- package/data/apex-rulesets/sql.yaml +1660 -0
- package/dist/cli/headless.d.ts.map +1 -1
- package/dist/cli/headless.js +32 -10
- package/dist/cli/headless.js.map +1 -1
- package/dist/cli/index.js +31 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/core/agent.d.ts +3 -3
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +255 -17
- package/dist/core/agent.js.map +1 -1
- package/dist/core/commands.d.ts +2 -1
- package/dist/core/commands.d.ts.map +1 -1
- package/dist/core/commands.js +61 -9
- package/dist/core/commands.js.map +1 -1
- package/dist/core/config.d.ts +14 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +41 -4
- package/dist/core/config.js.map +1 -1
- package/dist/core/conversation.d.ts +2 -2
- package/dist/core/conversation.d.ts.map +1 -1
- package/dist/core/conversation.js.map +1 -1
- package/dist/core/intentRouter.d.ts +43 -0
- package/dist/core/intentRouter.d.ts.map +1 -0
- package/dist/core/intentRouter.js +804 -0
- package/dist/core/intentRouter.js.map +1 -0
- package/dist/core/llm/anthropic.d.ts +24 -0
- package/dist/core/llm/anthropic.d.ts.map +1 -0
- package/dist/core/llm/anthropic.js +226 -0
- package/dist/core/llm/anthropic.js.map +1 -0
- package/dist/core/llm/ollama.d.ts +5 -14
- package/dist/core/llm/ollama.d.ts.map +1 -1
- package/dist/core/llm/ollama.js +3 -0
- package/dist/core/llm/ollama.js.map +1 -1
- package/dist/core/llm/types.d.ts +22 -0
- package/dist/core/llm/types.d.ts.map +1 -0
- package/dist/core/llm/types.js +2 -0
- package/dist/core/llm/types.js.map +1 -0
- package/dist/core/mcp/client.d.ts +6 -0
- package/dist/core/mcp/client.d.ts.map +1 -1
- package/dist/core/mcp/client.js +16 -0
- package/dist/core/mcp/client.js.map +1 -1
- package/dist/core/mcp/init.d.ts +12 -0
- package/dist/core/mcp/init.d.ts.map +1 -0
- package/dist/core/mcp/init.js +55 -0
- package/dist/core/mcp/init.js.map +1 -0
- package/dist/core/mcp/logger.d.ts +14 -0
- package/dist/core/mcp/logger.d.ts.map +1 -0
- package/dist/core/mcp/logger.js +50 -0
- package/dist/core/mcp/logger.js.map +1 -0
- package/dist/core/tools/analyzeAll.d.ts.map +1 -1
- package/dist/core/tools/analyzeAll.js +16 -28
- package/dist/core/tools/analyzeAll.js.map +1 -1
- package/dist/core/tools/analyzePatterns.d.ts +3 -0
- package/dist/core/tools/analyzePatterns.d.ts.map +1 -0
- package/dist/core/tools/analyzePatterns.js +293 -0
- package/dist/core/tools/analyzePatterns.js.map +1 -0
- package/dist/core/tools/apexPaths.d.ts +14 -0
- package/dist/core/tools/apexPaths.d.ts.map +1 -0
- package/dist/core/tools/apexPaths.js +54 -0
- package/dist/core/tools/apexPaths.js.map +1 -0
- package/dist/core/tools/apexUtils.d.ts +36 -0
- package/dist/core/tools/apexUtils.d.ts.map +1 -0
- package/dist/core/tools/apexUtils.js +83 -0
- package/dist/core/tools/apexUtils.js.map +1 -0
- package/dist/core/tools/explainIssue.d.ts +3 -0
- package/dist/core/tools/explainIssue.d.ts.map +1 -0
- package/dist/core/tools/explainIssue.js +181 -0
- package/dist/core/tools/explainIssue.js.map +1 -0
- package/dist/core/tools/fixGen.d.ts +3 -0
- package/dist/core/tools/fixGen.d.ts.map +1 -0
- package/dist/core/tools/fixGen.js +338 -0
- package/dist/core/tools/fixGen.js.map +1 -0
- package/dist/core/tools/generateImprovements.d.ts +21 -0
- package/dist/core/tools/generateImprovements.d.ts.map +1 -0
- package/dist/core/tools/generateImprovements.js +602 -0
- package/dist/core/tools/generateImprovements.js.map +1 -0
- package/dist/core/tools/generateReport.d.ts +3 -0
- package/dist/core/tools/generateReport.d.ts.map +1 -0
- package/dist/core/tools/generateReport.js +315 -0
- package/dist/core/tools/generateReport.js.map +1 -0
- package/dist/core/tools/index.d.ts +7 -0
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +62 -23
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/javaAst.d.ts.map +1 -1
- package/dist/core/tools/javaAst.js +191 -0
- package/dist/core/tools/javaAst.js.map +1 -1
- package/dist/core/tools/recommendProfile.d.ts +3 -0
- package/dist/core/tools/recommendProfile.d.ts.map +1 -0
- package/dist/core/tools/recommendProfile.js +334 -0
- package/dist/core/tools/recommendProfile.js.map +1 -0
- package/dist/core/tools/ruleGen.d.ts +3 -0
- package/dist/core/tools/ruleGen.d.ts.map +1 -0
- package/dist/core/tools/ruleGen.js +1103 -0
- package/dist/core/tools/ruleGen.js.map +1 -0
- package/dist/core/tools/standards.d.ts.map +1 -1
- package/dist/core/tools/standards.js +7 -3
- package/dist/core/tools/standards.js.map +1 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +86 -35
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/components/InputBox.d.ts +1 -3
- package/dist/ui/components/InputBox.d.ts.map +1 -1
- package/dist/ui/components/InputBox.js +146 -5
- package/dist/ui/components/InputBox.js.map +1 -1
- package/dist/ui/components/MessageList.d.ts +3 -1
- package/dist/ui/components/MessageList.d.ts.map +1 -1
- package/dist/ui/components/MessageList.js +13 -7
- package/dist/ui/components/MessageList.js.map +1 -1
- package/dist/ui/components/StatusBar.d.ts +1 -1
- package/dist/ui/components/StatusBar.d.ts.map +1 -1
- package/dist/ui/components/StatusBar.js +3 -2
- package/dist/ui/components/StatusBar.js.map +1 -1
- package/dist/ui/components/ToolStatus.d.ts +3 -1
- package/dist/ui/components/ToolStatus.d.ts.map +1 -1
- package/dist/ui/components/ToolStatus.js +19 -4
- package/dist/ui/components/ToolStatus.js.map +1 -1
- package/package.json +7 -1
- package/demo.gif +0 -0
- package/demo.tape +0 -53
- package/screenshot.png +0 -0
- package/src/cli/banner.ts +0 -38
- package/src/cli/headless.ts +0 -63
- package/src/cli/index.ts +0 -57
- package/src/core/agent.ts +0 -237
- package/src/core/commands.ts +0 -118
- package/src/core/config.ts +0 -98
- package/src/core/conversation.ts +0 -235
- package/src/core/llm/ollama.ts +0 -351
- package/src/core/mcp/client.ts +0 -143
- package/src/core/tools/analyzeAll.ts +0 -494
- package/src/core/tools/ast.ts +0 -826
- package/src/core/tools/builtIn.ts +0 -221
- package/src/core/tools/cache.ts +0 -570
- package/src/core/tools/cssAnalysis.ts +0 -324
- package/src/core/tools/dependencyAnalysis.ts +0 -363
- package/src/core/tools/embeddings.ts +0 -746
- package/src/core/tools/frontendAst.ts +0 -802
- package/src/core/tools/htmlAnalysis.ts +0 -466
- package/src/core/tools/index.ts +0 -160
- package/src/core/tools/javaAst.ts +0 -812
- package/src/core/tools/memory.ts +0 -655
- package/src/core/tools/mybatisAnalysis.ts +0 -322
- package/src/core/tools/openapiAnalysis.ts +0 -431
- package/src/core/tools/pythonAnalysis.ts +0 -477
- package/src/core/tools/sqlAnalysis.ts +0 -298
- package/src/core/tools/standards.test.ts +0 -186
- package/src/core/tools/standards.ts +0 -889
- package/src/core/tools/types.ts +0 -38
- package/src/ui/App.tsx +0 -334
- package/src/ui/components/InputBox.tsx +0 -37
- package/src/ui/components/MessageList.tsx +0 -80
- package/src/ui/components/StatusBar.tsx +0 -36
- package/src/ui/components/ToolStatus.tsx +0 -38
- 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 @@
|
|
|
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"}
|