@oxagen/cli 0.5.0 → 0.6.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 (442) hide show
  1. package/README.md +66 -3
  2. package/dist/agent/__tests__/code-graph.test.d.ts +2 -0
  3. package/dist/agent/__tests__/code-graph.test.d.ts.map +1 -0
  4. package/dist/agent/__tests__/code-graph.test.js +83 -0
  5. package/dist/agent/__tests__/code-graph.test.js.map +1 -0
  6. package/dist/agent/__tests__/evaluator.test.d.ts +2 -0
  7. package/dist/agent/__tests__/evaluator.test.d.ts.map +1 -0
  8. package/dist/agent/__tests__/evaluator.test.js +96 -0
  9. package/dist/agent/__tests__/evaluator.test.js.map +1 -0
  10. package/dist/agent/__tests__/fleet-memory.test.d.ts +2 -0
  11. package/dist/agent/__tests__/fleet-memory.test.d.ts.map +1 -0
  12. package/dist/agent/__tests__/fleet-memory.test.js +107 -0
  13. package/dist/agent/__tests__/fleet-memory.test.js.map +1 -0
  14. package/dist/agent/__tests__/fleet-store.test.d.ts +2 -0
  15. package/dist/agent/__tests__/fleet-store.test.d.ts.map +1 -0
  16. package/dist/agent/__tests__/fleet-store.test.js +93 -0
  17. package/dist/agent/__tests__/fleet-store.test.js.map +1 -0
  18. package/dist/agent/__tests__/git-isolation.test.d.ts +2 -0
  19. package/dist/agent/__tests__/git-isolation.test.d.ts.map +1 -0
  20. package/dist/agent/__tests__/git-isolation.test.js +119 -0
  21. package/dist/agent/__tests__/git-isolation.test.js.map +1 -0
  22. package/dist/agent/__tests__/judge.test.d.ts +2 -0
  23. package/dist/agent/__tests__/judge.test.d.ts.map +1 -0
  24. package/dist/agent/__tests__/judge.test.js +135 -0
  25. package/dist/agent/__tests__/judge.test.js.map +1 -0
  26. package/dist/agent/__tests__/loop-errors.test.d.ts +2 -0
  27. package/dist/agent/__tests__/loop-errors.test.d.ts.map +1 -0
  28. package/dist/agent/__tests__/loop-errors.test.js +44 -0
  29. package/dist/agent/__tests__/loop-errors.test.js.map +1 -0
  30. package/dist/agent/__tests__/model-router.test.d.ts +2 -0
  31. package/dist/agent/__tests__/model-router.test.d.ts.map +1 -0
  32. package/dist/agent/__tests__/model-router.test.js +122 -0
  33. package/dist/agent/__tests__/model-router.test.js.map +1 -0
  34. package/dist/agent/__tests__/orchestrator-isolation.test.d.ts +2 -0
  35. package/dist/agent/__tests__/orchestrator-isolation.test.d.ts.map +1 -0
  36. package/dist/agent/__tests__/orchestrator-isolation.test.js +134 -0
  37. package/dist/agent/__tests__/orchestrator-isolation.test.js.map +1 -0
  38. package/dist/agent/__tests__/orchestrator.test.d.ts +2 -0
  39. package/dist/agent/__tests__/orchestrator.test.d.ts.map +1 -0
  40. package/dist/agent/__tests__/orchestrator.test.js +201 -0
  41. package/dist/agent/__tests__/orchestrator.test.js.map +1 -0
  42. package/dist/agent/__tests__/pipeline.test.d.ts +2 -0
  43. package/dist/agent/__tests__/pipeline.test.d.ts.map +1 -0
  44. package/dist/agent/__tests__/pipeline.test.js +226 -0
  45. package/dist/agent/__tests__/pipeline.test.js.map +1 -0
  46. package/dist/agent/__tests__/planner.test.d.ts +2 -0
  47. package/dist/agent/__tests__/planner.test.d.ts.map +1 -0
  48. package/dist/agent/__tests__/planner.test.js +98 -0
  49. package/dist/agent/__tests__/planner.test.js.map +1 -0
  50. package/dist/agent/__tests__/prompt-enhancer.test.d.ts +2 -0
  51. package/dist/agent/__tests__/prompt-enhancer.test.d.ts.map +1 -0
  52. package/dist/agent/__tests__/prompt-enhancer.test.js +107 -0
  53. package/dist/agent/__tests__/prompt-enhancer.test.js.map +1 -0
  54. package/dist/agent/__tests__/trace-format.test.d.ts +2 -0
  55. package/dist/agent/__tests__/trace-format.test.d.ts.map +1 -0
  56. package/dist/agent/__tests__/trace-format.test.js +104 -0
  57. package/dist/agent/__tests__/trace-format.test.js.map +1 -0
  58. package/dist/agent/__tests__/trace-store.test.d.ts +2 -0
  59. package/dist/agent/__tests__/trace-store.test.d.ts.map +1 -0
  60. package/dist/agent/__tests__/trace-store.test.js +113 -0
  61. package/dist/agent/__tests__/trace-store.test.js.map +1 -0
  62. package/dist/agent/code-graph.d.ts +18 -0
  63. package/dist/agent/code-graph.d.ts.map +1 -0
  64. package/dist/agent/code-graph.js +119 -0
  65. package/dist/agent/code-graph.js.map +1 -0
  66. package/dist/agent/env.d.ts +11 -0
  67. package/dist/agent/env.d.ts.map +1 -0
  68. package/dist/agent/env.js +82 -0
  69. package/dist/agent/env.js.map +1 -0
  70. package/dist/agent/evaluator.d.ts +13 -0
  71. package/dist/agent/evaluator.d.ts.map +1 -0
  72. package/dist/agent/evaluator.js +146 -0
  73. package/dist/agent/evaluator.js.map +1 -0
  74. package/dist/agent/fleet/git-isolation.d.ts +142 -0
  75. package/dist/agent/fleet/git-isolation.d.ts.map +1 -0
  76. package/dist/agent/fleet/git-isolation.js +290 -0
  77. package/dist/agent/fleet/git-isolation.js.map +1 -0
  78. package/dist/agent/fleet/memory.d.ts +21 -0
  79. package/dist/agent/fleet/memory.d.ts.map +1 -0
  80. package/dist/agent/fleet/memory.js +129 -0
  81. package/dist/agent/fleet/memory.js.map +1 -0
  82. package/dist/agent/fleet/orchestrator.d.ts +103 -0
  83. package/dist/agent/fleet/orchestrator.d.ts.map +1 -0
  84. package/dist/agent/fleet/orchestrator.js +355 -0
  85. package/dist/agent/fleet/orchestrator.js.map +1 -0
  86. package/dist/agent/fleet/store.d.ts +13 -0
  87. package/dist/agent/fleet/store.d.ts.map +1 -0
  88. package/dist/agent/fleet/store.js +79 -0
  89. package/dist/agent/fleet/store.js.map +1 -0
  90. package/dist/agent/fleet/types.d.ts +105 -0
  91. package/dist/agent/fleet/types.d.ts.map +1 -0
  92. package/dist/agent/fleet/types.js +17 -0
  93. package/dist/agent/fleet/types.js.map +1 -0
  94. package/dist/agent/judge.d.ts +38 -0
  95. package/dist/agent/judge.d.ts.map +1 -0
  96. package/dist/agent/judge.js +170 -0
  97. package/dist/agent/judge.js.map +1 -0
  98. package/dist/agent/loop.d.ts +61 -0
  99. package/dist/agent/loop.d.ts.map +1 -0
  100. package/dist/agent/loop.js +134 -0
  101. package/dist/agent/loop.js.map +1 -0
  102. package/dist/agent/memory.d.ts +14 -0
  103. package/dist/agent/memory.d.ts.map +1 -0
  104. package/dist/agent/memory.js +118 -0
  105. package/dist/agent/memory.js.map +1 -0
  106. package/dist/agent/model-router.d.ts +79 -0
  107. package/dist/agent/model-router.d.ts.map +1 -0
  108. package/dist/agent/model-router.js +141 -0
  109. package/dist/agent/model-router.js.map +1 -0
  110. package/dist/agent/model.d.ts +9 -0
  111. package/dist/agent/model.d.ts.map +1 -0
  112. package/dist/agent/model.js +24 -0
  113. package/dist/agent/model.js.map +1 -0
  114. package/dist/agent/pipeline.d.ts +82 -0
  115. package/dist/agent/pipeline.d.ts.map +1 -0
  116. package/dist/agent/pipeline.js +320 -0
  117. package/dist/agent/pipeline.js.map +1 -0
  118. package/dist/agent/planner.d.ts +16 -0
  119. package/dist/agent/planner.d.ts.map +1 -0
  120. package/dist/agent/planner.js +126 -0
  121. package/dist/agent/planner.js.map +1 -0
  122. package/dist/agent/project-context.d.ts +13 -0
  123. package/dist/agent/project-context.d.ts.map +1 -0
  124. package/dist/agent/project-context.js +66 -0
  125. package/dist/agent/project-context.js.map +1 -0
  126. package/dist/agent/prompt-enhancer.d.ts +37 -0
  127. package/dist/agent/prompt-enhancer.d.ts.map +1 -0
  128. package/dist/agent/prompt-enhancer.js +115 -0
  129. package/dist/agent/prompt-enhancer.js.map +1 -0
  130. package/dist/agent/system-prompt.d.ts +9 -0
  131. package/dist/agent/system-prompt.d.ts.map +1 -0
  132. package/dist/agent/system-prompt.js +38 -0
  133. package/dist/agent/system-prompt.js.map +1 -0
  134. package/dist/agent/tools.d.ts +19 -0
  135. package/dist/agent/tools.d.ts.map +1 -0
  136. package/dist/agent/tools.js +323 -0
  137. package/dist/agent/tools.js.map +1 -0
  138. package/dist/agent/trace-format.d.ts +6 -0
  139. package/dist/agent/trace-format.d.ts.map +1 -0
  140. package/dist/agent/trace-format.js +74 -0
  141. package/dist/agent/trace-format.js.map +1 -0
  142. package/dist/agent/trace-store.d.ts +19 -0
  143. package/dist/agent/trace-store.d.ts.map +1 -0
  144. package/dist/agent/trace-store.js +82 -0
  145. package/dist/agent/trace-store.js.map +1 -0
  146. package/dist/agent/trace.d.ts +121 -0
  147. package/dist/agent/trace.d.ts.map +1 -0
  148. package/dist/agent/trace.js +2 -0
  149. package/dist/agent/trace.js.map +1 -0
  150. package/dist/commands/__tests__/replay.test.d.ts +2 -0
  151. package/dist/commands/__tests__/replay.test.d.ts.map +1 -0
  152. package/dist/commands/__tests__/replay.test.js +76 -0
  153. package/dist/commands/__tests__/replay.test.js.map +1 -0
  154. package/dist/commands/agent.skill.load.d.ts +3 -0
  155. package/dist/commands/agent.skill.load.d.ts.map +1 -0
  156. package/dist/commands/agent.skill.load.js +57 -0
  157. package/dist/commands/agent.skill.load.js.map +1 -0
  158. package/dist/commands/code.d.ts +14 -0
  159. package/dist/commands/code.d.ts.map +1 -0
  160. package/dist/commands/code.js +100 -0
  161. package/dist/commands/code.js.map +1 -0
  162. package/dist/commands/config.d.ts +2 -0
  163. package/dist/commands/config.d.ts.map +1 -0
  164. package/dist/commands/config.js +66 -0
  165. package/dist/commands/config.js.map +1 -0
  166. package/dist/commands/env.d.ts +19 -0
  167. package/dist/commands/env.d.ts.map +1 -0
  168. package/dist/commands/env.js +64 -0
  169. package/dist/commands/env.js.map +1 -0
  170. package/dist/commands/graph.search.d.ts +10 -0
  171. package/dist/commands/graph.search.d.ts.map +1 -0
  172. package/dist/commands/graph.search.js +25 -0
  173. package/dist/commands/graph.search.js.map +1 -0
  174. package/dist/commands/mcp.add.d.ts +13 -0
  175. package/dist/commands/mcp.add.d.ts.map +1 -0
  176. package/dist/commands/mcp.add.js +110 -0
  177. package/dist/commands/mcp.add.js.map +1 -0
  178. package/dist/commands/mcp.auth.d.ts +10 -0
  179. package/dist/commands/mcp.auth.d.ts.map +1 -0
  180. package/dist/commands/mcp.auth.js +132 -0
  181. package/dist/commands/mcp.auth.js.map +1 -0
  182. package/dist/commands/mcp.check.d.ts +10 -0
  183. package/dist/commands/mcp.check.d.ts.map +1 -0
  184. package/dist/commands/mcp.check.js +114 -0
  185. package/dist/commands/mcp.check.js.map +1 -0
  186. package/dist/commands/mcp.list.d.ts +9 -0
  187. package/dist/commands/mcp.list.d.ts.map +1 -0
  188. package/dist/commands/mcp.list.js +93 -0
  189. package/dist/commands/mcp.list.js.map +1 -0
  190. package/dist/commands/mcp.permit.d.ts +12 -0
  191. package/dist/commands/mcp.permit.d.ts.map +1 -0
  192. package/dist/commands/mcp.permit.js +117 -0
  193. package/dist/commands/mcp.permit.js.map +1 -0
  194. package/dist/commands/mcp.remove.d.ts +9 -0
  195. package/dist/commands/mcp.remove.d.ts.map +1 -0
  196. package/dist/commands/mcp.remove.js +65 -0
  197. package/dist/commands/mcp.remove.js.map +1 -0
  198. package/dist/commands/plugin.org.install_bulk.js +1 -1
  199. package/dist/commands/plugin.org.install_bulk.js.map +1 -1
  200. package/dist/commands/privacy.erase.test.js +7 -0
  201. package/dist/commands/privacy.erase.test.js.map +1 -1
  202. package/dist/commands/replay.d.ts +5 -0
  203. package/dist/commands/replay.d.ts.map +1 -0
  204. package/dist/commands/replay.js +28 -0
  205. package/dist/commands/replay.js.map +1 -0
  206. package/dist/commands/schema/schema.config.d.ts +3 -0
  207. package/dist/commands/schema/schema.config.d.ts.map +1 -0
  208. package/dist/commands/schema/schema.config.js +34 -0
  209. package/dist/commands/schema/schema.config.js.map +1 -0
  210. package/dist/commands/schema/schema.disable.d.ts +3 -0
  211. package/dist/commands/schema/schema.disable.d.ts.map +1 -0
  212. package/dist/commands/schema/schema.disable.js +22 -0
  213. package/dist/commands/schema/schema.disable.js.map +1 -0
  214. package/dist/commands/schema/schema.enable.d.ts +3 -0
  215. package/dist/commands/schema/schema.enable.d.ts.map +1 -0
  216. package/dist/commands/schema/schema.enable.js +22 -0
  217. package/dist/commands/schema/schema.enable.js.map +1 -0
  218. package/dist/commands/schema/schema.export.d.ts +3 -0
  219. package/dist/commands/schema/schema.export.d.ts.map +1 -0
  220. package/dist/commands/schema/schema.export.js +31 -0
  221. package/dist/commands/schema/schema.export.js.map +1 -0
  222. package/dist/commands/schema/schema.get.d.ts +3 -0
  223. package/dist/commands/schema/schema.get.d.ts.map +1 -0
  224. package/dist/commands/schema/schema.get.js +23 -0
  225. package/dist/commands/schema/schema.get.js.map +1 -0
  226. package/dist/commands/schema/schema.label.d.ts +5 -0
  227. package/dist/commands/schema/schema.label.d.ts.map +1 -0
  228. package/dist/commands/schema/schema.label.js +60 -0
  229. package/dist/commands/schema/schema.label.js.map +1 -0
  230. package/dist/commands/schema/schema.list.d.ts +3 -0
  231. package/dist/commands/schema/schema.list.d.ts.map +1 -0
  232. package/dist/commands/schema/schema.list.js +30 -0
  233. package/dist/commands/schema/schema.list.js.map +1 -0
  234. package/dist/commands/schema/schema.prop.d.ts +5 -0
  235. package/dist/commands/schema/schema.prop.d.ts.map +1 -0
  236. package/dist/commands/schema/schema.prop.js +72 -0
  237. package/dist/commands/schema/schema.prop.js.map +1 -0
  238. package/dist/commands/schema/schema.reconcile.d.ts +10 -0
  239. package/dist/commands/schema/schema.reconcile.d.ts.map +1 -0
  240. package/dist/commands/schema/schema.reconcile.js +65 -0
  241. package/dist/commands/schema/schema.reconcile.js.map +1 -0
  242. package/dist/commands/schema/schema.rel.d.ts +5 -0
  243. package/dist/commands/schema/schema.rel.d.ts.map +1 -0
  244. package/dist/commands/schema/schema.rel.js +65 -0
  245. package/dist/commands/schema/schema.rel.js.map +1 -0
  246. package/dist/commands/schema/schema.version.d.ts +7 -0
  247. package/dist/commands/schema/schema.version.d.ts.map +1 -0
  248. package/dist/commands/schema/schema.version.js +96 -0
  249. package/dist/commands/schema/schema.version.js.map +1 -0
  250. package/dist/commands/secret.d.ts +23 -0
  251. package/dist/commands/secret.d.ts.map +1 -0
  252. package/dist/commands/secret.js +90 -0
  253. package/dist/commands/secret.js.map +1 -0
  254. package/dist/commands/skill.create.d.ts +3 -0
  255. package/dist/commands/skill.create.d.ts.map +1 -0
  256. package/dist/commands/skill.create.js +52 -0
  257. package/dist/commands/skill.create.js.map +1 -0
  258. package/dist/commands/skill.enable.d.ts +3 -0
  259. package/dist/commands/skill.enable.d.ts.map +1 -0
  260. package/dist/commands/skill.enable.js +31 -0
  261. package/dist/commands/skill.enable.js.map +1 -0
  262. package/dist/commands.test.js +1291 -281
  263. package/dist/commands.test.js.map +1 -1
  264. package/dist/components/DevStatus.d.ts.map +1 -1
  265. package/dist/components/DevStatus.js +3 -2
  266. package/dist/components/DevStatus.js.map +1 -1
  267. package/dist/daemon/client.d.ts +30 -0
  268. package/dist/daemon/client.d.ts.map +1 -0
  269. package/dist/daemon/client.js +97 -0
  270. package/dist/daemon/client.js.map +1 -0
  271. package/dist/daemon/code-graph/builder.d.ts +6 -0
  272. package/dist/daemon/code-graph/builder.d.ts.map +1 -0
  273. package/dist/daemon/code-graph/builder.js +215 -0
  274. package/dist/daemon/code-graph/builder.js.map +1 -0
  275. package/dist/daemon/code-graph/query.d.ts +29 -0
  276. package/dist/daemon/code-graph/query.d.ts.map +1 -0
  277. package/dist/daemon/code-graph/query.js +98 -0
  278. package/dist/daemon/code-graph/query.js.map +1 -0
  279. package/dist/daemon/code-graph/types.d.ts +37 -0
  280. package/dist/daemon/code-graph/types.d.ts.map +1 -0
  281. package/dist/daemon/code-graph/types.js +5 -0
  282. package/dist/daemon/code-graph/types.js.map +1 -0
  283. package/dist/daemon/code-graph/watcher.d.ts +37 -0
  284. package/dist/daemon/code-graph/watcher.d.ts.map +1 -0
  285. package/dist/daemon/code-graph/watcher.js +79 -0
  286. package/dist/daemon/code-graph/watcher.js.map +1 -0
  287. package/dist/daemon/lifecycle.d.ts +6 -0
  288. package/dist/daemon/lifecycle.d.ts.map +1 -0
  289. package/dist/daemon/lifecycle.js +132 -0
  290. package/dist/daemon/lifecycle.js.map +1 -0
  291. package/dist/daemon/protocol.d.ts +113 -0
  292. package/dist/daemon/protocol.d.ts.map +1 -0
  293. package/dist/daemon/protocol.js +16 -0
  294. package/dist/daemon/protocol.js.map +1 -0
  295. package/dist/daemon/server.d.ts +26 -0
  296. package/dist/daemon/server.d.ts.map +1 -0
  297. package/dist/daemon/server.js +168 -0
  298. package/dist/daemon/server.js.map +1 -0
  299. package/dist/index.d.ts +1 -1
  300. package/dist/index.js +262 -356
  301. package/dist/index.js.map +1 -1
  302. package/dist/lib/api.d.ts +5 -0
  303. package/dist/lib/api.d.ts.map +1 -0
  304. package/dist/lib/api.js +52 -0
  305. package/dist/lib/api.js.map +1 -0
  306. package/dist/lib/config.d.ts +3 -0
  307. package/dist/lib/config.d.ts.map +1 -1
  308. package/dist/lib/config.js +8 -2
  309. package/dist/lib/config.js.map +1 -1
  310. package/dist/lib/differential-context.d.ts +46 -0
  311. package/dist/lib/differential-context.d.ts.map +1 -0
  312. package/dist/lib/differential-context.js +89 -0
  313. package/dist/lib/differential-context.js.map +1 -0
  314. package/dist/lib/resolve.d.ts +3 -0
  315. package/dist/lib/resolve.d.ts.map +1 -0
  316. package/dist/lib/resolve.js +29 -0
  317. package/dist/lib/resolve.js.map +1 -0
  318. package/dist/lib/structured-tool-io.d.ts +31 -0
  319. package/dist/lib/structured-tool-io.d.ts.map +1 -0
  320. package/dist/lib/structured-tool-io.js +56 -0
  321. package/dist/lib/structured-tool-io.js.map +1 -0
  322. package/dist/repl/__tests__/_queue_demo.test.d.ts +2 -0
  323. package/dist/repl/__tests__/_queue_demo.test.d.ts.map +1 -0
  324. package/dist/repl/__tests__/_queue_demo.test.js +40 -0
  325. package/dist/repl/__tests__/_queue_demo.test.js.map +1 -0
  326. package/dist/repl/__tests__/components.test.d.ts +2 -0
  327. package/dist/repl/__tests__/components.test.d.ts.map +1 -0
  328. package/dist/repl/__tests__/components.test.js +38 -0
  329. package/dist/repl/__tests__/components.test.js.map +1 -0
  330. package/dist/repl/__tests__/interactive.queue.test.d.ts +2 -0
  331. package/dist/repl/__tests__/interactive.queue.test.d.ts.map +1 -0
  332. package/dist/repl/__tests__/interactive.queue.test.js +124 -0
  333. package/dist/repl/__tests__/interactive.queue.test.js.map +1 -0
  334. package/dist/repl/components.d.ts +59 -0
  335. package/dist/repl/components.d.ts.map +1 -0
  336. package/dist/repl/components.js +152 -0
  337. package/dist/repl/components.js.map +1 -0
  338. package/dist/repl/interactive.d.ts +12 -0
  339. package/dist/repl/interactive.d.ts.map +1 -0
  340. package/dist/repl/interactive.js +326 -0
  341. package/dist/repl/interactive.js.map +1 -0
  342. package/dist/repl/one-shot.d.ts +9 -0
  343. package/dist/repl/one-shot.d.ts.map +1 -0
  344. package/dist/repl/one-shot.js +83 -0
  345. package/dist/repl/one-shot.js.map +1 -0
  346. package/dist/tui/__tests__/app.test.d.ts +2 -0
  347. package/dist/tui/__tests__/app.test.d.ts.map +1 -0
  348. package/dist/tui/__tests__/app.test.js +136 -0
  349. package/dist/tui/__tests__/app.test.js.map +1 -0
  350. package/dist/tui/__tests__/banner.test.d.ts +2 -0
  351. package/dist/tui/__tests__/banner.test.d.ts.map +1 -0
  352. package/dist/tui/__tests__/banner.test.js +15 -0
  353. package/dist/tui/__tests__/banner.test.js.map +1 -0
  354. package/dist/tui/__tests__/command-form.test.d.ts +2 -0
  355. package/dist/tui/__tests__/command-form.test.d.ts.map +1 -0
  356. package/dist/tui/__tests__/command-form.test.js +96 -0
  357. package/dist/tui/__tests__/command-form.test.js.map +1 -0
  358. package/dist/tui/__tests__/command-tree.test.d.ts +2 -0
  359. package/dist/tui/__tests__/command-tree.test.d.ts.map +1 -0
  360. package/dist/tui/__tests__/command-tree.test.js +55 -0
  361. package/dist/tui/__tests__/command-tree.test.js.map +1 -0
  362. package/dist/tui/__tests__/runner.test.d.ts +2 -0
  363. package/dist/tui/__tests__/runner.test.d.ts.map +1 -0
  364. package/dist/tui/__tests__/runner.test.js +38 -0
  365. package/dist/tui/__tests__/runner.test.js.map +1 -0
  366. package/dist/tui/__tests__/theme.test.d.ts +2 -0
  367. package/dist/tui/__tests__/theme.test.d.ts.map +1 -0
  368. package/dist/tui/__tests__/theme.test.js +11 -0
  369. package/dist/tui/__tests__/theme.test.js.map +1 -0
  370. package/dist/tui/agent-view/activity-feed.d.ts +3 -0
  371. package/dist/tui/agent-view/activity-feed.d.ts.map +1 -0
  372. package/dist/tui/agent-view/activity-feed.js +34 -0
  373. package/dist/tui/agent-view/activity-feed.js.map +1 -0
  374. package/dist/tui/agent-view/budget-bar.d.ts +3 -0
  375. package/dist/tui/agent-view/budget-bar.d.ts.map +1 -0
  376. package/dist/tui/agent-view/budget-bar.js +53 -0
  377. package/dist/tui/agent-view/budget-bar.js.map +1 -0
  378. package/dist/tui/agent-view/compile-panel.d.ts +3 -0
  379. package/dist/tui/agent-view/compile-panel.d.ts.map +1 -0
  380. package/dist/tui/agent-view/compile-panel.js +34 -0
  381. package/dist/tui/agent-view/compile-panel.js.map +1 -0
  382. package/dist/tui/agent-view/index.d.ts +4 -0
  383. package/dist/tui/agent-view/index.d.ts.map +1 -0
  384. package/dist/tui/agent-view/index.js +31 -0
  385. package/dist/tui/agent-view/index.js.map +1 -0
  386. package/dist/tui/agent-view/memory-panel.d.ts +3 -0
  387. package/dist/tui/agent-view/memory-panel.d.ts.map +1 -0
  388. package/dist/tui/agent-view/memory-panel.js +80 -0
  389. package/dist/tui/agent-view/memory-panel.js.map +1 -0
  390. package/dist/tui/agent-view/session-panel.d.ts +3 -0
  391. package/dist/tui/agent-view/session-panel.d.ts.map +1 -0
  392. package/dist/tui/agent-view/session-panel.js +44 -0
  393. package/dist/tui/agent-view/session-panel.js.map +1 -0
  394. package/dist/tui/agent-view/status-bar.d.ts +7 -0
  395. package/dist/tui/agent-view/status-bar.d.ts.map +1 -0
  396. package/dist/tui/agent-view/status-bar.js +22 -0
  397. package/dist/tui/agent-view/status-bar.js.map +1 -0
  398. package/dist/tui/app.d.ts +9 -0
  399. package/dist/tui/app.d.ts.map +1 -0
  400. package/dist/tui/app.js +115 -0
  401. package/dist/tui/app.js.map +1 -0
  402. package/dist/tui/banner.d.ts +5 -0
  403. package/dist/tui/banner.d.ts.map +1 -0
  404. package/dist/tui/banner.js +17 -0
  405. package/dist/tui/banner.js.map +1 -0
  406. package/dist/tui/command-form.d.ts +9 -0
  407. package/dist/tui/command-form.d.ts.map +1 -0
  408. package/dist/tui/command-form.js +76 -0
  409. package/dist/tui/command-form.js.map +1 -0
  410. package/dist/tui/command-tree.d.ts +30 -0
  411. package/dist/tui/command-tree.d.ts.map +1 -0
  412. package/dist/tui/command-tree.js +43 -0
  413. package/dist/tui/command-tree.js.map +1 -0
  414. package/dist/tui/fleet-view/agent-row.d.ts +10 -0
  415. package/dist/tui/fleet-view/agent-row.d.ts.map +1 -0
  416. package/dist/tui/fleet-view/agent-row.js +80 -0
  417. package/dist/tui/fleet-view/agent-row.js.map +1 -0
  418. package/dist/tui/fleet-view/dispatch-input.d.ts +5 -0
  419. package/dist/tui/fleet-view/dispatch-input.d.ts.map +1 -0
  420. package/dist/tui/fleet-view/dispatch-input.js +36 -0
  421. package/dist/tui/fleet-view/dispatch-input.js.map +1 -0
  422. package/dist/tui/fleet-view/fleet-app.d.ts +11 -0
  423. package/dist/tui/fleet-view/fleet-app.d.ts.map +1 -0
  424. package/dist/tui/fleet-view/fleet-app.js +95 -0
  425. package/dist/tui/fleet-view/fleet-app.js.map +1 -0
  426. package/dist/tui/fleet-view/fleet-summary.d.ts +6 -0
  427. package/dist/tui/fleet-view/fleet-summary.d.ts.map +1 -0
  428. package/dist/tui/fleet-view/fleet-summary.js +19 -0
  429. package/dist/tui/fleet-view/fleet-summary.js.map +1 -0
  430. package/dist/tui/fleet-view/index.d.ts +16 -0
  431. package/dist/tui/fleet-view/index.d.ts.map +1 -0
  432. package/dist/tui/fleet-view/index.js +61 -0
  433. package/dist/tui/fleet-view/index.js.map +1 -0
  434. package/dist/tui/runner.d.ts +7 -0
  435. package/dist/tui/runner.d.ts.map +1 -0
  436. package/dist/tui/runner.js +36 -0
  437. package/dist/tui/runner.js.map +1 -0
  438. package/dist/tui/theme.d.ts +8 -0
  439. package/dist/tui/theme.d.ts.map +1 -0
  440. package/dist/tui/theme.js +10 -0
  441. package/dist/tui/theme.js.map +1 -0
  442. package/package.json +12 -7
package/README.md CHANGED
@@ -23,6 +23,18 @@ pnpm -C apps/cli build
23
23
  node apps/cli/dist/index.js --version
24
24
  ```
25
25
 
26
+ ## Interactive mode
27
+
28
+ Run `oxagen` with no arguments in a terminal to open the interactive TUI: an
29
+ ASCII banner and a keyboard-navigable menu of every command group and command.
30
+
31
+ - `↑/↓` move · `↵` select · `Esc` back · `q` quit · type to filter
32
+ - Selecting a command opens a form for its arguments and flags, then runs it.
33
+ - Secret inputs (passwords, tokens) are masked.
34
+
35
+ Disable it (always print help instead) with `OXAGEN_NO_TUI=1`. Non-interactive
36
+ usage — `oxagen <command> …`, pipes, and CI — is unaffected.
37
+
26
38
  ## Authentication
27
39
 
28
40
  ```bash
@@ -97,6 +109,7 @@ oxagen agent mcp list
97
109
  The Oxagen platform itself is an MCP server. Connect Claude Code, Claude Desktop, or Cursor to it using an API key.
98
110
 
99
111
  **Claude Code**
112
+
100
113
  ```bash
101
114
  oxagen api-key create # copy the key that's printed
102
115
 
@@ -107,6 +120,7 @@ claude mcp add oxagen \
107
120
  ```
108
121
 
109
122
  **Claude Desktop** — add to `claude_desktop_config.json`:
123
+
110
124
  ```json
111
125
  {
112
126
  "mcpServers": {
@@ -120,6 +134,7 @@ claude mcp add oxagen \
120
134
  ```
121
135
 
122
136
  You can also retrieve connection instructions directly:
137
+
123
138
  ```bash
124
139
  oxagen system install instructions
125
140
  ```
@@ -260,7 +275,6 @@ oxagen document create / list / read
260
275
  oxagen archive create
261
276
  oxagen asset upload
262
277
  oxagen form create / fill / submit
263
- oxagen brandkit apply
264
278
 
265
279
  oxagen org create / list
266
280
  oxagen org member add / remove / role change / invite accept / invite decline
@@ -326,12 +340,14 @@ oxagen auth login --email you@example.com --password yourpassword
326
340
  ## Troubleshooting
327
341
 
328
342
  **`command not found: oxagen`** — ensure global install succeeded:
343
+
329
344
  ```bash
330
345
  npm list -g @oxagen/cli
331
346
  npm install -g @oxagen/cli
332
347
  ```
333
348
 
334
349
  **Auth failures** — clear and re-authenticate:
350
+
335
351
  ```bash
336
352
  oxagen auth logout && oxagen auth login
337
353
  ```
@@ -340,9 +356,51 @@ oxagen auth logout && oxagen auth login
340
356
 
341
357
  ## Development
342
358
 
359
+ ### Install the `oxagen` binary onto your PATH (live, auto-rebuilding)
360
+
361
+ Run this once from the **repo root** and leave it running:
362
+
363
+ ```bash
364
+ pnpm cli:dev
365
+ ```
366
+
367
+ This builds the package, installs an `oxagen` binary onto your PATH, then watches
368
+ `apps/cli/src/**` and rebuilds on every save. After it prints `watching for
369
+ changes…`, open a second terminal and use `oxagen` like a published binary — every
370
+ source edit is live on the next invocation, with no reinstall step:
371
+
343
372
  ```bash
344
- pnpm -C apps/cli dev -- auth whoami # run from source with tsx
345
- pnpm -C apps/cli build # compile to dist/
373
+ oxagen --version
374
+ oxagen --help
375
+ oxagen auth whoami
376
+ ```
377
+
378
+ **How it works.** The installed binary is a symlink from a PATH directory
379
+ (`~/.local/bin/oxagen` when that's on your PATH) into the package's build output
380
+ (`apps/cli/dist/index.js`). `tsc --watch` rewrites `dist/` in place on every change,
381
+ and because a symlink always resolves to its target's current contents, the on-PATH
382
+ `oxagen` is always the freshly-built code — the "reinstall" is automatic.
383
+
384
+ Want a one-shot install without the watcher (build once, link, exit)?
385
+
386
+ ```bash
387
+ pnpm cli:install
388
+ ```
389
+
390
+ If `cli:dev` warns that the chosen directory isn't on your PATH, add it to your shell
391
+ profile (the script prints the exact line), e.g.:
392
+
393
+ ```bash
394
+ export PATH="$HOME/.local/bin:$PATH"
395
+ ```
396
+
397
+ To uninstall the dev binary, remove the symlink: `rm "$(command -v oxagen)"`.
398
+
399
+ ### Other workflows
400
+
401
+ ```bash
402
+ pnpm -C apps/cli dev -- auth whoami # run a single command from source with tsx
403
+ pnpm -C apps/cli build # compile to dist/ once
346
404
  pnpm -C apps/cli test:unit # run unit tests
347
405
  pnpm -C apps/cli lint # lint (zero warnings enforced)
348
406
  pnpm -C apps/cli typecheck # type-check
@@ -350,6 +408,11 @@ pnpm -C apps/cli typecheck # type-check
350
408
 
351
409
  Releases are managed monorepo-wide via `pnpm release:patch|minor|major`, which bumps all packages to the same version and syncs to Vercel.
352
410
 
411
+ ### Known gaps
412
+
413
+ See [`GAPS.md`](./GAPS.md) for the tracked completeness, capability-parity, and `--help`
414
+ documentation gaps and their prioritized fix plan.
415
+
353
416
  ---
354
417
 
355
418
  ## Support
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=code-graph.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-graph.test.d.ts","sourceRoot":"","sources":["../../../src/agent/__tests__/code-graph.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Code-graph retrieval — proves the agent can answer structural questions about
3
+ * a real on-disk project: symbol search, file-symbol listing, and (the part
4
+ * that was previously broken) import/dependent resolution for impact analysis.
5
+ */
6
+ import { describe, it, expect, beforeAll, afterAll } from "vitest";
7
+ import { promises as fs } from "node:fs";
8
+ import { tmpdir } from "node:os";
9
+ import { join } from "node:path";
10
+ import { queryCodeGraph, codeGraphStats, clearCodeGraphCache, } from "../code-graph.js";
11
+ let root = "";
12
+ beforeAll(async () => {
13
+ root = await fs.mkdtemp(join(tmpdir(), "oxagen-cg-"));
14
+ await fs.writeFile(join(root, "alpha.ts"), [
15
+ "export function computeAlpha() {",
16
+ " return 1;",
17
+ "}",
18
+ "export interface AlphaShape {",
19
+ " x: number;",
20
+ "}",
21
+ ].join("\n"));
22
+ await fs.writeFile(join(root, "beta.ts"), [
23
+ 'import { computeAlpha } from "./alpha.js";',
24
+ "export class BetaEngine {}",
25
+ "export function runBeta() {",
26
+ " return computeAlpha();",
27
+ "}",
28
+ ].join("\n"));
29
+ await fs.mkdir(join(root, "sub"), { recursive: true });
30
+ await fs.writeFile(join(root, "sub", "gamma.ts"), [
31
+ 'import { BetaEngine } from "../beta.js";',
32
+ 'export type GammaKind = "a" | "b";',
33
+ ].join("\n"));
34
+ });
35
+ afterAll(async () => {
36
+ clearCodeGraphCache();
37
+ if (root)
38
+ await fs.rm(root, { recursive: true, force: true });
39
+ });
40
+ describe("code-graph retrieval", () => {
41
+ it("search finds where a symbol is defined", async () => {
42
+ const out = await queryCodeGraph(root, "search", "computeAlpha");
43
+ expect(out).toContain("computeAlpha");
44
+ expect(out).toContain("alpha.ts");
45
+ expect(out).toContain("function");
46
+ });
47
+ it("search matches classes and is case-insensitive", async () => {
48
+ const out = await queryCodeGraph(root, "search", "betaengine");
49
+ expect(out).toContain("BetaEngine");
50
+ expect(out).toContain("class");
51
+ });
52
+ it("file_symbols lists the symbols a file defines", async () => {
53
+ const out = await queryCodeGraph(root, "file_symbols", "beta.ts");
54
+ expect(out).toContain("BetaEngine");
55
+ expect(out).toContain("runBeta");
56
+ });
57
+ it("dependents resolves who imports a file (impact analysis)", async () => {
58
+ // beta.ts imports alpha.ts → alpha's dependents include beta.ts
59
+ const alphaDeps = await queryCodeGraph(root, "dependents", "alpha.ts");
60
+ expect(alphaDeps).toContain("beta.ts");
61
+ // sub/gamma.ts imports ../beta.js → beta's dependents include sub/gamma.ts
62
+ const betaDeps = await queryCodeGraph(root, "dependents", "beta.ts");
63
+ expect(betaDeps).toContain("sub/gamma.ts");
64
+ });
65
+ it("imports resolves a file's local imports", async () => {
66
+ const betaImports = await queryCodeGraph(root, "imports", "beta.ts");
67
+ expect(betaImports).toContain("alpha.ts");
68
+ const gammaImports = await queryCodeGraph(root, "imports", "sub/gamma.ts");
69
+ expect(gammaImports).toContain("beta.ts");
70
+ });
71
+ it("reports a clear miss for unknown symbols and files", async () => {
72
+ expect(await queryCodeGraph(root, "search", "doesNotExist")).toContain("No symbols matching");
73
+ expect(await queryCodeGraph(root, "dependents", "nope.ts")).toContain("No file matching");
74
+ });
75
+ it("stats reflect the indexed fixture", async () => {
76
+ const stats = await codeGraphStats(root);
77
+ expect(stats.files).toBe(3);
78
+ // computeAlpha, AlphaShape, BetaEngine, runBeta, GammaKind
79
+ expect(stats.symbols).toBeGreaterThanOrEqual(5);
80
+ expect(stats.edges).toBeGreaterThan(0);
81
+ });
82
+ });
83
+ //# sourceMappingURL=code-graph.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-graph.test.js","sourceRoot":"","sources":["../../../src/agent/__tests__/code-graph.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=evaluator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.test.d.ts","sourceRoot":"","sources":["../../../src/agent/__tests__/evaluator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Prompt evaluator — proves the cheap front-of-pipeline call returns the model's
3
+ * structured read, clamps out-of-range scores, never drops intent to an empty
4
+ * rewrite, and degrades to a deterministic heuristic when the model call fails.
5
+ * The model call is mocked, so no gateway is touched.
6
+ */
7
+ import { describe, it, expect, beforeEach, vi } from "vitest";
8
+ vi.mock("ai", () => ({ generateObject: vi.fn() }));
9
+ vi.mock("../../lib/config.js", () => ({ readConfig: () => ({}) }));
10
+ import { generateObject } from "ai";
11
+ import { evaluatePrompt } from "../evaluator.js";
12
+ const mockGen = generateObject;
13
+ beforeEach(() => {
14
+ delete process.env["OXAGEN_LLM_EVALUATOR"];
15
+ delete process.env["OXAGEN_LLM_FAST"];
16
+ });
17
+ describe("evaluatePrompt", () => {
18
+ it("returns the model's structured evaluation on the fast tier", async () => {
19
+ mockGen.mockResolvedValueOnce({
20
+ object: {
21
+ completeness: 80,
22
+ complexity: 40,
23
+ recommendedTier: "balanced",
24
+ missing: ["which file"],
25
+ contextQueries: ["loginUser"],
26
+ refinedPrompt: "fix loginUser null check",
27
+ removed: ["please"],
28
+ reasoning: "clear ask",
29
+ },
30
+ usage: { inputTokens: 10, outputTokens: 5 },
31
+ });
32
+ const ev = await evaluatePrompt({ prompt: "please fix loginUser" });
33
+ expect(ev.fallback).toBe(false);
34
+ expect(ev.completeness).toBe(80);
35
+ expect(ev.recommendedTier).toBe("balanced");
36
+ expect(ev.contextQueries).toEqual(["loginUser"]);
37
+ expect(ev.refinedPrompt).toBe("fix loginUser null check");
38
+ expect(ev.model).toContain("haiku");
39
+ expect(ev.usage.inputTokens).toBe(10);
40
+ });
41
+ it("clamps scores into 0–100 and rounds them", async () => {
42
+ mockGen.mockResolvedValueOnce({
43
+ object: {
44
+ completeness: 150,
45
+ complexity: -20,
46
+ recommendedTier: "fast",
47
+ missing: [],
48
+ contextQueries: [],
49
+ refinedPrompt: "x",
50
+ removed: [],
51
+ reasoning: "r",
52
+ },
53
+ usage: {},
54
+ });
55
+ const ev = await evaluatePrompt({ prompt: "do x" });
56
+ expect(ev.completeness).toBe(100);
57
+ expect(ev.complexity).toBe(0);
58
+ });
59
+ it("keeps the original prompt when the model returns an empty rewrite", async () => {
60
+ mockGen.mockResolvedValueOnce({
61
+ object: {
62
+ completeness: 50,
63
+ complexity: 50,
64
+ recommendedTier: "fast",
65
+ missing: [],
66
+ contextQueries: [],
67
+ refinedPrompt: " ",
68
+ removed: [],
69
+ reasoning: "r",
70
+ },
71
+ usage: {},
72
+ });
73
+ const ev = await evaluatePrompt({ prompt: "keep me intact" });
74
+ expect(ev.refinedPrompt).toBe("keep me intact");
75
+ });
76
+ it("falls back to a heuristic when the model call throws", async () => {
77
+ mockGen.mockRejectedValueOnce(new Error("gateway down"));
78
+ const ev = await evaluatePrompt({ prompt: "implement the stripe billing refund flow" });
79
+ expect(ev.fallback).toBe(true);
80
+ // A high-stakes billing prompt routes to precise → complexity 85.
81
+ expect(ev.recommendedTier).toBe("precise");
82
+ expect(ev.complexity).toBe(85);
83
+ expect(ev.refinedPrompt).toBe("implement the stripe billing refund flow");
84
+ expect(ev.usage.costUsd).toBe(0);
85
+ });
86
+ it("heuristic completeness tracks prompt length", async () => {
87
+ mockGen.mockRejectedValue(new Error("down"));
88
+ const short = await evaluatePrompt({ prompt: "fix it" });
89
+ expect(short.completeness).toBe(45);
90
+ const long = await evaluatePrompt({
91
+ prompt: "a".repeat(200) + " refactor and debug the module thoroughly",
92
+ });
93
+ expect(long.completeness).toBe(80);
94
+ });
95
+ });
96
+ //# sourceMappingURL=evaluator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.test.js","sourceRoot":"","sources":["../../../src/agent/__tests__/evaluator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fleet-memory.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-memory.test.d.ts","sourceRoot":"","sources":["../../../src/agent/__tests__/fleet-memory.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Fleet memory — proves lessons are durably recorded as JSON Lines and that
3
+ * lexical recall ranks by term overlap, file overlap, and weight. Each test runs
4
+ * against an isolated $HOME so it never touches the developer's real store.
5
+ */
6
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
7
+ import { mkdtempSync, rmSync, writeFileSync, mkdirSync } from "node:fs";
8
+ import { tmpdir, homedir } from "node:os";
9
+ import { join } from "node:path";
10
+ import { openFleetMemory, formatLessons } from "../fleet/memory.js";
11
+ let home = "";
12
+ let prevHome = "";
13
+ const cwd = "/work/myproj";
14
+ beforeEach(() => {
15
+ prevHome = process.env["HOME"] ?? "";
16
+ home = mkdtempSync(join(tmpdir(), "oxagen-mem-home-"));
17
+ process.env["HOME"] = home;
18
+ });
19
+ afterEach(() => {
20
+ process.env["HOME"] = prevHome;
21
+ if (home)
22
+ rmSync(home, { recursive: true, force: true });
23
+ });
24
+ describe("record + all", () => {
25
+ it("persists records and reads them back newest-first", () => {
26
+ const mem = openFleetMemory(cwd);
27
+ mem.record({ kind: "routine-change", weight: "low", lesson: "first lesson", files: [], outcome: "success" });
28
+ mem.record({ kind: "gotcha", weight: "high", lesson: "second lesson", files: ["a.ts"], outcome: "failure" });
29
+ const all = mem.all();
30
+ expect(all).toHaveLength(2);
31
+ expect(all.map((r) => r.lesson)).toContain("first lesson");
32
+ expect(all.map((r) => r.lesson)).toContain("second lesson");
33
+ // ids and timestamps are assigned by the store.
34
+ expect(all.every((r) => r.id.startsWith("mem_") && r.createdAt > 0)).toBe(true);
35
+ });
36
+ it("persists across separate openFleetMemory instances (reads the file)", () => {
37
+ openFleetMemory(cwd).record({
38
+ kind: "constraint",
39
+ weight: "critical",
40
+ lesson: "keep the cache warm",
41
+ files: [],
42
+ outcome: "success",
43
+ });
44
+ const reopened = openFleetMemory(cwd);
45
+ expect(reopened.all().some((r) => r.lesson === "keep the cache warm")).toBe(true);
46
+ });
47
+ it("HOME isolation actually points the store under the temp home", () => {
48
+ expect(homedir()).toBe(home);
49
+ });
50
+ });
51
+ describe("recall", () => {
52
+ it("ranks by term overlap and ignores irrelevant lessons", () => {
53
+ const mem = openFleetMemory(cwd);
54
+ mem.record({ kind: "bug-root-cause", weight: "low", lesson: "the parser drops the final token", files: ["parser.ts"], outcome: "success" });
55
+ mem.record({ kind: "routine-change", weight: "low", lesson: "stylesheet needs a vendor prefix", files: ["style.css"], outcome: "success" });
56
+ const hits = mem.recall("why does the parser lose a token");
57
+ expect(hits.length).toBeGreaterThanOrEqual(1);
58
+ expect(hits[0]?.lesson).toContain("parser");
59
+ expect(hits.some((h) => h.files.includes("style.css"))).toBe(false);
60
+ });
61
+ it("weights file overlap above term overlap", () => {
62
+ const mem = openFleetMemory(cwd);
63
+ mem.record({ kind: "gotcha", weight: "low", lesson: "unrelated words entirely", files: ["target.ts"], outcome: "success" });
64
+ mem.record({ kind: "gotcha", weight: "low", lesson: "the target logic is fragile", files: ["other.ts"], outcome: "success" });
65
+ // Query term "target" hits the second lesson's text, but the file filter
66
+ // matches the first lesson's file — and file overlap is weighted higher.
67
+ const hits = mem.recall("target", { files: ["target.ts"] });
68
+ expect(hits[0]?.files).toEqual(["target.ts"]);
69
+ });
70
+ it("returns nothing when there is no overlap", () => {
71
+ const mem = openFleetMemory(cwd);
72
+ mem.record({ kind: "gotcha", weight: "low", lesson: "alpha beta gamma", files: [], outcome: "success" });
73
+ expect(mem.recall("zzz qqq xxx")).toHaveLength(0);
74
+ });
75
+ it("tolerates a corrupt line already on disk", () => {
76
+ const dir = join(home, ".config", "oxagen", "memories");
77
+ mkdirSync(dir, { recursive: true });
78
+ const good = {
79
+ id: "mem_x",
80
+ createdAt: 1,
81
+ kind: "gotcha",
82
+ weight: "high",
83
+ lesson: "real lesson about widgets",
84
+ files: [],
85
+ outcome: "success",
86
+ };
87
+ writeFileSync(join(dir, "myproj.jsonl"), `not json\n${JSON.stringify(good)}\n`, "utf8");
88
+ const mem = openFleetMemory(cwd);
89
+ expect(mem.recall("widgets")[0]?.lesson).toBe("real lesson about widgets");
90
+ });
91
+ });
92
+ describe("formatLessons", () => {
93
+ it("marks weight and lists files", () => {
94
+ const records = [
95
+ { id: "1", createdAt: 1, kind: "constraint", weight: "critical", lesson: "A", files: ["x.ts"], outcome: "success" },
96
+ { id: "2", createdAt: 2, kind: "gotcha", weight: "high", lesson: "B", files: [], outcome: "success" },
97
+ { id: "3", createdAt: 3, kind: "routine-change", weight: "low", lesson: "C", files: [], outcome: "success" },
98
+ ];
99
+ const out = formatLessons(records);
100
+ expect(out).toContain("‼");
101
+ expect(out).toContain("!");
102
+ expect(out).toContain("·");
103
+ expect(out).toContain("[x.ts]");
104
+ expect(formatLessons([])).toBe("");
105
+ });
106
+ });
107
+ //# sourceMappingURL=fleet-memory.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-memory.test.js","sourceRoot":"","sources":["../../../src/agent/__tests__/fleet-memory.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fleet-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-store.test.d.ts","sourceRoot":"","sources":["../../../src/agent/__tests__/fleet-store.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Plan store — proves plans and their tasks round-trip to disk, that re-saving a
3
+ * plan replaces rather than duplicates it, and that history is bounded. Isolated
4
+ * to a temp $HOME.
5
+ */
6
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
7
+ import { mkdtempSync, rmSync } from "node:fs";
8
+ import { tmpdir } from "node:os";
9
+ import { join } from "node:path";
10
+ import { openPlanStore } from "../fleet/store.js";
11
+ import { emptyUsage } from "../fleet/types.js";
12
+ let home = "";
13
+ let prevHome = "";
14
+ const cwd = "/work/myproj";
15
+ function task(id, over = {}) {
16
+ return {
17
+ id,
18
+ title: id,
19
+ description: id,
20
+ status: "queued",
21
+ dependsOn: [],
22
+ files: [],
23
+ tier: "balanced",
24
+ model: "anthropic/claude-sonnet-4.6",
25
+ createdAt: 1,
26
+ usage: emptyUsage(),
27
+ ...over,
28
+ };
29
+ }
30
+ function plan(id, tasks) {
31
+ return { id, goal: `goal ${id}`, createdAt: 1, tasks, status: "draft" };
32
+ }
33
+ beforeEach(() => {
34
+ prevHome = process.env["HOME"] ?? "";
35
+ home = mkdtempSync(join(tmpdir(), "oxagen-store-home-"));
36
+ process.env["HOME"] = home;
37
+ });
38
+ afterEach(() => {
39
+ process.env["HOME"] = prevHome;
40
+ if (home)
41
+ rmSync(home, { recursive: true, force: true });
42
+ });
43
+ describe("openPlanStore", () => {
44
+ it("returns empty results before anything is saved", () => {
45
+ const store = openPlanStore(cwd);
46
+ expect(store.list()).toEqual([]);
47
+ expect(store.get("nope")).toBeUndefined();
48
+ });
49
+ it("saves and reads a plan back", () => {
50
+ const store = openPlanStore(cwd);
51
+ const p = plan("p1", [task("a"), task("b")]);
52
+ store.save(p);
53
+ expect(store.get("p1")?.goal).toBe("goal p1");
54
+ expect(store.list()).toHaveLength(1);
55
+ });
56
+ it("replaces a plan on re-save instead of duplicating", () => {
57
+ const store = openPlanStore(cwd);
58
+ store.save(plan("p1", [task("a")]));
59
+ store.save(plan("p1", [task("a"), task("b")]));
60
+ expect(store.list()).toHaveLength(1);
61
+ expect(store.get("p1")?.tasks).toHaveLength(2);
62
+ });
63
+ it("updates a single task in place", () => {
64
+ const store = openPlanStore(cwd);
65
+ store.save(plan("p1", [task("a"), task("b")]));
66
+ store.updateTask("p1", task("a", { status: "done", summary: "did it" }));
67
+ const got = store.get("p1");
68
+ expect(got?.tasks.find((t) => t.id === "a")?.status).toBe("done");
69
+ expect(got?.tasks.find((t) => t.id === "b")?.status).toBe("queued");
70
+ });
71
+ it("sets a plan's lifecycle status", () => {
72
+ const store = openPlanStore(cwd);
73
+ store.save(plan("p1", [task("a")]));
74
+ store.setStatus("p1", "completed");
75
+ expect(store.get("p1")?.status).toBe("completed");
76
+ });
77
+ it("no-ops on updateTask/setStatus for an unknown plan", () => {
78
+ const store = openPlanStore(cwd);
79
+ expect(() => store.updateTask("ghost", task("a"))).not.toThrow();
80
+ expect(() => store.setStatus("ghost", "failed")).not.toThrow();
81
+ });
82
+ it("bounds stored history to the 50 most recent plans", () => {
83
+ const store = openPlanStore(cwd);
84
+ for (let i = 0; i < 55; i++)
85
+ store.save(plan(`p${i}`, [task("a")]));
86
+ const list = store.list();
87
+ expect(list).toHaveLength(50);
88
+ // Newest first: p54 present, the earliest plans evicted.
89
+ expect(list[0]?.id).toBe("p54");
90
+ expect(list.some((p) => p.id === "p0")).toBe(false);
91
+ });
92
+ });
93
+ //# sourceMappingURL=fleet-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-store.test.js","sourceRoot":"","sources":["../../../src/agent/__tests__/fleet-store.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=git-isolation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-isolation.test.d.ts","sourceRoot":"","sources":["../../../src/agent/__tests__/git-isolation.test.ts"],"names":[],"mappings":""}