@proletariat/cli 0.2.0 → 0.3.1

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 +561 -251
  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,224 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import { execSync } from 'child_process';
3
+ import * as path from 'path';
4
+ import Database from 'better-sqlite3';
5
+ import inquirer from 'inquirer';
6
+ import { styles } from '../../lib/styles.js';
7
+ import { getWorkspaceInfo } from '../../lib/agents/commands.js';
8
+ import { ExecutionStorage } from '../../lib/execution/storage.js';
9
+ import { isDockerRunning } from '../../lib/execution/runners.js';
10
+ import { sanitizeContainerId } from '../../lib/docker/resolve.js';
11
+ import { shouldOutputJson, outputPromptAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
12
+ export default class DockerClean extends Command {
13
+ static description = 'Remove orphaned containers (containers without running agents)';
14
+ static examples = [
15
+ '<%= config.bin %> <%= command.id %>',
16
+ '<%= config.bin %> <%= command.id %> --force',
17
+ '<%= config.bin %> <%= command.id %> --dry-run',
18
+ ];
19
+ static flags = {
20
+ force: Flags.boolean({
21
+ char: 'f',
22
+ aliases: ['yes', 'y'],
23
+ description: 'Skip confirmation prompt',
24
+ default: false,
25
+ }),
26
+ 'dry-run': Flags.boolean({
27
+ char: 'd',
28
+ description: 'Show what would be removed without removing',
29
+ default: false,
30
+ }),
31
+ all: Flags.boolean({
32
+ char: 'a',
33
+ description: 'Remove all stopped devcontainers (not just orphaned)',
34
+ default: false,
35
+ }),
36
+ json: Flags.boolean({
37
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
38
+ default: false,
39
+ }),
40
+ };
41
+ async run() {
42
+ const { flags } = await this.parse(DockerClean);
43
+ // Check Docker status first
44
+ if (!isDockerRunning()) {
45
+ this.log(`\n${styles.error('Docker is not running')}`);
46
+ this.log(`${styles.muted('Start Docker Desktop or the Docker daemon first.')}\n`);
47
+ return;
48
+ }
49
+ // Get workspace info
50
+ let workspaceInfo;
51
+ try {
52
+ workspaceInfo = getWorkspaceInfo();
53
+ }
54
+ catch {
55
+ this.error('Not in a workspace. Run "prlt init" first.');
56
+ }
57
+ // Open database
58
+ const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
59
+ let db;
60
+ try {
61
+ db = new Database(dbPath);
62
+ }
63
+ catch {
64
+ this.error('Could not open workspace database.');
65
+ }
66
+ const executionStorage = new ExecutionStorage(db);
67
+ try {
68
+ // Find orphaned containers
69
+ const orphanedContainers = this.findOrphanedContainers(executionStorage, workspaceInfo.agentsPath, flags.all);
70
+ if (orphanedContainers.length === 0) {
71
+ this.log(`\n${styles.success('No orphaned containers found.')}\n`);
72
+ db.close();
73
+ return;
74
+ }
75
+ // Display orphaned containers
76
+ this.log(`\n${styles.header('Orphaned Containers')}`);
77
+ this.log('='.repeat(80));
78
+ this.log(styles.muted(padEnd('Container ID', 15) +
79
+ padEnd('Name', 30) +
80
+ padEnd('Status', 15) +
81
+ 'Reason'));
82
+ this.log('-'.repeat(80));
83
+ for (const container of orphanedContainers) {
84
+ this.log(padEnd(container.id, 15) +
85
+ padEnd(truncate(container.name, 28), 30) +
86
+ padEnd(container.status, 15) +
87
+ styles.muted(container.reason));
88
+ }
89
+ if (flags['dry-run']) {
90
+ this.log(`\n${styles.warning(`[DRY RUN] Would remove ${orphanedContainers.length} container(s)`)}\n`);
91
+ db.close();
92
+ return;
93
+ }
94
+ // Confirm removal
95
+ if (!flags.force) {
96
+ // Check if JSON output mode is active
97
+ const jsonMode = shouldOutputJson(flags);
98
+ // Build choices once, use for both JSON and interactive modes
99
+ const confirmChoices = [
100
+ { name: 'No', value: 'false' },
101
+ { name: 'Yes', value: 'true' },
102
+ ];
103
+ const confirmMessage = `Remove ${orphanedContainers.length} orphaned container(s)?`;
104
+ // In JSON mode, output confirmation prompt
105
+ if (jsonMode) {
106
+ outputPromptAsJson(buildPromptConfig('list', 'confirmed', confirmMessage, confirmChoices), createMetadata('docker clean', flags));
107
+ db.close();
108
+ return;
109
+ }
110
+ const { confirm } = await inquirer.prompt([
111
+ {
112
+ type: 'confirm',
113
+ name: 'confirm',
114
+ message: confirmMessage,
115
+ default: false,
116
+ },
117
+ ]);
118
+ if (!confirm) {
119
+ this.log(`\n${styles.muted('Aborted.')}\n`);
120
+ db.close();
121
+ return;
122
+ }
123
+ }
124
+ // Remove containers
125
+ let removed = 0;
126
+ let failed = 0;
127
+ for (const container of orphanedContainers) {
128
+ try {
129
+ const safeId = sanitizeContainerId(container.id);
130
+ // Stop container if running
131
+ if (container.status.includes('Up')) {
132
+ this.log(styles.muted(`Stopping ${container.id}...`));
133
+ execSync(`docker stop ${safeId}`, {
134
+ stdio: ['pipe', 'pipe', 'pipe'],
135
+ timeout: 30000,
136
+ });
137
+ }
138
+ // Remove container
139
+ this.log(styles.muted(`Removing ${container.id}...`));
140
+ execSync(`docker rm ${safeId}`, {
141
+ stdio: ['pipe', 'pipe', 'pipe'],
142
+ });
143
+ removed++;
144
+ }
145
+ catch (error) {
146
+ this.log(styles.error(`Failed to remove ${container.id}: ${error instanceof Error ? error.message : error}`));
147
+ failed++;
148
+ }
149
+ }
150
+ if (removed > 0) {
151
+ this.log(`\n${styles.success(`Removed ${removed} container(s)`)}`);
152
+ }
153
+ if (failed > 0) {
154
+ this.log(styles.error(`Failed to remove ${failed} container(s)`));
155
+ }
156
+ this.log('');
157
+ db.close();
158
+ }
159
+ catch (error) {
160
+ db.close();
161
+ throw error;
162
+ }
163
+ }
164
+ findOrphanedContainers(executionStorage, agentsPath, includeAllStopped) {
165
+ const orphaned = [];
166
+ try {
167
+ // Get all devcontainers
168
+ const output = execSync('docker ps -a --format "{{.ID}}|{{.Names}}|{{.Status}}|{{.Label \\"devcontainer.local_folder\\"}}"', {
169
+ encoding: 'utf-8',
170
+ stdio: ['pipe', 'pipe', 'pipe'],
171
+ }).trim();
172
+ if (!output)
173
+ return [];
174
+ // Get running executions from database
175
+ const runningExecutions = executionStorage.listExecutions({ status: 'running' });
176
+ const startingExecutions = executionStorage.listExecutions({ status: 'starting' });
177
+ const activeExecutions = [...runningExecutions, ...startingExecutions];
178
+ const lines = output.split('\n');
179
+ for (const line of lines) {
180
+ const [id, name, status, agentDir] = line.split('|');
181
+ // Only consider devcontainers (have agentDir label)
182
+ if (!agentDir)
183
+ continue;
184
+ const isRunning = status.includes('Up');
185
+ const isStopped = !isRunning;
186
+ // Check if this container has an active execution
187
+ const hasActiveExecution = activeExecutions.some(exec => exec.containerId && (exec.containerId === id ||
188
+ exec.containerId.startsWith(id) ||
189
+ id.startsWith(exec.containerId)));
190
+ // Skip healthy containers (running with active execution)
191
+ if (isRunning && hasActiveExecution)
192
+ continue;
193
+ // Skip normal stopped containers unless --all flag
194
+ if (isStopped && !hasActiveExecution && !includeAllStopped)
195
+ continue;
196
+ // Remaining containers are orphaned - determine reason
197
+ const reason = isStopped
198
+ ? hasActiveExecution
199
+ ? 'Container stopped but execution active'
200
+ : 'Stopped devcontainer'
201
+ : 'No active execution';
202
+ orphaned.push({
203
+ id,
204
+ name,
205
+ status: status.split(' ').slice(0, 2).join(' '),
206
+ agentDir,
207
+ reason,
208
+ });
209
+ }
210
+ return orphaned;
211
+ }
212
+ catch {
213
+ return [];
214
+ }
215
+ }
216
+ }
217
+ function padEnd(str, length) {
218
+ return str.padEnd(length);
219
+ }
220
+ function truncate(str, maxLength) {
221
+ if (str.length <= maxLength)
222
+ return str;
223
+ return str.substring(0, maxLength - 2) + '..';
224
+ }
@@ -0,0 +1,19 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Docker extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ };
8
+ run(): Promise<void>;
9
+ private selectContainer;
10
+ /**
11
+ * Get raw container info from Docker (no agent name inference)
12
+ */
13
+ private getDockerContainers;
14
+ /**
15
+ * Extract agent name from devcontainer image name.
16
+ * Only used for NEW/untracked containers - DB is source of truth otherwise.
17
+ */
18
+ private extractAgentFromImage;
19
+ }
@@ -0,0 +1,274 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { execSync } from 'child_process';
4
+ import * as path from 'path';
5
+ import Database from 'better-sqlite3';
6
+ import { styles } from '../../lib/styles.js';
7
+ import { getWorkspaceInfo } from '../../lib/agents/commands.js';
8
+ import { ExecutionStorage, ContainerStorage } from '../../lib/execution/storage.js';
9
+ import { isDockerRunning } from '../../lib/execution/runners.js';
10
+ import { shouldOutputJson, outputPromptAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
11
+ export default class Docker extends Command {
12
+ static description = 'Manage Docker containers used by agents';
13
+ static examples = [
14
+ '<%= config.bin %> <%= command.id %>',
15
+ '<%= config.bin %> docker status',
16
+ '<%= config.bin %> docker list',
17
+ '<%= config.bin %> docker logs WORK-001',
18
+ '<%= config.bin %> docker start WORK-001',
19
+ '<%= config.bin %> docker stop kalanick',
20
+ '<%= config.bin %> docker shell WORK-001',
21
+ '<%= config.bin %> docker restart abc123',
22
+ '<%= config.bin %> docker sync',
23
+ '<%= config.bin %> docker clean',
24
+ '<%= config.bin %> docker prune',
25
+ ];
26
+ static flags = {
27
+ json: Flags.boolean({
28
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
29
+ default: false,
30
+ }),
31
+ };
32
+ async run() {
33
+ const { flags } = await this.parse(Docker);
34
+ // Check if JSON output mode is active
35
+ const jsonMode = shouldOutputJson(flags);
36
+ // Define choices once, use for both JSON and interactive modes
37
+ const menuChoices = [
38
+ { name: 'Check Docker status', value: 'status' },
39
+ { name: 'List containers', value: 'list' },
40
+ { name: 'View container logs', value: 'logs' },
41
+ { name: 'Start a container', value: 'start' },
42
+ { name: 'Stop a container', value: 'stop' },
43
+ { name: 'Shell into container', value: 'shell' },
44
+ { name: 'Restart a container', value: 'restart' },
45
+ { name: 'Sync containers from Docker', value: 'sync' },
46
+ { name: 'Clean orphaned containers', value: 'clean' },
47
+ { name: 'Prune unused resources', value: 'prune' },
48
+ { name: 'Exit', value: 'exit' },
49
+ ];
50
+ const message = 'What would you like to do?';
51
+ // In JSON mode, output menu prompt
52
+ if (jsonMode) {
53
+ outputPromptAsJson(buildPromptConfig('list', 'action', message, menuChoices), createMetadata('docker', flags));
54
+ return;
55
+ }
56
+ this.log('');
57
+ this.log(styles.header('Docker Management'));
58
+ this.log('');
59
+ const { action } = await inquirer.prompt([
60
+ {
61
+ type: 'list',
62
+ name: 'action',
63
+ message,
64
+ choices: [
65
+ ...menuChoices.slice(0, 7),
66
+ new inquirer.Separator(),
67
+ ...menuChoices.slice(7, 10),
68
+ new inquirer.Separator(),
69
+ menuChoices[10],
70
+ ],
71
+ },
72
+ ]);
73
+ if (action === 'exit') {
74
+ return;
75
+ }
76
+ // Commands that require a target
77
+ const targetCommands = ['logs', 'start', 'stop', 'shell', 'restart'];
78
+ if (targetCommands.includes(action)) {
79
+ const target = await this.selectContainer(action);
80
+ if (!target)
81
+ return;
82
+ await this.config.runCommand(`docker:${action}`, [target]);
83
+ }
84
+ else {
85
+ await this.config.runCommand(`docker:${action}`, []);
86
+ }
87
+ }
88
+ async selectContainer(action) {
89
+ // Check Docker first
90
+ const dockerRunning = isDockerRunning();
91
+ if (!dockerRunning) {
92
+ this.error('Docker is not running. Start Docker Desktop or the Docker daemon first.');
93
+ }
94
+ // Get workspace info (optional - we can still show docker containers without it)
95
+ let workspaceInfo;
96
+ let db = null;
97
+ let executionStorage = null;
98
+ let containerStorage = null;
99
+ try {
100
+ workspaceInfo = getWorkspaceInfo();
101
+ const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
102
+ db = new Database(dbPath);
103
+ executionStorage = new ExecutionStorage(db);
104
+ containerStorage = new ContainerStorage(db);
105
+ }
106
+ catch {
107
+ // No workspace - that's ok, we'll just show docker containers
108
+ }
109
+ try {
110
+ // Get raw docker container info (just IDs and status)
111
+ const dockerContainers = this.getDockerContainers();
112
+ // Sync containers to database (if we have a workspace)
113
+ // This uses image name to determine agent for NEW containers only
114
+ if (containerStorage && dockerContainers.length > 0) {
115
+ const containersWithAgent = dockerContainers.map(c => ({
116
+ ...c,
117
+ agentName: this.extractAgentFromImage(c.image),
118
+ }));
119
+ containerStorage.syncFromDocker(containersWithAgent);
120
+ }
121
+ // Get tracked containers from DB (source of truth for agent names)
122
+ const trackedContainers = containerStorage
123
+ ? containerStorage.listContainers({ limit: 50 })
124
+ : [];
125
+ // Get tracked executions with containers from DB
126
+ const trackedExecutions = executionStorage
127
+ ? executionStorage.listExecutions({ limit: 50 }).filter(e => e.environment === 'devcontainer' || e.containerId)
128
+ : [];
129
+ // Track which docker IDs we've already added
130
+ const addedDockerIds = new Set();
131
+ // Build choices
132
+ const choices = [];
133
+ // Column header
134
+ const header = styles.muted(` ${'ID'.padEnd(14)} ${'Agent'.padEnd(15)} Status`);
135
+ // Add active executions first (with container info from DB)
136
+ const activeExecutions = trackedExecutions.filter(e => e.status === 'running' || e.status === 'starting');
137
+ if (activeExecutions.length > 0) {
138
+ choices.push(new inquirer.Separator('── Active Executions ──'));
139
+ choices.push(new inquirer.Separator(header));
140
+ for (const exec of activeExecutions) {
141
+ // Get container from DB (source of truth)
142
+ const container = trackedContainers.find(c => c.currentExecutionId === exec.id);
143
+ const dockerContainer = exec.containerId
144
+ ? dockerContainers.find(c => c.id.startsWith(exec.containerId.substring(0, 12)))
145
+ : null;
146
+ const isRunning = dockerContainer?.status.startsWith('Up') || container?.status === 'running';
147
+ const statusIcon = isRunning ? styles.success('●') : styles.warning('◐');
148
+ // Use agent name from execution record (DB source of truth)
149
+ choices.push({
150
+ name: `${statusIcon} ${exec.id.padEnd(14)} ${exec.agentName.padEnd(15)} ${styles.success(exec.status)}`,
151
+ value: exec.id,
152
+ });
153
+ if (exec.containerId) {
154
+ addedDockerIds.add(exec.containerId.substring(0, 12));
155
+ }
156
+ }
157
+ }
158
+ // Add containers from database (not tied to active executions)
159
+ // Agent name comes from DB - the authoritative source
160
+ const standbyContainers = trackedContainers.filter(c => !activeExecutions.some(e => e.containerId?.startsWith(c.dockerId.substring(0, 12))) &&
161
+ c.status !== 'removed');
162
+ if (standbyContainers.length > 0) {
163
+ choices.push(new inquirer.Separator('── Containers ──'));
164
+ if (activeExecutions.length === 0) {
165
+ choices.push(new inquirer.Separator(header));
166
+ }
167
+ for (const container of standbyContainers) {
168
+ const dockerStatus = dockerContainers.find(d => d.id.startsWith(container.dockerId.substring(0, 12)));
169
+ const isRunning = dockerStatus?.status.startsWith('Up');
170
+ const statusIcon = isRunning ? styles.success('●') : styles.muted('○');
171
+ const statusText = isRunning ? styles.success('running') : styles.muted(container.status);
172
+ // Agent name from DB (source of truth)
173
+ choices.push({
174
+ name: `${statusIcon} ${container.dockerId.substring(0, 12).padEnd(14)} ${container.agentName.padEnd(15)} ${statusText}`,
175
+ value: container.dockerId,
176
+ });
177
+ addedDockerIds.add(container.dockerId.substring(0, 12));
178
+ }
179
+ }
180
+ // Add devcontainers from Docker that aren't in DB yet
181
+ // Fall back to parsing image name only for untracked containers
182
+ const untracked = dockerContainers.filter(c => !addedDockerIds.has(c.id.substring(0, 12)));
183
+ if (untracked.length > 0) {
184
+ choices.push(new inquirer.Separator('── Untracked (run sync) ──'));
185
+ for (const container of untracked) {
186
+ const isRunning = container.status.startsWith('Up');
187
+ const statusIcon = isRunning ? styles.success('●') : styles.muted('○');
188
+ const statusText = isRunning ? styles.success('running') : styles.muted(container.status.toLowerCase());
189
+ // Parse agent from image only for untracked containers
190
+ const agentName = this.extractAgentFromImage(container.image);
191
+ choices.push({
192
+ name: `${statusIcon} ${container.id.substring(0, 12).padEnd(14)} ${agentName.padEnd(15)} ${statusText}`,
193
+ value: container.id,
194
+ });
195
+ }
196
+ }
197
+ // Add separator and options
198
+ choices.push(new inquirer.Separator());
199
+ choices.push({ name: 'Enter container ID manually...', value: '__manual__' });
200
+ choices.push({ name: styles.muted('Cancel'), value: '__cancel__' });
201
+ if (db)
202
+ db.close();
203
+ if (choices.length <= 2) {
204
+ // Only manual option, just ask for input
205
+ const { target } = await inquirer.prompt([
206
+ {
207
+ type: 'input',
208
+ name: 'target',
209
+ message: 'No containers found. Enter container ID:',
210
+ validate: (input) => input.trim().length > 0 || 'Target is required',
211
+ },
212
+ ]);
213
+ return target.trim();
214
+ }
215
+ const { target } = await inquirer.prompt([
216
+ {
217
+ type: 'list',
218
+ name: 'target',
219
+ message: `Select container to ${action}:`,
220
+ choices,
221
+ pageSize: 15,
222
+ },
223
+ ]);
224
+ if (target === '__cancel__') {
225
+ return null;
226
+ }
227
+ if (target === '__manual__') {
228
+ const { manualTarget } = await inquirer.prompt([
229
+ {
230
+ type: 'input',
231
+ name: 'manualTarget',
232
+ message: 'Enter execution ID (WORK-XXX), agent name, or container ID:',
233
+ validate: (input) => input.trim().length > 0 || 'Target is required',
234
+ },
235
+ ]);
236
+ return manualTarget.trim();
237
+ }
238
+ return target;
239
+ }
240
+ catch (error) {
241
+ if (db)
242
+ db.close();
243
+ throw error;
244
+ }
245
+ }
246
+ /**
247
+ * Get raw container info from Docker (no agent name inference)
248
+ */
249
+ getDockerContainers() {
250
+ try {
251
+ const output = execSync('docker ps -a --format "{{.ID}}|{{.Names}}|{{.Image}}|{{.Status}}"', {
252
+ encoding: 'utf-8',
253
+ stdio: ['pipe', 'pipe', 'pipe'],
254
+ }).trim();
255
+ if (!output)
256
+ return [];
257
+ return output.split('\n').filter(Boolean).map(line => {
258
+ const [id, name, image, status] = line.split('|');
259
+ return { id, name, image, status };
260
+ }).filter(c => c.image.startsWith('vsc-')); // Only devcontainers
261
+ }
262
+ catch {
263
+ return [];
264
+ }
265
+ }
266
+ /**
267
+ * Extract agent name from devcontainer image name.
268
+ * Only used for NEW/untracked containers - DB is source of truth otherwise.
269
+ */
270
+ extractAgentFromImage(image) {
271
+ const match = image.match(/^vsc-([^-]+)-/);
272
+ return match ? match[1] : 'unknown';
273
+ }
274
+ }
@@ -0,0 +1,16 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class DockerList extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ running: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
+ };
9
+ run(): Promise<void>;
10
+ private getTrackedContainers;
11
+ private getDockerContainers;
12
+ /**
13
+ * Extract agent name from devcontainer image name (fallback only)
14
+ */
15
+ private extractAgentFromImage;
16
+ }