@proletariat/cli 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (526) hide show
  1. package/README.md +561 -251
  2. package/bin/dev.cmd +3 -0
  3. package/bin/dev.js +5 -0
  4. package/bin/run.cmd +3 -0
  5. package/bin/run.js +23 -0
  6. package/dist/commands/action/create.d.ts +21 -0
  7. package/dist/commands/action/create.js +126 -0
  8. package/dist/commands/action/delete.d.ts +17 -0
  9. package/dist/commands/action/delete.js +78 -0
  10. package/dist/commands/action/index.d.ts +15 -0
  11. package/dist/commands/action/index.js +107 -0
  12. package/dist/commands/action/list.d.ts +14 -0
  13. package/dist/commands/action/list.js +89 -0
  14. package/dist/commands/action/run.d.ts +19 -0
  15. package/dist/commands/action/run.js +179 -0
  16. package/dist/commands/action/show.d.ts +15 -0
  17. package/dist/commands/action/show.js +47 -0
  18. package/dist/commands/action/update.d.ts +22 -0
  19. package/dist/commands/action/update.js +168 -0
  20. package/dist/commands/agent/index.d.ts +13 -0
  21. package/dist/commands/agent/index.js +131 -0
  22. package/dist/commands/agent/list.d.ts +7 -0
  23. package/dist/commands/agent/list.js +126 -0
  24. package/dist/commands/agent/login.d.ts +16 -0
  25. package/dist/commands/agent/login.js +146 -0
  26. package/dist/commands/agent/rebuild.d.ts +18 -0
  27. package/dist/commands/agent/rebuild.js +133 -0
  28. package/dist/commands/agent/restart.d.ts +17 -0
  29. package/dist/commands/agent/restart.js +116 -0
  30. package/dist/commands/agent/shell.d.ts +23 -0
  31. package/dist/commands/agent/shell.js +378 -0
  32. package/dist/commands/agent/staff/add.d.ts +15 -0
  33. package/dist/commands/agent/staff/add.js +281 -0
  34. package/dist/commands/agent/staff/index.d.ts +14 -0
  35. package/dist/commands/agent/staff/index.js +90 -0
  36. package/dist/commands/agent/staff/list.d.ts +7 -0
  37. package/dist/commands/agent/staff/list.js +90 -0
  38. package/dist/commands/agent/staff/remove.d.ts +16 -0
  39. package/dist/commands/agent/staff/remove.js +137 -0
  40. package/dist/commands/agent/status.d.ts +17 -0
  41. package/dist/commands/agent/status.js +139 -0
  42. package/dist/commands/agent/temp/cleanup.d.ts +23 -0
  43. package/dist/commands/agent/temp/cleanup.js +388 -0
  44. package/dist/commands/agent/temp/index.d.ts +14 -0
  45. package/dist/commands/agent/temp/index.js +82 -0
  46. package/dist/commands/agent/temp/list.d.ts +7 -0
  47. package/dist/commands/agent/temp/list.js +108 -0
  48. package/dist/commands/agent/themes/add-names.d.ts +10 -0
  49. package/dist/commands/agent/themes/add-names.js +67 -0
  50. package/dist/commands/agent/themes/create.d.ts +13 -0
  51. package/dist/commands/agent/themes/create.js +66 -0
  52. package/dist/commands/agent/themes/index.d.ts +9 -0
  53. package/dist/commands/agent/themes/index.js +194 -0
  54. package/dist/commands/agent/themes/list.d.ts +6 -0
  55. package/dist/commands/agent/themes/list.js +41 -0
  56. package/dist/commands/agent/themes/set.d.ts +12 -0
  57. package/dist/commands/agent/themes/set.js +77 -0
  58. package/dist/commands/agent/visit.d.ts +16 -0
  59. package/dist/commands/agent/visit.js +88 -0
  60. package/dist/commands/autocomplete/setup.d.ts +14 -0
  61. package/dist/commands/autocomplete/setup.js +154 -0
  62. package/dist/commands/board/index.d.ts +17 -0
  63. package/dist/commands/board/index.js +255 -0
  64. package/dist/commands/board/watch.d.ts +13 -0
  65. package/dist/commands/board/watch.js +52 -0
  66. package/dist/commands/branch/create.d.ts +50 -0
  67. package/dist/commands/branch/create.js +624 -0
  68. package/dist/commands/branch/index.d.ts +13 -0
  69. package/dist/commands/branch/index.js +50 -0
  70. package/dist/commands/branch/list.d.ts +17 -0
  71. package/dist/commands/branch/list.js +120 -0
  72. package/dist/commands/branch/validate.d.ts +15 -0
  73. package/dist/commands/branch/validate.js +73 -0
  74. package/dist/commands/commit.d.ts +71 -0
  75. package/dist/commands/commit.js +499 -0
  76. package/dist/commands/docker/clean.d.ts +13 -0
  77. package/dist/commands/docker/clean.js +224 -0
  78. package/dist/commands/docker/index.d.ts +19 -0
  79. package/dist/commands/docker/index.js +274 -0
  80. package/dist/commands/docker/list.d.ts +16 -0
  81. package/dist/commands/docker/list.js +200 -0
  82. package/dist/commands/docker/logs.d.ts +14 -0
  83. package/dist/commands/docker/logs.js +118 -0
  84. package/dist/commands/docker/prune.d.ts +14 -0
  85. package/dist/commands/docker/prune.js +211 -0
  86. package/dist/commands/docker/restart.d.ts +14 -0
  87. package/dist/commands/docker/restart.js +129 -0
  88. package/dist/commands/docker/shell.d.ts +14 -0
  89. package/dist/commands/docker/shell.js +103 -0
  90. package/dist/commands/docker/start.d.ts +12 -0
  91. package/dist/commands/docker/start.js +92 -0
  92. package/dist/commands/docker/status.d.ts +7 -0
  93. package/dist/commands/docker/status.js +40 -0
  94. package/dist/commands/docker/stop.d.ts +14 -0
  95. package/dist/commands/docker/stop.js +134 -0
  96. package/dist/commands/docker/sync.d.ts +15 -0
  97. package/dist/commands/docker/sync.js +112 -0
  98. package/dist/commands/epic/activate.d.ts +13 -0
  99. package/dist/commands/epic/activate.js +118 -0
  100. package/dist/commands/epic/archive.d.ts +14 -0
  101. package/dist/commands/epic/archive.js +132 -0
  102. package/dist/commands/epic/create.d.ts +15 -0
  103. package/dist/commands/epic/create.js +137 -0
  104. package/dist/commands/epic/index.d.ts +13 -0
  105. package/dist/commands/epic/index.js +88 -0
  106. package/dist/commands/epic/link/block.d.ts +14 -0
  107. package/dist/commands/epic/link/block.js +79 -0
  108. package/dist/commands/epic/link/duplicates.d.ts +14 -0
  109. package/dist/commands/epic/link/duplicates.js +66 -0
  110. package/dist/commands/epic/link/index.d.ts +19 -0
  111. package/dist/commands/epic/link/index.js +242 -0
  112. package/dist/commands/epic/link/relates.d.ts +14 -0
  113. package/dist/commands/epic/link/relates.js +66 -0
  114. package/dist/commands/epic/link/remove.d.ts +16 -0
  115. package/dist/commands/epic/link/remove.js +89 -0
  116. package/dist/commands/epic/list.d.ts +11 -0
  117. package/dist/commands/epic/list.js +87 -0
  118. package/dist/commands/epic/move.d.ts +15 -0
  119. package/dist/commands/epic/move.js +184 -0
  120. package/dist/commands/epic/progress.d.ts +16 -0
  121. package/dist/commands/epic/progress.js +166 -0
  122. package/dist/commands/epic/project.d.ts +15 -0
  123. package/dist/commands/epic/project.js +219 -0
  124. package/dist/commands/epic/reorder.d.ts +21 -0
  125. package/dist/commands/epic/reorder.js +160 -0
  126. package/dist/commands/epic/spec.d.ts +15 -0
  127. package/dist/commands/epic/spec.js +191 -0
  128. package/dist/commands/epic/ticket.d.ts +18 -0
  129. package/dist/commands/epic/ticket.js +291 -0
  130. package/dist/commands/epic/view.d.ts +13 -0
  131. package/dist/commands/epic/view.js +117 -0
  132. package/dist/commands/execution/index.d.ts +13 -0
  133. package/dist/commands/execution/index.js +70 -0
  134. package/dist/commands/execution/list.d.ts +15 -0
  135. package/dist/commands/execution/list.js +144 -0
  136. package/dist/commands/execution/logs.d.ts +18 -0
  137. package/dist/commands/execution/logs.js +161 -0
  138. package/dist/commands/execution/stop.d.ts +22 -0
  139. package/dist/commands/execution/stop.js +248 -0
  140. package/dist/commands/gh/index.d.ts +9 -0
  141. package/dist/commands/gh/index.js +53 -0
  142. package/dist/commands/gh/login.d.ts +6 -0
  143. package/dist/commands/gh/login.js +57 -0
  144. package/dist/commands/gh/status.d.ts +6 -0
  145. package/dist/commands/gh/status.js +48 -0
  146. package/dist/commands/gh/token.d.ts +6 -0
  147. package/dist/commands/gh/token.js +59 -0
  148. package/dist/commands/init.d.ts +26 -0
  149. package/dist/commands/init.js +200 -0
  150. package/dist/commands/phase/create.d.ts +22 -0
  151. package/dist/commands/phase/create.js +123 -0
  152. package/dist/commands/phase/delete.d.ts +17 -0
  153. package/dist/commands/phase/delete.js +73 -0
  154. package/dist/commands/phase/list.d.ts +12 -0
  155. package/dist/commands/phase/list.js +76 -0
  156. package/dist/commands/phase/move.d.ts +17 -0
  157. package/dist/commands/phase/move.js +115 -0
  158. package/dist/commands/phase/template/apply.d.ts +17 -0
  159. package/dist/commands/phase/template/apply.js +106 -0
  160. package/dist/commands/phase/template/create.d.ts +16 -0
  161. package/dist/commands/phase/template/create.js +58 -0
  162. package/dist/commands/phase/template/delete.d.ts +17 -0
  163. package/dist/commands/phase/template/delete.js +98 -0
  164. package/dist/commands/phase/template/index.d.ts +15 -0
  165. package/dist/commands/phase/template/index.js +128 -0
  166. package/dist/commands/phase/template/list.d.ts +16 -0
  167. package/dist/commands/phase/template/list.js +95 -0
  168. package/dist/commands/phase/template/update.d.ts +17 -0
  169. package/dist/commands/phase/template/update.js +89 -0
  170. package/dist/commands/phase/update.d.ts +23 -0
  171. package/dist/commands/phase/update.js +174 -0
  172. package/dist/commands/pmo/init.d.ts +25 -0
  173. package/dist/commands/pmo/init.js +341 -0
  174. package/dist/commands/pr/create.d.ts +17 -0
  175. package/dist/commands/pr/create.js +242 -0
  176. package/dist/commands/pr/index.d.ts +9 -0
  177. package/dist/commands/pr/index.js +68 -0
  178. package/dist/commands/pr/link.d.ts +14 -0
  179. package/dist/commands/pr/link.js +212 -0
  180. package/dist/commands/pr/status.d.ts +12 -0
  181. package/dist/commands/pr/status.js +161 -0
  182. package/dist/commands/project/archive.d.ts +17 -0
  183. package/dist/commands/project/archive.js +83 -0
  184. package/dist/commands/project/create.d.ts +22 -0
  185. package/dist/commands/project/create.js +143 -0
  186. package/dist/commands/project/delete.d.ts +17 -0
  187. package/dist/commands/project/delete.js +128 -0
  188. package/dist/commands/project/index.d.ts +13 -0
  189. package/dist/commands/project/index.js +64 -0
  190. package/dist/commands/project/list.d.ts +14 -0
  191. package/dist/commands/project/list.js +96 -0
  192. package/dist/commands/project/spec.d.ts +18 -0
  193. package/dist/commands/project/spec.js +216 -0
  194. package/dist/commands/project/unarchive.d.ts +15 -0
  195. package/dist/commands/project/unarchive.js +35 -0
  196. package/dist/commands/project/view.d.ts +16 -0
  197. package/dist/commands/project/view.js +94 -0
  198. package/dist/commands/repo/add.d.ts +21 -0
  199. package/dist/commands/repo/add.js +118 -0
  200. package/dist/commands/repo/index.d.ts +13 -0
  201. package/dist/commands/repo/index.js +114 -0
  202. package/dist/commands/repo/list.d.ts +13 -0
  203. package/dist/commands/repo/list.js +96 -0
  204. package/dist/commands/repo/remove.d.ts +23 -0
  205. package/dist/commands/repo/remove.js +217 -0
  206. package/dist/commands/repo/view.d.ts +15 -0
  207. package/dist/commands/repo/view.js +99 -0
  208. package/dist/commands/session/attach.d.ts +40 -0
  209. package/dist/commands/session/attach.js +307 -0
  210. package/dist/commands/session/index.d.ts +13 -0
  211. package/dist/commands/session/index.js +64 -0
  212. package/dist/commands/session/list.d.ts +21 -0
  213. package/dist/commands/session/list.js +181 -0
  214. package/dist/commands/spec/create.d.ts +19 -0
  215. package/dist/commands/spec/create.js +130 -0
  216. package/dist/commands/spec/index.d.ts +13 -0
  217. package/dist/commands/spec/index.js +68 -0
  218. package/dist/commands/spec/link/depends.d.ts +14 -0
  219. package/dist/commands/spec/link/depends.js +64 -0
  220. package/dist/commands/spec/link/duplicates.d.ts +14 -0
  221. package/dist/commands/spec/link/duplicates.js +63 -0
  222. package/dist/commands/spec/link/index.d.ts +19 -0
  223. package/dist/commands/spec/link/index.js +200 -0
  224. package/dist/commands/spec/link/relates.d.ts +14 -0
  225. package/dist/commands/spec/link/relates.js +63 -0
  226. package/dist/commands/spec/link/remove.d.ts +16 -0
  227. package/dist/commands/spec/link/remove.js +94 -0
  228. package/dist/commands/spec/list.d.ts +12 -0
  229. package/dist/commands/spec/list.js +75 -0
  230. package/dist/commands/spec/plan.d.ts +15 -0
  231. package/dist/commands/spec/plan.js +108 -0
  232. package/dist/commands/spec/ticket.d.ts +18 -0
  233. package/dist/commands/spec/ticket.js +160 -0
  234. package/dist/commands/spec/view.d.ts +15 -0
  235. package/dist/commands/spec/view.js +163 -0
  236. package/dist/commands/status/create.d.ts +21 -0
  237. package/dist/commands/status/create.js +140 -0
  238. package/dist/commands/status/delete.d.ts +13 -0
  239. package/dist/commands/status/delete.js +77 -0
  240. package/dist/commands/status/index.d.ts +14 -0
  241. package/dist/commands/status/index.js +91 -0
  242. package/dist/commands/status/list.d.ts +12 -0
  243. package/dist/commands/status/list.js +93 -0
  244. package/dist/commands/status/move.d.ts +14 -0
  245. package/dist/commands/status/move.js +120 -0
  246. package/dist/commands/status/update.d.ts +20 -0
  247. package/dist/commands/status/update.js +180 -0
  248. package/dist/commands/template/delete.d.ts +15 -0
  249. package/dist/commands/template/delete.js +142 -0
  250. package/dist/commands/template/index.d.ts +10 -0
  251. package/dist/commands/template/index.js +64 -0
  252. package/dist/commands/template/list.d.ts +18 -0
  253. package/dist/commands/template/list.js +157 -0
  254. package/dist/commands/template/phase/apply.d.ts +14 -0
  255. package/dist/commands/template/phase/apply.js +41 -0
  256. package/dist/commands/template/phase/create.d.ts +12 -0
  257. package/dist/commands/template/phase/create.js +29 -0
  258. package/dist/commands/template/phase/delete.d.ts +13 -0
  259. package/dist/commands/template/phase/delete.js +34 -0
  260. package/dist/commands/template/phase/index.d.ts +10 -0
  261. package/dist/commands/template/phase/index.js +62 -0
  262. package/dist/commands/template/phase/list.d.ts +11 -0
  263. package/dist/commands/template/phase/list.js +34 -0
  264. package/dist/commands/template/phase/update.d.ts +13 -0
  265. package/dist/commands/template/phase/update.js +35 -0
  266. package/dist/commands/template/ticket/apply.d.ts +17 -0
  267. package/dist/commands/template/ticket/apply.js +58 -0
  268. package/dist/commands/template/ticket/delete.d.ts +13 -0
  269. package/dist/commands/template/ticket/delete.js +34 -0
  270. package/dist/commands/template/ticket/index.d.ts +10 -0
  271. package/dist/commands/template/ticket/index.js +62 -0
  272. package/dist/commands/template/ticket/list.d.ts +11 -0
  273. package/dist/commands/template/ticket/list.js +34 -0
  274. package/dist/commands/template/ticket/save.d.ts +13 -0
  275. package/dist/commands/template/ticket/save.js +35 -0
  276. package/dist/commands/ticket/bulk.d.ts +13 -0
  277. package/dist/commands/ticket/bulk.js +145 -0
  278. package/dist/commands/ticket/complete.d.ts +16 -0
  279. package/dist/commands/ticket/complete.js +170 -0
  280. package/dist/commands/ticket/create.d.ts +22 -0
  281. package/dist/commands/ticket/create.js +390 -0
  282. package/dist/commands/ticket/delete.d.ts +16 -0
  283. package/dist/commands/ticket/delete.js +178 -0
  284. package/dist/commands/ticket/edit.d.ts +27 -0
  285. package/dist/commands/ticket/edit.js +322 -0
  286. package/dist/commands/ticket/epic.d.ts +20 -0
  287. package/dist/commands/ticket/epic.js +333 -0
  288. package/dist/commands/ticket/index.d.ts +13 -0
  289. package/dist/commands/ticket/index.js +103 -0
  290. package/dist/commands/ticket/link/block.d.ts +14 -0
  291. package/dist/commands/ticket/link/block.js +94 -0
  292. package/dist/commands/ticket/link/duplicates.d.ts +14 -0
  293. package/dist/commands/ticket/link/duplicates.js +93 -0
  294. package/dist/commands/ticket/link/index.d.ts +19 -0
  295. package/dist/commands/ticket/link/index.js +239 -0
  296. package/dist/commands/ticket/link/relates.d.ts +14 -0
  297. package/dist/commands/ticket/link/relates.js +93 -0
  298. package/dist/commands/ticket/link/remove.d.ts +16 -0
  299. package/dist/commands/ticket/link/remove.js +128 -0
  300. package/dist/commands/ticket/list.d.ts +24 -0
  301. package/dist/commands/ticket/list.js +431 -0
  302. package/dist/commands/ticket/move.d.ts +18 -0
  303. package/dist/commands/ticket/move.js +212 -0
  304. package/dist/commands/ticket/project.d.ts +18 -0
  305. package/dist/commands/ticket/project.js +254 -0
  306. package/dist/commands/ticket/reassign.d.ts +19 -0
  307. package/dist/commands/ticket/reassign.js +279 -0
  308. package/dist/commands/ticket/spec.d.ts +18 -0
  309. package/dist/commands/ticket/spec.js +259 -0
  310. package/dist/commands/ticket/status.d.ts +13 -0
  311. package/dist/commands/ticket/status.js +87 -0
  312. package/dist/commands/ticket/template/apply.d.ts +25 -0
  313. package/dist/commands/ticket/template/apply.js +249 -0
  314. package/dist/commands/ticket/template/create.d.ts +19 -0
  315. package/dist/commands/ticket/template/create.js +210 -0
  316. package/dist/commands/ticket/template/delete.d.ts +17 -0
  317. package/dist/commands/ticket/template/delete.js +92 -0
  318. package/dist/commands/ticket/template/index.d.ts +15 -0
  319. package/dist/commands/ticket/template/index.js +118 -0
  320. package/dist/commands/ticket/template/list.d.ts +16 -0
  321. package/dist/commands/ticket/template/list.js +110 -0
  322. package/dist/commands/ticket/template/save.d.ts +14 -0
  323. package/dist/commands/ticket/template/save.js +110 -0
  324. package/dist/commands/ticket/update.d.ts +18 -0
  325. package/dist/commands/ticket/update.js +325 -0
  326. package/dist/commands/ticket/view.d.ts +13 -0
  327. package/dist/commands/ticket/view.js +80 -0
  328. package/dist/commands/whoami.d.ts +9 -0
  329. package/dist/commands/whoami.js +103 -0
  330. package/dist/commands/work/complete.d.ts +13 -0
  331. package/dist/commands/work/complete.js +121 -0
  332. package/dist/commands/work/index.d.ts +13 -0
  333. package/dist/commands/work/index.js +70 -0
  334. package/dist/commands/work/ready.d.ts +24 -0
  335. package/dist/commands/work/ready.js +290 -0
  336. package/dist/commands/work/revise.d.ts +19 -0
  337. package/dist/commands/work/revise.js +377 -0
  338. package/dist/commands/work/spawn-all.d.ts +17 -0
  339. package/dist/commands/work/spawn-all.js +58 -0
  340. package/dist/commands/work/spawn.d.ts +29 -0
  341. package/dist/commands/work/spawn.js +728 -0
  342. package/dist/commands/work/start.d.ts +39 -0
  343. package/dist/commands/work/start.js +1393 -0
  344. package/dist/commands/work/watch.d.ts +31 -0
  345. package/dist/commands/work/watch.js +359 -0
  346. package/dist/commands/workflow/create.d.ts +18 -0
  347. package/dist/commands/workflow/create.js +119 -0
  348. package/dist/commands/workflow/delete.d.ts +17 -0
  349. package/dist/commands/workflow/delete.js +119 -0
  350. package/dist/commands/workflow/index.d.ts +15 -0
  351. package/dist/commands/workflow/index.js +75 -0
  352. package/dist/commands/workflow/list.d.ts +15 -0
  353. package/dist/commands/workflow/list.js +75 -0
  354. package/dist/commands/workflow/switch.d.ts +13 -0
  355. package/dist/commands/workflow/switch.js +117 -0
  356. package/dist/commands/workflow/view.d.ts +16 -0
  357. package/dist/commands/workflow/view.js +114 -0
  358. package/dist/commands/workspace/add.d.ts +12 -0
  359. package/dist/commands/workspace/add.js +74 -0
  360. package/dist/commands/workspace/list.d.ts +9 -0
  361. package/dist/commands/workspace/list.js +153 -0
  362. package/dist/commands/workspace/remove.d.ts +13 -0
  363. package/dist/commands/workspace/remove.js +98 -0
  364. package/dist/commands/workspace/use.d.ts +12 -0
  365. package/dist/commands/workspace/use.js +111 -0
  366. package/dist/hooks/init.d.ts +11 -0
  367. package/dist/hooks/init.js +57 -0
  368. package/dist/index.d.ts +1 -0
  369. package/dist/index.js +1 -0
  370. package/dist/lib/agents/commands.d.ts +189 -0
  371. package/dist/lib/agents/commands.js +893 -0
  372. package/dist/lib/agents/index.d.ts +54 -0
  373. package/dist/lib/agents/index.js +382 -0
  374. package/dist/lib/branch/index.d.ts +120 -0
  375. package/dist/lib/branch/index.js +334 -0
  376. package/dist/lib/colors.d.ts +94 -0
  377. package/dist/lib/colors.js +68 -0
  378. package/dist/lib/commands/docker-command.d.ts +21 -0
  379. package/dist/lib/commands/docker-command.js +27 -0
  380. package/dist/lib/database/index.d.ts +176 -0
  381. package/dist/lib/database/index.js +581 -0
  382. package/dist/lib/docker/resolve.d.ts +38 -0
  383. package/dist/lib/docker/resolve.js +175 -0
  384. package/dist/lib/execution/config.d.ts +150 -0
  385. package/dist/lib/execution/config.js +541 -0
  386. package/dist/lib/execution/devcontainer.d.ts +85 -0
  387. package/dist/lib/execution/devcontainer.js +594 -0
  388. package/dist/lib/execution/index.d.ts +10 -0
  389. package/dist/lib/execution/index.js +10 -0
  390. package/dist/lib/execution/runners.d.ts +53 -0
  391. package/dist/lib/execution/runners.js +1182 -0
  392. package/dist/lib/execution/spawner.d.ts +85 -0
  393. package/dist/lib/execution/spawner.js +548 -0
  394. package/dist/lib/execution/storage.d.ts +159 -0
  395. package/dist/lib/execution/storage.js +425 -0
  396. package/dist/lib/execution/types.d.ts +145 -0
  397. package/dist/lib/execution/types.js +157 -0
  398. package/dist/lib/init/index.d.ts +75 -0
  399. package/dist/lib/init/index.js +355 -0
  400. package/dist/lib/machine-config.d.ts +170 -0
  401. package/dist/lib/machine-config.js +386 -0
  402. package/dist/lib/pmo/base-command.d.ts +195 -0
  403. package/dist/lib/pmo/base-command.js +319 -0
  404. package/dist/lib/pmo/create-spec-folders.d.ts +43 -0
  405. package/dist/lib/pmo/create-spec-folders.js +64 -0
  406. package/dist/lib/pmo/epic-files.d.ts +56 -0
  407. package/dist/lib/pmo/epic-files.js +195 -0
  408. package/dist/lib/pmo/find-pmo.d.ts +14 -0
  409. package/dist/lib/pmo/find-pmo.js +172 -0
  410. package/dist/lib/pmo/index.d.ts +109 -0
  411. package/dist/lib/pmo/index.js +501 -0
  412. package/dist/lib/pmo/markdown.d.ts +31 -0
  413. package/dist/lib/pmo/markdown.js +245 -0
  414. package/dist/lib/pmo/pmo-context.d.ts +27 -0
  415. package/dist/lib/pmo/pmo-context.js +44 -0
  416. package/dist/lib/pmo/schema.d.ts +82 -0
  417. package/dist/lib/pmo/schema.js +531 -0
  418. package/dist/lib/pmo/spec-parser.d.ts +25 -0
  419. package/dist/lib/pmo/spec-parser.js +205 -0
  420. package/dist/lib/pmo/spec-types.d.ts +43 -0
  421. package/dist/lib/pmo/spec-types.js +7 -0
  422. package/dist/lib/pmo/storage/actions.d.ts +34 -0
  423. package/dist/lib/pmo/storage/actions.js +177 -0
  424. package/dist/lib/pmo/storage/base.d.ts +47 -0
  425. package/dist/lib/pmo/storage/base.js +858 -0
  426. package/dist/lib/pmo/storage/dependencies.d.ts +61 -0
  427. package/dist/lib/pmo/storage/dependencies.js +267 -0
  428. package/dist/lib/pmo/storage/epics.d.ts +46 -0
  429. package/dist/lib/pmo/storage/epics.js +243 -0
  430. package/dist/lib/pmo/storage/helpers.d.ts +33 -0
  431. package/dist/lib/pmo/storage/helpers.js +148 -0
  432. package/dist/lib/pmo/storage/index.d.ts +186 -0
  433. package/dist/lib/pmo/storage/index.js +689 -0
  434. package/dist/lib/pmo/storage/phases.d.ts +65 -0
  435. package/dist/lib/pmo/storage/phases.js +392 -0
  436. package/dist/lib/pmo/storage/projects.d.ts +79 -0
  437. package/dist/lib/pmo/storage/projects.js +303 -0
  438. package/dist/lib/pmo/storage/specs.d.ts +77 -0
  439. package/dist/lib/pmo/storage/specs.js +389 -0
  440. package/dist/lib/pmo/storage/statuses.d.ts +63 -0
  441. package/dist/lib/pmo/storage/statuses.js +404 -0
  442. package/dist/lib/pmo/storage/subtasks.d.ts +37 -0
  443. package/dist/lib/pmo/storage/subtasks.js +184 -0
  444. package/dist/lib/pmo/storage/templates.d.ts +40 -0
  445. package/dist/lib/pmo/storage/templates.js +210 -0
  446. package/dist/lib/pmo/storage/tickets.d.ts +57 -0
  447. package/dist/lib/pmo/storage/tickets.js +453 -0
  448. package/dist/lib/pmo/storage/types.d.ts +200 -0
  449. package/dist/lib/pmo/storage/types.js +5 -0
  450. package/dist/lib/pmo/storage/views.d.ts +44 -0
  451. package/dist/lib/pmo/storage/views.js +355 -0
  452. package/dist/lib/pmo/storage-sqlite.d.ts +7 -0
  453. package/dist/lib/pmo/storage-sqlite.js +7 -0
  454. package/dist/lib/pmo/sync-manager.d.ts +92 -0
  455. package/dist/lib/pmo/sync-manager.js +229 -0
  456. package/dist/lib/pmo/types.d.ts +710 -0
  457. package/dist/lib/pmo/types.js +108 -0
  458. package/dist/lib/pmo/utils.d.ts +122 -0
  459. package/dist/lib/pmo/utils.js +174 -0
  460. package/dist/lib/pmo/watcher.d.ts +43 -0
  461. package/dist/lib/pmo/watcher.js +208 -0
  462. package/dist/lib/pr/index.d.ts +150 -0
  463. package/dist/lib/pr/index.js +483 -0
  464. package/dist/lib/prompt-json.d.ts +231 -0
  465. package/dist/lib/prompt-json.js +213 -0
  466. package/dist/lib/repos/index.d.ts +81 -0
  467. package/dist/lib/repos/index.js +679 -0
  468. package/dist/lib/styles.d.ts +98 -0
  469. package/dist/lib/styles.js +195 -0
  470. package/dist/lib/themes.d.ts +128 -0
  471. package/dist/lib/themes.js +301 -0
  472. package/dist/lib/ui/BoardUI.d.ts +21 -0
  473. package/dist/lib/ui/BoardUI.js +85 -0
  474. package/dist/lib/ui/ClaimTicketUI.d.ts +17 -0
  475. package/dist/lib/ui/ClaimTicketUI.js +64 -0
  476. package/dist/lib/ui/CreateTicketUI.d.ts +13 -0
  477. package/dist/lib/ui/CreateTicketUI.js +101 -0
  478. package/dist/lib/workspace.d.ts +66 -0
  479. package/dist/lib/workspace.js +204 -0
  480. package/oclif.manifest.json +10593 -0
  481. package/package.json +103 -56
  482. package/LICENSE +0 -21
  483. package/dist/bin/prlt.d.ts +0 -11
  484. package/dist/bin/prlt.d.ts.map +0 -1
  485. package/dist/bin/prlt.js +0 -144
  486. package/dist/bin/prlt.js.map +0 -1
  487. package/dist/lib/config/index.d.ts +0 -14
  488. package/dist/lib/config/index.d.ts.map +0 -1
  489. package/dist/lib/config/index.js +0 -142
  490. package/dist/lib/config/index.js.map +0 -1
  491. package/dist/lib/config/upgrade.d.ts +0 -2
  492. package/dist/lib/config/upgrade.d.ts.map +0 -1
  493. package/dist/lib/config/upgrade.js +0 -248
  494. package/dist/lib/config/upgrade.js.map +0 -1
  495. package/dist/lib/themes/index.d.ts +0 -8
  496. package/dist/lib/themes/index.d.ts.map +0 -1
  497. package/dist/lib/themes/index.js +0 -80
  498. package/dist/lib/themes/index.js.map +0 -1
  499. package/dist/lib/utils/helpers.d.ts +0 -4
  500. package/dist/lib/utils/helpers.d.ts.map +0 -1
  501. package/dist/lib/utils/helpers.js +0 -39
  502. package/dist/lib/utils/helpers.js.map +0 -1
  503. package/dist/lib/utils/logger.d.ts +0 -4
  504. package/dist/lib/utils/logger.d.ts.map +0 -1
  505. package/dist/lib/utils/logger.js +0 -28
  506. package/dist/lib/utils/logger.js.map +0 -1
  507. package/dist/lib/workspace/index.d.ts +0 -13
  508. package/dist/lib/workspace/index.d.ts.map +0 -1
  509. package/dist/lib/workspace/index.js +0 -116
  510. package/dist/lib/workspace/index.js.map +0 -1
  511. package/dist/lib/worktree/index.d.ts +0 -7
  512. package/dist/lib/worktree/index.d.ts.map +0 -1
  513. package/dist/lib/worktree/index.js +0 -362
  514. package/dist/lib/worktree/index.js.map +0 -1
  515. package/dist/lib/worktree/migrate.d.ts +0 -2
  516. package/dist/lib/worktree/migrate.d.ts.map +0 -1
  517. package/dist/lib/worktree/migrate.js +0 -214
  518. package/dist/lib/worktree/migrate.js.map +0 -1
  519. package/dist/lib/worktree/repair.d.ts +0 -3
  520. package/dist/lib/worktree/repair.d.ts.map +0 -1
  521. package/dist/lib/worktree/repair.js +0 -320
  522. package/dist/lib/worktree/repair.js.map +0 -1
  523. package/dist/types/index.d.ts +0 -57
  524. package/dist/types/index.d.ts.map +0 -1
  525. package/dist/types/index.js +0 -3
  526. package/dist/types/index.js.map +0 -1
@@ -0,0 +1,87 @@
1
+ import { Flags } from '@oclif/core';
2
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
3
+ import { styles } from '../../lib/styles.js';
4
+ // Progress bar helper
5
+ function progressBar(percent, width = 20) {
6
+ const filled = Math.round((percent / 100) * width);
7
+ const empty = width - filled;
8
+ return 'ā–ˆ'.repeat(filled) + 'ā–‘'.repeat(empty);
9
+ }
10
+ export default class EpicList extends PMOCommand {
11
+ static description = 'List all epics';
12
+ static examples = [
13
+ '<%= config.bin %> <%= command.id %>',
14
+ '<%= config.bin %> <%= command.id %> --status active',
15
+ ];
16
+ static flags = {
17
+ ...pmoBaseFlags,
18
+ status: Flags.string({
19
+ char: 's',
20
+ description: 'Filter by status',
21
+ options: ['active', 'draft', 'complete', 'dropped', 'future'],
22
+ }),
23
+ };
24
+ async execute() {
25
+ const { flags } = await this.parse(EpicList);
26
+ const projectId = await this.requireProject();
27
+ const epics = await this.storage.listEpics(projectId, flags.status ? { status: flags.status } : undefined);
28
+ if (epics.length === 0) {
29
+ this.log(styles.muted('\nNo epics found.'));
30
+ this.log(styles.muted('Create one with: prlt epic create'));
31
+ return;
32
+ }
33
+ // Group epics by status
34
+ const grouped = this.groupByStatus(epics);
35
+ // Get ticket counts for each epic
36
+ const epicProgress = new Map();
37
+ for (const epic of epics) {
38
+ const tickets = await this.storage.getTicketsForEpic(projectId, epic.id);
39
+ const done = tickets.filter((t) => t.status === 'done').length;
40
+ epicProgress.set(epic.id, { done, total: tickets.length });
41
+ }
42
+ const projectName = await this.getProjectName(projectId);
43
+ this.log(`\nšŸŽÆ ${styles.emphasis('Epics')} - ${projectName}`);
44
+ this.log('═'.repeat(55));
45
+ const statusOrder = ['active', 'draft', 'complete', 'dropped', 'future'];
46
+ const statusEmoji = {
47
+ active: '🟢',
48
+ draft: '🟔',
49
+ complete: 'āœ…',
50
+ dropped: 'āŒ',
51
+ future: 'šŸ”®',
52
+ };
53
+ for (const status of statusOrder) {
54
+ const statusEpics = grouped.get(status);
55
+ if (!statusEpics || statusEpics.length === 0)
56
+ continue;
57
+ this.log(`\n${statusEmoji[status]} ${status.toUpperCase()} (${statusEpics.length})`);
58
+ for (const epic of statusEpics) {
59
+ const progress = epicProgress.get(epic.id) || { done: 0, total: 0 };
60
+ const percent = progress.total > 0 ? Math.round((progress.done / progress.total) * 100) : 0;
61
+ const bar = progressBar(percent);
62
+ const readyToArchive = percent === 100 && status === 'active' ? ' ← ready to archive!' : '';
63
+ // Show rank (position + 1) for active epics
64
+ const rank = status === 'active' ? `#${epic.position + 1} ` : ' ';
65
+ this.log(` ${rank}${epic.id.padEnd(10)} ${epic.title.substring(0, 27).padEnd(27)} ${bar} ${String(percent).padStart(3)}% (${progress.done}/${progress.total})${readyToArchive}`);
66
+ }
67
+ }
68
+ this.log('\n' + '═'.repeat(55));
69
+ const counts = statusOrder
70
+ .map(s => `${grouped.get(s)?.length || 0} ${s}`)
71
+ .filter(s => !s.startsWith('0'))
72
+ .join(', ');
73
+ this.log(`Total: ${epics.length} epics (${counts})`);
74
+ this.log(styles.muted('\nCommands:'));
75
+ this.log(styles.muted(' prlt epic progress <id> View detailed progress'));
76
+ this.log(styles.muted(' prlt epic archive <id> Archive completed epic'));
77
+ }
78
+ groupByStatus(epics) {
79
+ const grouped = new Map();
80
+ for (const epic of epics) {
81
+ const list = grouped.get(epic.status) || [];
82
+ list.push(epic);
83
+ grouped.set(epic.status, list);
84
+ }
85
+ return grouped;
86
+ }
87
+ }
@@ -0,0 +1,15 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class EpicMove 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
+ status: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
8
+ };
9
+ static flags: {
10
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ };
14
+ execute(): Promise<void>;
15
+ }
@@ -0,0 +1,184 @@
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 { moveEpicFile, getRelativeEpicPath } from '../../lib/pmo/epic-files.js';
6
+ import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
7
+ const STATUS_CHOICES = [
8
+ { name: 'active (currently working on)', value: 'active' },
9
+ { name: 'draft (planning phase)', value: 'draft' },
10
+ { name: 'complete (all work done)', value: 'complete' },
11
+ { name: 'dropped (cancelled/won\'t do)', value: 'dropped' },
12
+ { name: 'future (backlog for later)', value: 'future' },
13
+ ];
14
+ export default class EpicMove extends PMOCommand {
15
+ static description = 'Move epic between status folders';
16
+ static examples = [
17
+ '<%= config.bin %> <%= command.id %> EPIC-002 complete',
18
+ '<%= config.bin %> <%= command.id %> --force',
19
+ ];
20
+ static args = {
21
+ id: Args.string({
22
+ description: 'Epic ID',
23
+ required: false,
24
+ }),
25
+ status: Args.string({
26
+ description: 'Target status',
27
+ required: false,
28
+ options: ['active', 'draft', 'complete', 'dropped', 'future'],
29
+ }),
30
+ };
31
+ static flags = {
32
+ ...pmoBaseFlags,
33
+ json: Flags.boolean({
34
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
35
+ default: false,
36
+ }),
37
+ force: Flags.boolean({
38
+ char: 'f',
39
+ description: 'Skip validation checks',
40
+ default: false,
41
+ }),
42
+ };
43
+ async execute() {
44
+ const { args, flags } = await this.parse(EpicMove);
45
+ const projectId = await this.requireProject();
46
+ // Check if JSON output mode is active
47
+ const jsonMode = shouldOutputJson(flags);
48
+ // Helper to handle errors in JSON mode
49
+ const handleError = (code, message) => {
50
+ if (jsonMode) {
51
+ outputErrorAsJson(code, message, createMetadata('epic move', flags));
52
+ this.exit(1);
53
+ }
54
+ this.error(message);
55
+ };
56
+ let epicId = args.id;
57
+ let targetStatus = args.status;
58
+ // If no ID provided, prompt for selection
59
+ if (!epicId) {
60
+ const epics = await this.storage.listEpics(projectId);
61
+ if (epics.length === 0) {
62
+ if (jsonMode) {
63
+ outputErrorAsJson('NO_EPICS', 'No epics found.', createMetadata('epic move', flags));
64
+ return;
65
+ }
66
+ this.log(styles.muted('\nNo epics found.'));
67
+ return;
68
+ }
69
+ // Get ticket counts
70
+ const choices = await Promise.all(epics.map(async (e) => {
71
+ const tickets = await this.storage.getTicketsForEpic(projectId, e.id);
72
+ const done = tickets.filter((t) => t.status === 'done').length;
73
+ return {
74
+ name: `${e.id} ${e.title} (${e.status}) [${done}/${tickets.length} complete]`,
75
+ value: e.id,
76
+ };
77
+ }));
78
+ // In JSON mode, output epic selection prompt
79
+ if (jsonMode) {
80
+ outputPromptAsJson(buildPromptConfig('list', 'id', 'Select epic to move:', choices), createMetadata('epic move', flags));
81
+ return;
82
+ }
83
+ const { selected } = await inquirer.prompt([{
84
+ type: 'list',
85
+ name: 'selected',
86
+ message: 'Select epic to move:',
87
+ choices,
88
+ }]);
89
+ epicId = selected;
90
+ }
91
+ const epic = await this.storage.getEpic(epicId);
92
+ if (!epic) {
93
+ return handleError('EPIC_NOT_FOUND', `Epic not found: ${epicId}`);
94
+ }
95
+ // If no status provided, prompt for selection
96
+ if (!targetStatus) {
97
+ const statusChoices = STATUS_CHOICES.filter(c => c.value !== epic.status);
98
+ // In JSON mode, output status selection prompt
99
+ if (jsonMode) {
100
+ outputPromptAsJson(buildPromptConfig('list', 'status', 'Move to which status?', statusChoices), createMetadata('epic move', flags));
101
+ return;
102
+ }
103
+ const { selected } = await inquirer.prompt([{
104
+ type: 'list',
105
+ name: 'selected',
106
+ message: 'Move to which status?',
107
+ choices: statusChoices,
108
+ }]);
109
+ targetStatus = selected;
110
+ }
111
+ if (targetStatus === epic.status) {
112
+ this.log(styles.muted(`Epic ${epicId} is already in ${targetStatus} status.`));
113
+ return;
114
+ }
115
+ // Validation checks
116
+ const tickets = await this.storage.getTicketsForEpic(projectId, epicId);
117
+ const doneTickets = tickets.filter((t) => t.status === 'done').length;
118
+ const allComplete = doneTickets === tickets.length;
119
+ // Moving to complete - check ticket completion
120
+ if (targetStatus === 'complete' && !allComplete && !flags.force) {
121
+ // In JSON mode, output confirmation prompt
122
+ if (jsonMode) {
123
+ const confirmChoices = [
124
+ { name: 'No', value: 'false' },
125
+ { name: 'Yes', value: 'true' },
126
+ ];
127
+ outputPromptAsJson(buildPromptConfig('list', 'confirm', `Not all tickets are complete (${doneTickets}/${tickets.length} done). Continue moving to complete anyway?`, confirmChoices), createMetadata('epic move', flags));
128
+ return;
129
+ }
130
+ this.log(styles.warning(`\nāš ļø Not all tickets are complete (${doneTickets}/${tickets.length} done)`));
131
+ const { confirm } = await inquirer.prompt([{
132
+ type: 'list',
133
+ name: 'confirm',
134
+ message: 'Continue moving to complete anyway?',
135
+ choices: [
136
+ { name: 'No', value: false },
137
+ { name: 'Yes', value: true },
138
+ ],
139
+ default: false,
140
+ }]);
141
+ if (!confirm) {
142
+ this.log(styles.muted('Cancelled.'));
143
+ return;
144
+ }
145
+ }
146
+ // Moving to dropped - confirm cancellation
147
+ if (targetStatus === 'dropped' && !flags.force) {
148
+ // In JSON mode, output confirmation prompt
149
+ if (jsonMode) {
150
+ const confirmChoices = [
151
+ { name: 'No', value: 'false' },
152
+ { name: 'Yes', value: 'true' },
153
+ ];
154
+ outputPromptAsJson(buildPromptConfig('list', 'confirmDrop', 'This will mark the epic as dropped/cancelled. Continue?', confirmChoices), createMetadata('epic move', flags));
155
+ return;
156
+ }
157
+ this.log(styles.warning('\nāš ļø This will mark the epic as dropped/cancelled'));
158
+ const { confirm } = await inquirer.prompt([{
159
+ type: 'list',
160
+ name: 'confirm',
161
+ message: 'Continue?',
162
+ choices: [
163
+ { name: 'No', value: false },
164
+ { name: 'Yes', value: true },
165
+ ],
166
+ default: false,
167
+ }]);
168
+ if (!confirm) {
169
+ this.log(styles.muted('Cancelled.'));
170
+ return;
171
+ }
172
+ }
173
+ this.log(`\nMoving: ${epicId} "${epic.title}"`);
174
+ this.log(`From: ${epic.status} → ${targetStatus}`);
175
+ // Move the epic file to new status directory
176
+ const moveResult = moveEpicFile(this.pmoPath, epicId, epic.status, targetStatus, projectId);
177
+ await this.storage.updateEpic(epicId, { status: targetStatus });
178
+ this.log(styles.success(`\nāœ… Moved epic ${styles.emphasis(epicId)} "${epic.title}" to ${targetStatus}`));
179
+ if (moveResult) {
180
+ const relativePath = getRelativeEpicPath(this.pmoPath, epicId, targetStatus, projectId);
181
+ this.log(styles.muted(` File: ${relativePath}`));
182
+ }
183
+ }
184
+ }
@@ -0,0 +1,16 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class EpicProgress 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
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ };
13
+ execute(): Promise<void>;
14
+ private showSingleProgress;
15
+ private showAllProgress;
16
+ }
@@ -0,0 +1,166 @@
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 { getRelativeEpicPath } from '../../lib/pmo/epic-files.js';
6
+ import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
7
+ // Progress bar helper
8
+ function progressBar(percent, width = 20) {
9
+ const filled = Math.round((percent / 100) * width);
10
+ const empty = width - filled;
11
+ return 'ā–ˆ'.repeat(filled) + 'ā–‘'.repeat(empty);
12
+ }
13
+ export default class EpicProgress extends PMOCommand {
14
+ static description = 'Show epic completion progress';
15
+ static examples = [
16
+ '<%= config.bin %> <%= command.id %> EPIC-001',
17
+ '<%= config.bin %> <%= command.id %> --all',
18
+ ];
19
+ static args = {
20
+ id: Args.string({
21
+ description: 'Epic ID',
22
+ required: false,
23
+ }),
24
+ };
25
+ static flags = {
26
+ ...pmoBaseFlags,
27
+ json: Flags.boolean({
28
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
29
+ default: false,
30
+ }),
31
+ all: Flags.boolean({
32
+ char: 'a',
33
+ description: 'Show progress for all epics',
34
+ default: false,
35
+ }),
36
+ };
37
+ async execute() {
38
+ const { args, flags } = await this.parse(EpicProgress);
39
+ const projectId = await this.requireProject();
40
+ // Check if JSON output mode is active
41
+ const jsonMode = shouldOutputJson(flags);
42
+ if (flags.all) {
43
+ await this.showAllProgress(projectId);
44
+ }
45
+ else {
46
+ let epicId = args.id;
47
+ // If no ID provided, prompt for selection
48
+ if (!epicId) {
49
+ const epics = await this.storage.listEpics(projectId);
50
+ if (epics.length === 0) {
51
+ if (jsonMode) {
52
+ outputErrorAsJson('NO_EPICS', 'No epics found.', createMetadata('epic progress', flags));
53
+ return;
54
+ }
55
+ this.log(styles.muted('\nNo epics found.'));
56
+ return;
57
+ }
58
+ // In JSON mode, output epic selection prompt
59
+ if (jsonMode) {
60
+ const epicChoices = epics.map(e => ({ name: `${e.id} ${e.title} (${e.status})`, value: e.id }));
61
+ outputPromptAsJson(buildPromptConfig('list', 'id', 'Select epic to view progress:', epicChoices), createMetadata('epic progress', flags));
62
+ return;
63
+ }
64
+ const { selected } = await inquirer.prompt([{
65
+ type: 'list',
66
+ name: 'selected',
67
+ message: 'Select epic to view progress:',
68
+ choices: epics.map(e => ({
69
+ name: `${e.id} ${e.title} (${e.status})`,
70
+ value: e.id,
71
+ })),
72
+ }]);
73
+ epicId = selected;
74
+ }
75
+ await this.showSingleProgress(projectId, epicId);
76
+ }
77
+ }
78
+ async showSingleProgress(projectId, epicId) {
79
+ const epic = await this.storage.getEpic(epicId);
80
+ if (!epic) {
81
+ this.error(`Epic not found: ${epicId}`);
82
+ }
83
+ const tickets = await this.storage.getTicketsForEpic(projectId, epicId);
84
+ const doneTickets = tickets.filter((t) => t.status === 'done').length;
85
+ const percent = tickets.length > 0 ? Math.round((doneTickets / tickets.length) * 100) : 0;
86
+ const relativePath = getRelativeEpicPath(this.pmoPath, epic.id, epic.status, projectId);
87
+ this.log(`\nšŸŽÆ Epic Progress: ${styles.emphasis(epic.id)} - ${epic.title}`);
88
+ this.log('═'.repeat(55));
89
+ this.log(`\nStatus: ${epic.status}`);
90
+ this.log(`File: ${relativePath}`);
91
+ this.log(`Tickets: ${doneTickets}/${tickets.length} complete (${percent}%)`);
92
+ this.log(`\n${progressBar(percent)} ${percent}%`);
93
+ // Group tickets by status/column
94
+ const byStatus = new Map();
95
+ for (const ticket of tickets) {
96
+ const key = ticket.statusName || 'Unknown';
97
+ const list = byStatus.get(key) || [];
98
+ list.push(ticket);
99
+ byStatus.set(key, list);
100
+ }
101
+ if (byStatus.size > 0) {
102
+ this.log('\nBreakdown by column:');
103
+ const statusEmoji = {
104
+ done: 'āœ…',
105
+ 'in_progress': '🚧',
106
+ blocked: 'šŸ”“',
107
+ ready: 'šŸ“‹',
108
+ backlog: 'šŸ“„',
109
+ };
110
+ for (const [status, statusTickets] of byStatus) {
111
+ const emoji = statusEmoji[status.toLowerCase()] || 'šŸ“‹';
112
+ this.log(` ${emoji} ${status}: ${statusTickets.length} ticket${statusTickets.length === 1 ? '' : 's'}`);
113
+ }
114
+ }
115
+ // Show remaining work
116
+ const remaining = tickets.filter((t) => t.status !== 'done');
117
+ if (remaining.length > 0) {
118
+ this.log('\nRemaining work:');
119
+ for (const ticket of remaining) {
120
+ const statusLabel = ticket.statusName || ticket.status;
121
+ this.log(` ${ticket.id}: ${ticket.title} [${statusLabel}]`);
122
+ }
123
+ }
124
+ }
125
+ async showAllProgress(projectId) {
126
+ const epics = await this.storage.listEpics(projectId);
127
+ if (epics.length === 0) {
128
+ this.log(styles.muted('\nNo epics found.'));
129
+ return;
130
+ }
131
+ this.log('\nšŸ“Š Epic Progress - All Epics');
132
+ this.log('═'.repeat(55));
133
+ // Group by status
134
+ const grouped = new Map();
135
+ for (const epic of epics) {
136
+ const list = grouped.get(epic.status) || [];
137
+ list.push(epic);
138
+ grouped.set(epic.status, list);
139
+ }
140
+ const statusOrder = ['active', 'draft', 'complete', 'dropped', 'future'];
141
+ const statusEmoji = {
142
+ active: '🟢',
143
+ draft: '🟔',
144
+ complete: 'āœ…',
145
+ dropped: 'āŒ',
146
+ future: 'šŸ”®',
147
+ };
148
+ for (const status of statusOrder) {
149
+ const statusEpics = grouped.get(status);
150
+ if (!statusEpics || statusEpics.length === 0)
151
+ continue;
152
+ this.log(`\n${statusEmoji[status]} ${status.toUpperCase()} (${statusEpics.length})`);
153
+ for (const epic of statusEpics) {
154
+ const tickets = await this.storage.getTicketsForEpic(projectId, epic.id);
155
+ const doneTickets = tickets.filter((t) => t.status === 'done').length;
156
+ const percent = tickets.length > 0 ? Math.round((doneTickets / tickets.length) * 100) : 0;
157
+ const bar = progressBar(percent);
158
+ const readyToArchive = percent === 100 && status === 'active' ? ' ← ready to archive' : '';
159
+ this.log(` ${epic.id.padEnd(10)} ${epic.title.substring(0, 30).padEnd(30)} ${bar} ${String(percent).padStart(3)}% (${doneTickets}/${tickets.length})${readyToArchive}`);
160
+ }
161
+ }
162
+ this.log(styles.muted('\nCommands:'));
163
+ this.log(styles.muted(' prlt epic progress <id> View detailed progress'));
164
+ this.log(styles.muted(' prlt epic archive <id> Archive completed epic'));
165
+ }
166
+ }
@@ -0,0 +1,15 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class EpicProject extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ epicId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ targetProject: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
8
+ };
9
+ static flags: {
10
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ 'with-tickets': import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ };
14
+ execute(): Promise<void>;
15
+ }