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 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/core/mcp/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,cAAc,GAAG,IAAI,CAAC;AAE5B,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAc;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC;IACpC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAEhC,KAAK,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACzD,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACxD,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;gBACxC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,sBAAsB,OAAO,GAAG,EAAE,CAAC,CAAC;gBACxG,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;gBACxC,SAAS,GAAG,IAAI,CAAC;gBACjB,MAAM;YACR,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACxE,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,OAAO,IAAI,WAAW,YAAY,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAC3H,OAAO,CAAC,KAAK,CAAC,iBAAiB,OAAO,IAAI,WAAW,SAAS,EAAE,aAAa,QAAQ,EAAE,CAAC,CAAC;gBACzF,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;oBAC1B,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,WAAW,kBAAkB,EAAE,CAAC,CAAC;YAC1G,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,WAAW,WAAW,WAAW,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,IAAI,CAAC;QACH,MAAM,aAAa,EAAE,CAAC,aAAa,EAAE,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface MCPLogEntry {
2
+ timestamp: string;
3
+ level: "info" | "warn" | "error";
4
+ server_id: string;
5
+ event: string;
6
+ message: string;
7
+ details?: unknown;
8
+ }
9
+ /**
10
+ * Append a structured log entry to .activo/mcp.log.
11
+ * Auto-rotates when file exceeds 1MB (keeps last 500 lines).
12
+ */
13
+ export declare function logMCP(entry: Omit<MCPLogEntry, "timestamp">): void;
14
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/logger.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAWD;;;GAGG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,IAAI,CAkClE"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * MCP 구조화된 로거 — .activo/mcp.log에 JSON 라인 기록
3
+ */
4
+ import fs from "fs";
5
+ import path from "path";
6
+ const LOG_DIR = ".activo";
7
+ const LOG_FILE = "mcp.log";
8
+ const MAX_LOG_SIZE = 1 * 1024 * 1024; // 1MB
9
+ const KEEP_LINES = 500;
10
+ function getLogPath() {
11
+ return path.join(process.cwd(), LOG_DIR, LOG_FILE);
12
+ }
13
+ /**
14
+ * Append a structured log entry to .activo/mcp.log.
15
+ * Auto-rotates when file exceeds 1MB (keeps last 500 lines).
16
+ */
17
+ export function logMCP(entry) {
18
+ try {
19
+ const logPath = getLogPath();
20
+ const dir = path.dirname(logPath);
21
+ // Ensure directory exists
22
+ if (!fs.existsSync(dir)) {
23
+ fs.mkdirSync(dir, { recursive: true });
24
+ }
25
+ // Check file size and rotate if needed
26
+ if (fs.existsSync(logPath)) {
27
+ try {
28
+ const stat = fs.statSync(logPath);
29
+ if (stat.size > MAX_LOG_SIZE) {
30
+ const content = fs.readFileSync(logPath, "utf-8");
31
+ const lines = content.split("\n").filter(Boolean);
32
+ const kept = lines.slice(-KEEP_LINES).join("\n") + "\n";
33
+ fs.writeFileSync(logPath, kept, "utf-8");
34
+ }
35
+ }
36
+ catch {
37
+ // Ignore rotation errors
38
+ }
39
+ }
40
+ const fullEntry = {
41
+ timestamp: new Date().toISOString(),
42
+ ...entry,
43
+ };
44
+ fs.appendFileSync(logPath, JSON.stringify(fullEntry) + "\n", "utf-8");
45
+ }
46
+ catch {
47
+ // Logging should never crash the application
48
+ }
49
+ }
50
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/core/mcp/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAWxB,MAAM,OAAO,GAAG,SAAS,CAAC;AAC1B,MAAM,QAAQ,GAAG,SAAS,CAAC;AAC3B,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM;AAC5C,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,SAAS,UAAU;IACjB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,KAAqC;IAC1D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAElC,0BAA0B;QAC1B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,uCAAuC;QACvC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAClC,IAAI,IAAI,CAAC,IAAI,GAAG,YAAY,EAAE,CAAC;oBAC7B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAClD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;oBACxD,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAgB;YAC7B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,GAAG,KAAK;SACT,CAAC;QAEF,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;IAC/C,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Tool } from "./types.js";
2
+ export declare const analyzePatternsTools: Tool[];
3
+ //# sourceMappingURL=analyzePatterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzePatterns.d.ts","sourceRoot":"","sources":["../../../src/core/tools/analyzePatterns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AA2W9C,eAAO,MAAM,oBAAoB,EAAE,IAAI,EAA0B,CAAC"}
@@ -0,0 +1,293 @@
1
+ import { loadApexReport, createLLMClient } from "./apexUtils.js";
2
+ function analyzeCategoryDistribution(issues) {
3
+ const catMap = new Map();
4
+ for (const issue of issues) {
5
+ const cat = issue.category || "기타";
6
+ if (!catMap.has(cat))
7
+ catMap.set(cat, []);
8
+ catMap.get(cat).push(issue);
9
+ }
10
+ const total = issues.length || 1;
11
+ return Array.from(catMap.entries())
12
+ .map(([category, catIssues]) => {
13
+ // Severity distribution
14
+ const severities = {};
15
+ for (const i of catIssues) {
16
+ severities[i.severity] = (severities[i.severity] || 0) + 1;
17
+ }
18
+ // Top rules in category
19
+ const ruleMap = new Map();
20
+ for (const i of catIssues) {
21
+ const key = i.rule_id;
22
+ if (!ruleMap.has(key))
23
+ ruleMap.set(key, { rule_name: i.rule_name, count: 0 });
24
+ ruleMap.get(key).count++;
25
+ }
26
+ const topRules = Array.from(ruleMap.entries())
27
+ .map(([rule_id, v]) => ({ rule_id, rule_name: v.rule_name, count: v.count }))
28
+ .sort((a, b) => b.count - a.count)
29
+ .slice(0, 5);
30
+ return {
31
+ category,
32
+ count: catIssues.length,
33
+ percentage: Math.round((catIssues.length / total) * 100),
34
+ severities,
35
+ topRules,
36
+ };
37
+ })
38
+ .sort((a, b) => b.count - a.count);
39
+ }
40
+ function analyzeFileHotspots(issues, topN = 20) {
41
+ const fileMap = new Map();
42
+ for (const issue of issues) {
43
+ const file = issue.file || "unknown";
44
+ if (!fileMap.has(file))
45
+ fileMap.set(file, []);
46
+ fileMap.get(file).push(issue);
47
+ }
48
+ return Array.from(fileMap.entries())
49
+ .map(([file, fileIssues]) => {
50
+ const ruleSet = new Set();
51
+ let critical = 0;
52
+ let high = 0;
53
+ for (const i of fileIssues) {
54
+ ruleSet.add(i.rule_id);
55
+ if (i.severity === "critical")
56
+ critical++;
57
+ else if (i.severity === "high")
58
+ high++;
59
+ }
60
+ return {
61
+ file,
62
+ issueCount: fileIssues.length,
63
+ critical,
64
+ high,
65
+ topRules: Array.from(ruleSet).slice(0, 5),
66
+ };
67
+ })
68
+ .sort((a, b) => b.issueCount - a.issueCount)
69
+ .slice(0, topN);
70
+ }
71
+ function analyzeRepeatedRules(issues, topN = 10) {
72
+ const ruleMap = new Map();
73
+ for (const issue of issues) {
74
+ if (!ruleMap.has(issue.rule_id)) {
75
+ ruleMap.set(issue.rule_id, {
76
+ rule_name: issue.rule_name,
77
+ count: 0,
78
+ severity: issue.severity,
79
+ category: issue.category,
80
+ });
81
+ }
82
+ ruleMap.get(issue.rule_id).count++;
83
+ }
84
+ return Array.from(ruleMap.entries())
85
+ .map(([rule_id, v]) => ({ rule_id, ...v }))
86
+ .sort((a, b) => b.count - a.count)
87
+ .slice(0, topN);
88
+ }
89
+ function analyzeLayerPatterns(issues) {
90
+ const layerPatterns = [
91
+ { pattern: /Controller|Rest.*Controller|.*Api\./i, layer: "Controller" },
92
+ { pattern: /Service|ServiceImpl|.*Svc\./i, layer: "Service" },
93
+ { pattern: /Repository|Dao|Mapper|.*Repo\./i, layer: "Repository/DAO" },
94
+ { pattern: /Entity|Model|Dto|Vo\./i, layer: "Entity/DTO" },
95
+ { pattern: /Config|Configuration|.*Conf\./i, layer: "Config" },
96
+ { pattern: /Util|Helper|Common|.*Utils\./i, layer: "Util" },
97
+ ];
98
+ const layerMap = new Map();
99
+ const unclassified = [];
100
+ for (const issue of issues) {
101
+ let matched = false;
102
+ for (const { pattern, layer } of layerPatterns) {
103
+ if (pattern.test(issue.file)) {
104
+ if (!layerMap.has(layer))
105
+ layerMap.set(layer, []);
106
+ layerMap.get(layer).push(issue);
107
+ matched = true;
108
+ break;
109
+ }
110
+ }
111
+ if (!matched) {
112
+ unclassified.push(issue);
113
+ }
114
+ }
115
+ if (unclassified.length > 0) {
116
+ layerMap.set("기타", unclassified);
117
+ }
118
+ const total = issues.length || 1;
119
+ return Array.from(layerMap.entries())
120
+ .map(([layer, layerIssues]) => {
121
+ const catCount = new Map();
122
+ for (const i of layerIssues) {
123
+ catCount.set(i.category, (catCount.get(i.category) || 0) + 1);
124
+ }
125
+ const topCategories = Array.from(catCount.entries())
126
+ .sort((a, b) => b[1] - a[1])
127
+ .slice(0, 3)
128
+ .map(([cat]) => cat);
129
+ return {
130
+ layer,
131
+ count: layerIssues.length,
132
+ percentage: Math.round((layerIssues.length / total) * 100),
133
+ topCategories,
134
+ };
135
+ })
136
+ .sort((a, b) => b.count - a.count);
137
+ }
138
+ function calculateRiskScore(issues) {
139
+ let score = 0;
140
+ for (const issue of issues) {
141
+ switch (issue.severity) {
142
+ case "critical":
143
+ score += 10;
144
+ break;
145
+ case "high":
146
+ score += 5;
147
+ break;
148
+ case "medium":
149
+ score += 2;
150
+ break;
151
+ case "low":
152
+ score += 1;
153
+ break;
154
+ }
155
+ }
156
+ return score;
157
+ }
158
+ function generateInsights(categories, hotspots, repeatedRules, riskScore) {
159
+ const insights = [];
160
+ // Category concentration
161
+ if (categories.length > 0 && categories[0].percentage > 40) {
162
+ insights.push(`'${categories[0].category}' 카테고리가 전체 이슈의 ${categories[0].percentage}%를 차지합니다. 이 영역의 개선이 우선됩니다.`);
163
+ }
164
+ // Hotspot concentration
165
+ if (hotspots.length > 0 && hotspots[0].issueCount > 10) {
166
+ insights.push(`'${hotspots[0].file}'에 이슈 ${hotspots[0].issueCount}건이 집중되어 있습니다. 리팩토링을 검토하세요.`);
167
+ }
168
+ // Critical issues
169
+ const criticalCount = hotspots.reduce((sum, h) => sum + h.critical, 0);
170
+ if (criticalCount > 0) {
171
+ insights.push(`Critical 이슈 ${criticalCount}건이 있습니다. 즉시 수정이 필요합니다.`);
172
+ }
173
+ // Repeated rules
174
+ if (repeatedRules.length > 0 && repeatedRules[0].count > 5) {
175
+ insights.push(`규칙 '${repeatedRules[0].rule_id}'가 ${repeatedRules[0].count}회 반복됩니다. 팀 차원의 코딩 가이드 교육이 필요합니다.`);
176
+ }
177
+ // Risk score interpretation
178
+ if (riskScore > 500) {
179
+ insights.push(`리스크 점수 ${riskScore}점 — 심각한 수준입니다. 즉각적인 개선 계획이 필요합니다.`);
180
+ }
181
+ else if (riskScore > 200) {
182
+ insights.push(`리스크 점수 ${riskScore}점 — 주의가 필요합니다. Critical/High 이슈부터 해결하세요.`);
183
+ }
184
+ else if (riskScore > 50) {
185
+ insights.push(`리스크 점수 ${riskScore}점 — 양호한 수준이지만 개선 여지가 있습니다.`);
186
+ }
187
+ else {
188
+ insights.push(`리스크 점수 ${riskScore}점 — 우수한 수준입니다.`);
189
+ }
190
+ return insights;
191
+ }
192
+ // ─── LLM Insights ───
193
+ async function generateLLMInsights(totalIssues, riskScore, severityDist, categories, hotspots, repeatedRules) {
194
+ try {
195
+ const client = createLLMClient();
196
+ const catText = categories.slice(0, 5).map(c => `- ${c.category}: ${c.count}건 (${c.percentage}%)`).join("\n");
197
+ const hotspotText = hotspots.slice(0, 5).map(h => `- ${h.file}: ${h.issueCount}건`).join("\n");
198
+ const ruleText = repeatedRules.slice(0, 5).map(r => `- ${r.rule_id}: ${r.count}회`).join("\n");
199
+ const prompt = `당신은 코드 품질 분석 전문가입니다. 아래 정적분석 결과를 분석하고 실행 가능한 인사이트를 제공하세요.
200
+
201
+ [요약]
202
+ - 총 이슈: ${totalIssues}건, 리스크 점수: ${riskScore}
203
+ - 심각도: Critical ${severityDist.critical || 0}건, High ${severityDist.high || 0}건, Medium ${severityDist.medium || 0}건, Low ${severityDist.low || 0}건
204
+
205
+ [카테고리 분포]
206
+ ${catText}
207
+
208
+ [핫스팟 파일 Top 5]
209
+ ${hotspotText}
210
+
211
+ [반복 규칙 Top 5]
212
+ ${ruleText}
213
+
214
+ 다음 항목을 분석해주세요:
215
+ 1. 가장 시급한 개선 영역과 이유
216
+ 2. 이슈 패턴에서 보이는 팀/프로세스 문제
217
+ 3. 구체적인 개선 전략 (단기/중기)
218
+ 4. CI/CD 파이프라인에 추가할 규칙 추천`;
219
+ const response = await client.chat([{ role: "user", content: prompt }]);
220
+ return response.content;
221
+ }
222
+ catch {
223
+ return undefined;
224
+ }
225
+ }
226
+ // ─── Tool Definition ───
227
+ const analyzePatternsTool = {
228
+ name: "analyze_patterns",
229
+ description: "apex 분석 결과(JSON)의 이슈 패턴을 분석합니다. 카테고리 분포, 핫스팟 파일, 반복 규칙, 레이어별 집중도, 리스크 점수를 계산합니다. Use when user asks: '패턴분석', '이슈패턴', 'hotspot', '핫스팟', 'pattern analysis'.",
230
+ parameters: {
231
+ type: "object",
232
+ required: ["report"],
233
+ properties: {
234
+ report: {
235
+ type: "string",
236
+ description: "apex 분석 결과 JSON 파일 경로 또는 인라인 JSON",
237
+ },
238
+ },
239
+ },
240
+ handler: async (args) => {
241
+ try {
242
+ const reportArg = args.report;
243
+ const report = loadApexReport(reportArg);
244
+ if (report.issues.length === 0) {
245
+ return {
246
+ success: true,
247
+ content: JSON.stringify({
248
+ message: "분석할 이슈가 없습니다.",
249
+ summary: report.summary,
250
+ }, null, 2),
251
+ };
252
+ }
253
+ const categories = analyzeCategoryDistribution(report.issues);
254
+ const hotspots = analyzeFileHotspots(report.issues);
255
+ const repeatedRules = analyzeRepeatedRules(report.issues);
256
+ const layers = analyzeLayerPatterns(report.issues);
257
+ const riskScore = calculateRiskScore(report.issues);
258
+ const insights = generateInsights(categories, hotspots, repeatedRules, riskScore);
259
+ // Severity distribution
260
+ const severityDist = {
261
+ critical: report.summary.critical,
262
+ high: report.summary.high,
263
+ medium: report.summary.medium,
264
+ low: report.summary.low,
265
+ };
266
+ // LLM insights (graceful fallback)
267
+ const llmInsights = await generateLLMInsights(report.issues.length, riskScore, severityDist, categories, hotspots, repeatedRules);
268
+ const result = {
269
+ total_issues: report.issues.length,
270
+ risk_score: riskScore,
271
+ severity_distribution: severityDist,
272
+ category_analysis: categories,
273
+ file_hotspots: hotspots,
274
+ repeated_rules: repeatedRules,
275
+ layer_patterns: layers,
276
+ insights,
277
+ profiles_used: report.profiles_used,
278
+ };
279
+ if (llmInsights) {
280
+ result.llm_insights = llmInsights;
281
+ }
282
+ return {
283
+ success: true,
284
+ content: JSON.stringify(result, null, 2),
285
+ };
286
+ }
287
+ catch (error) {
288
+ return { success: false, content: "", error: String(error) };
289
+ }
290
+ },
291
+ };
292
+ export const analyzePatternsTools = [analyzePatternsTool];
293
+ //# sourceMappingURL=analyzePatterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzePatterns.js","sourceRoot":"","sources":["../../../src/core/tools/analyzePatterns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Resolve apex rulesets directory.
3
+ * Priority:
4
+ * 1. Explicit path (user-provided)
5
+ * 2. Local apex-ai installation: /Users/.../apex-ai/configs/rulesets
6
+ * 3. Bundled data: <activo-package>/data/apex-rulesets/
7
+ */
8
+ export declare function resolveRulesetsDir(explicit?: string): string;
9
+ /**
10
+ * Resolve apex rule-schema.yaml path.
11
+ * Same priority as resolveRulesetsDir.
12
+ */
13
+ export declare function resolveSchemaPath(explicit?: string): string;
14
+ //# sourceMappingURL=apexPaths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apexPaths.d.ts","sourceRoot":"","sources":["../../../src/core/tools/apexPaths.ts"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAsB5D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAmB3D"}
@@ -0,0 +1,54 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { fileURLToPath } from "url";
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = path.dirname(__filename);
6
+ /**
7
+ * Resolve apex rulesets directory.
8
+ * Priority:
9
+ * 1. Explicit path (user-provided)
10
+ * 2. Local apex-ai installation: /Users/.../apex-ai/configs/rulesets
11
+ * 3. Bundled data: <activo-package>/data/apex-rulesets/
12
+ */
13
+ export function resolveRulesetsDir(explicit) {
14
+ // 1. Explicit path
15
+ if (explicit && fs.existsSync(explicit)) {
16
+ return explicit;
17
+ }
18
+ // 2. Local apex-ai (development)
19
+ const localApex = path.resolve(process.cwd(), "../apex-ai/configs/rulesets");
20
+ if (fs.existsSync(localApex)) {
21
+ return localApex;
22
+ }
23
+ // 3. Bundled with activo package
24
+ // src/core/tools/apexPaths.ts → dist/core/tools/apexPaths.js
25
+ // data/apex-rulesets/ is at package root
26
+ const bundled = path.resolve(__dirname, "../../../data/apex-rulesets");
27
+ if (fs.existsSync(bundled)) {
28
+ return bundled;
29
+ }
30
+ // Fallback: current directory
31
+ return ".";
32
+ }
33
+ /**
34
+ * Resolve apex rule-schema.yaml path.
35
+ * Same priority as resolveRulesetsDir.
36
+ */
37
+ export function resolveSchemaPath(explicit) {
38
+ // 1. Explicit path
39
+ if (explicit && fs.existsSync(explicit)) {
40
+ return explicit;
41
+ }
42
+ // 2. Local apex-ai (development)
43
+ const localSchema = path.resolve(process.cwd(), "../apex-ai/configs/rule-schema.yaml");
44
+ if (fs.existsSync(localSchema)) {
45
+ return localSchema;
46
+ }
47
+ // 3. Bundled
48
+ const bundledSchema = path.resolve(__dirname, "../../../data/apex-rulesets/rule-schema.yaml");
49
+ if (fs.existsSync(bundledSchema)) {
50
+ return bundledSchema;
51
+ }
52
+ return "";
53
+ }
54
+ //# sourceMappingURL=apexPaths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apexPaths.js","sourceRoot":"","sources":["../../../src/core/tools/apexPaths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAiB;IAClD,mBAAmB;IACnB,IAAI,QAAQ,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,iCAAiC;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,6BAA6B,CAAC,CAAC;IAC7E,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,iCAAiC;IACjC,gEAAgE;IAChE,4CAA4C;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC;IACvE,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,8BAA8B;IAC9B,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAiB;IACjD,mBAAmB;IACnB,IAAI,QAAQ,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,iCAAiC;IACjC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,qCAAqC,CAAC,CAAC;IACvF,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,aAAa;IACb,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,8CAA8C,CAAC,CAAC;IAC9F,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { LLMClient } from "../llm/types.js";
2
+ export interface ApexIssue {
3
+ rule_id: string;
4
+ rule_name: string;
5
+ severity: string;
6
+ category: string;
7
+ file: string;
8
+ line: number;
9
+ column?: number;
10
+ message: string;
11
+ suggestion?: string;
12
+ }
13
+ export interface ApexReport {
14
+ summary: {
15
+ total_issues: number;
16
+ critical: number;
17
+ high: number;
18
+ medium: number;
19
+ low: number;
20
+ files_analyzed: number;
21
+ duration?: string;
22
+ };
23
+ profiles_used?: string[];
24
+ issues: ApexIssue[];
25
+ }
26
+ /**
27
+ * Load an Apex report from file path or inline JSON string.
28
+ * Accepts both raw apex output and the MCP wrapper format.
29
+ */
30
+ export declare function loadApexReport(arg: string): ApexReport;
31
+ /**
32
+ * Create an LLM client based on the current configuration.
33
+ * Shared by analyzePatterns, generateReport, recommendProfile, ruleGen.
34
+ */
35
+ export declare function createLLMClient(): LLMClient;
36
+ //# sourceMappingURL=apexUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apexUtils.d.ts","sourceRoot":"","sources":["../../../src/core/tools/apexUtils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAoEtD;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,SAAS,CAM3C"}
@@ -0,0 +1,83 @@
1
+ import fs from "fs";
2
+ import { loadConfig } from "../config.js";
3
+ import { OllamaClient } from "../llm/ollama.js";
4
+ import { AnthropicClient } from "../llm/anthropic.js";
5
+ /**
6
+ * Load an Apex report from file path or inline JSON string.
7
+ * Accepts both raw apex output and the MCP wrapper format.
8
+ */
9
+ export function loadApexReport(arg) {
10
+ let raw;
11
+ // Try as file path first
12
+ if (!arg.trimStart().startsWith("{") && !arg.trimStart().startsWith("[")) {
13
+ if (!fs.existsSync(arg)) {
14
+ throw new Error(`파일을 찾을 수 없습니다: ${arg}`);
15
+ }
16
+ raw = fs.readFileSync(arg, "utf-8");
17
+ }
18
+ else {
19
+ raw = arg;
20
+ }
21
+ const parsed = JSON.parse(raw);
22
+ // Already in ApexReport format
23
+ if (parsed.summary && Array.isArray(parsed.issues)) {
24
+ return parsed;
25
+ }
26
+ // MCP wrapper format: { summary, top_issues, profiles_used, ... }
27
+ if (parsed.summary && parsed.top_issues) {
28
+ const issues = (parsed.top_issues || []).map((i) => ({
29
+ rule_id: (i.rule_id || i.ruleId || ""),
30
+ rule_name: (i.rule_name || i.ruleName || ""),
31
+ severity: (i.severity || "medium"),
32
+ category: (i.category || ""),
33
+ file: (i.file || i.filepath || ""),
34
+ line: (i.line || 0),
35
+ column: (i.column || 0),
36
+ message: (i.message || ""),
37
+ suggestion: (i.suggestion || ""),
38
+ }));
39
+ const s = parsed.summary;
40
+ // severity_count can be nested (MCP format) or flat
41
+ const sc = s.severity_count || {};
42
+ const critical = s.critical || sc.critical || 0;
43
+ const high = s.high || sc.high || 0;
44
+ const medium = s.medium || sc.medium || 0;
45
+ const low = s.low || sc.low || 0;
46
+ const totalIssues = s.total_issues || s.totalIssues || (critical + high + medium + low) || issues.length;
47
+ const filesAnalyzed = s.files_analyzed || s.filesAnalyzed || s.total_files || 0;
48
+ // profiles_used can be string or string[]
49
+ let profilesUsed = [];
50
+ if (Array.isArray(parsed.profiles_used)) {
51
+ profilesUsed = parsed.profiles_used;
52
+ }
53
+ else if (typeof parsed.profiles_used === "string") {
54
+ profilesUsed = parsed.profiles_used.split(",").map((p) => p.trim());
55
+ }
56
+ return {
57
+ summary: {
58
+ total_issues: totalIssues,
59
+ critical,
60
+ high,
61
+ medium,
62
+ low,
63
+ files_analyzed: filesAnalyzed,
64
+ duration: s.duration || parsed.duration,
65
+ },
66
+ profiles_used: profilesUsed,
67
+ issues,
68
+ };
69
+ }
70
+ throw new Error("지원하지 않는 리포트 형식입니다. apex 분석 결과 JSON이 필요합니다.");
71
+ }
72
+ /**
73
+ * Create an LLM client based on the current configuration.
74
+ * Shared by analyzePatterns, generateReport, recommendProfile, ruleGen.
75
+ */
76
+ export function createLLMClient() {
77
+ const config = loadConfig();
78
+ if (config.provider === "anthropic") {
79
+ return new AnthropicClient(config.anthropic);
80
+ }
81
+ return new OllamaClient(config.ollama);
82
+ }
83
+ //# sourceMappingURL=apexUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apexUtils.js","sourceRoot":"","sources":["../../../src/core/tools/apexUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Tool } from "./types.js";
2
+ export declare const explainIssueTools: Tool[];
3
+ //# sourceMappingURL=explainIssue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explainIssue.d.ts","sourceRoot":"","sources":["../../../src/core/tools/explainIssue.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AAgN9C,eAAO,MAAM,iBAAiB,EAAE,IAAI,EAAuB,CAAC"}