@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,115 @@
1
+ import { Args, Flags } 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 PhaseMove extends PMOCommand {
7
+ static description = 'Change the position of a phase within its category';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %> on-hold --position 0',
10
+ '<%= config.bin %> <%= command.id %> in-review --position 1',
11
+ '<%= config.bin %> <%= command.id %> # Interactive mode',
12
+ ];
13
+ static args = {
14
+ id: Args.string({
15
+ description: 'Phase ID - prompts with dropdown if not provided',
16
+ required: false,
17
+ }),
18
+ };
19
+ static flags = {
20
+ ...pmoBaseFlags,
21
+ position: Flags.integer({
22
+ char: 'p',
23
+ description: 'New position (0-indexed)',
24
+ required: false,
25
+ }),
26
+ json: Flags.boolean({
27
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
28
+ default: false,
29
+ }),
30
+ };
31
+ getPMOOptions() {
32
+ return { promptIfMultiple: false };
33
+ }
34
+ async execute() {
35
+ const { args, flags } = await this.parse(PhaseMove);
36
+ // Check if JSON output mode is active
37
+ const jsonMode = shouldOutputJson(flags);
38
+ // Helper to handle errors in JSON mode
39
+ const handleError = (code, message) => {
40
+ if (jsonMode) {
41
+ outputErrorAsJson(code, message, createMetadata('phase move', flags));
42
+ this.exit(1);
43
+ }
44
+ this.error(message);
45
+ };
46
+ // Get phase ID - prompt if not provided
47
+ let phaseId = args.id;
48
+ if (!phaseId) {
49
+ const phases = await this.storage.listPhases();
50
+ if (phases.length === 0) {
51
+ return handleError('NO_PHASES', 'No phases found. Create a phase first with "prlt phase create".');
52
+ }
53
+ // In JSON mode, output phase selection prompt
54
+ if (jsonMode) {
55
+ const phaseChoices = phases.map(p => ({
56
+ name: `${p.name} (${p.category}, position ${p.position})`,
57
+ value: p.id,
58
+ }));
59
+ outputPromptAsJson(buildPromptConfig('list', 'phaseId', 'Select phase to move:', phaseChoices), createMetadata('phase move', flags));
60
+ return;
61
+ }
62
+ const { selectedId } = await inquirer.prompt([{
63
+ type: 'list',
64
+ name: 'selectedId',
65
+ message: 'Select phase to move:',
66
+ choices: phases.map(p => ({
67
+ name: `${p.name} (${p.category}, position ${p.position})`,
68
+ value: p.id,
69
+ })),
70
+ }]);
71
+ phaseId = selectedId;
72
+ }
73
+ const phase = await this.storage.getPhase(phaseId);
74
+ if (!phase) {
75
+ return handleError('PHASE_NOT_FOUND', `Phase "${phaseId}" not found.`);
76
+ }
77
+ // Get position - prompt if not provided
78
+ let newPosition = flags.position;
79
+ if (newPosition === undefined) {
80
+ // Get phases in the same category to show valid positions
81
+ const phases = await this.storage.listPhases();
82
+ const categoryPhases = phases.filter(p => p.category === phase.category);
83
+ // In JSON mode, output position selection prompt
84
+ if (jsonMode) {
85
+ const positionChoices = categoryPhases.map((_, idx) => ({
86
+ name: `Position ${idx}${idx === phase.position ? ' (current)' : ''}`,
87
+ value: String(idx),
88
+ }));
89
+ outputPromptAsJson(buildPromptConfig('list', 'position', `New position within ${phase.category} (currently ${phase.position}):`, positionChoices), createMetadata('phase move', flags));
90
+ return;
91
+ }
92
+ const { position } = await inquirer.prompt([{
93
+ type: 'list',
94
+ name: 'position',
95
+ message: `New position within ${phase.category} (currently ${phase.position}):`,
96
+ choices: categoryPhases.map((_, idx) => ({
97
+ name: `Position ${idx}${idx === phase.position ? ' (current)' : ''}`,
98
+ value: idx,
99
+ })),
100
+ default: phase.position,
101
+ }]);
102
+ newPosition = position;
103
+ }
104
+ if (newPosition < 0) {
105
+ this.error('Position must be >= 0');
106
+ }
107
+ const updated = await this.storage.reorderPhase(phaseId, newPosition);
108
+ if (phase.position === updated.position) {
109
+ this.log(styles.muted(`Phase "${updated.name}" is already at position ${updated.position}`));
110
+ }
111
+ else {
112
+ this.log(styles.success(`\nMoved phase "${updated.name}" from position ${phase.position} to ${updated.position}`));
113
+ }
114
+ }
115
+ }
@@ -0,0 +1,17 @@
1
+ import { PMOCommand } from '../../../lib/pmo/index.js';
2
+ export default class PhaseTemplateApply extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ template: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ };
13
+ protected getPMOOptions(): {
14
+ promptIfMultiple: boolean;
15
+ };
16
+ execute(): Promise<void>;
17
+ }
@@ -0,0 +1,106 @@
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 PhaseTemplateApply extends PMOCommand {
7
+ static description = 'Apply a phase template to the workspace';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %> default',
10
+ '<%= config.bin %> <%= command.id %> agile',
11
+ '<%= config.bin %> <%= command.id %> product --force # Skip confirmation',
12
+ ];
13
+ static args = {
14
+ template: Args.string({
15
+ description: 'Phase template ID to apply',
16
+ required: false,
17
+ }),
18
+ };
19
+ static flags = {
20
+ ...pmoBaseFlags,
21
+ force: Flags.boolean({
22
+ char: 'f',
23
+ description: 'Skip confirmation prompt (will replace existing phases)',
24
+ default: false,
25
+ }),
26
+ json: Flags.boolean({
27
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
28
+ default: false,
29
+ }),
30
+ };
31
+ getPMOOptions() {
32
+ return { promptIfMultiple: false };
33
+ }
34
+ async execute() {
35
+ const { args, flags } = await this.parse(PhaseTemplateApply);
36
+ // Check if JSON output mode is active
37
+ const jsonMode = shouldOutputJson(flags);
38
+ // Helper to handle errors in JSON mode
39
+ const handleError = (code, message) => {
40
+ if (jsonMode) {
41
+ outputErrorAsJson(code, message, createMetadata('phase template apply', flags));
42
+ this.exit(1);
43
+ }
44
+ this.error(message);
45
+ };
46
+ // Get template - prompt for selection if not provided
47
+ let templateId = args.template;
48
+ if (!templateId) {
49
+ const templates = await this.storage.listPhaseTemplates();
50
+ if (templates.length === 0) {
51
+ return handleError('NO_TEMPLATES', `No phase templates found.\nCreate one with: prlt phase template create "Template Name"`);
52
+ }
53
+ const { selectedTemplate } = await inquirer.prompt([{
54
+ type: 'list',
55
+ name: 'selectedTemplate',
56
+ message: 'Select a phase template:',
57
+ choices: templates.map(t => ({
58
+ name: `${t.name}${t.description ? ` - ${t.description}` : ''}`,
59
+ value: t.id,
60
+ })),
61
+ }]);
62
+ templateId = selectedTemplate;
63
+ }
64
+ // Verify template exists
65
+ const template = await this.storage.getPhaseTemplate(templateId);
66
+ if (!template) {
67
+ return handleError('TEMPLATE_NOT_FOUND', `Phase template not found: ${templateId}. Run 'prlt phase template list' to see available templates.`);
68
+ }
69
+ // Check if workspace has existing phases
70
+ const existingPhases = await this.storage.listPhases();
71
+ if (existingPhases.length > 0 && !flags.force) {
72
+ // In JSON mode, output confirmation prompt
73
+ if (jsonMode) {
74
+ const confirmChoices = [
75
+ { name: 'No', value: 'false' },
76
+ { name: 'Yes', value: 'true' },
77
+ ];
78
+ outputPromptAsJson(buildPromptConfig('list', 'confirmed', `Workspace has ${existingPhases.length} existing phase(s). Applying will REPLACE all. Apply template "${template.name}"?`, confirmChoices), createMetadata('phase template apply', flags));
79
+ return;
80
+ }
81
+ this.log(styles.warning(`\nWorkspace has ${existingPhases.length} existing phase(s).`));
82
+ this.log(styles.warning('Applying a template will REPLACE all existing phases.'));
83
+ this.log('');
84
+ const { confirm } = await inquirer.prompt([
85
+ {
86
+ type: 'confirm',
87
+ name: 'confirm',
88
+ message: `Apply template "${template.name}" and replace existing phases?`,
89
+ default: false,
90
+ },
91
+ ]);
92
+ if (!confirm) {
93
+ this.log(styles.muted('Cancelled'));
94
+ return;
95
+ }
96
+ }
97
+ // Apply template
98
+ const phases = await this.storage.applyPhaseTemplate(templateId);
99
+ this.log(styles.success(`\nApplied phase template "${styles.emphasis(template.name)}"`));
100
+ this.log(styles.muted(`Created ${phases.length} phases:`));
101
+ for (const phase of phases) {
102
+ const defaultBadge = phase.isDefault ? ' (default)' : '';
103
+ this.log(styles.muted(` • ${phase.name} [${phase.category}]${defaultBadge}`));
104
+ }
105
+ }
106
+ }
@@ -0,0 +1,16 @@
1
+ import { PMOCommand } from '../../../lib/pmo/index.js';
2
+ export default class PhaseTemplateCreate extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ name: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ };
12
+ protected getPMOOptions(): {
13
+ promptIfMultiple: boolean;
14
+ };
15
+ execute(): Promise<void>;
16
+ }
@@ -0,0 +1,58 @@
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
+ export default class PhaseTemplateCreate extends PMOCommand {
6
+ static description = 'Create a new phase template from current workspace phases';
7
+ static examples = [
8
+ '<%= config.bin %> <%= command.id %> "My Custom Phases"',
9
+ '<%= config.bin %> <%= command.id %> "Enterprise" --description "Enterprise project lifecycle"',
10
+ ];
11
+ static args = {
12
+ name: Args.string({
13
+ description: 'Name for the new template',
14
+ required: false,
15
+ }),
16
+ };
17
+ static flags = {
18
+ ...pmoBaseFlags,
19
+ description: Flags.string({
20
+ char: 'd',
21
+ description: 'Template description',
22
+ }),
23
+ };
24
+ getPMOOptions() {
25
+ return { promptIfMultiple: false };
26
+ }
27
+ async execute() {
28
+ const { args, flags } = await this.parse(PhaseTemplateCreate);
29
+ // Get template name - prompt if not provided
30
+ let templateName = args.name;
31
+ if (!templateName) {
32
+ const { name } = await inquirer.prompt([{
33
+ type: 'input',
34
+ name: 'name',
35
+ message: 'Template name:',
36
+ validate: (input) => input.length > 0 || 'Name is required',
37
+ }]);
38
+ templateName = name;
39
+ }
40
+ // Get description if not provided
41
+ let description = flags.description;
42
+ if (description === undefined) {
43
+ const { desc } = await inquirer.prompt([{
44
+ type: 'input',
45
+ name: 'desc',
46
+ message: 'Description (optional):',
47
+ }]);
48
+ description = desc || undefined;
49
+ }
50
+ const template = await this.storage.savePhaseTemplate(templateName, description);
51
+ this.log(styles.success(`\nCreated phase template "${styles.emphasis(template.name)}" (${template.id})`));
52
+ this.log(styles.muted(`Saved ${template.phases.length} phases:`));
53
+ for (const phase of template.phases) {
54
+ const defaultBadge = phase.isDefault ? ' (default)' : '';
55
+ this.log(styles.muted(` • ${phase.name} [${phase.category}]${defaultBadge}`));
56
+ }
57
+ }
58
+ }
@@ -0,0 +1,17 @@
1
+ import { PMOCommand } from '../../../lib/pmo/index.js';
2
+ export default class PhaseTemplateDelete 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
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ };
13
+ protected getPMOOptions(): {
14
+ promptIfMultiple: boolean;
15
+ };
16
+ execute(): Promise<void>;
17
+ }
@@ -0,0 +1,98 @@
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 PhaseTemplateDelete extends PMOCommand {
7
+ static description = 'Delete a phase template';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %> my-custom-template',
10
+ '<%= config.bin %> <%= command.id %> my-template --force',
11
+ ];
12
+ static args = {
13
+ id: Args.string({
14
+ description: 'Template ID to delete',
15
+ required: false,
16
+ }),
17
+ };
18
+ static flags = {
19
+ ...pmoBaseFlags,
20
+ force: Flags.boolean({
21
+ char: 'f',
22
+ description: 'Skip confirmation',
23
+ default: false,
24
+ }),
25
+ json: Flags.boolean({
26
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
27
+ default: false,
28
+ }),
29
+ };
30
+ getPMOOptions() {
31
+ return { promptIfMultiple: false };
32
+ }
33
+ async execute() {
34
+ const { args, flags } = await this.parse(PhaseTemplateDelete);
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('phase template delete', flags));
41
+ this.exit(1);
42
+ }
43
+ this.error(message);
44
+ };
45
+ // Get template - prompt for selection if not provided
46
+ let templateId = args.id;
47
+ if (!templateId) {
48
+ const templates = await this.storage.listPhaseTemplates();
49
+ const deletableTemplates = templates.filter(t => !t.isBuiltin);
50
+ if (deletableTemplates.length === 0) {
51
+ return handleError('NO_TEMPLATES', `No deletable phase templates found (built-in templates cannot be deleted).`);
52
+ }
53
+ const { selectedTemplate } = await inquirer.prompt([{
54
+ type: 'list',
55
+ name: 'selectedTemplate',
56
+ message: 'Select a template to delete:',
57
+ choices: deletableTemplates.map(t => ({
58
+ name: `${t.name}${t.description ? ` - ${t.description}` : ''}`,
59
+ value: t.id,
60
+ })),
61
+ }]);
62
+ templateId = selectedTemplate;
63
+ }
64
+ // Verify template exists
65
+ const template = await this.storage.getPhaseTemplate(templateId);
66
+ if (!template) {
67
+ return handleError('TEMPLATE_NOT_FOUND', `Phase template not found: ${templateId}`);
68
+ }
69
+ if (template.isBuiltin) {
70
+ return handleError('CANNOT_DELETE_BUILTIN', 'Cannot delete built-in templates');
71
+ }
72
+ if (!flags.force) {
73
+ // In JSON mode, output confirmation prompt
74
+ if (jsonMode) {
75
+ const confirmChoices = [
76
+ { name: 'No', value: 'false' },
77
+ { name: 'Yes', value: 'true' },
78
+ ];
79
+ outputPromptAsJson(buildPromptConfig('list', 'confirmed', `Delete phase template "${template.name}"?`, confirmChoices), createMetadata('phase template delete', flags));
80
+ return;
81
+ }
82
+ const { confirm } = await inquirer.prompt([
83
+ {
84
+ type: 'confirm',
85
+ name: 'confirm',
86
+ message: `Delete phase template "${template.name}"?`,
87
+ default: false,
88
+ },
89
+ ]);
90
+ if (!confirm) {
91
+ this.log(styles.muted('Cancelled'));
92
+ return;
93
+ }
94
+ }
95
+ await this.storage.deletePhaseTemplate(templateId);
96
+ this.log(styles.success(`\nDeleted phase template "${template.name}"`));
97
+ }
98
+ }
@@ -0,0 +1,15 @@
1
+ import { PMOCommand } from '../../../lib/pmo/index.js';
2
+ export default class PhaseTemplateMenu 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
+ private selectTemplate;
15
+ }
@@ -0,0 +1,128 @@
1
+ import { Flags } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { PMOCommand, pmoBaseFlags } from '../../../lib/pmo/index.js';
4
+ import { shouldOutputJson, outputPromptAsJson, createMetadata, buildPromptConfig, } from '../../../lib/prompt-json.js';
5
+ export default class PhaseTemplateMenu extends PMOCommand {
6
+ static description = 'Interactive menu for project phase template operations';
7
+ static aliases = ['phase:templates'];
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(PhaseTemplateMenu);
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
+ const menuChoices = [
27
+ { name: 'List available templates', value: 'list' },
28
+ { name: 'Apply template to workspace', value: 'apply' },
29
+ { name: 'Save current phases as template', value: 'create' },
30
+ { name: 'Update template', value: 'update' },
31
+ { name: 'Delete template', value: 'delete' },
32
+ { name: 'Cancel', value: 'cancel' },
33
+ ];
34
+ const message = 'Phase Templates - What would you like to do?';
35
+ // In JSON mode, output menu prompt
36
+ if (jsonMode) {
37
+ outputPromptAsJson(buildPromptConfig('list', 'action', message, menuChoices), createMetadata('phase template', flags));
38
+ return;
39
+ }
40
+ {
41
+ // Show interactive menu
42
+ const { action } = await inquirer.prompt([{
43
+ type: 'list',
44
+ name: 'action',
45
+ message: '📊 ' + message,
46
+ choices: [
47
+ ...menuChoices.slice(0, 3),
48
+ new inquirer.Separator('──────────────'),
49
+ ...menuChoices.slice(3),
50
+ ],
51
+ }]);
52
+ if (action === 'cancel') {
53
+ return;
54
+ }
55
+ // Run the selected subcommand
56
+ switch (action) {
57
+ case 'list':
58
+ await this.config.runCommand('phase:template:list', []);
59
+ break;
60
+ case 'apply': {
61
+ const templateId = await this.selectTemplate(this.storage, 'Select template to apply:');
62
+ if (templateId) {
63
+ await this.config.runCommand('phase:template:apply', [templateId]);
64
+ }
65
+ break;
66
+ }
67
+ case 'create': {
68
+ const { name } = await inquirer.prompt([{
69
+ type: 'input',
70
+ name: 'name',
71
+ message: 'Template name:',
72
+ validate: (input) => input.length > 0 || 'Name is required',
73
+ }]);
74
+ await this.config.runCommand('phase:template:create', [name]);
75
+ break;
76
+ }
77
+ case 'update': {
78
+ const customTemplates = (await this.storage.listPhaseTemplates()).filter(t => !t.isBuiltin);
79
+ if (customTemplates.length === 0) {
80
+ this.log('No custom templates to update. Built-in templates cannot be modified.');
81
+ return;
82
+ }
83
+ const templateId = await this.selectTemplate(this.storage, 'Select template to update:', true);
84
+ if (templateId) {
85
+ await this.config.runCommand('phase:template:update', [templateId]);
86
+ }
87
+ break;
88
+ }
89
+ case 'delete': {
90
+ const customTemplates = (await this.storage.listPhaseTemplates()).filter(t => !t.isBuiltin);
91
+ if (customTemplates.length === 0) {
92
+ this.log('No custom templates to delete. Built-in templates cannot be deleted.');
93
+ return;
94
+ }
95
+ const templateId = await this.selectTemplate(this.storage, 'Select template to delete:', true);
96
+ if (templateId) {
97
+ await this.config.runCommand('phase:template:delete', [templateId]);
98
+ }
99
+ break;
100
+ }
101
+ }
102
+ }
103
+ }
104
+ async selectTemplate(storage, message, customOnly = false) {
105
+ let templates = await storage.listPhaseTemplates();
106
+ if (customOnly) {
107
+ templates = templates.filter(t => !t.isBuiltin);
108
+ }
109
+ if (templates.length === 0) {
110
+ this.log('No templates found.');
111
+ return null;
112
+ }
113
+ const { selected } = await inquirer.prompt([{
114
+ type: 'list',
115
+ name: 'selected',
116
+ message,
117
+ choices: [
118
+ ...templates.map(t => ({
119
+ name: `${t.name} (${t.id})${t.isBuiltin ? '' : ' [custom]'}`,
120
+ value: t.id,
121
+ })),
122
+ new inquirer.Separator(),
123
+ { name: 'Cancel', value: null },
124
+ ],
125
+ }]);
126
+ return selected;
127
+ }
128
+ }
@@ -0,0 +1,16 @@
1
+ import { PMOCommand } from '../../../lib/pmo/index.js';
2
+ export default class PhaseTemplateList extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ builtin: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ custom: 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
+ private printTemplate;
16
+ }