@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,17 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class ProjectDelete 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,128 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import inquirer from 'inquirer';
5
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
6
+ import { styles } from '../../lib/styles.js';
7
+ import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
8
+ export default class ProjectDelete extends PMOCommand {
9
+ static description = 'Delete a project from the PMO';
10
+ static examples = [
11
+ '<%= config.bin %> <%= command.id %> my-project',
12
+ '<%= config.bin %> <%= command.id %> my-project --force',
13
+ ];
14
+ static args = {
15
+ id: Args.string({
16
+ description: 'Project ID to delete - prompts with dropdown if not provided',
17
+ required: false,
18
+ }),
19
+ };
20
+ static flags = {
21
+ ...pmoBaseFlags,
22
+ force: Flags.boolean({
23
+ char: 'f',
24
+ description: 'Skip confirmation prompt',
25
+ default: false,
26
+ }),
27
+ json: Flags.boolean({
28
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
29
+ default: false,
30
+ }),
31
+ };
32
+ getPMOOptions() {
33
+ return { promptIfMultiple: false };
34
+ }
35
+ async execute() {
36
+ const { args, flags } = await this.parse(ProjectDelete);
37
+ // Check if JSON output mode is active
38
+ const jsonMode = shouldOutputJson(flags);
39
+ // Helper to handle errors in JSON mode
40
+ const handleError = (code, message) => {
41
+ if (jsonMode) {
42
+ outputErrorAsJson(code, message, createMetadata('project delete', flags));
43
+ this.exit(1);
44
+ }
45
+ this.error(message);
46
+ };
47
+ // Get project ID - prompt if not provided
48
+ let projectId = args.id;
49
+ if (!projectId) {
50
+ const projects = await this.storage.listProjects();
51
+ if (projects.length === 0) {
52
+ return handleError('NO_PROJECTS', 'No projects found.');
53
+ }
54
+ const deletableProjects = projects.filter(p => p.id !== 'default');
55
+ if (deletableProjects.length === 0) {
56
+ return handleError('NO_DELETABLE_PROJECTS', 'No deletable projects found. Cannot delete the default project.');
57
+ }
58
+ // In JSON mode, output project selection prompt
59
+ if (jsonMode) {
60
+ const projectChoices = deletableProjects.map(p => ({ name: `${p.id} - ${p.name}`, value: p.id }));
61
+ outputPromptAsJson(buildPromptConfig('list', 'id', 'Select project to delete:', projectChoices), createMetadata('project delete', flags));
62
+ return;
63
+ }
64
+ const { selectedProjectId } = await inquirer.prompt([{
65
+ type: 'list',
66
+ name: 'selectedProjectId',
67
+ message: 'Select project to delete:',
68
+ choices: deletableProjects.map(p => ({
69
+ name: `${p.id} - ${p.name}`,
70
+ value: p.id,
71
+ })),
72
+ }]);
73
+ projectId = selectedProjectId;
74
+ }
75
+ if (projectId === 'default') {
76
+ return handleError('CANNOT_DELETE_DEFAULT', 'Cannot delete the default project.');
77
+ }
78
+ // Check if project exists
79
+ const project = await this.storage.getProject(projectId);
80
+ if (!project) {
81
+ return handleError('PROJECT_NOT_FOUND', `Project "${projectId}" not found.`);
82
+ }
83
+ // Get ticket count
84
+ const tickets = await this.storage.listTickets(projectId);
85
+ const ticketCount = tickets.length;
86
+ // Confirm deletion
87
+ if (!flags.force) {
88
+ const message = ticketCount > 0
89
+ ? `Delete project "${project.name}" and its ${ticketCount} ticket(s)?`
90
+ : `Delete project "${project.name}"?`;
91
+ // In JSON mode, output confirmation prompt
92
+ if (jsonMode) {
93
+ const confirmChoices = [
94
+ { name: 'No, cancel', value: 'false' },
95
+ { name: 'Yes, delete', value: 'true' },
96
+ ];
97
+ outputPromptAsJson(buildPromptConfig('list', 'confirmed', message, confirmChoices), createMetadata('project delete', flags));
98
+ return;
99
+ }
100
+ const { confirm } = await inquirer.prompt([{
101
+ type: 'list',
102
+ name: 'confirm',
103
+ message,
104
+ choices: [
105
+ { name: 'No, cancel', value: false },
106
+ { name: 'Yes, delete', value: true },
107
+ ],
108
+ default: 0,
109
+ }]);
110
+ if (!confirm) {
111
+ this.log(styles.muted('Cancelled.'));
112
+ return;
113
+ }
114
+ }
115
+ // Delete project from database
116
+ await this.storage.deleteProject(projectId);
117
+ // Delete entire project folder: pmo/projects/{projectId}/
118
+ // This includes board.md and specs/ directory
119
+ const projectPath = path.join(this.pmoPath, 'projects', projectId);
120
+ if (fs.existsSync(projectPath)) {
121
+ fs.rmSync(projectPath, { recursive: true, force: true });
122
+ }
123
+ this.log(styles.success(`Deleted project "${project.name}"`));
124
+ if (ticketCount > 0) {
125
+ this.log(styles.muted(` (${ticketCount} ticket(s) removed)`));
126
+ }
127
+ }
128
+ }
@@ -0,0 +1,13 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class Project extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ };
9
+ protected getPMOOptions(): {
10
+ promptIfMultiple: boolean;
11
+ };
12
+ execute(): Promise<void>;
13
+ }
@@ -0,0 +1,64 @@
1
+ import { Flags } from '@oclif/core';
2
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
3
+ import { shouldOutputJson, } from '../../lib/prompt-json.js';
4
+ export default class Project extends PMOCommand {
5
+ static description = 'Interactive menu for project operations';
6
+ static examples = [
7
+ '<%= config.bin %> <%= command.id %>',
8
+ ];
9
+ static flags = {
10
+ ...pmoBaseFlags,
11
+ json: Flags.boolean({
12
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
13
+ default: false,
14
+ }),
15
+ };
16
+ getPMOOptions() {
17
+ return { promptIfMultiple: false };
18
+ }
19
+ async execute() {
20
+ const { flags } = await this.parse(Project);
21
+ // Check if JSON output mode is active
22
+ const jsonMode = shouldOutputJson(flags);
23
+ // Define choices once, use for both JSON and interactive modes
24
+ // Each choice includes the full command for AI agents to execute
25
+ const menuChoices = [
26
+ { id: 'create', name: 'Create new project', command: 'prlt project create --json' },
27
+ { id: 'list', name: 'List all projects', command: 'prlt project list --format json' },
28
+ { id: 'view', name: 'View project board', command: 'prlt project view --json' },
29
+ { id: 'spec', name: 'Manage project specs', command: 'prlt project spec --json' },
30
+ { id: 'delete', name: 'Delete project', command: 'prlt project delete --json' },
31
+ { id: 'cancel', name: 'Cancel', command: '' },
32
+ ];
33
+ const message = 'Project Operations - What would you like to do?';
34
+ const action = await this.selectFromList({
35
+ message,
36
+ items: menuChoices,
37
+ getName: (c) => c.name,
38
+ getValue: (c) => c.id,
39
+ getCommand: (c) => c.command,
40
+ jsonMode: jsonMode ? { flags, commandName: 'project' } : null,
41
+ });
42
+ if (action === 'cancel' || !action) {
43
+ return;
44
+ }
45
+ // Run the selected subcommand
46
+ switch (action) {
47
+ case 'create':
48
+ await this.config.runCommand('project:create', []);
49
+ break;
50
+ case 'list':
51
+ await this.config.runCommand('project:list', []);
52
+ break;
53
+ case 'view':
54
+ await this.config.runCommand('project:view', []);
55
+ break;
56
+ case 'spec':
57
+ await this.config.runCommand('project:spec', []);
58
+ break;
59
+ case 'delete':
60
+ await this.config.runCommand('project:delete', []);
61
+ break;
62
+ }
63
+ }
64
+ }
@@ -0,0 +1,14 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class ProjectList extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ archived: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ all: 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,96 @@
1
+ import { Flags } from '@oclif/core';
2
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
3
+ import { styles } from '../../lib/styles.js';
4
+ export default class ProjectList extends PMOCommand {
5
+ static description = 'List all projects in the PMO';
6
+ static examples = [
7
+ '<%= config.bin %> <%= command.id %>',
8
+ '<%= config.bin %> <%= command.id %> --archived',
9
+ '<%= config.bin %> <%= command.id %> --all',
10
+ ];
11
+ static flags = {
12
+ ...pmoBaseFlags,
13
+ archived: Flags.boolean({
14
+ char: 'a',
15
+ description: 'Show only archived projects',
16
+ default: false,
17
+ }),
18
+ all: Flags.boolean({
19
+ description: 'Show all projects (including archived)',
20
+ default: false,
21
+ }),
22
+ };
23
+ getPMOOptions() {
24
+ return { promptIfMultiple: false };
25
+ }
26
+ async execute() {
27
+ const { flags } = await this.parse(ProjectList);
28
+ // Determine filter based on flags
29
+ let isArchived;
30
+ if (flags.archived) {
31
+ isArchived = true;
32
+ }
33
+ else if (!flags.all) {
34
+ isArchived = false; // Default: show only non-archived
35
+ }
36
+ // If --all, isArchived is undefined (show both)
37
+ const projects = await this.storage.listProjects({ isArchived });
38
+ // Get phases for display
39
+ const phases = await this.storage.listPhases();
40
+ const phaseMap = new Map(phases.map(p => [p.id, p]));
41
+ if (projects.length === 0) {
42
+ if (flags.archived) {
43
+ this.log(styles.muted('No archived projects found.'));
44
+ }
45
+ else if (flags.all) {
46
+ this.log(styles.muted('No projects found. Create one with: prlt project create'));
47
+ }
48
+ else {
49
+ this.log(styles.muted('No active projects found. Create one with: prlt project create'));
50
+ // Check if there are archived projects
51
+ const archivedProjects = await this.storage.listProjects({ isArchived: true });
52
+ if (archivedProjects.length > 0) {
53
+ this.log(styles.muted(`(${archivedProjects.length} archived project${archivedProjects.length > 1 ? 's' : ''} hidden. Use --archived to view)`));
54
+ }
55
+ }
56
+ return;
57
+ }
58
+ const title = flags.archived ? 'Archived Projects' : flags.all ? 'All Projects' : 'Projects';
59
+ this.log(styles.title(`\n${title}\n`));
60
+ // Get ticket counts using listProjectSummaries
61
+ const summaries = await this.storage.listProjectSummaries();
62
+ const ticketCountMap = new Map(summaries.map(s => [s.id, s.ticketCount]));
63
+ for (const project of projects) {
64
+ const isDefault = project.id === 'default';
65
+ const markers = [];
66
+ if (isDefault)
67
+ markers.push(styles.success('default'));
68
+ if (project.isArchived)
69
+ markers.push(styles.muted('archived'));
70
+ const markerStr = markers.length > 0 ? ` (${markers.join(', ')})` : '';
71
+ this.log(` ${styles.emphasis(project.name)}${markerStr}`);
72
+ this.log(styles.muted(` ID: ${project.id}`));
73
+ // Show ticket count
74
+ const ticketCount = ticketCountMap.get(project.id) ?? 0;
75
+ this.log(styles.muted(` Tickets: ${ticketCount}`));
76
+ // Show phase if set
77
+ if (project.phaseId) {
78
+ const phase = phaseMap.get(project.phaseId);
79
+ if (phase) {
80
+ this.log(styles.muted(` Phase: ${phase.name}`));
81
+ }
82
+ }
83
+ if (project.description) {
84
+ this.log(styles.muted(` ${project.description}`));
85
+ }
86
+ this.log('');
87
+ }
88
+ // Show hint about archived projects when viewing active
89
+ if (!flags.archived && !flags.all) {
90
+ const archivedProjects = await this.storage.listProjects({ isArchived: true });
91
+ if (archivedProjects.length > 0) {
92
+ this.log(styles.muted(`(${archivedProjects.length} archived project${archivedProjects.length > 1 ? 's' : ''} hidden. Use --archived to view)`));
93
+ }
94
+ }
95
+ }
96
+ }
@@ -0,0 +1,18 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class ProjectSpec extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ projectId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ add: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ remove: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ };
14
+ protected getPMOOptions(): {
15
+ promptIfMultiple: boolean;
16
+ };
17
+ execute(): Promise<void>;
18
+ }
@@ -0,0 +1,216 @@
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 ProjectSpec extends PMOCommand {
7
+ static description = 'Manage specs associated with a project (many-to-many)';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %> my-project',
10
+ '<%= config.bin %> <%= command.id %> my-project --add SPEC-001',
11
+ '<%= config.bin %> <%= command.id %> my-project --remove SPEC-001',
12
+ '<%= config.bin %> <%= command.id %>',
13
+ ];
14
+ static args = {
15
+ projectId: Args.string({
16
+ description: 'Project ID',
17
+ required: false,
18
+ }),
19
+ };
20
+ static flags = {
21
+ ...pmoBaseFlags,
22
+ add: Flags.string({
23
+ char: 'a',
24
+ description: 'Add a spec to this project',
25
+ }),
26
+ remove: Flags.string({
27
+ char: 'r',
28
+ description: 'Remove a spec from this project',
29
+ }),
30
+ json: Flags.boolean({
31
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
32
+ default: false,
33
+ }),
34
+ };
35
+ getPMOOptions() {
36
+ return { promptIfMultiple: false };
37
+ }
38
+ async execute() {
39
+ const { args, flags } = await this.parse(ProjectSpec);
40
+ // Check if JSON output mode is active
41
+ const jsonMode = shouldOutputJson(flags);
42
+ // Helper to handle errors in JSON mode
43
+ const handleError = (code, message) => {
44
+ if (jsonMode) {
45
+ outputErrorAsJson(code, message, createMetadata('project spec', flags));
46
+ this.exit(1);
47
+ }
48
+ this.error(message);
49
+ };
50
+ // Get all projects
51
+ const projects = await this.storage.listProjects();
52
+ if (projects.length === 0) {
53
+ if (jsonMode) {
54
+ outputErrorAsJson('NO_PROJECTS', 'No projects found. Create one with: prlt project create', createMetadata('project spec', flags));
55
+ return;
56
+ }
57
+ this.log(styles.muted('\nNo projects found. Create one with: prlt project create'));
58
+ return;
59
+ }
60
+ let projectId = args.projectId;
61
+ // If no project ID provided, prompt for selection
62
+ if (!projectId) {
63
+ // In JSON mode, output project selection prompt
64
+ if (jsonMode) {
65
+ const projectChoices = projects.map(p => ({ name: `${p.id} - ${p.name} (${p.status})`, value: p.id }));
66
+ outputPromptAsJson(buildPromptConfig('list', 'projectId', 'Select project:', projectChoices), createMetadata('project spec', flags));
67
+ return;
68
+ }
69
+ const { selected } = await inquirer.prompt([{
70
+ type: 'list',
71
+ name: 'selected',
72
+ message: 'Select project:',
73
+ choices: projects.map(p => ({
74
+ name: `${p.id} - ${p.name} (${p.status})`,
75
+ value: p.id,
76
+ })),
77
+ }]);
78
+ projectId = selected;
79
+ }
80
+ // Validate project exists
81
+ const project = projects.find(p => p.id === projectId);
82
+ if (!project) {
83
+ return handleError('PROJECT_NOT_FOUND', `Project not found: ${projectId}`);
84
+ }
85
+ // Get specs currently associated with this project
86
+ const projectSpecs = await this.storage.getSpecsForProject(projectId);
87
+ const projectSpecIds = new Set(projectSpecs.map(s => s.id));
88
+ // Handle add flag
89
+ if (flags.add) {
90
+ const spec = await this.storage.getSpec(flags.add);
91
+ if (!spec) {
92
+ this.error(`Spec not found: ${flags.add}`);
93
+ }
94
+ if (projectSpecIds.has(flags.add)) {
95
+ this.log(styles.muted(`\nSpec "${flags.add}" is already associated with project "${projectId}".`));
96
+ }
97
+ else {
98
+ await this.storage.linkProjectToSpec(projectId, flags.add);
99
+ this.log(styles.success(`\nAdded spec ${styles.emphasis(flags.add)} to project ${styles.emphasis(projectId)}`));
100
+ this.log(styles.muted(` Spec: ${spec.title}`));
101
+ }
102
+ return;
103
+ }
104
+ // Handle remove flag
105
+ if (flags.remove) {
106
+ if (!projectSpecIds.has(flags.remove)) {
107
+ this.log(styles.muted(`\nSpec "${flags.remove}" is not associated with project "${projectId}".`));
108
+ }
109
+ else {
110
+ await this.storage.unlinkProjectFromSpec(projectId, flags.remove);
111
+ this.log(styles.success(`\nRemoved spec ${styles.emphasis(flags.remove)} from project ${styles.emphasis(projectId)}`));
112
+ }
113
+ return;
114
+ }
115
+ // Interactive mode: show menu
116
+ // In JSON mode, output the menu prompt (no loop - AI will call back)
117
+ if (jsonMode) {
118
+ const currentSpecs = await this.storage.getSpecsForProject(projectId);
119
+ const menuChoices = [
120
+ { name: 'Add spec to project', value: 'add' },
121
+ { name: 'Remove spec from project', value: 'remove' },
122
+ { name: 'Done', value: 'done' },
123
+ ];
124
+ outputPromptAsJson({
125
+ ...buildPromptConfig('list', 'action', `Manage specs for ${projectId}:`, menuChoices),
126
+ context: {
127
+ projectId,
128
+ currentSpecs: currentSpecs.map(s => ({ id: s.id, title: s.title, status: s.status })),
129
+ },
130
+ }, createMetadata('project spec', flags));
131
+ return;
132
+ }
133
+ let continueLoop = true;
134
+ while (continueLoop) {
135
+ // Refresh project specs each iteration
136
+ const currentSpecs = await this.storage.getSpecsForProject(projectId);
137
+ const currentSpecIds = new Set(currentSpecs.map(s => s.id));
138
+ this.log(styles.title(`\nSpecs for project "${project.name}" (${projectId})`));
139
+ if (currentSpecs.length === 0) {
140
+ this.log(styles.muted(' No specs associated with this project.'));
141
+ }
142
+ else {
143
+ for (const spec of currentSpecs) {
144
+ this.log(` ${styles.code(spec.id)} - ${spec.title} (${spec.status})`);
145
+ }
146
+ }
147
+ const { action } = await inquirer.prompt([{
148
+ type: 'list',
149
+ name: 'action',
150
+ message: `Manage specs for ${projectId}:`,
151
+ choices: [
152
+ { name: 'Add spec to project', value: 'add' },
153
+ { name: 'Remove spec from project', value: 'remove' },
154
+ new inquirer.Separator(),
155
+ { name: 'Done', value: 'done' },
156
+ ],
157
+ }]);
158
+ if (action === 'done') {
159
+ continueLoop = false;
160
+ continue;
161
+ }
162
+ if (action === 'add') {
163
+ // Get all specs not already associated
164
+ const allSpecs = await this.storage.listSpecs();
165
+ const availableSpecs = allSpecs.filter(s => !currentSpecIds.has(s.id));
166
+ if (availableSpecs.length === 0) {
167
+ this.log(styles.muted('\n All specs are already associated with this project.'));
168
+ continue;
169
+ }
170
+ const { selected } = await inquirer.prompt([{
171
+ type: 'checkbox',
172
+ name: 'selected',
173
+ message: 'Select specs to add:',
174
+ choices: availableSpecs.map(s => ({
175
+ name: `${s.id} - ${s.title} (${s.status})`,
176
+ value: s.id,
177
+ })),
178
+ }]);
179
+ if (selected.length === 0) {
180
+ this.log(styles.muted(' No specs selected.'));
181
+ continue;
182
+ }
183
+ for (const specId of selected) {
184
+ await this.storage.linkProjectToSpec(projectId, specId);
185
+ this.log(styles.success(` Added ${specId}`));
186
+ }
187
+ continue;
188
+ }
189
+ if (action === 'remove') {
190
+ if (currentSpecs.length === 0) {
191
+ this.log(styles.muted('\n No specs to remove.'));
192
+ continue;
193
+ }
194
+ const { selected } = await inquirer.prompt([{
195
+ type: 'checkbox',
196
+ name: 'selected',
197
+ message: 'Select specs to remove:',
198
+ choices: currentSpecs.map(s => ({
199
+ name: `${s.id} - ${s.title} (${s.status})`,
200
+ value: s.id,
201
+ })),
202
+ }]);
203
+ if (selected.length === 0) {
204
+ this.log(styles.muted(' No specs selected.'));
205
+ continue;
206
+ }
207
+ for (const specId of selected) {
208
+ await this.storage.unlinkProjectFromSpec(projectId, specId);
209
+ this.log(styles.success(` Removed ${specId}`));
210
+ }
211
+ continue;
212
+ }
213
+ }
214
+ this.log(styles.muted(`\nView project: prlt project view ${projectId}`));
215
+ }
216
+ }
@@ -0,0 +1,15 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class ProjectUnarchive extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
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
+ }
@@ -0,0 +1,35 @@
1
+ import { Args } from '@oclif/core';
2
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
3
+ import { styles } from '../../lib/styles.js';
4
+ export default class ProjectUnarchive extends PMOCommand {
5
+ static description = 'Unarchive a project (restore to default views)';
6
+ static examples = [
7
+ '<%= config.bin %> <%= command.id %> old-project',
8
+ ];
9
+ static args = {
10
+ id: Args.string({
11
+ description: 'Project ID',
12
+ required: true,
13
+ }),
14
+ };
15
+ static flags = {
16
+ ...pmoBaseFlags,
17
+ };
18
+ getPMOOptions() {
19
+ return { promptIfMultiple: false };
20
+ }
21
+ async execute() {
22
+ const { args } = await this.parse(ProjectUnarchive);
23
+ const project = await this.storage.getProject(args.id);
24
+ if (!project) {
25
+ this.error(`Project "${args.id}" not found.`);
26
+ }
27
+ if (!project.isArchived) {
28
+ this.log(styles.muted(`Project "${project.name}" is not archived.`));
29
+ return;
30
+ }
31
+ await this.storage.unarchiveProject(args.id);
32
+ this.log(styles.success(`\nUnarchived project "${project.name}"`));
33
+ this.log(styles.muted('View project: prlt project view ' + args.id));
34
+ }
35
+ }
@@ -0,0 +1,16 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class ProjectView 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
+ 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
+ }