activo 0.4.4 → 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 (161) 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 +203 -384
  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/analyzePatterns.d.ts +3 -0
  62. package/dist/core/tools/analyzePatterns.d.ts.map +1 -0
  63. package/dist/core/tools/analyzePatterns.js +293 -0
  64. package/dist/core/tools/analyzePatterns.js.map +1 -0
  65. package/dist/core/tools/apexPaths.d.ts +14 -0
  66. package/dist/core/tools/apexPaths.d.ts.map +1 -0
  67. package/dist/core/tools/apexPaths.js +54 -0
  68. package/dist/core/tools/apexPaths.js.map +1 -0
  69. package/dist/core/tools/apexUtils.d.ts +36 -0
  70. package/dist/core/tools/apexUtils.d.ts.map +1 -0
  71. package/dist/core/tools/apexUtils.js +83 -0
  72. package/dist/core/tools/apexUtils.js.map +1 -0
  73. package/dist/core/tools/explainIssue.d.ts +3 -0
  74. package/dist/core/tools/explainIssue.d.ts.map +1 -0
  75. package/dist/core/tools/explainIssue.js +181 -0
  76. package/dist/core/tools/explainIssue.js.map +1 -0
  77. package/dist/core/tools/fixGen.d.ts +3 -0
  78. package/dist/core/tools/fixGen.d.ts.map +1 -0
  79. package/dist/core/tools/fixGen.js +338 -0
  80. package/dist/core/tools/fixGen.js.map +1 -0
  81. package/dist/core/tools/generateImprovements.d.ts +21 -0
  82. package/dist/core/tools/generateImprovements.d.ts.map +1 -0
  83. package/dist/core/tools/generateImprovements.js +602 -0
  84. package/dist/core/tools/generateImprovements.js.map +1 -0
  85. package/dist/core/tools/generateReport.d.ts +3 -0
  86. package/dist/core/tools/generateReport.d.ts.map +1 -0
  87. package/dist/core/tools/generateReport.js +315 -0
  88. package/dist/core/tools/generateReport.js.map +1 -0
  89. package/dist/core/tools/index.d.ts +7 -0
  90. package/dist/core/tools/index.d.ts.map +1 -1
  91. package/dist/core/tools/index.js +62 -23
  92. package/dist/core/tools/index.js.map +1 -1
  93. package/dist/core/tools/recommendProfile.d.ts +3 -0
  94. package/dist/core/tools/recommendProfile.d.ts.map +1 -0
  95. package/dist/core/tools/recommendProfile.js +334 -0
  96. package/dist/core/tools/recommendProfile.js.map +1 -0
  97. package/dist/core/tools/ruleGen.d.ts +3 -0
  98. package/dist/core/tools/ruleGen.d.ts.map +1 -0
  99. package/dist/core/tools/ruleGen.js +1103 -0
  100. package/dist/core/tools/ruleGen.js.map +1 -0
  101. package/dist/core/tools/standards.d.ts.map +1 -1
  102. package/dist/core/tools/standards.js +7 -3
  103. package/dist/core/tools/standards.js.map +1 -1
  104. package/dist/ui/App.d.ts.map +1 -1
  105. package/dist/ui/App.js +86 -35
  106. package/dist/ui/App.js.map +1 -1
  107. package/dist/ui/components/InputBox.d.ts +1 -3
  108. package/dist/ui/components/InputBox.d.ts.map +1 -1
  109. package/dist/ui/components/InputBox.js +146 -5
  110. package/dist/ui/components/InputBox.js.map +1 -1
  111. package/dist/ui/components/MessageList.d.ts +3 -1
  112. package/dist/ui/components/MessageList.d.ts.map +1 -1
  113. package/dist/ui/components/MessageList.js +13 -7
  114. package/dist/ui/components/MessageList.js.map +1 -1
  115. package/dist/ui/components/StatusBar.d.ts +1 -1
  116. package/dist/ui/components/StatusBar.d.ts.map +1 -1
  117. package/dist/ui/components/StatusBar.js +3 -2
  118. package/dist/ui/components/StatusBar.js.map +1 -1
  119. package/dist/ui/components/ToolStatus.d.ts +3 -1
  120. package/dist/ui/components/ToolStatus.d.ts.map +1 -1
  121. package/dist/ui/components/ToolStatus.js +19 -4
  122. package/dist/ui/components/ToolStatus.js.map +1 -1
  123. package/package.json +7 -1
  124. package/demo.gif +0 -0
  125. package/demo.tape +0 -53
  126. package/screenshot.png +0 -0
  127. package/src/cli/banner.ts +0 -38
  128. package/src/cli/headless.ts +0 -63
  129. package/src/cli/index.ts +0 -57
  130. package/src/core/agent.ts +0 -711
  131. package/src/core/commands.ts +0 -118
  132. package/src/core/config.ts +0 -98
  133. package/src/core/conversation.ts +0 -235
  134. package/src/core/llm/ollama.ts +0 -351
  135. package/src/core/mcp/client.ts +0 -143
  136. package/src/core/tools/analyzeAll.ts +0 -482
  137. package/src/core/tools/ast.ts +0 -826
  138. package/src/core/tools/builtIn.ts +0 -221
  139. package/src/core/tools/cache.ts +0 -570
  140. package/src/core/tools/cssAnalysis.ts +0 -324
  141. package/src/core/tools/dependencyAnalysis.ts +0 -363
  142. package/src/core/tools/embeddings.ts +0 -746
  143. package/src/core/tools/frontendAst.ts +0 -802
  144. package/src/core/tools/htmlAnalysis.ts +0 -466
  145. package/src/core/tools/index.ts +0 -160
  146. package/src/core/tools/javaAst.ts +0 -1030
  147. package/src/core/tools/javaQuality.integration.test.ts +0 -537
  148. package/src/core/tools/memory.ts +0 -655
  149. package/src/core/tools/mybatisAnalysis.ts +0 -322
  150. package/src/core/tools/openapiAnalysis.ts +0 -431
  151. package/src/core/tools/pythonAnalysis.ts +0 -477
  152. package/src/core/tools/sqlAnalysis.ts +0 -298
  153. package/src/core/tools/standards.test.ts +0 -186
  154. package/src/core/tools/standards.ts +0 -889
  155. package/src/core/tools/types.ts +0 -38
  156. package/src/ui/App.tsx +0 -334
  157. package/src/ui/components/InputBox.tsx +0 -37
  158. package/src/ui/components/MessageList.tsx +0 -80
  159. package/src/ui/components/StatusBar.tsx +0 -36
  160. package/src/ui/components/ToolStatus.tsx +0 -38
  161. package/tsconfig.json +0 -21
@@ -0,0 +1,181 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import yaml from "js-yaml";
4
+ import { resolveRulesetsDir } from "./apexPaths.js";
5
+ // Module-level cache
6
+ let cachedRules = null;
7
+ let cachedDir = null;
8
+ // ─── YAML Rule Loading ───
9
+ function loadAllRules(rulesetsDir) {
10
+ // Return cache if same directory
11
+ if (cachedRules && cachedDir === rulesetsDir) {
12
+ return cachedRules;
13
+ }
14
+ const rules = new Map();
15
+ if (!fs.existsSync(rulesetsDir))
16
+ return rules;
17
+ const files = fs.readdirSync(rulesetsDir).filter((f) => f.endsWith(".yaml") || f.endsWith(".yml"));
18
+ for (const file of files) {
19
+ try {
20
+ const content = fs.readFileSync(path.join(rulesetsDir, file), "utf-8");
21
+ const data = yaml.load(content);
22
+ const languages = data.languages;
23
+ if (!Array.isArray(languages))
24
+ continue;
25
+ for (const lang of languages) {
26
+ const langName = (lang.language || "");
27
+ const langRules = lang.rules;
28
+ if (!Array.isArray(langRules))
29
+ continue;
30
+ for (const r of langRules) {
31
+ const rule = {
32
+ id: r.id || "",
33
+ name: r.name || "",
34
+ description: r.description || "",
35
+ severity: r.severity || "medium",
36
+ category: r.category || "",
37
+ enabled: r.enabled !== false,
38
+ pattern: r.pattern,
39
+ suggestion: r.suggestion || r.fix || "",
40
+ language: langName,
41
+ };
42
+ if (rule.id) {
43
+ rules.set(rule.id, rule);
44
+ }
45
+ }
46
+ }
47
+ }
48
+ catch {
49
+ // Skip invalid YAML files
50
+ }
51
+ }
52
+ // Update cache
53
+ cachedRules = rules;
54
+ cachedDir = rulesetsDir;
55
+ return rules;
56
+ }
57
+ // ─── Tool Definition ───
58
+ const explainIssueTool = {
59
+ name: "explain_issue",
60
+ description: "apex 규칙 ID로 이슈를 설명합니다. 규칙 정의, 카테고리, 패턴, 수정 제안, 관련 규칙을 반환합니다. Use when user asks: '이슈설명', '규칙설명', '왜 문제', 'explain issue', 'rule explain'.",
61
+ parameters: {
62
+ type: "object",
63
+ required: ["rule_id"],
64
+ properties: {
65
+ rule_id: {
66
+ type: "string",
67
+ description: "설명할 apex 규칙 ID (예: quality-nc-001, secure-si-001)",
68
+ },
69
+ rulesets_dir: {
70
+ type: "string",
71
+ description: "apex configs/rulesets/ 디렉토리 경로 (생략 시 번들된 규칙 사용)",
72
+ },
73
+ code_snippet: {
74
+ type: "string",
75
+ description: "문제 코드 스니펫 (선택, LLM이 맥락적 설명에 활용)",
76
+ },
77
+ },
78
+ },
79
+ handler: async (args) => {
80
+ try {
81
+ const ruleId = args.rule_id;
82
+ const rulesetsDir = resolveRulesetsDir(args.rulesets_dir);
83
+ const codeSnippet = args.code_snippet || "";
84
+ if (!fs.existsSync(rulesetsDir)) {
85
+ return { success: false, content: "", error: `규칙셋 디렉토리 없음: ${rulesetsDir}` };
86
+ }
87
+ // Load all rules
88
+ const rules = loadAllRules(rulesetsDir);
89
+ if (rules.size === 0) {
90
+ return { success: false, content: "", error: "규칙을 로드할 수 없습니다. YAML 파일을 확인하세요." };
91
+ }
92
+ // Find the target rule
93
+ const rule = rules.get(ruleId);
94
+ if (!rule) {
95
+ // Try partial match
96
+ const partialMatches = [];
97
+ for (const [id, r] of rules) {
98
+ if (id.includes(ruleId) || ruleId.includes(id)) {
99
+ partialMatches.push(r);
100
+ }
101
+ }
102
+ if (partialMatches.length > 0) {
103
+ return {
104
+ success: true,
105
+ content: JSON.stringify({
106
+ found: false,
107
+ message: `정확한 규칙 ID '${ruleId}'를 찾을 수 없습니다.`,
108
+ suggestions: partialMatches.slice(0, 10).map((r) => ({
109
+ id: r.id,
110
+ name: r.name,
111
+ category: r.category,
112
+ })),
113
+ total_rules: rules.size,
114
+ }, null, 2),
115
+ };
116
+ }
117
+ return {
118
+ success: true,
119
+ content: JSON.stringify({
120
+ found: false,
121
+ message: `규칙 ID '${ruleId}'를 찾을 수 없습니다.`,
122
+ total_rules: rules.size,
123
+ hint: "규칙 ID 예시: quality-nc-001, secure-si-001",
124
+ }, null, 2),
125
+ };
126
+ }
127
+ // Find related rules in the same category
128
+ const relatedRules = [];
129
+ for (const [, r] of rules) {
130
+ if (r.category === rule.category && r.id !== rule.id) {
131
+ relatedRules.push({ id: r.id, name: r.name, severity: r.severity });
132
+ if (relatedRules.length >= 5)
133
+ break;
134
+ }
135
+ }
136
+ // Build pattern explanation
137
+ let patternExplanation = "";
138
+ if (rule.pattern) {
139
+ const pt = rule.pattern;
140
+ patternExplanation = `검출 방식: ${pt.type}`;
141
+ if (pt.regex)
142
+ patternExplanation += ` | 정규식: ${pt.regex}`;
143
+ if (pt.annotation)
144
+ patternExplanation += ` | 어노테이션: ${pt.annotation}`;
145
+ if (pt.method)
146
+ patternExplanation += ` | 메서드: ${pt.method}`;
147
+ if (pt.className)
148
+ patternExplanation += ` | 클래스: ${pt.className}`;
149
+ }
150
+ const result = {
151
+ found: true,
152
+ rule: {
153
+ id: rule.id,
154
+ name: rule.name,
155
+ description: rule.description,
156
+ severity: rule.severity,
157
+ category: rule.category,
158
+ language: rule.language,
159
+ enabled: rule.enabled,
160
+ pattern_explanation: patternExplanation || undefined,
161
+ suggestion: rule.suggestion || undefined,
162
+ },
163
+ related_rules: relatedRules,
164
+ category_total: relatedRules.length + 1,
165
+ };
166
+ if (codeSnippet) {
167
+ result.code_snippet = codeSnippet;
168
+ result.analysis_hint = "LLM: 위 코드 스니펫에 이 규칙이 어떻게 적용되는지 설명해주세요.";
169
+ }
170
+ return {
171
+ success: true,
172
+ content: JSON.stringify(result, null, 2),
173
+ };
174
+ }
175
+ catch (error) {
176
+ return { success: false, content: "", error: String(error) };
177
+ }
178
+ },
179
+ };
180
+ export const explainIssueTools = [explainIssueTool];
181
+ //# sourceMappingURL=explainIssue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explainIssue.js","sourceRoot":"","sources":["../../../src/core/tools/explainIssue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Tool } from "./types.js";
2
+ export declare const fixGenTools: Tool[];
3
+ //# sourceMappingURL=fixGen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixGen.d.ts","sourceRoot":"","sources":["../../../src/core/tools/fixGen.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AA4a9C,eAAO,MAAM,WAAW,EAAE,IAAI,EAAwB,CAAC"}
@@ -0,0 +1,338 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { OllamaClient } from "../llm/ollama.js";
4
+ import { AnthropicClient } from "../llm/anthropic.js";
5
+ import { loadConfig } from "../config.js";
6
+ // ─── Report Parsing ───
7
+ function parseReport(reportPath) {
8
+ const content = fs.readFileSync(reportPath, "utf-8");
9
+ const data = JSON.parse(content);
10
+ // Format 1: { issues: [...] }
11
+ if (Array.isArray(data.issues)) {
12
+ return data.issues.map(normalizeIssue);
13
+ }
14
+ // Format 2: apex MCP output { top_issues: [...] }
15
+ if (Array.isArray(data.top_issues)) {
16
+ return data.top_issues.map((issue) => ({
17
+ rule_id: issue.rule_id || issue.id || "unknown",
18
+ file: issue.file || issue.filepath || "",
19
+ line: issue.line || 0,
20
+ severity: issue.severity || "medium",
21
+ category: issue.category,
22
+ message: issue.message || issue.description || "",
23
+ suggestion: issue.suggestion || issue.fix,
24
+ }));
25
+ }
26
+ // Format 3: direct array
27
+ if (Array.isArray(data)) {
28
+ return data.map(normalizeIssue);
29
+ }
30
+ throw new Error("지원하지 않는 리포트 형식입니다. { issues: [...] } 형식이 필요합니다.");
31
+ }
32
+ function normalizeIssue(issue) {
33
+ return {
34
+ rule_id: issue.rule_id || issue.id || "unknown",
35
+ file: issue.file || issue.filepath || "",
36
+ line: issue.line || 0,
37
+ severity: issue.severity || "medium",
38
+ category: issue.category,
39
+ message: issue.message || issue.description || "",
40
+ suggestion: issue.suggestion || issue.fix,
41
+ };
42
+ }
43
+ // ─── Issue Grouping ───
44
+ function groupIssuesByFile(issues) {
45
+ const groups = new Map();
46
+ for (const issue of issues) {
47
+ if (!issue.file)
48
+ continue;
49
+ if (!groups.has(issue.file))
50
+ groups.set(issue.file, []);
51
+ groups.get(issue.file).push(issue);
52
+ }
53
+ // Sort issues within each file by line number
54
+ return Array.from(groups.entries()).map(([filepath, issues]) => ({
55
+ filepath,
56
+ issues: issues.sort((a, b) => a.line - b.line),
57
+ }));
58
+ }
59
+ // ─── Source Context Reading ───
60
+ function readSourceContext(filepath, issues, contextLines) {
61
+ if (!fs.existsSync(filepath)) {
62
+ return `// File not found: ${filepath}`;
63
+ }
64
+ const content = fs.readFileSync(filepath, "utf-8");
65
+ const lines = content.split("\n");
66
+ // Find the range of lines needed
67
+ let minLine = Infinity;
68
+ let maxLine = 0;
69
+ for (const issue of issues) {
70
+ if (issue.line > 0) {
71
+ minLine = Math.min(minLine, issue.line - contextLines);
72
+ maxLine = Math.max(maxLine, issue.line + contextLines);
73
+ }
74
+ }
75
+ // If all issues have line 0 or no lines, return first 100 lines
76
+ if (minLine === Infinity) {
77
+ minLine = 1;
78
+ maxLine = Math.min(100, lines.length);
79
+ }
80
+ minLine = Math.max(1, minLine);
81
+ maxLine = Math.min(lines.length, maxLine);
82
+ // If range is too large, just return issue lines with context
83
+ if (maxLine - minLine > 200) {
84
+ const segments = [];
85
+ for (const issue of issues) {
86
+ const start = Math.max(1, issue.line - contextLines);
87
+ const end = Math.min(lines.length, issue.line + contextLines);
88
+ const segment = lines.slice(start - 1, end).map((line, i) => `${start + i}\t${line}`).join("\n");
89
+ segments.push(`// ... (line ${start}-${end})\n${segment}`);
90
+ }
91
+ return segments.join("\n// ...\n");
92
+ }
93
+ return lines.slice(minLine - 1, maxLine).map((line, i) => `${minLine + i}\t${line}`).join("\n");
94
+ }
95
+ // ─── LLM Prompt ───
96
+ function buildFixPrompt(filepath, issues, sourceCode) {
97
+ const ext = path.extname(filepath).replace(".", "");
98
+ const lang = { java: "java", js: "javascript", ts: "typescript", py: "python", xml: "xml", sql: "sql" }[ext] || ext;
99
+ const issuesList = issues.map((issue, i) => {
100
+ let line = `${i + 1}. Line ${issue.line}: [${issue.rule_id}] ${issue.message}`;
101
+ if (issue.suggestion) {
102
+ line += ` (suggestion: ${issue.suggestion})`;
103
+ }
104
+ return line;
105
+ }).join("\n");
106
+ return `Fix the issues in this source code. Output a unified diff.
107
+
108
+ ## File: ${filepath}
109
+
110
+ ## Issues:
111
+ ${issuesList}
112
+
113
+ ## Source Code:
114
+ \`\`\`${lang}
115
+ ${sourceCode}
116
+ \`\`\`
117
+
118
+ ## Output Format
119
+ Output ONLY:
120
+ 1. A unified diff (--- a/... +++ b/... @@ ... @@)
121
+ 2. A one-line EXPLANATION
122
+
123
+ \`\`\`diff
124
+ --- a/${filepath}
125
+ +++ b/${filepath}
126
+ @@ ... @@
127
+ context line
128
+ -removed line
129
+ +added line
130
+ \`\`\`
131
+ EXPLANATION: brief description of changes
132
+
133
+ IMPORTANT:
134
+ - Fix ALL listed issues
135
+ - Keep minimal changes (don't reformat unrelated code)
136
+ - Preserve original indentation style
137
+ - If an issue cannot be fixed, explain why in EXPLANATION`;
138
+ }
139
+ // ─── Diff Parsing ───
140
+ function extractDiffAndExplanation(response) {
141
+ let diff = "";
142
+ let explanation = "";
143
+ // Extract diff block
144
+ const diffMatch = response.match(/```diff\s*\n([\s\S]*?)```/);
145
+ if (diffMatch) {
146
+ diff = diffMatch[1].trim();
147
+ }
148
+ else {
149
+ // Try to find diff-like content without code block
150
+ const lines = response.split("\n");
151
+ const diffLines = [];
152
+ let inDiff = false;
153
+ for (const line of lines) {
154
+ if (line.startsWith("--- a/") || line.startsWith("--- ")) {
155
+ inDiff = true;
156
+ }
157
+ if (inDiff) {
158
+ diffLines.push(line);
159
+ if (line.trim() === "" && diffLines.length > 3) {
160
+ // End of diff hunk
161
+ break;
162
+ }
163
+ }
164
+ }
165
+ diff = diffLines.join("\n").trim();
166
+ }
167
+ // Extract explanation
168
+ const explMatch = response.match(/EXPLANATION:\s*(.+)/i);
169
+ if (explMatch) {
170
+ explanation = explMatch[1].trim();
171
+ }
172
+ return { diff, explanation };
173
+ }
174
+ // ─── LLM Client Creation ───
175
+ function createLLMClient() {
176
+ const config = loadConfig();
177
+ if (config.provider === "anthropic") {
178
+ return new AnthropicClient(config.anthropic);
179
+ }
180
+ return new OllamaClient(config.ollama);
181
+ }
182
+ // ─── Main Tool ───
183
+ const generateFixesTool = {
184
+ name: "generate_fixes",
185
+ description: "APEX 검사 리포트의 이슈들에 대해 수정 코드(diff)를 자동 생성합니다. Use when user asks: '코드수정', '수정코드', 'generate fix', '개선코드', '패치'.",
186
+ parameters: {
187
+ type: "object",
188
+ required: ["report_path"],
189
+ properties: {
190
+ report_path: {
191
+ type: "string",
192
+ description: "APEX JSON 리포트 경로 (또는 MCP 결과 JSON)",
193
+ },
194
+ output_dir: {
195
+ type: "string",
196
+ description: "출력 디렉토리 (기본: .activo/fixes)",
197
+ },
198
+ max_issues_per_file: {
199
+ type: "number",
200
+ description: "파일당 최대 이슈 수 (초과 시 스킵, 기본: 20)",
201
+ },
202
+ context_lines: {
203
+ type: "number",
204
+ description: "이슈 라인 전후 컨텍스트 줄 수 (기본: 10)",
205
+ },
206
+ },
207
+ },
208
+ handler: async (args) => {
209
+ try {
210
+ const reportPath = args.report_path;
211
+ const outputDir = args.output_dir || ".activo/fixes";
212
+ const maxIssuesPerFile = args.max_issues_per_file || 20;
213
+ const contextLines = args.context_lines || 10;
214
+ // Validate input
215
+ if (!fs.existsSync(reportPath)) {
216
+ return { success: false, content: "", error: `리포트 파일 없음: ${reportPath}` };
217
+ }
218
+ // 1. Parse report
219
+ const issues = parseReport(reportPath);
220
+ if (issues.length === 0) {
221
+ return { success: true, content: JSON.stringify({ message: "이슈가 없습니다", totalIssues: 0 }) };
222
+ }
223
+ // 2. Group by file
224
+ const fileGroups = groupIssuesByFile(issues);
225
+ // 3. Process each file
226
+ const client = createLLMClient();
227
+ const fixResults = [];
228
+ const skippedFiles = [];
229
+ let errorCount = 0;
230
+ fs.mkdirSync(outputDir, { recursive: true });
231
+ const perFileTimeout = 90000; // 90 seconds per file
232
+ for (let fi = 0; fi < fileGroups.length; fi++) {
233
+ const group = fileGroups[fi];
234
+ const progress = `[${fi + 1}/${fileGroups.length}]`;
235
+ // Skip files with too many issues
236
+ if (group.issues.length > maxIssuesPerFile) {
237
+ skippedFiles.push(`${group.filepath} (${group.issues.length} issues > ${maxIssuesPerFile} max)`);
238
+ continue;
239
+ }
240
+ // Skip non-existent files
241
+ if (!fs.existsSync(group.filepath)) {
242
+ skippedFiles.push(`${group.filepath} (파일 없음)`);
243
+ continue;
244
+ }
245
+ try {
246
+ console.error(`${progress} Generating fix: ${path.basename(group.filepath)} (${group.issues.length} issues)...`);
247
+ // Read source context
248
+ const sourceCode = readSourceContext(group.filepath, group.issues, contextLines);
249
+ // Build prompt and call LLM with timeout
250
+ const prompt = buildFixPrompt(group.filepath, group.issues, sourceCode);
251
+ const chatPromise = client.chat([{ role: "user", content: prompt }]);
252
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error(`타임아웃 (${perFileTimeout / 1000}초)`)), perFileTimeout));
253
+ const response = await Promise.race([chatPromise, timeoutPromise]);
254
+ // Extract diff
255
+ const { diff, explanation } = extractDiffAndExplanation(response.content);
256
+ if (diff) {
257
+ // Save diff file
258
+ const safeName = group.filepath.replace(/[/\\]/g, "_").replace(/^_/, "");
259
+ const diffPath = path.join(outputDir, `${safeName}.diff`);
260
+ fs.writeFileSync(diffPath, diff, "utf-8");
261
+ fixResults.push({
262
+ filepath: group.filepath,
263
+ diff,
264
+ explanation,
265
+ issueCount: group.issues.length,
266
+ });
267
+ console.error(`${progress} ✓ ${path.basename(group.filepath)}`);
268
+ }
269
+ else {
270
+ errorCount++;
271
+ skippedFiles.push(`${group.filepath} (diff 생성 실패)`);
272
+ console.error(`${progress} ✗ ${path.basename(group.filepath)} - diff 생성 실패`);
273
+ }
274
+ }
275
+ catch (e) {
276
+ errorCount++;
277
+ const errMsg = e instanceof Error ? e.message : String(e);
278
+ skippedFiles.push(`${group.filepath} (오류: ${errMsg})`);
279
+ console.error(`${progress} ✗ ${path.basename(group.filepath)} - ${errMsg}`);
280
+ }
281
+ }
282
+ // 4. Generate summary
283
+ const summaryMd = generateFixSummaryMd(fixResults, skippedFiles, issues.length);
284
+ fs.writeFileSync(path.join(outputDir, "_fix_summary.md"), summaryMd, "utf-8");
285
+ const summary = {
286
+ totalFiles: fileGroups.length,
287
+ fixedFiles: fixResults.length,
288
+ skippedFiles: skippedFiles.length,
289
+ totalIssues: issues.length,
290
+ fixedIssues: fixResults.reduce((sum, r) => sum + r.issueCount, 0),
291
+ errors: errorCount,
292
+ outputDir,
293
+ };
294
+ return {
295
+ success: true,
296
+ content: JSON.stringify(summary, null, 2),
297
+ };
298
+ }
299
+ catch (error) {
300
+ return { success: false, content: "", error: String(error) };
301
+ }
302
+ },
303
+ };
304
+ // ─── Summary Generation ───
305
+ function generateFixSummaryMd(fixResults, skippedFiles, totalIssues) {
306
+ let md = "# Fix Generation Summary\n\n";
307
+ md += `- 전체 이슈: ${totalIssues}건\n`;
308
+ md += `- 수정 생성: ${fixResults.length}개 파일, ${fixResults.reduce((s, r) => s + r.issueCount, 0)}건\n`;
309
+ md += `- 스킵: ${skippedFiles.length}개 파일\n\n`;
310
+ if (fixResults.length > 0) {
311
+ md += "## 수정된 파일\n\n";
312
+ md += "| 파일 | 이슈 수 | 설명 |\n";
313
+ md += "|------|---------|------|\n";
314
+ for (const r of fixResults) {
315
+ md += `| ${r.filepath} | ${r.issueCount} | ${r.explanation.slice(0, 80)} |\n`;
316
+ }
317
+ md += "\n";
318
+ }
319
+ if (skippedFiles.length > 0) {
320
+ md += "## 스킵된 파일\n\n";
321
+ for (const f of skippedFiles) {
322
+ md += `- ${f}\n`;
323
+ }
324
+ md += "\n";
325
+ }
326
+ md += "## 사용법\n\n";
327
+ md += "```bash\n";
328
+ md += "# diff 적용\n";
329
+ md += "cd /path/to/project\n";
330
+ md += "patch -p1 < .activo/fixes/파일명.diff\n";
331
+ md += "\n";
332
+ md += "# 또는 git apply\n";
333
+ md += "git apply .activo/fixes/파일명.diff\n";
334
+ md += "```\n";
335
+ return md;
336
+ }
337
+ export const fixGenTools = [generateFixesTool];
338
+ //# sourceMappingURL=fixGen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixGen.js","sourceRoot":"","sources":["../../../src/core/tools/fixGen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Tool } from "./types.js";
2
+ interface ParsedPasteIssue {
3
+ rule_id: string;
4
+ severity: string;
5
+ category: string;
6
+ file: string;
7
+ line: number;
8
+ message: string;
9
+ }
10
+ /**
11
+ * Detect if input is tab-separated Excel paste.
12
+ */
13
+ export declare function isExcelPaste(text: string): boolean;
14
+ /**
15
+ * Parse tab-separated Excel paste into issues.
16
+ * Auto-detects column positions by content patterns.
17
+ */
18
+ export declare function parseExcelPaste(text: string): ParsedPasteIssue[];
19
+ export declare const generateImprovementTools: Tool[];
20
+ export {};
21
+ //# sourceMappingURL=generateImprovements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateImprovements.d.ts","sourceRoot":"","sources":["../../../src/core/tools/generateImprovements.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AA4O9C,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOlD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAkEhE;AAkZD,eAAO,MAAM,wBAAwB,EAAE,IAAI,EAAoC,CAAC"}