@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,254 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { PMOCommand, pmoBaseFlags, autoExportToBoard } 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 TicketProject extends PMOCommand {
7
+ static description = 'Move ticket(s) to a different project';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %> TKT-001 new-project',
10
+ '<%= config.bin %> <%= command.id %> TKT-001',
11
+ '<%= config.bin %> <%= command.id %>',
12
+ '<%= config.bin %> <%= command.id %> --bulk --target other-project',
13
+ ];
14
+ static args = {
15
+ ticketId: Args.string({
16
+ description: 'Ticket ID',
17
+ required: false,
18
+ }),
19
+ targetProject: Args.string({
20
+ description: 'Target project ID',
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
+ 'keep-epic': Flags.boolean({
31
+ description: 'Keep ticket assigned to its epic (if epic is in source project, will unlink)',
32
+ default: false,
33
+ }),
34
+ bulk: Flags.boolean({
35
+ char: 'b',
36
+ description: 'Enable bulk mode to move multiple tickets',
37
+ default: false,
38
+ }),
39
+ target: Flags.string({
40
+ char: 't',
41
+ description: 'Target project ID (for bulk mode)',
42
+ }),
43
+ };
44
+ async execute() {
45
+ const { args, flags } = await this.parse(TicketProject);
46
+ // Check if JSON output mode is active
47
+ const jsonMode = shouldOutputJson(flags);
48
+ // Bulk mode
49
+ if (flags.bulk) {
50
+ await this.executeBulk(flags);
51
+ return;
52
+ }
53
+ // Get source project ID
54
+ const sourceProjectId = await this.requireProject();
55
+ // Get ticket ID
56
+ let ticketId = args.ticketId;
57
+ if (!ticketId) {
58
+ const tickets = await this.storage.listTickets(sourceProjectId);
59
+ if (tickets.length === 0) {
60
+ if (jsonMode) {
61
+ outputErrorAsJson('NO_TICKETS', 'No tickets found in this project.', createMetadata('ticket project', flags));
62
+ return;
63
+ }
64
+ this.log(styles.muted('\nNo tickets found in this project.'));
65
+ return;
66
+ }
67
+ const selected = await this.selectFromList({
68
+ message: 'Select ticket to move:',
69
+ items: tickets,
70
+ getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
71
+ getValue: (t) => t.id,
72
+ getCommand: (t) => `prlt ticket project ${t.id} --json`,
73
+ jsonMode: jsonMode ? { flags, commandName: 'ticket project' } : null,
74
+ });
75
+ if (!selected) {
76
+ return;
77
+ }
78
+ ticketId = selected;
79
+ }
80
+ // Get ticket details
81
+ const ticket = await this.storage.getTicket(ticketId);
82
+ if (!ticket) {
83
+ this.error(`Ticket not found: ${ticketId}`);
84
+ }
85
+ // Get all projects
86
+ const projects = await this.storage.listProjects();
87
+ const otherProjects = projects.filter(p => p.id !== sourceProjectId);
88
+ if (otherProjects.length === 0) {
89
+ this.log(styles.muted('\nNo other projects to move to.'));
90
+ const actionChoices = [
91
+ { id: 'create', name: 'Create a new project' },
92
+ { id: 'cancel', name: 'Cancel' },
93
+ ];
94
+ const action = await this.selectFromList({
95
+ message: 'What would you like to do?',
96
+ items: actionChoices,
97
+ getName: (a) => a.name,
98
+ getValue: (a) => a.id,
99
+ getCommand: (a) => a.id === 'create' ? 'prlt project create --json' : '',
100
+ jsonMode: jsonMode ? { flags, commandName: 'ticket project' } : null,
101
+ });
102
+ if (action === 'create') {
103
+ await this.config.runCommand('project:create', []);
104
+ }
105
+ return;
106
+ }
107
+ // Get target project
108
+ let targetProjectId = args.targetProject;
109
+ if (!targetProjectId) {
110
+ const selected = await this.selectFromList({
111
+ message: 'Select target project:',
112
+ items: otherProjects,
113
+ getName: (p) => `${p.id} - ${p.name} (${p.status})`,
114
+ getValue: (p) => p.id,
115
+ getCommand: (p) => `prlt ticket project ${ticketId} ${p.id} --json`,
116
+ jsonMode: jsonMode ? { flags, commandName: 'ticket project' } : null,
117
+ });
118
+ if (!selected) {
119
+ return;
120
+ }
121
+ targetProjectId = selected;
122
+ }
123
+ // Validate target project
124
+ const targetProject = projects.find(p => p.id === targetProjectId);
125
+ if (!targetProject) {
126
+ this.error(`Project not found: ${targetProjectId}`);
127
+ }
128
+ if (targetProjectId === sourceProjectId) {
129
+ this.log(styles.muted('\nTicket is already in this project.'));
130
+ return;
131
+ }
132
+ // Check if ticket has an epic
133
+ const epicWarning = ticket.epicId && !flags['keep-epic'];
134
+ if (epicWarning) {
135
+ const epic = await this.storage.getEpic(ticket.epicId);
136
+ if (epic && epic.projectId !== targetProjectId) {
137
+ this.log(styles.warning(`\nTicket is assigned to epic "${ticket.epicId}" in source project.`));
138
+ const actionChoices = [
139
+ { id: 'unlink', name: 'Unlink from epic (move ticket only)' },
140
+ { id: 'cancel', name: 'Cancel' },
141
+ ];
142
+ const action = await this.selectFromList({
143
+ message: 'How to handle epic assignment?',
144
+ items: actionChoices,
145
+ getName: (a) => a.name,
146
+ getValue: (a) => a.id,
147
+ getCommand: (a) => a.id === 'unlink' ? `prlt ticket project ${ticketId} ${targetProjectId} --json` : '',
148
+ jsonMode: jsonMode ? { flags, commandName: 'ticket project' } : null,
149
+ });
150
+ if (action === 'cancel' || !action) {
151
+ return;
152
+ }
153
+ // Unlink from epic before moving
154
+ await this.storage.updateTicket(ticketId, { epicId: undefined });
155
+ this.log(styles.muted(` Unlinked from epic "${ticket.epicId}"`));
156
+ }
157
+ }
158
+ // Move ticket to new project using the storage method
159
+ const movedTicket = await this.storage.moveTicketToProject(ticketId, targetProjectId);
160
+ await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
161
+ this.log(styles.success(`\nāœ… Moved ticket ${styles.emphasis(ticketId)} to project ${styles.emphasis(targetProjectId)}`));
162
+ this.log(styles.muted(` From: ${sourceProjectId}`));
163
+ this.log(styles.muted(` To: ${targetProjectId} (column: ${movedTicket.statusName || 'first column'})`));
164
+ this.log(styles.muted(`\nView ticket: prlt ticket view ${ticketId}`));
165
+ }
166
+ async executeBulk(flags) {
167
+ this.log(styles.emphasis('šŸ“ Bulk Move Tickets to Project\n'));
168
+ // Get source project ID
169
+ const sourceProjectId = await this.requireProject();
170
+ // Get all tickets in current project
171
+ const tickets = await this.storage.listTickets(sourceProjectId);
172
+ if (tickets.length === 0) {
173
+ this.log(styles.muted('\nNo tickets found in this project.'));
174
+ return;
175
+ }
176
+ // Select tickets
177
+ const { selectedTickets } = await inquirer.prompt([{
178
+ type: 'checkbox',
179
+ name: 'selectedTickets',
180
+ message: 'Select tickets to move:',
181
+ choices: tickets.map(t => {
182
+ const epicLabel = t.epicId ? ` [epic: ${t.epicId}]` : '';
183
+ return {
184
+ name: `${t.id} - ${t.title} (${t.statusName})${epicLabel}`,
185
+ value: t.id,
186
+ };
187
+ }),
188
+ }]);
189
+ if (selectedTickets.length === 0) {
190
+ this.log(styles.muted('No tickets selected.'));
191
+ return;
192
+ }
193
+ // Get target project
194
+ const projects = await this.storage.listProjects();
195
+ const otherProjects = projects.filter(p => p.id !== sourceProjectId);
196
+ if (otherProjects.length === 0) {
197
+ this.log(styles.muted('\nNo other projects to move to. Create one with: prlt project create'));
198
+ return;
199
+ }
200
+ let targetProjectId = flags.target;
201
+ if (!targetProjectId) {
202
+ const { selected } = await inquirer.prompt([{
203
+ type: 'list',
204
+ name: 'selected',
205
+ message: 'Select target project:',
206
+ choices: otherProjects.map(p => ({
207
+ name: `${p.id} - ${p.name}`,
208
+ value: p.id,
209
+ })),
210
+ }]);
211
+ targetProjectId = selected;
212
+ }
213
+ // Validate target project
214
+ const targetProject = projects.find(p => p.id === targetProjectId);
215
+ if (!targetProject) {
216
+ this.error(`Project not found: ${targetProjectId}`);
217
+ }
218
+ // Check for epic conflicts
219
+ const ticketsWithEpics = selectedTickets.filter((id) => {
220
+ const t = tickets.find(t => t.id === id);
221
+ return t?.epicId;
222
+ });
223
+ if (ticketsWithEpics.length > 0) {
224
+ this.log(styles.warning(`\n${ticketsWithEpics.length} ticket(s) are assigned to epics.`));
225
+ const { action } = await inquirer.prompt([{
226
+ type: 'list',
227
+ name: 'action',
228
+ message: 'How to handle epic assignments?',
229
+ choices: [
230
+ { name: 'Unlink from epics and move', value: 'unlink' },
231
+ { name: 'Cancel', value: 'cancel' },
232
+ ],
233
+ }]);
234
+ if (action === 'cancel') {
235
+ return;
236
+ }
237
+ }
238
+ // Move each ticket using the storage method
239
+ let lastMovedTicket;
240
+ for (const ticketId of selectedTickets) {
241
+ const ticket = tickets.find(t => t.id === ticketId);
242
+ // Unlink from epic if needed
243
+ if (ticket?.epicId) {
244
+ await this.storage.updateTicket(ticketId, { epicId: undefined });
245
+ }
246
+ // Move ticket to new project
247
+ lastMovedTicket = await this.storage.moveTicketToProject(ticketId, targetProjectId);
248
+ this.log(styles.success(` Moved ${ticketId} to ${targetProjectId}`));
249
+ }
250
+ await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
251
+ this.log(styles.success(`\nāœ… Moved ${selectedTickets.length} ticket(s) to project "${targetProject.name}"`));
252
+ this.log(styles.muted(` Target column: ${lastMovedTicket?.statusName || 'first column'}`));
253
+ }
254
+ }
@@ -0,0 +1,19 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class TicketReassign 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
+ assignee: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
8
+ };
9
+ static flags: {
10
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ to: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ from: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ };
17
+ execute(): Promise<void>;
18
+ private executeBulk;
19
+ }
@@ -0,0 +1,279 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { PMOCommand, pmoBaseFlags, autoExportToBoard } 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 TicketReassign extends PMOCommand {
7
+ static description = 'Reassign ticket(s) to a different agent';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %>',
10
+ '<%= config.bin %> <%= command.id %> TKT-001 alice',
11
+ '<%= config.bin %> <%= command.id %> --bulk --to alice',
12
+ '<%= config.bin %> <%= command.id %> --bulk --from bob --to alice',
13
+ '<%= config.bin %> <%= command.id %> --json # Output choices as JSON',
14
+ ];
15
+ static args = {
16
+ ticketId: Args.string({
17
+ description: 'Ticket ID - prompts with dropdown if not provided',
18
+ required: false,
19
+ }),
20
+ assignee: Args.string({
21
+ description: 'Target agent name',
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
+ to: Flags.string({
32
+ description: 'Target agent name (for bulk mode)',
33
+ }),
34
+ from: Flags.string({
35
+ description: 'Filter tickets by current assignee (bulk mode)',
36
+ }),
37
+ bulk: Flags.boolean({
38
+ char: 'b',
39
+ description: 'Enable bulk mode to reassign multiple tickets',
40
+ default: false,
41
+ }),
42
+ force: Flags.boolean({
43
+ char: 'f',
44
+ description: 'Skip confirmation prompt',
45
+ default: false,
46
+ }),
47
+ };
48
+ async execute() {
49
+ const { args, flags } = await this.parse(TicketReassign);
50
+ const projectId = flags.project;
51
+ // Check if JSON output mode is active
52
+ const jsonMode = shouldOutputJson(flags);
53
+ // Get all tickets
54
+ const allTickets = await this.storage.listTickets(projectId);
55
+ if (allTickets.length === 0) {
56
+ if (jsonMode) {
57
+ outputErrorAsJson('NO_TICKETS', 'No tickets found.', createMetadata('ticket reassign', flags));
58
+ return;
59
+ }
60
+ this.log(styles.warning('No tickets found.'));
61
+ return;
62
+ }
63
+ // Get unique assignees from tickets
64
+ const assignees = new Set();
65
+ for (const ticket of allTickets) {
66
+ if (ticket.assignee) {
67
+ assignees.add(ticket.assignee);
68
+ }
69
+ }
70
+ // Also get agents from workspace if available
71
+ const db = this.storage.db;
72
+ try {
73
+ const agents = db.prepare(`SELECT name FROM agents`).all();
74
+ for (const agent of agents) {
75
+ assignees.add(agent.name);
76
+ }
77
+ }
78
+ catch {
79
+ // agents table might not exist, ignore
80
+ }
81
+ // Bulk mode
82
+ if (flags.bulk) {
83
+ await this.executeBulk(allTickets, Array.from(assignees), flags);
84
+ return;
85
+ }
86
+ // Single ticket mode
87
+ let ticketId = args.ticketId;
88
+ if (!ticketId) {
89
+ const selected = await this.selectFromList({
90
+ message: 'Select ticket to reassign:',
91
+ items: allTickets,
92
+ getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
93
+ getValue: (t) => t.id,
94
+ getCommand: (t) => `prlt ticket reassign ${t.id} --json`,
95
+ jsonMode: jsonMode ? { flags, commandName: 'ticket reassign' } : null,
96
+ });
97
+ if (!selected) {
98
+ return;
99
+ }
100
+ ticketId = selected;
101
+ }
102
+ // Get ticket
103
+ const ticket = await this.storage.getTicket(ticketId);
104
+ if (!ticket) {
105
+ this.error(`Ticket "${ticketId}" not found.`);
106
+ }
107
+ // Get target assignee
108
+ let targetAssignee = args.assignee || flags.to;
109
+ if (!targetAssignee) {
110
+ const { assignee } = await inquirer.prompt([{
111
+ type: 'list',
112
+ name: 'assignee',
113
+ message: `Reassign ${ticketId} to:`,
114
+ choices: [
115
+ { name: 'None (unassign)', value: '__none__' },
116
+ ...Array.from(assignees).sort().map(a => ({
117
+ name: a === ticket.assignee ? `${a} (current)` : a,
118
+ value: a,
119
+ })),
120
+ { name: '── Enter custom name ──', value: '__custom__' },
121
+ ],
122
+ }]);
123
+ if (assignee === '__custom__') {
124
+ const { customAssignee } = await inquirer.prompt([{
125
+ type: 'input',
126
+ name: 'customAssignee',
127
+ message: 'Enter agent/assignee name:',
128
+ validate: (input) => input.length > 0 || 'Name is required',
129
+ }]);
130
+ targetAssignee = customAssignee;
131
+ }
132
+ else if (assignee === '__none__') {
133
+ targetAssignee = undefined;
134
+ }
135
+ else {
136
+ targetAssignee = assignee;
137
+ }
138
+ }
139
+ // Handle special values
140
+ if (targetAssignee === 'none' || targetAssignee === 'unassigned') {
141
+ targetAssignee = undefined;
142
+ }
143
+ // Check if same
144
+ if (targetAssignee === ticket.assignee) {
145
+ this.log(styles.muted(`Ticket "${ticketId}" is already assigned to "${targetAssignee || 'none'}".`));
146
+ return;
147
+ }
148
+ // Update ticket
149
+ await this.storage.updateTicket(ticketId, { assignee: targetAssignee || undefined });
150
+ // Auto-export
151
+ await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
152
+ const action = targetAssignee ? `reassigned to ${targetAssignee}` : 'unassigned';
153
+ this.log(styles.success(`\nāœ… Ticket ${styles.emphasis(ticketId)} ${action}`));
154
+ this.log(styles.muted(` Title: ${ticket.title}`));
155
+ if (ticket.assignee) {
156
+ this.log(styles.muted(` Previous: ${ticket.assignee}`));
157
+ }
158
+ }
159
+ async executeBulk(allTickets, assigneesList, flags) {
160
+ this.log(styles.emphasis('šŸ‘¤ Reassign Tickets\n'));
161
+ // Filter tickets if --from specified
162
+ let filteredTickets = allTickets;
163
+ if (flags.from) {
164
+ if (flags.from === 'none' || flags.from === 'unassigned') {
165
+ filteredTickets = allTickets.filter(t => !t.assignee);
166
+ }
167
+ else {
168
+ filteredTickets = allTickets.filter(t => t.assignee === flags.from);
169
+ }
170
+ }
171
+ if (filteredTickets.length === 0) {
172
+ this.log(styles.warning('No tickets found matching filter.'));
173
+ return;
174
+ }
175
+ // Select tickets to reassign
176
+ const { selectedTickets } = await inquirer.prompt([{
177
+ type: 'checkbox',
178
+ name: 'selectedTickets',
179
+ message: 'Select tickets to reassign:',
180
+ choices: filteredTickets.map(t => ({
181
+ name: `${t.id} - ${t.title} [Assignee: ${t.assignee || '(none)'}]`,
182
+ value: t.id,
183
+ })),
184
+ }]);
185
+ if (selectedTickets.length === 0) {
186
+ this.log(styles.muted('No tickets selected.'));
187
+ return;
188
+ }
189
+ // Select target assignee
190
+ let targetAssignee = flags.to;
191
+ if (targetAssignee === undefined) {
192
+ const { assignee } = await inquirer.prompt([{
193
+ type: 'list',
194
+ name: 'assignee',
195
+ message: 'Reassign to which agent?',
196
+ choices: [
197
+ { name: 'None (unassign)', value: '__none__' },
198
+ ...assigneesList.sort().map(a => ({
199
+ name: a,
200
+ value: a,
201
+ })),
202
+ { name: '── Enter custom name ──', value: '__custom__' },
203
+ ],
204
+ }]);
205
+ if (assignee === '__custom__') {
206
+ const { customAssignee } = await inquirer.prompt([{
207
+ type: 'input',
208
+ name: 'customAssignee',
209
+ message: 'Enter agent/assignee name:',
210
+ validate: (input) => input.length > 0 || 'Name is required',
211
+ }]);
212
+ targetAssignee = customAssignee;
213
+ }
214
+ else if (assignee === '__none__') {
215
+ targetAssignee = undefined;
216
+ }
217
+ else {
218
+ targetAssignee = assignee;
219
+ }
220
+ }
221
+ // Handle special values
222
+ if (targetAssignee === 'none' || targetAssignee === 'unassigned') {
223
+ targetAssignee = undefined;
224
+ }
225
+ // Confirmation
226
+ if (!flags.force) {
227
+ const assigneeLabel = targetAssignee || 'None (unassigning)';
228
+ this.log(styles.primary('\nWill reassign to:'));
229
+ this.log(styles.primary(` → ${assigneeLabel}\n`));
230
+ this.log(styles.primary('Tickets:'));
231
+ for (const ticketId of selectedTickets) {
232
+ const ticket = filteredTickets.find(t => t.id === ticketId);
233
+ this.log(styles.primary(` • ${ticketId}: ${ticket?.title}`));
234
+ }
235
+ this.log('');
236
+ const { confirm } = await inquirer.prompt([{
237
+ type: 'list',
238
+ name: 'confirm',
239
+ message: 'Continue?',
240
+ choices: [
241
+ { name: 'No, cancel', value: false },
242
+ { name: 'Yes, reassign tickets', value: true }
243
+ ],
244
+ default: 0
245
+ }]);
246
+ if (!confirm) {
247
+ this.log(styles.muted('Operation cancelled.'));
248
+ return;
249
+ }
250
+ }
251
+ this.log('');
252
+ // Reassign each ticket
253
+ let successCount = 0;
254
+ let failCount = 0;
255
+ for (const ticketId of selectedTickets) {
256
+ try {
257
+ await this.storage.updateTicket(ticketId, { assignee: targetAssignee || undefined });
258
+ const action = targetAssignee ? `Reassigned to ${targetAssignee}` : 'Unassigned';
259
+ this.log(styles.success(`${ticketId}: ${action}`));
260
+ successCount++;
261
+ }
262
+ catch (error) {
263
+ this.log(styles.error(`Failed to reassign ${ticketId}: ${error instanceof Error ? error.message : String(error)}`));
264
+ failCount++;
265
+ }
266
+ }
267
+ // Auto-export to kanban.md
268
+ await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
269
+ // Summary
270
+ this.log('');
271
+ if (successCount > 0) {
272
+ const action = targetAssignee ? 'Reassigned' : 'Unassigned';
273
+ this.log(styles.success(`${action} ${successCount} ticket(s)`));
274
+ }
275
+ if (failCount > 0) {
276
+ this.log(styles.error(`Failed to reassign ${failCount} ticket(s)`));
277
+ }
278
+ }
279
+ }
@@ -0,0 +1,18 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class TicketSpec 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
+ specId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
8
+ };
9
+ static flags: {
10
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ unlink: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ spec: 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
+ }