@aionlabsai/aion 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 (394) hide show
  1. package/README.md +41 -0
  2. package/dist/agents/base-agent.d.ts +27 -0
  3. package/dist/agents/base-agent.d.ts.map +1 -0
  4. package/dist/agents/base-agent.js +97 -0
  5. package/dist/agents/base-agent.js.map +1 -0
  6. package/dist/agents/developer.d.ts +21 -0
  7. package/dist/agents/developer.d.ts.map +1 -0
  8. package/dist/agents/developer.js +51 -0
  9. package/dist/agents/developer.js.map +1 -0
  10. package/dist/agents/explain-agent.d.ts +17 -0
  11. package/dist/agents/explain-agent.d.ts.map +1 -0
  12. package/dist/agents/explain-agent.js +30 -0
  13. package/dist/agents/explain-agent.js.map +1 -0
  14. package/dist/agents/graph-agent.d.ts +21 -0
  15. package/dist/agents/graph-agent.d.ts.map +1 -0
  16. package/dist/agents/graph-agent.js +57 -0
  17. package/dist/agents/graph-agent.js.map +1 -0
  18. package/dist/agents/investigator.d.ts +21 -0
  19. package/dist/agents/investigator.d.ts.map +1 -0
  20. package/dist/agents/investigator.js +48 -0
  21. package/dist/agents/investigator.js.map +1 -0
  22. package/dist/agents/planner.d.ts +19 -0
  23. package/dist/agents/planner.d.ts.map +1 -0
  24. package/dist/agents/planner.js +43 -0
  25. package/dist/agents/planner.js.map +1 -0
  26. package/dist/agents/planner.test.d.ts +2 -0
  27. package/dist/agents/planner.test.d.ts.map +1 -0
  28. package/dist/agents/planner.test.js +21 -0
  29. package/dist/agents/planner.test.js.map +1 -0
  30. package/dist/agents/qa.d.ts +18 -0
  31. package/dist/agents/qa.d.ts.map +1 -0
  32. package/dist/agents/qa.js +44 -0
  33. package/dist/agents/qa.js.map +1 -0
  34. package/dist/agents/reviewer.d.ts +19 -0
  35. package/dist/agents/reviewer.d.ts.map +1 -0
  36. package/dist/agents/reviewer.js +47 -0
  37. package/dist/agents/reviewer.js.map +1 -0
  38. package/dist/agents/scanner.d.ts +19 -0
  39. package/dist/agents/scanner.d.ts.map +1 -0
  40. package/dist/agents/scanner.js +30 -0
  41. package/dist/agents/scanner.js.map +1 -0
  42. package/dist/agents/synthesizer.d.ts +16 -0
  43. package/dist/agents/synthesizer.d.ts.map +1 -0
  44. package/dist/agents/synthesizer.js +97 -0
  45. package/dist/agents/synthesizer.js.map +1 -0
  46. package/dist/agents/tests-agent.d.ts +17 -0
  47. package/dist/agents/tests-agent.d.ts.map +1 -0
  48. package/dist/agents/tests-agent.js +36 -0
  49. package/dist/agents/tests-agent.js.map +1 -0
  50. package/dist/cli/classifier.d.ts +8 -0
  51. package/dist/cli/classifier.d.ts.map +1 -0
  52. package/dist/cli/classifier.js +60 -0
  53. package/dist/cli/classifier.js.map +1 -0
  54. package/dist/cli/commands/analyze.d.ts +3 -0
  55. package/dist/cli/commands/analyze.d.ts.map +1 -0
  56. package/dist/cli/commands/analyze.js +22 -0
  57. package/dist/cli/commands/analyze.js.map +1 -0
  58. package/dist/cli/commands/audit.d.ts +3 -0
  59. package/dist/cli/commands/audit.d.ts.map +1 -0
  60. package/dist/cli/commands/audit.js +189 -0
  61. package/dist/cli/commands/audit.js.map +1 -0
  62. package/dist/cli/commands/churn.d.ts +3 -0
  63. package/dist/cli/commands/churn.d.ts.map +1 -0
  64. package/dist/cli/commands/churn.js +76 -0
  65. package/dist/cli/commands/churn.js.map +1 -0
  66. package/dist/cli/commands/explain.d.ts +3 -0
  67. package/dist/cli/commands/explain.d.ts.map +1 -0
  68. package/dist/cli/commands/explain.js +115 -0
  69. package/dist/cli/commands/explain.js.map +1 -0
  70. package/dist/cli/commands/fix.d.ts +3 -0
  71. package/dist/cli/commands/fix.d.ts.map +1 -0
  72. package/dist/cli/commands/fix.js +22 -0
  73. package/dist/cli/commands/fix.js.map +1 -0
  74. package/dist/cli/commands/graph.d.ts +3 -0
  75. package/dist/cli/commands/graph.d.ts.map +1 -0
  76. package/dist/cli/commands/graph.js +311 -0
  77. package/dist/cli/commands/graph.js.map +1 -0
  78. package/dist/cli/commands/health.d.ts +3 -0
  79. package/dist/cli/commands/health.d.ts.map +1 -0
  80. package/dist/cli/commands/health.js +106 -0
  81. package/dist/cli/commands/health.js.map +1 -0
  82. package/dist/cli/commands/memory.d.ts +3 -0
  83. package/dist/cli/commands/memory.d.ts.map +1 -0
  84. package/dist/cli/commands/memory.js +199 -0
  85. package/dist/cli/commands/memory.js.map +1 -0
  86. package/dist/cli/commands/patterns.d.ts +3 -0
  87. package/dist/cli/commands/patterns.d.ts.map +1 -0
  88. package/dist/cli/commands/patterns.js +79 -0
  89. package/dist/cli/commands/patterns.js.map +1 -0
  90. package/dist/cli/commands/report.d.ts +3 -0
  91. package/dist/cli/commands/report.d.ts.map +1 -0
  92. package/dist/cli/commands/report.js +408 -0
  93. package/dist/cli/commands/report.js.map +1 -0
  94. package/dist/cli/commands/review.d.ts +3 -0
  95. package/dist/cli/commands/review.d.ts.map +1 -0
  96. package/dist/cli/commands/review.js +21 -0
  97. package/dist/cli/commands/review.js.map +1 -0
  98. package/dist/cli/commands/scan.d.ts +3 -0
  99. package/dist/cli/commands/scan.d.ts.map +1 -0
  100. package/dist/cli/commands/scan.js +129 -0
  101. package/dist/cli/commands/scan.js.map +1 -0
  102. package/dist/cli/interactive.d.ts +3 -0
  103. package/dist/cli/interactive.d.ts.map +1 -0
  104. package/dist/cli/interactive.js +115 -0
  105. package/dist/cli/interactive.js.map +1 -0
  106. package/dist/cli/menu.d.ts +2 -0
  107. package/dist/cli/menu.d.ts.map +1 -0
  108. package/dist/cli/menu.js +208 -0
  109. package/dist/cli/menu.js.map +1 -0
  110. package/dist/cli/runtime-options.d.ts +19 -0
  111. package/dist/cli/runtime-options.d.ts.map +1 -0
  112. package/dist/cli/runtime-options.js +56 -0
  113. package/dist/cli/runtime-options.js.map +1 -0
  114. package/dist/cli/tui.d.ts +11 -0
  115. package/dist/cli/tui.d.ts.map +1 -0
  116. package/dist/cli/tui.js +162 -0
  117. package/dist/cli/tui.js.map +1 -0
  118. package/dist/cli/ui/renderer.d.ts +15 -0
  119. package/dist/cli/ui/renderer.d.ts.map +1 -0
  120. package/dist/cli/ui/renderer.js +129 -0
  121. package/dist/cli/ui/renderer.js.map +1 -0
  122. package/dist/core/cost-tracker.d.ts +26 -0
  123. package/dist/core/cost-tracker.d.ts.map +1 -0
  124. package/dist/core/cost-tracker.js +71 -0
  125. package/dist/core/cost-tracker.js.map +1 -0
  126. package/dist/core/cost-tracker.test.d.ts +2 -0
  127. package/dist/core/cost-tracker.test.d.ts.map +1 -0
  128. package/dist/core/cost-tracker.test.js +36 -0
  129. package/dist/core/cost-tracker.test.js.map +1 -0
  130. package/dist/core/orchestrator.d.ts +46 -0
  131. package/dist/core/orchestrator.d.ts.map +1 -0
  132. package/dist/core/orchestrator.js +67 -0
  133. package/dist/core/orchestrator.js.map +1 -0
  134. package/dist/core/pipeline-context.d.ts +18 -0
  135. package/dist/core/pipeline-context.d.ts.map +1 -0
  136. package/dist/core/pipeline-context.js +30 -0
  137. package/dist/core/pipeline-context.js.map +1 -0
  138. package/dist/core/pipelines/analyze-pipeline.d.ts +4 -0
  139. package/dist/core/pipelines/analyze-pipeline.d.ts.map +1 -0
  140. package/dist/core/pipelines/analyze-pipeline.js +69 -0
  141. package/dist/core/pipelines/analyze-pipeline.js.map +1 -0
  142. package/dist/core/pipelines/audit-fix-pipeline.d.ts +24 -0
  143. package/dist/core/pipelines/audit-fix-pipeline.d.ts.map +1 -0
  144. package/dist/core/pipelines/audit-fix-pipeline.js +79 -0
  145. package/dist/core/pipelines/audit-fix-pipeline.js.map +1 -0
  146. package/dist/core/pipelines/audit-pipeline.d.ts +33 -0
  147. package/dist/core/pipelines/audit-pipeline.d.ts.map +1 -0
  148. package/dist/core/pipelines/audit-pipeline.js +353 -0
  149. package/dist/core/pipelines/audit-pipeline.js.map +1 -0
  150. package/dist/core/pipelines/audit-pipeline.test.d.ts +2 -0
  151. package/dist/core/pipelines/audit-pipeline.test.d.ts.map +1 -0
  152. package/dist/core/pipelines/audit-pipeline.test.js +135 -0
  153. package/dist/core/pipelines/audit-pipeline.test.js.map +1 -0
  154. package/dist/core/pipelines/fix-pipeline.d.ts +9 -0
  155. package/dist/core/pipelines/fix-pipeline.d.ts.map +1 -0
  156. package/dist/core/pipelines/fix-pipeline.js +151 -0
  157. package/dist/core/pipelines/fix-pipeline.js.map +1 -0
  158. package/dist/core/pipelines/review-pipeline.d.ts +4 -0
  159. package/dist/core/pipelines/review-pipeline.d.ts.map +1 -0
  160. package/dist/core/pipelines/review-pipeline.js +65 -0
  161. package/dist/core/pipelines/review-pipeline.js.map +1 -0
  162. package/dist/core/repo-context.d.ts +2 -0
  163. package/dist/core/repo-context.d.ts.map +1 -0
  164. package/dist/core/repo-context.js +12 -0
  165. package/dist/core/repo-context.js.map +1 -0
  166. package/dist/core/repo-context.test.d.ts +2 -0
  167. package/dist/core/repo-context.test.d.ts.map +1 -0
  168. package/dist/core/repo-context.test.js +40 -0
  169. package/dist/core/repo-context.test.js.map +1 -0
  170. package/dist/core/runtime-policy.d.ts +35 -0
  171. package/dist/core/runtime-policy.d.ts.map +1 -0
  172. package/dist/core/runtime-policy.js +37 -0
  173. package/dist/core/runtime-policy.js.map +1 -0
  174. package/dist/core/runtime-policy.test.d.ts +2 -0
  175. package/dist/core/runtime-policy.test.d.ts.map +1 -0
  176. package/dist/core/runtime-policy.test.js +27 -0
  177. package/dist/core/runtime-policy.test.js.map +1 -0
  178. package/dist/core/state-machine.d.ts +17 -0
  179. package/dist/core/state-machine.d.ts.map +1 -0
  180. package/dist/core/state-machine.js +45 -0
  181. package/dist/core/state-machine.js.map +1 -0
  182. package/dist/core/task.d.ts +29 -0
  183. package/dist/core/task.d.ts.map +1 -0
  184. package/dist/core/task.js +2 -0
  185. package/dist/core/task.js.map +1 -0
  186. package/dist/index.d.ts +3 -0
  187. package/dist/index.d.ts.map +1 -0
  188. package/dist/index.js +75 -0
  189. package/dist/index.js.map +1 -0
  190. package/dist/infra/bm25.d.ts +30 -0
  191. package/dist/infra/bm25.d.ts.map +1 -0
  192. package/dist/infra/bm25.js +69 -0
  193. package/dist/infra/bm25.js.map +1 -0
  194. package/dist/infra/bm25.test.d.ts +2 -0
  195. package/dist/infra/bm25.test.d.ts.map +1 -0
  196. package/dist/infra/bm25.test.js +17 -0
  197. package/dist/infra/bm25.test.js.map +1 -0
  198. package/dist/infra/chunker.d.ts +20 -0
  199. package/dist/infra/chunker.d.ts.map +1 -0
  200. package/dist/infra/chunker.js +165 -0
  201. package/dist/infra/chunker.js.map +1 -0
  202. package/dist/infra/chunker.test.d.ts +2 -0
  203. package/dist/infra/chunker.test.d.ts.map +1 -0
  204. package/dist/infra/chunker.test.js +33 -0
  205. package/dist/infra/chunker.test.js.map +1 -0
  206. package/dist/infra/code-metrics.d.ts +39 -0
  207. package/dist/infra/code-metrics.d.ts.map +1 -0
  208. package/dist/infra/code-metrics.js +222 -0
  209. package/dist/infra/code-metrics.js.map +1 -0
  210. package/dist/infra/db/database.d.ts +4 -0
  211. package/dist/infra/db/database.d.ts.map +1 -0
  212. package/dist/infra/db/database.js +25 -0
  213. package/dist/infra/db/database.js.map +1 -0
  214. package/dist/infra/db/evidence-repo.d.ts +4 -0
  215. package/dist/infra/db/evidence-repo.d.ts.map +1 -0
  216. package/dist/infra/db/evidence-repo.js +8 -0
  217. package/dist/infra/db/evidence-repo.js.map +1 -0
  218. package/dist/infra/db/migrations.d.ts +2 -0
  219. package/dist/infra/db/migrations.d.ts.map +1 -0
  220. package/dist/infra/db/migrations.js +10 -0
  221. package/dist/infra/db/migrations.js.map +1 -0
  222. package/dist/infra/db/store.d.ts +12 -0
  223. package/dist/infra/db/store.d.ts.map +1 -0
  224. package/dist/infra/db/store.js +73 -0
  225. package/dist/infra/db/store.js.map +1 -0
  226. package/dist/infra/db/task-repo.d.ts +8 -0
  227. package/dist/infra/db/task-repo.d.ts.map +1 -0
  228. package/dist/infra/db/task-repo.js +19 -0
  229. package/dist/infra/db/task-repo.js.map +1 -0
  230. package/dist/infra/dep-graph-python.d.ts +3 -0
  231. package/dist/infra/dep-graph-python.d.ts.map +1 -0
  232. package/dist/infra/dep-graph-python.js +154 -0
  233. package/dist/infra/dep-graph-python.js.map +1 -0
  234. package/dist/infra/dep-graph.d.ts +20 -0
  235. package/dist/infra/dep-graph.d.ts.map +1 -0
  236. package/dist/infra/dep-graph.js +102 -0
  237. package/dist/infra/dep-graph.js.map +1 -0
  238. package/dist/infra/embeddings.d.ts +19 -0
  239. package/dist/infra/embeddings.d.ts.map +1 -0
  240. package/dist/infra/embeddings.js +110 -0
  241. package/dist/infra/embeddings.js.map +1 -0
  242. package/dist/infra/evidence-gate.d.ts +11 -0
  243. package/dist/infra/evidence-gate.d.ts.map +1 -0
  244. package/dist/infra/evidence-gate.js +21 -0
  245. package/dist/infra/evidence-gate.js.map +1 -0
  246. package/dist/infra/evidence-gate.test.d.ts +2 -0
  247. package/dist/infra/evidence-gate.test.d.ts.map +1 -0
  248. package/dist/infra/evidence-gate.test.js +36 -0
  249. package/dist/infra/evidence-gate.test.js.map +1 -0
  250. package/dist/infra/git-analysis.d.ts +26 -0
  251. package/dist/infra/git-analysis.d.ts.map +1 -0
  252. package/dist/infra/git-analysis.js +102 -0
  253. package/dist/infra/git-analysis.js.map +1 -0
  254. package/dist/infra/health-score.d.ts +31 -0
  255. package/dist/infra/health-score.d.ts.map +1 -0
  256. package/dist/infra/health-score.js +136 -0
  257. package/dist/infra/health-score.js.map +1 -0
  258. package/dist/infra/knowledge.d.ts +15 -0
  259. package/dist/infra/knowledge.d.ts.map +1 -0
  260. package/dist/infra/knowledge.js +124 -0
  261. package/dist/infra/knowledge.js.map +1 -0
  262. package/dist/infra/lang-detect.d.ts +14 -0
  263. package/dist/infra/lang-detect.d.ts.map +1 -0
  264. package/dist/infra/lang-detect.js +135 -0
  265. package/dist/infra/lang-detect.js.map +1 -0
  266. package/dist/infra/local-qa.d.ts +6 -0
  267. package/dist/infra/local-qa.d.ts.map +1 -0
  268. package/dist/infra/local-qa.js +66 -0
  269. package/dist/infra/local-qa.js.map +1 -0
  270. package/dist/infra/pattern-detect.d.ts +30 -0
  271. package/dist/infra/pattern-detect.d.ts.map +1 -0
  272. package/dist/infra/pattern-detect.js +250 -0
  273. package/dist/infra/pattern-detect.js.map +1 -0
  274. package/dist/infra/persona-presets.d.ts +29 -0
  275. package/dist/infra/persona-presets.d.ts.map +1 -0
  276. package/dist/infra/persona-presets.js +110 -0
  277. package/dist/infra/persona-presets.js.map +1 -0
  278. package/dist/infra/repo-index.d.ts +50 -0
  279. package/dist/infra/repo-index.d.ts.map +1 -0
  280. package/dist/infra/repo-index.js +228 -0
  281. package/dist/infra/repo-index.js.map +1 -0
  282. package/dist/infra/repo-index.test.d.ts +2 -0
  283. package/dist/infra/repo-index.test.d.ts.map +1 -0
  284. package/dist/infra/repo-index.test.js +53 -0
  285. package/dist/infra/repo-index.test.js.map +1 -0
  286. package/dist/infra/repo-query.d.ts +11 -0
  287. package/dist/infra/repo-query.d.ts.map +1 -0
  288. package/dist/infra/repo-query.js +67 -0
  289. package/dist/infra/repo-query.js.map +1 -0
  290. package/dist/infra/repo-query.test.d.ts +2 -0
  291. package/dist/infra/repo-query.test.d.ts.map +1 -0
  292. package/dist/infra/repo-query.test.js +34 -0
  293. package/dist/infra/repo-query.test.js.map +1 -0
  294. package/dist/infra/sbom.d.ts +16 -0
  295. package/dist/infra/sbom.d.ts.map +1 -0
  296. package/dist/infra/sbom.js +111 -0
  297. package/dist/infra/sbom.js.map +1 -0
  298. package/dist/infra/semgrep.d.ts +10 -0
  299. package/dist/infra/semgrep.d.ts.map +1 -0
  300. package/dist/infra/semgrep.js +122 -0
  301. package/dist/infra/semgrep.js.map +1 -0
  302. package/dist/infra/semgrep.test.d.ts +2 -0
  303. package/dist/infra/semgrep.test.d.ts.map +1 -0
  304. package/dist/infra/semgrep.test.js +39 -0
  305. package/dist/infra/semgrep.test.js.map +1 -0
  306. package/dist/infra/tmux.d.ts +9 -0
  307. package/dist/infra/tmux.d.ts.map +1 -0
  308. package/dist/infra/tmux.js +42 -0
  309. package/dist/infra/tmux.js.map +1 -0
  310. package/dist/infra/worktree.d.ts +9 -0
  311. package/dist/infra/worktree.d.ts.map +1 -0
  312. package/dist/infra/worktree.js +51 -0
  313. package/dist/infra/worktree.js.map +1 -0
  314. package/dist/prompts/developer.d.ts +2 -0
  315. package/dist/prompts/developer.d.ts.map +1 -0
  316. package/dist/prompts/developer.js +36 -0
  317. package/dist/prompts/developer.js.map +1 -0
  318. package/dist/prompts/explain.d.ts +3 -0
  319. package/dist/prompts/explain.d.ts.map +1 -0
  320. package/dist/prompts/explain.js +38 -0
  321. package/dist/prompts/explain.js.map +1 -0
  322. package/dist/prompts/investigator.d.ts +3 -0
  323. package/dist/prompts/investigator.d.ts.map +1 -0
  324. package/dist/prompts/investigator.js +46 -0
  325. package/dist/prompts/investigator.js.map +1 -0
  326. package/dist/prompts/planner.d.ts +2 -0
  327. package/dist/prompts/planner.d.ts.map +1 -0
  328. package/dist/prompts/planner.js +37 -0
  329. package/dist/prompts/planner.js.map +1 -0
  330. package/dist/prompts/qa.d.ts +2 -0
  331. package/dist/prompts/qa.d.ts.map +1 -0
  332. package/dist/prompts/qa.js +37 -0
  333. package/dist/prompts/qa.js.map +1 -0
  334. package/dist/prompts/reviewer.d.ts +2 -0
  335. package/dist/prompts/reviewer.d.ts.map +1 -0
  336. package/dist/prompts/reviewer.js +36 -0
  337. package/dist/prompts/reviewer.js.map +1 -0
  338. package/dist/prompts/scanner-domains-infra.d.ts +48 -0
  339. package/dist/prompts/scanner-domains-infra.d.ts.map +1 -0
  340. package/dist/prompts/scanner-domains-infra.js +141 -0
  341. package/dist/prompts/scanner-domains-infra.js.map +1 -0
  342. package/dist/prompts/scanner.d.ts +10 -0
  343. package/dist/prompts/scanner.d.ts.map +1 -0
  344. package/dist/prompts/scanner.js +185 -0
  345. package/dist/prompts/scanner.js.map +1 -0
  346. package/dist/prompts/synthesizer.d.ts +2 -0
  347. package/dist/prompts/synthesizer.d.ts.map +1 -0
  348. package/dist/prompts/synthesizer.js +36 -0
  349. package/dist/prompts/synthesizer.js.map +1 -0
  350. package/dist/providers/cli-provider.d.ts +16 -0
  351. package/dist/providers/cli-provider.d.ts.map +1 -0
  352. package/dist/providers/cli-provider.js +145 -0
  353. package/dist/providers/cli-provider.js.map +1 -0
  354. package/dist/providers/openrouter-provider.d.ts +8 -0
  355. package/dist/providers/openrouter-provider.d.ts.map +1 -0
  356. package/dist/providers/openrouter-provider.js +86 -0
  357. package/dist/providers/openrouter-provider.js.map +1 -0
  358. package/dist/providers/sdk-provider.d.ts +6 -0
  359. package/dist/providers/sdk-provider.d.ts.map +1 -0
  360. package/dist/providers/sdk-provider.js +0 -0
  361. package/dist/providers/sdk-provider.js.map +1 -0
  362. package/dist/providers/types.d.ts +13 -0
  363. package/dist/providers/types.d.ts.map +1 -0
  364. package/dist/providers/types.js +2 -0
  365. package/dist/providers/types.js.map +1 -0
  366. package/dist/schemas/audit.d.ts +278 -0
  367. package/dist/schemas/audit.d.ts.map +1 -0
  368. package/dist/schemas/audit.js +37 -0
  369. package/dist/schemas/audit.js.map +1 -0
  370. package/dist/schemas/audit.test.d.ts +2 -0
  371. package/dist/schemas/audit.test.d.ts.map +1 -0
  372. package/dist/schemas/audit.test.js +41 -0
  373. package/dist/schemas/audit.test.js.map +1 -0
  374. package/dist/schemas/evidence.d.ts +48 -0
  375. package/dist/schemas/evidence.d.ts.map +1 -0
  376. package/dist/schemas/evidence.js +17 -0
  377. package/dist/schemas/evidence.js.map +1 -0
  378. package/dist/schemas/patch.d.ts +25 -0
  379. package/dist/schemas/patch.d.ts.map +1 -0
  380. package/dist/schemas/patch.js +10 -0
  381. package/dist/schemas/patch.js.map +1 -0
  382. package/dist/schemas/plan.d.ts +69 -0
  383. package/dist/schemas/plan.d.ts.map +1 -0
  384. package/dist/schemas/plan.js +17 -0
  385. package/dist/schemas/plan.js.map +1 -0
  386. package/dist/schemas/qa.d.ts +28 -0
  387. package/dist/schemas/qa.d.ts.map +1 -0
  388. package/dist/schemas/qa.js +11 -0
  389. package/dist/schemas/qa.js.map +1 -0
  390. package/dist/schemas/review.d.ts +71 -0
  391. package/dist/schemas/review.d.ts.map +1 -0
  392. package/dist/schemas/review.js +16 -0
  393. package/dist/schemas/review.js.map +1 -0
  394. package/package.json +51 -0
@@ -0,0 +1,408 @@
1
+ import { mkdirSync, writeFileSync, existsSync, readdirSync, readFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { spawnSync } from 'child_process';
4
+ import { GraphAgent } from '../../agents/graph-agent.js';
5
+ import { buildChurnReport } from '../../infra/git-analysis.js';
6
+ import { detectPatterns } from '../../infra/pattern-detect.js';
7
+ import { computeHealthScore } from '../../infra/health-score.js';
8
+ import { measureCognitiveLoad, buildApiMap, auditEnvVars, scanCurrentSecrets } from '../../infra/code-metrics.js';
9
+ import { buildSbom } from '../../infra/sbom.js';
10
+ function esc(s) {
11
+ return String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
12
+ }
13
+ function loadLatestAudit(cwd) {
14
+ const dir = join(cwd, '.ai-runtime', 'reports');
15
+ if (!existsSync(dir))
16
+ return null;
17
+ try {
18
+ const files = readdirSync(dir).filter((f) => f.startsWith('audit-') && f.endsWith('.json')).sort().reverse();
19
+ if (!files[0])
20
+ return null;
21
+ return JSON.parse(readFileSync(join(dir, files[0]), 'utf8'));
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ function renderReport(data) {
28
+ const { projectName, health, audit, churn, patterns, cognitive } = data;
29
+ const gradeColor = { A: '#3fb950', B: '#3fb950', C: '#e3b341', D: '#f85149', F: '#f85149' }[health.grade] ?? '#8b949e';
30
+ const findingRows = (audit?.findings ?? []).slice(0, 50).map((f) => {
31
+ const sevColor = { critical: '#f85149', high: '#e3b341', medium: '#79c0ff', low: '#8b949e', info: '#484f58' }[f.severity] ?? '#8b949e';
32
+ return `<tr>
33
+ <td><span class="badge" style="background:${sevColor}20;color:${sevColor}">${esc(f.severity)}</span></td>
34
+ <td class="mono">${esc(f.file)}${f.line ? ':' + f.line : ''}</td>
35
+ <td>${esc(f.category)}</td>
36
+ <td>${esc(f.finding)}</td>
37
+ </tr>`;
38
+ }).join('');
39
+ const churnRows = churn.churn.slice(0, 20).map((c) => {
40
+ const riskColor = { critical: '#f85149', high: '#e3b341', medium: '#79c0ff', low: '#484f58' }[c.risk] ?? '#484f58';
41
+ return `<tr>
42
+ <td class="mono">${esc(c.file)}</td>
43
+ <td style="color:${riskColor}">${c.commits}</td>
44
+ <td>${c.authors}</td>
45
+ <td><span class="badge" style="background:${riskColor}20;color:${riskColor}">${c.risk}</span></td>
46
+ </tr>`;
47
+ }).join('');
48
+ const patternRows = patterns.detected.map((p) => `<tr>
49
+ <td><strong>${esc(p.pattern)}</strong></td>
50
+ <td>${esc(p.category)}</td>
51
+ <td><span class="badge ${p.confidence}">${p.confidence}</span></td>
52
+ <td>${p.evidence.filter(Boolean).map((e) => esc(e)).join('<br>')}</td>
53
+ </tr>`).join('');
54
+ const antiRows = patterns.antiPatterns.map((a) => `<tr>
55
+ <td style="color:#f85149"><strong>${esc(a.name)}</strong></td>
56
+ <td>${esc(a.severity)}</td>
57
+ <td>${esc(a.description)}</td>
58
+ <td>${a.evidence.slice(0, 2).map((e) => esc(e)).join('<br>')}</td>
59
+ </tr>`).join('');
60
+ const cogRows = cognitive.slice(0, 15).map((c) => `<tr>
61
+ <td class="mono">${esc(c.file)}</td>
62
+ <td style="color:${c.score >= 40 ? '#f85149' : c.score >= 20 ? '#e3b341' : '#3fb950'}">${c.score}</td>
63
+ <td>${c.maxNesting}</td>
64
+ <td>${c.longFunctions}</td>
65
+ <td>${c.loc}</td>
66
+ </tr>`).join('');
67
+ const dimBars = health.dimensions.map((d) => {
68
+ const pct = d.score;
69
+ const color = pct >= 80 ? '#3fb950' : pct >= 60 ? '#e3b341' : '#f85149';
70
+ return `<div class="dim-row">
71
+ <div class="dim-name">${esc(d.name)}</div>
72
+ <div class="dim-bar-wrap"><div class="dim-bar" style="width:${pct}%;background:${color}"></div></div>
73
+ <div class="dim-score" style="color:${color}">${pct}</div>
74
+ <div class="dim-detail">${esc(d.detail)}</div>
75
+ </div>`;
76
+ }).join('');
77
+ return `<!DOCTYPE html>
78
+ <html lang="en">
79
+ <head>
80
+ <meta charset="UTF-8">
81
+ <title>${esc(projectName)} — Project Report</title>
82
+ <style>
83
+ *{box-sizing:border-box;margin:0;padding:0}
84
+ body{background:#0d1117;color:#e6edf3;font-family:-apple-system,BlinkMacSystemFont,sans-serif;font-size:14px;line-height:1.6}
85
+ a{color:#79c0ff;text-decoration:none}.mono{font-family:monospace;font-size:12px}
86
+ nav{background:#161b22;border-bottom:1px solid #30363d;padding:12px 24px;display:flex;gap:20px;position:sticky;top:0;z-index:100}
87
+ nav a{color:#8b949e;font-size:13px}nav a:hover{color:#e6edf3}
88
+ .container{max-width:1200px;margin:0 auto;padding:24px}
89
+ h1{font-size:24px;margin-bottom:4px}h2{font-size:18px;margin:32px 0 16px;color:#79c0ff;border-bottom:1px solid #21262d;padding-bottom:8px}
90
+ h3{font-size:14px;color:#8b949e;margin-bottom:12px}
91
+ .header{background:#161b22;border:1px solid #30363d;border-radius:12px;padding:24px;margin-bottom:24px;display:flex;justify-content:space-between;align-items:center}
92
+ .score-big{font-size:64px;font-weight:bold;color:${gradeColor};line-height:1}
93
+ .score-grade{font-size:32px;color:${gradeColor};margin-left:8px}
94
+ .meta{color:#8b949e;font-size:13px;margin-top:4px}
95
+ .dim-row{display:grid;grid-template-columns:140px 1fr 40px 1fr;gap:12px;align-items:center;margin:6px 0}
96
+ .dim-name{font-size:13px;color:#8b949e}.dim-bar-wrap{background:#21262d;border-radius:4px;height:8px}
97
+ .dim-bar{height:8px;border-radius:4px;transition:width 0.3s}.dim-score{font-size:13px;font-weight:bold;text-align:right}
98
+ .dim-detail{font-size:11px;color:#484f58}
99
+ table{width:100%;border-collapse:collapse;font-size:13px}
100
+ th{text-align:left;padding:8px 12px;border-bottom:2px solid #30363d;color:#8b949e;font-weight:600}
101
+ td{padding:8px 12px;border-bottom:1px solid #21262d;vertical-align:top}
102
+ tr:hover td{background:#161b22}.badge{display:inline-block;border-radius:4px;padding:2px 8px;font-size:11px;font-weight:600}
103
+ .badge.high{background:#3fb95020;color:#3fb950}.badge.medium{background:#e3b34120;color:#e3b341}.badge.low{background:#48495820;color:#8b949e}
104
+ .risk-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:24px}
105
+ .risk-card{background:#161b22;border:1px solid #30363d;border-radius:8px;padding:16px}
106
+ .risk-card .num{font-size:32px;font-weight:bold}.risk-card .label{color:#8b949e;font-size:12px}
107
+ .rec-card{background:#161b22;border:1px solid #30363d;border-radius:8px;padding:16px;margin-bottom:12px}
108
+ .rec-card h4{color:#79c0ff;margin-bottom:6px}.rec-card ul{margin-left:16px;color:#8b949e;font-size:13px}
109
+ .section{margin-bottom:40px}
110
+ </style>
111
+ </head>
112
+ <body>
113
+ <nav>
114
+ <a href="#health">Health</a>
115
+ <a href="#audit">Audit</a>
116
+ <a href="#patterns">Patterns</a>
117
+ <a href="#churn">Churn</a>
118
+ <a href="#cognitive">Complexity</a>
119
+ ${data.graphExists ? '<a href="graph.html">Graph →</a>' : ''}
120
+ </nav>
121
+ <div class="container">
122
+ <div class="header">
123
+ <div>
124
+ <h1>${esc(projectName)}</h1>
125
+ <div class="meta">Generated ${esc(data.generatedAt)} · ${audit ? audit.totalFiles + ' files audited' : 'no audit data'}</div>
126
+ </div>
127
+ <div style="text-align:right">
128
+ <span class="score-big">${health.total}</span><span class="score-grade">${health.grade}</span>
129
+ <div class="meta">Health Score / 100</div>
130
+ </div>
131
+ </div>
132
+
133
+ <div class="section" id="health">
134
+ <h2>Health Dimensions</h2>
135
+ ${dimBars}
136
+ ${health.topRisks.length > 0 ? `<div style="margin-top:16px">${health.topRisks.map((r) => `<div style="color:#f85149;font-size:13px;margin:4px 0">✗ ${esc(r)}</div>`).join('')}</div>` : ''}
137
+ </div>
138
+
139
+ ${audit ? `<div class="section" id="audit">
140
+ <h2>Audit Findings</h2>
141
+ <div class="risk-grid">
142
+ <div class="risk-card"><div class="num" style="color:#f85149">${audit.criticalCount}</div><div class="label">Critical</div></div>
143
+ <div class="risk-card"><div class="num" style="color:#e3b341">${audit.highCount}</div><div class="label">High</div></div>
144
+ <div class="risk-card"><div class="num">${audit.findings.length}</div><div class="label">Total Findings</div></div>
145
+ </div>
146
+ <p style="color:#8b949e;margin-bottom:16px;font-size:13px">${esc(audit.summary)}</p>
147
+ <table><tr><th>Severity</th><th>Location</th><th>Category</th><th>Finding</th></tr>${findingRows}</table>
148
+ ${audit.findings.length > 50 ? `<p style="color:#8b949e;font-size:12px;margin-top:8px">Showing 50 of ${audit.findings.length} findings</p>` : ''}
149
+ </div>` : ''}
150
+
151
+ <div class="section" id="patterns">
152
+ <h2>Architecture Patterns</h2>
153
+ ${patterns.detected.length > 0 ? `<h3>Detected</h3><table><tr><th>Pattern</th><th>Category</th><th>Confidence</th><th>Evidence</th></tr>${patternRows}</table>` : ''}
154
+ ${patterns.antiPatterns.length > 0 ? `<h3 style="margin-top:20px">Anti-Patterns</h3><table><tr><th>Name</th><th>Severity</th><th>Description</th><th>Evidence</th></tr>${antiRows}</table>` : ''}
155
+ ${patterns.recommendations.length > 0 ? `<h3 style="margin-top:20px">Recommendations</h3>${patterns.recommendations.map((r) => `<div class="rec-card"><h4>${esc(r.pattern)}</h4><p style="color:#8b949e;font-size:13px;margin-bottom:8px">${esc(r.reason)}</p><ul>${r.fixes.map((f) => `<li>${esc(f)}</li>`).join('')}</ul></div>`).join('')}` : ''}
156
+ </div>
157
+
158
+ ${churn.churn.length > 0 ? `<div class="section" id="churn">
159
+ <h2>Git Churn (last ${churn.periodDays} days)</h2>
160
+ <p style="color:#8b949e;font-size:13px;margin-bottom:16px">${churn.totalCommits} total commits</p>
161
+ <table><tr><th>File</th><th>Commits</th><th>Authors</th><th>Risk</th></tr>${churnRows}</table>
162
+ </div>` : ''}
163
+
164
+ ${cognitive.length > 0 ? `<div class="section" id="cognitive">
165
+ <h2>Cognitive Load</h2>
166
+ <table><tr><th>File</th><th>Score</th><th>Max Nesting</th><th>Long Functions</th><th>LOC</th></tr>${cogRows}</table>
167
+ </div>` : ''}
168
+
169
+ </div>
170
+ </body>
171
+ </html>`;
172
+ }
173
+ function renderMarkdown(data) {
174
+ const { projectName, health, audit, churn, patterns, cognitive, hotspots, apiEndpoints, envAudit, secrets, sbom } = data;
175
+ const lines = [];
176
+ lines.push(`# ${projectName} — AI Analysis Context`);
177
+ lines.push(`> Generated: ${data.generatedAt} · Use this document to ask an AI for refactoring, architecture, and improvement recommendations.`);
178
+ lines.push('');
179
+ // Health
180
+ lines.push(`## Health Score: ${health.total}/100 (${health.grade})`);
181
+ lines.push('');
182
+ lines.push('| Dimension | Score | Detail |');
183
+ lines.push('|---|---|---|');
184
+ health.dimensions.forEach((d) => lines.push(`| ${d.name} | ${d.score}/100 | ${d.detail} |`));
185
+ lines.push('');
186
+ if (health.topRisks.length > 0) {
187
+ lines.push('**Top risks:**');
188
+ health.topRisks.forEach((r) => lines.push(`- ${r}`));
189
+ lines.push('');
190
+ }
191
+ // Project overview
192
+ lines.push('## Project Overview');
193
+ lines.push(`- **Files:** ${data.totalFiles} | **Symbols:** ${data.totalSymbols}`);
194
+ lines.push(`- **Dependency cycles:** ${data.cycles}`);
195
+ lines.push(`- **Git commits (90d):** ${churn.totalCommits}`);
196
+ lines.push('');
197
+ // Architecture patterns
198
+ lines.push('## Architecture Patterns');
199
+ lines.push('');
200
+ lines.push('### Detected');
201
+ patterns.detected.forEach((p) => {
202
+ lines.push(`- **${p.pattern}** [${p.category}] (${p.confidence} confidence): ${p.evidence.filter(Boolean).join(', ')}`);
203
+ });
204
+ lines.push('');
205
+ if (patterns.antiPatterns.length > 0) {
206
+ lines.push('### Anti-Patterns');
207
+ patterns.antiPatterns.forEach((a) => {
208
+ lines.push(`- **${a.name}** [${a.severity}]: ${a.description}`);
209
+ a.evidence.slice(0, 2).forEach((e) => lines.push(` - \`${e}\``));
210
+ });
211
+ lines.push('');
212
+ }
213
+ if (patterns.recommendations.length > 0) {
214
+ lines.push('### Recommendations');
215
+ patterns.recommendations.forEach((r) => {
216
+ lines.push(`- **${r.pattern}** [${r.priority} priority]: ${r.reason}`);
217
+ r.fixes.forEach((f) => lines.push(` - ${f}`));
218
+ });
219
+ lines.push('');
220
+ }
221
+ // Hotspots
222
+ if (hotspots.length > 0) {
223
+ lines.push('## Hotspot Files (Highest Coupling)');
224
+ lines.push('');
225
+ lines.push('| File | FanIn | FanOut | Risk |');
226
+ lines.push('|---|---|---|---|');
227
+ hotspots.slice(0, 10).forEach((h) => {
228
+ const risk = h.fanIn >= 30 ? 'CRITICAL' : h.fanIn >= 15 ? 'HIGH' : 'MEDIUM';
229
+ lines.push(`| \`${h.file}\` | ${h.fanIn} | ${h.fanOut} | ${risk} |`);
230
+ });
231
+ lines.push('');
232
+ }
233
+ // Audit findings
234
+ if (audit) {
235
+ lines.push('## Audit Findings');
236
+ lines.push(`**${audit.criticalCount} critical · ${audit.highCount} high · ${audit.findings.length} total**`);
237
+ lines.push('');
238
+ lines.push(audit.summary);
239
+ lines.push('');
240
+ const critical = audit.findings.filter((f) => f.severity === 'critical');
241
+ const high = audit.findings.filter((f) => f.severity === 'high');
242
+ if (critical.length > 0) {
243
+ lines.push('### Critical Findings');
244
+ critical.forEach((f) => {
245
+ const persona = f.persona ? ` (persona: ${f.persona})` : '';
246
+ lines.push(`- \`${f.file}${f.line ? ':' + f.line : ''}\` [${f.category}]${persona} ${f.finding}`);
247
+ lines.push(` → ${f.recommendation}`);
248
+ });
249
+ lines.push('');
250
+ }
251
+ if (high.length > 0) {
252
+ lines.push('### High Findings');
253
+ high.slice(0, 15).forEach((f) => {
254
+ const persona = f.persona ? ` (persona: ${f.persona})` : '';
255
+ lines.push(`- \`${f.file}${f.line ? ':' + f.line : ''}\` [${f.category}]${persona} ${f.finding}`);
256
+ lines.push(` → ${f.recommendation}`);
257
+ });
258
+ lines.push('');
259
+ }
260
+ }
261
+ // Churn
262
+ if (churn.churn.length > 0) {
263
+ lines.push('## Git Churn (90 days)');
264
+ lines.push('');
265
+ lines.push('| File | Commits | Authors | Risk |');
266
+ lines.push('|---|---|---|---|');
267
+ churn.churn.slice(0, 15).forEach((c) => lines.push(`| \`${c.file}\` | ${c.commits} | ${c.authors} | ${c.risk} |`));
268
+ lines.push('');
269
+ const intersection = churn.busFactor
270
+ .filter((b) => b.risk === 'critical')
271
+ .filter((b) => churn.churn.find((c) => c.file === b.file && (c.risk === 'critical' || c.risk === 'high')));
272
+ if (intersection.length > 0) {
273
+ lines.push('### High Risk: High Churn + Single Author');
274
+ intersection.forEach((b) => lines.push(`- \`${b.file}\` — ${b.primaryPercent}% commits by one author`));
275
+ lines.push('');
276
+ }
277
+ }
278
+ // API Map (no-auth endpoints)
279
+ const noAuthEndpoints = apiEndpoints.filter((e) => !e.hasAuth);
280
+ if (noAuthEndpoints.length > 0) {
281
+ lines.push('## Unprotected API Endpoints');
282
+ lines.push('');
283
+ noAuthEndpoints.forEach((e) => {
284
+ lines.push(`- \`${e.method} ${e.path}\` — \`${e.file}:${e.line}\``);
285
+ });
286
+ lines.push('');
287
+ }
288
+ // Undocumented env vars
289
+ if (envAudit.undocumented.length > 0) {
290
+ lines.push('## Undocumented Environment Variables');
291
+ lines.push(`${envAudit.undocumented.length} variables used in code but not in .env.example:`);
292
+ lines.push('');
293
+ envAudit.undocumented.slice(0, 20).forEach((v) => lines.push(`- \`${v}\``));
294
+ lines.push('');
295
+ }
296
+ // Secrets
297
+ if (secrets.length > 0) {
298
+ lines.push('## Hardcoded Secrets Detected');
299
+ secrets.forEach((s) => lines.push(`- \`${s.file}:${s.line}\` [${s.pattern}]`));
300
+ lines.push('');
301
+ }
302
+ // Cognitive load
303
+ if (cognitive.length > 0) {
304
+ lines.push('## High Cognitive Load Files');
305
+ lines.push('');
306
+ lines.push('| File | Score | Max Nesting | Long Functions | LOC |');
307
+ lines.push('|---|---|---|---|---|');
308
+ cognitive.slice(0, 10).forEach((c) => lines.push(`| \`${c.file}\` | ${c.score} | ${c.maxNesting} | ${c.longFunctions} | ${c.loc} |`));
309
+ lines.push('');
310
+ }
311
+ // SBOM unpinned
312
+ if (sbom.unpinned.length > 0) {
313
+ lines.push('## Unpinned Dependencies (Supply Chain Risk)');
314
+ sbom.unpinned.slice(0, 20).forEach((p) => lines.push(`- \`${p.lang}\` \`${p.name}\` ${p.version}`));
315
+ lines.push('');
316
+ }
317
+ // AI prompt footer
318
+ lines.push('---');
319
+ lines.push('## Suggested AI Prompts');
320
+ lines.push('');
321
+ lines.push('Copy this document and use with any of these prompts:');
322
+ lines.push('');
323
+ lines.push('- *"Based on this analysis, create a prioritized refactoring roadmap with effort estimates"*');
324
+ lines.push('- *"Propose a migration plan from the current architecture to Clean Architecture + Repository Pattern"*');
325
+ lines.push('- *"Which critical findings should be fixed first and why? Write the fixes."*');
326
+ lines.push('- *"Identify which hotspot files should be split and how"*');
327
+ lines.push('- *"What tests should be written first given the 7% test coverage and these hotspots?"*');
328
+ return lines.join('\n');
329
+ }
330
+ export function registerReport(program) {
331
+ program
332
+ .command('report')
333
+ .description('Generate full HTML + Markdown project report')
334
+ .option('--no-open', 'generate without opening browser')
335
+ .option('--md', 'generate only Markdown (AI-ready context file)')
336
+ .option('--days <n>', 'git lookback for churn analysis', '90')
337
+ .action(async (options) => {
338
+ const cwd = process.cwd();
339
+ const days = parseInt(options.days, 10) || 90;
340
+ const projectName = cwd.split('/').pop() ?? 'project';
341
+ console.log(`Building report for ${projectName}…`);
342
+ const graph = new GraphAgent(cwd);
343
+ const index = await graph.ensureIndex();
344
+ let hotspots = [];
345
+ try {
346
+ const { detectLang } = await import('../../infra/lang-detect.js');
347
+ const { buildDepGraph } = await import('../../infra/dep-graph.js');
348
+ const { buildPythonDepGraph } = await import('../../infra/dep-graph-python.js');
349
+ const lang = detectLang(cwd);
350
+ const dep = lang.lang === 'python' ? buildPythonDepGraph(cwd) : buildDepGraph(cwd);
351
+ hotspots = dep.hotspots;
352
+ }
353
+ catch { /* best-effort */ }
354
+ const audit = loadLatestAudit(cwd);
355
+ const churn = buildChurnReport(cwd, hotspots.map((h) => h.file), days);
356
+ const patterns = detectPatterns(cwd, hotspots);
357
+ const cognitive = measureCognitiveLoad(cwd, 30);
358
+ const apiEndpoints = buildApiMap(cwd);
359
+ const envAudit = auditEnvVars(cwd);
360
+ const secrets = scanCurrentSecrets(cwd);
361
+ const sbom = buildSbom(cwd);
362
+ let cycles = 0;
363
+ try {
364
+ const { detectLang } = await import('../../infra/lang-detect.js');
365
+ const { buildDepGraph } = await import('../../infra/dep-graph.js');
366
+ const { buildPythonDepGraph } = await import('../../infra/dep-graph-python.js');
367
+ const lang = detectLang(cwd);
368
+ const dep = lang.lang === 'python' ? buildPythonDepGraph(cwd) : buildDepGraph(cwd);
369
+ cycles = dep.cycles.length;
370
+ }
371
+ catch { /* best-effort */ }
372
+ const health = computeHealthScore({
373
+ totalFiles: index.stats.files, totalSymbols: index.stats.symbols,
374
+ cycles, hotspots: hotspots.length,
375
+ testFileRatio: index.files.filter((f) => f.isTest).length / Math.max(index.files.length, 1),
376
+ churn: churn.churn, busFactor: churn.busFactor, cognitiveLoad: cognitive,
377
+ patterns, auditCriticals: audit?.criticalCount, auditHighs: audit?.highCount,
378
+ });
379
+ const outDir = join(cwd, '.ai-runtime');
380
+ mkdirSync(outDir, { recursive: true });
381
+ const generatedAt = new Date().toLocaleString();
382
+ const mdData = { projectName, health, audit, churn, patterns, cognitive, generatedAt,
383
+ totalFiles: index.stats.files, totalSymbols: index.stats.symbols, cycles,
384
+ hotspots, apiEndpoints, envAudit, secrets, sbom };
385
+ // Always generate markdown
386
+ const md = renderMarkdown(mdData);
387
+ const mdFile = join(outDir, 'context.md');
388
+ writeFileSync(mdFile, md, 'utf8');
389
+ console.log(`Markdown: ${mdFile}`);
390
+ if (!options.md) {
391
+ const graphExists = existsSync(join(outDir, 'graph.html'));
392
+ const html = renderReport({ projectName, health, audit, churn, patterns, cognitive, graphExists, generatedAt });
393
+ const outFile = join(outDir, 'report.html');
394
+ writeFileSync(outFile, html, 'utf8');
395
+ console.log(`HTML: ${outFile}`);
396
+ if (options.open !== false) {
397
+ const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';
398
+ const args = process.platform === 'win32' ? ['/c', 'start', '', outFile] : [outFile];
399
+ spawnSync(opener, args, { stdio: 'ignore', timeout: 5000 });
400
+ }
401
+ }
402
+ console.log(` Health: ${health.badge}`);
403
+ if (audit)
404
+ console.log(` Findings: ${audit.criticalCount} critical, ${audit.highCount} high`);
405
+ console.log(` Size: ~${Math.round(md.length / 1000)}k chars (~${Math.round(md.length / 4)} tokens)`);
406
+ });
407
+ }
408
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/cli/commands/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerReview(program: Command): void;
3
+ //# sourceMappingURL=review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmBrD"}
@@ -0,0 +1,21 @@
1
+ import { Orchestrator } from '../../core/orchestrator.js';
2
+ import { Renderer } from '../ui/renderer.js';
3
+ import { addRuntimeOptions, toRuntimePolicyInput } from '../runtime-options.js';
4
+ export function registerReview(program) {
5
+ addRuntimeOptions(program
6
+ .command('review <target>')
7
+ .description('Review a diff or file path for bugs, regressions, and edge cases'))
8
+ .action(async (target, options) => {
9
+ const renderer = new Renderer();
10
+ const orch = new Orchestrator(process.cwd(), toRuntimePolicyInput(options));
11
+ orch.on('state:change', ({ state }) => renderer.showState(state));
12
+ orch.on('agent:start', ({ agentName }) => renderer.agentStart(agentName));
13
+ orch.on('agent:output', ({ agentName, text }) => renderer.agentChunk(agentName, text));
14
+ orch.on('agent:done', ({ agentName, durationMs }) => renderer.agentDone(agentName, durationMs));
15
+ orch.on('error', ({ message }) => renderer.showError(message));
16
+ const result = await orch.runReviewPipeline(target);
17
+ renderer.showResult(result);
18
+ process.exit(result.state === 'REVIEWED' ? 0 : 1);
19
+ });
20
+ }
21
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/cli/commands/review.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAA0B,MAAM,uBAAuB,CAAC;AAExG,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,iBAAiB,CAAC,OAAO;SACtB,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,kEAAkE,CAAC,CAAC;SAChF,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,OAA0B,EAAE,EAAE;QAC3D,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;QAE5E,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;QAC1E,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QACvF,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QAChG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACpD,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE5B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerScan(program: Command): void;
3
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmJnD"}
@@ -0,0 +1,129 @@
1
+ import chalk from 'chalk';
2
+ import { buildApiMap, auditEnvVars, measureCognitiveLoad, scanCurrentSecrets } from '../../infra/code-metrics.js';
3
+ import { buildSbom } from '../../infra/sbom.js';
4
+ export function registerScan(program) {
5
+ const scan = program
6
+ .command('scan')
7
+ .description('Zero-token code scans: api-map, env-audit, cognitive-load, secrets, sbom');
8
+ // ── api-map ────────────────────────────────────────────────────────────────
9
+ scan
10
+ .command('api-map')
11
+ .description('Extract all API endpoints with auth and rate-limit status')
12
+ .action(() => {
13
+ const cwd = process.cwd();
14
+ console.log(chalk.bold.cyan('\nAPI Map\n'));
15
+ const endpoints = buildApiMap(cwd);
16
+ if (endpoints.length === 0) {
17
+ console.log(chalk.yellow('No API endpoints detected. Supports FastAPI, Flask, Django, Express.'));
18
+ return;
19
+ }
20
+ const noAuth = endpoints.filter((e) => !e.hasAuth);
21
+ const noRateLimit = endpoints.filter((e) => !e.hasRateLimit);
22
+ endpoints.forEach((ep) => {
23
+ const authIcon = ep.hasAuth ? chalk.green('🔒') : chalk.red('🔓');
24
+ const rlIcon = ep.hasRateLimit ? chalk.green('⏱') : chalk.gray(' ');
25
+ console.log(` ${authIcon}${rlIcon} ` +
26
+ chalk.bold(ep.method.padEnd(7)) +
27
+ chalk.cyan(ep.path.padEnd(40)) +
28
+ chalk.dim(`${ep.file}:${ep.line}`));
29
+ });
30
+ console.log(chalk.bold(`\nSummary: ${endpoints.length} endpoints`));
31
+ if (noAuth.length > 0)
32
+ console.log(chalk.red(` 🔓 ${noAuth.length} without auth`));
33
+ if (noRateLimit.length > 0)
34
+ console.log(chalk.yellow(` ⏱ ${noRateLimit.length} without rate limiting`));
35
+ });
36
+ // ── env-audit ──────────────────────────────────────────────────────────────
37
+ scan
38
+ .command('env-audit')
39
+ .description('Find all environment variables used and check if they are documented')
40
+ .action(() => {
41
+ const cwd = process.cwd();
42
+ console.log(chalk.bold.cyan('\nEnvironment Variables Audit\n'));
43
+ const result = auditEnvVars(cwd);
44
+ if (result.vars.length === 0) {
45
+ console.log(chalk.yellow('No environment variables detected.'));
46
+ return;
47
+ }
48
+ if (!result.envExampleExists) {
49
+ console.log(chalk.red('⚠ No .env.example / .env.sample found — new developers cannot know required variables\n'));
50
+ }
51
+ result.vars.forEach((v) => {
52
+ const icon = v.documented ? chalk.green('✓') : chalk.red('✗');
53
+ console.log(` ${icon} ${chalk.bold(v.name.padEnd(35))} ${chalk.dim(`${v.file}:${v.line}`)}`);
54
+ });
55
+ console.log(chalk.bold(`\nSummary: ${result.vars.length} env vars`));
56
+ if (result.undocumented.length > 0) {
57
+ console.log(chalk.red(` ${result.undocumented.length} undocumented: ${result.undocumented.slice(0, 5).join(', ')}${result.undocumented.length > 5 ? '...' : ''}`));
58
+ }
59
+ });
60
+ // ── cognitive-load ─────────────────────────────────────────────────────────
61
+ scan
62
+ .command('cognitive-load')
63
+ .description('Measure cognitive difficulty per file: nesting, magic numbers, long functions')
64
+ .option('--top <n>', 'number of files to show', '20')
65
+ .action((options) => {
66
+ const cwd = process.cwd();
67
+ const top = parseInt(options.top, 10) || 20;
68
+ console.log(chalk.bold.cyan('\nCognitive Load Analysis\n'));
69
+ const entries = measureCognitiveLoad(cwd, top);
70
+ if (entries.length === 0) {
71
+ console.log(chalk.yellow('No source files found.'));
72
+ return;
73
+ }
74
+ entries.forEach((e) => {
75
+ const scoreColor = e.score >= 40 ? chalk.red : e.score >= 20 ? chalk.yellow : chalk.green;
76
+ console.log(scoreColor(` ${e.score.toString().padStart(3)}`) +
77
+ chalk.gray(` nest:${e.maxNesting} fn:${e.longFunctions} magic:${e.magicNumbers} loc:${e.loc} `) +
78
+ chalk.white(e.file));
79
+ });
80
+ const avgScore = Math.round(entries.reduce((s, e) => s + e.score, 0) / entries.length);
81
+ console.log(chalk.bold(`\nAvg score: ${avgScore} · Top ${entries.length} files shown`));
82
+ console.log(chalk.dim('Score = nesting×3 + long-functions×5 + magic-numbers/3 + long-lines penalty'));
83
+ });
84
+ // ── secrets ────────────────────────────────────────────────────────────────
85
+ scan
86
+ .command('secrets')
87
+ .description('Scan current files for hardcoded secrets and credentials')
88
+ .action(() => {
89
+ const cwd = process.cwd();
90
+ console.log(chalk.bold.cyan('\nSecrets Scan (current files)\n'));
91
+ const hits = scanCurrentSecrets(cwd);
92
+ if (hits.length === 0) {
93
+ console.log(chalk.green('✓ No hardcoded secrets detected in current files'));
94
+ return;
95
+ }
96
+ console.log(chalk.red(`⚠ ${hits.length} potential secret(s) found:\n`));
97
+ hits.forEach((h) => {
98
+ console.log(chalk.bold(` ${h.file}:${h.line}`) + chalk.red(` [${h.pattern}]`));
99
+ console.log(chalk.dim(` ${h.preview}`));
100
+ });
101
+ console.log(chalk.yellow('\nNote: also check git history for previously committed secrets'));
102
+ });
103
+ // ── sbom ───────────────────────────────────────────────────────────────────
104
+ scan
105
+ .command('sbom')
106
+ .description('Software Bill of Materials: all dependencies with versions and pin status')
107
+ .option('--unpinned-only', 'show only unpinned dependencies')
108
+ .action((options) => {
109
+ const cwd = process.cwd();
110
+ console.log(chalk.bold.cyan('\nSoftware Bill of Materials\n'));
111
+ const report = buildSbom(cwd);
112
+ if (report.packages.length === 0) {
113
+ console.log(chalk.yellow('No package files found (requirements.txt, package.json, go.mod, Cargo.toml)'));
114
+ return;
115
+ }
116
+ const packages = options.unpinnedOnly ? report.unpinned : report.packages;
117
+ packages.slice(0, 60).forEach((p) => {
118
+ const icon = p.pinned ? chalk.green('✓') : chalk.red('!');
119
+ console.log(` ${icon} ${chalk.gray(p.lang.padEnd(8))} ${chalk.white(p.name.padEnd(30))} ${chalk.dim(p.version)}`);
120
+ });
121
+ if (packages.length > 60)
122
+ console.log(chalk.dim(` ... and ${packages.length - 60} more`));
123
+ console.log(chalk.bold(`\nTotal: ${report.totalCount} packages`));
124
+ if (report.unpinned.length > 0) {
125
+ console.log(chalk.yellow(` ${report.unpinned.length} unpinned (supply chain risk)`));
126
+ }
127
+ });
128
+ }
129
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/cli/commands/scan.ts"],"names":[],"mappings":"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"}