@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,431 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import { pmoBaseFlags } from '../../lib/pmo/index.js';
3
+ import { PRIORITIES } from '../../lib/pmo/types.js';
4
+ import { getPMOContext } from '../../lib/pmo/pmo-context.js';
5
+ import { styles, formatPriority, formatCategory, getColumnStyle, getColumnEmoji, divider, getPriorityStyle, } from '../../lib/styles.js';
6
+ // Priority order for grouping: P0, P1, P2, P3, None
7
+ const PRIORITY_ORDER = ['P0', 'P1', 'P2', 'P3', 'None'];
8
+ export default class TicketList extends Command {
9
+ static description = 'List tickets from the PMO board';
10
+ static examples = [
11
+ '<%= config.bin %> <%= command.id %>',
12
+ '<%= config.bin %> <%= command.id %> --column Backlog',
13
+ '<%= config.bin %> <%= command.id %> --priority URGENT',
14
+ '<%= config.bin %> <%= command.id %> --category bug',
15
+ '<%= config.bin %> <%= command.id %> --search "login"',
16
+ '<%= config.bin %> <%= command.id %> --project mobile-app',
17
+ '<%= config.bin %> <%= command.id %> --all',
18
+ '<%= config.bin %> <%= command.id %> --all --group-by priority',
19
+ '<%= config.bin %> <%= command.id %> -g priority',
20
+ ];
21
+ static flags = {
22
+ ...pmoBaseFlags,
23
+ column: Flags.string({
24
+ char: 'c',
25
+ description: 'Filter by column',
26
+ }),
27
+ priority: Flags.string({
28
+ char: 'p',
29
+ description: 'Filter by priority',
30
+ options: [...PRIORITIES],
31
+ }),
32
+ category: Flags.string({
33
+ description: 'Filter by category',
34
+ }),
35
+ search: Flags.string({
36
+ char: 's',
37
+ description: 'Search in title and description',
38
+ }),
39
+ format: Flags.string({
40
+ char: 'f',
41
+ description: 'Output format',
42
+ options: ['table', 'compact', 'json'],
43
+ default: 'table',
44
+ }),
45
+ all: Flags.boolean({
46
+ char: 'a',
47
+ description: 'Show tickets across all projects',
48
+ default: false,
49
+ }),
50
+ 'group-by': Flags.string({
51
+ char: 'g',
52
+ description: 'Group tickets by field',
53
+ options: ['status', 'priority'],
54
+ default: 'status',
55
+ }),
56
+ };
57
+ async run() {
58
+ const { flags } = await this.parse(TicketList);
59
+ // When --all is set, we don't need to select a specific project
60
+ // Otherwise, use the normal project selection flow
61
+ let pmoContext;
62
+ // Get PMO context - no project selection needed
63
+ pmoContext = await getPMOContext({
64
+ logger: (msg) => this.log(styles.muted(msg)),
65
+ });
66
+ try {
67
+ // Build filter
68
+ const filter = {};
69
+ if (flags.all) {
70
+ filter.allProjects = true;
71
+ }
72
+ else if (flags.project) {
73
+ filter.projectId = flags.project;
74
+ }
75
+ if (flags.column) {
76
+ filter.column = flags.column;
77
+ }
78
+ if (flags.priority) {
79
+ filter.priority = flags.priority;
80
+ }
81
+ if (flags.category) {
82
+ filter.category = flags.category;
83
+ }
84
+ if (flags.search) {
85
+ filter.search = flags.search;
86
+ }
87
+ // Determine projectId for the query
88
+ const projectId = flags.all ? undefined : (filter.projectId || undefined);
89
+ const tickets = await pmoContext.storage.listTickets(projectId, filter);
90
+ if (tickets.length === 0) {
91
+ this.log(styles.warning('No tickets found.'));
92
+ return;
93
+ }
94
+ const groupBy = flags['group-by'];
95
+ // Output based on format
96
+ if (flags.all) {
97
+ // Cross-project view
98
+ switch (flags.format) {
99
+ case 'json':
100
+ this.log(JSON.stringify(tickets, null, 2));
101
+ break;
102
+ case 'compact':
103
+ this.outputCrossProjectCompact(tickets, groupBy);
104
+ break;
105
+ default:
106
+ this.outputCrossProjectTable(tickets, groupBy);
107
+ }
108
+ }
109
+ else {
110
+ // Single project view - get projectId from first ticket or use flag
111
+ const actualProjectId = projectId || tickets[0]?.projectId;
112
+ if (!actualProjectId) {
113
+ this.log(styles.warning('No project found.'));
114
+ return;
115
+ }
116
+ const board = await pmoContext.storage.getBoard(actualProjectId);
117
+ const columns = board.columns.map(col => col.name);
118
+ switch (flags.format) {
119
+ case 'json':
120
+ this.log(JSON.stringify(tickets, null, 2));
121
+ break;
122
+ case 'compact':
123
+ this.outputCompact(tickets, columns, groupBy);
124
+ break;
125
+ default:
126
+ this.outputTable(tickets, columns, groupBy);
127
+ }
128
+ }
129
+ }
130
+ finally {
131
+ await pmoContext.storage.close();
132
+ }
133
+ }
134
+ outputCrossProjectTable(tickets, groupBy) {
135
+ if (groupBy === 'priority') {
136
+ this.outputCrossProjectTableByPriority(tickets);
137
+ return;
138
+ }
139
+ // Group tickets by project, then by column
140
+ const byProject = {};
141
+ for (const ticket of tickets) {
142
+ const projectName = ticket.projectName || ticket.projectId || 'Unknown';
143
+ if (!byProject[projectName]) {
144
+ byProject[projectName] = [];
145
+ }
146
+ byProject[projectName].push(ticket);
147
+ }
148
+ const projectNames = Object.keys(byProject).sort();
149
+ for (const projectName of projectNames) {
150
+ const projectTickets = byProject[projectName];
151
+ // Project header
152
+ this.log(styles.emphasis(`\n${projectName}`));
153
+ this.log(divider(60));
154
+ // Group by column within project
155
+ const byColumn = {};
156
+ for (const ticket of projectTickets) {
157
+ const col = ticket.statusName || 'Unknown';
158
+ if (!byColumn[col]) {
159
+ byColumn[col] = [];
160
+ }
161
+ byColumn[col].push(ticket);
162
+ }
163
+ const columns = Object.keys(byColumn).sort();
164
+ for (const col of columns) {
165
+ const colTickets = byColumn[col];
166
+ const headerColor = getColumnStyle(col);
167
+ this.log(headerColor(` ${getColumnEmoji(col)} ${col} (${colTickets.length})`));
168
+ colTickets.sort((a, b) => (a.position || 0) - (b.position || 0));
169
+ for (const ticket of colTickets) {
170
+ const priorityBadge = formatPriority(ticket.priority);
171
+ const categoryBadge = formatCategory(ticket.category);
172
+ this.log(` ${styles.code(ticket.id)} ${ticket.title} ${priorityBadge} ${categoryBadge}`);
173
+ if (ticket.description) {
174
+ const shortDesc = ticket.description.split('\n')[0].substring(0, 55);
175
+ this.log(styles.muted(` ${shortDesc}${ticket.description.length > 55 ? '...' : ''}`));
176
+ }
177
+ }
178
+ }
179
+ }
180
+ // Summary
181
+ this.log('\n' + divider(60));
182
+ this.log(styles.emphasis(`Total: ${tickets.length} ticket${tickets.length === 1 ? '' : 's'} across ${projectNames.length} project${projectNames.length === 1 ? '' : 's'}`));
183
+ }
184
+ outputCrossProjectTableByPriority(tickets) {
185
+ // Group tickets by priority
186
+ const byPriority = {};
187
+ for (const priority of PRIORITY_ORDER) {
188
+ byPriority[priority] = [];
189
+ }
190
+ for (const ticket of tickets) {
191
+ const priority = ticket.priority || 'None';
192
+ if (!byPriority[priority]) {
193
+ byPriority[priority] = [];
194
+ }
195
+ byPriority[priority].push(ticket);
196
+ }
197
+ for (const priority of PRIORITY_ORDER) {
198
+ const priorityTickets = byPriority[priority];
199
+ // Priority header
200
+ const headerColor = getPriorityStyle(priority);
201
+ this.log(headerColor(`\n${priority} (${priorityTickets.length})`));
202
+ this.log(divider(60));
203
+ if (priorityTickets.length === 0) {
204
+ this.log(styles.muted(' (empty)'));
205
+ continue;
206
+ }
207
+ // Sort by position within priority
208
+ priorityTickets.sort((a, b) => (a.position || 0) - (b.position || 0));
209
+ for (const ticket of priorityTickets) {
210
+ const statusBadge = ticket.statusName ? styles.muted(`[${ticket.statusName}]`) : '';
211
+ const categoryBadge = formatCategory(ticket.category);
212
+ const projectBadge = ticket.projectName ? styles.info(`[${ticket.projectName}]`) : '';
213
+ this.log(` ${styles.code(ticket.id)} ${ticket.title} ${statusBadge} ${categoryBadge} ${projectBadge}`);
214
+ if (ticket.description) {
215
+ const shortDesc = ticket.description.split('\n')[0].substring(0, 55);
216
+ this.log(styles.muted(` ${shortDesc}${ticket.description.length > 55 ? '...' : ''}`));
217
+ }
218
+ }
219
+ }
220
+ // Summary
221
+ this.log('\n' + divider(60));
222
+ this.log(styles.emphasis(`Total: ${tickets.length} ticket${tickets.length === 1 ? '' : 's'}`));
223
+ }
224
+ outputCrossProjectCompact(tickets, groupBy) {
225
+ if (groupBy === 'priority') {
226
+ this.outputCrossProjectCompactByPriority(tickets);
227
+ return;
228
+ }
229
+ // Group tickets by project
230
+ const byProject = {};
231
+ for (const ticket of tickets) {
232
+ const projectName = ticket.projectName || ticket.projectId || 'Unknown';
233
+ if (!byProject[projectName]) {
234
+ byProject[projectName] = [];
235
+ }
236
+ byProject[projectName].push(ticket);
237
+ }
238
+ const projectNames = Object.keys(byProject).sort();
239
+ for (const projectName of projectNames) {
240
+ const projectTickets = byProject[projectName];
241
+ this.log(styles.emphasis(`${projectName} (${projectTickets.length}):`));
242
+ projectTickets.sort((a, b) => (a.position || 0) - (b.position || 0));
243
+ for (const ticket of projectTickets) {
244
+ const priority = formatPriority(ticket.priority);
245
+ const status = ticket.statusName ? styles.muted(`[${ticket.statusName}]`) : '';
246
+ this.log(` ${styles.code(ticket.id)}: ${ticket.title} ${priority} ${status}`);
247
+ }
248
+ }
249
+ }
250
+ outputCrossProjectCompactByPriority(tickets) {
251
+ // Group tickets by priority
252
+ const byPriority = {};
253
+ for (const priority of PRIORITY_ORDER) {
254
+ byPriority[priority] = [];
255
+ }
256
+ for (const ticket of tickets) {
257
+ const priority = ticket.priority || 'None';
258
+ if (!byPriority[priority]) {
259
+ byPriority[priority] = [];
260
+ }
261
+ byPriority[priority].push(ticket);
262
+ }
263
+ for (const priority of PRIORITY_ORDER) {
264
+ const priorityTickets = byPriority[priority];
265
+ if (priorityTickets.length === 0)
266
+ continue;
267
+ const headerColor = getPriorityStyle(priority);
268
+ this.log(headerColor(`${priority} (${priorityTickets.length}):`));
269
+ priorityTickets.sort((a, b) => (a.position || 0) - (b.position || 0));
270
+ for (const ticket of priorityTickets) {
271
+ const status = ticket.statusName ? styles.muted(`[${ticket.statusName}]`) : '';
272
+ const project = ticket.projectName ? styles.info(`[${ticket.projectName}]`) : '';
273
+ this.log(` ${styles.code(ticket.id)}: ${ticket.title} ${status} ${project}`);
274
+ }
275
+ }
276
+ }
277
+ outputTable(tickets, columns, groupBy) {
278
+ if (groupBy === 'priority') {
279
+ this.outputTableByPriority(tickets);
280
+ return;
281
+ }
282
+ // Group tickets by column
283
+ const byColumn = {};
284
+ for (const col of columns) {
285
+ byColumn[col] = [];
286
+ }
287
+ for (const ticket of tickets) {
288
+ const col = ticket.statusName || 'Unknown';
289
+ if (!byColumn[col]) {
290
+ byColumn[col] = [];
291
+ }
292
+ byColumn[col].push(ticket);
293
+ }
294
+ // Display ALL columns
295
+ for (const col of columns) {
296
+ const colTickets = byColumn[col];
297
+ // Column header with color
298
+ const headerColor = getColumnStyle(col);
299
+ this.log(headerColor(`\n${getColumnEmoji(col)} ${col} (${colTickets.length})`));
300
+ this.log(divider(50));
301
+ if (colTickets.length === 0) {
302
+ this.log(styles.muted(' (empty)'));
303
+ continue;
304
+ }
305
+ // Sort by position
306
+ colTickets.sort((a, b) => (a.position || 0) - (b.position || 0));
307
+ for (const ticket of colTickets) {
308
+ const priorityBadge = formatPriority(ticket.priority);
309
+ const categoryBadge = formatCategory(ticket.category);
310
+ this.log(` ${styles.code(ticket.id)} ${ticket.title} ${priorityBadge} ${categoryBadge}`);
311
+ if (ticket.description) {
312
+ const shortDesc = ticket.description.split('\n')[0].substring(0, 60);
313
+ this.log(styles.muted(` ${shortDesc}${ticket.description.length > 60 ? '...' : ''}`));
314
+ }
315
+ if (ticket.subtasks.length > 0) {
316
+ const done = ticket.subtasks.filter(s => s.done).length;
317
+ this.log(styles.muted(` Subtasks: ${done}/${ticket.subtasks.length}`));
318
+ }
319
+ }
320
+ }
321
+ // Summary
322
+ this.log('\n' + divider(50));
323
+ this.log(styles.emphasis(`Total: ${tickets.length} ticket${tickets.length === 1 ? '' : 's'}`));
324
+ }
325
+ outputTableByPriority(tickets) {
326
+ // Group tickets by priority
327
+ const byPriority = {};
328
+ for (const priority of PRIORITY_ORDER) {
329
+ byPriority[priority] = [];
330
+ }
331
+ for (const ticket of tickets) {
332
+ const priority = ticket.priority || 'None';
333
+ if (!byPriority[priority]) {
334
+ byPriority[priority] = [];
335
+ }
336
+ byPriority[priority].push(ticket);
337
+ }
338
+ // Display ALL priority groups
339
+ for (const priority of PRIORITY_ORDER) {
340
+ const priorityTickets = byPriority[priority];
341
+ // Priority header with color
342
+ const headerColor = getPriorityStyle(priority);
343
+ this.log(headerColor(`\n${priority} (${priorityTickets.length})`));
344
+ this.log(divider(50));
345
+ if (priorityTickets.length === 0) {
346
+ this.log(styles.muted(' (empty)'));
347
+ continue;
348
+ }
349
+ // Sort by position
350
+ priorityTickets.sort((a, b) => (a.position || 0) - (b.position || 0));
351
+ for (const ticket of priorityTickets) {
352
+ const statusBadge = ticket.statusName ? styles.muted(`[${ticket.statusName}]`) : '';
353
+ const categoryBadge = formatCategory(ticket.category);
354
+ this.log(` ${styles.code(ticket.id)} ${ticket.title} ${statusBadge} ${categoryBadge}`);
355
+ if (ticket.description) {
356
+ const shortDesc = ticket.description.split('\n')[0].substring(0, 60);
357
+ this.log(styles.muted(` ${shortDesc}${ticket.description.length > 60 ? '...' : ''}`));
358
+ }
359
+ if (ticket.subtasks.length > 0) {
360
+ const done = ticket.subtasks.filter(s => s.done).length;
361
+ this.log(styles.muted(` Subtasks: ${done}/${ticket.subtasks.length}`));
362
+ }
363
+ }
364
+ }
365
+ // Summary
366
+ this.log('\n' + divider(50));
367
+ this.log(styles.emphasis(`Total: ${tickets.length} ticket${tickets.length === 1 ? '' : 's'}`));
368
+ }
369
+ outputCompact(tickets, columns, groupBy) {
370
+ if (groupBy === 'priority') {
371
+ this.outputCompactByPriority(tickets);
372
+ return;
373
+ }
374
+ // Group by column
375
+ const byColumn = {};
376
+ for (const col of columns) {
377
+ byColumn[col] = [];
378
+ }
379
+ for (const ticket of tickets) {
380
+ const col = ticket.statusName || 'Unknown';
381
+ if (!byColumn[col]) {
382
+ byColumn[col] = [];
383
+ }
384
+ byColumn[col].push(ticket);
385
+ }
386
+ for (const col of columns) {
387
+ const colTickets = byColumn[col];
388
+ // Show all columns
389
+ const headerColor = getColumnStyle(col);
390
+ this.log(headerColor(`${getColumnEmoji(col)} ${col} (${colTickets.length}):`));
391
+ if (colTickets.length === 0) {
392
+ this.log(styles.muted(' (empty)'));
393
+ continue;
394
+ }
395
+ colTickets.sort((a, b) => (a.position || 0) - (b.position || 0));
396
+ for (const ticket of colTickets) {
397
+ const priority = formatPriority(ticket.priority);
398
+ this.log(` ${styles.code(ticket.id)}: ${ticket.title} ${priority}`);
399
+ }
400
+ }
401
+ }
402
+ outputCompactByPriority(tickets) {
403
+ // Group by priority
404
+ const byPriority = {};
405
+ for (const priority of PRIORITY_ORDER) {
406
+ byPriority[priority] = [];
407
+ }
408
+ for (const ticket of tickets) {
409
+ const priority = ticket.priority || 'None';
410
+ if (!byPriority[priority]) {
411
+ byPriority[priority] = [];
412
+ }
413
+ byPriority[priority].push(ticket);
414
+ }
415
+ for (const priority of PRIORITY_ORDER) {
416
+ const priorityTickets = byPriority[priority];
417
+ // Show all priority groups
418
+ const headerColor = getPriorityStyle(priority);
419
+ this.log(headerColor(`${priority} (${priorityTickets.length}):`));
420
+ if (priorityTickets.length === 0) {
421
+ this.log(styles.muted(' (empty)'));
422
+ continue;
423
+ }
424
+ priorityTickets.sort((a, b) => (a.position || 0) - (b.position || 0));
425
+ for (const ticket of priorityTickets) {
426
+ const status = ticket.statusName ? styles.muted(`[${ticket.statusName}]`) : '';
427
+ this.log(` ${styles.code(ticket.id)}: ${ticket.title} ${status}`);
428
+ }
429
+ }
430
+ }
431
+ }
@@ -0,0 +1,18 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class TicketMove extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ ticketId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ column: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
8
+ };
9
+ static flags: {
10
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ position: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ };
16
+ execute(): Promise<void>;
17
+ private executeBulk;
18
+ }
@@ -0,0 +1,212 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { autoExportToBoard, PMOCommand, pmoBaseFlags, } from '../../lib/pmo/index.js';
4
+ import { styles } from '../../lib/styles.js';
5
+ import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
6
+ export default class TicketMove extends PMOCommand {
7
+ static description = 'Move ticket(s) to a different column';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %> my-ticket "In Progress"',
10
+ '<%= config.bin %> <%= command.id %> implement-auth Done',
11
+ '<%= config.bin %> <%= command.id %> fix-bug "In Review" --position 0',
12
+ '<%= config.bin %> <%= command.id %> --bulk',
13
+ ];
14
+ static args = {
15
+ ticketId: Args.string({
16
+ description: 'Ticket ID - prompts with dropdown if not provided',
17
+ required: false,
18
+ }),
19
+ column: Args.string({
20
+ description: 'Target column - prompts with dropdown if not provided',
21
+ required: false,
22
+ }),
23
+ };
24
+ static flags = {
25
+ ...pmoBaseFlags,
26
+ json: Flags.boolean({
27
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
28
+ default: false,
29
+ }),
30
+ position: Flags.integer({
31
+ description: 'Position within the column (0 = top)',
32
+ }),
33
+ bulk: Flags.boolean({
34
+ char: 'b',
35
+ description: 'Enable bulk mode to move multiple tickets',
36
+ default: false,
37
+ }),
38
+ force: Flags.boolean({
39
+ char: 'f',
40
+ description: 'Skip confirmation prompt (bulk mode only)',
41
+ default: false,
42
+ }),
43
+ };
44
+ async execute() {
45
+ const { args, flags } = await this.parse(TicketMove);
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('ticket move', flags));
52
+ this.exit(1);
53
+ }
54
+ this.error(message);
55
+ };
56
+ // This command requires project context - get projectId (with JSON mode support)
57
+ const projectId = await this.requireProject({
58
+ jsonMode: {
59
+ flags,
60
+ commandName: 'ticket move',
61
+ baseCommand: 'prlt ticket move',
62
+ },
63
+ });
64
+ // Get all tickets
65
+ const allTickets = await this.storage.listTickets(projectId);
66
+ if (allTickets.length === 0) {
67
+ return handleError('NO_TICKETS', 'No tickets found. Create a ticket first with "prlt ticket create".');
68
+ }
69
+ // Bulk mode
70
+ if (flags.bulk) {
71
+ await this.executeBulk(allTickets, flags.force, projectId);
72
+ return;
73
+ }
74
+ // Single ticket mode
75
+ let ticketId = args.ticketId;
76
+ if (!ticketId) {
77
+ // Use helper for ticket selection (handles JSON mode automatically)
78
+ const selected = await this.selectFromList({
79
+ message: 'Select ticket to move:',
80
+ items: allTickets,
81
+ getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
82
+ getValue: (t) => t.id,
83
+ getCommand: (t) => `prlt ticket move ${t.id} --json`,
84
+ jsonMode: jsonMode ? { flags, commandName: 'ticket move' } : null,
85
+ });
86
+ if (!selected) {
87
+ return; // Cancelled or JSON mode (already exited)
88
+ }
89
+ ticketId = selected;
90
+ }
91
+ // Get ticket
92
+ const ticket = await this.storage.getTicket(ticketId);
93
+ if (!ticket) {
94
+ this.error(`Ticket "${ticketId}" not found.`);
95
+ }
96
+ // Get target column - prompt if not provided
97
+ let targetColumn = args.column;
98
+ if (!targetColumn) {
99
+ // Get columns from the database (not config.json) to ensure accuracy
100
+ const project = await this.storage.getProjectBoard(projectId);
101
+ if (!project) {
102
+ this.error('Project not found.');
103
+ }
104
+ // Use helper for column selection (handles JSON mode automatically)
105
+ const selected = await this.selectFromList({
106
+ message: 'Move to column:',
107
+ items: project.columns,
108
+ getName: (col) => col.name === ticket.statusName ? `${col.name} (current)` : col.name,
109
+ getValue: (col) => col.name,
110
+ getCommand: (col) => `prlt ticket move ${ticketId} "${col.name}" --json`,
111
+ jsonMode: jsonMode ? { flags, commandName: 'ticket move' } : null,
112
+ });
113
+ if (!selected) {
114
+ return; // Cancelled or JSON mode (already exited)
115
+ }
116
+ targetColumn = selected;
117
+ }
118
+ // Column validation happens in storage.moveTicket()
119
+ // Check if actually moving
120
+ if (targetColumn === ticket.statusName && flags.position === undefined) {
121
+ this.log(styles.warning(`Ticket "${ticketId}" is already in "${targetColumn}".`));
122
+ return;
123
+ }
124
+ // Move ticket (targetColumn is guaranteed to be string after validation above)
125
+ const moved = await this.storage.moveTicket(projectId, ticketId, targetColumn, flags.position);
126
+ // Auto-export to board.md after write
127
+ await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
128
+ this.log(styles.success(`\nāœ… Moved ticket ${styles.emphasis(moved.id)}`));
129
+ if (targetColumn !== ticket.statusName) {
130
+ this.log(styles.muted(` From: ${ticket.statusName}`));
131
+ this.log(styles.muted(` To: ${moved.statusName}`));
132
+ }
133
+ if (flags.position !== undefined) {
134
+ this.log(styles.muted(` Position: ${flags.position}`));
135
+ }
136
+ }
137
+ async executeBulk(allTickets, force, projectId) {
138
+ this.log(styles.emphasis('šŸ“¦ Move Multiple Tickets\n'));
139
+ // Get columns
140
+ const board = await this.storage.getBoard(projectId);
141
+ const columns = board.columns.map(col => col.name);
142
+ // Select tickets to move
143
+ const { selectedTickets } = await inquirer.prompt([{
144
+ type: 'checkbox',
145
+ name: 'selectedTickets',
146
+ message: 'Select tickets to move:',
147
+ choices: allTickets.map(t => ({
148
+ name: `${t.id} - ${t.title} (${t.statusName})`,
149
+ value: t.id,
150
+ })),
151
+ }]);
152
+ if (selectedTickets.length === 0) {
153
+ this.log(styles.muted('No tickets selected.'));
154
+ return;
155
+ }
156
+ // Select target column
157
+ const { targetColumn } = await inquirer.prompt([{
158
+ type: 'list',
159
+ name: 'targetColumn',
160
+ message: 'Move selected tickets to:',
161
+ choices: columns,
162
+ }]);
163
+ // Confirmation
164
+ if (!force) {
165
+ this.log(styles.warning('\nThis will move:'));
166
+ for (const ticketId of selectedTickets) {
167
+ const ticket = allTickets.find(t => t.id === ticketId);
168
+ this.log(styles.primary(` • ${ticketId}: ${ticket?.title}`));
169
+ }
170
+ this.log(styles.primary(` → to column: ${targetColumn}\n`));
171
+ const { confirm } = await inquirer.prompt([{
172
+ type: 'list',
173
+ name: 'confirm',
174
+ message: 'Continue?',
175
+ choices: [
176
+ { name: 'No, cancel', value: false },
177
+ { name: 'Yes, move tickets', value: true }
178
+ ],
179
+ default: 0
180
+ }]);
181
+ if (!confirm) {
182
+ this.log(styles.muted('Move cancelled.'));
183
+ return;
184
+ }
185
+ }
186
+ this.log('');
187
+ // Move each ticket
188
+ let successCount = 0;
189
+ let failCount = 0;
190
+ for (const ticketId of selectedTickets) {
191
+ try {
192
+ await this.storage.moveTicket(projectId, ticketId, targetColumn);
193
+ this.log(styles.success(`Moved ${ticketId} to ${targetColumn}`));
194
+ successCount++;
195
+ }
196
+ catch (error) {
197
+ this.log(styles.error(`Failed to move ${ticketId}: ${error instanceof Error ? error.message : String(error)}`));
198
+ failCount++;
199
+ }
200
+ }
201
+ // Auto-export to kanban.md
202
+ await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
203
+ // Summary
204
+ this.log('');
205
+ if (successCount > 0) {
206
+ this.log(styles.success(`Moved ${successCount} ticket(s)`));
207
+ }
208
+ if (failCount > 0) {
209
+ this.log(styles.error(`Failed to move ${failCount} ticket(s)`));
210
+ }
211
+ }
212
+ }
@@ -0,0 +1,18 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class TicketProject extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ ticketId: 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
+ 'keep-epic': import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ target: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ };
16
+ execute(): Promise<void>;
17
+ private executeBulk;
18
+ }