@proletariat/cli 0.1.4 → 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 +510 -255
  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 +104 -52
  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 -139
  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 -173
  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 -212
  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 -140
  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,388 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { colors, format } from '../../../lib/colors.js';
4
+ import { getWorkspaceInfo, cleanupAgent, getCleanableAgents, getAgentTmuxSessions } from '../../../lib/agents/commands.js';
5
+ import { PMOCommand, pmoBaseFlags } from '../../../lib/pmo/index.js';
6
+ import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, outputSuccessAsJson, createMetadata, buildPromptConfig, } from '../../../lib/prompt-json.js';
7
+ export default class Cleanup extends PMOCommand {
8
+ static description = 'Clean up agent resources (containers, directories, tmux sessions)';
9
+ static examples = [
10
+ '<%= config.bin %> <%= command.id %> bold-bezos-1',
11
+ '<%= config.bin %> <%= command.id %> --temp',
12
+ '<%= config.bin %> <%= command.id %> --temp --dry-run',
13
+ '<%= config.bin %> <%= command.id %> --all',
14
+ '<%= config.bin %> <%= command.id %> --json',
15
+ ];
16
+ static args = {
17
+ name: Args.string({
18
+ description: 'Agent name to clean up',
19
+ required: false,
20
+ }),
21
+ };
22
+ static flags = {
23
+ ...pmoBaseFlags,
24
+ temp: Flags.boolean({
25
+ description: 'Clean up all ephemeral agents with no running work',
26
+ default: false,
27
+ }),
28
+ all: Flags.boolean({
29
+ description: 'Clean up ALL ephemeral agents (including those with running work)',
30
+ default: false,
31
+ }),
32
+ 'dry-run': Flags.boolean({
33
+ description: 'Show what would be cleaned without actually doing it',
34
+ default: false,
35
+ }),
36
+ yes: Flags.boolean({
37
+ char: 'y',
38
+ description: 'Skip confirmation prompt',
39
+ default: false,
40
+ }),
41
+ force: Flags.boolean({
42
+ char: 'f',
43
+ description: 'Force cleanup even if there is uncommitted/unpushed work',
44
+ default: false,
45
+ }),
46
+ push: Flags.boolean({
47
+ description: 'Push unpushed commits before cleanup',
48
+ default: false,
49
+ }),
50
+ json: Flags.boolean({
51
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
52
+ default: false,
53
+ }),
54
+ 'no-interactive': Flags.boolean({
55
+ description: 'Alias for --json flag',
56
+ default: false,
57
+ }),
58
+ };
59
+ getPMOOptions() {
60
+ return { promptIfMultiple: false };
61
+ }
62
+ async execute() {
63
+ const { args, flags } = await this.parse(Cleanup);
64
+ // Check if JSON output mode is active
65
+ const jsonMode = shouldOutputJson(flags);
66
+ // Helper to handle errors in JSON mode
67
+ const handleError = (code, message) => {
68
+ if (jsonMode) {
69
+ outputErrorAsJson(code, message, createMetadata('agent cleanup', flags));
70
+ this.exit(1);
71
+ }
72
+ this.error(message);
73
+ };
74
+ // Get workspace information
75
+ const workspaceInfo = getWorkspaceInfo();
76
+ const dryRun = flags['dry-run'];
77
+ const skipConfirm = flags.yes;
78
+ const forceCleanup = flags.force;
79
+ const pushFirst = flags.push;
80
+ // Determine which agents to clean up
81
+ let agentsToCleanup = [];
82
+ if (args.name) {
83
+ // Single agent specified
84
+ const agent = workspaceInfo.agents.find(a => a.name === args.name);
85
+ if (!agent) {
86
+ return handleError('AGENT_NOT_FOUND', `Agent "${args.name}" not found.`);
87
+ }
88
+ if (agent.status === 'cleaned') {
89
+ if (jsonMode) {
90
+ outputErrorAsJson('ALREADY_CLEANED', `Agent "${args.name}" has already been cleaned up.`, createMetadata('agent cleanup', flags));
91
+ return;
92
+ }
93
+ this.log(colors.warning(`Agent "${args.name}" has already been cleaned up.`));
94
+ return;
95
+ }
96
+ agentsToCleanup = [args.name];
97
+ }
98
+ else if (flags.all) {
99
+ // All ephemeral agents (even running ones)
100
+ const allEphemeral = workspaceInfo.agents.filter(a => a.type === 'ephemeral' && a.status === 'active');
101
+ if (allEphemeral.length === 0) {
102
+ if (jsonMode) {
103
+ outputErrorAsJson('NO_AGENTS', 'No ephemeral agents to clean up.', createMetadata('agent cleanup', flags));
104
+ return;
105
+ }
106
+ this.log(colors.textMuted('No ephemeral agents to clean up.'));
107
+ return;
108
+ }
109
+ agentsToCleanup = allEphemeral.map(a => a.name);
110
+ }
111
+ else if (flags.temp) {
112
+ // Only ephemeral agents with no running work
113
+ const cleanable = getCleanableAgents(workspaceInfo, true);
114
+ if (cleanable.length === 0) {
115
+ if (jsonMode) {
116
+ outputErrorAsJson('NO_AGENTS', 'No ephemeral agents available for cleanup (all may have running work).', createMetadata('agent cleanup', flags));
117
+ return;
118
+ }
119
+ this.log(colors.textMuted('No ephemeral agents available for cleanup (all may have running work).'));
120
+ return;
121
+ }
122
+ agentsToCleanup = cleanable.map(a => a.name);
123
+ }
124
+ else {
125
+ // Interactive mode - show list of cleanable agents
126
+ const allAgents = workspaceInfo.agents.filter(a => a.status === 'active');
127
+ if (allAgents.length === 0) {
128
+ if (jsonMode) {
129
+ outputErrorAsJson('NO_AGENTS', 'No agents to clean up.', createMetadata('agent cleanup', flags));
130
+ return;
131
+ }
132
+ this.log(colors.textMuted('No agents to clean up.'));
133
+ return;
134
+ }
135
+ // Separate temp and staff agents
136
+ const tempAgents = allAgents.filter(a => a.type === 'ephemeral');
137
+ const staffAgents = allAgents.filter(a => a.type !== 'ephemeral');
138
+ // Build choices with separators
139
+ const choices = [];
140
+ // Add "All temp agents" option if there are temp agents
141
+ if (tempAgents.length > 0) {
142
+ const cleanableTempAgents = tempAgents.filter(a => {
143
+ const sessions = getAgentTmuxSessions(a.name);
144
+ return sessions.length === 0;
145
+ });
146
+ if (cleanableTempAgents.length > 0) {
147
+ choices.push({ name: `🧹 All temp agents (${cleanableTempAgents.length} cleanable)`, value: '__all_temp__' });
148
+ }
149
+ }
150
+ choices.push(new inquirer.Separator('── Cancel ──'));
151
+ choices.push({ name: '✗ Cancel', value: '__cancel__' });
152
+ // Add temp agents
153
+ if (tempAgents.length > 0) {
154
+ choices.push(new inquirer.Separator(`── Temp Agents (${tempAgents.length}) ──`));
155
+ for (const agent of tempAgents) {
156
+ const sessions = getAgentTmuxSessions(agent.name);
157
+ const hasRunningWork = sessions.length > 0;
158
+ const statusLabel = hasRunningWork ? ' (running)' : '';
159
+ choices.push({
160
+ name: `${agent.name}${statusLabel}`,
161
+ value: agent.name,
162
+ disabled: hasRunningWork ? 'has running work' : false,
163
+ });
164
+ }
165
+ }
166
+ // Add staff agents
167
+ if (staffAgents.length > 0) {
168
+ choices.push(new inquirer.Separator(`── Staff Agents (${staffAgents.length}) ──`));
169
+ for (const agent of staffAgents) {
170
+ const sessions = getAgentTmuxSessions(agent.name);
171
+ const hasRunningWork = sessions.length > 0;
172
+ const statusLabel = hasRunningWork ? ' (running)' : '';
173
+ choices.push({
174
+ name: `${agent.name}${statusLabel}`,
175
+ value: agent.name,
176
+ disabled: hasRunningWork ? 'has running work' : false,
177
+ });
178
+ }
179
+ }
180
+ const selectMessage = 'Select agents to clean up:';
181
+ // In JSON mode, output agent selection prompt
182
+ if (jsonMode) {
183
+ outputPromptAsJson(buildPromptConfig('checkbox', 'agents', selectMessage, choices), createMetadata('agent cleanup', flags));
184
+ return;
185
+ }
186
+ const { selected } = await inquirer.prompt([
187
+ {
188
+ type: 'checkbox',
189
+ name: 'selected',
190
+ message: selectMessage,
191
+ choices,
192
+ },
193
+ ]);
194
+ if (selected.length === 0 || selected.includes('__cancel__')) {
195
+ this.log(colors.textMuted('Operation cancelled.'));
196
+ return;
197
+ }
198
+ // Handle "All temp agents" selection
199
+ if (selected.includes('__all_temp__')) {
200
+ const cleanableTempAgents = tempAgents.filter(a => {
201
+ const sessions = getAgentTmuxSessions(a.name);
202
+ return sessions.length === 0;
203
+ });
204
+ agentsToCleanup = cleanableTempAgents.map(a => a.name);
205
+ }
206
+ else {
207
+ agentsToCleanup = selected.filter((s) => !s.startsWith('__'));
208
+ }
209
+ }
210
+ if (agentsToCleanup.length === 0) {
211
+ if (jsonMode) {
212
+ outputErrorAsJson('NO_SELECTION', 'No agents selected for cleanup.', createMetadata('agent cleanup', flags));
213
+ return;
214
+ }
215
+ this.log(colors.textMuted('No agents selected for cleanup.'));
216
+ return;
217
+ }
218
+ // Build confirmation choices
219
+ const confirmChoices = [
220
+ { name: 'No, cancel', value: 'false' },
221
+ { name: 'Yes, clean up', value: 'true' },
222
+ ];
223
+ const confirmMessage = `Clean up ${agentsToCleanup.length} agent(s)? This will remove directories, containers, and tmux sessions.`;
224
+ // Confirm unless --yes or dry-run
225
+ if (!skipConfirm && !dryRun) {
226
+ // In JSON mode, output confirmation prompt with context
227
+ if (jsonMode) {
228
+ const promptConfig = buildPromptConfig('list', 'confirmed', confirmMessage, confirmChoices);
229
+ // Add context about what will be cleaned
230
+ promptConfig.context = { agentsToCleanup };
231
+ outputPromptAsJson(promptConfig, createMetadata('agent cleanup', flags));
232
+ return;
233
+ }
234
+ // Show what will be cleaned
235
+ this.log(colors.primary(`\nAgents to clean up:`));
236
+ for (const name of agentsToCleanup) {
237
+ const agent = workspaceInfo.agents.find(a => a.name === name);
238
+ const typeLabel = agent?.type === 'ephemeral' ? '[temp]' : '[staff]';
239
+ this.log(` - ${name} ${typeLabel}`);
240
+ }
241
+ this.log('');
242
+ const { confirm } = await inquirer.prompt([
243
+ {
244
+ type: 'list',
245
+ name: 'confirm',
246
+ message: confirmMessage,
247
+ choices: [
248
+ { name: '❌ No, cancel', value: false },
249
+ { name: '✓ Yes, clean up', value: true },
250
+ ],
251
+ default: 0,
252
+ },
253
+ ]);
254
+ if (!confirm) {
255
+ this.log(colors.textMuted('Operation cancelled.'));
256
+ return;
257
+ }
258
+ }
259
+ else if (!jsonMode) {
260
+ // Show what will be cleaned (for dry-run or force mode)
261
+ this.log(colors.primary(`\n${dryRun ? '[DRY RUN] ' : ''}Agents to clean up:`));
262
+ for (const name of agentsToCleanup) {
263
+ const agent = workspaceInfo.agents.find(a => a.name === name);
264
+ const typeLabel = agent?.type === 'ephemeral' ? '[temp]' : '[staff]';
265
+ this.log(` - ${name} ${typeLabel}`);
266
+ }
267
+ this.log('');
268
+ }
269
+ // Perform cleanup
270
+ const results = [];
271
+ for (const agentName of agentsToCleanup) {
272
+ if (!jsonMode) {
273
+ this.log(colors.primary(`\nCleaning up: ${agentName}`));
274
+ }
275
+ const result = await cleanupAgent(workspaceInfo, agentName, {
276
+ log: jsonMode ? undefined : (msg) => this.log(colors.textMuted(` ${msg}`)),
277
+ dryRun,
278
+ force: forceCleanup,
279
+ pushFirst,
280
+ });
281
+ // Handle blocked by git status - offer interactive options
282
+ if (result.blockedByGit && !jsonMode && !forceCleanup && !pushFirst) {
283
+ this.log(colors.warning(`\n⚠️ Agent "${agentName}" has unsaved work:`));
284
+ // Determine what kind of unsaved work exists
285
+ let hasUncommitted = false;
286
+ let hasUnpushed = false;
287
+ if (result.gitStatus) {
288
+ for (const wt of result.gitStatus.worktrees) {
289
+ if (wt.hasUncommittedChanges) {
290
+ hasUncommitted = true;
291
+ this.log(colors.textMuted(` ${wt.repoName}: ${wt.uncommittedFiles.length} uncommitted file(s)`));
292
+ }
293
+ if (wt.hasUnpushedCommits) {
294
+ hasUnpushed = true;
295
+ this.log(colors.textMuted(` ${wt.repoName}: ${wt.unpushedCount} unpushed commit(s) on ${wt.branch}`));
296
+ }
297
+ }
298
+ }
299
+ // Build choices based on what's unsaved
300
+ const choices = [];
301
+ if (hasUncommitted && hasUnpushed) {
302
+ // Both uncommitted and unpushed - will commit all and push
303
+ choices.push({ name: '💾 Commit all changes, push, and cleanup', value: 'push' });
304
+ }
305
+ else if (hasUncommitted) {
306
+ // Only uncommitted - will commit and push
307
+ choices.push({ name: '💾 Commit changes, push, and cleanup', value: 'push' });
308
+ }
309
+ else if (hasUnpushed) {
310
+ // Only unpushed commits - just push
311
+ choices.push({ name: '⬆️ Push commits and cleanup', value: 'push' });
312
+ }
313
+ choices.push({ name: '🗑️ Force cleanup (discard all changes)', value: 'force' });
314
+ choices.push({ name: '⏭️ Skip this agent', value: 'skip' });
315
+ // In interactive mode, prompt for action
316
+ const { action } = await inquirer.prompt([
317
+ {
318
+ type: 'list',
319
+ name: 'action',
320
+ message: `What would you like to do with ${agentName}?`,
321
+ choices,
322
+ },
323
+ ]);
324
+ if (action === 'skip') {
325
+ this.log(colors.textMuted(` Skipping ${agentName}`));
326
+ results.push(result);
327
+ continue;
328
+ }
329
+ // Re-run cleanup with the selected option
330
+ const retryResult = await cleanupAgent(workspaceInfo, agentName, {
331
+ log: (msg) => this.log(colors.textMuted(` ${msg}`)),
332
+ dryRun,
333
+ force: action === 'force',
334
+ pushFirst: action === 'push',
335
+ });
336
+ results.push(retryResult);
337
+ continue;
338
+ }
339
+ results.push(result);
340
+ }
341
+ // JSON mode: output results
342
+ if (jsonMode) {
343
+ outputSuccessAsJson({
344
+ message: `${dryRun ? 'Would clean' : 'Cleaned'} ${results.filter(r => r.success).length} agent(s)`,
345
+ dryRun,
346
+ cleaned: results.filter(r => r.success).map(r => r.agent),
347
+ failed: results.filter(r => !r.success).map(r => r.agent),
348
+ details: results.map(r => ({
349
+ agent: r.agent,
350
+ success: r.success,
351
+ tmuxSessionsKilled: r.tmuxSessionsKilled,
352
+ containersRemoved: r.containersRemoved,
353
+ directoriesRemoved: r.directoriesRemoved,
354
+ errors: r.errors,
355
+ })),
356
+ }, createMetadata('agent cleanup', flags));
357
+ return;
358
+ }
359
+ // Summary
360
+ this.log(colors.primary('\n--- Summary ---'));
361
+ const successful = results.filter(r => r.success);
362
+ const failed = results.filter(r => !r.success);
363
+ if (successful.length > 0) {
364
+ this.log(format.success(`${dryRun ? 'Would clean' : 'Cleaned'} ${successful.length} agent(s): ${successful.map(r => r.agent).join(', ')}`));
365
+ }
366
+ if (failed.length > 0) {
367
+ this.log(format.error(`Failed to clean ${failed.length} agent(s): ${failed.map(r => r.agent).join(', ')}`));
368
+ for (const result of failed) {
369
+ for (const error of result.errors) {
370
+ this.log(colors.warning(` - ${result.agent}: ${error}`));
371
+ }
372
+ }
373
+ }
374
+ // Total resources cleaned
375
+ const totalTmux = results.reduce((sum, r) => sum + r.tmuxSessionsKilled.length, 0);
376
+ const totalContainers = results.reduce((sum, r) => sum + r.containersRemoved.length, 0);
377
+ const totalDirs = results.reduce((sum, r) => sum + r.directoriesRemoved.length, 0);
378
+ if (totalTmux > 0 || totalContainers > 0 || totalDirs > 0) {
379
+ this.log(colors.textMuted(`\nResources ${dryRun ? 'that would be ' : ''}cleaned:`));
380
+ if (totalTmux > 0)
381
+ this.log(colors.textMuted(` - Tmux sessions: ${totalTmux}`));
382
+ if (totalContainers > 0)
383
+ this.log(colors.textMuted(` - Containers: ${totalContainers}`));
384
+ if (totalDirs > 0)
385
+ this.log(colors.textMuted(` - Directories: ${totalDirs}`));
386
+ }
387
+ }
388
+ }
@@ -0,0 +1,14 @@
1
+ import { PMOCommand } from '../../../lib/pmo/index.js';
2
+ export default class Temp extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ 'no-interactive': import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ };
10
+ protected getPMOOptions(): {
11
+ promptIfMultiple: boolean;
12
+ };
13
+ execute(): Promise<void>;
14
+ }
@@ -0,0 +1,82 @@
1
+ import { Flags } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { colors } from '../../../lib/colors.js';
4
+ import { PMOCommand, pmoBaseFlags } from '../../../lib/pmo/index.js';
5
+ import { shouldOutputJson, outputPromptAsJson, createMetadata, buildPromptConfig, } from '../../../lib/prompt-json.js';
6
+ export default class Temp extends PMOCommand {
7
+ static description = 'Manage temporary (ephemeral) agents';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %> list',
10
+ '<%= config.bin %> <%= command.id %> cleanup --temp',
11
+ '<%= config.bin %> <%= command.id %> cleanup bold-bezos-1',
12
+ ];
13
+ static flags = {
14
+ ...pmoBaseFlags,
15
+ json: Flags.boolean({
16
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
17
+ default: false,
18
+ }),
19
+ 'no-interactive': Flags.boolean({
20
+ description: 'Alias for --json flag',
21
+ default: false,
22
+ }),
23
+ };
24
+ getPMOOptions() {
25
+ return { promptIfMultiple: false };
26
+ }
27
+ async execute() {
28
+ const { flags } = await this.parse(Temp);
29
+ // Check if JSON output mode is active
30
+ const jsonMode = shouldOutputJson(flags);
31
+ // Define choices once, use for both JSON and interactive modes
32
+ const menuChoices = [
33
+ { name: 'List temp agents', value: 'list' },
34
+ { name: 'Clean up temp agents', value: 'cleanup' },
35
+ { name: 'Cancel', value: 'cancel' },
36
+ ];
37
+ const message = 'What would you like to do?';
38
+ // In JSON mode, output menu prompt
39
+ if (jsonMode) {
40
+ outputPromptAsJson(buildPromptConfig('list', 'action', message, menuChoices), createMetadata('agent temp', flags));
41
+ return;
42
+ }
43
+ this.log(colors.primary('Temporary Agents'));
44
+ this.log(colors.textMuted('Ephemeral agents created by "prlt work spawn".\n'));
45
+ const { action } = await inquirer.prompt([{
46
+ type: 'list',
47
+ name: 'action',
48
+ message,
49
+ choices: [
50
+ { name: '📋 ' + menuChoices[0].name, value: menuChoices[0].value },
51
+ { name: '🧹 ' + menuChoices[1].name, value: menuChoices[1].value },
52
+ new inquirer.Separator(),
53
+ { name: '❌ ' + menuChoices[2].name, value: menuChoices[2].value },
54
+ ]
55
+ }]);
56
+ if (action === 'cancel') {
57
+ this.log(colors.textMuted('Operation cancelled.'));
58
+ return;
59
+ }
60
+ try {
61
+ switch (action) {
62
+ case 'list': {
63
+ const { default: ListCommand } = await import('./list.js');
64
+ const cmd = new ListCommand([], this.config);
65
+ await cmd.run();
66
+ break;
67
+ }
68
+ case 'cleanup': {
69
+ const { default: CleanupCommand } = await import('./cleanup.js');
70
+ const cmd = new CleanupCommand([], this.config);
71
+ await cmd.run();
72
+ break;
73
+ }
74
+ default:
75
+ this.error(`Unknown action: ${action}`);
76
+ }
77
+ }
78
+ catch (error) {
79
+ this.error(`Failed to execute temp ${action}: ${error instanceof Error ? error.message : String(error)}`);
80
+ }
81
+ }
82
+ }
@@ -0,0 +1,7 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class List extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {};
6
+ run(): Promise<void>;
7
+ }
@@ -0,0 +1,108 @@
1
+ import { Command } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import * as path from 'node:path';
4
+ import * as fs from 'node:fs';
5
+ import { getWorkspaceInfo, getAllAgentsStatus, getAgentTmuxSessions } from '../../../lib/agents/commands.js';
6
+ export default class List extends Command {
7
+ static description = 'List all temporary (ephemeral) agents and their status';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %>',
10
+ ];
11
+ static flags = {};
12
+ async run() {
13
+ try {
14
+ // Get workspace information
15
+ const workspaceInfo = getWorkspaceInfo();
16
+ // Filter to ephemeral agents only
17
+ const ephemeralAgents = workspaceInfo.agents.filter(a => a.type === 'ephemeral');
18
+ if (ephemeralAgents.length === 0) {
19
+ this.log(chalk.yellow('No temporary agents found. Create them with "prlt work spawn"'));
20
+ return;
21
+ }
22
+ // Separate active and cleaned agents
23
+ const activeAgents = ephemeralAgents.filter(a => a.status === 'active');
24
+ const cleanedAgents = ephemeralAgents.filter(a => a.status === 'cleaned');
25
+ // Get status for all agents
26
+ const agentsStatus = getAllAgentsStatus(workspaceInfo);
27
+ // Active agents
28
+ if (activeAgents.length > 0) {
29
+ this.log(chalk.bold.cyan('\n Active Temporary Agents:\n'));
30
+ const activeStatus = agentsStatus.filter(a => activeAgents.some(s => s.name === a.name));
31
+ for (const agentStatus of activeStatus) {
32
+ // Check for running tmux sessions
33
+ const sessions = getAgentTmuxSessions(agentStatus.name);
34
+ const hasRunningWork = sessions.length > 0;
35
+ // Agent info line
36
+ const statusIcon = hasRunningWork ? '🟡' : (agentStatus.exists ? '🟢' : '🔴');
37
+ const runningLabel = hasRunningWork ? chalk.yellow(' (running)') : '';
38
+ const status = agentStatus.exists ? chalk.green('Active') : chalk.red('Missing');
39
+ this.log(`${statusIcon} ${chalk.bold(agentStatus.name)} - ${status}${runningLabel}`);
40
+ if (agentStatus.exists) {
41
+ // Show branch info
42
+ if (agentStatus.branch) {
43
+ this.log(chalk.cyan(` Branch: ${agentStatus.branch}`));
44
+ }
45
+ // Show repository status
46
+ if (agentStatus.repositories.length > 0) {
47
+ const dirtyRepos = agentStatus.repositories.filter(r => r.status === 'dirty').length;
48
+ const reposWithCommits = agentStatus.repositories.filter(r => r.commitsAhead > 0);
49
+ let repoStatusText = `${agentStatus.repositories.length} repo(s)`;
50
+ if (dirtyRepos > 0) {
51
+ repoStatusText += `, ${dirtyRepos} dirty`;
52
+ }
53
+ if (reposWithCommits.length > 0) {
54
+ const commitDetails = reposWithCommits.map(r => `${r.name}(+${r.commitsAhead})`).join(', ');
55
+ repoStatusText += `, commits ahead: ${commitDetails}`;
56
+ }
57
+ this.log(chalk.white(` Repositories: ${repoStatusText}`));
58
+ }
59
+ // Show ticket info
60
+ if (agentStatus.assignedTickets.length > 0) {
61
+ this.log(chalk.blue(` Current tickets: ${agentStatus.assignedTickets.join(', ')}`));
62
+ }
63
+ }
64
+ else {
65
+ const agentDir = path.join(workspaceInfo.agentsPath, agentStatus.name);
66
+ const dirExists = fs.existsSync(agentDir);
67
+ if (dirExists) {
68
+ this.log(chalk.red(` Invalid or broken worktrees`));
69
+ }
70
+ else {
71
+ this.log(chalk.red(` Agent directory not found`));
72
+ }
73
+ }
74
+ this.log(''); // Empty line between agents
75
+ }
76
+ }
77
+ // Cleaned agents (if any)
78
+ if (cleanedAgents.length > 0) {
79
+ this.log(chalk.bold.dim('\n Cleaned Temporary Agents:\n'));
80
+ for (const agent of cleanedAgents) {
81
+ const cleanedAt = agent.cleaned_at
82
+ ? new Date(agent.cleaned_at).toLocaleString()
83
+ : 'unknown';
84
+ this.log(chalk.dim(` ${agent.name} - cleaned at ${cleanedAt}`));
85
+ }
86
+ this.log('');
87
+ }
88
+ // Summary
89
+ const runningCount = activeAgents.filter(a => {
90
+ const sessions = getAgentTmuxSessions(a.name);
91
+ return sessions.length > 0;
92
+ }).length;
93
+ this.log(chalk.bold(`Summary:`));
94
+ this.log(` Total temporary agents: ${ephemeralAgents.length}`);
95
+ this.log(` Active: ${activeAgents.length}`);
96
+ if (runningCount > 0) {
97
+ this.log(chalk.yellow(` Running work: ${runningCount}`));
98
+ }
99
+ this.log(chalk.dim(` Cleaned: ${cleanedAgents.length}`));
100
+ if (activeAgents.length > 0 && runningCount === 0) {
101
+ this.log(chalk.dim('\nTip: Use "prlt agent temp cleanup --temp" to clean up idle agents.'));
102
+ }
103
+ }
104
+ catch (error) {
105
+ this.error(error instanceof Error ? error.message : String(error));
106
+ }
107
+ }
108
+ }
@@ -0,0 +1,10 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class ThemesAddNames extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ theme: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static strict: boolean;
9
+ run(): Promise<void>;
10
+ }