@proletariat/cli 0.2.0 → 0.3.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 (526) hide show
  1. package/README.md +512 -253
  2. package/bin/dev.cmd +3 -0
  3. package/bin/dev.js +5 -0
  4. package/bin/run.cmd +3 -0
  5. package/bin/run.js +23 -0
  6. package/dist/commands/action/create.d.ts +21 -0
  7. package/dist/commands/action/create.js +126 -0
  8. package/dist/commands/action/delete.d.ts +17 -0
  9. package/dist/commands/action/delete.js +78 -0
  10. package/dist/commands/action/index.d.ts +15 -0
  11. package/dist/commands/action/index.js +107 -0
  12. package/dist/commands/action/list.d.ts +14 -0
  13. package/dist/commands/action/list.js +89 -0
  14. package/dist/commands/action/run.d.ts +19 -0
  15. package/dist/commands/action/run.js +179 -0
  16. package/dist/commands/action/show.d.ts +15 -0
  17. package/dist/commands/action/show.js +47 -0
  18. package/dist/commands/action/update.d.ts +22 -0
  19. package/dist/commands/action/update.js +168 -0
  20. package/dist/commands/agent/index.d.ts +13 -0
  21. package/dist/commands/agent/index.js +131 -0
  22. package/dist/commands/agent/list.d.ts +7 -0
  23. package/dist/commands/agent/list.js +126 -0
  24. package/dist/commands/agent/login.d.ts +16 -0
  25. package/dist/commands/agent/login.js +146 -0
  26. package/dist/commands/agent/rebuild.d.ts +18 -0
  27. package/dist/commands/agent/rebuild.js +133 -0
  28. package/dist/commands/agent/restart.d.ts +17 -0
  29. package/dist/commands/agent/restart.js +116 -0
  30. package/dist/commands/agent/shell.d.ts +23 -0
  31. package/dist/commands/agent/shell.js +378 -0
  32. package/dist/commands/agent/staff/add.d.ts +15 -0
  33. package/dist/commands/agent/staff/add.js +281 -0
  34. package/dist/commands/agent/staff/index.d.ts +14 -0
  35. package/dist/commands/agent/staff/index.js +90 -0
  36. package/dist/commands/agent/staff/list.d.ts +7 -0
  37. package/dist/commands/agent/staff/list.js +90 -0
  38. package/dist/commands/agent/staff/remove.d.ts +16 -0
  39. package/dist/commands/agent/staff/remove.js +137 -0
  40. package/dist/commands/agent/status.d.ts +17 -0
  41. package/dist/commands/agent/status.js +139 -0
  42. package/dist/commands/agent/temp/cleanup.d.ts +23 -0
  43. package/dist/commands/agent/temp/cleanup.js +388 -0
  44. package/dist/commands/agent/temp/index.d.ts +14 -0
  45. package/dist/commands/agent/temp/index.js +82 -0
  46. package/dist/commands/agent/temp/list.d.ts +7 -0
  47. package/dist/commands/agent/temp/list.js +108 -0
  48. package/dist/commands/agent/themes/add-names.d.ts +10 -0
  49. package/dist/commands/agent/themes/add-names.js +67 -0
  50. package/dist/commands/agent/themes/create.d.ts +13 -0
  51. package/dist/commands/agent/themes/create.js +66 -0
  52. package/dist/commands/agent/themes/index.d.ts +9 -0
  53. package/dist/commands/agent/themes/index.js +194 -0
  54. package/dist/commands/agent/themes/list.d.ts +6 -0
  55. package/dist/commands/agent/themes/list.js +41 -0
  56. package/dist/commands/agent/themes/set.d.ts +12 -0
  57. package/dist/commands/agent/themes/set.js +77 -0
  58. package/dist/commands/agent/visit.d.ts +16 -0
  59. package/dist/commands/agent/visit.js +88 -0
  60. package/dist/commands/autocomplete/setup.d.ts +14 -0
  61. package/dist/commands/autocomplete/setup.js +154 -0
  62. package/dist/commands/board/index.d.ts +17 -0
  63. package/dist/commands/board/index.js +255 -0
  64. package/dist/commands/board/watch.d.ts +13 -0
  65. package/dist/commands/board/watch.js +52 -0
  66. package/dist/commands/branch/create.d.ts +50 -0
  67. package/dist/commands/branch/create.js +624 -0
  68. package/dist/commands/branch/index.d.ts +13 -0
  69. package/dist/commands/branch/index.js +50 -0
  70. package/dist/commands/branch/list.d.ts +17 -0
  71. package/dist/commands/branch/list.js +120 -0
  72. package/dist/commands/branch/validate.d.ts +15 -0
  73. package/dist/commands/branch/validate.js +73 -0
  74. package/dist/commands/commit.d.ts +71 -0
  75. package/dist/commands/commit.js +499 -0
  76. package/dist/commands/docker/clean.d.ts +13 -0
  77. package/dist/commands/docker/clean.js +224 -0
  78. package/dist/commands/docker/index.d.ts +19 -0
  79. package/dist/commands/docker/index.js +274 -0
  80. package/dist/commands/docker/list.d.ts +16 -0
  81. package/dist/commands/docker/list.js +200 -0
  82. package/dist/commands/docker/logs.d.ts +14 -0
  83. package/dist/commands/docker/logs.js +118 -0
  84. package/dist/commands/docker/prune.d.ts +14 -0
  85. package/dist/commands/docker/prune.js +211 -0
  86. package/dist/commands/docker/restart.d.ts +14 -0
  87. package/dist/commands/docker/restart.js +129 -0
  88. package/dist/commands/docker/shell.d.ts +14 -0
  89. package/dist/commands/docker/shell.js +103 -0
  90. package/dist/commands/docker/start.d.ts +12 -0
  91. package/dist/commands/docker/start.js +92 -0
  92. package/dist/commands/docker/status.d.ts +7 -0
  93. package/dist/commands/docker/status.js +40 -0
  94. package/dist/commands/docker/stop.d.ts +14 -0
  95. package/dist/commands/docker/stop.js +134 -0
  96. package/dist/commands/docker/sync.d.ts +15 -0
  97. package/dist/commands/docker/sync.js +112 -0
  98. package/dist/commands/epic/activate.d.ts +13 -0
  99. package/dist/commands/epic/activate.js +118 -0
  100. package/dist/commands/epic/archive.d.ts +14 -0
  101. package/dist/commands/epic/archive.js +132 -0
  102. package/dist/commands/epic/create.d.ts +15 -0
  103. package/dist/commands/epic/create.js +137 -0
  104. package/dist/commands/epic/index.d.ts +13 -0
  105. package/dist/commands/epic/index.js +88 -0
  106. package/dist/commands/epic/link/block.d.ts +14 -0
  107. package/dist/commands/epic/link/block.js +79 -0
  108. package/dist/commands/epic/link/duplicates.d.ts +14 -0
  109. package/dist/commands/epic/link/duplicates.js +66 -0
  110. package/dist/commands/epic/link/index.d.ts +19 -0
  111. package/dist/commands/epic/link/index.js +242 -0
  112. package/dist/commands/epic/link/relates.d.ts +14 -0
  113. package/dist/commands/epic/link/relates.js +66 -0
  114. package/dist/commands/epic/link/remove.d.ts +16 -0
  115. package/dist/commands/epic/link/remove.js +89 -0
  116. package/dist/commands/epic/list.d.ts +11 -0
  117. package/dist/commands/epic/list.js +87 -0
  118. package/dist/commands/epic/move.d.ts +15 -0
  119. package/dist/commands/epic/move.js +184 -0
  120. package/dist/commands/epic/progress.d.ts +16 -0
  121. package/dist/commands/epic/progress.js +166 -0
  122. package/dist/commands/epic/project.d.ts +15 -0
  123. package/dist/commands/epic/project.js +219 -0
  124. package/dist/commands/epic/reorder.d.ts +21 -0
  125. package/dist/commands/epic/reorder.js +160 -0
  126. package/dist/commands/epic/spec.d.ts +15 -0
  127. package/dist/commands/epic/spec.js +191 -0
  128. package/dist/commands/epic/ticket.d.ts +18 -0
  129. package/dist/commands/epic/ticket.js +291 -0
  130. package/dist/commands/epic/view.d.ts +13 -0
  131. package/dist/commands/epic/view.js +117 -0
  132. package/dist/commands/execution/index.d.ts +13 -0
  133. package/dist/commands/execution/index.js +70 -0
  134. package/dist/commands/execution/list.d.ts +15 -0
  135. package/dist/commands/execution/list.js +144 -0
  136. package/dist/commands/execution/logs.d.ts +18 -0
  137. package/dist/commands/execution/logs.js +161 -0
  138. package/dist/commands/execution/stop.d.ts +22 -0
  139. package/dist/commands/execution/stop.js +248 -0
  140. package/dist/commands/gh/index.d.ts +9 -0
  141. package/dist/commands/gh/index.js +53 -0
  142. package/dist/commands/gh/login.d.ts +6 -0
  143. package/dist/commands/gh/login.js +57 -0
  144. package/dist/commands/gh/status.d.ts +6 -0
  145. package/dist/commands/gh/status.js +48 -0
  146. package/dist/commands/gh/token.d.ts +6 -0
  147. package/dist/commands/gh/token.js +59 -0
  148. package/dist/commands/init.d.ts +26 -0
  149. package/dist/commands/init.js +200 -0
  150. package/dist/commands/phase/create.d.ts +22 -0
  151. package/dist/commands/phase/create.js +123 -0
  152. package/dist/commands/phase/delete.d.ts +17 -0
  153. package/dist/commands/phase/delete.js +73 -0
  154. package/dist/commands/phase/list.d.ts +12 -0
  155. package/dist/commands/phase/list.js +76 -0
  156. package/dist/commands/phase/move.d.ts +17 -0
  157. package/dist/commands/phase/move.js +115 -0
  158. package/dist/commands/phase/template/apply.d.ts +17 -0
  159. package/dist/commands/phase/template/apply.js +106 -0
  160. package/dist/commands/phase/template/create.d.ts +16 -0
  161. package/dist/commands/phase/template/create.js +58 -0
  162. package/dist/commands/phase/template/delete.d.ts +17 -0
  163. package/dist/commands/phase/template/delete.js +98 -0
  164. package/dist/commands/phase/template/index.d.ts +15 -0
  165. package/dist/commands/phase/template/index.js +128 -0
  166. package/dist/commands/phase/template/list.d.ts +16 -0
  167. package/dist/commands/phase/template/list.js +95 -0
  168. package/dist/commands/phase/template/update.d.ts +17 -0
  169. package/dist/commands/phase/template/update.js +89 -0
  170. package/dist/commands/phase/update.d.ts +23 -0
  171. package/dist/commands/phase/update.js +174 -0
  172. package/dist/commands/pmo/init.d.ts +25 -0
  173. package/dist/commands/pmo/init.js +341 -0
  174. package/dist/commands/pr/create.d.ts +17 -0
  175. package/dist/commands/pr/create.js +242 -0
  176. package/dist/commands/pr/index.d.ts +9 -0
  177. package/dist/commands/pr/index.js +68 -0
  178. package/dist/commands/pr/link.d.ts +14 -0
  179. package/dist/commands/pr/link.js +212 -0
  180. package/dist/commands/pr/status.d.ts +12 -0
  181. package/dist/commands/pr/status.js +161 -0
  182. package/dist/commands/project/archive.d.ts +17 -0
  183. package/dist/commands/project/archive.js +83 -0
  184. package/dist/commands/project/create.d.ts +22 -0
  185. package/dist/commands/project/create.js +143 -0
  186. package/dist/commands/project/delete.d.ts +17 -0
  187. package/dist/commands/project/delete.js +128 -0
  188. package/dist/commands/project/index.d.ts +13 -0
  189. package/dist/commands/project/index.js +64 -0
  190. package/dist/commands/project/list.d.ts +14 -0
  191. package/dist/commands/project/list.js +96 -0
  192. package/dist/commands/project/spec.d.ts +18 -0
  193. package/dist/commands/project/spec.js +216 -0
  194. package/dist/commands/project/unarchive.d.ts +15 -0
  195. package/dist/commands/project/unarchive.js +35 -0
  196. package/dist/commands/project/view.d.ts +16 -0
  197. package/dist/commands/project/view.js +94 -0
  198. package/dist/commands/repo/add.d.ts +21 -0
  199. package/dist/commands/repo/add.js +118 -0
  200. package/dist/commands/repo/index.d.ts +13 -0
  201. package/dist/commands/repo/index.js +114 -0
  202. package/dist/commands/repo/list.d.ts +13 -0
  203. package/dist/commands/repo/list.js +96 -0
  204. package/dist/commands/repo/remove.d.ts +23 -0
  205. package/dist/commands/repo/remove.js +217 -0
  206. package/dist/commands/repo/view.d.ts +15 -0
  207. package/dist/commands/repo/view.js +99 -0
  208. package/dist/commands/session/attach.d.ts +40 -0
  209. package/dist/commands/session/attach.js +307 -0
  210. package/dist/commands/session/index.d.ts +13 -0
  211. package/dist/commands/session/index.js +64 -0
  212. package/dist/commands/session/list.d.ts +21 -0
  213. package/dist/commands/session/list.js +181 -0
  214. package/dist/commands/spec/create.d.ts +19 -0
  215. package/dist/commands/spec/create.js +130 -0
  216. package/dist/commands/spec/index.d.ts +13 -0
  217. package/dist/commands/spec/index.js +68 -0
  218. package/dist/commands/spec/link/depends.d.ts +14 -0
  219. package/dist/commands/spec/link/depends.js +64 -0
  220. package/dist/commands/spec/link/duplicates.d.ts +14 -0
  221. package/dist/commands/spec/link/duplicates.js +63 -0
  222. package/dist/commands/spec/link/index.d.ts +19 -0
  223. package/dist/commands/spec/link/index.js +200 -0
  224. package/dist/commands/spec/link/relates.d.ts +14 -0
  225. package/dist/commands/spec/link/relates.js +63 -0
  226. package/dist/commands/spec/link/remove.d.ts +16 -0
  227. package/dist/commands/spec/link/remove.js +94 -0
  228. package/dist/commands/spec/list.d.ts +12 -0
  229. package/dist/commands/spec/list.js +75 -0
  230. package/dist/commands/spec/plan.d.ts +15 -0
  231. package/dist/commands/spec/plan.js +108 -0
  232. package/dist/commands/spec/ticket.d.ts +18 -0
  233. package/dist/commands/spec/ticket.js +160 -0
  234. package/dist/commands/spec/view.d.ts +15 -0
  235. package/dist/commands/spec/view.js +163 -0
  236. package/dist/commands/status/create.d.ts +21 -0
  237. package/dist/commands/status/create.js +140 -0
  238. package/dist/commands/status/delete.d.ts +13 -0
  239. package/dist/commands/status/delete.js +77 -0
  240. package/dist/commands/status/index.d.ts +14 -0
  241. package/dist/commands/status/index.js +91 -0
  242. package/dist/commands/status/list.d.ts +12 -0
  243. package/dist/commands/status/list.js +93 -0
  244. package/dist/commands/status/move.d.ts +14 -0
  245. package/dist/commands/status/move.js +120 -0
  246. package/dist/commands/status/update.d.ts +20 -0
  247. package/dist/commands/status/update.js +180 -0
  248. package/dist/commands/template/delete.d.ts +15 -0
  249. package/dist/commands/template/delete.js +142 -0
  250. package/dist/commands/template/index.d.ts +10 -0
  251. package/dist/commands/template/index.js +64 -0
  252. package/dist/commands/template/list.d.ts +18 -0
  253. package/dist/commands/template/list.js +157 -0
  254. package/dist/commands/template/phase/apply.d.ts +14 -0
  255. package/dist/commands/template/phase/apply.js +41 -0
  256. package/dist/commands/template/phase/create.d.ts +12 -0
  257. package/dist/commands/template/phase/create.js +29 -0
  258. package/dist/commands/template/phase/delete.d.ts +13 -0
  259. package/dist/commands/template/phase/delete.js +34 -0
  260. package/dist/commands/template/phase/index.d.ts +10 -0
  261. package/dist/commands/template/phase/index.js +62 -0
  262. package/dist/commands/template/phase/list.d.ts +11 -0
  263. package/dist/commands/template/phase/list.js +34 -0
  264. package/dist/commands/template/phase/update.d.ts +13 -0
  265. package/dist/commands/template/phase/update.js +35 -0
  266. package/dist/commands/template/ticket/apply.d.ts +17 -0
  267. package/dist/commands/template/ticket/apply.js +58 -0
  268. package/dist/commands/template/ticket/delete.d.ts +13 -0
  269. package/dist/commands/template/ticket/delete.js +34 -0
  270. package/dist/commands/template/ticket/index.d.ts +10 -0
  271. package/dist/commands/template/ticket/index.js +62 -0
  272. package/dist/commands/template/ticket/list.d.ts +11 -0
  273. package/dist/commands/template/ticket/list.js +34 -0
  274. package/dist/commands/template/ticket/save.d.ts +13 -0
  275. package/dist/commands/template/ticket/save.js +35 -0
  276. package/dist/commands/ticket/bulk.d.ts +13 -0
  277. package/dist/commands/ticket/bulk.js +145 -0
  278. package/dist/commands/ticket/complete.d.ts +16 -0
  279. package/dist/commands/ticket/complete.js +170 -0
  280. package/dist/commands/ticket/create.d.ts +22 -0
  281. package/dist/commands/ticket/create.js +390 -0
  282. package/dist/commands/ticket/delete.d.ts +16 -0
  283. package/dist/commands/ticket/delete.js +178 -0
  284. package/dist/commands/ticket/edit.d.ts +27 -0
  285. package/dist/commands/ticket/edit.js +322 -0
  286. package/dist/commands/ticket/epic.d.ts +20 -0
  287. package/dist/commands/ticket/epic.js +333 -0
  288. package/dist/commands/ticket/index.d.ts +13 -0
  289. package/dist/commands/ticket/index.js +103 -0
  290. package/dist/commands/ticket/link/block.d.ts +14 -0
  291. package/dist/commands/ticket/link/block.js +94 -0
  292. package/dist/commands/ticket/link/duplicates.d.ts +14 -0
  293. package/dist/commands/ticket/link/duplicates.js +93 -0
  294. package/dist/commands/ticket/link/index.d.ts +19 -0
  295. package/dist/commands/ticket/link/index.js +239 -0
  296. package/dist/commands/ticket/link/relates.d.ts +14 -0
  297. package/dist/commands/ticket/link/relates.js +93 -0
  298. package/dist/commands/ticket/link/remove.d.ts +16 -0
  299. package/dist/commands/ticket/link/remove.js +128 -0
  300. package/dist/commands/ticket/list.d.ts +24 -0
  301. package/dist/commands/ticket/list.js +431 -0
  302. package/dist/commands/ticket/move.d.ts +18 -0
  303. package/dist/commands/ticket/move.js +212 -0
  304. package/dist/commands/ticket/project.d.ts +18 -0
  305. package/dist/commands/ticket/project.js +254 -0
  306. package/dist/commands/ticket/reassign.d.ts +19 -0
  307. package/dist/commands/ticket/reassign.js +279 -0
  308. package/dist/commands/ticket/spec.d.ts +18 -0
  309. package/dist/commands/ticket/spec.js +259 -0
  310. package/dist/commands/ticket/status.d.ts +13 -0
  311. package/dist/commands/ticket/status.js +87 -0
  312. package/dist/commands/ticket/template/apply.d.ts +25 -0
  313. package/dist/commands/ticket/template/apply.js +249 -0
  314. package/dist/commands/ticket/template/create.d.ts +19 -0
  315. package/dist/commands/ticket/template/create.js +210 -0
  316. package/dist/commands/ticket/template/delete.d.ts +17 -0
  317. package/dist/commands/ticket/template/delete.js +92 -0
  318. package/dist/commands/ticket/template/index.d.ts +15 -0
  319. package/dist/commands/ticket/template/index.js +118 -0
  320. package/dist/commands/ticket/template/list.d.ts +16 -0
  321. package/dist/commands/ticket/template/list.js +110 -0
  322. package/dist/commands/ticket/template/save.d.ts +14 -0
  323. package/dist/commands/ticket/template/save.js +110 -0
  324. package/dist/commands/ticket/update.d.ts +18 -0
  325. package/dist/commands/ticket/update.js +325 -0
  326. package/dist/commands/ticket/view.d.ts +13 -0
  327. package/dist/commands/ticket/view.js +80 -0
  328. package/dist/commands/whoami.d.ts +9 -0
  329. package/dist/commands/whoami.js +103 -0
  330. package/dist/commands/work/complete.d.ts +13 -0
  331. package/dist/commands/work/complete.js +121 -0
  332. package/dist/commands/work/index.d.ts +13 -0
  333. package/dist/commands/work/index.js +70 -0
  334. package/dist/commands/work/ready.d.ts +24 -0
  335. package/dist/commands/work/ready.js +290 -0
  336. package/dist/commands/work/revise.d.ts +19 -0
  337. package/dist/commands/work/revise.js +377 -0
  338. package/dist/commands/work/spawn-all.d.ts +17 -0
  339. package/dist/commands/work/spawn-all.js +58 -0
  340. package/dist/commands/work/spawn.d.ts +29 -0
  341. package/dist/commands/work/spawn.js +728 -0
  342. package/dist/commands/work/start.d.ts +39 -0
  343. package/dist/commands/work/start.js +1393 -0
  344. package/dist/commands/work/watch.d.ts +31 -0
  345. package/dist/commands/work/watch.js +359 -0
  346. package/dist/commands/workflow/create.d.ts +18 -0
  347. package/dist/commands/workflow/create.js +119 -0
  348. package/dist/commands/workflow/delete.d.ts +17 -0
  349. package/dist/commands/workflow/delete.js +119 -0
  350. package/dist/commands/workflow/index.d.ts +15 -0
  351. package/dist/commands/workflow/index.js +75 -0
  352. package/dist/commands/workflow/list.d.ts +15 -0
  353. package/dist/commands/workflow/list.js +75 -0
  354. package/dist/commands/workflow/switch.d.ts +13 -0
  355. package/dist/commands/workflow/switch.js +117 -0
  356. package/dist/commands/workflow/view.d.ts +16 -0
  357. package/dist/commands/workflow/view.js +114 -0
  358. package/dist/commands/workspace/add.d.ts +12 -0
  359. package/dist/commands/workspace/add.js +74 -0
  360. package/dist/commands/workspace/list.d.ts +9 -0
  361. package/dist/commands/workspace/list.js +153 -0
  362. package/dist/commands/workspace/remove.d.ts +13 -0
  363. package/dist/commands/workspace/remove.js +98 -0
  364. package/dist/commands/workspace/use.d.ts +12 -0
  365. package/dist/commands/workspace/use.js +111 -0
  366. package/dist/hooks/init.d.ts +11 -0
  367. package/dist/hooks/init.js +57 -0
  368. package/dist/index.d.ts +1 -0
  369. package/dist/index.js +1 -0
  370. package/dist/lib/agents/commands.d.ts +189 -0
  371. package/dist/lib/agents/commands.js +893 -0
  372. package/dist/lib/agents/index.d.ts +54 -0
  373. package/dist/lib/agents/index.js +382 -0
  374. package/dist/lib/branch/index.d.ts +120 -0
  375. package/dist/lib/branch/index.js +334 -0
  376. package/dist/lib/colors.d.ts +94 -0
  377. package/dist/lib/colors.js +68 -0
  378. package/dist/lib/commands/docker-command.d.ts +21 -0
  379. package/dist/lib/commands/docker-command.js +27 -0
  380. package/dist/lib/database/index.d.ts +176 -0
  381. package/dist/lib/database/index.js +581 -0
  382. package/dist/lib/docker/resolve.d.ts +38 -0
  383. package/dist/lib/docker/resolve.js +175 -0
  384. package/dist/lib/execution/config.d.ts +150 -0
  385. package/dist/lib/execution/config.js +541 -0
  386. package/dist/lib/execution/devcontainer.d.ts +85 -0
  387. package/dist/lib/execution/devcontainer.js +594 -0
  388. package/dist/lib/execution/index.d.ts +10 -0
  389. package/dist/lib/execution/index.js +10 -0
  390. package/dist/lib/execution/runners.d.ts +53 -0
  391. package/dist/lib/execution/runners.js +1182 -0
  392. package/dist/lib/execution/spawner.d.ts +85 -0
  393. package/dist/lib/execution/spawner.js +548 -0
  394. package/dist/lib/execution/storage.d.ts +159 -0
  395. package/dist/lib/execution/storage.js +425 -0
  396. package/dist/lib/execution/types.d.ts +145 -0
  397. package/dist/lib/execution/types.js +157 -0
  398. package/dist/lib/init/index.d.ts +75 -0
  399. package/dist/lib/init/index.js +355 -0
  400. package/dist/lib/machine-config.d.ts +170 -0
  401. package/dist/lib/machine-config.js +386 -0
  402. package/dist/lib/pmo/base-command.d.ts +195 -0
  403. package/dist/lib/pmo/base-command.js +319 -0
  404. package/dist/lib/pmo/create-spec-folders.d.ts +43 -0
  405. package/dist/lib/pmo/create-spec-folders.js +64 -0
  406. package/dist/lib/pmo/epic-files.d.ts +56 -0
  407. package/dist/lib/pmo/epic-files.js +195 -0
  408. package/dist/lib/pmo/find-pmo.d.ts +14 -0
  409. package/dist/lib/pmo/find-pmo.js +172 -0
  410. package/dist/lib/pmo/index.d.ts +109 -0
  411. package/dist/lib/pmo/index.js +501 -0
  412. package/dist/lib/pmo/markdown.d.ts +31 -0
  413. package/dist/lib/pmo/markdown.js +245 -0
  414. package/dist/lib/pmo/pmo-context.d.ts +27 -0
  415. package/dist/lib/pmo/pmo-context.js +44 -0
  416. package/dist/lib/pmo/schema.d.ts +82 -0
  417. package/dist/lib/pmo/schema.js +531 -0
  418. package/dist/lib/pmo/spec-parser.d.ts +25 -0
  419. package/dist/lib/pmo/spec-parser.js +205 -0
  420. package/dist/lib/pmo/spec-types.d.ts +43 -0
  421. package/dist/lib/pmo/spec-types.js +7 -0
  422. package/dist/lib/pmo/storage/actions.d.ts +34 -0
  423. package/dist/lib/pmo/storage/actions.js +177 -0
  424. package/dist/lib/pmo/storage/base.d.ts +47 -0
  425. package/dist/lib/pmo/storage/base.js +858 -0
  426. package/dist/lib/pmo/storage/dependencies.d.ts +61 -0
  427. package/dist/lib/pmo/storage/dependencies.js +267 -0
  428. package/dist/lib/pmo/storage/epics.d.ts +46 -0
  429. package/dist/lib/pmo/storage/epics.js +243 -0
  430. package/dist/lib/pmo/storage/helpers.d.ts +33 -0
  431. package/dist/lib/pmo/storage/helpers.js +148 -0
  432. package/dist/lib/pmo/storage/index.d.ts +186 -0
  433. package/dist/lib/pmo/storage/index.js +689 -0
  434. package/dist/lib/pmo/storage/phases.d.ts +65 -0
  435. package/dist/lib/pmo/storage/phases.js +392 -0
  436. package/dist/lib/pmo/storage/projects.d.ts +79 -0
  437. package/dist/lib/pmo/storage/projects.js +303 -0
  438. package/dist/lib/pmo/storage/specs.d.ts +77 -0
  439. package/dist/lib/pmo/storage/specs.js +389 -0
  440. package/dist/lib/pmo/storage/statuses.d.ts +63 -0
  441. package/dist/lib/pmo/storage/statuses.js +404 -0
  442. package/dist/lib/pmo/storage/subtasks.d.ts +37 -0
  443. package/dist/lib/pmo/storage/subtasks.js +184 -0
  444. package/dist/lib/pmo/storage/templates.d.ts +40 -0
  445. package/dist/lib/pmo/storage/templates.js +210 -0
  446. package/dist/lib/pmo/storage/tickets.d.ts +57 -0
  447. package/dist/lib/pmo/storage/tickets.js +453 -0
  448. package/dist/lib/pmo/storage/types.d.ts +200 -0
  449. package/dist/lib/pmo/storage/types.js +5 -0
  450. package/dist/lib/pmo/storage/views.d.ts +44 -0
  451. package/dist/lib/pmo/storage/views.js +355 -0
  452. package/dist/lib/pmo/storage-sqlite.d.ts +7 -0
  453. package/dist/lib/pmo/storage-sqlite.js +7 -0
  454. package/dist/lib/pmo/sync-manager.d.ts +92 -0
  455. package/dist/lib/pmo/sync-manager.js +229 -0
  456. package/dist/lib/pmo/types.d.ts +710 -0
  457. package/dist/lib/pmo/types.js +108 -0
  458. package/dist/lib/pmo/utils.d.ts +122 -0
  459. package/dist/lib/pmo/utils.js +174 -0
  460. package/dist/lib/pmo/watcher.d.ts +43 -0
  461. package/dist/lib/pmo/watcher.js +208 -0
  462. package/dist/lib/pr/index.d.ts +150 -0
  463. package/dist/lib/pr/index.js +483 -0
  464. package/dist/lib/prompt-json.d.ts +231 -0
  465. package/dist/lib/prompt-json.js +213 -0
  466. package/dist/lib/repos/index.d.ts +81 -0
  467. package/dist/lib/repos/index.js +679 -0
  468. package/dist/lib/styles.d.ts +98 -0
  469. package/dist/lib/styles.js +195 -0
  470. package/dist/lib/themes.d.ts +128 -0
  471. package/dist/lib/themes.js +301 -0
  472. package/dist/lib/ui/BoardUI.d.ts +21 -0
  473. package/dist/lib/ui/BoardUI.js +85 -0
  474. package/dist/lib/ui/ClaimTicketUI.d.ts +17 -0
  475. package/dist/lib/ui/ClaimTicketUI.js +64 -0
  476. package/dist/lib/ui/CreateTicketUI.d.ts +13 -0
  477. package/dist/lib/ui/CreateTicketUI.js +101 -0
  478. package/dist/lib/workspace.d.ts +66 -0
  479. package/dist/lib/workspace.js +204 -0
  480. package/oclif.manifest.json +10593 -0
  481. package/package.json +103 -56
  482. package/LICENSE +0 -21
  483. package/dist/bin/prlt.d.ts +0 -11
  484. package/dist/bin/prlt.d.ts.map +0 -1
  485. package/dist/bin/prlt.js +0 -144
  486. package/dist/bin/prlt.js.map +0 -1
  487. package/dist/lib/config/index.d.ts +0 -14
  488. package/dist/lib/config/index.d.ts.map +0 -1
  489. package/dist/lib/config/index.js +0 -142
  490. package/dist/lib/config/index.js.map +0 -1
  491. package/dist/lib/config/upgrade.d.ts +0 -2
  492. package/dist/lib/config/upgrade.d.ts.map +0 -1
  493. package/dist/lib/config/upgrade.js +0 -248
  494. package/dist/lib/config/upgrade.js.map +0 -1
  495. package/dist/lib/themes/index.d.ts +0 -8
  496. package/dist/lib/themes/index.d.ts.map +0 -1
  497. package/dist/lib/themes/index.js +0 -80
  498. package/dist/lib/themes/index.js.map +0 -1
  499. package/dist/lib/utils/helpers.d.ts +0 -4
  500. package/dist/lib/utils/helpers.d.ts.map +0 -1
  501. package/dist/lib/utils/helpers.js +0 -39
  502. package/dist/lib/utils/helpers.js.map +0 -1
  503. package/dist/lib/utils/logger.d.ts +0 -4
  504. package/dist/lib/utils/logger.d.ts.map +0 -1
  505. package/dist/lib/utils/logger.js +0 -28
  506. package/dist/lib/utils/logger.js.map +0 -1
  507. package/dist/lib/workspace/index.d.ts +0 -13
  508. package/dist/lib/workspace/index.d.ts.map +0 -1
  509. package/dist/lib/workspace/index.js +0 -116
  510. package/dist/lib/workspace/index.js.map +0 -1
  511. package/dist/lib/worktree/index.d.ts +0 -7
  512. package/dist/lib/worktree/index.d.ts.map +0 -1
  513. package/dist/lib/worktree/index.js +0 -362
  514. package/dist/lib/worktree/index.js.map +0 -1
  515. package/dist/lib/worktree/migrate.d.ts +0 -2
  516. package/dist/lib/worktree/migrate.d.ts.map +0 -1
  517. package/dist/lib/worktree/migrate.js +0 -214
  518. package/dist/lib/worktree/migrate.js.map +0 -1
  519. package/dist/lib/worktree/repair.d.ts +0 -3
  520. package/dist/lib/worktree/repair.d.ts.map +0 -1
  521. package/dist/lib/worktree/repair.js +0 -320
  522. package/dist/lib/worktree/repair.js.map +0 -1
  523. package/dist/types/index.d.ts +0 -57
  524. package/dist/types/index.d.ts.map +0 -1
  525. package/dist/types/index.js +0 -3
  526. package/dist/types/index.js.map +0 -1
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Execution Storage
3
+ *
4
+ * Database operations for agent_work table.
5
+ */
6
+ import Database from 'better-sqlite3';
7
+ import { AgentWork, ExecutionStatus, ExecutorType, ExecutionEnvironment, DisplayMode } from './types.js';
8
+ export declare class ExecutionStorage {
9
+ private db;
10
+ constructor(db: Database.Database);
11
+ /**
12
+ * Create a new execution record
13
+ */
14
+ createExecution(params: {
15
+ ticketId: string;
16
+ agentName: string;
17
+ executor: ExecutorType;
18
+ environment: ExecutionEnvironment;
19
+ displayMode: DisplayMode;
20
+ sandboxed: boolean;
21
+ branch?: string;
22
+ pid?: string;
23
+ containerId?: string;
24
+ sessionId?: string;
25
+ host?: string;
26
+ logPath?: string;
27
+ }): AgentWork;
28
+ /**
29
+ * Get execution by ID
30
+ */
31
+ getExecution(id: string): AgentWork | null;
32
+ /**
33
+ * Update execution status
34
+ */
35
+ updateStatus(id: string, status: ExecutionStatus, exitCode?: number): void;
36
+ /**
37
+ * Update execution with process info
38
+ */
39
+ updateProcessInfo(id: string, info: {
40
+ pid?: string;
41
+ containerId?: string;
42
+ sessionId?: string;
43
+ host?: string;
44
+ logPath?: string;
45
+ }): void;
46
+ /**
47
+ * List executions with optional filters
48
+ */
49
+ listExecutions(filter?: {
50
+ status?: ExecutionStatus;
51
+ agentName?: string;
52
+ ticketId?: string;
53
+ limit?: number;
54
+ }): AgentWork[];
55
+ /**
56
+ * Get running execution for a ticket (if any)
57
+ */
58
+ getRunningExecution(ticketId: string): AgentWork | null;
59
+ /**
60
+ * Get all running executions for an agent
61
+ */
62
+ getAgentRunningExecutions(agentName: string): AgentWork[];
63
+ /**
64
+ * Check if agent is available (not running anything)
65
+ */
66
+ isAgentAvailable(agentName: string): boolean;
67
+ /**
68
+ * Get total execution count for an agent (historical)
69
+ * Used by least-busy agent selection strategy.
70
+ */
71
+ getAgentExecutionCount(agentName: string): number;
72
+ /**
73
+ * Delete execution record
74
+ */
75
+ deleteExecution(id: string): void;
76
+ }
77
+ export type ContainerStatus = 'running' | 'exited' | 'paused' | 'unknown' | 'removed';
78
+ export interface Container {
79
+ id: string;
80
+ agentName: string;
81
+ dockerId: string;
82
+ dockerName: string | null;
83
+ image: string | null;
84
+ status: ContainerStatus;
85
+ currentExecutionId: string | null;
86
+ createdAt: Date;
87
+ lastSeenAt: Date;
88
+ }
89
+ export declare class ContainerStorage {
90
+ private db;
91
+ constructor(db: Database.Database);
92
+ /**
93
+ * Ensure containers table exists (for existing databases)
94
+ */
95
+ private ensureTable;
96
+ /**
97
+ * Upsert a container record (create or update by docker_id)
98
+ */
99
+ upsertContainer(params: {
100
+ agentName: string;
101
+ dockerId: string;
102
+ dockerName?: string;
103
+ image?: string;
104
+ status?: ContainerStatus;
105
+ currentExecutionId?: string;
106
+ }): Container;
107
+ /**
108
+ * Get container by ID
109
+ */
110
+ getContainer(id: string): Container | null;
111
+ /**
112
+ * Get container by Docker ID (full or short)
113
+ */
114
+ getContainerByDockerId(dockerId: string): Container | null;
115
+ /**
116
+ * Get container for an agent (most recent)
117
+ */
118
+ getContainerForAgent(agentName: string): Container | null;
119
+ /**
120
+ * List all containers
121
+ */
122
+ listContainers(filter?: {
123
+ agentName?: string;
124
+ status?: ContainerStatus;
125
+ limit?: number;
126
+ }): Container[];
127
+ /**
128
+ * Update container status
129
+ */
130
+ updateStatus(dockerId: string, status: ContainerStatus): void;
131
+ /**
132
+ * Update container's current execution
133
+ */
134
+ setCurrentExecution(dockerId: string, executionId: string | null): void;
135
+ /**
136
+ * Mark container as removed
137
+ */
138
+ markRemoved(dockerId: string): void;
139
+ /**
140
+ * Delete container record
141
+ */
142
+ deleteContainer(id: string): void;
143
+ /**
144
+ * Sync container status from Docker
145
+ * Updates status for all known containers based on Docker state
146
+ * Wrapped in a transaction for consistency
147
+ */
148
+ syncFromDocker(dockerContainers: Array<{
149
+ id: string;
150
+ name: string;
151
+ image: string;
152
+ status: string;
153
+ agentName: string;
154
+ }>): {
155
+ added: number;
156
+ updated: number;
157
+ removed: number;
158
+ };
159
+ }
@@ -0,0 +1,425 @@
1
+ /**
2
+ * Execution Storage
3
+ *
4
+ * Database operations for agent_work table.
5
+ */
6
+ import { PMO_TABLES } from '../pmo/schema.js';
7
+ const T = PMO_TABLES;
8
+ // =============================================================================
9
+ // Type Conversion
10
+ // =============================================================================
11
+ function rowToAgentWork(row) {
12
+ return {
13
+ id: row.id,
14
+ ticketId: row.ticket_id,
15
+ agentName: row.agent_name,
16
+ executor: row.executor,
17
+ environment: (row.environment || 'host'),
18
+ displayMode: (row.display_mode || 'terminal'),
19
+ sandboxed: row.sandboxed === 1,
20
+ status: row.status,
21
+ branch: row.branch || undefined,
22
+ pid: row.pid || undefined,
23
+ containerId: row.container_id || undefined,
24
+ sessionId: row.session_id || undefined,
25
+ host: row.host || undefined,
26
+ logPath: row.log_path || undefined,
27
+ startedAt: new Date(row.started_at),
28
+ completedAt: row.completed_at ? new Date(row.completed_at) : undefined,
29
+ exitCode: row.exit_code ?? undefined,
30
+ };
31
+ }
32
+ // =============================================================================
33
+ // ID Generation
34
+ // =============================================================================
35
+ function generateWorkId(db) {
36
+ const result = db
37
+ .prepare(`SELECT COUNT(*) as count FROM ${T.agent_work}`)
38
+ .get();
39
+ const num = (result?.count || 0) + 1;
40
+ return `WORK-${String(num).padStart(3, '0')}`;
41
+ }
42
+ // =============================================================================
43
+ // Execution Storage Class
44
+ // =============================================================================
45
+ export class ExecutionStorage {
46
+ db;
47
+ constructor(db) {
48
+ this.db = db;
49
+ }
50
+ /**
51
+ * Create a new execution record
52
+ */
53
+ createExecution(params) {
54
+ const id = generateWorkId(this.db);
55
+ const now = Date.now();
56
+ this.db.prepare(`
57
+ INSERT INTO ${T.agent_work} (
58
+ id, ticket_id, agent_name, executor, environment, display_mode, sandboxed,
59
+ status, branch, pid, container_id, session_id, host, log_path, started_at
60
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, 'starting', ?, ?, ?, ?, ?, ?, ?)
61
+ `).run(id, params.ticketId, params.agentName, params.executor, params.environment, params.displayMode, params.sandboxed ? 1 : 0, params.branch || null, params.pid || null, params.containerId || null, params.sessionId || null, params.host || null, params.logPath || null, now);
62
+ return this.getExecution(id);
63
+ }
64
+ /**
65
+ * Get execution by ID
66
+ */
67
+ getExecution(id) {
68
+ const row = this.db
69
+ .prepare(`SELECT * FROM ${T.agent_work} WHERE id = ?`)
70
+ .get(id);
71
+ return row ? rowToAgentWork(row) : null;
72
+ }
73
+ /**
74
+ * Update execution status
75
+ */
76
+ updateStatus(id, status, exitCode) {
77
+ const completedAt = ['completed', 'failed', 'stopped'].includes(status) ? Date.now() : null;
78
+ if (exitCode !== undefined) {
79
+ this.db.prepare(`
80
+ UPDATE ${T.agent_work}
81
+ SET status = ?, completed_at = ?, exit_code = ?
82
+ WHERE id = ?
83
+ `).run(status, completedAt, exitCode, id);
84
+ }
85
+ else {
86
+ this.db.prepare(`
87
+ UPDATE ${T.agent_work}
88
+ SET status = ?, completed_at = ?
89
+ WHERE id = ?
90
+ `).run(status, completedAt, id);
91
+ }
92
+ }
93
+ /**
94
+ * Update execution with process info
95
+ */
96
+ updateProcessInfo(id, info) {
97
+ const updates = [];
98
+ const params = [];
99
+ if (info.pid !== undefined) {
100
+ updates.push('pid = ?');
101
+ params.push(info.pid);
102
+ }
103
+ if (info.containerId !== undefined) {
104
+ updates.push('container_id = ?');
105
+ params.push(info.containerId);
106
+ }
107
+ if (info.sessionId !== undefined) {
108
+ updates.push('session_id = ?');
109
+ params.push(info.sessionId);
110
+ }
111
+ if (info.host !== undefined) {
112
+ updates.push('host = ?');
113
+ params.push(info.host);
114
+ }
115
+ if (info.logPath !== undefined) {
116
+ updates.push('log_path = ?');
117
+ params.push(info.logPath);
118
+ }
119
+ if (updates.length > 0) {
120
+ params.push(id);
121
+ this.db.prepare(`
122
+ UPDATE ${T.agent_work}
123
+ SET ${updates.join(', ')}
124
+ WHERE id = ?
125
+ `).run(...params);
126
+ }
127
+ }
128
+ /**
129
+ * List executions with optional filters
130
+ */
131
+ listExecutions(filter) {
132
+ let query = `SELECT * FROM ${T.agent_work} WHERE 1=1`;
133
+ const params = [];
134
+ if (filter?.status) {
135
+ query += ` AND status = ?`;
136
+ params.push(filter.status);
137
+ }
138
+ if (filter?.agentName) {
139
+ query += ` AND agent_name = ?`;
140
+ params.push(filter.agentName);
141
+ }
142
+ if (filter?.ticketId) {
143
+ query += ` AND ticket_id = ?`;
144
+ params.push(filter.ticketId);
145
+ }
146
+ query += ` ORDER BY started_at DESC`;
147
+ if (filter?.limit) {
148
+ query += ` LIMIT ?`;
149
+ params.push(filter.limit);
150
+ }
151
+ const rows = this.db.prepare(query).all(...params);
152
+ return rows.map(rowToAgentWork);
153
+ }
154
+ /**
155
+ * Get running execution for a ticket (if any)
156
+ */
157
+ getRunningExecution(ticketId) {
158
+ const row = this.db
159
+ .prepare(`
160
+ SELECT * FROM ${T.agent_work}
161
+ WHERE ticket_id = ? AND status IN ('starting', 'running')
162
+ ORDER BY started_at DESC
163
+ LIMIT 1
164
+ `)
165
+ .get(ticketId);
166
+ return row ? rowToAgentWork(row) : null;
167
+ }
168
+ /**
169
+ * Get all running executions for an agent
170
+ */
171
+ getAgentRunningExecutions(agentName) {
172
+ const rows = this.db
173
+ .prepare(`
174
+ SELECT * FROM ${T.agent_work}
175
+ WHERE agent_name = ? AND status IN ('starting', 'running')
176
+ ORDER BY started_at DESC
177
+ `)
178
+ .all(agentName);
179
+ return rows.map(rowToAgentWork);
180
+ }
181
+ /**
182
+ * Check if agent is available (not running anything)
183
+ */
184
+ isAgentAvailable(agentName) {
185
+ const count = this.db
186
+ .prepare(`
187
+ SELECT COUNT(*) as count FROM ${T.agent_work}
188
+ WHERE agent_name = ? AND status IN ('starting', 'running')
189
+ `)
190
+ .get(agentName);
191
+ return count.count === 0;
192
+ }
193
+ /**
194
+ * Get total execution count for an agent (historical)
195
+ * Used by least-busy agent selection strategy.
196
+ */
197
+ getAgentExecutionCount(agentName) {
198
+ const result = this.db
199
+ .prepare(`
200
+ SELECT COUNT(*) as count FROM ${T.agent_work}
201
+ WHERE agent_name = ?
202
+ `)
203
+ .get(agentName);
204
+ return result?.count || 0;
205
+ }
206
+ /**
207
+ * Delete execution record
208
+ */
209
+ deleteExecution(id) {
210
+ this.db.prepare(`DELETE FROM ${T.agent_work} WHERE id = ?`).run(id);
211
+ }
212
+ }
213
+ function rowToContainer(row) {
214
+ return {
215
+ id: row.id,
216
+ agentName: row.agent_name,
217
+ dockerId: row.docker_id,
218
+ dockerName: row.docker_name,
219
+ image: row.image,
220
+ status: row.status,
221
+ currentExecutionId: row.current_execution_id,
222
+ createdAt: new Date(row.created_at),
223
+ lastSeenAt: new Date(row.last_seen_at),
224
+ };
225
+ }
226
+ // =============================================================================
227
+ // Container Storage Class
228
+ // =============================================================================
229
+ export class ContainerStorage {
230
+ db;
231
+ constructor(db) {
232
+ this.db = db;
233
+ this.ensureTable();
234
+ }
235
+ /**
236
+ * Ensure containers table exists (for existing databases)
237
+ */
238
+ ensureTable() {
239
+ this.db.exec(`
240
+ CREATE TABLE IF NOT EXISTS ${T.containers} (
241
+ id TEXT PRIMARY KEY,
242
+ agent_name TEXT NOT NULL,
243
+ docker_id TEXT NOT NULL,
244
+ docker_name TEXT,
245
+ image TEXT,
246
+ status TEXT NOT NULL DEFAULT 'unknown',
247
+ current_execution_id TEXT,
248
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
249
+ last_seen_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
250
+ FOREIGN KEY (agent_name) REFERENCES agents(name) ON DELETE CASCADE,
251
+ FOREIGN KEY (current_execution_id) REFERENCES ${T.agent_work}(id) ON DELETE SET NULL
252
+ );
253
+ CREATE INDEX IF NOT EXISTS idx_containers_agent ON ${T.containers}(agent_name);
254
+ CREATE INDEX IF NOT EXISTS idx_containers_docker_id ON ${T.containers}(docker_id);
255
+ CREATE INDEX IF NOT EXISTS idx_containers_status ON ${T.containers}(status);
256
+ `);
257
+ }
258
+ /**
259
+ * Upsert a container record (create or update by docker_id)
260
+ */
261
+ upsertContainer(params) {
262
+ const now = Date.now();
263
+ // Check if container exists by docker_id
264
+ const existing = this.getContainerByDockerId(params.dockerId);
265
+ if (existing) {
266
+ // Update existing container
267
+ this.db.prepare(`
268
+ UPDATE ${T.containers}
269
+ SET agent_name = ?, docker_name = ?, image = ?, status = ?,
270
+ current_execution_id = ?, last_seen_at = ?
271
+ WHERE docker_id = ?
272
+ `).run(params.agentName, params.dockerName || existing.dockerName, params.image || existing.image, params.status || existing.status, params.currentExecutionId ?? existing.currentExecutionId, now, params.dockerId);
273
+ return this.getContainerByDockerId(params.dockerId);
274
+ }
275
+ else {
276
+ // Create new container
277
+ const id = `CNT-${params.dockerId.substring(0, 12)}`;
278
+ this.db.prepare(`
279
+ INSERT INTO ${T.containers} (
280
+ id, agent_name, docker_id, docker_name, image, status,
281
+ current_execution_id, created_at, last_seen_at
282
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
283
+ `).run(id, params.agentName, params.dockerId, params.dockerName || null, params.image || null, params.status || 'unknown', params.currentExecutionId || null, now, now);
284
+ return this.getContainer(id);
285
+ }
286
+ }
287
+ /**
288
+ * Get container by ID
289
+ */
290
+ getContainer(id) {
291
+ const row = this.db
292
+ .prepare(`SELECT * FROM ${T.containers} WHERE id = ?`)
293
+ .get(id);
294
+ return row ? rowToContainer(row) : null;
295
+ }
296
+ /**
297
+ * Get container by Docker ID (full or short)
298
+ */
299
+ getContainerByDockerId(dockerId) {
300
+ // Match by prefix (supports short IDs like 226eda1721d3)
301
+ const row = this.db
302
+ .prepare(`SELECT * FROM ${T.containers} WHERE docker_id LIKE ? || '%'`)
303
+ .get(dockerId);
304
+ return row ? rowToContainer(row) : null;
305
+ }
306
+ /**
307
+ * Get container for an agent (most recent)
308
+ */
309
+ getContainerForAgent(agentName) {
310
+ const row = this.db
311
+ .prepare(`
312
+ SELECT * FROM ${T.containers}
313
+ WHERE agent_name = ?
314
+ ORDER BY last_seen_at DESC
315
+ LIMIT 1
316
+ `)
317
+ .get(agentName);
318
+ return row ? rowToContainer(row) : null;
319
+ }
320
+ /**
321
+ * List all containers
322
+ */
323
+ listContainers(filter) {
324
+ let query = `SELECT * FROM ${T.containers} WHERE 1=1`;
325
+ const params = [];
326
+ if (filter?.agentName) {
327
+ query += ` AND agent_name = ?`;
328
+ params.push(filter.agentName);
329
+ }
330
+ if (filter?.status) {
331
+ query += ` AND status = ?`;
332
+ params.push(filter.status);
333
+ }
334
+ query += ` ORDER BY last_seen_at DESC`;
335
+ if (filter?.limit) {
336
+ query += ` LIMIT ?`;
337
+ params.push(filter.limit);
338
+ }
339
+ const rows = this.db.prepare(query).all(...params);
340
+ return rows.map(rowToContainer);
341
+ }
342
+ /**
343
+ * Update container status
344
+ */
345
+ updateStatus(dockerId, status) {
346
+ const now = Date.now();
347
+ this.db.prepare(`
348
+ UPDATE ${T.containers}
349
+ SET status = ?, last_seen_at = ?
350
+ WHERE docker_id LIKE ? || '%'
351
+ `).run(status, now, dockerId);
352
+ }
353
+ /**
354
+ * Update container's current execution
355
+ */
356
+ setCurrentExecution(dockerId, executionId) {
357
+ const now = Date.now();
358
+ this.db.prepare(`
359
+ UPDATE ${T.containers}
360
+ SET current_execution_id = ?, last_seen_at = ?
361
+ WHERE docker_id LIKE ? || '%'
362
+ `).run(executionId, now, dockerId);
363
+ }
364
+ /**
365
+ * Mark container as removed
366
+ */
367
+ markRemoved(dockerId) {
368
+ this.updateStatus(dockerId, 'removed');
369
+ }
370
+ /**
371
+ * Delete container record
372
+ */
373
+ deleteContainer(id) {
374
+ this.db.prepare(`DELETE FROM ${T.containers} WHERE id = ?`).run(id);
375
+ }
376
+ /**
377
+ * Sync container status from Docker
378
+ * Updates status for all known containers based on Docker state
379
+ * Wrapped in a transaction for consistency
380
+ */
381
+ syncFromDocker(dockerContainers) {
382
+ const now = Date.now();
383
+ let added = 0, updated = 0, removed = 0;
384
+ // Create a set of docker IDs currently running
385
+ const activeDockerIds = new Set(dockerContainers.map(c => c.id.substring(0, 12)));
386
+ // Wrap all operations in a transaction for atomicity
387
+ const syncTransaction = this.db.transaction(() => {
388
+ // Update or add containers from Docker
389
+ for (const dc of dockerContainers) {
390
+ const status = dc.status.startsWith('Up') ? 'running' :
391
+ dc.status.includes('Paused') ? 'paused' : 'exited';
392
+ const existing = this.getContainerByDockerId(dc.id);
393
+ if (existing) {
394
+ this.db.prepare(`
395
+ UPDATE ${T.containers}
396
+ SET docker_name = ?, image = ?, status = ?, last_seen_at = ?
397
+ WHERE docker_id LIKE ? || '%'
398
+ `).run(dc.name, dc.image, status, now, dc.id);
399
+ updated++;
400
+ }
401
+ else {
402
+ this.upsertContainer({
403
+ agentName: dc.agentName,
404
+ dockerId: dc.id,
405
+ dockerName: dc.name,
406
+ image: dc.image,
407
+ status,
408
+ });
409
+ added++;
410
+ }
411
+ }
412
+ // Mark containers not in Docker as removed
413
+ const knownContainers = this.listContainers();
414
+ for (const container of knownContainers) {
415
+ if (!activeDockerIds.has(container.dockerId.substring(0, 12)) &&
416
+ container.status !== 'removed') {
417
+ this.markRemoved(container.dockerId);
418
+ removed++;
419
+ }
420
+ }
421
+ });
422
+ syncTransaction();
423
+ return { added, updated, removed };
424
+ }
425
+ }