@proletariat/cli 0.1.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (526) hide show
  1. package/README.md +510 -255
  2. package/bin/dev.cmd +3 -0
  3. package/bin/dev.js +5 -0
  4. package/bin/run.cmd +3 -0
  5. package/bin/run.js +23 -0
  6. package/dist/commands/action/create.d.ts +21 -0
  7. package/dist/commands/action/create.js +126 -0
  8. package/dist/commands/action/delete.d.ts +17 -0
  9. package/dist/commands/action/delete.js +78 -0
  10. package/dist/commands/action/index.d.ts +15 -0
  11. package/dist/commands/action/index.js +107 -0
  12. package/dist/commands/action/list.d.ts +14 -0
  13. package/dist/commands/action/list.js +89 -0
  14. package/dist/commands/action/run.d.ts +19 -0
  15. package/dist/commands/action/run.js +179 -0
  16. package/dist/commands/action/show.d.ts +15 -0
  17. package/dist/commands/action/show.js +47 -0
  18. package/dist/commands/action/update.d.ts +22 -0
  19. package/dist/commands/action/update.js +168 -0
  20. package/dist/commands/agent/index.d.ts +13 -0
  21. package/dist/commands/agent/index.js +131 -0
  22. package/dist/commands/agent/list.d.ts +7 -0
  23. package/dist/commands/agent/list.js +126 -0
  24. package/dist/commands/agent/login.d.ts +16 -0
  25. package/dist/commands/agent/login.js +146 -0
  26. package/dist/commands/agent/rebuild.d.ts +18 -0
  27. package/dist/commands/agent/rebuild.js +133 -0
  28. package/dist/commands/agent/restart.d.ts +17 -0
  29. package/dist/commands/agent/restart.js +116 -0
  30. package/dist/commands/agent/shell.d.ts +23 -0
  31. package/dist/commands/agent/shell.js +378 -0
  32. package/dist/commands/agent/staff/add.d.ts +15 -0
  33. package/dist/commands/agent/staff/add.js +281 -0
  34. package/dist/commands/agent/staff/index.d.ts +14 -0
  35. package/dist/commands/agent/staff/index.js +90 -0
  36. package/dist/commands/agent/staff/list.d.ts +7 -0
  37. package/dist/commands/agent/staff/list.js +90 -0
  38. package/dist/commands/agent/staff/remove.d.ts +16 -0
  39. package/dist/commands/agent/staff/remove.js +137 -0
  40. package/dist/commands/agent/status.d.ts +17 -0
  41. package/dist/commands/agent/status.js +139 -0
  42. package/dist/commands/agent/temp/cleanup.d.ts +23 -0
  43. package/dist/commands/agent/temp/cleanup.js +388 -0
  44. package/dist/commands/agent/temp/index.d.ts +14 -0
  45. package/dist/commands/agent/temp/index.js +82 -0
  46. package/dist/commands/agent/temp/list.d.ts +7 -0
  47. package/dist/commands/agent/temp/list.js +108 -0
  48. package/dist/commands/agent/themes/add-names.d.ts +10 -0
  49. package/dist/commands/agent/themes/add-names.js +67 -0
  50. package/dist/commands/agent/themes/create.d.ts +13 -0
  51. package/dist/commands/agent/themes/create.js +66 -0
  52. package/dist/commands/agent/themes/index.d.ts +9 -0
  53. package/dist/commands/agent/themes/index.js +194 -0
  54. package/dist/commands/agent/themes/list.d.ts +6 -0
  55. package/dist/commands/agent/themes/list.js +41 -0
  56. package/dist/commands/agent/themes/set.d.ts +12 -0
  57. package/dist/commands/agent/themes/set.js +77 -0
  58. package/dist/commands/agent/visit.d.ts +16 -0
  59. package/dist/commands/agent/visit.js +88 -0
  60. package/dist/commands/autocomplete/setup.d.ts +14 -0
  61. package/dist/commands/autocomplete/setup.js +154 -0
  62. package/dist/commands/board/index.d.ts +17 -0
  63. package/dist/commands/board/index.js +255 -0
  64. package/dist/commands/board/watch.d.ts +13 -0
  65. package/dist/commands/board/watch.js +52 -0
  66. package/dist/commands/branch/create.d.ts +50 -0
  67. package/dist/commands/branch/create.js +624 -0
  68. package/dist/commands/branch/index.d.ts +13 -0
  69. package/dist/commands/branch/index.js +50 -0
  70. package/dist/commands/branch/list.d.ts +17 -0
  71. package/dist/commands/branch/list.js +120 -0
  72. package/dist/commands/branch/validate.d.ts +15 -0
  73. package/dist/commands/branch/validate.js +73 -0
  74. package/dist/commands/commit.d.ts +71 -0
  75. package/dist/commands/commit.js +499 -0
  76. package/dist/commands/docker/clean.d.ts +13 -0
  77. package/dist/commands/docker/clean.js +224 -0
  78. package/dist/commands/docker/index.d.ts +19 -0
  79. package/dist/commands/docker/index.js +274 -0
  80. package/dist/commands/docker/list.d.ts +16 -0
  81. package/dist/commands/docker/list.js +200 -0
  82. package/dist/commands/docker/logs.d.ts +14 -0
  83. package/dist/commands/docker/logs.js +118 -0
  84. package/dist/commands/docker/prune.d.ts +14 -0
  85. package/dist/commands/docker/prune.js +211 -0
  86. package/dist/commands/docker/restart.d.ts +14 -0
  87. package/dist/commands/docker/restart.js +129 -0
  88. package/dist/commands/docker/shell.d.ts +14 -0
  89. package/dist/commands/docker/shell.js +103 -0
  90. package/dist/commands/docker/start.d.ts +12 -0
  91. package/dist/commands/docker/start.js +92 -0
  92. package/dist/commands/docker/status.d.ts +7 -0
  93. package/dist/commands/docker/status.js +40 -0
  94. package/dist/commands/docker/stop.d.ts +14 -0
  95. package/dist/commands/docker/stop.js +134 -0
  96. package/dist/commands/docker/sync.d.ts +15 -0
  97. package/dist/commands/docker/sync.js +112 -0
  98. package/dist/commands/epic/activate.d.ts +13 -0
  99. package/dist/commands/epic/activate.js +118 -0
  100. package/dist/commands/epic/archive.d.ts +14 -0
  101. package/dist/commands/epic/archive.js +132 -0
  102. package/dist/commands/epic/create.d.ts +15 -0
  103. package/dist/commands/epic/create.js +137 -0
  104. package/dist/commands/epic/index.d.ts +13 -0
  105. package/dist/commands/epic/index.js +88 -0
  106. package/dist/commands/epic/link/block.d.ts +14 -0
  107. package/dist/commands/epic/link/block.js +79 -0
  108. package/dist/commands/epic/link/duplicates.d.ts +14 -0
  109. package/dist/commands/epic/link/duplicates.js +66 -0
  110. package/dist/commands/epic/link/index.d.ts +19 -0
  111. package/dist/commands/epic/link/index.js +242 -0
  112. package/dist/commands/epic/link/relates.d.ts +14 -0
  113. package/dist/commands/epic/link/relates.js +66 -0
  114. package/dist/commands/epic/link/remove.d.ts +16 -0
  115. package/dist/commands/epic/link/remove.js +89 -0
  116. package/dist/commands/epic/list.d.ts +11 -0
  117. package/dist/commands/epic/list.js +87 -0
  118. package/dist/commands/epic/move.d.ts +15 -0
  119. package/dist/commands/epic/move.js +184 -0
  120. package/dist/commands/epic/progress.d.ts +16 -0
  121. package/dist/commands/epic/progress.js +166 -0
  122. package/dist/commands/epic/project.d.ts +15 -0
  123. package/dist/commands/epic/project.js +219 -0
  124. package/dist/commands/epic/reorder.d.ts +21 -0
  125. package/dist/commands/epic/reorder.js +160 -0
  126. package/dist/commands/epic/spec.d.ts +15 -0
  127. package/dist/commands/epic/spec.js +191 -0
  128. package/dist/commands/epic/ticket.d.ts +18 -0
  129. package/dist/commands/epic/ticket.js +291 -0
  130. package/dist/commands/epic/view.d.ts +13 -0
  131. package/dist/commands/epic/view.js +117 -0
  132. package/dist/commands/execution/index.d.ts +13 -0
  133. package/dist/commands/execution/index.js +70 -0
  134. package/dist/commands/execution/list.d.ts +15 -0
  135. package/dist/commands/execution/list.js +144 -0
  136. package/dist/commands/execution/logs.d.ts +18 -0
  137. package/dist/commands/execution/logs.js +161 -0
  138. package/dist/commands/execution/stop.d.ts +22 -0
  139. package/dist/commands/execution/stop.js +248 -0
  140. package/dist/commands/gh/index.d.ts +9 -0
  141. package/dist/commands/gh/index.js +53 -0
  142. package/dist/commands/gh/login.d.ts +6 -0
  143. package/dist/commands/gh/login.js +57 -0
  144. package/dist/commands/gh/status.d.ts +6 -0
  145. package/dist/commands/gh/status.js +48 -0
  146. package/dist/commands/gh/token.d.ts +6 -0
  147. package/dist/commands/gh/token.js +59 -0
  148. package/dist/commands/init.d.ts +26 -0
  149. package/dist/commands/init.js +200 -0
  150. package/dist/commands/phase/create.d.ts +22 -0
  151. package/dist/commands/phase/create.js +123 -0
  152. package/dist/commands/phase/delete.d.ts +17 -0
  153. package/dist/commands/phase/delete.js +73 -0
  154. package/dist/commands/phase/list.d.ts +12 -0
  155. package/dist/commands/phase/list.js +76 -0
  156. package/dist/commands/phase/move.d.ts +17 -0
  157. package/dist/commands/phase/move.js +115 -0
  158. package/dist/commands/phase/template/apply.d.ts +17 -0
  159. package/dist/commands/phase/template/apply.js +106 -0
  160. package/dist/commands/phase/template/create.d.ts +16 -0
  161. package/dist/commands/phase/template/create.js +58 -0
  162. package/dist/commands/phase/template/delete.d.ts +17 -0
  163. package/dist/commands/phase/template/delete.js +98 -0
  164. package/dist/commands/phase/template/index.d.ts +15 -0
  165. package/dist/commands/phase/template/index.js +128 -0
  166. package/dist/commands/phase/template/list.d.ts +16 -0
  167. package/dist/commands/phase/template/list.js +95 -0
  168. package/dist/commands/phase/template/update.d.ts +17 -0
  169. package/dist/commands/phase/template/update.js +89 -0
  170. package/dist/commands/phase/update.d.ts +23 -0
  171. package/dist/commands/phase/update.js +174 -0
  172. package/dist/commands/pmo/init.d.ts +25 -0
  173. package/dist/commands/pmo/init.js +341 -0
  174. package/dist/commands/pr/create.d.ts +17 -0
  175. package/dist/commands/pr/create.js +242 -0
  176. package/dist/commands/pr/index.d.ts +9 -0
  177. package/dist/commands/pr/index.js +68 -0
  178. package/dist/commands/pr/link.d.ts +14 -0
  179. package/dist/commands/pr/link.js +212 -0
  180. package/dist/commands/pr/status.d.ts +12 -0
  181. package/dist/commands/pr/status.js +161 -0
  182. package/dist/commands/project/archive.d.ts +17 -0
  183. package/dist/commands/project/archive.js +83 -0
  184. package/dist/commands/project/create.d.ts +22 -0
  185. package/dist/commands/project/create.js +143 -0
  186. package/dist/commands/project/delete.d.ts +17 -0
  187. package/dist/commands/project/delete.js +128 -0
  188. package/dist/commands/project/index.d.ts +13 -0
  189. package/dist/commands/project/index.js +64 -0
  190. package/dist/commands/project/list.d.ts +14 -0
  191. package/dist/commands/project/list.js +96 -0
  192. package/dist/commands/project/spec.d.ts +18 -0
  193. package/dist/commands/project/spec.js +216 -0
  194. package/dist/commands/project/unarchive.d.ts +15 -0
  195. package/dist/commands/project/unarchive.js +35 -0
  196. package/dist/commands/project/view.d.ts +16 -0
  197. package/dist/commands/project/view.js +94 -0
  198. package/dist/commands/repo/add.d.ts +21 -0
  199. package/dist/commands/repo/add.js +118 -0
  200. package/dist/commands/repo/index.d.ts +13 -0
  201. package/dist/commands/repo/index.js +114 -0
  202. package/dist/commands/repo/list.d.ts +13 -0
  203. package/dist/commands/repo/list.js +96 -0
  204. package/dist/commands/repo/remove.d.ts +23 -0
  205. package/dist/commands/repo/remove.js +217 -0
  206. package/dist/commands/repo/view.d.ts +15 -0
  207. package/dist/commands/repo/view.js +99 -0
  208. package/dist/commands/session/attach.d.ts +40 -0
  209. package/dist/commands/session/attach.js +307 -0
  210. package/dist/commands/session/index.d.ts +13 -0
  211. package/dist/commands/session/index.js +64 -0
  212. package/dist/commands/session/list.d.ts +21 -0
  213. package/dist/commands/session/list.js +181 -0
  214. package/dist/commands/spec/create.d.ts +19 -0
  215. package/dist/commands/spec/create.js +130 -0
  216. package/dist/commands/spec/index.d.ts +13 -0
  217. package/dist/commands/spec/index.js +68 -0
  218. package/dist/commands/spec/link/depends.d.ts +14 -0
  219. package/dist/commands/spec/link/depends.js +64 -0
  220. package/dist/commands/spec/link/duplicates.d.ts +14 -0
  221. package/dist/commands/spec/link/duplicates.js +63 -0
  222. package/dist/commands/spec/link/index.d.ts +19 -0
  223. package/dist/commands/spec/link/index.js +200 -0
  224. package/dist/commands/spec/link/relates.d.ts +14 -0
  225. package/dist/commands/spec/link/relates.js +63 -0
  226. package/dist/commands/spec/link/remove.d.ts +16 -0
  227. package/dist/commands/spec/link/remove.js +94 -0
  228. package/dist/commands/spec/list.d.ts +12 -0
  229. package/dist/commands/spec/list.js +75 -0
  230. package/dist/commands/spec/plan.d.ts +15 -0
  231. package/dist/commands/spec/plan.js +108 -0
  232. package/dist/commands/spec/ticket.d.ts +18 -0
  233. package/dist/commands/spec/ticket.js +160 -0
  234. package/dist/commands/spec/view.d.ts +15 -0
  235. package/dist/commands/spec/view.js +163 -0
  236. package/dist/commands/status/create.d.ts +21 -0
  237. package/dist/commands/status/create.js +140 -0
  238. package/dist/commands/status/delete.d.ts +13 -0
  239. package/dist/commands/status/delete.js +77 -0
  240. package/dist/commands/status/index.d.ts +14 -0
  241. package/dist/commands/status/index.js +91 -0
  242. package/dist/commands/status/list.d.ts +12 -0
  243. package/dist/commands/status/list.js +93 -0
  244. package/dist/commands/status/move.d.ts +14 -0
  245. package/dist/commands/status/move.js +120 -0
  246. package/dist/commands/status/update.d.ts +20 -0
  247. package/dist/commands/status/update.js +180 -0
  248. package/dist/commands/template/delete.d.ts +15 -0
  249. package/dist/commands/template/delete.js +142 -0
  250. package/dist/commands/template/index.d.ts +10 -0
  251. package/dist/commands/template/index.js +64 -0
  252. package/dist/commands/template/list.d.ts +18 -0
  253. package/dist/commands/template/list.js +157 -0
  254. package/dist/commands/template/phase/apply.d.ts +14 -0
  255. package/dist/commands/template/phase/apply.js +41 -0
  256. package/dist/commands/template/phase/create.d.ts +12 -0
  257. package/dist/commands/template/phase/create.js +29 -0
  258. package/dist/commands/template/phase/delete.d.ts +13 -0
  259. package/dist/commands/template/phase/delete.js +34 -0
  260. package/dist/commands/template/phase/index.d.ts +10 -0
  261. package/dist/commands/template/phase/index.js +62 -0
  262. package/dist/commands/template/phase/list.d.ts +11 -0
  263. package/dist/commands/template/phase/list.js +34 -0
  264. package/dist/commands/template/phase/update.d.ts +13 -0
  265. package/dist/commands/template/phase/update.js +35 -0
  266. package/dist/commands/template/ticket/apply.d.ts +17 -0
  267. package/dist/commands/template/ticket/apply.js +58 -0
  268. package/dist/commands/template/ticket/delete.d.ts +13 -0
  269. package/dist/commands/template/ticket/delete.js +34 -0
  270. package/dist/commands/template/ticket/index.d.ts +10 -0
  271. package/dist/commands/template/ticket/index.js +62 -0
  272. package/dist/commands/template/ticket/list.d.ts +11 -0
  273. package/dist/commands/template/ticket/list.js +34 -0
  274. package/dist/commands/template/ticket/save.d.ts +13 -0
  275. package/dist/commands/template/ticket/save.js +35 -0
  276. package/dist/commands/ticket/bulk.d.ts +13 -0
  277. package/dist/commands/ticket/bulk.js +145 -0
  278. package/dist/commands/ticket/complete.d.ts +16 -0
  279. package/dist/commands/ticket/complete.js +170 -0
  280. package/dist/commands/ticket/create.d.ts +22 -0
  281. package/dist/commands/ticket/create.js +390 -0
  282. package/dist/commands/ticket/delete.d.ts +16 -0
  283. package/dist/commands/ticket/delete.js +178 -0
  284. package/dist/commands/ticket/edit.d.ts +27 -0
  285. package/dist/commands/ticket/edit.js +322 -0
  286. package/dist/commands/ticket/epic.d.ts +20 -0
  287. package/dist/commands/ticket/epic.js +333 -0
  288. package/dist/commands/ticket/index.d.ts +13 -0
  289. package/dist/commands/ticket/index.js +103 -0
  290. package/dist/commands/ticket/link/block.d.ts +14 -0
  291. package/dist/commands/ticket/link/block.js +94 -0
  292. package/dist/commands/ticket/link/duplicates.d.ts +14 -0
  293. package/dist/commands/ticket/link/duplicates.js +93 -0
  294. package/dist/commands/ticket/link/index.d.ts +19 -0
  295. package/dist/commands/ticket/link/index.js +239 -0
  296. package/dist/commands/ticket/link/relates.d.ts +14 -0
  297. package/dist/commands/ticket/link/relates.js +93 -0
  298. package/dist/commands/ticket/link/remove.d.ts +16 -0
  299. package/dist/commands/ticket/link/remove.js +128 -0
  300. package/dist/commands/ticket/list.d.ts +24 -0
  301. package/dist/commands/ticket/list.js +431 -0
  302. package/dist/commands/ticket/move.d.ts +18 -0
  303. package/dist/commands/ticket/move.js +212 -0
  304. package/dist/commands/ticket/project.d.ts +18 -0
  305. package/dist/commands/ticket/project.js +254 -0
  306. package/dist/commands/ticket/reassign.d.ts +19 -0
  307. package/dist/commands/ticket/reassign.js +279 -0
  308. package/dist/commands/ticket/spec.d.ts +18 -0
  309. package/dist/commands/ticket/spec.js +259 -0
  310. package/dist/commands/ticket/status.d.ts +13 -0
  311. package/dist/commands/ticket/status.js +87 -0
  312. package/dist/commands/ticket/template/apply.d.ts +25 -0
  313. package/dist/commands/ticket/template/apply.js +249 -0
  314. package/dist/commands/ticket/template/create.d.ts +19 -0
  315. package/dist/commands/ticket/template/create.js +210 -0
  316. package/dist/commands/ticket/template/delete.d.ts +17 -0
  317. package/dist/commands/ticket/template/delete.js +92 -0
  318. package/dist/commands/ticket/template/index.d.ts +15 -0
  319. package/dist/commands/ticket/template/index.js +118 -0
  320. package/dist/commands/ticket/template/list.d.ts +16 -0
  321. package/dist/commands/ticket/template/list.js +110 -0
  322. package/dist/commands/ticket/template/save.d.ts +14 -0
  323. package/dist/commands/ticket/template/save.js +110 -0
  324. package/dist/commands/ticket/update.d.ts +18 -0
  325. package/dist/commands/ticket/update.js +325 -0
  326. package/dist/commands/ticket/view.d.ts +13 -0
  327. package/dist/commands/ticket/view.js +80 -0
  328. package/dist/commands/whoami.d.ts +9 -0
  329. package/dist/commands/whoami.js +103 -0
  330. package/dist/commands/work/complete.d.ts +13 -0
  331. package/dist/commands/work/complete.js +121 -0
  332. package/dist/commands/work/index.d.ts +13 -0
  333. package/dist/commands/work/index.js +70 -0
  334. package/dist/commands/work/ready.d.ts +24 -0
  335. package/dist/commands/work/ready.js +290 -0
  336. package/dist/commands/work/revise.d.ts +19 -0
  337. package/dist/commands/work/revise.js +377 -0
  338. package/dist/commands/work/spawn-all.d.ts +17 -0
  339. package/dist/commands/work/spawn-all.js +58 -0
  340. package/dist/commands/work/spawn.d.ts +29 -0
  341. package/dist/commands/work/spawn.js +728 -0
  342. package/dist/commands/work/start.d.ts +39 -0
  343. package/dist/commands/work/start.js +1393 -0
  344. package/dist/commands/work/watch.d.ts +31 -0
  345. package/dist/commands/work/watch.js +359 -0
  346. package/dist/commands/workflow/create.d.ts +18 -0
  347. package/dist/commands/workflow/create.js +119 -0
  348. package/dist/commands/workflow/delete.d.ts +17 -0
  349. package/dist/commands/workflow/delete.js +119 -0
  350. package/dist/commands/workflow/index.d.ts +15 -0
  351. package/dist/commands/workflow/index.js +75 -0
  352. package/dist/commands/workflow/list.d.ts +15 -0
  353. package/dist/commands/workflow/list.js +75 -0
  354. package/dist/commands/workflow/switch.d.ts +13 -0
  355. package/dist/commands/workflow/switch.js +117 -0
  356. package/dist/commands/workflow/view.d.ts +16 -0
  357. package/dist/commands/workflow/view.js +114 -0
  358. package/dist/commands/workspace/add.d.ts +12 -0
  359. package/dist/commands/workspace/add.js +74 -0
  360. package/dist/commands/workspace/list.d.ts +9 -0
  361. package/dist/commands/workspace/list.js +153 -0
  362. package/dist/commands/workspace/remove.d.ts +13 -0
  363. package/dist/commands/workspace/remove.js +98 -0
  364. package/dist/commands/workspace/use.d.ts +12 -0
  365. package/dist/commands/workspace/use.js +111 -0
  366. package/dist/hooks/init.d.ts +11 -0
  367. package/dist/hooks/init.js +57 -0
  368. package/dist/index.d.ts +1 -0
  369. package/dist/index.js +1 -0
  370. package/dist/lib/agents/commands.d.ts +189 -0
  371. package/dist/lib/agents/commands.js +893 -0
  372. package/dist/lib/agents/index.d.ts +54 -0
  373. package/dist/lib/agents/index.js +382 -0
  374. package/dist/lib/branch/index.d.ts +120 -0
  375. package/dist/lib/branch/index.js +334 -0
  376. package/dist/lib/colors.d.ts +94 -0
  377. package/dist/lib/colors.js +68 -0
  378. package/dist/lib/commands/docker-command.d.ts +21 -0
  379. package/dist/lib/commands/docker-command.js +27 -0
  380. package/dist/lib/database/index.d.ts +176 -0
  381. package/dist/lib/database/index.js +581 -0
  382. package/dist/lib/docker/resolve.d.ts +38 -0
  383. package/dist/lib/docker/resolve.js +175 -0
  384. package/dist/lib/execution/config.d.ts +150 -0
  385. package/dist/lib/execution/config.js +541 -0
  386. package/dist/lib/execution/devcontainer.d.ts +85 -0
  387. package/dist/lib/execution/devcontainer.js +594 -0
  388. package/dist/lib/execution/index.d.ts +10 -0
  389. package/dist/lib/execution/index.js +10 -0
  390. package/dist/lib/execution/runners.d.ts +53 -0
  391. package/dist/lib/execution/runners.js +1182 -0
  392. package/dist/lib/execution/spawner.d.ts +85 -0
  393. package/dist/lib/execution/spawner.js +548 -0
  394. package/dist/lib/execution/storage.d.ts +159 -0
  395. package/dist/lib/execution/storage.js +425 -0
  396. package/dist/lib/execution/types.d.ts +145 -0
  397. package/dist/lib/execution/types.js +157 -0
  398. package/dist/lib/init/index.d.ts +75 -0
  399. package/dist/lib/init/index.js +355 -0
  400. package/dist/lib/machine-config.d.ts +170 -0
  401. package/dist/lib/machine-config.js +386 -0
  402. package/dist/lib/pmo/base-command.d.ts +195 -0
  403. package/dist/lib/pmo/base-command.js +319 -0
  404. package/dist/lib/pmo/create-spec-folders.d.ts +43 -0
  405. package/dist/lib/pmo/create-spec-folders.js +64 -0
  406. package/dist/lib/pmo/epic-files.d.ts +56 -0
  407. package/dist/lib/pmo/epic-files.js +195 -0
  408. package/dist/lib/pmo/find-pmo.d.ts +14 -0
  409. package/dist/lib/pmo/find-pmo.js +172 -0
  410. package/dist/lib/pmo/index.d.ts +109 -0
  411. package/dist/lib/pmo/index.js +501 -0
  412. package/dist/lib/pmo/markdown.d.ts +31 -0
  413. package/dist/lib/pmo/markdown.js +245 -0
  414. package/dist/lib/pmo/pmo-context.d.ts +27 -0
  415. package/dist/lib/pmo/pmo-context.js +44 -0
  416. package/dist/lib/pmo/schema.d.ts +82 -0
  417. package/dist/lib/pmo/schema.js +531 -0
  418. package/dist/lib/pmo/spec-parser.d.ts +25 -0
  419. package/dist/lib/pmo/spec-parser.js +205 -0
  420. package/dist/lib/pmo/spec-types.d.ts +43 -0
  421. package/dist/lib/pmo/spec-types.js +7 -0
  422. package/dist/lib/pmo/storage/actions.d.ts +34 -0
  423. package/dist/lib/pmo/storage/actions.js +177 -0
  424. package/dist/lib/pmo/storage/base.d.ts +47 -0
  425. package/dist/lib/pmo/storage/base.js +858 -0
  426. package/dist/lib/pmo/storage/dependencies.d.ts +61 -0
  427. package/dist/lib/pmo/storage/dependencies.js +267 -0
  428. package/dist/lib/pmo/storage/epics.d.ts +46 -0
  429. package/dist/lib/pmo/storage/epics.js +243 -0
  430. package/dist/lib/pmo/storage/helpers.d.ts +33 -0
  431. package/dist/lib/pmo/storage/helpers.js +148 -0
  432. package/dist/lib/pmo/storage/index.d.ts +186 -0
  433. package/dist/lib/pmo/storage/index.js +689 -0
  434. package/dist/lib/pmo/storage/phases.d.ts +65 -0
  435. package/dist/lib/pmo/storage/phases.js +392 -0
  436. package/dist/lib/pmo/storage/projects.d.ts +79 -0
  437. package/dist/lib/pmo/storage/projects.js +303 -0
  438. package/dist/lib/pmo/storage/specs.d.ts +77 -0
  439. package/dist/lib/pmo/storage/specs.js +389 -0
  440. package/dist/lib/pmo/storage/statuses.d.ts +63 -0
  441. package/dist/lib/pmo/storage/statuses.js +404 -0
  442. package/dist/lib/pmo/storage/subtasks.d.ts +37 -0
  443. package/dist/lib/pmo/storage/subtasks.js +184 -0
  444. package/dist/lib/pmo/storage/templates.d.ts +40 -0
  445. package/dist/lib/pmo/storage/templates.js +210 -0
  446. package/dist/lib/pmo/storage/tickets.d.ts +57 -0
  447. package/dist/lib/pmo/storage/tickets.js +453 -0
  448. package/dist/lib/pmo/storage/types.d.ts +200 -0
  449. package/dist/lib/pmo/storage/types.js +5 -0
  450. package/dist/lib/pmo/storage/views.d.ts +44 -0
  451. package/dist/lib/pmo/storage/views.js +355 -0
  452. package/dist/lib/pmo/storage-sqlite.d.ts +7 -0
  453. package/dist/lib/pmo/storage-sqlite.js +7 -0
  454. package/dist/lib/pmo/sync-manager.d.ts +92 -0
  455. package/dist/lib/pmo/sync-manager.js +229 -0
  456. package/dist/lib/pmo/types.d.ts +710 -0
  457. package/dist/lib/pmo/types.js +108 -0
  458. package/dist/lib/pmo/utils.d.ts +122 -0
  459. package/dist/lib/pmo/utils.js +174 -0
  460. package/dist/lib/pmo/watcher.d.ts +43 -0
  461. package/dist/lib/pmo/watcher.js +208 -0
  462. package/dist/lib/pr/index.d.ts +150 -0
  463. package/dist/lib/pr/index.js +483 -0
  464. package/dist/lib/prompt-json.d.ts +231 -0
  465. package/dist/lib/prompt-json.js +213 -0
  466. package/dist/lib/repos/index.d.ts +81 -0
  467. package/dist/lib/repos/index.js +679 -0
  468. package/dist/lib/styles.d.ts +98 -0
  469. package/dist/lib/styles.js +195 -0
  470. package/dist/lib/themes.d.ts +128 -0
  471. package/dist/lib/themes.js +301 -0
  472. package/dist/lib/ui/BoardUI.d.ts +21 -0
  473. package/dist/lib/ui/BoardUI.js +85 -0
  474. package/dist/lib/ui/ClaimTicketUI.d.ts +17 -0
  475. package/dist/lib/ui/ClaimTicketUI.js +64 -0
  476. package/dist/lib/ui/CreateTicketUI.d.ts +13 -0
  477. package/dist/lib/ui/CreateTicketUI.js +101 -0
  478. package/dist/lib/workspace.d.ts +66 -0
  479. package/dist/lib/workspace.js +204 -0
  480. package/oclif.manifest.json +10593 -0
  481. package/package.json +104 -52
  482. package/LICENSE +0 -21
  483. package/dist/bin/prlt.d.ts +0 -11
  484. package/dist/bin/prlt.d.ts.map +0 -1
  485. package/dist/bin/prlt.js +0 -144
  486. package/dist/bin/prlt.js.map +0 -1
  487. package/dist/lib/config/index.d.ts +0 -14
  488. package/dist/lib/config/index.d.ts.map +0 -1
  489. package/dist/lib/config/index.js +0 -139
  490. package/dist/lib/config/index.js.map +0 -1
  491. package/dist/lib/config/upgrade.d.ts +0 -2
  492. package/dist/lib/config/upgrade.d.ts.map +0 -1
  493. package/dist/lib/config/upgrade.js +0 -173
  494. package/dist/lib/config/upgrade.js.map +0 -1
  495. package/dist/lib/themes/index.d.ts +0 -8
  496. package/dist/lib/themes/index.d.ts.map +0 -1
  497. package/dist/lib/themes/index.js +0 -80
  498. package/dist/lib/themes/index.js.map +0 -1
  499. package/dist/lib/utils/helpers.d.ts +0 -4
  500. package/dist/lib/utils/helpers.d.ts.map +0 -1
  501. package/dist/lib/utils/helpers.js +0 -39
  502. package/dist/lib/utils/helpers.js.map +0 -1
  503. package/dist/lib/utils/logger.d.ts +0 -4
  504. package/dist/lib/utils/logger.d.ts.map +0 -1
  505. package/dist/lib/utils/logger.js +0 -28
  506. package/dist/lib/utils/logger.js.map +0 -1
  507. package/dist/lib/workspace/index.d.ts +0 -13
  508. package/dist/lib/workspace/index.d.ts.map +0 -1
  509. package/dist/lib/workspace/index.js +0 -116
  510. package/dist/lib/workspace/index.js.map +0 -1
  511. package/dist/lib/worktree/index.d.ts +0 -7
  512. package/dist/lib/worktree/index.d.ts.map +0 -1
  513. package/dist/lib/worktree/index.js +0 -362
  514. package/dist/lib/worktree/index.js.map +0 -1
  515. package/dist/lib/worktree/migrate.d.ts +0 -2
  516. package/dist/lib/worktree/migrate.d.ts.map +0 -1
  517. package/dist/lib/worktree/migrate.js +0 -212
  518. package/dist/lib/worktree/migrate.js.map +0 -1
  519. package/dist/lib/worktree/repair.d.ts +0 -3
  520. package/dist/lib/worktree/repair.d.ts.map +0 -1
  521. package/dist/lib/worktree/repair.js +0 -140
  522. package/dist/lib/worktree/repair.js.map +0 -1
  523. package/dist/types/index.d.ts +0 -57
  524. package/dist/types/index.d.ts.map +0 -1
  525. package/dist/types/index.js +0 -3
  526. package/dist/types/index.js.map +0 -1
@@ -0,0 +1,178 @@
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 TicketDelete extends PMOCommand {
7
+ static description = 'Delete ticket(s) permanently';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %> TICK-001',
10
+ '<%= config.bin %> <%= command.id %> TICK-001 --force',
11
+ '<%= config.bin %> <%= command.id %> # Interactive mode',
12
+ '<%= config.bin %> <%= command.id %> --bulk',
13
+ '<%= config.bin %> <%= command.id %> --json # Output choices as JSON',
14
+ ];
15
+ static args = {
16
+ ticketId: Args.string({
17
+ description: 'Ticket ID to delete - prompts with dropdown if not provided',
18
+ required: false,
19
+ }),
20
+ };
21
+ static flags = {
22
+ ...pmoBaseFlags,
23
+ json: Flags.boolean({
24
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
25
+ default: false,
26
+ }),
27
+ force: Flags.boolean({
28
+ char: 'f',
29
+ description: 'Skip confirmation prompt',
30
+ default: false,
31
+ }),
32
+ bulk: Flags.boolean({
33
+ char: 'b',
34
+ description: 'Enable bulk mode to delete multiple tickets',
35
+ default: false,
36
+ }),
37
+ };
38
+ async execute() {
39
+ const { args, flags } = await this.parse(TicketDelete);
40
+ const projectId = flags.project;
41
+ // Check if JSON output mode is active
42
+ const jsonMode = shouldOutputJson(flags);
43
+ // Helper to handle errors in JSON mode
44
+ const handleError = (code, message) => {
45
+ if (jsonMode) {
46
+ outputErrorAsJson(code, message, createMetadata('ticket delete', flags));
47
+ this.exit(1);
48
+ }
49
+ this.error(message);
50
+ };
51
+ // Get all tickets for selection
52
+ const allTickets = await this.storage.listTickets(projectId);
53
+ if (allTickets.length === 0) {
54
+ return handleError('NO_TICKETS', 'No tickets found.');
55
+ }
56
+ // Bulk mode
57
+ if (flags.bulk) {
58
+ await this.executeBulk(allTickets, flags.force);
59
+ return;
60
+ }
61
+ // Single ticket mode
62
+ let ticketId = args.ticketId;
63
+ if (!ticketId) {
64
+ // Use helper for ticket selection (handles JSON mode automatically)
65
+ const selected = await this.selectFromList({
66
+ message: 'Select ticket to delete:',
67
+ items: allTickets,
68
+ getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
69
+ getValue: (t) => t.id,
70
+ getCommand: (t) => `prlt ticket delete ${t.id} --force --json`,
71
+ jsonMode: jsonMode ? { flags, commandName: 'ticket delete' } : null,
72
+ });
73
+ if (!selected) {
74
+ return; // Cancelled or JSON mode (already exited)
75
+ }
76
+ ticketId = selected;
77
+ }
78
+ // Get ticket to show details in confirmation
79
+ const ticket = await this.storage.getTicket(ticketId);
80
+ if (!ticket) {
81
+ this.error(`Ticket "${ticketId}" not found.`);
82
+ }
83
+ // Get board for project name
84
+ const board = await this.storage.getBoard(ticket.projectId);
85
+ // Confirmation prompt (unless --force)
86
+ if (!flags.force) {
87
+ this.log(`\nDelete ticket ${styles.emphasis(ticketId)}?`);
88
+ this.log(` Title: ${ticket.title}`);
89
+ this.log(` Project: ${board.name}`);
90
+ this.log(` Status: ${ticket.statusName}`);
91
+ const { confirmed } = await inquirer.prompt([{
92
+ type: 'list',
93
+ name: 'confirmed',
94
+ message: 'Are you sure?',
95
+ choices: [
96
+ { name: 'No, cancel', value: false },
97
+ { name: 'Yes, delete', value: true },
98
+ ],
99
+ default: 0,
100
+ }]);
101
+ if (!confirmed) {
102
+ this.log(styles.warning('Deletion cancelled.'));
103
+ return;
104
+ }
105
+ }
106
+ // Delete ticket
107
+ await this.storage.deleteTicket(ticketId);
108
+ // Auto-export to board.md after write
109
+ await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
110
+ this.log(styles.success(`\n✅ Ticket ${styles.emphasis(ticketId)} deleted`));
111
+ this.log(styles.muted(' Removed from database and board'));
112
+ }
113
+ async executeBulk(allTickets, force) {
114
+ this.log(styles.emphasis('🗑️ Delete Multiple Tickets\n'));
115
+ // Select tickets to delete
116
+ const { selectedTickets } = await inquirer.prompt([{
117
+ type: 'checkbox',
118
+ name: 'selectedTickets',
119
+ message: 'Select tickets to DELETE:',
120
+ choices: allTickets.map(t => ({
121
+ name: `${t.id} - ${t.title} (${t.statusName})`,
122
+ value: t.id,
123
+ })),
124
+ }]);
125
+ if (selectedTickets.length === 0) {
126
+ this.log(styles.muted('No tickets selected.'));
127
+ return;
128
+ }
129
+ // Confirmation
130
+ if (!force) {
131
+ this.log(styles.warning('\nThis will PERMANENTLY DELETE:'));
132
+ for (const ticketId of selectedTickets) {
133
+ const ticket = allTickets.find(t => t.id === ticketId);
134
+ this.log(styles.primary(` • ${ticketId}: ${ticket?.title}`));
135
+ }
136
+ this.log('');
137
+ const { confirm } = await inquirer.prompt([{
138
+ type: 'list',
139
+ name: 'confirm',
140
+ message: 'Are you sure? This cannot be undone.',
141
+ choices: [
142
+ { name: 'No, cancel', value: false },
143
+ { name: 'Yes, DELETE tickets', value: true }
144
+ ],
145
+ default: 0
146
+ }]);
147
+ if (!confirm) {
148
+ this.log(styles.muted('Deletion cancelled.'));
149
+ return;
150
+ }
151
+ }
152
+ this.log('');
153
+ // Delete each ticket
154
+ let successCount = 0;
155
+ let failCount = 0;
156
+ for (const ticketId of selectedTickets) {
157
+ try {
158
+ await this.storage.deleteTicket(ticketId);
159
+ this.log(styles.success(`Deleted ${ticketId}`));
160
+ successCount++;
161
+ }
162
+ catch (error) {
163
+ this.log(styles.error(`Failed to delete ${ticketId}: ${error instanceof Error ? error.message : String(error)}`));
164
+ failCount++;
165
+ }
166
+ }
167
+ // Auto-export to kanban.md
168
+ await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
169
+ // Summary
170
+ this.log('');
171
+ if (successCount > 0) {
172
+ this.log(styles.success(`Deleted ${successCount} ticket(s)`));
173
+ }
174
+ if (failCount > 0) {
175
+ this.log(styles.error(`Failed to delete ${failCount} ticket(s)`));
176
+ }
177
+ }
178
+ }
@@ -0,0 +1,27 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class TicketEdit 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
+ };
8
+ static flags: {
9
+ title: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ priority: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ category: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ owner: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ assignee: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ 'add-subtask': import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ 'clear-subtasks': import("@oclif/core/interfaces").BooleanFlag<boolean>;
17
+ 'add-label': import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
+ 'remove-label': import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ 'add-ac': import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
+ 'clear-ac': import("@oclif/core/interfaces").BooleanFlag<boolean>;
21
+ interactive: import("@oclif/core/interfaces").BooleanFlag<boolean>;
22
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
23
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
24
+ };
25
+ execute(): Promise<void>;
26
+ private promptForEdits;
27
+ }
@@ -0,0 +1,322 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { autoExportToBoard, PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
4
+ import { PRIORITIES, PRIORITY_LABELS } from '../../lib/pmo/types.js';
5
+ import { styles } from '../../lib/styles.js';
6
+ import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
7
+ export default class TicketEdit extends PMOCommand {
8
+ static description = 'Edit an existing ticket';
9
+ static examples = [
10
+ '<%= config.bin %> <%= command.id %> TICK-001',
11
+ '<%= config.bin %> <%= command.id %> TICK-001 --title "New title"',
12
+ '<%= config.bin %> <%= command.id %> TICK-001 --priority HIGH --category bug',
13
+ '<%= config.bin %> <%= command.id %> TICK-001 --add-subtask "Implement feature" --add-subtask "Write tests"',
14
+ '<%= config.bin %> <%= command.id %> TICK-001 --owner "john" --assignee "agent-1"',
15
+ '<%= config.bin %> <%= command.id %> # Interactive mode',
16
+ ];
17
+ static args = {
18
+ ticketId: Args.string({
19
+ description: 'Ticket ID to edit - prompts with dropdown if not provided',
20
+ required: false,
21
+ }),
22
+ };
23
+ static flags = {
24
+ ...pmoBaseFlags,
25
+ title: Flags.string({
26
+ char: 't',
27
+ description: 'New ticket title',
28
+ }),
29
+ description: Flags.string({
30
+ char: 'd',
31
+ description: 'New ticket description',
32
+ }),
33
+ priority: Flags.string({
34
+ char: 'p',
35
+ description: 'New ticket priority',
36
+ options: [...PRIORITIES, 'none'],
37
+ }),
38
+ category: Flags.string({
39
+ description: 'New ticket category',
40
+ }),
41
+ owner: Flags.string({
42
+ char: 'o',
43
+ description: 'Ticket owner (human responsible)',
44
+ }),
45
+ assignee: Flags.string({
46
+ char: 'a',
47
+ description: 'Ticket assignee (who executes)',
48
+ }),
49
+ 'add-subtask': Flags.string({
50
+ description: 'Add a subtask (can be used multiple times)',
51
+ multiple: true,
52
+ }),
53
+ 'clear-subtasks': Flags.boolean({
54
+ description: 'Clear all existing subtasks before adding new ones',
55
+ default: false,
56
+ }),
57
+ 'add-label': Flags.string({
58
+ description: 'Add a label (can be used multiple times)',
59
+ multiple: true,
60
+ }),
61
+ 'remove-label': Flags.string({
62
+ description: 'Remove a label',
63
+ multiple: true,
64
+ }),
65
+ 'add-ac': Flags.string({
66
+ description: 'Add an acceptance criterion (can be used multiple times)',
67
+ multiple: true,
68
+ }),
69
+ 'clear-ac': Flags.boolean({
70
+ description: 'Clear all existing acceptance criteria before adding new ones',
71
+ default: false,
72
+ }),
73
+ interactive: Flags.boolean({
74
+ char: 'i',
75
+ description: 'Interactive mode - prompts for all fields',
76
+ default: false,
77
+ }),
78
+ json: Flags.boolean({
79
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
80
+ default: false,
81
+ }),
82
+ };
83
+ async execute() {
84
+ const { args, flags } = await this.parse(TicketEdit);
85
+ const projectId = flags.project;
86
+ // Check if JSON output mode is active
87
+ const jsonMode = shouldOutputJson(flags);
88
+ // Helper to handle errors in JSON mode
89
+ const handleError = (code, message) => {
90
+ if (jsonMode) {
91
+ outputErrorAsJson(code, message, createMetadata('ticket edit', flags));
92
+ this.exit(1);
93
+ }
94
+ this.error(message);
95
+ };
96
+ // Get ticketId - prompt if not provided
97
+ let ticketId = args.ticketId;
98
+ if (!ticketId) {
99
+ // Get all tickets for selection
100
+ const allTickets = await this.storage.listTickets(projectId);
101
+ if (allTickets.length === 0) {
102
+ return handleError('NO_TICKETS', 'No tickets found. Create a ticket first with "prlt ticket create".');
103
+ }
104
+ // Use helper for ticket selection (handles JSON mode automatically)
105
+ const selected = await this.selectFromList({
106
+ message: 'Select ticket to edit:',
107
+ items: allTickets,
108
+ getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
109
+ getValue: (t) => t.id,
110
+ getCommand: (t) => `prlt ticket edit ${t.id} --json`,
111
+ jsonMode: jsonMode ? { flags, commandName: 'ticket edit' } : null,
112
+ });
113
+ if (!selected) {
114
+ return; // Cancelled or JSON mode (already exited)
115
+ }
116
+ ticketId = selected;
117
+ }
118
+ // Get current ticket
119
+ const ticket = await this.storage.getTicket(ticketId);
120
+ if (!ticket) {
121
+ this.error(`Ticket "${ticketId}" not found.`);
122
+ }
123
+ // Determine what to update
124
+ let updates = {};
125
+ const hasFlags = flags.title || flags.description || flags.priority || flags.category ||
126
+ flags.owner || flags.assignee || flags['add-subtask'] || flags['clear-subtasks'] ||
127
+ flags['add-label'] || flags['remove-label'] || flags['add-ac'] || flags['clear-ac'];
128
+ if (flags.interactive || !hasFlags) {
129
+ // Interactive mode - prompt for all editable fields
130
+ const board = await this.storage.getBoard(ticket.projectId);
131
+ const columns = board.columns.map(col => col.name);
132
+ updates = await this.promptForEdits(ticket, columns);
133
+ }
134
+ else {
135
+ // Use flag values
136
+ if (flags.title)
137
+ updates.title = flags.title;
138
+ if (flags.description)
139
+ updates.description = flags.description;
140
+ if (flags.priority) {
141
+ updates.priority = flags.priority === 'none' ? undefined : flags.priority;
142
+ }
143
+ if (flags.category)
144
+ updates.category = flags.category;
145
+ if (flags.owner)
146
+ updates.owner = flags.owner;
147
+ if (flags.assignee)
148
+ updates.assignee = flags.assignee;
149
+ }
150
+ // Handle subtasks
151
+ let subtasksChanged = false;
152
+ if (flags['clear-subtasks']) {
153
+ // Clear all subtasks first - get from ticket object
154
+ for (const subtask of ticket.subtasks) {
155
+ await this.storage.removeSubtask(ticketId, subtask.id);
156
+ }
157
+ subtasksChanged = true;
158
+ }
159
+ if (flags['add-subtask'] && flags['add-subtask'].length > 0) {
160
+ for (const subtaskTitle of flags['add-subtask']) {
161
+ await this.storage.addSubtask(ticketId, subtaskTitle);
162
+ }
163
+ subtasksChanged = true;
164
+ }
165
+ // Handle labels
166
+ let labelsChanged = false;
167
+ let currentLabels = [...ticket.labels];
168
+ if (flags['remove-label'] && flags['remove-label'].length > 0) {
169
+ currentLabels = currentLabels.filter(l => !flags['remove-label'].includes(l));
170
+ labelsChanged = true;
171
+ }
172
+ if (flags['add-label'] && flags['add-label'].length > 0) {
173
+ for (const label of flags['add-label']) {
174
+ if (!currentLabels.includes(label)) {
175
+ currentLabels.push(label);
176
+ labelsChanged = true;
177
+ }
178
+ }
179
+ }
180
+ // Handle acceptance criteria
181
+ let acChanged = false;
182
+ if (flags['clear-ac']) {
183
+ await this.storage.clearAcceptanceCriteria(ticketId);
184
+ acChanged = true;
185
+ }
186
+ if (flags['add-ac'] && flags['add-ac'].length > 0) {
187
+ for (const criterion of flags['add-ac']) {
188
+ await this.storage.addAcceptanceCriterion(ticketId, criterion);
189
+ }
190
+ acChanged = true;
191
+ }
192
+ // Check if anything changed
193
+ const hasChanges = Object.keys(updates).length > 0 || subtasksChanged || labelsChanged || acChanged;
194
+ if (!hasChanges) {
195
+ this.log(styles.muted('\nNo changes made.'));
196
+ return;
197
+ }
198
+ // Update the ticket with labels if changed
199
+ if (labelsChanged) {
200
+ updates.labels = currentLabels;
201
+ }
202
+ // Update the ticket
203
+ const updatedTicket = await this.storage.updateTicket(ticketId, updates);
204
+ // Auto-export to board.md
205
+ await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
206
+ // Display updated ticket
207
+ this.log(styles.success(`\n✅ Updated ticket ${styles.emphasis(updatedTicket.id)}`));
208
+ const changedFields = [];
209
+ if (updates.title)
210
+ changedFields.push(`Title: ${updatedTicket.title}`);
211
+ if (updates.description !== undefined)
212
+ changedFields.push(`Description: ${updatedTicket.description || '(cleared)'}`);
213
+ if (updates.priority !== undefined)
214
+ changedFields.push(`Priority: ${updatedTicket.priority || 'none'}`);
215
+ if (updates.category !== undefined)
216
+ changedFields.push(`Category: ${updatedTicket.category || 'none'}`);
217
+ if (updates.owner !== undefined)
218
+ changedFields.push(`Owner: ${updatedTicket.owner || 'none'}`);
219
+ if (updates.assignee !== undefined)
220
+ changedFields.push(`Assignee: ${updatedTicket.assignee || 'none'}`);
221
+ if (subtasksChanged || acChanged) {
222
+ // Re-fetch ticket to get updated subtasks and AC
223
+ const refreshedTicket = await this.storage.getTicket(ticketId);
224
+ if (subtasksChanged) {
225
+ changedFields.push(`Subtasks: ${refreshedTicket?.subtasks.length || 0} items`);
226
+ }
227
+ if (acChanged) {
228
+ changedFields.push(`Acceptance Criteria: ${refreshedTicket?.acceptanceCriteria?.length || 0} items`);
229
+ }
230
+ }
231
+ if (labelsChanged)
232
+ changedFields.push(`Labels: ${currentLabels.join(', ') || 'none'}`);
233
+ for (const field of changedFields) {
234
+ this.log(styles.muted(` ${field}`));
235
+ }
236
+ this.log('');
237
+ }
238
+ async promptForEdits(ticket, _columns) {
239
+ const answers = await inquirer.prompt([
240
+ {
241
+ type: 'input',
242
+ name: 'title',
243
+ message: 'Title:',
244
+ default: ticket.title,
245
+ validate: (input) => input.length > 0 || 'Title is required',
246
+ },
247
+ {
248
+ type: 'editor',
249
+ name: 'description',
250
+ message: 'Description (opens $EDITOR for multiline input):',
251
+ default: ticket.description || '',
252
+ waitForUseInput: false,
253
+ },
254
+ {
255
+ type: 'list',
256
+ name: 'priority',
257
+ message: 'Priority:',
258
+ choices: [
259
+ { name: 'None', value: '' },
260
+ ...PRIORITIES.map(p => ({ name: PRIORITY_LABELS[p], value: p })),
261
+ ],
262
+ default: ticket.priority || '',
263
+ },
264
+ {
265
+ type: 'list',
266
+ name: 'categoryChoice',
267
+ message: 'Category:',
268
+ choices: [
269
+ { name: 'None', value: '' },
270
+ new inquirer.Separator('── Conventional Commits ──'),
271
+ { name: 'feature - New feature or capability', value: 'feature' },
272
+ { name: 'bug - Bug fix', value: 'bug' },
273
+ { name: 'refactor - Code refactoring', value: 'refactor' },
274
+ { name: 'docs - Documentation', value: 'docs' },
275
+ { name: 'test - Test additions/fixes', value: 'test' },
276
+ { name: 'chore - Maintenance tasks', value: 'chore' },
277
+ { name: 'performance - Performance improvements', value: 'performance' },
278
+ { name: 'ci - CI/CD changes', value: 'ci' },
279
+ { name: 'build - Build system changes', value: 'build' },
280
+ new inquirer.Separator('── Extended Types ──'),
281
+ { name: 'security - Security fixes', value: 'security' },
282
+ { name: 'database - Database migrations', value: 'database' },
283
+ { name: 'release - Release preparation', value: 'release' },
284
+ new inquirer.Separator('── 5Tool Founder ──'),
285
+ { name: 'ship - Shipping and deployment', value: 'ship' },
286
+ { name: 'growth - Growth and marketing', value: 'growth' },
287
+ { name: 'support - Customer experience', value: 'support' },
288
+ { name: 'strategy - Strategy and planning', value: 'strategy' },
289
+ { name: 'ops - Business operations', value: 'ops' },
290
+ new inquirer.Separator('───────────────────'),
291
+ { name: 'Custom...', value: '__custom__' },
292
+ ],
293
+ default: ticket.category || '',
294
+ },
295
+ {
296
+ type: 'input',
297
+ name: 'customCategory',
298
+ message: 'Enter custom category:',
299
+ when: (answers) => answers.categoryChoice === '__custom__',
300
+ validate: (input) => input.length > 0 || 'Category is required when choosing custom',
301
+ },
302
+ ]);
303
+ // Build updates object with only changed fields
304
+ const updates = {};
305
+ if (answers.title !== ticket.title) {
306
+ updates.title = answers.title;
307
+ }
308
+ if (answers.description !== (ticket.description || '')) {
309
+ updates.description = answers.description || undefined;
310
+ }
311
+ if (answers.priority !== (ticket.priority || '')) {
312
+ updates.priority = answers.priority || undefined;
313
+ }
314
+ const newCategory = answers.categoryChoice === '__custom__'
315
+ ? answers.customCategory
316
+ : answers.categoryChoice;
317
+ if (newCategory !== (ticket.category || '')) {
318
+ updates.category = newCategory || undefined;
319
+ }
320
+ return updates;
321
+ }
322
+ }
@@ -0,0 +1,20 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class TicketEpic extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ 'epic-id': 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
+ 'to-epic': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ 'from-epic': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
+ };
18
+ execute(): Promise<void>;
19
+ private executeBulk;
20
+ }