@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,3 @@
1
+ export declare function runNaturalLanguage(input: string, cwd: string): Promise<void>;
2
+ export declare function runInteractive(cwd: string): Promise<void>;
3
+ //# sourceMappingURL=interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/cli/interactive.ts"],"names":[],"mappings":"AAQA,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DlF;AA2BD,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgC/D"}
@@ -0,0 +1,115 @@
1
+ import { createInterface } from 'readline';
2
+ import chalk from 'chalk';
3
+ import { classify } from './classifier.js';
4
+ import { Orchestrator } from '../core/orchestrator.js';
5
+ import { Renderer } from './ui/renderer.js';
6
+ import { KnowledgeStore } from '../infra/knowledge.js';
7
+ import { GraphAgent } from '../agents/graph-agent.js';
8
+ export async function runNaturalLanguage(input, cwd) {
9
+ const { intent, target } = classify(input);
10
+ if (intent === 'unknown') {
11
+ // Default to analyze when intent is unclear
12
+ console.log(chalk.gray(`→ analyzing: "${target}"`));
13
+ await runWithRenderer(cwd, 'analyze', target);
14
+ return;
15
+ }
16
+ if (intent === 'memory-build') {
17
+ console.log(chalk.gray('→ ai memory build'));
18
+ const store = new KnowledgeStore(cwd);
19
+ const { default: ora } = await import('ora');
20
+ const spinner = ora('Building embedding index...').start();
21
+ const count = await store.embeddings.buildIndex(['architecture', 'bugs', 'features', 'decisions', 'patterns']);
22
+ spinner.succeed(chalk.green(`Indexed ${count} entries`));
23
+ return;
24
+ }
25
+ if (intent === 'memory-search') {
26
+ console.log(chalk.gray(`→ ai memory search "${target}"`));
27
+ const store = new KnowledgeStore(cwd);
28
+ const results = await store.embeddings.query(target, 5);
29
+ for (const r of results) {
30
+ console.log(`${chalk.cyan((r.score * 100).toFixed(1) + '%')} ${chalk.bold(r.category + '/' + r.filename)}`);
31
+ console.log(chalk.gray(' ' + r.text.split('\n')[0]?.slice(0, 100)));
32
+ }
33
+ return;
34
+ }
35
+ if (intent === 'graph-index') {
36
+ console.log(chalk.gray('→ building repository graph index...'));
37
+ const graph = new GraphAgent(cwd);
38
+ const { default: ora } = await import('ora');
39
+ const spinner = ora('Indexing repository...').start();
40
+ const index = await graph.buildIndex();
41
+ spinner.succeed(chalk.green(`Indexed ${index.stats.files} files, ${index.stats.symbols} symbols, ${index.stats.chunks} chunks`));
42
+ if (index.stats.testLinks > 0)
43
+ console.log(chalk.gray(` ${index.stats.testLinks} test links mapped`));
44
+ return;
45
+ }
46
+ if (intent === 'audit') {
47
+ console.log(chalk.gray(`→ ai audit`));
48
+ const orch = new Orchestrator(cwd);
49
+ const renderer = new Renderer();
50
+ orch.on('agent:start', ({ agentName }) => renderer.agentStart(agentName));
51
+ orch.on('agent:output', ({ agentName, text }) => renderer.agentChunk(agentName, text));
52
+ orch.on('agent:done', ({ agentName, durationMs }) => renderer.agentDone(agentName, durationMs));
53
+ const start = Date.now();
54
+ const report = await orch.runAuditPipeline(target, 5);
55
+ console.log(chalk.bold.cyan(`\nAudit complete in ${((Date.now() - start) / 1000).toFixed(1)}s — ${report.findings.length} findings across ${report.totalFiles} files`));
56
+ console.log(report.summary);
57
+ report.topPriorities.forEach((p, i) => console.log(chalk.cyan(` ${i + 1}.`) + ' ' + p));
58
+ return;
59
+ }
60
+ const cmdLabel = intent === 'fix' ? 'fix' : intent === 'review' ? 'review' : 'analyze';
61
+ console.log(chalk.gray(`→ ai ${cmdLabel} "${target}"`));
62
+ await runWithRenderer(cwd, intent, target);
63
+ }
64
+ async function runWithRenderer(cwd, intent, target) {
65
+ const renderer = new Renderer();
66
+ const orch = new Orchestrator(cwd);
67
+ orch.on('state:change', ({ state }) => renderer.showState(state));
68
+ orch.on('agent:start', ({ agentName }) => renderer.agentStart(agentName));
69
+ orch.on('agent:output', ({ agentName, text }) => renderer.agentChunk(agentName, text));
70
+ orch.on('agent:done', ({ agentName, durationMs }) => renderer.agentDone(agentName, durationMs));
71
+ orch.on('error', ({ message }) => renderer.showError(message));
72
+ try {
73
+ let result;
74
+ if (intent === 'fix')
75
+ result = await orch.runFixPipeline(target);
76
+ else if (intent === 'review')
77
+ result = await orch.runReviewPipeline(target);
78
+ else
79
+ result = await orch.runAnalyzePipeline(target);
80
+ renderer.showResult(result);
81
+ }
82
+ finally {
83
+ orch.removeAllListeners();
84
+ }
85
+ }
86
+ export async function runInteractive(cwd) {
87
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
88
+ console.log(chalk.bold('\n🤖 AI Engineering Runtime'));
89
+ console.log(chalk.gray('Type your request in natural language. Ctrl+C to exit.\n'));
90
+ console.log(chalk.gray('Examples:'));
91
+ console.log(chalk.gray(' corrija o bug de autenticação'));
92
+ console.log(chalk.gray(' analise os erros no módulo de pagamento'));
93
+ console.log(chalk.gray(' revise o arquivo src/auth/middleware.ts'));
94
+ console.log(chalk.gray(' indexar memória\n'));
95
+ const prompt = () => new Promise((resolve) => {
96
+ rl.question(chalk.bold.cyan('ai> '), async (input) => {
97
+ const trimmed = input.trim();
98
+ if (!trimmed || trimmed === 'exit' || trimmed === 'quit') {
99
+ rl.close();
100
+ resolve();
101
+ return;
102
+ }
103
+ try {
104
+ await runNaturalLanguage(trimmed, cwd);
105
+ }
106
+ catch (err) {
107
+ console.error(chalk.red('Error: ' + String(err)));
108
+ }
109
+ console.log();
110
+ resolve(prompt());
111
+ });
112
+ });
113
+ await prompt();
114
+ }
115
+ //# sourceMappingURL=interactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/cli/interactive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runMenu(cwd: string): Promise<void>;
2
+ //# sourceMappingURL=menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/cli/menu.ts"],"names":[],"mappings":"AAmKA,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDxD"}
@@ -0,0 +1,208 @@
1
+ import { spawnSync } from 'child_process';
2
+ import chalk from 'chalk';
3
+ import { selectOne, selectMany, printHeader } from './tui.js';
4
+ const ALL_DOMAINS = [
5
+ { label: 'security', hint: 'pentester finding attack vectors', value: 'security' },
6
+ { label: 'bugs', hint: 'QA hunting logic failures & null dereference', value: 'bugs' },
7
+ { label: 'redundancy', hint: 'architect eliminating dead/duplicate code', value: 'redundancy' },
8
+ { label: 'error-handling', hint: 'SRE finding silent failure points', value: 'error-handling' },
9
+ { label: 'architecture', hint: 'tech lead evaluating coupling & debt', value: 'architecture' },
10
+ { label: 'testing', hint: 'QA engineer mapping test coverage gaps', value: 'testing' },
11
+ { label: 'performance', hint: 'platform engineer hunting bottlenecks', value: 'performance' },
12
+ { label: 'infrastructure', hint: 'DevOps reviewing K8s & containers', value: 'infrastructure' },
13
+ { label: 'observability', hint: 'SRE checking logging, tracing & metrics', value: 'observability' },
14
+ { label: 'resilience', hint: 'reliability eng: timeouts, retries, circuit breakers', value: 'resilience' },
15
+ { label: 'data', hint: 'DBA finding N+1 queries & missing indexes', value: 'data' },
16
+ { label: 'dependencies', hint: 'security eng on supply chain & CVEs', value: 'dependencies' },
17
+ { label: 'compliance', hint: 'DPO verifying LGPD/GDPR compliance', value: 'compliance' },
18
+ { label: 'multitenancy', hint: 'architect verifying tenant isolation', value: 'multitenancy' },
19
+ { label: 'prompt-audit', hint: 'AI eng auditing LLM prompts & injection', value: 'prompt-audit' },
20
+ ];
21
+ const PRESETS = [
22
+ { label: '🔐 Security', hint: 'security, compliance, dependencies, multitenancy', value: 'security' },
23
+ { label: '🤖 AI/LLM', hint: 'prompt-audit, security, resilience, observability, data', value: 'ai' },
24
+ { label: '⚙️ Backend', hint: 'security, data, error-handling, resilience, performance', value: 'backend' },
25
+ { label: '🛠️ DevOps', hint: 'infrastructure, observability, resilience, dependencies', value: 'devops' },
26
+ { label: '✨ Quality', hint: 'bugs, architecture, testing, redundancy, error-handling', value: 'quality' },
27
+ { label: '🏢 SaaS', hint: 'multitenancy, compliance, security, resilience, observability', value: 'saas' },
28
+ { label: '🏦 FinTech', hint: 'compliance, security, data, multitenancy, error-handling', value: 'fintech' },
29
+ { label: '🌍 Full', hint: 'all 15 personas (slow — ~30min)', value: 'full' },
30
+ { label: '📝 Custom…', hint: 'select individual personas with Space', value: 'custom' },
31
+ { label: '← Back', value: 'back' },
32
+ ];
33
+ const BUDGETS = [
34
+ { label: 'low', hint: 'Haiku — fast, $0.10-0.50', value: 'low' },
35
+ { label: 'normal', hint: 'Sonnet — balanced, $0.50-2.00', value: 'normal' },
36
+ { label: 'deep', hint: 'Opus — thorough, $2.00-5.00', value: 'deep' },
37
+ ];
38
+ const SCAN_ITEMS = [
39
+ { label: 'api-map', hint: 'endpoints with auth/rate-limit status', value: 'api-map' },
40
+ { label: 'env-audit', hint: 'env vars documented vs undocumented', value: 'env-audit' },
41
+ { label: 'cognitive-load', hint: 'nesting, magic numbers, long functions', value: 'cognitive-load' },
42
+ { label: 'secrets', hint: 'hardcoded credentials in current files', value: 'secrets' },
43
+ { label: 'sbom', hint: 'software bill of materials + unpinned deps', value: 'sbom' },
44
+ { label: '← Back', value: 'back' },
45
+ ];
46
+ function run(args) {
47
+ const result = spawnSync(process.execPath, [process.argv[1], ...args], {
48
+ stdio: 'inherit',
49
+ env: process.env,
50
+ });
51
+ if (result.error)
52
+ console.error(chalk.red(result.error.message));
53
+ }
54
+ async function runAuditMenu(cwd) {
55
+ const preset = await selectOne('Select persona preset', PRESETS, 'Each preset is a team of specialized AI personas');
56
+ if (!preset || preset === 'back')
57
+ return;
58
+ let domainsFlag = '';
59
+ if (preset === 'custom') {
60
+ const chosen = await selectMany('Select personas', ALL_DOMAINS, 'Space to toggle, Enter to confirm');
61
+ if (!chosen || chosen.length === 0)
62
+ return;
63
+ domainsFlag = `--domains ${chosen.join(',')}`;
64
+ }
65
+ else {
66
+ domainsFlag = `--preset ${preset}`;
67
+ }
68
+ const budget = await selectOne('Select budget', BUDGETS);
69
+ if (!budget)
70
+ return;
71
+ const confirm = await selectOne(`Run audit with ${domainsFlag} --budget ${budget}?`, [
72
+ { label: '✓ Run now', value: 'run' },
73
+ { label: '✗ Cancel', value: 'cancel' },
74
+ ]);
75
+ if (confirm !== 'run')
76
+ return;
77
+ console.log(chalk.bold.cyan('\nStarting audit…\n'));
78
+ run(['--cwd', cwd, 'audit', '.', domainsFlag.split(' ')[0], domainsFlag.split(' ')[1] ?? '', '--budget', budget]);
79
+ }
80
+ async function runScanMenu(cwd) {
81
+ const item = await selectOne('Select scan type', SCAN_ITEMS);
82
+ if (!item || item === 'back')
83
+ return;
84
+ console.log(chalk.bold.cyan(`\nRunning scan ${item}…\n`));
85
+ run(['--cwd', cwd, 'scan', item]);
86
+ }
87
+ async function runExplainMenu(cwd) {
88
+ const mode = await selectOne('Select mode', [
89
+ { label: 'explain <file>', hint: 'what a file does and why it matters', value: 'explain' },
90
+ { label: 'impact <file>', hint: 'blast radius if this file changes', value: 'impact' },
91
+ { label: 'onboard', hint: 'developer onboarding guide', value: 'onboard' },
92
+ { label: '← Back', value: 'back' },
93
+ ]);
94
+ if (!mode || mode === 'back')
95
+ return;
96
+ if (mode === 'onboard') {
97
+ console.log(chalk.bold.cyan('\nGenerating onboarding guide…\n'));
98
+ run(['--cwd', cwd, 'onboard']);
99
+ return;
100
+ }
101
+ // Ask for file path
102
+ const rl = (await import('readline')).createInterface({ input: process.stdin, output: process.stdout });
103
+ const file = await new Promise((resolve) => {
104
+ rl.question(chalk.cyan(` File path: `), (ans) => { rl.close(); resolve(ans.trim()); });
105
+ });
106
+ if (!file)
107
+ return;
108
+ console.log(chalk.bold.cyan(`\nRunning ${mode} on ${file}…\n`));
109
+ run(['--cwd', cwd, mode, file]);
110
+ }
111
+ const MAIN_ITEMS = [
112
+ { label: '🔍 Audit', hint: 'multi-persona code analysis', value: 'audit' },
113
+ { label: '📊 Report', hint: 'health + findings + context.md', value: 'report' },
114
+ { label: '🌐 Graph', hint: 'interactive dependency map', value: 'graph' },
115
+ { label: '📈 Churn', hint: 'git churn + bus factor', value: 'churn' },
116
+ { label: '🔬 Scan', hint: 'quick zero-token scans', value: 'scan' },
117
+ { label: '🏗️ Patterns', hint: 'architecture pattern detection', value: 'patterns' },
118
+ { label: '💊 Health', hint: 'composite score 0-100', value: 'health' },
119
+ { label: '💬 Explain / Onboard', hint: 'AI explanation + onboarding', value: 'explain' },
120
+ { label: '─', value: 'sep', separator: true },
121
+ { label: '❯ Natural language', hint: 'type a request in Portuguese or English', value: 'nl' },
122
+ { label: ' Quit', value: 'quit' },
123
+ ];
124
+ function runMenuFallback(cwd) {
125
+ const projectName = cwd.split('/').pop() ?? cwd;
126
+ console.log('');
127
+ console.log(chalk.bold.cyan(` 🤖 AI Runtime — ${projectName}`));
128
+ console.log(chalk.dim(' ─────────────────────────────────────'));
129
+ console.log(chalk.dim(' Run from an interactive terminal to get the menu.'));
130
+ console.log('');
131
+ console.log(chalk.bold(' Available commands:'));
132
+ console.log('');
133
+ console.log(` ${chalk.cyan('aion menu')} interactive menu`);
134
+ console.log(` ${chalk.cyan('aion audit . --preset ai')} AI/LLM audit`);
135
+ console.log(` ${chalk.cyan('aion audit --list-personas')} show all personas`);
136
+ console.log(` ${chalk.cyan('aion health')} composite health score`);
137
+ console.log(` ${chalk.cyan('aion report --md')} full markdown report`);
138
+ console.log(` ${chalk.cyan('aion graph')} dependency graph`);
139
+ console.log(` ${chalk.cyan('aion churn')} git churn analysis`);
140
+ console.log(` ${chalk.cyan('aion scan api-map')} API endpoint map`);
141
+ console.log(` ${chalk.cyan('aion patterns')} architecture patterns`);
142
+ console.log(` ${chalk.cyan('aion onboard')} developer guide (AI)`);
143
+ console.log('');
144
+ }
145
+ export async function runMenu(cwd) {
146
+ if (!process.stdin.isTTY) {
147
+ runMenuFallback(cwd);
148
+ return;
149
+ }
150
+ // Show project info
151
+ let info = cwd.split('/').pop() ?? cwd;
152
+ try {
153
+ const { GraphAgent } = await import('../agents/graph-agent.js');
154
+ const graph = new GraphAgent(cwd);
155
+ const index = graph.getIndex();
156
+ if (index)
157
+ info += ` · ${index.stats.files} files`;
158
+ }
159
+ catch { /* best-effort */ }
160
+ while (true) {
161
+ console.log('');
162
+ printHeader(cwd.split('/').pop() ?? cwd, info);
163
+ const action = await selectOne('What do you want to run?', MAIN_ITEMS);
164
+ if (!action || action === 'quit')
165
+ break;
166
+ if (action === 'audit') {
167
+ await runAuditMenu(cwd);
168
+ continue;
169
+ }
170
+ if (action === 'scan') {
171
+ await runScanMenu(cwd);
172
+ continue;
173
+ }
174
+ if (action === 'explain') {
175
+ await runExplainMenu(cwd);
176
+ continue;
177
+ }
178
+ if (action === 'sep')
179
+ continue;
180
+ if (action === 'nl') {
181
+ const { runInteractive } = await import('./interactive.js');
182
+ await runInteractive(cwd);
183
+ break;
184
+ }
185
+ // Simple commands
186
+ const cmdMap = {
187
+ report: ['--cwd', cwd, 'report'],
188
+ graph: ['--cwd', cwd, 'graph'],
189
+ churn: ['--cwd', cwd, 'churn'],
190
+ patterns: ['--cwd', cwd, 'patterns'],
191
+ health: ['--cwd', cwd, 'health'],
192
+ };
193
+ const args = cmdMap[action];
194
+ if (args) {
195
+ console.log(chalk.bold.cyan(`\nRunning ${action}…\n`));
196
+ run(args);
197
+ }
198
+ // After command, ask to continue
199
+ const cont = await selectOne('', [
200
+ { label: '← Back to menu', value: 'menu' },
201
+ { label: ' Quit', value: 'quit' },
202
+ ]);
203
+ if (cont === 'quit' || !cont)
204
+ break;
205
+ }
206
+ console.log(chalk.dim('\nBye!\n'));
207
+ }
208
+ //# sourceMappingURL=menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/cli/menu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Command } from 'commander';
2
+ import type { BudgetName, ProviderName, RuntimePolicyInput } from '../core/runtime-policy.js';
3
+ export interface RuntimeCliOptions {
4
+ budget?: BudgetName;
5
+ deep?: boolean;
6
+ maxAgents?: string;
7
+ maxLines?: string;
8
+ maxOutputChars?: string;
9
+ plannerProvider?: ProviderName;
10
+ investigatorProvider?: ProviderName;
11
+ developerProvider?: ProviderName;
12
+ reviewerProvider?: ProviderName;
13
+ codexModel?: string;
14
+ openrouterModel?: string;
15
+ provider?: string;
16
+ }
17
+ export declare function toRuntimePolicyInput(options: RuntimeCliOptions): RuntimePolicyInput;
18
+ export declare function addRuntimeOptions(command: Command): Command;
19
+ //# sourceMappingURL=runtime-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-options.d.ts","sourceRoot":"","sources":["../../src/cli/runtime-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE9F,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B,oBAAoB,CAAC,EAAE,YAAY,CAAC;IACpC,iBAAiB,CAAC,EAAE,YAAY,CAAC;IACjC,gBAAgB,CAAC,EAAE,YAAY,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAuBD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,iBAAiB,GAAG,kBAAkB,CAenF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAe3D"}
@@ -0,0 +1,56 @@
1
+ function parsePositiveInt(value, label) {
2
+ if (!value)
3
+ return undefined;
4
+ const parsed = Number.parseInt(value, 10);
5
+ if (!Number.isFinite(parsed) || parsed <= 0) {
6
+ throw new Error(`${label} must be a positive integer`);
7
+ }
8
+ return parsed;
9
+ }
10
+ function parseBudget(value) {
11
+ if (!value)
12
+ return undefined;
13
+ if (value === 'low' || value === 'normal' || value === 'deep')
14
+ return value;
15
+ throw new Error('--budget must be one of: low, normal, deep');
16
+ }
17
+ function parseProvider(value, label) {
18
+ if (!value)
19
+ return undefined;
20
+ if (value === 'claude' || value === 'codex' || value === 'openrouter')
21
+ return value;
22
+ throw new Error(`${label} must be one of: claude, codex, openrouter`);
23
+ }
24
+ export function toRuntimePolicyInput(options) {
25
+ const globalProvider = options.provider ? parseProvider(options.provider, '--provider') : undefined;
26
+ return {
27
+ budget: parseBudget(options.budget),
28
+ deep: options.deep,
29
+ maxAgents: parsePositiveInt(options.maxAgents, '--max-agents'),
30
+ maxFileLines: parsePositiveInt(options.maxLines, '--max-lines'),
31
+ maxOutputChars: parsePositiveInt(options.maxOutputChars, '--max-output-chars'),
32
+ plannerProvider: parseProvider(options.plannerProvider, '--planner-provider') ?? globalProvider,
33
+ investigatorProvider: parseProvider(options.investigatorProvider, '--investigator-provider') ?? globalProvider,
34
+ developerProvider: parseProvider(options.developerProvider, '--developer-provider') ?? globalProvider,
35
+ reviewerProvider: parseProvider(options.reviewerProvider, '--reviewer-provider') ?? globalProvider,
36
+ codexModel: options.codexModel,
37
+ openrouterModel: options.openrouterModel,
38
+ };
39
+ }
40
+ export function addRuntimeOptions(command) {
41
+ return command
42
+ .option('--budget <budget>', 'runtime budget: low, normal, deep', 'low')
43
+ .option('--deep', 'run deeper multi-agent fan-out')
44
+ .option('--provider <provider>', 'global provider: claude, codex, openrouter')
45
+ .option('--model <model>', 'model override for openrouter (e.g. moonshotai/kimi-k2)')
46
+ .option('--max-agents <n>', 'maximum agents to fan out')
47
+ .option('--max-lines <n>', 'maximum lines per file/context block', '500')
48
+ .option('--max-output-chars <n>', 'maximum output chars kept per CLI call')
49
+ .option('--planner-provider <provider>', 'planner provider: claude, codex, openrouter')
50
+ .option('--investigator-provider <provider>', 'investigator provider: claude, codex, openrouter')
51
+ .option('--developer-provider <provider>', 'developer provider: claude, codex, openrouter')
52
+ .option('--reviewer-provider <provider>', 'reviewer provider: claude, codex, openrouter')
53
+ .option('--codex-model <model>', 'model passed to codex exec')
54
+ .option('--openrouter-model <model>', 'model passed to openrouter');
55
+ }
56
+ //# sourceMappingURL=runtime-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-options.js","sourceRoot":"","sources":["../../src/cli/runtime-options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface MenuItem<T = string> {
2
+ label: string;
3
+ hint?: string;
4
+ value: T;
5
+ icon?: string;
6
+ separator?: boolean;
7
+ }
8
+ export declare function selectOne<T>(title: string, items: MenuItem<T>[], subtitle?: string): Promise<T | null>;
9
+ export declare function selectMany<T>(title: string, items: MenuItem<T>[], subtitle?: string, preSelected?: number[]): Promise<T[] | null>;
10
+ export declare function printHeader(projectName: string, extra?: string): void;
11
+ //# sourceMappingURL=tui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/cli/tui.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,MAAM;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAsED,wBAAsB,SAAS,CAAC,CAAC,EAC/B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CA+CnB;AAED,wBAAsB,UAAU,CAAC,CAAC,EAChC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EACpB,QAAQ,CAAC,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CA0CrB;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAOrE"}
@@ -0,0 +1,162 @@
1
+ import { emitKeypressEvents } from 'readline';
2
+ import chalk from 'chalk';
3
+ function clearLines(n) {
4
+ for (let i = 0; i < n; i++) {
5
+ process.stdout.write('\x1b[1A\x1b[2K');
6
+ }
7
+ }
8
+ function hideCursor() { process.stdout.write('\x1b[?25l'); }
9
+ function showCursor() { process.stdout.write('\x1b[?25h'); }
10
+ function renderList(title, items, selected, subtitle) {
11
+ const lines = [];
12
+ lines.push(chalk.bold.cyan(` ${title}`));
13
+ if (subtitle)
14
+ lines.push(chalk.dim(` ${subtitle}`));
15
+ lines.push('');
16
+ items.forEach((item, i) => {
17
+ if (item.separator) {
18
+ lines.push(chalk.dim(' ─────────────────────────────────'));
19
+ return;
20
+ }
21
+ const cursor = i === selected ? chalk.cyan('❯') : ' ';
22
+ const icon = item.icon ?? ' ';
23
+ const label = i === selected ? chalk.bold.white(item.label) : chalk.white(item.label);
24
+ const hint = item.hint ? chalk.dim(` ${item.hint}`) : '';
25
+ lines.push(` ${cursor} ${icon} ${label}${hint}`);
26
+ });
27
+ lines.push('');
28
+ lines.push(chalk.dim(' ↕ navigate ↵ select q quit'));
29
+ lines.forEach((l) => process.stdout.write(l + '\n'));
30
+ return lines.length;
31
+ }
32
+ function renderMulti(title, items, selected, toggled, subtitle) {
33
+ const lines = [];
34
+ lines.push(chalk.bold.cyan(` ${title}`));
35
+ if (subtitle)
36
+ lines.push(chalk.dim(` ${subtitle}`));
37
+ lines.push('');
38
+ items.forEach((item, i) => {
39
+ const cursor = i === selected ? chalk.cyan('❯') : ' ';
40
+ const check = toggled.has(i) ? chalk.green('☑') : chalk.gray('☐');
41
+ const label = i === selected ? chalk.bold.white(item.label) : chalk.white(item.label);
42
+ const hint = item.hint ? chalk.dim(` ${item.hint}`) : '';
43
+ lines.push(` ${cursor} ${check} ${label}${hint}`);
44
+ });
45
+ const selectedLabels = [...toggled].map((i) => items[i]?.label ?? '').join(', ');
46
+ lines.push('');
47
+ lines.push(selectedLabels
48
+ ? chalk.green(` Selected: ${selectedLabels}`)
49
+ : chalk.dim(' None selected'));
50
+ lines.push(chalk.dim(' ↕ navigate Space toggle ↵ confirm q cancel'));
51
+ lines.forEach((l) => process.stdout.write(l + '\n'));
52
+ return lines.length;
53
+ }
54
+ export async function selectOne(title, items, subtitle) {
55
+ if (!process.stdin.isTTY)
56
+ return null;
57
+ const nonSep = items.filter((i) => !i.separator);
58
+ let selected = 0;
59
+ let lineCount = 0;
60
+ hideCursor();
61
+ lineCount = renderList(title, items, selected, subtitle);
62
+ return new Promise((resolve) => {
63
+ process.stdin.setRawMode(true);
64
+ emitKeypressEvents(process.stdin);
65
+ const handler = (_, key) => {
66
+ if (!key)
67
+ return;
68
+ if ((key.ctrl && key.name === 'c') || key.name === 'q') {
69
+ cleanup();
70
+ resolve(null);
71
+ return;
72
+ }
73
+ if (key.name === 'up') {
74
+ do {
75
+ selected = (selected - 1 + items.length) % items.length;
76
+ } while (items[selected]?.separator);
77
+ }
78
+ if (key.name === 'down') {
79
+ do {
80
+ selected = (selected + 1) % items.length;
81
+ } while (items[selected]?.separator);
82
+ }
83
+ if (key.name === 'return') {
84
+ const val = items[selected];
85
+ if (val && !val.separator) {
86
+ cleanup();
87
+ resolve(val.value);
88
+ return;
89
+ }
90
+ }
91
+ clearLines(lineCount);
92
+ lineCount = renderList(title, items, selected, subtitle);
93
+ };
94
+ const cleanup = () => {
95
+ process.stdin.removeListener('keypress', handler);
96
+ if (process.stdin.isTTY)
97
+ process.stdin.setRawMode(false);
98
+ showCursor();
99
+ clearLines(lineCount);
100
+ };
101
+ process.stdin.on('keypress', handler);
102
+ void nonSep; // suppress unused warning
103
+ });
104
+ }
105
+ export async function selectMany(title, items, subtitle, preSelected) {
106
+ if (!process.stdin.isTTY)
107
+ return null;
108
+ let selected = 0;
109
+ const toggled = new Set(preSelected ?? []);
110
+ let lineCount = 0;
111
+ hideCursor();
112
+ lineCount = renderMulti(title, items, selected, toggled, subtitle);
113
+ return new Promise((resolve) => {
114
+ process.stdin.setRawMode(true);
115
+ emitKeypressEvents(process.stdin);
116
+ const handler = (_, key) => {
117
+ if (!key)
118
+ return;
119
+ if ((key.ctrl && key.name === 'c') || key.name === 'q') {
120
+ cleanup();
121
+ resolve(null);
122
+ return;
123
+ }
124
+ if (key.name === 'up')
125
+ selected = Math.max(0, selected - 1);
126
+ if (key.name === 'down')
127
+ selected = Math.min(items.length - 1, selected + 1);
128
+ if (key.name === 'space') {
129
+ if (toggled.has(selected))
130
+ toggled.delete(selected);
131
+ else
132
+ toggled.add(selected);
133
+ }
134
+ if (key.name === 'return') {
135
+ const result = [...toggled].map((i) => items[i].value);
136
+ cleanup();
137
+ resolve(result);
138
+ return;
139
+ }
140
+ clearLines(lineCount);
141
+ lineCount = renderMulti(title, items, selected, toggled, subtitle);
142
+ };
143
+ const cleanup = () => {
144
+ process.stdin.removeListener('keypress', handler);
145
+ if (process.stdin.isTTY)
146
+ process.stdin.setRawMode(false);
147
+ showCursor();
148
+ clearLines(lineCount);
149
+ };
150
+ process.stdin.on('keypress', handler);
151
+ });
152
+ }
153
+ export function printHeader(projectName, extra) {
154
+ const line = '─'.repeat(50);
155
+ console.log(chalk.dim(line));
156
+ console.log(chalk.bold.cyan(` 🤖 AI Runtime`) + chalk.gray(` — ${projectName}`));
157
+ if (extra)
158
+ console.log(chalk.dim(` ${extra}`));
159
+ console.log(chalk.dim(line));
160
+ console.log('');
161
+ }
162
+ //# sourceMappingURL=tui.js.map