@thoughtflow/codebase 0.2.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 (278) hide show
  1. package/dist/contexts/context-decomposer.d.ts +13 -0
  2. package/dist/contexts/context-decomposer.d.ts.map +1 -0
  3. package/dist/contexts/context-decomposer.js +97 -0
  4. package/dist/contexts/context-decomposer.js.map +1 -0
  5. package/dist/contexts/context-document-manager.d.ts +21 -0
  6. package/dist/contexts/context-document-manager.d.ts.map +1 -0
  7. package/dist/contexts/context-document-manager.js +69 -0
  8. package/dist/contexts/context-document-manager.js.map +1 -0
  9. package/dist/contexts/context-router.d.ts +13 -0
  10. package/dist/contexts/context-router.d.ts.map +1 -0
  11. package/dist/contexts/context-router.js +94 -0
  12. package/dist/contexts/context-router.js.map +1 -0
  13. package/dist/index.d.ts +53 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +76 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/libs/codebase/deep-analyzer.d.ts +58 -0
  18. package/dist/libs/codebase/deep-analyzer.d.ts.map +1 -0
  19. package/dist/libs/codebase/deep-analyzer.js +239 -0
  20. package/dist/libs/codebase/deep-analyzer.js.map +1 -0
  21. package/dist/libs/codebase/graph/dependency-extractor.d.ts +20 -0
  22. package/dist/libs/codebase/graph/dependency-extractor.d.ts.map +1 -0
  23. package/dist/libs/codebase/graph/dependency-extractor.js +174 -0
  24. package/dist/libs/codebase/graph/dependency-extractor.js.map +1 -0
  25. package/dist/libs/codebase/graph/graph-analysis.d.ts +42 -0
  26. package/dist/libs/codebase/graph/graph-analysis.d.ts.map +1 -0
  27. package/dist/libs/codebase/graph/graph-analysis.js +222 -0
  28. package/dist/libs/codebase/graph/graph-analysis.js.map +1 -0
  29. package/dist/libs/codebase/graph/graph-visualizer.d.ts +12 -0
  30. package/dist/libs/codebase/graph/graph-visualizer.d.ts.map +1 -0
  31. package/dist/libs/codebase/graph/graph-visualizer.js +99 -0
  32. package/dist/libs/codebase/graph/graph-visualizer.js.map +1 -0
  33. package/dist/libs/codebase/indexer/batch-processor.d.ts +18 -0
  34. package/dist/libs/codebase/indexer/batch-processor.d.ts.map +1 -0
  35. package/dist/libs/codebase/indexer/batch-processor.js +39 -0
  36. package/dist/libs/codebase/indexer/batch-processor.js.map +1 -0
  37. package/dist/libs/codebase/indexer/chunker-markdown.d.ts +19 -0
  38. package/dist/libs/codebase/indexer/chunker-markdown.d.ts.map +1 -0
  39. package/dist/libs/codebase/indexer/chunker-markdown.js +138 -0
  40. package/dist/libs/codebase/indexer/chunker-markdown.js.map +1 -0
  41. package/dist/libs/codebase/indexer/chunker.d.ts +21 -0
  42. package/dist/libs/codebase/indexer/chunker.d.ts.map +1 -0
  43. package/dist/libs/codebase/indexer/chunker.js +133 -0
  44. package/dist/libs/codebase/indexer/chunker.js.map +1 -0
  45. package/dist/libs/codebase/indexer/explorer.d.ts +29 -0
  46. package/dist/libs/codebase/indexer/explorer.d.ts.map +1 -0
  47. package/dist/libs/codebase/indexer/explorer.js +278 -0
  48. package/dist/libs/codebase/indexer/explorer.js.map +1 -0
  49. package/dist/libs/codebase/indexer/indexer.d.ts +35 -0
  50. package/dist/libs/codebase/indexer/indexer.d.ts.map +1 -0
  51. package/dist/libs/codebase/indexer/indexer.js +172 -0
  52. package/dist/libs/codebase/indexer/indexer.js.map +1 -0
  53. package/dist/libs/codebase/knowledge/cross-referencer.d.ts +32 -0
  54. package/dist/libs/codebase/knowledge/cross-referencer.d.ts.map +1 -0
  55. package/dist/libs/codebase/knowledge/cross-referencer.js +132 -0
  56. package/dist/libs/codebase/knowledge/cross-referencer.js.map +1 -0
  57. package/dist/libs/codebase/knowledge/markdown-extractor.d.ts +34 -0
  58. package/dist/libs/codebase/knowledge/markdown-extractor.d.ts.map +1 -0
  59. package/dist/libs/codebase/knowledge/markdown-extractor.js +273 -0
  60. package/dist/libs/codebase/knowledge/markdown-extractor.js.map +1 -0
  61. package/dist/libs/codebase/knowledge/summarizer.d.ts +25 -0
  62. package/dist/libs/codebase/knowledge/summarizer.d.ts.map +1 -0
  63. package/dist/libs/codebase/knowledge/summarizer.js +61 -0
  64. package/dist/libs/codebase/knowledge/summarizer.js.map +1 -0
  65. package/dist/libs/codebase/search/bm25.d.ts +23 -0
  66. package/dist/libs/codebase/search/bm25.d.ts.map +1 -0
  67. package/dist/libs/codebase/search/bm25.js +93 -0
  68. package/dist/libs/codebase/search/bm25.js.map +1 -0
  69. package/dist/libs/codebase/search/hybrid-search.d.ts +22 -0
  70. package/dist/libs/codebase/search/hybrid-search.d.ts.map +1 -0
  71. package/dist/libs/codebase/search/hybrid-search.js +80 -0
  72. package/dist/libs/codebase/search/hybrid-search.js.map +1 -0
  73. package/dist/libs/codebase-index.class.d.ts +66 -0
  74. package/dist/libs/codebase-index.class.d.ts.map +1 -0
  75. package/dist/libs/codebase-index.class.js +595 -0
  76. package/dist/libs/codebase-index.class.js.map +1 -0
  77. package/dist/tools/codebase/codebase-analyze.tool.d.ts +8 -0
  78. package/dist/tools/codebase/codebase-analyze.tool.d.ts.map +1 -0
  79. package/dist/tools/codebase/codebase-analyze.tool.js +20 -0
  80. package/dist/tools/codebase/codebase-analyze.tool.js.map +1 -0
  81. package/dist/tools/codebase/codebase-crossref.tool.d.ts +8 -0
  82. package/dist/tools/codebase/codebase-crossref.tool.d.ts.map +1 -0
  83. package/dist/tools/codebase/codebase-crossref.tool.js +20 -0
  84. package/dist/tools/codebase/codebase-crossref.tool.js.map +1 -0
  85. package/dist/tools/codebase/codebase-flow.tool.d.ts +8 -0
  86. package/dist/tools/codebase/codebase-flow.tool.d.ts.map +1 -0
  87. package/dist/tools/codebase/codebase-flow.tool.js +20 -0
  88. package/dist/tools/codebase/codebase-flow.tool.js.map +1 -0
  89. package/dist/tools/codebase/codebase-graph-circular.tool.d.ts +8 -0
  90. package/dist/tools/codebase/codebase-graph-circular.tool.d.ts.map +1 -0
  91. package/dist/tools/codebase/codebase-graph-circular.tool.js +17 -0
  92. package/dist/tools/codebase/codebase-graph-circular.tool.js.map +1 -0
  93. package/dist/tools/codebase/codebase-graph-query.tool.d.ts +8 -0
  94. package/dist/tools/codebase/codebase-graph-query.tool.d.ts.map +1 -0
  95. package/dist/tools/codebase/codebase-graph-query.tool.js +21 -0
  96. package/dist/tools/codebase/codebase-graph-query.tool.js.map +1 -0
  97. package/dist/tools/codebase/codebase-graph-stats.tool.d.ts +8 -0
  98. package/dist/tools/codebase/codebase-graph-stats.tool.d.ts.map +1 -0
  99. package/dist/tools/codebase/codebase-graph-stats.tool.js +17 -0
  100. package/dist/tools/codebase/codebase-graph-stats.tool.js.map +1 -0
  101. package/dist/tools/codebase/codebase-graph-visualize.tool.d.ts +8 -0
  102. package/dist/tools/codebase/codebase-graph-visualize.tool.d.ts.map +1 -0
  103. package/dist/tools/codebase/codebase-graph-visualize.tool.js +21 -0
  104. package/dist/tools/codebase/codebase-graph-visualize.tool.js.map +1 -0
  105. package/dist/tools/codebase/codebase-impact.tool.d.ts +8 -0
  106. package/dist/tools/codebase/codebase-impact.tool.d.ts.map +1 -0
  107. package/dist/tools/codebase/codebase-impact.tool.js +21 -0
  108. package/dist/tools/codebase/codebase-impact.tool.js.map +1 -0
  109. package/dist/tools/codebase/codebase-index.tool.d.ts +8 -0
  110. package/dist/tools/codebase/codebase-index.tool.d.ts.map +1 -0
  111. package/dist/tools/codebase/codebase-index.tool.js +21 -0
  112. package/dist/tools/codebase/codebase-index.tool.js.map +1 -0
  113. package/dist/tools/codebase/codebase-knowledge.tool.d.ts +8 -0
  114. package/dist/tools/codebase/codebase-knowledge.tool.d.ts.map +1 -0
  115. package/dist/tools/codebase/codebase-knowledge.tool.js +22 -0
  116. package/dist/tools/codebase/codebase-knowledge.tool.js.map +1 -0
  117. package/dist/tools/codebase/codebase-search.tool.d.ts +8 -0
  118. package/dist/tools/codebase/codebase-search.tool.d.ts.map +1 -0
  119. package/dist/tools/codebase/codebase-search.tool.js +24 -0
  120. package/dist/tools/codebase/codebase-search.tool.js.map +1 -0
  121. package/dist/tools/codebase/codebase-status.tool.d.ts +8 -0
  122. package/dist/tools/codebase/codebase-status.tool.d.ts.map +1 -0
  123. package/dist/tools/codebase/codebase-status.tool.js +19 -0
  124. package/dist/tools/codebase/codebase-status.tool.js.map +1 -0
  125. package/dist/tools/neural/comparative-analysis.tool.d.ts +37 -0
  126. package/dist/tools/neural/comparative-analysis.tool.d.ts.map +1 -0
  127. package/dist/tools/neural/comparative-analysis.tool.js +241 -0
  128. package/dist/tools/neural/comparative-analysis.tool.js.map +1 -0
  129. package/dist/tools/neural/index.d.ts +12 -0
  130. package/dist/tools/neural/index.d.ts.map +1 -0
  131. package/dist/tools/neural/index.js +28 -0
  132. package/dist/tools/neural/index.js.map +1 -0
  133. package/dist/tools/neural/neural-deadcode.tool.d.ts +10 -0
  134. package/dist/tools/neural/neural-deadcode.tool.d.ts.map +1 -0
  135. package/dist/tools/neural/neural-deadcode.tool.js +133 -0
  136. package/dist/tools/neural/neural-deadcode.tool.js.map +1 -0
  137. package/dist/tools/neural/neural-debug.tool.d.ts +11 -0
  138. package/dist/tools/neural/neural-debug.tool.d.ts.map +1 -0
  139. package/dist/tools/neural/neural-debug.tool.js +205 -0
  140. package/dist/tools/neural/neural-debug.tool.js.map +1 -0
  141. package/dist/tools/neural/neural-explain.tool.d.ts +9 -0
  142. package/dist/tools/neural/neural-explain.tool.d.ts.map +1 -0
  143. package/dist/tools/neural/neural-explain.tool.js +100 -0
  144. package/dist/tools/neural/neural-explain.tool.js.map +1 -0
  145. package/dist/tools/neural/neural-optimize.tool.d.ts +9 -0
  146. package/dist/tools/neural/neural-optimize.tool.d.ts.map +1 -0
  147. package/dist/tools/neural/neural-optimize.tool.js +117 -0
  148. package/dist/tools/neural/neural-optimize.tool.js.map +1 -0
  149. package/dist/tools/neural/neural-pattern.tool.d.ts +10 -0
  150. package/dist/tools/neural/neural-pattern.tool.d.ts.map +1 -0
  151. package/dist/tools/neural/neural-pattern.tool.js +169 -0
  152. package/dist/tools/neural/neural-pattern.tool.js.map +1 -0
  153. package/dist/tools/neural/neural-review.tool.d.ts +11 -0
  154. package/dist/tools/neural/neural-review.tool.d.ts.map +1 -0
  155. package/dist/tools/neural/neural-review.tool.js +152 -0
  156. package/dist/tools/neural/neural-review.tool.js.map +1 -0
  157. package/dist/tools/neural/neural-security.tool.d.ts +16 -0
  158. package/dist/tools/neural/neural-security.tool.d.ts.map +1 -0
  159. package/dist/tools/neural/neural-security.tool.js +256 -0
  160. package/dist/tools/neural/neural-security.tool.js.map +1 -0
  161. package/dist/tools/neural/neural-similar.tool.d.ts +9 -0
  162. package/dist/tools/neural/neural-similar.tool.d.ts.map +1 -0
  163. package/dist/tools/neural/neural-similar.tool.js +139 -0
  164. package/dist/tools/neural/neural-similar.tool.js.map +1 -0
  165. package/dist/tools/neural/neural-smells.tool.d.ts +9 -0
  166. package/dist/tools/neural/neural-smells.tool.d.ts.map +1 -0
  167. package/dist/tools/neural/neural-smells.tool.js +123 -0
  168. package/dist/tools/neural/neural-smells.tool.js.map +1 -0
  169. package/dist/tools/neural/neural-suggest.tool.d.ts +9 -0
  170. package/dist/tools/neural/neural-suggest.tool.d.ts.map +1 -0
  171. package/dist/tools/neural/neural-suggest.tool.js +64 -0
  172. package/dist/tools/neural/neural-suggest.tool.js.map +1 -0
  173. package/dist/tools/quality/index.d.ts +8 -0
  174. package/dist/tools/quality/index.d.ts.map +1 -0
  175. package/dist/tools/quality/index.js +24 -0
  176. package/dist/tools/quality/index.js.map +1 -0
  177. package/dist/tools/quality/quality-complexity.tool.d.ts +11 -0
  178. package/dist/tools/quality/quality-complexity.tool.d.ts.map +1 -0
  179. package/dist/tools/quality/quality-complexity.tool.js +152 -0
  180. package/dist/tools/quality/quality-complexity.tool.js.map +1 -0
  181. package/dist/tools/quality/quality-coupling.tool.d.ts +9 -0
  182. package/dist/tools/quality/quality-coupling.tool.d.ts.map +1 -0
  183. package/dist/tools/quality/quality-coupling.tool.js +51 -0
  184. package/dist/tools/quality/quality-coupling.tool.js.map +1 -0
  185. package/dist/tools/quality/quality-coverage.tool.d.ts +9 -0
  186. package/dist/tools/quality/quality-coverage.tool.d.ts.map +1 -0
  187. package/dist/tools/quality/quality-coverage.tool.js +104 -0
  188. package/dist/tools/quality/quality-coverage.tool.js.map +1 -0
  189. package/dist/tools/quality/quality-deps.tool.d.ts +11 -0
  190. package/dist/tools/quality/quality-deps.tool.d.ts.map +1 -0
  191. package/dist/tools/quality/quality-deps.tool.js +119 -0
  192. package/dist/tools/quality/quality-deps.tool.js.map +1 -0
  193. package/dist/tools/quality/quality-duplication.tool.d.ts +9 -0
  194. package/dist/tools/quality/quality-duplication.tool.d.ts.map +1 -0
  195. package/dist/tools/quality/quality-duplication.tool.js +100 -0
  196. package/dist/tools/quality/quality-duplication.tool.js.map +1 -0
  197. package/dist/tools/quality/quality-size.tool.d.ts +9 -0
  198. package/dist/tools/quality/quality-size.tool.d.ts.map +1 -0
  199. package/dist/tools/quality/quality-size.tool.js +94 -0
  200. package/dist/tools/quality/quality-size.tool.js.map +1 -0
  201. package/dist/tools/quality/quality-types.tool.d.ts +9 -0
  202. package/dist/tools/quality/quality-types.tool.d.ts.map +1 -0
  203. package/dist/tools/quality/quality-types.tool.js +95 -0
  204. package/dist/tools/quality/quality-types.tool.js.map +1 -0
  205. package/dist/tools/workspace/analyze-project.tool.d.ts +36 -0
  206. package/dist/tools/workspace/analyze-project.tool.d.ts.map +1 -0
  207. package/dist/tools/workspace/analyze-project.tool.js +454 -0
  208. package/dist/tools/workspace/analyze-project.tool.js.map +1 -0
  209. package/dist/tools/workspace/codebase-research.tool.d.ts +10 -0
  210. package/dist/tools/workspace/codebase-research.tool.d.ts.map +1 -0
  211. package/dist/tools/workspace/codebase-research.tool.js +89 -0
  212. package/dist/tools/workspace/codebase-research.tool.js.map +1 -0
  213. package/dist/tools/workspace/project-scanner.tool.d.ts +55 -0
  214. package/dist/tools/workspace/project-scanner.tool.d.ts.map +1 -0
  215. package/dist/tools/workspace/project-scanner.tool.js +978 -0
  216. package/dist/tools/workspace/project-scanner.tool.js.map +1 -0
  217. package/dist/tools/workspace/search-code.tool.d.ts +14 -0
  218. package/dist/tools/workspace/search-code.tool.d.ts.map +1 -0
  219. package/dist/tools/workspace/search-code.tool.js +286 -0
  220. package/dist/tools/workspace/search-code.tool.js.map +1 -0
  221. package/package.json +17 -0
  222. package/src/contexts/context-decomposer.ts +113 -0
  223. package/src/contexts/context-document-manager.ts +70 -0
  224. package/src/contexts/context-router.ts +121 -0
  225. package/src/index.ts +65 -0
  226. package/src/libs/codebase/deep-analyzer.ts +287 -0
  227. package/src/libs/codebase/graph/dependency-extractor.ts +165 -0
  228. package/src/libs/codebase/graph/graph-analysis.ts +231 -0
  229. package/src/libs/codebase/graph/graph-visualizer.ts +124 -0
  230. package/src/libs/codebase/indexer/batch-processor.ts +47 -0
  231. package/src/libs/codebase/indexer/chunker-markdown.ts +175 -0
  232. package/src/libs/codebase/indexer/chunker.ts +126 -0
  233. package/src/libs/codebase/indexer/explorer.ts +269 -0
  234. package/src/libs/codebase/indexer/indexer.ts +174 -0
  235. package/src/libs/codebase/knowledge/cross-referencer.ts +182 -0
  236. package/src/libs/codebase/knowledge/markdown-extractor.ts +270 -0
  237. package/src/libs/codebase/knowledge/summarizer.ts +85 -0
  238. package/src/libs/codebase/search/bm25.ts +109 -0
  239. package/src/libs/codebase/search/hybrid-search.ts +109 -0
  240. package/src/libs/codebase-index.class.ts +715 -0
  241. package/src/tools/codebase/codebase-analyze.tool.ts +18 -0
  242. package/src/tools/codebase/codebase-crossref.tool.ts +18 -0
  243. package/src/tools/codebase/codebase-flow.tool.ts +18 -0
  244. package/src/tools/codebase/codebase-graph-circular.tool.ts +15 -0
  245. package/src/tools/codebase/codebase-graph-query.tool.ts +19 -0
  246. package/src/tools/codebase/codebase-graph-stats.tool.ts +15 -0
  247. package/src/tools/codebase/codebase-graph-visualize.tool.ts +19 -0
  248. package/src/tools/codebase/codebase-impact.tool.ts +19 -0
  249. package/src/tools/codebase/codebase-index.tool.ts +19 -0
  250. package/src/tools/codebase/codebase-knowledge.tool.ts +20 -0
  251. package/src/tools/codebase/codebase-search.tool.ts +22 -0
  252. package/src/tools/codebase/codebase-status.tool.ts +17 -0
  253. package/src/tools/neural/comparative-analysis.tool.ts +309 -0
  254. package/src/tools/neural/index.ts +11 -0
  255. package/src/tools/neural/neural-deadcode.tool.ts +105 -0
  256. package/src/tools/neural/neural-debug.tool.ts +199 -0
  257. package/src/tools/neural/neural-explain.tool.ts +67 -0
  258. package/src/tools/neural/neural-optimize.tool.ts +93 -0
  259. package/src/tools/neural/neural-pattern.tool.ts +141 -0
  260. package/src/tools/neural/neural-review.tool.ts +145 -0
  261. package/src/tools/neural/neural-security.tool.ts +226 -0
  262. package/src/tools/neural/neural-similar.tool.ts +113 -0
  263. package/src/tools/neural/neural-smells.tool.ts +98 -0
  264. package/src/tools/neural/neural-suggest.tool.ts +65 -0
  265. package/src/tools/quality/index.ts +7 -0
  266. package/src/tools/quality/quality-complexity.tool.ts +132 -0
  267. package/src/tools/quality/quality-coupling.tool.ts +57 -0
  268. package/src/tools/quality/quality-coverage.tool.ts +78 -0
  269. package/src/tools/quality/quality-deps.tool.ts +89 -0
  270. package/src/tools/quality/quality-duplication.tool.ts +71 -0
  271. package/src/tools/quality/quality-size.tool.ts +66 -0
  272. package/src/tools/quality/quality-types.tool.ts +66 -0
  273. package/src/tools/workspace/analyze-project.tool.ts +429 -0
  274. package/src/tools/workspace/codebase-research.tool.ts +100 -0
  275. package/src/tools/workspace/project-scanner.tool.ts +1058 -0
  276. package/src/tools/workspace/search-code.tool.ts +344 -0
  277. package/tsconfig.build.json +12 -0
  278. package/tsconfig.json +9 -0
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+ import { ToolBase, ToolContext, ToolExecutionResult } from "@thoughtflow/core";
3
+
4
+ export class CodebaseAnalyzeTool extends ToolBase {
5
+ readonly name = "codebaseAnalyze";
6
+ readonly description = "Run the full deep analysis pipeline — analyze the entire repository from scratch";
7
+
8
+ constructor() {
9
+ super(z.object({
10
+ projectPath: z.string().optional(),
11
+ phases: z.array(z.enum(["discover", "index", "graph", "extract-knowledge", "cross-reference"])).optional(),
12
+ }));
13
+ }
14
+
15
+ async run(_input: Record<string, unknown>, _ctx: ToolContext): Promise<ToolExecutionResult> {
16
+ return { success: true, output: JSON.stringify({ report: {}, status: "not implemented" }) };
17
+ }
18
+ }
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+ import { ToolBase, ToolContext, ToolExecutionResult } from "@thoughtflow/core";
3
+
4
+ export class CodebaseCrossrefTool extends ToolBase {
5
+ readonly name = "codebaseCrossref";
6
+ readonly description = "Trace cross-references: which code implements which feature, which doc describes which module?";
7
+
8
+ constructor() {
9
+ super(z.object({
10
+ query: z.string(),
11
+ traceType: z.enum(["feature-to-code", "code-to-doc", "doc-to-code", "all"]).optional(),
12
+ }));
13
+ }
14
+
15
+ async run(_input: Record<string, unknown>, _ctx: ToolContext): Promise<ToolExecutionResult> {
16
+ return { success: true, output: JSON.stringify({ references: [], chains: [] }) };
17
+ }
18
+ }
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+ import { ToolBase, ToolContext, ToolExecutionResult } from "@thoughtflow/core";
3
+
4
+ export class CodebaseFlowTool extends ToolBase {
5
+ readonly name = "codebaseFlow";
6
+ readonly description = "Trace call flow forward from an entry point through the dependency graph";
7
+
8
+ constructor() {
9
+ super(z.object({
10
+ entrypoint: z.string().optional(),
11
+ maxDepth: z.number().optional(),
12
+ }));
13
+ }
14
+
15
+ async run(_input: Record<string, unknown>, _ctx: ToolContext): Promise<ToolExecutionResult> {
16
+ return { success: true, output: JSON.stringify({ entrypoints: [], flow: [] }) };
17
+ }
18
+ }
@@ -0,0 +1,15 @@
1
+ import { z } from "zod";
2
+ import { ToolBase, ToolContext, ToolExecutionResult } from "@thoughtflow/core";
3
+
4
+ export class CodebaseGraphCircularTool extends ToolBase {
5
+ readonly name = "codebaseGraphCircular";
6
+ readonly description = "Detect circular dependencies in the codebase";
7
+
8
+ constructor() {
9
+ super(z.object({}));
10
+ }
11
+
12
+ async run(_input: Record<string, unknown>, _ctx: ToolContext): Promise<ToolExecutionResult> {
13
+ return { success: true, output: JSON.stringify({ cycles: [] }) };
14
+ }
15
+ }
@@ -0,0 +1,19 @@
1
+ import { z } from "zod";
2
+ import { ToolBase, ToolContext, ToolExecutionResult } from "@thoughtflow/core";
3
+
4
+ export class CodebaseGraphQueryTool extends ToolBase {
5
+ readonly name = "codebaseGraphQuery";
6
+ readonly description = "Query the dependency graph: what does a file import, and what depends on it?";
7
+
8
+ constructor() {
9
+ super(z.object({
10
+ filePath: z.string(),
11
+ direction: z.enum(["imports", "dependents", "both"]).optional(),
12
+ }));
13
+ }
14
+
15
+ async run(input: Record<string, unknown>, _ctx: ToolContext): Promise<ToolExecutionResult> {
16
+ const { filePath } = input as { filePath: string };
17
+ return { success: true, output: JSON.stringify({ filePath, imports: [], dependents: [] }) };
18
+ }
19
+ }
@@ -0,0 +1,15 @@
1
+ import { z } from "zod";
2
+ import { ToolBase, ToolContext, ToolExecutionResult } from "@thoughtflow/core";
3
+
4
+ export class CodebaseGraphStatsTool extends ToolBase {
5
+ readonly name = "codebaseGraphStats";
6
+ readonly description = "Get statistics about the dependency graph (nodes, edges, density, top modules)";
7
+
8
+ constructor() {
9
+ super(z.object({}));
10
+ }
11
+
12
+ async run(_input: Record<string, unknown>, _ctx: ToolContext): Promise<ToolExecutionResult> {
13
+ return { success: true, output: JSON.stringify({ nodes: 0, edges: 0, density: 0, topModules: [] }) };
14
+ }
15
+ }
@@ -0,0 +1,19 @@
1
+ import { z } from "zod";
2
+ import { ToolBase, ToolContext, ToolExecutionResult } from "@thoughtflow/core";
3
+
4
+ export class CodebaseGraphVisualizeTool extends ToolBase {
5
+ readonly name = "codebaseGraphVisualize";
6
+ readonly description = "Generate a Mermaid diagram or interactive HTML visualization of the dependency graph";
7
+
8
+ constructor() {
9
+ super(z.object({
10
+ format: z.enum(["mermaid", "html"]).optional(),
11
+ maxNodes: z.number().optional(),
12
+ }));
13
+ }
14
+
15
+ async run(input: Record<string, unknown>, _ctx: ToolContext): Promise<ToolExecutionResult> {
16
+ const format = (input as { format?: string }).format ?? "mermaid";
17
+ return { success: true, output: JSON.stringify({ diagram: "", format }) };
18
+ }
19
+ }
@@ -0,0 +1,19 @@
1
+ import { z } from "zod";
2
+ import { ToolBase, ToolContext, ToolExecutionResult } from "@thoughtflow/core";
3
+
4
+ export class CodebaseImpactTool extends ToolBase {
5
+ readonly name = "codebaseImpact";
6
+ readonly description = "Analyze blast radius: what files would be affected by changing a given file?";
7
+
8
+ constructor() {
9
+ super(z.object({
10
+ targetFile: z.string(),
11
+ maxHops: z.number().optional(),
12
+ }));
13
+ }
14
+
15
+ async run(input: Record<string, unknown>, _ctx: ToolContext): Promise<ToolExecutionResult> {
16
+ const { targetFile } = input as { targetFile: string };
17
+ return { success: true, output: JSON.stringify({ target: targetFile, affectedFiles: [], hops: [] }) };
18
+ }
19
+ }
@@ -0,0 +1,19 @@
1
+ import { z } from "zod";
2
+ import { ToolBase, ToolContext, ToolExecutionResult } from "@thoughtflow/core";
3
+
4
+ export class CodebaseIndexTool extends ToolBase {
5
+ readonly name = "codebaseIndex";
6
+ readonly description = "Index the current codebase — discovers files, chunks code, generates embeddings, stores to vector DB";
7
+
8
+ constructor() {
9
+ super(z.object({
10
+ projectPath: z.string().optional(),
11
+ mode: z.enum(["full", "incremental"]).optional(),
12
+ includeDocs: z.boolean().optional(),
13
+ }));
14
+ }
15
+
16
+ async run(_input: Record<string, unknown>, _ctx: ToolContext): Promise<ToolExecutionResult> {
17
+ return { success: true, output: JSON.stringify({ message: "Indexing started — use codebase_status to check progress" }) };
18
+ }
19
+ }
@@ -0,0 +1,20 @@
1
+ import { z } from "zod";
2
+ import { ToolBase, ToolContext, ToolExecutionResult } from "@thoughtflow/core";
3
+
4
+ export class CodebaseKnowledgeTool extends ToolBase {
5
+ readonly name = "codebaseKnowledge";
6
+ readonly description = "Search across extracted documentation, business plans, guidelines, and architectural decisions";
7
+
8
+ constructor() {
9
+ super(z.object({
10
+ query: z.string(),
11
+ docType: z.string().optional(),
12
+ limit: z.number().optional(),
13
+ }));
14
+ }
15
+
16
+ async run(input: Record<string, unknown>, _ctx: ToolContext): Promise<ToolExecutionResult> {
17
+ const { query } = input as { query: string };
18
+ return { success: true, output: JSON.stringify({ results: [], query }) };
19
+ }
20
+ }
@@ -0,0 +1,22 @@
1
+ import { z } from "zod";
2
+ import { ToolBase, ToolContext, ToolExecutionResult } from "@thoughtflow/core";
3
+
4
+ export class CodebaseSearchTool extends ToolBase {
5
+ readonly name = "codebaseSearch";
6
+ readonly description = "Hybrid semantic + keyword search across the indexed codebase";
7
+
8
+ constructor() {
9
+ super(z.object({
10
+ query: z.string(),
11
+ limit: z.number().optional(),
12
+ mode: z.enum(["hybrid", "semantic", "keyword"]).optional(),
13
+ filterPath: z.string().optional(),
14
+ filterLanguage: z.string().optional(),
15
+ }));
16
+ }
17
+
18
+ async run(input: Record<string, unknown>, _ctx: ToolContext): Promise<ToolExecutionResult> {
19
+ const { query } = input as { query: string };
20
+ return { success: true, output: JSON.stringify({ results: [], query }) };
21
+ }
22
+ }
@@ -0,0 +1,17 @@
1
+ import { z } from "zod";
2
+ import { ToolBase, ToolContext, ToolExecutionResult } from "@thoughtflow/core";
3
+
4
+ export class CodebaseStatusTool extends ToolBase {
5
+ readonly name = "codebaseStatus";
6
+ readonly description = "Check indexing status and statistics for the codebase";
7
+
8
+ constructor() {
9
+ super(z.object({
10
+ projectPath: z.string().optional(),
11
+ }));
12
+ }
13
+
14
+ async run(_input: Record<string, unknown>, _ctx: ToolContext): Promise<ToolExecutionResult> {
15
+ return { success: true, output: JSON.stringify({ indexed: false, stats: {} }) };
16
+ }
17
+ }
@@ -0,0 +1,309 @@
1
+ import { z } from "zod";
2
+ import { ToolBase, ToolContext, ToolExecutionResult } from "@thoughtflow/core";
3
+ import type { DesignComplianceResult, DesignDiscrepancy, Warning, CriticalIssue } from "@thoughtflow/core";
4
+
5
+ export interface ComparativeAnalysisConfig {
6
+ /** Custom persona prompt for LLM-powered comparison */
7
+ personaPrompt?: string;
8
+ /** Scoring weights for compliance calculation */
9
+ scoringWeights?: {
10
+ penaltyPerDiscrepancy?: number;
11
+ criticalMultiplier?: number;
12
+ };
13
+ /** Char limits for state/content truncation */
14
+ truncation?: {
15
+ actualMaxChars?: number;
16
+ expectedMaxChars?: number;
17
+ contextMaxChars?: number;
18
+ };
19
+ /** Custom cross-cutting checks to run after comparison */
20
+ crossCuttingChecks?: Array<{
21
+ keyword: string;
22
+ severity: "low" | "medium" | "high";
23
+ title: string;
24
+ suggestion: string;
25
+ }>;
26
+ }
27
+
28
+ const ComparativeResultSchema = z.object({
29
+ overallCompliance: z.number().min(0).max(1),
30
+ sections: z.array(z.object({
31
+ section: z.string(),
32
+ status: z.enum(["compliant", "partial", "non_compliant", "not_applicable"]),
33
+ details: z.string(),
34
+ evidenceRefs: z.array(z.string()).optional(),
35
+ })),
36
+ discrepancies: z.array(z.object({
37
+ section: z.string(),
38
+ expected: z.string(),
39
+ actual: z.string(),
40
+ severity: z.enum(["low", "medium", "high", "critical"]),
41
+ fix: z.string(),
42
+ })),
43
+ additionalWarnings: z.array(z.object({
44
+ title: z.string(),
45
+ description: z.string(),
46
+ severity: z.enum(["low", "medium", "high"]),
47
+ relatedRule: z.string().optional(),
48
+ suggestion: z.string(),
49
+ })),
50
+ additionalCritical: z.array(z.object({
51
+ title: z.string(),
52
+ description: z.string(),
53
+ impact: z.string(),
54
+ blocking: z.boolean(),
55
+ relatedRule: z.string().optional(),
56
+ suggestedFix: z.string(),
57
+ })),
58
+ summary: z.string(),
59
+ });
60
+
61
+ export class ComparativeAnalysisTool extends ToolBase {
62
+ readonly name = "comparativeAnalysis";
63
+ readonly description =
64
+ "Compare actual state (code, files, screenshots) against expected state (design specs, rules, guidelines). " +
65
+ "Detects discrepancies, compliance issues, and suggests fixes. " +
66
+ "Returns structured output with: target (what was checked), additionalWarnings (non-critical issues), " +
67
+ "additionalCritical (blocking issues), designCompliance (per-section status), diffDesign (expected vs actual). " +
68
+ "Use this when you need to verify implementation against design specifications or coding rules.";
69
+ override readonly readonly = true;
70
+ readonly namespace = "neural";
71
+ readonly tags = ["analysis", "compare", "verify"];
72
+
73
+ constructor(private readonly config: ComparativeAnalysisConfig = {}) {
74
+ super(
75
+ z.object({
76
+ actualState: z.string().describe(
77
+ "What currently exists — file content, code snippet, or description of current state",
78
+ ),
79
+ expectedState: z.string().describe(
80
+ "What should exist — design spec, rules, acceptance criteria, or expected behavior",
81
+ ),
82
+ context: z.array(z.string()).optional().describe(
83
+ "Additional context documents (architecture docs, related files, etc.)",
84
+ ),
85
+ checkSections: z.array(z.string()).optional().describe(
86
+ "Specific sections/aspects to compare (e.g. ['colors', 'spacing', 'routing', 'auth'])",
87
+ ),
88
+ strictMode: z.boolean().optional().default(false).describe(
89
+ "If true, flags even minor deviations as warnings",
90
+ ),
91
+ })
92
+ );
93
+ }
94
+
95
+ async run(input: Record<string, unknown>, ctx: ToolContext): Promise<ToolExecutionResult> {
96
+ const actualState = input["actualState"] as string;
97
+ const expectedState = input["expectedState"] as string;
98
+ const context = input["context"] as string[] | undefined;
99
+ const checkSections = input["checkSections"] as string[] | undefined;
100
+ const strictMode = (input["strictMode"] as boolean) ?? false;
101
+
102
+ ctx.emitProgress?.("Starting comparative analysis...");
103
+
104
+ const callStructured = ctx.conversation?.callStructured;
105
+ if (callStructured) {
106
+ try {
107
+ ctx.emitProgress?.("Running LLM-powered comparison...");
108
+ const result = await callStructured(this.buildLLMPrompt(
109
+ actualState, expectedState, context, checkSections, strictMode,
110
+ ), ComparativeResultSchema);
111
+
112
+ ctx.emitProgress?.("Comparison complete", {
113
+ compliance: result.overallCompliance,
114
+ discrepancies: result.discrepancies.length,
115
+ warnings: result.additionalWarnings.length,
116
+ criticals: result.additionalCritical.length,
117
+ });
118
+
119
+ return {
120
+ success: true,
121
+ output: JSON.stringify(this.formatOutput(result), null, 2),
122
+ data: { result },
123
+ };
124
+ } catch (err) {
125
+ ctx.emitProgress?.(`LLM comparison failed: ${String(err)}`);
126
+ }
127
+ }
128
+
129
+ // Fallback: keyword-based comparison
130
+ ctx.emitProgress?.("Running heuristic comparison...");
131
+ const heuristic = this.heuristicCompare(actualState, expectedState, checkSections, strictMode);
132
+ return {
133
+ success: true,
134
+ output: JSON.stringify(heuristic, null, 2),
135
+ data: { result: heuristic },
136
+ };
137
+ }
138
+
139
+ private buildLLMPrompt(
140
+ actual: string,
141
+ expected: string,
142
+ context: string[] | undefined,
143
+ sections: string[] | undefined,
144
+ strictMode: boolean,
145
+ ): string {
146
+ const t = this.config.truncation ?? {};
147
+ const actualChars = t.actualMaxChars ?? 3000;
148
+ const expectedChars = t.expectedMaxChars ?? 3000;
149
+ const ctxChars = t.contextMaxChars ?? 2000;
150
+
151
+ const parts: string[] = [];
152
+ parts.push(this.config.personaPrompt ??
153
+ "You are a design compliance auditor. Compare the ACTUAL implementation against the EXPECTED specification.");
154
+ parts.push(`\n## ACTUAL State (what currently exists)\n${actual.slice(0, actualChars)}`);
155
+ parts.push(`\n## EXPECTED State (what should exist)\n${expected.slice(0, expectedChars)}`);
156
+
157
+ if (context && context.length > 0) {
158
+ parts.push(`\n## Additional Context\n${context.join("\n\n").slice(0, ctxChars)}`);
159
+ }
160
+
161
+ parts.push("\n## Instructions");
162
+
163
+ if (sections && sections.length > 0) {
164
+ parts.push(`Check these specific sections: ${sections.join(", ")}`);
165
+ }
166
+
167
+ parts.push(strictMode
168
+ ? "STRICT MODE: Flag every deviation, even minor spacing/color differences."
169
+ : "Balanced mode: Focus on functional and design-breaking issues. Minor style deviations are warnings."
170
+ );
171
+ parts.push(``);
172
+ parts.push("Return structured JSON with:");
173
+ parts.push("- overallCompliance (0-1, where 1 = perfect match)");
174
+ parts.push("- sections: per-section compliance status");
175
+ parts.push("- discrepancies: expected vs actual with severity and suggested fix");
176
+ parts.push("- additionalWarnings: non-critical issues found beyond the immediate scope");
177
+ parts.push("- additionalCritical: blocking or severe issues");
178
+ parts.push("- summary: concise human-readable verdict");
179
+
180
+ return parts.join("\n");
181
+ }
182
+
183
+ private heuristicCompare(
184
+ actual: string,
185
+ expected: string,
186
+ sections: string[] | undefined,
187
+ strictMode: boolean,
188
+ ): object {
189
+ const discrepancies: DesignDiscrepancy[] = [];
190
+ const warnings: Warning[] = [];
191
+ const criticals: CriticalIssue[] = [];
192
+ const sectionResults: DesignComplianceResult["sections"] = [];
193
+
194
+ const checkList = sections ?? ["overall"];
195
+ const actualLower = actual.toLowerCase();
196
+ const expectedLower = expected.toLowerCase();
197
+
198
+ // Check for common issues
199
+ for (const section of checkList) {
200
+ const sectionLower = section.toLowerCase();
201
+
202
+ // Color-related checks
203
+ if (sectionLower.includes("color") || sectionLower.includes("style") || sectionLower.includes("css")) {
204
+ const expectedColors = expectedLower.match(/#[0-9a-f]{3,6}|rgb\([^)]+\)|red|blue|green|white|black/g);
205
+ const actualColors = actualLower.match(/#[0-9a-f]{3,6}|rgb\([^)]+\)|red|blue|green|white|black/g);
206
+ if (expectedColors && actualColors) {
207
+ for (const ec of expectedColors) {
208
+ if (!actualColors.includes(ec)) {
209
+ discrepancies.push({
210
+ section,
211
+ expected: `Color should include ${ec}`,
212
+ actual: `Color ${ec} not found in implementation`,
213
+ severity: strictMode ? "medium" : "low",
214
+ fix: `Add color ${ec} as specified`,
215
+ });
216
+ }
217
+ }
218
+ }
219
+ sectionResults.push({ section, status: discrepancies.length === 0 ? "compliant" : "partial", details: `${discrepancies.length} color mismatches`, evidenceRefs: [] });
220
+ }
221
+
222
+ // Navigation/routing checks
223
+ if (sectionLower.includes("nav") || sectionLower.includes("rout") || sectionLower.includes("link")) {
224
+ const hasNavActual = /<nav|navigation|navigate|route|link/i.test(actual);
225
+ if (!hasNavActual) {
226
+ discrepancies.push({
227
+ section,
228
+ expected: `Navigation structure should be present`,
229
+ actual: "No navigation pattern detected",
230
+ severity: "high",
231
+ fix: "Implement navigation as specified",
232
+ });
233
+ }
234
+ sectionResults.push({ section, status: hasNavActual ? "compliant" : "non_compliant", details: "Navigation check", evidenceRefs: [] });
235
+ }
236
+
237
+ // Default section
238
+ // Always run default comparison for sections that aren't specifically handled
239
+ {
240
+ // Basic content comparison
241
+ const expectedKeywords = expectedLower.split(/\s+/).filter((w) => w.length > 3).slice(0, 10);
242
+ const missingKeywords = expectedKeywords.filter((kw) => !actualLower.includes(kw));
243
+ if (missingKeywords.length > 3) {
244
+ discrepancies.push({
245
+ section,
246
+ expected: `Should contain: ${missingKeywords.join(", ")}`,
247
+ actual: "Keywords not found in implementation",
248
+ severity: "medium",
249
+ fix: "Ensure implementation includes expected content",
250
+ });
251
+ }
252
+ sectionResults.push({
253
+ section,
254
+ status: missingKeywords.length === 0 ? "compliant" : missingKeywords.length <= 3 ? "partial" : "non_compliant",
255
+ details: `${missingKeywords.length}/${expectedKeywords.length} keywords missing`,
256
+ evidenceRefs: [],
257
+ });
258
+ }
259
+ }
260
+
261
+ // Always check for common cross-cutting concerns
262
+ const crossChecks = this.config.crossCuttingChecks ?? [
263
+ { keyword: "test", severity: "medium" as const, title: "Testing not detected in implementation", suggestion: "Add unit and integration tests" },
264
+ { keyword: "error", severity: "medium" as const, title: "Error handling may be missing", suggestion: "Add error handling and user feedback" },
265
+ ];
266
+ for (const check of crossChecks) {
267
+ if (!actualLower.includes(check.keyword) && expectedLower.includes(check.keyword)) {
268
+ warnings.push({
269
+ sourceNodeId: "",
270
+ title: check.title,
271
+ description: `Expected specification mentions ${check.keyword}, not detected in implementation`,
272
+ severity: check.severity,
273
+ suggestion: check.suggestion,
274
+ });
275
+ }
276
+ }
277
+
278
+ const penalty = this.config.scoringWeights?.penaltyPerDiscrepancy ?? 0.15;
279
+ return {
280
+ overallCompliance: discrepancies.length === 0 ? 1 : Math.max(0, 1 - discrepancies.length * penalty),
281
+ sections: sectionResults,
282
+ discrepancies,
283
+ additionalWarnings: warnings,
284
+ additionalCritical: criticals,
285
+ summary: discrepancies.length === 0
286
+ ? "Implementation appears compliant with specification"
287
+ : `${discrepancies.length} discrepancy(s) found, ${warnings.length} warning(s)`,
288
+ };
289
+ }
290
+
291
+ private formatOutput(result: z.infer<typeof ComparativeResultSchema>): object {
292
+ return {
293
+ target: "Comparative analysis between expected and actual state",
294
+ designCompliance: {
295
+ overallScore: result.overallCompliance,
296
+ sections: result.sections,
297
+ discrepancies: result.discrepancies,
298
+ },
299
+ additionalWarnings: result.additionalWarnings,
300
+ additionalCritical: result.additionalCritical,
301
+ diffDesign: result.discrepancies.map((d) => ({
302
+ section: d.section,
303
+ diff: `Expected: ${d.expected}\nActual: ${d.actual}\nFix: ${d.fix}`,
304
+ severity: d.severity,
305
+ })),
306
+ summary: result.summary,
307
+ };
308
+ }
309
+ }
@@ -0,0 +1,11 @@
1
+ export * from "./neural-explain.tool";
2
+ export * from "./neural-suggest.tool";
3
+ export * from "./neural-review.tool";
4
+ export * from "./neural-debug.tool";
5
+ export * from "./neural-security.tool";
6
+ export * from "./neural-smells.tool";
7
+ export * from "./neural-deadcode.tool";
8
+ export * from "./neural-similar.tool";
9
+ export * from "./neural-pattern.tool";
10
+ export * from "./neural-optimize.tool";
11
+ export * from "./comparative-analysis.tool";
@@ -0,0 +1,105 @@
1
+ import { z } from "zod";
2
+ import { ToolBase, ToolContext, ToolExecutionResult } from "@thoughtflow/core";
3
+ import { DependencyExtractor } from "../../libs/codebase/graph/dependency-extractor";
4
+ import { CodebaseExplorer } from "../../libs/codebase/indexer/explorer";
5
+ import * as fs from "node:fs";
6
+
7
+ export class NeuralDeadcodeTool extends ToolBase {
8
+ readonly name = "neuralDeadcode";
9
+ readonly description = "Detect dead code: unused exports, unreachable functions, unused variables, and orphaned files using dependency graph analysis with LLM-guided false-positive filtering for uncertain cases.";
10
+ override readonly readonly = true;
11
+
12
+ constructor() {
13
+ super(z.object({
14
+ projectPath: z.string().optional(),
15
+ threshold: z.number().optional().describe("Min lines of dead code to report a file"),
16
+ llmVerify: z.boolean().optional().describe("Use LLM to verify uncertain cases"),
17
+ }));
18
+ }
19
+
20
+ async run(input: Record<string, unknown>, ctx: ToolContext): Promise<ToolExecutionResult> {
21
+ const rootPath = (input.projectPath as string) ?? process.cwd();
22
+ const threshold = (input.threshold as number) ?? 3;
23
+ const llmVerify = (input.llmVerify as boolean) ?? false;
24
+
25
+ const explorer = new CodebaseExplorer();
26
+ const files = explorer.explore({ rootPath });
27
+ const codeFiles = files.filter((f) => f.classification === "source-code")
28
+ .map((f) => ({ relativePath: f.relativePath, absolutePath: f.absolutePath }));
29
+
30
+ const depExtractor = new DependencyExtractor();
31
+ const graph = await depExtractor.buildGraph(codeFiles, rootPath);
32
+
33
+ const usedFiles = new Set<string>();
34
+ for (const edge of graph.edges) {
35
+ usedFiles.add(edge.to);
36
+ }
37
+
38
+ const deadExports: Array<{ file: string; symbol: string; type: string; line: number; confidence: string }> = [];
39
+ const unreachableFiles: string[] = [];
40
+
41
+ for (const file of codeFiles) {
42
+ const content = fs.readFileSync(file.absolutePath, "utf8");
43
+ const exports = this.extractExports(content, file.relativePath);
44
+
45
+ const hasIncoming = graph.edges.some((e) => e.to === file.relativePath);
46
+ const isEntry = file.relativePath.match(/(index|main|app|server|cli)\.ts$/);
47
+ if (!hasIncoming && !isEntry && file.relativePath.includes("/")) {
48
+ unreachableFiles.push(file.relativePath);
49
+ }
50
+
51
+ for (const exp of exports) {
52
+ let used = false;
53
+ for (const edge of graph.edges) {
54
+ if (edge.symbols?.includes(exp.symbol)) { used = true; break; }
55
+ }
56
+ if (!used && !exp.symbol.startsWith("_") && !exp.symbol.startsWith("I")) {
57
+ deadExports.push({ ...exp, confidence: "high" });
58
+ }
59
+ }
60
+ }
61
+
62
+ if (llmVerify && unreachableFiles.length > 0 && ctx.conversation) {
63
+ const prompt = `These files appear to have no imports from other project files. Are any of them entry points, referenced dynamically (e.g., loaded by string path, used in config files, routing tables, or build scripts), or otherwise used indirectly?\n\n${unreachableFiles.slice(0, 10).join("\n")}\n\nReturn: { falsePositives: string[] } listing only files that are genuinely in use.`;
64
+
65
+ try {
66
+ const result = await ctx.conversation.callStructured(prompt, z.object({ falsePositives: z.array(z.string()) }));
67
+ const fps = new Set(result.falsePositives ?? []);
68
+ const filtered = unreachableFiles.filter((f) => !fps.has(f));
69
+ return {
70
+ success: true,
71
+ output: JSON.stringify({
72
+ summary: { totalFiles: codeFiles.length, deadExports: deadExports.length, unreachableFiles: filtered.length, falsePositivesRemoved: fps.size },
73
+ deadExports: deadExports.slice(0, 50),
74
+ unreachableFiles: filtered,
75
+ }),
76
+ };
77
+ } catch {
78
+ }
79
+ }
80
+
81
+ return {
82
+ success: true,
83
+ output: JSON.stringify({
84
+ summary: { totalFiles: codeFiles.length, deadExports: deadExports.length, unreachableFiles: unreachableFiles.length },
85
+ deadExports: deadExports.slice(0, 50),
86
+ unreachableFiles: unreachableFiles.slice(0, 20),
87
+ }),
88
+ };
89
+ }
90
+
91
+ private extractExports(content: string, filePath: string): Array<{ file: string; symbol: string; type: string; line: number }> {
92
+ const exports: Array<{ file: string; symbol: string; type: string; line: number }> = [];
93
+ const lines = content.split("\n");
94
+ for (let i = 0; i < lines.length; i++) {
95
+ const match = lines[i].match(/(?:export\s+(?:async\s+)?(?:function|class|const|let|var|interface|type|enum)\s+(\w+))|(?:export\s*\{\s*([^}]+)\s*\})/);
96
+ if (match) {
97
+ const name = match[1] || match[2];
98
+ if (name) {
99
+ exports.push({ file: filePath, symbol: name, type: "export", line: i + 1 });
100
+ }
101
+ }
102
+ }
103
+ return exports;
104
+ }
105
+ }