@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,170 @@
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 TicketComplete extends PMOCommand {
7
+ static description = 'Mark ticket(s) as complete (move to Done column)';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %>',
10
+ '<%= config.bin %> <%= command.id %> TICK-001',
11
+ '<%= config.bin %> <%= command.id %> --bulk',
12
+ ];
13
+ static args = {
14
+ ticketId: Args.string({
15
+ description: 'Ticket ID - prompts with dropdown if not provided',
16
+ required: false,
17
+ }),
18
+ };
19
+ static flags = {
20
+ ...pmoBaseFlags,
21
+ json: Flags.boolean({
22
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
23
+ default: false,
24
+ }),
25
+ bulk: Flags.boolean({
26
+ char: 'b',
27
+ description: 'Enable bulk mode to complete multiple tickets',
28
+ default: false,
29
+ }),
30
+ force: Flags.boolean({
31
+ char: 'f',
32
+ description: 'Skip confirmation prompt (bulk mode only)',
33
+ default: false,
34
+ }),
35
+ };
36
+ async execute() {
37
+ const { args, flags } = await this.parse(TicketComplete);
38
+ const projectId = flags.project;
39
+ // Check if JSON output mode is active
40
+ const jsonMode = shouldOutputJson(flags);
41
+ // Helper to handle errors in JSON mode
42
+ const handleError = (code, message) => {
43
+ if (jsonMode) {
44
+ outputErrorAsJson(code, message, createMetadata('ticket complete', flags));
45
+ this.exit(1);
46
+ }
47
+ this.error(message);
48
+ };
49
+ // Get all incomplete tickets
50
+ const allTickets = await this.storage.listTickets(projectId);
51
+ const incompleteTickets = allTickets.filter(t => t.statusName && !t.statusName.toLowerCase().includes('done'));
52
+ if (incompleteTickets.length === 0) {
53
+ if (jsonMode) {
54
+ outputErrorAsJson('NO_INCOMPLETE_TICKETS', 'No incomplete tickets found. All tickets are done!', createMetadata('ticket complete', flags));
55
+ return;
56
+ }
57
+ this.log(styles.info('No incomplete tickets found. All tickets are done!'));
58
+ return;
59
+ }
60
+ // Get board for columns (use the first incomplete ticket's project)
61
+ const board = await this.storage.getBoard(incompleteTickets[0].projectId);
62
+ // Find the "Done" column (case-insensitive)
63
+ const doneColumn = board.columns.find(col => col.name.toLowerCase().includes('done'));
64
+ if (!doneColumn) {
65
+ return handleError('NO_DONE_COLUMN', 'No "Done" column found in board configuration.');
66
+ }
67
+ // Bulk mode
68
+ if (flags.bulk) {
69
+ await this.executeBulk(incompleteTickets, doneColumn.name, flags.force);
70
+ return;
71
+ }
72
+ // Single ticket mode
73
+ let ticketId = args.ticketId;
74
+ if (!ticketId) {
75
+ const selected = await this.selectFromList({
76
+ message: 'Select ticket to mark complete:',
77
+ items: incompleteTickets,
78
+ getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
79
+ getValue: (t) => t.id,
80
+ getCommand: (t) => `prlt ticket complete ${t.id} --json`,
81
+ jsonMode: jsonMode ? { flags, commandName: 'ticket complete' } : null,
82
+ });
83
+ if (!selected) {
84
+ return;
85
+ }
86
+ ticketId = selected;
87
+ }
88
+ // Get ticket
89
+ const ticket = await this.storage.getTicket(ticketId);
90
+ if (!ticket) {
91
+ this.error(`Ticket "${ticketId}" not found.`);
92
+ }
93
+ // Move to Done column
94
+ await this.storage.moveTicket(ticket.projectId, ticketId, doneColumn.name);
95
+ // Auto-export to board.md if configured
96
+ await autoExportToBoard(this.pmoPath, this.storage);
97
+ this.log(styles.success(`✅ Completed ${ticketId}`));
98
+ this.log(styles.muted(` Title: ${ticket.title}`));
99
+ this.log(styles.muted(` Moved to: ${doneColumn.name}`));
100
+ }
101
+ async executeBulk(incompleteTickets, doneColumnName, force) {
102
+ this.log(styles.emphasis('✅ Complete Multiple Tickets\n'));
103
+ // Select tickets to complete
104
+ const { selectedTickets } = await inquirer.prompt([{
105
+ type: 'checkbox',
106
+ name: 'selectedTickets',
107
+ message: 'Select tickets to mark as COMPLETE:',
108
+ choices: incompleteTickets.map(t => ({
109
+ name: `${t.id} - ${t.title} (${t.statusName})`,
110
+ value: t.id,
111
+ })),
112
+ }]);
113
+ if (selectedTickets.length === 0) {
114
+ this.log(styles.muted('No tickets selected.'));
115
+ return;
116
+ }
117
+ // Confirmation
118
+ if (!force) {
119
+ this.log(styles.primary('\nWill mark as complete:'));
120
+ for (const ticketId of selectedTickets) {
121
+ const ticket = incompleteTickets.find(t => t.id === ticketId);
122
+ this.log(styles.primary(` • ${ticketId}: ${ticket?.title}`));
123
+ }
124
+ this.log(styles.primary(` → Move to: ${doneColumnName}\n`));
125
+ const { confirm } = await inquirer.prompt([{
126
+ type: 'list',
127
+ name: 'confirm',
128
+ message: 'Continue?',
129
+ choices: [
130
+ { name: 'No, cancel', value: false },
131
+ { name: 'Yes, complete tickets', value: true }
132
+ ],
133
+ default: 1
134
+ }]);
135
+ if (!confirm) {
136
+ this.log(styles.muted('Operation cancelled.'));
137
+ return;
138
+ }
139
+ }
140
+ this.log('');
141
+ // Complete each ticket
142
+ let successCount = 0;
143
+ let failCount = 0;
144
+ for (const ticketId of selectedTickets) {
145
+ try {
146
+ const ticket = incompleteTickets.find(t => t.id === ticketId);
147
+ if (!ticket) {
148
+ throw new Error('Ticket not found in incomplete tickets list');
149
+ }
150
+ await this.storage.moveTicket(ticket.projectId, ticketId, doneColumnName);
151
+ this.log(styles.success(`Completed ${ticketId}`));
152
+ successCount++;
153
+ }
154
+ catch (error) {
155
+ this.log(styles.error(`Failed to complete ${ticketId}: ${error instanceof Error ? error.message : String(error)}`));
156
+ failCount++;
157
+ }
158
+ }
159
+ // Auto-export to kanban.md
160
+ await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
161
+ // Summary
162
+ this.log('');
163
+ if (successCount > 0) {
164
+ this.log(styles.success(`Completed ${successCount} ticket(s)`));
165
+ }
166
+ if (failCount > 0) {
167
+ this.log(styles.error(`Failed to complete ${failCount} ticket(s)`));
168
+ }
169
+ }
170
+ }
@@ -0,0 +1,22 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class TicketCreate extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ title: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ column: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ priority: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ category: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ id: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ interactive: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ epic: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ template: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ labels: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
+ };
19
+ execute(): Promise<void>;
20
+ private promptTicketData;
21
+ private promptStructuredDescription;
22
+ }
@@ -0,0 +1,390 @@
1
+ import { 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 { updateEpicTicketsSection } from '../../lib/pmo/epic-files.js';
6
+ import { PRIORITIES, PRIORITY_LABELS } from '../../lib/pmo/types.js';
7
+ import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
8
+ export default class TicketCreate extends PMOCommand {
9
+ static description = 'Create a new ticket on the PMO board';
10
+ static examples = [
11
+ '<%= config.bin %> <%= command.id %>',
12
+ '<%= config.bin %> <%= command.id %> --title "Fix login bug" --column Backlog',
13
+ '<%= config.bin %> <%= command.id %> -t "Add feature" -c "In Progress" -p HIGH',
14
+ '<%= config.bin %> <%= command.id %> --project mobile-app -t "New feature"',
15
+ '<%= config.bin %> <%= command.id %> --epic EPIC-001 -t "Implement auth flow"',
16
+ '<%= config.bin %> <%= command.id %> --json # Output column choices as JSON',
17
+ ];
18
+ static flags = {
19
+ ...pmoBaseFlags,
20
+ json: Flags.boolean({
21
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
22
+ default: false,
23
+ }),
24
+ title: Flags.string({
25
+ char: 't',
26
+ description: 'Ticket title',
27
+ }),
28
+ column: Flags.string({
29
+ char: 'c',
30
+ description: 'Column to place the ticket in',
31
+ }),
32
+ priority: Flags.string({
33
+ char: 'p',
34
+ description: 'Ticket priority',
35
+ options: [...PRIORITIES],
36
+ }),
37
+ category: Flags.string({
38
+ description: 'Ticket category (e.g., bug, feature, refactor)',
39
+ }),
40
+ description: Flags.string({
41
+ char: 'd',
42
+ description: 'Ticket description',
43
+ }),
44
+ id: Flags.string({
45
+ description: 'Custom ticket ID (auto-generated if not provided)',
46
+ }),
47
+ interactive: Flags.boolean({
48
+ char: 'i',
49
+ description: 'Interactive mode',
50
+ default: false,
51
+ }),
52
+ epic: Flags.string({
53
+ char: 'e',
54
+ description: 'Link ticket to an epic (e.g., EPIC-001)',
55
+ }),
56
+ template: Flags.string({
57
+ char: 'T',
58
+ description: 'Create from a template (e.g., bug-report, feature-request)',
59
+ }),
60
+ labels: Flags.string({
61
+ char: 'l',
62
+ description: 'Labels (comma-separated)',
63
+ }),
64
+ };
65
+ async execute() {
66
+ const { flags } = await this.parse(TicketCreate);
67
+ // Get project and board info (pass JSON mode config for AI agents)
68
+ const projectId = await this.requireProject({
69
+ jsonMode: {
70
+ flags,
71
+ commandName: 'ticket create',
72
+ baseCommand: 'prlt ticket create',
73
+ },
74
+ });
75
+ const board = await this.storage.getBoard(projectId);
76
+ const columns = board.columns.map(c => c.name);
77
+ const projectName = await this.getProjectName(projectId);
78
+ // Check if JSON output mode is active
79
+ const jsonMode = shouldOutputJson(flags);
80
+ // Helper to handle errors in JSON mode
81
+ const handleError = (code, message) => {
82
+ if (jsonMode) {
83
+ outputErrorAsJson(code, message, createMetadata('ticket create', flags));
84
+ this.exit(1);
85
+ }
86
+ this.error(message);
87
+ };
88
+ // In JSON mode without required data, output column selection prompt
89
+ if (jsonMode && !flags.title && !flags.column) {
90
+ // Build base command with project if specified
91
+ const baseCmd = flags.project
92
+ ? `prlt ticket create -P ${flags.project}`
93
+ : 'prlt ticket create';
94
+ const columnChoices = columns.map(c => ({
95
+ name: c,
96
+ value: c,
97
+ command: `${baseCmd} --column "${c}" --json`,
98
+ }));
99
+ outputPromptAsJson(buildPromptConfig('list', 'column', 'Select column to place the ticket in:', columnChoices), createMetadata('ticket create', flags));
100
+ return;
101
+ }
102
+ // Validate epic if provided
103
+ if (flags.epic) {
104
+ const epic = await this.storage.getEpic(flags.epic);
105
+ if (!epic) {
106
+ return handleError('EPIC_NOT_FOUND', `Epic not found: ${flags.epic}. Use 'prlt epic list' to see available epics.`);
107
+ }
108
+ }
109
+ // Load template if specified
110
+ let template = null;
111
+ if (flags.template) {
112
+ template = await this.storage.getTicketTemplate(flags.template);
113
+ if (!template) {
114
+ this.error(`Template not found: ${flags.template}. Run 'prlt ticket template list' to see available templates.`);
115
+ }
116
+ }
117
+ // Parse labels from flag
118
+ const labelsFromFlag = flags.labels
119
+ ? flags.labels.split(',').map(l => l.trim()).filter(l => l)
120
+ : undefined;
121
+ // Get ticket data (interactive or from flags)
122
+ let ticketData;
123
+ // In JSON mode with column but no title, output required fields info
124
+ if (jsonMode && flags.column && !flags.title) {
125
+ const baseCmd = flags.project
126
+ ? `prlt ticket create -P ${flags.project} --column "${flags.column}"`
127
+ : `prlt ticket create --column "${flags.column}"`;
128
+ outputPromptAsJson({
129
+ type: 'input',
130
+ name: 'title',
131
+ message: 'Enter ticket title:',
132
+ context: {
133
+ hint: `Provide title with: ${baseCmd} --title "Your title here"`,
134
+ requiredFields: ['--title'],
135
+ optionalFields: ['--priority', '--category', '--description', '--epic', '--labels'],
136
+ example: `${baseCmd} --title "Fix login bug" --priority P1 --category bug`,
137
+ },
138
+ }, createMetadata('ticket create', flags));
139
+ return;
140
+ }
141
+ if (flags.interactive || !flags.title) {
142
+ ticketData = await this.promptTicketData(flags, this.storage, template, columns);
143
+ }
144
+ else {
145
+ if (!flags.title && !template?.titlePattern) {
146
+ this.error('Title is required. Use --title or -t flag, or use --interactive mode.');
147
+ }
148
+ ticketData = {
149
+ title: flags.title || template?.titlePattern || '',
150
+ statusName: flags.column || columns[0],
151
+ priority: flags.priority || template?.defaultPriority,
152
+ category: flags.category || template?.defaultCategory,
153
+ description: flags.description || template?.descriptionTemplate,
154
+ id: flags.id,
155
+ epicId: flags.epic,
156
+ labels: labelsFromFlag || template?.defaultLabels,
157
+ };
158
+ }
159
+ // Validate status/column
160
+ if (!columns.includes(ticketData.statusName)) {
161
+ this.error(`Invalid column "${ticketData.statusName}". Available columns: ${columns.join(', ')}`);
162
+ }
163
+ const ticket = await this.storage.createTicket(projectId, {
164
+ id: ticketData.id,
165
+ title: ticketData.title,
166
+ statusName: ticketData.statusName,
167
+ priority: ticketData.priority,
168
+ category: ticketData.category,
169
+ description: ticketData.description,
170
+ epicId: ticketData.epicId,
171
+ labels: ticketData.labels,
172
+ });
173
+ // Add subtasks from template if applicable
174
+ if (template && template.suggestedSubtasks.length > 0) {
175
+ for (const subtask of template.suggestedSubtasks) {
176
+ await this.storage.addSubtask(ticket.id, subtask.title);
177
+ }
178
+ }
179
+ // Auto-export to board.md after write
180
+ await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
181
+ // If linked to an epic, update the epic's markdown file with ticket list
182
+ if (ticketData.epicId) {
183
+ const epic = await this.storage.getEpic(ticketData.epicId);
184
+ if (epic) {
185
+ const epicTickets = await this.storage.getTicketsForEpic(projectId, ticketData.epicId);
186
+ const ticketInfos = epicTickets.map(t => ({
187
+ id: t.id,
188
+ title: t.title,
189
+ status: t.statusName || 'Unknown',
190
+ priority: t.priority,
191
+ }));
192
+ updateEpicTicketsSection(this.pmoPath, ticketData.epicId, epic.status, ticketInfos, projectId);
193
+ }
194
+ }
195
+ this.log(styles.success(`\n✅ Created ticket ${styles.emphasis(ticket.id)} in project ${styles.emphasis(projectName)}`));
196
+ if (template) {
197
+ this.log(styles.muted(` Template: ${template.name}`));
198
+ }
199
+ this.log(styles.muted(` Title: ${ticket.title}`));
200
+ this.log(styles.muted(` Status: ${ticket.statusName}`));
201
+ if (ticket.priority) {
202
+ this.log(styles.muted(` Priority: ${ticket.priority}`));
203
+ }
204
+ if (ticket.category) {
205
+ this.log(styles.muted(` Category: ${ticket.category}`));
206
+ }
207
+ if (ticketData.epicId) {
208
+ this.log(styles.muted(` Epic: ${ticketData.epicId}`));
209
+ }
210
+ if (ticketData.labels && ticketData.labels.length > 0) {
211
+ this.log(styles.muted(` Labels: ${ticketData.labels.join(', ')}`));
212
+ }
213
+ if (template && template.suggestedSubtasks.length > 0) {
214
+ this.log(styles.muted(` Subtasks: ${template.suggestedSubtasks.length} created`));
215
+ }
216
+ this.log(styles.muted(`\n View board: prlt board`));
217
+ this.log(styles.muted(` List tickets: prlt ticket list`));
218
+ }
219
+ async promptTicketData(flags, storage, existingTemplate, columns) {
220
+ // If no template was specified via flag, offer to select one
221
+ let template = existingTemplate;
222
+ if (!template && !flags.template) {
223
+ const templates = await storage.listTicketTemplates();
224
+ if (templates.length > 0) {
225
+ const { selectedTemplate } = await inquirer.prompt([
226
+ {
227
+ type: 'list',
228
+ name: 'selectedTemplate',
229
+ message: 'Start from a template?',
230
+ choices: [
231
+ { name: 'No template (blank ticket)', value: '' },
232
+ new inquirer.Separator('── Templates ──'),
233
+ ...templates.map(t => ({
234
+ name: `${t.name}${t.isBuiltin ? '' : ' [custom]'} - ${t.description || ''}`,
235
+ value: t.id,
236
+ })),
237
+ ],
238
+ },
239
+ ]);
240
+ if (selectedTemplate) {
241
+ template = templates.find(t => t.id === selectedTemplate) || null;
242
+ }
243
+ }
244
+ }
245
+ const answers = await inquirer.prompt([
246
+ {
247
+ type: 'input',
248
+ name: 'title',
249
+ message: 'Ticket title:',
250
+ default: flags.title || template?.titlePattern,
251
+ validate: (input) => input.length > 0 || 'Title is required',
252
+ },
253
+ {
254
+ type: 'list',
255
+ name: 'column',
256
+ message: 'Column:',
257
+ choices: columns,
258
+ default: flags.column || columns[0],
259
+ },
260
+ {
261
+ type: 'list',
262
+ name: 'priority',
263
+ message: 'Priority:',
264
+ choices: [
265
+ { name: 'None', value: undefined },
266
+ ...PRIORITIES.map(p => ({ name: PRIORITY_LABELS[p], value: p })),
267
+ ],
268
+ default: flags.priority || template?.defaultPriority,
269
+ },
270
+ {
271
+ type: 'list',
272
+ name: 'categoryChoice',
273
+ message: 'Category:',
274
+ choices: [
275
+ { name: 'Skip (none)', value: '' },
276
+ new inquirer.Separator('── Conventional Commits ──'),
277
+ { name: 'feature - New feature or capability', value: 'feature' },
278
+ { name: 'bug - Bug fix', value: 'bug' },
279
+ { name: 'refactor - Code refactoring', value: 'refactor' },
280
+ { name: 'docs - Documentation', value: 'docs' },
281
+ { name: 'test - Test additions/fixes', value: 'test' },
282
+ { name: 'chore - Maintenance tasks', value: 'chore' },
283
+ { name: 'performance - Performance improvements', value: 'performance' },
284
+ { name: 'ci - CI/CD changes', value: 'ci' },
285
+ { name: 'build - Build system changes', value: 'build' },
286
+ new inquirer.Separator('── Extended Types ──'),
287
+ { name: 'security - Security fixes', value: 'security' },
288
+ { name: 'database - Database migrations', value: 'database' },
289
+ { name: 'release - Release preparation', value: 'release' },
290
+ new inquirer.Separator('── 5Tool Founder ──'),
291
+ { name: 'ship - Shipping and deployment', value: 'ship' },
292
+ { name: 'growth - Growth and marketing', value: 'growth' },
293
+ { name: 'support - Customer experience', value: 'support' },
294
+ { name: 'strategy - Strategy and planning', value: 'strategy' },
295
+ { name: 'ops - Business operations', value: 'ops' },
296
+ new inquirer.Separator('───────────────────'),
297
+ { name: 'Custom...', value: '__custom__' },
298
+ ],
299
+ default: flags.category || template?.defaultCategory || '',
300
+ },
301
+ {
302
+ type: 'input',
303
+ name: 'customCategory',
304
+ message: 'Enter custom category:',
305
+ when: (answers) => answers.categoryChoice === '__custom__',
306
+ validate: (input) => input.length > 0 || 'Category is required when choosing custom',
307
+ },
308
+ ]);
309
+ // Resolve category from choice or custom input
310
+ const category = answers.categoryChoice === '__custom__'
311
+ ? answers.customCategory
312
+ : answers.categoryChoice || undefined;
313
+ // Prompt for structured description (use template description if available)
314
+ const description = await this.promptStructuredDescription(flags.description || template?.descriptionTemplate);
315
+ // Parse labels from flag or use template defaults
316
+ const labels = flags.labels
317
+ ? flags.labels.split(',').map(l => l.trim()).filter(l => l)
318
+ : template?.defaultLabels;
319
+ return {
320
+ title: answers.title,
321
+ statusName: answers.column,
322
+ priority: answers.priority || undefined,
323
+ category,
324
+ description: description || undefined,
325
+ id: flags.id,
326
+ epicId: flags.epic,
327
+ labels,
328
+ };
329
+ }
330
+ async promptStructuredDescription(existingDescription) {
331
+ // If description already provided via flag, use it
332
+ if (existingDescription) {
333
+ return existingDescription;
334
+ }
335
+ this.log(styles.muted('\n─── Ticket Description (for agent execution) ───'));
336
+ const descAnswers = await inquirer.prompt([
337
+ {
338
+ type: 'input',
339
+ name: 'what',
340
+ message: 'What is the concrete outcome? (one sentence):',
341
+ validate: (input) => input.length > 0 || 'Outcome is required - what does success look like?',
342
+ },
343
+ {
344
+ type: 'input',
345
+ name: 'doneWhen',
346
+ message: 'Done when (acceptance criteria):',
347
+ },
348
+ {
349
+ type: 'input',
350
+ name: 'context',
351
+ message: 'Context (files, patterns, hints - optional):',
352
+ default: '',
353
+ },
354
+ {
355
+ type: 'input',
356
+ name: 'notInScope',
357
+ message: 'Not in scope (explicit exclusions - optional):',
358
+ default: '',
359
+ },
360
+ ]);
361
+ // Build structured description
362
+ const parts = [];
363
+ parts.push(`## What\n${descAnswers.what}`);
364
+ if (descAnswers.doneWhen.trim()) {
365
+ // Ensure each line in doneWhen starts with - [ ] if it doesn't already
366
+ const criteria = descAnswers.doneWhen
367
+ .split('\n')
368
+ .map(line => line.trim())
369
+ .filter(line => line.length > 0)
370
+ .map(line => {
371
+ if (line.startsWith('- [ ]') || line.startsWith('- [x]')) {
372
+ return line;
373
+ }
374
+ if (line.startsWith('-')) {
375
+ return `- [ ]${line.slice(1)}`;
376
+ }
377
+ return `- [ ] ${line}`;
378
+ })
379
+ .join('\n');
380
+ parts.push(`## Done when\n${criteria}`);
381
+ }
382
+ if (descAnswers.context.trim()) {
383
+ parts.push(`## Context\n${descAnswers.context}`);
384
+ }
385
+ if (descAnswers.notInScope.trim()) {
386
+ parts.push(`## Not in scope\n${descAnswers.notInScope}`);
387
+ }
388
+ return parts.join('\n\n');
389
+ }
390
+ }
@@ -0,0 +1,16 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class TicketDelete 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
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ };
14
+ execute(): Promise<void>;
15
+ private executeBulk;
16
+ }