@proletariat/cli 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (526) hide show
  1. package/README.md +512 -253
  2. package/bin/dev.cmd +3 -0
  3. package/bin/dev.js +5 -0
  4. package/bin/run.cmd +3 -0
  5. package/bin/run.js +23 -0
  6. package/dist/commands/action/create.d.ts +21 -0
  7. package/dist/commands/action/create.js +126 -0
  8. package/dist/commands/action/delete.d.ts +17 -0
  9. package/dist/commands/action/delete.js +78 -0
  10. package/dist/commands/action/index.d.ts +15 -0
  11. package/dist/commands/action/index.js +107 -0
  12. package/dist/commands/action/list.d.ts +14 -0
  13. package/dist/commands/action/list.js +89 -0
  14. package/dist/commands/action/run.d.ts +19 -0
  15. package/dist/commands/action/run.js +179 -0
  16. package/dist/commands/action/show.d.ts +15 -0
  17. package/dist/commands/action/show.js +47 -0
  18. package/dist/commands/action/update.d.ts +22 -0
  19. package/dist/commands/action/update.js +168 -0
  20. package/dist/commands/agent/index.d.ts +13 -0
  21. package/dist/commands/agent/index.js +131 -0
  22. package/dist/commands/agent/list.d.ts +7 -0
  23. package/dist/commands/agent/list.js +126 -0
  24. package/dist/commands/agent/login.d.ts +16 -0
  25. package/dist/commands/agent/login.js +146 -0
  26. package/dist/commands/agent/rebuild.d.ts +18 -0
  27. package/dist/commands/agent/rebuild.js +133 -0
  28. package/dist/commands/agent/restart.d.ts +17 -0
  29. package/dist/commands/agent/restart.js +116 -0
  30. package/dist/commands/agent/shell.d.ts +23 -0
  31. package/dist/commands/agent/shell.js +378 -0
  32. package/dist/commands/agent/staff/add.d.ts +15 -0
  33. package/dist/commands/agent/staff/add.js +281 -0
  34. package/dist/commands/agent/staff/index.d.ts +14 -0
  35. package/dist/commands/agent/staff/index.js +90 -0
  36. package/dist/commands/agent/staff/list.d.ts +7 -0
  37. package/dist/commands/agent/staff/list.js +90 -0
  38. package/dist/commands/agent/staff/remove.d.ts +16 -0
  39. package/dist/commands/agent/staff/remove.js +137 -0
  40. package/dist/commands/agent/status.d.ts +17 -0
  41. package/dist/commands/agent/status.js +139 -0
  42. package/dist/commands/agent/temp/cleanup.d.ts +23 -0
  43. package/dist/commands/agent/temp/cleanup.js +388 -0
  44. package/dist/commands/agent/temp/index.d.ts +14 -0
  45. package/dist/commands/agent/temp/index.js +82 -0
  46. package/dist/commands/agent/temp/list.d.ts +7 -0
  47. package/dist/commands/agent/temp/list.js +108 -0
  48. package/dist/commands/agent/themes/add-names.d.ts +10 -0
  49. package/dist/commands/agent/themes/add-names.js +67 -0
  50. package/dist/commands/agent/themes/create.d.ts +13 -0
  51. package/dist/commands/agent/themes/create.js +66 -0
  52. package/dist/commands/agent/themes/index.d.ts +9 -0
  53. package/dist/commands/agent/themes/index.js +194 -0
  54. package/dist/commands/agent/themes/list.d.ts +6 -0
  55. package/dist/commands/agent/themes/list.js +41 -0
  56. package/dist/commands/agent/themes/set.d.ts +12 -0
  57. package/dist/commands/agent/themes/set.js +77 -0
  58. package/dist/commands/agent/visit.d.ts +16 -0
  59. package/dist/commands/agent/visit.js +88 -0
  60. package/dist/commands/autocomplete/setup.d.ts +14 -0
  61. package/dist/commands/autocomplete/setup.js +154 -0
  62. package/dist/commands/board/index.d.ts +17 -0
  63. package/dist/commands/board/index.js +255 -0
  64. package/dist/commands/board/watch.d.ts +13 -0
  65. package/dist/commands/board/watch.js +52 -0
  66. package/dist/commands/branch/create.d.ts +50 -0
  67. package/dist/commands/branch/create.js +624 -0
  68. package/dist/commands/branch/index.d.ts +13 -0
  69. package/dist/commands/branch/index.js +50 -0
  70. package/dist/commands/branch/list.d.ts +17 -0
  71. package/dist/commands/branch/list.js +120 -0
  72. package/dist/commands/branch/validate.d.ts +15 -0
  73. package/dist/commands/branch/validate.js +73 -0
  74. package/dist/commands/commit.d.ts +71 -0
  75. package/dist/commands/commit.js +499 -0
  76. package/dist/commands/docker/clean.d.ts +13 -0
  77. package/dist/commands/docker/clean.js +224 -0
  78. package/dist/commands/docker/index.d.ts +19 -0
  79. package/dist/commands/docker/index.js +274 -0
  80. package/dist/commands/docker/list.d.ts +16 -0
  81. package/dist/commands/docker/list.js +200 -0
  82. package/dist/commands/docker/logs.d.ts +14 -0
  83. package/dist/commands/docker/logs.js +118 -0
  84. package/dist/commands/docker/prune.d.ts +14 -0
  85. package/dist/commands/docker/prune.js +211 -0
  86. package/dist/commands/docker/restart.d.ts +14 -0
  87. package/dist/commands/docker/restart.js +129 -0
  88. package/dist/commands/docker/shell.d.ts +14 -0
  89. package/dist/commands/docker/shell.js +103 -0
  90. package/dist/commands/docker/start.d.ts +12 -0
  91. package/dist/commands/docker/start.js +92 -0
  92. package/dist/commands/docker/status.d.ts +7 -0
  93. package/dist/commands/docker/status.js +40 -0
  94. package/dist/commands/docker/stop.d.ts +14 -0
  95. package/dist/commands/docker/stop.js +134 -0
  96. package/dist/commands/docker/sync.d.ts +15 -0
  97. package/dist/commands/docker/sync.js +112 -0
  98. package/dist/commands/epic/activate.d.ts +13 -0
  99. package/dist/commands/epic/activate.js +118 -0
  100. package/dist/commands/epic/archive.d.ts +14 -0
  101. package/dist/commands/epic/archive.js +132 -0
  102. package/dist/commands/epic/create.d.ts +15 -0
  103. package/dist/commands/epic/create.js +137 -0
  104. package/dist/commands/epic/index.d.ts +13 -0
  105. package/dist/commands/epic/index.js +88 -0
  106. package/dist/commands/epic/link/block.d.ts +14 -0
  107. package/dist/commands/epic/link/block.js +79 -0
  108. package/dist/commands/epic/link/duplicates.d.ts +14 -0
  109. package/dist/commands/epic/link/duplicates.js +66 -0
  110. package/dist/commands/epic/link/index.d.ts +19 -0
  111. package/dist/commands/epic/link/index.js +242 -0
  112. package/dist/commands/epic/link/relates.d.ts +14 -0
  113. package/dist/commands/epic/link/relates.js +66 -0
  114. package/dist/commands/epic/link/remove.d.ts +16 -0
  115. package/dist/commands/epic/link/remove.js +89 -0
  116. package/dist/commands/epic/list.d.ts +11 -0
  117. package/dist/commands/epic/list.js +87 -0
  118. package/dist/commands/epic/move.d.ts +15 -0
  119. package/dist/commands/epic/move.js +184 -0
  120. package/dist/commands/epic/progress.d.ts +16 -0
  121. package/dist/commands/epic/progress.js +166 -0
  122. package/dist/commands/epic/project.d.ts +15 -0
  123. package/dist/commands/epic/project.js +219 -0
  124. package/dist/commands/epic/reorder.d.ts +21 -0
  125. package/dist/commands/epic/reorder.js +160 -0
  126. package/dist/commands/epic/spec.d.ts +15 -0
  127. package/dist/commands/epic/spec.js +191 -0
  128. package/dist/commands/epic/ticket.d.ts +18 -0
  129. package/dist/commands/epic/ticket.js +291 -0
  130. package/dist/commands/epic/view.d.ts +13 -0
  131. package/dist/commands/epic/view.js +117 -0
  132. package/dist/commands/execution/index.d.ts +13 -0
  133. package/dist/commands/execution/index.js +70 -0
  134. package/dist/commands/execution/list.d.ts +15 -0
  135. package/dist/commands/execution/list.js +144 -0
  136. package/dist/commands/execution/logs.d.ts +18 -0
  137. package/dist/commands/execution/logs.js +161 -0
  138. package/dist/commands/execution/stop.d.ts +22 -0
  139. package/dist/commands/execution/stop.js +248 -0
  140. package/dist/commands/gh/index.d.ts +9 -0
  141. package/dist/commands/gh/index.js +53 -0
  142. package/dist/commands/gh/login.d.ts +6 -0
  143. package/dist/commands/gh/login.js +57 -0
  144. package/dist/commands/gh/status.d.ts +6 -0
  145. package/dist/commands/gh/status.js +48 -0
  146. package/dist/commands/gh/token.d.ts +6 -0
  147. package/dist/commands/gh/token.js +59 -0
  148. package/dist/commands/init.d.ts +26 -0
  149. package/dist/commands/init.js +200 -0
  150. package/dist/commands/phase/create.d.ts +22 -0
  151. package/dist/commands/phase/create.js +123 -0
  152. package/dist/commands/phase/delete.d.ts +17 -0
  153. package/dist/commands/phase/delete.js +73 -0
  154. package/dist/commands/phase/list.d.ts +12 -0
  155. package/dist/commands/phase/list.js +76 -0
  156. package/dist/commands/phase/move.d.ts +17 -0
  157. package/dist/commands/phase/move.js +115 -0
  158. package/dist/commands/phase/template/apply.d.ts +17 -0
  159. package/dist/commands/phase/template/apply.js +106 -0
  160. package/dist/commands/phase/template/create.d.ts +16 -0
  161. package/dist/commands/phase/template/create.js +58 -0
  162. package/dist/commands/phase/template/delete.d.ts +17 -0
  163. package/dist/commands/phase/template/delete.js +98 -0
  164. package/dist/commands/phase/template/index.d.ts +15 -0
  165. package/dist/commands/phase/template/index.js +128 -0
  166. package/dist/commands/phase/template/list.d.ts +16 -0
  167. package/dist/commands/phase/template/list.js +95 -0
  168. package/dist/commands/phase/template/update.d.ts +17 -0
  169. package/dist/commands/phase/template/update.js +89 -0
  170. package/dist/commands/phase/update.d.ts +23 -0
  171. package/dist/commands/phase/update.js +174 -0
  172. package/dist/commands/pmo/init.d.ts +25 -0
  173. package/dist/commands/pmo/init.js +341 -0
  174. package/dist/commands/pr/create.d.ts +17 -0
  175. package/dist/commands/pr/create.js +242 -0
  176. package/dist/commands/pr/index.d.ts +9 -0
  177. package/dist/commands/pr/index.js +68 -0
  178. package/dist/commands/pr/link.d.ts +14 -0
  179. package/dist/commands/pr/link.js +212 -0
  180. package/dist/commands/pr/status.d.ts +12 -0
  181. package/dist/commands/pr/status.js +161 -0
  182. package/dist/commands/project/archive.d.ts +17 -0
  183. package/dist/commands/project/archive.js +83 -0
  184. package/dist/commands/project/create.d.ts +22 -0
  185. package/dist/commands/project/create.js +143 -0
  186. package/dist/commands/project/delete.d.ts +17 -0
  187. package/dist/commands/project/delete.js +128 -0
  188. package/dist/commands/project/index.d.ts +13 -0
  189. package/dist/commands/project/index.js +64 -0
  190. package/dist/commands/project/list.d.ts +14 -0
  191. package/dist/commands/project/list.js +96 -0
  192. package/dist/commands/project/spec.d.ts +18 -0
  193. package/dist/commands/project/spec.js +216 -0
  194. package/dist/commands/project/unarchive.d.ts +15 -0
  195. package/dist/commands/project/unarchive.js +35 -0
  196. package/dist/commands/project/view.d.ts +16 -0
  197. package/dist/commands/project/view.js +94 -0
  198. package/dist/commands/repo/add.d.ts +21 -0
  199. package/dist/commands/repo/add.js +118 -0
  200. package/dist/commands/repo/index.d.ts +13 -0
  201. package/dist/commands/repo/index.js +114 -0
  202. package/dist/commands/repo/list.d.ts +13 -0
  203. package/dist/commands/repo/list.js +96 -0
  204. package/dist/commands/repo/remove.d.ts +23 -0
  205. package/dist/commands/repo/remove.js +217 -0
  206. package/dist/commands/repo/view.d.ts +15 -0
  207. package/dist/commands/repo/view.js +99 -0
  208. package/dist/commands/session/attach.d.ts +40 -0
  209. package/dist/commands/session/attach.js +307 -0
  210. package/dist/commands/session/index.d.ts +13 -0
  211. package/dist/commands/session/index.js +64 -0
  212. package/dist/commands/session/list.d.ts +21 -0
  213. package/dist/commands/session/list.js +181 -0
  214. package/dist/commands/spec/create.d.ts +19 -0
  215. package/dist/commands/spec/create.js +130 -0
  216. package/dist/commands/spec/index.d.ts +13 -0
  217. package/dist/commands/spec/index.js +68 -0
  218. package/dist/commands/spec/link/depends.d.ts +14 -0
  219. package/dist/commands/spec/link/depends.js +64 -0
  220. package/dist/commands/spec/link/duplicates.d.ts +14 -0
  221. package/dist/commands/spec/link/duplicates.js +63 -0
  222. package/dist/commands/spec/link/index.d.ts +19 -0
  223. package/dist/commands/spec/link/index.js +200 -0
  224. package/dist/commands/spec/link/relates.d.ts +14 -0
  225. package/dist/commands/spec/link/relates.js +63 -0
  226. package/dist/commands/spec/link/remove.d.ts +16 -0
  227. package/dist/commands/spec/link/remove.js +94 -0
  228. package/dist/commands/spec/list.d.ts +12 -0
  229. package/dist/commands/spec/list.js +75 -0
  230. package/dist/commands/spec/plan.d.ts +15 -0
  231. package/dist/commands/spec/plan.js +108 -0
  232. package/dist/commands/spec/ticket.d.ts +18 -0
  233. package/dist/commands/spec/ticket.js +160 -0
  234. package/dist/commands/spec/view.d.ts +15 -0
  235. package/dist/commands/spec/view.js +163 -0
  236. package/dist/commands/status/create.d.ts +21 -0
  237. package/dist/commands/status/create.js +140 -0
  238. package/dist/commands/status/delete.d.ts +13 -0
  239. package/dist/commands/status/delete.js +77 -0
  240. package/dist/commands/status/index.d.ts +14 -0
  241. package/dist/commands/status/index.js +91 -0
  242. package/dist/commands/status/list.d.ts +12 -0
  243. package/dist/commands/status/list.js +93 -0
  244. package/dist/commands/status/move.d.ts +14 -0
  245. package/dist/commands/status/move.js +120 -0
  246. package/dist/commands/status/update.d.ts +20 -0
  247. package/dist/commands/status/update.js +180 -0
  248. package/dist/commands/template/delete.d.ts +15 -0
  249. package/dist/commands/template/delete.js +142 -0
  250. package/dist/commands/template/index.d.ts +10 -0
  251. package/dist/commands/template/index.js +64 -0
  252. package/dist/commands/template/list.d.ts +18 -0
  253. package/dist/commands/template/list.js +157 -0
  254. package/dist/commands/template/phase/apply.d.ts +14 -0
  255. package/dist/commands/template/phase/apply.js +41 -0
  256. package/dist/commands/template/phase/create.d.ts +12 -0
  257. package/dist/commands/template/phase/create.js +29 -0
  258. package/dist/commands/template/phase/delete.d.ts +13 -0
  259. package/dist/commands/template/phase/delete.js +34 -0
  260. package/dist/commands/template/phase/index.d.ts +10 -0
  261. package/dist/commands/template/phase/index.js +62 -0
  262. package/dist/commands/template/phase/list.d.ts +11 -0
  263. package/dist/commands/template/phase/list.js +34 -0
  264. package/dist/commands/template/phase/update.d.ts +13 -0
  265. package/dist/commands/template/phase/update.js +35 -0
  266. package/dist/commands/template/ticket/apply.d.ts +17 -0
  267. package/dist/commands/template/ticket/apply.js +58 -0
  268. package/dist/commands/template/ticket/delete.d.ts +13 -0
  269. package/dist/commands/template/ticket/delete.js +34 -0
  270. package/dist/commands/template/ticket/index.d.ts +10 -0
  271. package/dist/commands/template/ticket/index.js +62 -0
  272. package/dist/commands/template/ticket/list.d.ts +11 -0
  273. package/dist/commands/template/ticket/list.js +34 -0
  274. package/dist/commands/template/ticket/save.d.ts +13 -0
  275. package/dist/commands/template/ticket/save.js +35 -0
  276. package/dist/commands/ticket/bulk.d.ts +13 -0
  277. package/dist/commands/ticket/bulk.js +145 -0
  278. package/dist/commands/ticket/complete.d.ts +16 -0
  279. package/dist/commands/ticket/complete.js +170 -0
  280. package/dist/commands/ticket/create.d.ts +22 -0
  281. package/dist/commands/ticket/create.js +390 -0
  282. package/dist/commands/ticket/delete.d.ts +16 -0
  283. package/dist/commands/ticket/delete.js +178 -0
  284. package/dist/commands/ticket/edit.d.ts +27 -0
  285. package/dist/commands/ticket/edit.js +322 -0
  286. package/dist/commands/ticket/epic.d.ts +20 -0
  287. package/dist/commands/ticket/epic.js +333 -0
  288. package/dist/commands/ticket/index.d.ts +13 -0
  289. package/dist/commands/ticket/index.js +103 -0
  290. package/dist/commands/ticket/link/block.d.ts +14 -0
  291. package/dist/commands/ticket/link/block.js +94 -0
  292. package/dist/commands/ticket/link/duplicates.d.ts +14 -0
  293. package/dist/commands/ticket/link/duplicates.js +93 -0
  294. package/dist/commands/ticket/link/index.d.ts +19 -0
  295. package/dist/commands/ticket/link/index.js +239 -0
  296. package/dist/commands/ticket/link/relates.d.ts +14 -0
  297. package/dist/commands/ticket/link/relates.js +93 -0
  298. package/dist/commands/ticket/link/remove.d.ts +16 -0
  299. package/dist/commands/ticket/link/remove.js +128 -0
  300. package/dist/commands/ticket/list.d.ts +24 -0
  301. package/dist/commands/ticket/list.js +431 -0
  302. package/dist/commands/ticket/move.d.ts +18 -0
  303. package/dist/commands/ticket/move.js +212 -0
  304. package/dist/commands/ticket/project.d.ts +18 -0
  305. package/dist/commands/ticket/project.js +254 -0
  306. package/dist/commands/ticket/reassign.d.ts +19 -0
  307. package/dist/commands/ticket/reassign.js +279 -0
  308. package/dist/commands/ticket/spec.d.ts +18 -0
  309. package/dist/commands/ticket/spec.js +259 -0
  310. package/dist/commands/ticket/status.d.ts +13 -0
  311. package/dist/commands/ticket/status.js +87 -0
  312. package/dist/commands/ticket/template/apply.d.ts +25 -0
  313. package/dist/commands/ticket/template/apply.js +249 -0
  314. package/dist/commands/ticket/template/create.d.ts +19 -0
  315. package/dist/commands/ticket/template/create.js +210 -0
  316. package/dist/commands/ticket/template/delete.d.ts +17 -0
  317. package/dist/commands/ticket/template/delete.js +92 -0
  318. package/dist/commands/ticket/template/index.d.ts +15 -0
  319. package/dist/commands/ticket/template/index.js +118 -0
  320. package/dist/commands/ticket/template/list.d.ts +16 -0
  321. package/dist/commands/ticket/template/list.js +110 -0
  322. package/dist/commands/ticket/template/save.d.ts +14 -0
  323. package/dist/commands/ticket/template/save.js +110 -0
  324. package/dist/commands/ticket/update.d.ts +18 -0
  325. package/dist/commands/ticket/update.js +325 -0
  326. package/dist/commands/ticket/view.d.ts +13 -0
  327. package/dist/commands/ticket/view.js +80 -0
  328. package/dist/commands/whoami.d.ts +9 -0
  329. package/dist/commands/whoami.js +103 -0
  330. package/dist/commands/work/complete.d.ts +13 -0
  331. package/dist/commands/work/complete.js +121 -0
  332. package/dist/commands/work/index.d.ts +13 -0
  333. package/dist/commands/work/index.js +70 -0
  334. package/dist/commands/work/ready.d.ts +24 -0
  335. package/dist/commands/work/ready.js +290 -0
  336. package/dist/commands/work/revise.d.ts +19 -0
  337. package/dist/commands/work/revise.js +377 -0
  338. package/dist/commands/work/spawn-all.d.ts +17 -0
  339. package/dist/commands/work/spawn-all.js +58 -0
  340. package/dist/commands/work/spawn.d.ts +29 -0
  341. package/dist/commands/work/spawn.js +728 -0
  342. package/dist/commands/work/start.d.ts +39 -0
  343. package/dist/commands/work/start.js +1393 -0
  344. package/dist/commands/work/watch.d.ts +31 -0
  345. package/dist/commands/work/watch.js +359 -0
  346. package/dist/commands/workflow/create.d.ts +18 -0
  347. package/dist/commands/workflow/create.js +119 -0
  348. package/dist/commands/workflow/delete.d.ts +17 -0
  349. package/dist/commands/workflow/delete.js +119 -0
  350. package/dist/commands/workflow/index.d.ts +15 -0
  351. package/dist/commands/workflow/index.js +75 -0
  352. package/dist/commands/workflow/list.d.ts +15 -0
  353. package/dist/commands/workflow/list.js +75 -0
  354. package/dist/commands/workflow/switch.d.ts +13 -0
  355. package/dist/commands/workflow/switch.js +117 -0
  356. package/dist/commands/workflow/view.d.ts +16 -0
  357. package/dist/commands/workflow/view.js +114 -0
  358. package/dist/commands/workspace/add.d.ts +12 -0
  359. package/dist/commands/workspace/add.js +74 -0
  360. package/dist/commands/workspace/list.d.ts +9 -0
  361. package/dist/commands/workspace/list.js +153 -0
  362. package/dist/commands/workspace/remove.d.ts +13 -0
  363. package/dist/commands/workspace/remove.js +98 -0
  364. package/dist/commands/workspace/use.d.ts +12 -0
  365. package/dist/commands/workspace/use.js +111 -0
  366. package/dist/hooks/init.d.ts +11 -0
  367. package/dist/hooks/init.js +57 -0
  368. package/dist/index.d.ts +1 -0
  369. package/dist/index.js +1 -0
  370. package/dist/lib/agents/commands.d.ts +189 -0
  371. package/dist/lib/agents/commands.js +893 -0
  372. package/dist/lib/agents/index.d.ts +54 -0
  373. package/dist/lib/agents/index.js +382 -0
  374. package/dist/lib/branch/index.d.ts +120 -0
  375. package/dist/lib/branch/index.js +334 -0
  376. package/dist/lib/colors.d.ts +94 -0
  377. package/dist/lib/colors.js +68 -0
  378. package/dist/lib/commands/docker-command.d.ts +21 -0
  379. package/dist/lib/commands/docker-command.js +27 -0
  380. package/dist/lib/database/index.d.ts +176 -0
  381. package/dist/lib/database/index.js +581 -0
  382. package/dist/lib/docker/resolve.d.ts +38 -0
  383. package/dist/lib/docker/resolve.js +175 -0
  384. package/dist/lib/execution/config.d.ts +150 -0
  385. package/dist/lib/execution/config.js +541 -0
  386. package/dist/lib/execution/devcontainer.d.ts +85 -0
  387. package/dist/lib/execution/devcontainer.js +594 -0
  388. package/dist/lib/execution/index.d.ts +10 -0
  389. package/dist/lib/execution/index.js +10 -0
  390. package/dist/lib/execution/runners.d.ts +53 -0
  391. package/dist/lib/execution/runners.js +1182 -0
  392. package/dist/lib/execution/spawner.d.ts +85 -0
  393. package/dist/lib/execution/spawner.js +548 -0
  394. package/dist/lib/execution/storage.d.ts +159 -0
  395. package/dist/lib/execution/storage.js +425 -0
  396. package/dist/lib/execution/types.d.ts +145 -0
  397. package/dist/lib/execution/types.js +157 -0
  398. package/dist/lib/init/index.d.ts +75 -0
  399. package/dist/lib/init/index.js +355 -0
  400. package/dist/lib/machine-config.d.ts +170 -0
  401. package/dist/lib/machine-config.js +386 -0
  402. package/dist/lib/pmo/base-command.d.ts +195 -0
  403. package/dist/lib/pmo/base-command.js +319 -0
  404. package/dist/lib/pmo/create-spec-folders.d.ts +43 -0
  405. package/dist/lib/pmo/create-spec-folders.js +64 -0
  406. package/dist/lib/pmo/epic-files.d.ts +56 -0
  407. package/dist/lib/pmo/epic-files.js +195 -0
  408. package/dist/lib/pmo/find-pmo.d.ts +14 -0
  409. package/dist/lib/pmo/find-pmo.js +172 -0
  410. package/dist/lib/pmo/index.d.ts +109 -0
  411. package/dist/lib/pmo/index.js +501 -0
  412. package/dist/lib/pmo/markdown.d.ts +31 -0
  413. package/dist/lib/pmo/markdown.js +245 -0
  414. package/dist/lib/pmo/pmo-context.d.ts +27 -0
  415. package/dist/lib/pmo/pmo-context.js +44 -0
  416. package/dist/lib/pmo/schema.d.ts +82 -0
  417. package/dist/lib/pmo/schema.js +531 -0
  418. package/dist/lib/pmo/spec-parser.d.ts +25 -0
  419. package/dist/lib/pmo/spec-parser.js +205 -0
  420. package/dist/lib/pmo/spec-types.d.ts +43 -0
  421. package/dist/lib/pmo/spec-types.js +7 -0
  422. package/dist/lib/pmo/storage/actions.d.ts +34 -0
  423. package/dist/lib/pmo/storage/actions.js +177 -0
  424. package/dist/lib/pmo/storage/base.d.ts +47 -0
  425. package/dist/lib/pmo/storage/base.js +858 -0
  426. package/dist/lib/pmo/storage/dependencies.d.ts +61 -0
  427. package/dist/lib/pmo/storage/dependencies.js +267 -0
  428. package/dist/lib/pmo/storage/epics.d.ts +46 -0
  429. package/dist/lib/pmo/storage/epics.js +243 -0
  430. package/dist/lib/pmo/storage/helpers.d.ts +33 -0
  431. package/dist/lib/pmo/storage/helpers.js +148 -0
  432. package/dist/lib/pmo/storage/index.d.ts +186 -0
  433. package/dist/lib/pmo/storage/index.js +689 -0
  434. package/dist/lib/pmo/storage/phases.d.ts +65 -0
  435. package/dist/lib/pmo/storage/phases.js +392 -0
  436. package/dist/lib/pmo/storage/projects.d.ts +79 -0
  437. package/dist/lib/pmo/storage/projects.js +303 -0
  438. package/dist/lib/pmo/storage/specs.d.ts +77 -0
  439. package/dist/lib/pmo/storage/specs.js +389 -0
  440. package/dist/lib/pmo/storage/statuses.d.ts +63 -0
  441. package/dist/lib/pmo/storage/statuses.js +404 -0
  442. package/dist/lib/pmo/storage/subtasks.d.ts +37 -0
  443. package/dist/lib/pmo/storage/subtasks.js +184 -0
  444. package/dist/lib/pmo/storage/templates.d.ts +40 -0
  445. package/dist/lib/pmo/storage/templates.js +210 -0
  446. package/dist/lib/pmo/storage/tickets.d.ts +57 -0
  447. package/dist/lib/pmo/storage/tickets.js +453 -0
  448. package/dist/lib/pmo/storage/types.d.ts +200 -0
  449. package/dist/lib/pmo/storage/types.js +5 -0
  450. package/dist/lib/pmo/storage/views.d.ts +44 -0
  451. package/dist/lib/pmo/storage/views.js +355 -0
  452. package/dist/lib/pmo/storage-sqlite.d.ts +7 -0
  453. package/dist/lib/pmo/storage-sqlite.js +7 -0
  454. package/dist/lib/pmo/sync-manager.d.ts +92 -0
  455. package/dist/lib/pmo/sync-manager.js +229 -0
  456. package/dist/lib/pmo/types.d.ts +710 -0
  457. package/dist/lib/pmo/types.js +108 -0
  458. package/dist/lib/pmo/utils.d.ts +122 -0
  459. package/dist/lib/pmo/utils.js +174 -0
  460. package/dist/lib/pmo/watcher.d.ts +43 -0
  461. package/dist/lib/pmo/watcher.js +208 -0
  462. package/dist/lib/pr/index.d.ts +150 -0
  463. package/dist/lib/pr/index.js +483 -0
  464. package/dist/lib/prompt-json.d.ts +231 -0
  465. package/dist/lib/prompt-json.js +213 -0
  466. package/dist/lib/repos/index.d.ts +81 -0
  467. package/dist/lib/repos/index.js +679 -0
  468. package/dist/lib/styles.d.ts +98 -0
  469. package/dist/lib/styles.js +195 -0
  470. package/dist/lib/themes.d.ts +128 -0
  471. package/dist/lib/themes.js +301 -0
  472. package/dist/lib/ui/BoardUI.d.ts +21 -0
  473. package/dist/lib/ui/BoardUI.js +85 -0
  474. package/dist/lib/ui/ClaimTicketUI.d.ts +17 -0
  475. package/dist/lib/ui/ClaimTicketUI.js +64 -0
  476. package/dist/lib/ui/CreateTicketUI.d.ts +13 -0
  477. package/dist/lib/ui/CreateTicketUI.js +101 -0
  478. package/dist/lib/workspace.d.ts +66 -0
  479. package/dist/lib/workspace.js +204 -0
  480. package/oclif.manifest.json +10593 -0
  481. package/package.json +103 -56
  482. package/LICENSE +0 -21
  483. package/dist/bin/prlt.d.ts +0 -11
  484. package/dist/bin/prlt.d.ts.map +0 -1
  485. package/dist/bin/prlt.js +0 -144
  486. package/dist/bin/prlt.js.map +0 -1
  487. package/dist/lib/config/index.d.ts +0 -14
  488. package/dist/lib/config/index.d.ts.map +0 -1
  489. package/dist/lib/config/index.js +0 -142
  490. package/dist/lib/config/index.js.map +0 -1
  491. package/dist/lib/config/upgrade.d.ts +0 -2
  492. package/dist/lib/config/upgrade.d.ts.map +0 -1
  493. package/dist/lib/config/upgrade.js +0 -248
  494. package/dist/lib/config/upgrade.js.map +0 -1
  495. package/dist/lib/themes/index.d.ts +0 -8
  496. package/dist/lib/themes/index.d.ts.map +0 -1
  497. package/dist/lib/themes/index.js +0 -80
  498. package/dist/lib/themes/index.js.map +0 -1
  499. package/dist/lib/utils/helpers.d.ts +0 -4
  500. package/dist/lib/utils/helpers.d.ts.map +0 -1
  501. package/dist/lib/utils/helpers.js +0 -39
  502. package/dist/lib/utils/helpers.js.map +0 -1
  503. package/dist/lib/utils/logger.d.ts +0 -4
  504. package/dist/lib/utils/logger.d.ts.map +0 -1
  505. package/dist/lib/utils/logger.js +0 -28
  506. package/dist/lib/utils/logger.js.map +0 -1
  507. package/dist/lib/workspace/index.d.ts +0 -13
  508. package/dist/lib/workspace/index.d.ts.map +0 -1
  509. package/dist/lib/workspace/index.js +0 -116
  510. package/dist/lib/workspace/index.js.map +0 -1
  511. package/dist/lib/worktree/index.d.ts +0 -7
  512. package/dist/lib/worktree/index.d.ts.map +0 -1
  513. package/dist/lib/worktree/index.js +0 -362
  514. package/dist/lib/worktree/index.js.map +0 -1
  515. package/dist/lib/worktree/migrate.d.ts +0 -2
  516. package/dist/lib/worktree/migrate.d.ts.map +0 -1
  517. package/dist/lib/worktree/migrate.js +0 -214
  518. package/dist/lib/worktree/migrate.js.map +0 -1
  519. package/dist/lib/worktree/repair.d.ts +0 -3
  520. package/dist/lib/worktree/repair.d.ts.map +0 -1
  521. package/dist/lib/worktree/repair.js +0 -320
  522. package/dist/lib/worktree/repair.js.map +0 -1
  523. package/dist/types/index.d.ts +0 -57
  524. package/dist/types/index.d.ts.map +0 -1
  525. package/dist/types/index.js +0 -3
  526. package/dist/types/index.js.map +0 -1
@@ -0,0 +1,31 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class WorkWatch extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ column: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ strategy: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
9
+ agent: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ limit: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ interval: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
12
+ once: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ mode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ 'skip-permissions': import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
+ 'create-pr': import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
+ };
18
+ private isRunning;
19
+ private knownTickets;
20
+ private columnName;
21
+ private projectId;
22
+ private environment;
23
+ private displayMode;
24
+ private executionConfig;
25
+ private skipPermissions;
26
+ private createPR;
27
+ protected pmoLogger(): void;
28
+ execute(): Promise<void>;
29
+ private pollForNewTickets;
30
+ private printSummary;
31
+ }
@@ -0,0 +1,359 @@
1
+ import { Flags } from '@oclif/core';
2
+ import * as path from 'node:path';
3
+ import Database from 'better-sqlite3';
4
+ import inquirer from 'inquirer';
5
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
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 { hasDevcontainerConfig } from '../../lib/execution/devcontainer.js';
10
+ import { spawnForColumn, getAvailableAgents, isDockerRunning, } from '../../lib/execution/spawner.js';
11
+ import { promptExecutionSettings } from '../../lib/execution/config.js';
12
+ import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
13
+ export default class WorkWatch extends PMOCommand {
14
+ static description = 'Watch a column and auto-spawn agents for new tickets';
15
+ static examples = [
16
+ '<%= config.bin %> <%= command.id %>',
17
+ '<%= config.bin %> <%= command.id %> --column Ready',
18
+ '<%= config.bin %> <%= command.id %> --column Ready --strategy round-robin',
19
+ '<%= config.bin %> <%= command.id %> --column Ready --interval 10',
20
+ '<%= config.bin %> <%= command.id %> --column Ready --once',
21
+ ];
22
+ static flags = {
23
+ ...pmoBaseFlags,
24
+ json: Flags.boolean({
25
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
26
+ default: false,
27
+ }),
28
+ column: Flags.string({
29
+ char: 'c',
30
+ description: 'Column to watch for new tickets (prompts if not provided)',
31
+ }),
32
+ strategy: Flags.string({
33
+ char: 's',
34
+ description: 'Agent selection strategy',
35
+ options: ['round-robin', 'least-busy', 'random'],
36
+ default: 'round-robin',
37
+ }),
38
+ agent: Flags.string({
39
+ char: 'a',
40
+ description: 'Use specific agent for all tickets',
41
+ }),
42
+ limit: Flags.integer({
43
+ char: 'l',
44
+ description: 'Maximum concurrent executions',
45
+ }),
46
+ interval: Flags.integer({
47
+ char: 'i',
48
+ description: 'Polling interval in seconds',
49
+ default: 5,
50
+ }),
51
+ once: Flags.boolean({
52
+ description: 'Check once and exit (no continuous watching)',
53
+ default: false,
54
+ }),
55
+ mode: Flags.string({
56
+ char: 'm',
57
+ description: 'Display mode for agent output',
58
+ options: ['terminal', 'background'],
59
+ }),
60
+ 'skip-permissions': Flags.boolean({
61
+ description: 'Skip permission prompts (danger mode)',
62
+ default: false,
63
+ }),
64
+ 'create-pr': Flags.boolean({
65
+ description: 'Create PR when work is ready',
66
+ default: false,
67
+ }),
68
+ };
69
+ isRunning = true;
70
+ knownTickets = new Set();
71
+ columnName = '';
72
+ projectId = '';
73
+ environment = 'host';
74
+ displayMode = 'terminal';
75
+ executionConfig;
76
+ skipPermissions = false;
77
+ createPR = false;
78
+ pmoLogger() {
79
+ // Silent logging during watch
80
+ }
81
+ async execute() {
82
+ const { flags } = await this.parse(WorkWatch);
83
+ // Check if JSON output mode is active
84
+ const jsonMode = shouldOutputJson(flags);
85
+ // Helper to handle errors in JSON mode
86
+ const handleError = (code, message) => {
87
+ if (jsonMode) {
88
+ outputErrorAsJson(code, message, createMetadata('work watch', flags));
89
+ this.exit(1);
90
+ }
91
+ this.error(message);
92
+ };
93
+ // Get workspace info
94
+ let workspaceInfo;
95
+ try {
96
+ workspaceInfo = getWorkspaceInfo();
97
+ }
98
+ catch {
99
+ return handleError('NOT_IN_WORKSPACE', 'Not in a workspace. Run "prlt init" first.');
100
+ }
101
+ if (workspaceInfo.agents.length === 0) {
102
+ return handleError('NO_AGENTS', 'No agents found in workspace. Add agents first with "prlt agent add".');
103
+ }
104
+ // Get project
105
+ this.projectId = await this.requireProject();
106
+ // Open database for execution storage
107
+ const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
108
+ const db = new Database(dbPath);
109
+ const executionStorage = new ExecutionStorage(db);
110
+ // Handle graceful shutdown
111
+ const cleanup = async () => {
112
+ this.isRunning = false;
113
+ this.log('');
114
+ this.log(styles.muted('Stopping watch...'));
115
+ db.close();
116
+ process.exit(0);
117
+ };
118
+ process.on('SIGINT', cleanup);
119
+ process.on('SIGTERM', cleanup);
120
+ try {
121
+ // Get board columns for selection
122
+ const board = await this.storage.getBoard(this.projectId);
123
+ const columns = board.columns.map(col => col.name);
124
+ if (columns.length === 0) {
125
+ db.close();
126
+ this.error('No columns found in board. Initialize board first.');
127
+ }
128
+ // Prompt for column if not provided
129
+ this.columnName = flags.column || '';
130
+ if (!this.columnName) {
131
+ // In JSON mode, output column selection prompt
132
+ if (jsonMode) {
133
+ const columnChoices = columns.map(col => {
134
+ const ticketCount = board.columns.find(c => c.name === col)?.tickets?.length || 0;
135
+ return {
136
+ name: `${col} (${ticketCount} tickets)`,
137
+ value: col,
138
+ };
139
+ });
140
+ outputPromptAsJson(buildPromptConfig('list', 'column', 'Select column to watch for new tickets:', columnChoices), createMetadata('work watch', flags));
141
+ db.close();
142
+ return;
143
+ }
144
+ const { selectedColumn } = await inquirer.prompt([
145
+ {
146
+ type: 'list',
147
+ name: 'selectedColumn',
148
+ message: 'Select column to watch for new tickets:',
149
+ choices: columns.map(col => {
150
+ // Get ticket count for each column
151
+ const ticketCount = board.columns.find(c => c.name === col)?.tickets?.length || 0;
152
+ return {
153
+ name: `${col} (${ticketCount} tickets)`,
154
+ value: col,
155
+ };
156
+ }),
157
+ },
158
+ ]);
159
+ this.columnName = selectedColumn;
160
+ }
161
+ // Check if any agent has devcontainer
162
+ const hasDevcontainer = workspaceInfo.agents.some(agent => {
163
+ const agentDir = path.join(workspaceInfo.agentsPath, agent.name);
164
+ return hasDevcontainerConfig(agentDir);
165
+ });
166
+ // Docker check
167
+ const dockerRunning = isDockerRunning();
168
+ if (hasDevcontainer && !dockerRunning) {
169
+ this.warn('Docker is not running. Agents will run on host instead of devcontainer.\n' +
170
+ 'Start Docker Desktop for sandboxed execution.');
171
+ }
172
+ // Prompt for environment and display mode if not provided
173
+ this.environment = 'host';
174
+ this.displayMode = 'terminal';
175
+ if (!flags.mode) {
176
+ if (hasDevcontainer && dockerRunning) {
177
+ // Prompt for environment choice
178
+ const { selectedEnvironment } = await inquirer.prompt([
179
+ {
180
+ type: 'list',
181
+ name: 'selectedEnvironment',
182
+ message: 'Where should agents run?',
183
+ choices: [
184
+ { name: '🐳 devcontainer (sandboxed, recommended)', value: 'devcontainer' },
185
+ { name: '💻 host (runs directly on your machine)', value: 'host' },
186
+ ],
187
+ default: 'devcontainer',
188
+ },
189
+ ]);
190
+ this.environment = selectedEnvironment;
191
+ }
192
+ // Prompt for display mode
193
+ const { selectedDisplay } = await inquirer.prompt([
194
+ {
195
+ type: 'list',
196
+ name: 'selectedDisplay',
197
+ message: 'How should agent output be displayed?',
198
+ choices: [
199
+ { name: '🖥️ New tab - Opens in new terminal tab (recommended)', value: 'terminal' },
200
+ { name: '📦 Background - Runs detached, reattach with: prlt session attach', value: 'background' },
201
+ ],
202
+ default: 'terminal',
203
+ },
204
+ ]);
205
+ this.displayMode = selectedDisplay;
206
+ }
207
+ else {
208
+ this.displayMode = flags.mode;
209
+ this.environment = hasDevcontainer && dockerRunning ? 'devcontainer' : 'host';
210
+ }
211
+ // Prompt for execution settings (terminal, output mode, permissions, PR creation)
212
+ const promptResult = await promptExecutionSettings(db, {
213
+ displayMode: this.displayMode,
214
+ environment: this.environment,
215
+ skipPermissions: flags['skip-permissions'] ? true : undefined,
216
+ createPR: flags['create-pr'] ? true : undefined,
217
+ log: (msg) => this.log(styles.header(msg)),
218
+ });
219
+ this.executionConfig = promptResult.executionConfig;
220
+ this.skipPermissions = promptResult.skipPermissions;
221
+ this.createPR = promptResult.createPR;
222
+ this.log('');
223
+ this.log(styles.header(`👁️ Watching column "${this.columnName}" for new tickets`));
224
+ this.log('');
225
+ this.log(styles.muted(` Strategy: ${flags.strategy}`));
226
+ this.log(styles.muted(` Environment: ${this.environment}`));
227
+ this.log(styles.muted(` Display: ${this.displayMode}`));
228
+ if (this.displayMode === 'terminal') {
229
+ this.log(styles.muted(` Terminal: ${this.executionConfig.terminal.app}`));
230
+ }
231
+ this.log(styles.muted(` Output: ${this.executionConfig.outputMode === 'interactive' ? 'streaming' : 'print'}`));
232
+ if (this.skipPermissions) {
233
+ this.log(styles.warning(` Permissions: ⚠️ danger`));
234
+ }
235
+ else {
236
+ this.log(styles.success(` Permissions: 🔒 safe`));
237
+ }
238
+ if (this.createPR) {
239
+ this.log(styles.muted(` Create PR: yes`));
240
+ }
241
+ if (flags.agent) {
242
+ this.log(styles.muted(` Agent: ${flags.agent}`));
243
+ }
244
+ if (flags.limit) {
245
+ this.log(styles.muted(` Max concurrent: ${flags.limit}`));
246
+ }
247
+ this.log(styles.muted(` Interval: ${flags.interval}s`));
248
+ this.log('');
249
+ // Initial scan - record current tickets as "known"
250
+ const initialTickets = await this.storage.listTickets(this.projectId, { column: this.columnName });
251
+ for (const ticket of initialTickets) {
252
+ this.knownTickets.add(ticket.id);
253
+ }
254
+ this.log(styles.muted(` Found ${initialTickets.length} existing tickets in column`));
255
+ // If --once, just do a single spawn cycle
256
+ if (flags.once) {
257
+ this.log('');
258
+ const result = await spawnForColumn(this.projectId, this.columnName, this.storage, executionStorage, workspaceInfo, db, this.pmoPath, {
259
+ strategy: flags.strategy,
260
+ specificAgent: flags.agent,
261
+ limit: flags.limit,
262
+ skipPermissions: this.skipPermissions,
263
+ createPR: this.createPR,
264
+ environment: this.environment,
265
+ displayMode: this.displayMode,
266
+ executionConfig: this.executionConfig,
267
+ log: (msg) => this.log(styles.muted(` ${msg}`)),
268
+ });
269
+ this.printSummary(result);
270
+ db.close();
271
+ return;
272
+ }
273
+ // Continuous watching
274
+ this.log('');
275
+ this.log(styles.muted('Press Ctrl+C to stop watching'));
276
+ this.log('');
277
+ while (this.isRunning) {
278
+ await this.pollForNewTickets(flags, executionStorage, workspaceInfo, db);
279
+ // Wait for interval
280
+ await new Promise(resolve => setTimeout(resolve, flags.interval * 1000));
281
+ }
282
+ db.close();
283
+ }
284
+ catch (error) {
285
+ db.close();
286
+ throw error;
287
+ }
288
+ }
289
+ async pollForNewTickets(flags, executionStorage, workspaceInfo, db) {
290
+ // Get current tickets in column
291
+ const currentTickets = await this.storage.listTickets(this.projectId, { column: this.columnName });
292
+ // Find new tickets (in current but not in known)
293
+ const newTickets = currentTickets.filter(t => !this.knownTickets.has(t.id));
294
+ if (newTickets.length === 0) {
295
+ // Update status line
296
+ const availableAgents = getAvailableAgents(workspaceInfo, executionStorage);
297
+ const runningExecutions = executionStorage.listExecutions({ status: 'running' });
298
+ const timestamp = new Date().toLocaleTimeString();
299
+ // Clear line and show status
300
+ process.stdout.write(`\r${styles.muted(`[${timestamp}] Watching: ${currentTickets.length} tickets | ${availableAgents.length} agents available | ${runningExecutions.length} running `)}`);
301
+ return;
302
+ }
303
+ // New tickets detected!
304
+ this.log('');
305
+ this.log(styles.success(`✨ New tickets detected: ${newTickets.length}`));
306
+ // Add to known set before spawning
307
+ for (const ticket of newTickets) {
308
+ this.knownTickets.add(ticket.id);
309
+ }
310
+ // Spawn agents for new tickets
311
+ const result = await spawnForColumn(this.projectId, this.columnName, this.storage, executionStorage, workspaceInfo, db, this.pmoPath, {
312
+ strategy: flags.strategy,
313
+ specificAgent: flags.agent,
314
+ limit: flags.limit,
315
+ skipPermissions: this.skipPermissions,
316
+ createPR: this.createPR,
317
+ environment: this.environment,
318
+ displayMode: this.displayMode,
319
+ executionConfig: this.executionConfig,
320
+ log: (msg) => this.log(styles.muted(` ${msg}`)),
321
+ });
322
+ // Print activity
323
+ const timestamp = new Date().toLocaleTimeString();
324
+ for (const spawn of result.spawned) {
325
+ this.log(styles.success(` [${timestamp}] ${spawn.ticketId} → ${spawn.agentName} (spawned)`));
326
+ }
327
+ for (const skip of result.skipped) {
328
+ this.log(styles.warning(` [${timestamp}] ${skip.ticketId}: ${skip.reason}`));
329
+ }
330
+ for (const fail of result.failed) {
331
+ this.log(styles.error(` [${timestamp}] ${fail.ticketId}: ${fail.error}`));
332
+ }
333
+ this.log('');
334
+ }
335
+ printSummary(result) {
336
+ this.log('');
337
+ this.log(styles.header('Summary'));
338
+ this.log('');
339
+ if (result.spawned.length > 0) {
340
+ this.log(styles.success(` ✓ Spawned: ${result.spawned.length}`));
341
+ for (const spawn of result.spawned) {
342
+ this.log(styles.muted(` ${spawn.ticketId} → ${spawn.agentName}${spawn.executionId ? ` (${spawn.executionId})` : ''}`));
343
+ }
344
+ }
345
+ if (result.skipped.length > 0) {
346
+ this.log(styles.warning(` ⏭ Skipped: ${result.skipped.length}`));
347
+ for (const skip of result.skipped) {
348
+ this.log(styles.muted(` ${skip.ticketId}: ${skip.reason}`));
349
+ }
350
+ }
351
+ if (result.failed.length > 0) {
352
+ this.log(styles.error(` ✗ Failed: ${result.failed.length}`));
353
+ for (const fail of result.failed) {
354
+ this.log(styles.muted(` ${fail.ticketId}: ${fail.error}`));
355
+ }
356
+ }
357
+ this.log('');
358
+ }
359
+ }
@@ -0,0 +1,18 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class WorkflowCreate extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ name: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ statuses: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ };
14
+ protected getPMOOptions(): {
15
+ promptIfMultiple: boolean;
16
+ };
17
+ execute(): Promise<void>;
18
+ }
@@ -0,0 +1,119 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
4
+ import { styles } from '../../lib/styles.js';
5
+ import { shouldOutputJson, outputPromptAsJson, createMetadata, buildFormPromptConfig, } from '../../lib/prompt-json.js';
6
+ export default class WorkflowCreate extends PMOCommand {
7
+ static description = 'Create a new custom workflow';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %> "My Workflow"',
10
+ '<%= config.bin %> <%= command.id %> "Sprint Board" --description "Agile sprint workflow"',
11
+ '<%= config.bin %> <%= command.id %> "Simple" --statuses "Todo,In Progress,Done"',
12
+ ];
13
+ static args = {
14
+ name: Args.string({
15
+ description: 'Workflow name',
16
+ required: false,
17
+ }),
18
+ };
19
+ static flags = {
20
+ ...pmoBaseFlags,
21
+ description: Flags.string({
22
+ char: 'd',
23
+ description: 'Workflow description',
24
+ }),
25
+ statuses: Flags.string({
26
+ char: 's',
27
+ description: 'Comma-separated list of status names (uses default categories)',
28
+ }),
29
+ json: Flags.boolean({
30
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
31
+ default: false,
32
+ }),
33
+ };
34
+ getPMOOptions() {
35
+ return { promptIfMultiple: false };
36
+ }
37
+ async execute() {
38
+ const { args, flags } = await this.parse(WorkflowCreate);
39
+ // Check if JSON output mode is active
40
+ const jsonMode = shouldOutputJson(flags);
41
+ // Get workflow name
42
+ let name = args.name;
43
+ if (!name) {
44
+ const fields = [
45
+ { type: 'input', name: 'name', message: 'Workflow name:' },
46
+ { type: 'input', name: 'description', message: 'Description (optional):', default: flags.description },
47
+ ];
48
+ if (jsonMode) {
49
+ outputPromptAsJson(buildFormPromptConfig(fields), createMetadata('workflow create', flags));
50
+ return;
51
+ }
52
+ const answers = await inquirer.prompt([
53
+ {
54
+ type: 'input',
55
+ name: 'name',
56
+ message: 'Workflow name:',
57
+ validate: (input) => input.length > 0 || 'Name is required',
58
+ },
59
+ {
60
+ type: 'input',
61
+ name: 'description',
62
+ message: 'Description (optional):',
63
+ },
64
+ ]);
65
+ name = answers.name;
66
+ if (answers.description) {
67
+ flags.description = answers.description;
68
+ }
69
+ }
70
+ // Create the workflow
71
+ const workflow = await this.storage.createWorkflow({
72
+ name: name,
73
+ description: flags.description,
74
+ });
75
+ // If statuses were provided, add them
76
+ if (flags.statuses) {
77
+ const statusNames = flags.statuses.split(',').map(s => s.trim()).filter(s => s);
78
+ const defaultCategories = ['backlog', 'unstarted', 'started', 'started', 'completed'];
79
+ for (let i = 0; i < statusNames.length; i++) {
80
+ const statusName = statusNames[i];
81
+ // Assign categories based on position: first = backlog, second = unstarted, middle = started, last = completed
82
+ let category;
83
+ if (i === 0) {
84
+ category = 'backlog';
85
+ }
86
+ else if (i === 1) {
87
+ category = 'unstarted';
88
+ }
89
+ else if (i === statusNames.length - 1) {
90
+ category = 'completed';
91
+ }
92
+ else {
93
+ category = 'started';
94
+ }
95
+ await this.storage.createStatus(workflow.id, {
96
+ name: statusName,
97
+ category: category,
98
+ position: i,
99
+ isDefault: i === 1, // Second status (unstarted) is default
100
+ });
101
+ }
102
+ }
103
+ // Get the statuses for display
104
+ const statuses = await this.storage.listStatuses(workflow.id);
105
+ this.log(styles.success(`\nCreated workflow "${styles.emphasis(workflow.name)}"`));
106
+ this.log(styles.muted(` ID: ${workflow.id}`));
107
+ if (workflow.description) {
108
+ this.log(styles.muted(` Description: ${workflow.description}`));
109
+ }
110
+ if (statuses.length > 0) {
111
+ this.log(styles.muted(` Statuses: ${statuses.map(s => s.name).join(', ')}`));
112
+ }
113
+ else {
114
+ this.log(styles.muted(' No statuses yet. Add some with: prlt status create'));
115
+ }
116
+ this.log('');
117
+ this.log(styles.muted(`View workflow: prlt workflow view ${workflow.id}`));
118
+ }
119
+ }
@@ -0,0 +1,17 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class WorkflowDelete extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ };
13
+ protected getPMOOptions(): {
14
+ promptIfMultiple: boolean;
15
+ };
16
+ execute(): Promise<void>;
17
+ }
@@ -0,0 +1,119 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
4
+ import { styles } from '../../lib/styles.js';
5
+ import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
6
+ export default class WorkflowDelete extends PMOCommand {
7
+ static description = 'Delete a custom workflow';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %> my-workflow',
10
+ '<%= config.bin %> <%= command.id %> my-workflow --force # Skip confirmation',
11
+ '<%= config.bin %> <%= command.id %> # Interactive selection',
12
+ ];
13
+ static args = {
14
+ id: Args.string({
15
+ description: 'Workflow ID to delete - prompts with dropdown if not provided',
16
+ required: false,
17
+ }),
18
+ };
19
+ static flags = {
20
+ ...pmoBaseFlags,
21
+ force: Flags.boolean({
22
+ char: 'f',
23
+ description: 'Skip confirmation prompt',
24
+ default: false,
25
+ }),
26
+ json: Flags.boolean({
27
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
28
+ default: false,
29
+ }),
30
+ };
31
+ getPMOOptions() {
32
+ return { promptIfMultiple: false };
33
+ }
34
+ async execute() {
35
+ const { args, flags } = await this.parse(WorkflowDelete);
36
+ // Check if JSON output mode is active
37
+ const jsonMode = shouldOutputJson(flags);
38
+ // Helper to handle errors in JSON mode
39
+ const handleError = (code, message) => {
40
+ if (jsonMode) {
41
+ outputErrorAsJson(code, message, createMetadata('workflow delete', flags));
42
+ this.exit(1);
43
+ }
44
+ this.error(message);
45
+ };
46
+ // Get workflow ID - prompt if not provided
47
+ let workflowId = args.id;
48
+ if (!workflowId) {
49
+ // Only show custom workflows (built-in cannot be deleted)
50
+ const workflows = await this.storage.listWorkflows({ isBuiltin: false });
51
+ if (workflows.length === 0) {
52
+ return handleError('NO_CUSTOM_WORKFLOWS', 'No custom workflows found to delete.');
53
+ }
54
+ // In JSON mode, output workflow selection prompt
55
+ if (jsonMode) {
56
+ const workflowChoices = workflows.map(w => ({
57
+ name: w.name,
58
+ value: w.id,
59
+ }));
60
+ outputPromptAsJson(buildPromptConfig('list', 'id', 'Select workflow to delete:', workflowChoices), createMetadata('workflow delete', flags));
61
+ return;
62
+ }
63
+ const { selectedId } = await inquirer.prompt([{
64
+ type: 'list',
65
+ name: 'selectedId',
66
+ message: 'Select workflow to delete:',
67
+ choices: workflows.map(w => ({
68
+ name: w.name,
69
+ value: w.id,
70
+ })),
71
+ }]);
72
+ workflowId = selectedId;
73
+ }
74
+ // Get workflow details
75
+ const workflow = await this.storage.getWorkflow(workflowId);
76
+ if (!workflow) {
77
+ return handleError('WORKFLOW_NOT_FOUND', `Workflow not found: ${workflowId}`);
78
+ }
79
+ // Cannot delete built-in workflows
80
+ if (workflow.isBuiltin) {
81
+ return handleError('CANNOT_DELETE_BUILTIN', `Cannot delete built-in workflow: ${workflow.name}`);
82
+ }
83
+ // Check if workflow is in use by any projects
84
+ const projects = await this.storage.listProjects();
85
+ const usingProjects = projects.filter(p => p.workflowId === workflowId);
86
+ if (usingProjects.length > 0) {
87
+ const projectNames = usingProjects.map(p => p.name).join(', ');
88
+ return handleError('WORKFLOW_IN_USE', `Cannot delete workflow "${workflow.name}" - it is used by ${usingProjects.length} project(s): ${projectNames}`);
89
+ }
90
+ // Confirm deletion unless --force
91
+ if (!flags.force) {
92
+ const statuses = await this.storage.listStatuses(workflowId);
93
+ // In JSON mode, output confirmation prompt
94
+ if (jsonMode) {
95
+ outputPromptAsJson(buildPromptConfig('confirm', 'confirm', `Delete workflow "${workflow.name}" with ${statuses.length} statuses?`), createMetadata('workflow delete', flags));
96
+ return;
97
+ }
98
+ this.log(styles.warning(`\nWorkflow "${workflow.name}" has ${statuses.length} status(es).`));
99
+ this.log(styles.warning('This action cannot be undone.'));
100
+ this.log('');
101
+ const { confirm } = await inquirer.prompt([{
102
+ type: 'list',
103
+ name: 'confirm',
104
+ message: `Delete workflow "${workflow.name}"?`,
105
+ choices: [
106
+ { name: 'Yes', value: true },
107
+ { name: 'No', value: false },
108
+ ],
109
+ }]);
110
+ if (!confirm) {
111
+ this.log(styles.muted('Cancelled'));
112
+ return;
113
+ }
114
+ }
115
+ // Delete the workflow
116
+ await this.storage.deleteWorkflow(workflowId);
117
+ this.log(styles.success(`\nDeleted workflow "${styles.emphasis(workflow.name)}"`));
118
+ }
119
+ }