@proletariat/cli 0.2.0 → 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 +512 -253
  2. package/bin/dev.cmd +3 -0
  3. package/bin/dev.js +5 -0
  4. package/bin/run.cmd +3 -0
  5. package/bin/run.js +23 -0
  6. package/dist/commands/action/create.d.ts +21 -0
  7. package/dist/commands/action/create.js +126 -0
  8. package/dist/commands/action/delete.d.ts +17 -0
  9. package/dist/commands/action/delete.js +78 -0
  10. package/dist/commands/action/index.d.ts +15 -0
  11. package/dist/commands/action/index.js +107 -0
  12. package/dist/commands/action/list.d.ts +14 -0
  13. package/dist/commands/action/list.js +89 -0
  14. package/dist/commands/action/run.d.ts +19 -0
  15. package/dist/commands/action/run.js +179 -0
  16. package/dist/commands/action/show.d.ts +15 -0
  17. package/dist/commands/action/show.js +47 -0
  18. package/dist/commands/action/update.d.ts +22 -0
  19. package/dist/commands/action/update.js +168 -0
  20. package/dist/commands/agent/index.d.ts +13 -0
  21. package/dist/commands/agent/index.js +131 -0
  22. package/dist/commands/agent/list.d.ts +7 -0
  23. package/dist/commands/agent/list.js +126 -0
  24. package/dist/commands/agent/login.d.ts +16 -0
  25. package/dist/commands/agent/login.js +146 -0
  26. package/dist/commands/agent/rebuild.d.ts +18 -0
  27. package/dist/commands/agent/rebuild.js +133 -0
  28. package/dist/commands/agent/restart.d.ts +17 -0
  29. package/dist/commands/agent/restart.js +116 -0
  30. package/dist/commands/agent/shell.d.ts +23 -0
  31. package/dist/commands/agent/shell.js +378 -0
  32. package/dist/commands/agent/staff/add.d.ts +15 -0
  33. package/dist/commands/agent/staff/add.js +281 -0
  34. package/dist/commands/agent/staff/index.d.ts +14 -0
  35. package/dist/commands/agent/staff/index.js +90 -0
  36. package/dist/commands/agent/staff/list.d.ts +7 -0
  37. package/dist/commands/agent/staff/list.js +90 -0
  38. package/dist/commands/agent/staff/remove.d.ts +16 -0
  39. package/dist/commands/agent/staff/remove.js +137 -0
  40. package/dist/commands/agent/status.d.ts +17 -0
  41. package/dist/commands/agent/status.js +139 -0
  42. package/dist/commands/agent/temp/cleanup.d.ts +23 -0
  43. package/dist/commands/agent/temp/cleanup.js +388 -0
  44. package/dist/commands/agent/temp/index.d.ts +14 -0
  45. package/dist/commands/agent/temp/index.js +82 -0
  46. package/dist/commands/agent/temp/list.d.ts +7 -0
  47. package/dist/commands/agent/temp/list.js +108 -0
  48. package/dist/commands/agent/themes/add-names.d.ts +10 -0
  49. package/dist/commands/agent/themes/add-names.js +67 -0
  50. package/dist/commands/agent/themes/create.d.ts +13 -0
  51. package/dist/commands/agent/themes/create.js +66 -0
  52. package/dist/commands/agent/themes/index.d.ts +9 -0
  53. package/dist/commands/agent/themes/index.js +194 -0
  54. package/dist/commands/agent/themes/list.d.ts +6 -0
  55. package/dist/commands/agent/themes/list.js +41 -0
  56. package/dist/commands/agent/themes/set.d.ts +12 -0
  57. package/dist/commands/agent/themes/set.js +77 -0
  58. package/dist/commands/agent/visit.d.ts +16 -0
  59. package/dist/commands/agent/visit.js +88 -0
  60. package/dist/commands/autocomplete/setup.d.ts +14 -0
  61. package/dist/commands/autocomplete/setup.js +154 -0
  62. package/dist/commands/board/index.d.ts +17 -0
  63. package/dist/commands/board/index.js +255 -0
  64. package/dist/commands/board/watch.d.ts +13 -0
  65. package/dist/commands/board/watch.js +52 -0
  66. package/dist/commands/branch/create.d.ts +50 -0
  67. package/dist/commands/branch/create.js +624 -0
  68. package/dist/commands/branch/index.d.ts +13 -0
  69. package/dist/commands/branch/index.js +50 -0
  70. package/dist/commands/branch/list.d.ts +17 -0
  71. package/dist/commands/branch/list.js +120 -0
  72. package/dist/commands/branch/validate.d.ts +15 -0
  73. package/dist/commands/branch/validate.js +73 -0
  74. package/dist/commands/commit.d.ts +71 -0
  75. package/dist/commands/commit.js +499 -0
  76. package/dist/commands/docker/clean.d.ts +13 -0
  77. package/dist/commands/docker/clean.js +224 -0
  78. package/dist/commands/docker/index.d.ts +19 -0
  79. package/dist/commands/docker/index.js +274 -0
  80. package/dist/commands/docker/list.d.ts +16 -0
  81. package/dist/commands/docker/list.js +200 -0
  82. package/dist/commands/docker/logs.d.ts +14 -0
  83. package/dist/commands/docker/logs.js +118 -0
  84. package/dist/commands/docker/prune.d.ts +14 -0
  85. package/dist/commands/docker/prune.js +211 -0
  86. package/dist/commands/docker/restart.d.ts +14 -0
  87. package/dist/commands/docker/restart.js +129 -0
  88. package/dist/commands/docker/shell.d.ts +14 -0
  89. package/dist/commands/docker/shell.js +103 -0
  90. package/dist/commands/docker/start.d.ts +12 -0
  91. package/dist/commands/docker/start.js +92 -0
  92. package/dist/commands/docker/status.d.ts +7 -0
  93. package/dist/commands/docker/status.js +40 -0
  94. package/dist/commands/docker/stop.d.ts +14 -0
  95. package/dist/commands/docker/stop.js +134 -0
  96. package/dist/commands/docker/sync.d.ts +15 -0
  97. package/dist/commands/docker/sync.js +112 -0
  98. package/dist/commands/epic/activate.d.ts +13 -0
  99. package/dist/commands/epic/activate.js +118 -0
  100. package/dist/commands/epic/archive.d.ts +14 -0
  101. package/dist/commands/epic/archive.js +132 -0
  102. package/dist/commands/epic/create.d.ts +15 -0
  103. package/dist/commands/epic/create.js +137 -0
  104. package/dist/commands/epic/index.d.ts +13 -0
  105. package/dist/commands/epic/index.js +88 -0
  106. package/dist/commands/epic/link/block.d.ts +14 -0
  107. package/dist/commands/epic/link/block.js +79 -0
  108. package/dist/commands/epic/link/duplicates.d.ts +14 -0
  109. package/dist/commands/epic/link/duplicates.js +66 -0
  110. package/dist/commands/epic/link/index.d.ts +19 -0
  111. package/dist/commands/epic/link/index.js +242 -0
  112. package/dist/commands/epic/link/relates.d.ts +14 -0
  113. package/dist/commands/epic/link/relates.js +66 -0
  114. package/dist/commands/epic/link/remove.d.ts +16 -0
  115. package/dist/commands/epic/link/remove.js +89 -0
  116. package/dist/commands/epic/list.d.ts +11 -0
  117. package/dist/commands/epic/list.js +87 -0
  118. package/dist/commands/epic/move.d.ts +15 -0
  119. package/dist/commands/epic/move.js +184 -0
  120. package/dist/commands/epic/progress.d.ts +16 -0
  121. package/dist/commands/epic/progress.js +166 -0
  122. package/dist/commands/epic/project.d.ts +15 -0
  123. package/dist/commands/epic/project.js +219 -0
  124. package/dist/commands/epic/reorder.d.ts +21 -0
  125. package/dist/commands/epic/reorder.js +160 -0
  126. package/dist/commands/epic/spec.d.ts +15 -0
  127. package/dist/commands/epic/spec.js +191 -0
  128. package/dist/commands/epic/ticket.d.ts +18 -0
  129. package/dist/commands/epic/ticket.js +291 -0
  130. package/dist/commands/epic/view.d.ts +13 -0
  131. package/dist/commands/epic/view.js +117 -0
  132. package/dist/commands/execution/index.d.ts +13 -0
  133. package/dist/commands/execution/index.js +70 -0
  134. package/dist/commands/execution/list.d.ts +15 -0
  135. package/dist/commands/execution/list.js +144 -0
  136. package/dist/commands/execution/logs.d.ts +18 -0
  137. package/dist/commands/execution/logs.js +161 -0
  138. package/dist/commands/execution/stop.d.ts +22 -0
  139. package/dist/commands/execution/stop.js +248 -0
  140. package/dist/commands/gh/index.d.ts +9 -0
  141. package/dist/commands/gh/index.js +53 -0
  142. package/dist/commands/gh/login.d.ts +6 -0
  143. package/dist/commands/gh/login.js +57 -0
  144. package/dist/commands/gh/status.d.ts +6 -0
  145. package/dist/commands/gh/status.js +48 -0
  146. package/dist/commands/gh/token.d.ts +6 -0
  147. package/dist/commands/gh/token.js +59 -0
  148. package/dist/commands/init.d.ts +26 -0
  149. package/dist/commands/init.js +200 -0
  150. package/dist/commands/phase/create.d.ts +22 -0
  151. package/dist/commands/phase/create.js +123 -0
  152. package/dist/commands/phase/delete.d.ts +17 -0
  153. package/dist/commands/phase/delete.js +73 -0
  154. package/dist/commands/phase/list.d.ts +12 -0
  155. package/dist/commands/phase/list.js +76 -0
  156. package/dist/commands/phase/move.d.ts +17 -0
  157. package/dist/commands/phase/move.js +115 -0
  158. package/dist/commands/phase/template/apply.d.ts +17 -0
  159. package/dist/commands/phase/template/apply.js +106 -0
  160. package/dist/commands/phase/template/create.d.ts +16 -0
  161. package/dist/commands/phase/template/create.js +58 -0
  162. package/dist/commands/phase/template/delete.d.ts +17 -0
  163. package/dist/commands/phase/template/delete.js +98 -0
  164. package/dist/commands/phase/template/index.d.ts +15 -0
  165. package/dist/commands/phase/template/index.js +128 -0
  166. package/dist/commands/phase/template/list.d.ts +16 -0
  167. package/dist/commands/phase/template/list.js +95 -0
  168. package/dist/commands/phase/template/update.d.ts +17 -0
  169. package/dist/commands/phase/template/update.js +89 -0
  170. package/dist/commands/phase/update.d.ts +23 -0
  171. package/dist/commands/phase/update.js +174 -0
  172. package/dist/commands/pmo/init.d.ts +25 -0
  173. package/dist/commands/pmo/init.js +341 -0
  174. package/dist/commands/pr/create.d.ts +17 -0
  175. package/dist/commands/pr/create.js +242 -0
  176. package/dist/commands/pr/index.d.ts +9 -0
  177. package/dist/commands/pr/index.js +68 -0
  178. package/dist/commands/pr/link.d.ts +14 -0
  179. package/dist/commands/pr/link.js +212 -0
  180. package/dist/commands/pr/status.d.ts +12 -0
  181. package/dist/commands/pr/status.js +161 -0
  182. package/dist/commands/project/archive.d.ts +17 -0
  183. package/dist/commands/project/archive.js +83 -0
  184. package/dist/commands/project/create.d.ts +22 -0
  185. package/dist/commands/project/create.js +143 -0
  186. package/dist/commands/project/delete.d.ts +17 -0
  187. package/dist/commands/project/delete.js +128 -0
  188. package/dist/commands/project/index.d.ts +13 -0
  189. package/dist/commands/project/index.js +64 -0
  190. package/dist/commands/project/list.d.ts +14 -0
  191. package/dist/commands/project/list.js +96 -0
  192. package/dist/commands/project/spec.d.ts +18 -0
  193. package/dist/commands/project/spec.js +216 -0
  194. package/dist/commands/project/unarchive.d.ts +15 -0
  195. package/dist/commands/project/unarchive.js +35 -0
  196. package/dist/commands/project/view.d.ts +16 -0
  197. package/dist/commands/project/view.js +94 -0
  198. package/dist/commands/repo/add.d.ts +21 -0
  199. package/dist/commands/repo/add.js +118 -0
  200. package/dist/commands/repo/index.d.ts +13 -0
  201. package/dist/commands/repo/index.js +114 -0
  202. package/dist/commands/repo/list.d.ts +13 -0
  203. package/dist/commands/repo/list.js +96 -0
  204. package/dist/commands/repo/remove.d.ts +23 -0
  205. package/dist/commands/repo/remove.js +217 -0
  206. package/dist/commands/repo/view.d.ts +15 -0
  207. package/dist/commands/repo/view.js +99 -0
  208. package/dist/commands/session/attach.d.ts +40 -0
  209. package/dist/commands/session/attach.js +307 -0
  210. package/dist/commands/session/index.d.ts +13 -0
  211. package/dist/commands/session/index.js +64 -0
  212. package/dist/commands/session/list.d.ts +21 -0
  213. package/dist/commands/session/list.js +181 -0
  214. package/dist/commands/spec/create.d.ts +19 -0
  215. package/dist/commands/spec/create.js +130 -0
  216. package/dist/commands/spec/index.d.ts +13 -0
  217. package/dist/commands/spec/index.js +68 -0
  218. package/dist/commands/spec/link/depends.d.ts +14 -0
  219. package/dist/commands/spec/link/depends.js +64 -0
  220. package/dist/commands/spec/link/duplicates.d.ts +14 -0
  221. package/dist/commands/spec/link/duplicates.js +63 -0
  222. package/dist/commands/spec/link/index.d.ts +19 -0
  223. package/dist/commands/spec/link/index.js +200 -0
  224. package/dist/commands/spec/link/relates.d.ts +14 -0
  225. package/dist/commands/spec/link/relates.js +63 -0
  226. package/dist/commands/spec/link/remove.d.ts +16 -0
  227. package/dist/commands/spec/link/remove.js +94 -0
  228. package/dist/commands/spec/list.d.ts +12 -0
  229. package/dist/commands/spec/list.js +75 -0
  230. package/dist/commands/spec/plan.d.ts +15 -0
  231. package/dist/commands/spec/plan.js +108 -0
  232. package/dist/commands/spec/ticket.d.ts +18 -0
  233. package/dist/commands/spec/ticket.js +160 -0
  234. package/dist/commands/spec/view.d.ts +15 -0
  235. package/dist/commands/spec/view.js +163 -0
  236. package/dist/commands/status/create.d.ts +21 -0
  237. package/dist/commands/status/create.js +140 -0
  238. package/dist/commands/status/delete.d.ts +13 -0
  239. package/dist/commands/status/delete.js +77 -0
  240. package/dist/commands/status/index.d.ts +14 -0
  241. package/dist/commands/status/index.js +91 -0
  242. package/dist/commands/status/list.d.ts +12 -0
  243. package/dist/commands/status/list.js +93 -0
  244. package/dist/commands/status/move.d.ts +14 -0
  245. package/dist/commands/status/move.js +120 -0
  246. package/dist/commands/status/update.d.ts +20 -0
  247. package/dist/commands/status/update.js +180 -0
  248. package/dist/commands/template/delete.d.ts +15 -0
  249. package/dist/commands/template/delete.js +142 -0
  250. package/dist/commands/template/index.d.ts +10 -0
  251. package/dist/commands/template/index.js +64 -0
  252. package/dist/commands/template/list.d.ts +18 -0
  253. package/dist/commands/template/list.js +157 -0
  254. package/dist/commands/template/phase/apply.d.ts +14 -0
  255. package/dist/commands/template/phase/apply.js +41 -0
  256. package/dist/commands/template/phase/create.d.ts +12 -0
  257. package/dist/commands/template/phase/create.js +29 -0
  258. package/dist/commands/template/phase/delete.d.ts +13 -0
  259. package/dist/commands/template/phase/delete.js +34 -0
  260. package/dist/commands/template/phase/index.d.ts +10 -0
  261. package/dist/commands/template/phase/index.js +62 -0
  262. package/dist/commands/template/phase/list.d.ts +11 -0
  263. package/dist/commands/template/phase/list.js +34 -0
  264. package/dist/commands/template/phase/update.d.ts +13 -0
  265. package/dist/commands/template/phase/update.js +35 -0
  266. package/dist/commands/template/ticket/apply.d.ts +17 -0
  267. package/dist/commands/template/ticket/apply.js +58 -0
  268. package/dist/commands/template/ticket/delete.d.ts +13 -0
  269. package/dist/commands/template/ticket/delete.js +34 -0
  270. package/dist/commands/template/ticket/index.d.ts +10 -0
  271. package/dist/commands/template/ticket/index.js +62 -0
  272. package/dist/commands/template/ticket/list.d.ts +11 -0
  273. package/dist/commands/template/ticket/list.js +34 -0
  274. package/dist/commands/template/ticket/save.d.ts +13 -0
  275. package/dist/commands/template/ticket/save.js +35 -0
  276. package/dist/commands/ticket/bulk.d.ts +13 -0
  277. package/dist/commands/ticket/bulk.js +145 -0
  278. package/dist/commands/ticket/complete.d.ts +16 -0
  279. package/dist/commands/ticket/complete.js +170 -0
  280. package/dist/commands/ticket/create.d.ts +22 -0
  281. package/dist/commands/ticket/create.js +390 -0
  282. package/dist/commands/ticket/delete.d.ts +16 -0
  283. package/dist/commands/ticket/delete.js +178 -0
  284. package/dist/commands/ticket/edit.d.ts +27 -0
  285. package/dist/commands/ticket/edit.js +322 -0
  286. package/dist/commands/ticket/epic.d.ts +20 -0
  287. package/dist/commands/ticket/epic.js +333 -0
  288. package/dist/commands/ticket/index.d.ts +13 -0
  289. package/dist/commands/ticket/index.js +103 -0
  290. package/dist/commands/ticket/link/block.d.ts +14 -0
  291. package/dist/commands/ticket/link/block.js +94 -0
  292. package/dist/commands/ticket/link/duplicates.d.ts +14 -0
  293. package/dist/commands/ticket/link/duplicates.js +93 -0
  294. package/dist/commands/ticket/link/index.d.ts +19 -0
  295. package/dist/commands/ticket/link/index.js +239 -0
  296. package/dist/commands/ticket/link/relates.d.ts +14 -0
  297. package/dist/commands/ticket/link/relates.js +93 -0
  298. package/dist/commands/ticket/link/remove.d.ts +16 -0
  299. package/dist/commands/ticket/link/remove.js +128 -0
  300. package/dist/commands/ticket/list.d.ts +24 -0
  301. package/dist/commands/ticket/list.js +431 -0
  302. package/dist/commands/ticket/move.d.ts +18 -0
  303. package/dist/commands/ticket/move.js +212 -0
  304. package/dist/commands/ticket/project.d.ts +18 -0
  305. package/dist/commands/ticket/project.js +254 -0
  306. package/dist/commands/ticket/reassign.d.ts +19 -0
  307. package/dist/commands/ticket/reassign.js +279 -0
  308. package/dist/commands/ticket/spec.d.ts +18 -0
  309. package/dist/commands/ticket/spec.js +259 -0
  310. package/dist/commands/ticket/status.d.ts +13 -0
  311. package/dist/commands/ticket/status.js +87 -0
  312. package/dist/commands/ticket/template/apply.d.ts +25 -0
  313. package/dist/commands/ticket/template/apply.js +249 -0
  314. package/dist/commands/ticket/template/create.d.ts +19 -0
  315. package/dist/commands/ticket/template/create.js +210 -0
  316. package/dist/commands/ticket/template/delete.d.ts +17 -0
  317. package/dist/commands/ticket/template/delete.js +92 -0
  318. package/dist/commands/ticket/template/index.d.ts +15 -0
  319. package/dist/commands/ticket/template/index.js +118 -0
  320. package/dist/commands/ticket/template/list.d.ts +16 -0
  321. package/dist/commands/ticket/template/list.js +110 -0
  322. package/dist/commands/ticket/template/save.d.ts +14 -0
  323. package/dist/commands/ticket/template/save.js +110 -0
  324. package/dist/commands/ticket/update.d.ts +18 -0
  325. package/dist/commands/ticket/update.js +325 -0
  326. package/dist/commands/ticket/view.d.ts +13 -0
  327. package/dist/commands/ticket/view.js +80 -0
  328. package/dist/commands/whoami.d.ts +9 -0
  329. package/dist/commands/whoami.js +103 -0
  330. package/dist/commands/work/complete.d.ts +13 -0
  331. package/dist/commands/work/complete.js +121 -0
  332. package/dist/commands/work/index.d.ts +13 -0
  333. package/dist/commands/work/index.js +70 -0
  334. package/dist/commands/work/ready.d.ts +24 -0
  335. package/dist/commands/work/ready.js +290 -0
  336. package/dist/commands/work/revise.d.ts +19 -0
  337. package/dist/commands/work/revise.js +377 -0
  338. package/dist/commands/work/spawn-all.d.ts +17 -0
  339. package/dist/commands/work/spawn-all.js +58 -0
  340. package/dist/commands/work/spawn.d.ts +29 -0
  341. package/dist/commands/work/spawn.js +728 -0
  342. package/dist/commands/work/start.d.ts +39 -0
  343. package/dist/commands/work/start.js +1393 -0
  344. package/dist/commands/work/watch.d.ts +31 -0
  345. package/dist/commands/work/watch.js +359 -0
  346. package/dist/commands/workflow/create.d.ts +18 -0
  347. package/dist/commands/workflow/create.js +119 -0
  348. package/dist/commands/workflow/delete.d.ts +17 -0
  349. package/dist/commands/workflow/delete.js +119 -0
  350. package/dist/commands/workflow/index.d.ts +15 -0
  351. package/dist/commands/workflow/index.js +75 -0
  352. package/dist/commands/workflow/list.d.ts +15 -0
  353. package/dist/commands/workflow/list.js +75 -0
  354. package/dist/commands/workflow/switch.d.ts +13 -0
  355. package/dist/commands/workflow/switch.js +117 -0
  356. package/dist/commands/workflow/view.d.ts +16 -0
  357. package/dist/commands/workflow/view.js +114 -0
  358. package/dist/commands/workspace/add.d.ts +12 -0
  359. package/dist/commands/workspace/add.js +74 -0
  360. package/dist/commands/workspace/list.d.ts +9 -0
  361. package/dist/commands/workspace/list.js +153 -0
  362. package/dist/commands/workspace/remove.d.ts +13 -0
  363. package/dist/commands/workspace/remove.js +98 -0
  364. package/dist/commands/workspace/use.d.ts +12 -0
  365. package/dist/commands/workspace/use.js +111 -0
  366. package/dist/hooks/init.d.ts +11 -0
  367. package/dist/hooks/init.js +57 -0
  368. package/dist/index.d.ts +1 -0
  369. package/dist/index.js +1 -0
  370. package/dist/lib/agents/commands.d.ts +189 -0
  371. package/dist/lib/agents/commands.js +893 -0
  372. package/dist/lib/agents/index.d.ts +54 -0
  373. package/dist/lib/agents/index.js +382 -0
  374. package/dist/lib/branch/index.d.ts +120 -0
  375. package/dist/lib/branch/index.js +334 -0
  376. package/dist/lib/colors.d.ts +94 -0
  377. package/dist/lib/colors.js +68 -0
  378. package/dist/lib/commands/docker-command.d.ts +21 -0
  379. package/dist/lib/commands/docker-command.js +27 -0
  380. package/dist/lib/database/index.d.ts +176 -0
  381. package/dist/lib/database/index.js +581 -0
  382. package/dist/lib/docker/resolve.d.ts +38 -0
  383. package/dist/lib/docker/resolve.js +175 -0
  384. package/dist/lib/execution/config.d.ts +150 -0
  385. package/dist/lib/execution/config.js +541 -0
  386. package/dist/lib/execution/devcontainer.d.ts +85 -0
  387. package/dist/lib/execution/devcontainer.js +594 -0
  388. package/dist/lib/execution/index.d.ts +10 -0
  389. package/dist/lib/execution/index.js +10 -0
  390. package/dist/lib/execution/runners.d.ts +53 -0
  391. package/dist/lib/execution/runners.js +1182 -0
  392. package/dist/lib/execution/spawner.d.ts +85 -0
  393. package/dist/lib/execution/spawner.js +548 -0
  394. package/dist/lib/execution/storage.d.ts +159 -0
  395. package/dist/lib/execution/storage.js +425 -0
  396. package/dist/lib/execution/types.d.ts +145 -0
  397. package/dist/lib/execution/types.js +157 -0
  398. package/dist/lib/init/index.d.ts +75 -0
  399. package/dist/lib/init/index.js +355 -0
  400. package/dist/lib/machine-config.d.ts +170 -0
  401. package/dist/lib/machine-config.js +386 -0
  402. package/dist/lib/pmo/base-command.d.ts +195 -0
  403. package/dist/lib/pmo/base-command.js +319 -0
  404. package/dist/lib/pmo/create-spec-folders.d.ts +43 -0
  405. package/dist/lib/pmo/create-spec-folders.js +64 -0
  406. package/dist/lib/pmo/epic-files.d.ts +56 -0
  407. package/dist/lib/pmo/epic-files.js +195 -0
  408. package/dist/lib/pmo/find-pmo.d.ts +14 -0
  409. package/dist/lib/pmo/find-pmo.js +172 -0
  410. package/dist/lib/pmo/index.d.ts +109 -0
  411. package/dist/lib/pmo/index.js +501 -0
  412. package/dist/lib/pmo/markdown.d.ts +31 -0
  413. package/dist/lib/pmo/markdown.js +245 -0
  414. package/dist/lib/pmo/pmo-context.d.ts +27 -0
  415. package/dist/lib/pmo/pmo-context.js +44 -0
  416. package/dist/lib/pmo/schema.d.ts +82 -0
  417. package/dist/lib/pmo/schema.js +531 -0
  418. package/dist/lib/pmo/spec-parser.d.ts +25 -0
  419. package/dist/lib/pmo/spec-parser.js +205 -0
  420. package/dist/lib/pmo/spec-types.d.ts +43 -0
  421. package/dist/lib/pmo/spec-types.js +7 -0
  422. package/dist/lib/pmo/storage/actions.d.ts +34 -0
  423. package/dist/lib/pmo/storage/actions.js +177 -0
  424. package/dist/lib/pmo/storage/base.d.ts +47 -0
  425. package/dist/lib/pmo/storage/base.js +858 -0
  426. package/dist/lib/pmo/storage/dependencies.d.ts +61 -0
  427. package/dist/lib/pmo/storage/dependencies.js +267 -0
  428. package/dist/lib/pmo/storage/epics.d.ts +46 -0
  429. package/dist/lib/pmo/storage/epics.js +243 -0
  430. package/dist/lib/pmo/storage/helpers.d.ts +33 -0
  431. package/dist/lib/pmo/storage/helpers.js +148 -0
  432. package/dist/lib/pmo/storage/index.d.ts +186 -0
  433. package/dist/lib/pmo/storage/index.js +689 -0
  434. package/dist/lib/pmo/storage/phases.d.ts +65 -0
  435. package/dist/lib/pmo/storage/phases.js +392 -0
  436. package/dist/lib/pmo/storage/projects.d.ts +79 -0
  437. package/dist/lib/pmo/storage/projects.js +303 -0
  438. package/dist/lib/pmo/storage/specs.d.ts +77 -0
  439. package/dist/lib/pmo/storage/specs.js +389 -0
  440. package/dist/lib/pmo/storage/statuses.d.ts +63 -0
  441. package/dist/lib/pmo/storage/statuses.js +404 -0
  442. package/dist/lib/pmo/storage/subtasks.d.ts +37 -0
  443. package/dist/lib/pmo/storage/subtasks.js +184 -0
  444. package/dist/lib/pmo/storage/templates.d.ts +40 -0
  445. package/dist/lib/pmo/storage/templates.js +210 -0
  446. package/dist/lib/pmo/storage/tickets.d.ts +57 -0
  447. package/dist/lib/pmo/storage/tickets.js +453 -0
  448. package/dist/lib/pmo/storage/types.d.ts +200 -0
  449. package/dist/lib/pmo/storage/types.js +5 -0
  450. package/dist/lib/pmo/storage/views.d.ts +44 -0
  451. package/dist/lib/pmo/storage/views.js +355 -0
  452. package/dist/lib/pmo/storage-sqlite.d.ts +7 -0
  453. package/dist/lib/pmo/storage-sqlite.js +7 -0
  454. package/dist/lib/pmo/sync-manager.d.ts +92 -0
  455. package/dist/lib/pmo/sync-manager.js +229 -0
  456. package/dist/lib/pmo/types.d.ts +710 -0
  457. package/dist/lib/pmo/types.js +108 -0
  458. package/dist/lib/pmo/utils.d.ts +122 -0
  459. package/dist/lib/pmo/utils.js +174 -0
  460. package/dist/lib/pmo/watcher.d.ts +43 -0
  461. package/dist/lib/pmo/watcher.js +208 -0
  462. package/dist/lib/pr/index.d.ts +150 -0
  463. package/dist/lib/pr/index.js +483 -0
  464. package/dist/lib/prompt-json.d.ts +231 -0
  465. package/dist/lib/prompt-json.js +213 -0
  466. package/dist/lib/repos/index.d.ts +81 -0
  467. package/dist/lib/repos/index.js +679 -0
  468. package/dist/lib/styles.d.ts +98 -0
  469. package/dist/lib/styles.js +195 -0
  470. package/dist/lib/themes.d.ts +128 -0
  471. package/dist/lib/themes.js +301 -0
  472. package/dist/lib/ui/BoardUI.d.ts +21 -0
  473. package/dist/lib/ui/BoardUI.js +85 -0
  474. package/dist/lib/ui/ClaimTicketUI.d.ts +17 -0
  475. package/dist/lib/ui/ClaimTicketUI.js +64 -0
  476. package/dist/lib/ui/CreateTicketUI.d.ts +13 -0
  477. package/dist/lib/ui/CreateTicketUI.js +101 -0
  478. package/dist/lib/workspace.d.ts +66 -0
  479. package/dist/lib/workspace.js +204 -0
  480. package/oclif.manifest.json +10593 -0
  481. package/package.json +103 -56
  482. package/LICENSE +0 -21
  483. package/dist/bin/prlt.d.ts +0 -11
  484. package/dist/bin/prlt.d.ts.map +0 -1
  485. package/dist/bin/prlt.js +0 -144
  486. package/dist/bin/prlt.js.map +0 -1
  487. package/dist/lib/config/index.d.ts +0 -14
  488. package/dist/lib/config/index.d.ts.map +0 -1
  489. package/dist/lib/config/index.js +0 -142
  490. package/dist/lib/config/index.js.map +0 -1
  491. package/dist/lib/config/upgrade.d.ts +0 -2
  492. package/dist/lib/config/upgrade.d.ts.map +0 -1
  493. package/dist/lib/config/upgrade.js +0 -248
  494. package/dist/lib/config/upgrade.js.map +0 -1
  495. package/dist/lib/themes/index.d.ts +0 -8
  496. package/dist/lib/themes/index.d.ts.map +0 -1
  497. package/dist/lib/themes/index.js +0 -80
  498. package/dist/lib/themes/index.js.map +0 -1
  499. package/dist/lib/utils/helpers.d.ts +0 -4
  500. package/dist/lib/utils/helpers.d.ts.map +0 -1
  501. package/dist/lib/utils/helpers.js +0 -39
  502. package/dist/lib/utils/helpers.js.map +0 -1
  503. package/dist/lib/utils/logger.d.ts +0 -4
  504. package/dist/lib/utils/logger.d.ts.map +0 -1
  505. package/dist/lib/utils/logger.js +0 -28
  506. package/dist/lib/utils/logger.js.map +0 -1
  507. package/dist/lib/workspace/index.d.ts +0 -13
  508. package/dist/lib/workspace/index.d.ts.map +0 -1
  509. package/dist/lib/workspace/index.js +0 -116
  510. package/dist/lib/workspace/index.js.map +0 -1
  511. package/dist/lib/worktree/index.d.ts +0 -7
  512. package/dist/lib/worktree/index.d.ts.map +0 -1
  513. package/dist/lib/worktree/index.js +0 -362
  514. package/dist/lib/worktree/index.js.map +0 -1
  515. package/dist/lib/worktree/migrate.d.ts +0 -2
  516. package/dist/lib/worktree/migrate.d.ts.map +0 -1
  517. package/dist/lib/worktree/migrate.js +0 -214
  518. package/dist/lib/worktree/migrate.js.map +0 -1
  519. package/dist/lib/worktree/repair.d.ts +0 -3
  520. package/dist/lib/worktree/repair.d.ts.map +0 -1
  521. package/dist/lib/worktree/repair.js +0 -320
  522. package/dist/lib/worktree/repair.js.map +0 -1
  523. package/dist/types/index.d.ts +0 -57
  524. package/dist/types/index.d.ts.map +0 -1
  525. package/dist/types/index.js +0 -3
  526. package/dist/types/index.js.map +0 -1
@@ -0,0 +1,77 @@
1
+ import { Flags, Args } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { PMOCommand } from '../../lib/pmo/index.js';
4
+ import { styles } from '../../lib/styles.js';
5
+ import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
6
+ export default class StatusDelete extends PMOCommand {
7
+ static description = 'Delete a workflow status';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %> my-project-blocked',
10
+ '<%= config.bin %> <%= command.id %> my-project-review --force',
11
+ ];
12
+ static args = {
13
+ id: Args.string({
14
+ description: 'Status ID',
15
+ required: true,
16
+ }),
17
+ };
18
+ static flags = {
19
+ json: Flags.boolean({
20
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
21
+ default: false,
22
+ }),
23
+ force: Flags.boolean({
24
+ char: 'f',
25
+ description: 'Skip confirmation prompt',
26
+ default: false,
27
+ }),
28
+ };
29
+ async execute() {
30
+ const { args, flags } = await this.parse(StatusDelete);
31
+ // Check if JSON output mode is active
32
+ const jsonMode = shouldOutputJson(flags);
33
+ // Helper to handle errors in JSON mode
34
+ const handleError = (code, message) => {
35
+ if (jsonMode) {
36
+ outputErrorAsJson(code, message, createMetadata('status delete', flags));
37
+ this.exit(1);
38
+ }
39
+ this.error(message);
40
+ };
41
+ // Get existing status
42
+ const existing = await this.storage.getStatus(args.id);
43
+ if (!existing) {
44
+ return handleError('STATUS_NOT_FOUND', `Status not found: ${args.id}`);
45
+ }
46
+ // Confirm deletion
47
+ if (!flags.force) {
48
+ // In JSON mode, output confirmation prompt
49
+ if (jsonMode) {
50
+ outputPromptAsJson(buildPromptConfig('confirm', 'confirm', `Delete status "${existing.name}" (${existing.category})?`), createMetadata('status delete', flags));
51
+ return;
52
+ }
53
+ const { confirm } = await inquirer.prompt([
54
+ {
55
+ type: 'confirm',
56
+ name: 'confirm',
57
+ message: `Delete status "${existing.name}" (${existing.category})?`,
58
+ default: false,
59
+ },
60
+ ]);
61
+ if (!confirm) {
62
+ this.log(styles.muted('Cancelled'));
63
+ return;
64
+ }
65
+ }
66
+ try {
67
+ await this.storage.deleteStatus(args.id);
68
+ this.log(styles.success(`Deleted status "${existing.name}"`));
69
+ }
70
+ catch (error) {
71
+ if (error instanceof Error && error.message.includes('ticket(s) are using it')) {
72
+ this.error(error.message + '\nMove tickets to another status before deleting.');
73
+ }
74
+ throw error;
75
+ }
76
+ }
77
+ }
@@ -0,0 +1,14 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class Status extends PMOCommand {
3
+ static description: string;
4
+ static aliases: string[];
5
+ static examples: string[];
6
+ static flags: {
7
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ };
10
+ protected getPMOOptions(): {
11
+ promptIfMultiple: boolean;
12
+ };
13
+ execute(): Promise<void>;
14
+ }
@@ -0,0 +1,91 @@
1
+ import { Flags } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
4
+ import { shouldOutputJson, } from '../../lib/prompt-json.js';
5
+ export default class Status extends PMOCommand {
6
+ static description = 'Interactive menu for workflow status operations';
7
+ static aliases = ['statuses'];
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %>',
10
+ ];
11
+ static flags = {
12
+ ...pmoBaseFlags,
13
+ json: Flags.boolean({
14
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
15
+ default: false,
16
+ }),
17
+ };
18
+ getPMOOptions() {
19
+ return { promptIfMultiple: false };
20
+ }
21
+ async execute() {
22
+ const { flags } = await this.parse(Status);
23
+ // Check if JSON output mode is active
24
+ const jsonMode = shouldOutputJson(flags);
25
+ // Define choices once, use for both JSON and interactive modes
26
+ // Each choice includes the full command for AI agents to execute
27
+ const menuChoices = [
28
+ { id: 'list', name: 'List all statuses', command: 'prlt status list --format json' },
29
+ { id: 'create', name: 'Create new status', command: 'prlt status create --json' },
30
+ { id: 'update', name: 'Update status', command: 'prlt status update --json' },
31
+ { id: 'move', name: 'Move status (change order)', command: 'prlt status move --json' },
32
+ { id: 'delete', name: 'Delete status', command: 'prlt status delete --json' },
33
+ { id: 'cancel', name: 'Cancel', command: '' },
34
+ ];
35
+ const message = 'Workflow Statuses - What would you like to do?';
36
+ const action = await this.selectFromList({
37
+ message: '📊 ' + message,
38
+ items: menuChoices,
39
+ getName: (c) => c.name,
40
+ getValue: (c) => c.id,
41
+ getCommand: (c) => c.command,
42
+ jsonMode: jsonMode ? { flags, commandName: 'status' } : null,
43
+ });
44
+ if (action === 'cancel' || !action) {
45
+ return;
46
+ }
47
+ // Run the selected subcommand
48
+ switch (action) {
49
+ case 'list':
50
+ await this.config.runCommand('status:list', []);
51
+ break;
52
+ case 'create':
53
+ await this.config.runCommand('status:create', ['--interactive']);
54
+ break;
55
+ case 'update': {
56
+ // First list statuses, then prompt for selection
57
+ await this.config.runCommand('status:list', []);
58
+ const { statusId } = await inquirer.prompt([{
59
+ type: 'input',
60
+ name: 'statusId',
61
+ message: 'Status ID to update:',
62
+ validate: (input) => input.length > 0 || 'Status ID is required',
63
+ }]);
64
+ await this.config.runCommand('status:update', [statusId]);
65
+ break;
66
+ }
67
+ case 'move': {
68
+ await this.config.runCommand('status:list', []);
69
+ const { statusId } = await inquirer.prompt([{
70
+ type: 'input',
71
+ name: 'statusId',
72
+ message: 'Status ID to move:',
73
+ validate: (input) => input.length > 0 || 'Status ID is required',
74
+ }]);
75
+ await this.config.runCommand('status:move', [statusId]);
76
+ break;
77
+ }
78
+ case 'delete': {
79
+ await this.config.runCommand('status:list', []);
80
+ const { statusId } = await inquirer.prompt([{
81
+ type: 'input',
82
+ name: 'statusId',
83
+ message: 'Status ID to delete:',
84
+ validate: (input) => input.length > 0 || 'Status ID is required',
85
+ }]);
86
+ await this.config.runCommand('status:delete', [statusId]);
87
+ break;
88
+ }
89
+ }
90
+ }
91
+ }
@@ -0,0 +1,12 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class StatusList extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ category: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ };
10
+ execute(): Promise<void>;
11
+ private groupByCategory;
12
+ }
@@ -0,0 +1,93 @@
1
+ import { Flags } from '@oclif/core';
2
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
3
+ import { styles } from '../../lib/styles.js';
4
+ import { STATE_CATEGORY_ORDER } from '../../lib/pmo/types.js';
5
+ export default class StatusList extends PMOCommand {
6
+ static description = 'List all workflow statuses for a project';
7
+ static examples = [
8
+ '<%= config.bin %> <%= command.id %>',
9
+ '<%= config.bin %> <%= command.id %> --project my-project',
10
+ '<%= config.bin %> <%= command.id %> --category started',
11
+ ];
12
+ static flags = {
13
+ ...pmoBaseFlags,
14
+ category: Flags.string({
15
+ char: 'c',
16
+ description: 'Filter by category',
17
+ options: ['backlog', 'unstarted', 'started', 'completed', 'canceled'],
18
+ }),
19
+ json: Flags.boolean({
20
+ description: 'Output as JSON',
21
+ default: false,
22
+ }),
23
+ };
24
+ async execute() {
25
+ const { flags } = await this.parse(StatusList);
26
+ // This command requires project context
27
+ const projectId = await this.requireProject();
28
+ // Get the project's workflow ID
29
+ const project = await this.storage.getProject(projectId);
30
+ if (!project?.workflowId) {
31
+ this.error(`Project "${projectId}" has no workflow assigned.`);
32
+ }
33
+ const statuses = await this.storage.listStatuses(project.workflowId);
34
+ if (flags.json) {
35
+ this.log(JSON.stringify(statuses, null, 2));
36
+ return;
37
+ }
38
+ if (statuses.length === 0) {
39
+ this.log(styles.muted('\nNo statuses found.'));
40
+ this.log(styles.muted('Apply a template: prlt template apply kanban'));
41
+ return;
42
+ }
43
+ // Group by category
44
+ const grouped = this.groupByCategory(statuses);
45
+ const projectName = await this.getProjectName(projectId);
46
+ this.log(`\n📊 ${styles.emphasis('Workflow Statuses')} - ${projectName}`);
47
+ this.log('═'.repeat(60));
48
+ const categoryEmoji = {
49
+ triage: '📬',
50
+ backlog: '📥',
51
+ unstarted: '📋',
52
+ started: '🚀',
53
+ completed: '✅',
54
+ canceled: '🚫',
55
+ };
56
+ const categoryColors = {
57
+ triage: '#A78BFA', // purple
58
+ backlog: '#9CA3AF', // gray
59
+ unstarted: '#60A5FA', // blue
60
+ started: '#FBBF24', // yellow
61
+ completed: '#34D399', // green
62
+ canceled: '#F87171', // red
63
+ };
64
+ for (const category of STATE_CATEGORY_ORDER) {
65
+ if (flags.category && flags.category !== category)
66
+ continue;
67
+ const categoryStatuses = grouped.get(category);
68
+ if (!categoryStatuses || categoryStatuses.length === 0)
69
+ continue;
70
+ const emoji = categoryEmoji[category];
71
+ this.log(`\n${emoji} ${styles.emphasis(category.toUpperCase())}`);
72
+ this.log('─'.repeat(40));
73
+ for (const status of categoryStatuses) {
74
+ const defaultBadge = status.isDefault ? styles.muted(' (default)') : '';
75
+ const colorPreview = status.color ? `[${status.color}]` : '';
76
+ this.log(` ${status.name}${defaultBadge} ${styles.muted(colorPreview)}`);
77
+ if (status.description) {
78
+ this.log(` ${styles.muted(status.description)}`);
79
+ }
80
+ }
81
+ }
82
+ this.log('');
83
+ }
84
+ groupByCategory(statuses) {
85
+ const grouped = new Map();
86
+ for (const status of statuses) {
87
+ const existing = grouped.get(status.category) || [];
88
+ existing.push(status);
89
+ grouped.set(status.category, existing);
90
+ }
91
+ return grouped;
92
+ }
93
+ }
@@ -0,0 +1,14 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class StatusMove extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ position: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ };
13
+ execute(): Promise<void>;
14
+ }
@@ -0,0 +1,120 @@
1
+ import { Flags, Args } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
4
+ import { styles } from '../../lib/styles.js';
5
+ import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
6
+ export default class StatusMove extends PMOCommand {
7
+ static description = 'Reorder a status within its category';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %> my-project-in-review --position 0 # Move to first',
10
+ '<%= config.bin %> <%= command.id %> my-project-blocked --position 2',
11
+ '<%= config.bin %> <%= command.id %> # Interactive mode',
12
+ ];
13
+ static args = {
14
+ id: Args.string({
15
+ description: 'Status 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
+ position: Flags.integer({
26
+ char: 'p',
27
+ description: 'New position (0-indexed) within the category',
28
+ required: false,
29
+ }),
30
+ };
31
+ async execute() {
32
+ const { args, flags } = await this.parse(StatusMove);
33
+ // This command requires project context
34
+ const projectId = await this.requireProject();
35
+ // Check if JSON output mode is active
36
+ const jsonMode = shouldOutputJson(flags);
37
+ // Helper to handle errors in JSON mode
38
+ const handleError = (code, message) => {
39
+ if (jsonMode) {
40
+ outputErrorAsJson(code, message, createMetadata('status move', flags));
41
+ this.exit(1);
42
+ }
43
+ this.error(message);
44
+ };
45
+ // Get the project's workflow ID
46
+ const project = await this.storage.getProject(projectId);
47
+ if (!project?.workflowId) {
48
+ return handleError('NO_WORKFLOW', `Project "${projectId}" has no workflow assigned.`);
49
+ }
50
+ // Get status ID - prompt if not provided
51
+ let statusId = args.id;
52
+ if (!statusId) {
53
+ const statuses = await this.storage.listStatuses(project.workflowId);
54
+ if (statuses.length === 0) {
55
+ return handleError('NO_STATUSES', 'No statuses found. Create a status first with "prlt status create".');
56
+ }
57
+ // In JSON mode, output status selection prompt
58
+ if (jsonMode) {
59
+ const statusChoices = statuses.map(s => ({
60
+ name: `${s.name} (${s.category}, position ${s.position})`,
61
+ value: s.id,
62
+ }));
63
+ outputPromptAsJson(buildPromptConfig('list', 'id', 'Select status to move:', statusChoices), createMetadata('status move', flags));
64
+ return;
65
+ }
66
+ const { selectedId } = await inquirer.prompt([{
67
+ type: 'list',
68
+ name: 'selectedId',
69
+ message: 'Select status to move:',
70
+ choices: statuses.map(s => ({
71
+ name: `${s.name} (${s.category}, position ${s.position})`,
72
+ value: s.id,
73
+ })),
74
+ }]);
75
+ statusId = selectedId;
76
+ }
77
+ // Get existing status
78
+ const existing = await this.storage.getStatus(statusId);
79
+ if (!existing) {
80
+ return handleError('STATUS_NOT_FOUND', `Status not found: ${statusId}`);
81
+ }
82
+ // Get position - prompt if not provided
83
+ let newPosition = flags.position;
84
+ if (newPosition === undefined) {
85
+ // Get statuses in the same category to show valid positions
86
+ const statuses = await this.storage.listStatuses(project.workflowId);
87
+ const categoryStatuses = statuses.filter(s => s.category === existing.category);
88
+ // In JSON mode, output position selection prompt
89
+ if (jsonMode) {
90
+ const positionChoices = categoryStatuses.map((_, idx) => ({
91
+ name: `Position ${idx}${idx === existing.position ? ' (current)' : ''}`,
92
+ value: String(idx),
93
+ }));
94
+ outputPromptAsJson(buildPromptConfig('list', 'position', `New position within ${existing.category} (currently ${existing.position}):`, positionChoices), createMetadata('status move', flags));
95
+ return;
96
+ }
97
+ const { position } = await inquirer.prompt([{
98
+ type: 'list',
99
+ name: 'position',
100
+ message: `New position within ${existing.category} (currently ${existing.position}):`,
101
+ choices: categoryStatuses.map((_, idx) => ({
102
+ name: `Position ${idx}${idx === existing.position ? ' (current)' : ''}`,
103
+ value: idx,
104
+ })),
105
+ default: existing.position,
106
+ }]);
107
+ newPosition = position;
108
+ }
109
+ if (newPosition < 0) {
110
+ this.error('Position must be >= 0');
111
+ }
112
+ const updated = await this.storage.reorderStatus(statusId, newPosition);
113
+ if (existing.position === updated.position) {
114
+ this.log(styles.muted(`Status "${updated.name}" is already at position ${updated.position}`));
115
+ }
116
+ else {
117
+ this.log(styles.success(`Moved "${updated.name}" from position ${existing.position} to ${updated.position}`));
118
+ }
119
+ }
120
+ }
@@ -0,0 +1,20 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class StatusUpdate extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ name: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ category: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ color: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ default: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
+ interactive: 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 promptChanges;
20
+ }
@@ -0,0 +1,180 @@
1
+ import { Flags, Args } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
4
+ import { styles } from '../../lib/styles.js';
5
+ import { STATE_CATEGORY_ORDER } from '../../lib/pmo/types.js';
6
+ import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, buildFormPromptConfig, } from '../../lib/prompt-json.js';
7
+ export default class StatusUpdate extends PMOCommand {
8
+ static description = 'Update a workflow status';
9
+ static examples = [
10
+ '<%= config.bin %> <%= command.id %> my-project-in-review --name "Code Review"',
11
+ '<%= config.bin %> <%= command.id %> my-project-blocked --color "#EF4444"',
12
+ '<%= config.bin %> <%= command.id %> my-project-todo --default # Set as default',
13
+ '<%= config.bin %> <%= command.id %> # Interactive mode',
14
+ ];
15
+ static args = {
16
+ id: Args.string({
17
+ description: 'Status ID - 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
+ name: Flags.string({
28
+ char: 'n',
29
+ description: 'New status name',
30
+ }),
31
+ category: Flags.string({
32
+ char: 'c',
33
+ description: 'New category',
34
+ options: ['backlog', 'unstarted', 'started', 'completed', 'canceled'],
35
+ }),
36
+ color: Flags.string({
37
+ description: 'Hex color code (e.g., #FF0000)',
38
+ }),
39
+ description: Flags.string({
40
+ char: 'd',
41
+ description: 'Status description',
42
+ }),
43
+ default: Flags.boolean({
44
+ description: 'Set as default status for new tickets',
45
+ allowNo: true,
46
+ }),
47
+ interactive: Flags.boolean({
48
+ char: 'i',
49
+ description: 'Interactive mode',
50
+ default: false,
51
+ }),
52
+ };
53
+ async execute() {
54
+ const { args, flags } = await this.parse(StatusUpdate);
55
+ // This command requires project context
56
+ const projectId = await this.requireProject();
57
+ // Check if JSON output mode is active
58
+ const jsonMode = shouldOutputJson(flags);
59
+ // Helper to handle errors in JSON mode
60
+ const handleError = (code, message) => {
61
+ if (jsonMode) {
62
+ outputErrorAsJson(code, message, createMetadata('status update', flags));
63
+ this.exit(1);
64
+ }
65
+ this.error(message);
66
+ };
67
+ // Get the project's workflow ID
68
+ const project = await this.storage.getProject(projectId);
69
+ if (!project?.workflowId) {
70
+ return handleError('NO_WORKFLOW', `Project "${projectId}" has no workflow assigned.`);
71
+ }
72
+ // Get status ID - prompt if not provided
73
+ let statusId = args.id;
74
+ if (!statusId) {
75
+ const statuses = await this.storage.listStatuses(project.workflowId);
76
+ if (statuses.length === 0) {
77
+ return handleError('NO_STATUSES', 'No statuses found. Create a status first with "prlt status create".');
78
+ }
79
+ // In JSON mode, output status selection prompt
80
+ if (jsonMode) {
81
+ const statusChoices = statuses.map(s => ({
82
+ name: `${s.name} (${s.category})`,
83
+ value: s.id,
84
+ }));
85
+ outputPromptAsJson(buildPromptConfig('list', 'id', 'Select status to update:', statusChoices), createMetadata('status update', flags));
86
+ return;
87
+ }
88
+ const { selectedId } = await inquirer.prompt([{
89
+ type: 'list',
90
+ name: 'selectedId',
91
+ message: 'Select status to update:',
92
+ choices: statuses.map(s => ({
93
+ name: `${s.name} (${s.category})`,
94
+ value: s.id,
95
+ })),
96
+ }]);
97
+ statusId = selectedId;
98
+ }
99
+ // Get existing status
100
+ const existing = await this.storage.getStatus(statusId);
101
+ if (!existing) {
102
+ return handleError('STATUS_NOT_FOUND', `Status not found: ${statusId}`);
103
+ }
104
+ let changes;
105
+ // Check if any change flags were provided
106
+ const hasChangeFlags = flags.name !== undefined ||
107
+ flags.category !== undefined ||
108
+ flags.color !== undefined ||
109
+ flags.description !== undefined ||
110
+ flags.default !== undefined;
111
+ // Auto-enter interactive mode if no change flags provided
112
+ if (flags.interactive || !hasChangeFlags) {
113
+ // Build choices once - single source of truth
114
+ const categoryChoices = STATE_CATEGORY_ORDER.map(cat => ({ name: cat, value: cat }));
115
+ // Define fields once - single source of truth for both JSON and interactive modes
116
+ const fields = [
117
+ { type: 'input', name: 'name', message: 'Status name:', default: existing.name },
118
+ { type: 'list', name: 'category', message: 'Category:', choices: categoryChoices, default: existing.category },
119
+ { type: 'input', name: 'color', message: 'Color (hex, optional):', default: existing.color || '' },
120
+ { type: 'input', name: 'description', message: 'Description (optional):', default: existing.description || '' },
121
+ { type: 'confirm', name: 'isDefault', message: 'Set as default status for new tickets?', default: existing.isDefault || false },
122
+ ];
123
+ // In JSON mode, output form prompts
124
+ if (jsonMode) {
125
+ outputPromptAsJson(buildFormPromptConfig(fields), createMetadata('status update', flags));
126
+ }
127
+ changes = await this.promptChanges(fields, existing);
128
+ }
129
+ else {
130
+ changes = {};
131
+ if (flags.name !== undefined)
132
+ changes.name = flags.name;
133
+ if (flags.category !== undefined)
134
+ changes.category = flags.category;
135
+ if (flags.color !== undefined)
136
+ changes.color = flags.color;
137
+ if (flags.description !== undefined)
138
+ changes.description = flags.description;
139
+ if (flags.default !== undefined)
140
+ changes.isDefault = flags.default;
141
+ }
142
+ const updated = await this.storage.updateStatus(statusId, changes);
143
+ this.log(styles.success(`\nUpdated status "${styles.emphasis(updated.name)}"`));
144
+ this.log(styles.muted(` ID: ${updated.id}`));
145
+ this.log(styles.muted(` Category: ${updated.category}`));
146
+ if (updated.color) {
147
+ this.log(styles.muted(` Color: ${updated.color}`));
148
+ }
149
+ if (updated.isDefault) {
150
+ this.log(styles.muted(` Default: yes`));
151
+ }
152
+ }
153
+ async promptChanges(fields, existing) {
154
+ // Build inquirer prompts from fields, adding validators
155
+ const answers = await inquirer.prompt(fields.map(field => ({
156
+ ...field,
157
+ validate: field.name === 'name'
158
+ ? ((input) => input.length > 0 || 'Name is required')
159
+ : field.name === 'color'
160
+ ? ((input) => {
161
+ if (!input)
162
+ return true;
163
+ return /^#[0-9A-Fa-f]{6}$/.test(input) || 'Invalid hex color (e.g., #FF0000)';
164
+ })
165
+ : undefined,
166
+ })));
167
+ const changes = {};
168
+ if (answers.name !== existing.name)
169
+ changes.name = answers.name;
170
+ if (answers.category !== existing.category)
171
+ changes.category = answers.category;
172
+ if (answers.color !== (existing.color || ''))
173
+ changes.color = answers.color || undefined;
174
+ if (answers.description !== (existing.description || ''))
175
+ changes.description = answers.description || undefined;
176
+ if (answers.isDefault !== (existing.isDefault || false))
177
+ changes.isDefault = answers.isDefault;
178
+ return changes;
179
+ }
180
+ }
@@ -0,0 +1,15 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class TemplateDelete extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ type: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ };
11
+ protected getPMOOptions(): {
12
+ promptIfMultiple: boolean;
13
+ };
14
+ execute(): Promise<void>;
15
+ }