@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,63 @@
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 SpecLinkDuplicates extends PMOCommand {
7
+ static description = 'Mark a spec as duplicate of another';
8
+ static examples = ['<%= config.bin %> <%= command.id %> my-feature other-spec'];
9
+ static args = {
10
+ id: Args.string({ description: 'Duplicate spec ID', required: true }),
11
+ original: Args.string({ description: 'Original spec ID', required: false }),
12
+ };
13
+ static flags = {
14
+ ...pmoBaseFlags,
15
+ json: Flags.boolean({
16
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
17
+ default: false,
18
+ }),
19
+ };
20
+ async execute() {
21
+ const { args, flags } = await this.parse(SpecLinkDuplicates);
22
+ // Check if JSON output mode is active
23
+ const jsonMode = shouldOutputJson(flags);
24
+ // Helper to handle errors in JSON mode
25
+ const handleError = (code, message) => {
26
+ if (jsonMode) {
27
+ outputErrorAsJson(code, message, createMetadata('spec link duplicates', flags));
28
+ this.exit(1);
29
+ }
30
+ this.error(message);
31
+ };
32
+ const spec = await this.storage.getSpec(args.id);
33
+ if (!spec)
34
+ return handleError('SPEC_NOT_FOUND', `Spec not found: ${args.id}`);
35
+ let originalId = args.original;
36
+ if (!originalId) {
37
+ const allSpecs = await this.storage.listSpecs();
38
+ const otherSpecs = allSpecs.filter(s => s.id !== args.id);
39
+ if (otherSpecs.length === 0) {
40
+ if (jsonMode) {
41
+ outputErrorAsJson('NO_OTHER_SPECS', 'No other specs.', createMetadata('spec link duplicates', flags));
42
+ return;
43
+ }
44
+ this.log(styles.muted('\nNo other specs.'));
45
+ return;
46
+ }
47
+ // In JSON mode, output spec selection prompt
48
+ if (jsonMode) {
49
+ const specChoices = otherSpecs.map(s => ({ name: `${s.id} - ${s.title}`, value: s.id }));
50
+ outputPromptAsJson(buildPromptConfig('list', 'original', `Select the original spec (${args.id} is a duplicate of):`, specChoices), createMetadata('spec link duplicates', flags));
51
+ return;
52
+ }
53
+ const { selected } = await inquirer.prompt([{ type: 'list', name: 'selected', message: `Select the original spec (${args.id} is a duplicate of):`,
54
+ choices: otherSpecs.map(s => ({ name: `${s.id} - ${s.title}`, value: s.id })) }]);
55
+ originalId = selected;
56
+ }
57
+ const originalSpec = await this.storage.getSpec(originalId);
58
+ if (!originalSpec)
59
+ this.error(`Spec not found: ${originalId}`);
60
+ await this.storage.createSpecDependency(args.id, originalId, 'duplicates');
61
+ this.log(styles.success(`\n✅ ${styles.emphasis(args.id)} duplicates ${styles.emphasis(originalId)}`));
62
+ }
63
+ }
@@ -0,0 +1,19 @@
1
+ import { PMOCommand } from '../../../lib/pmo/index.js';
2
+ export default class SpecLink 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
+ depends: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ relates: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ duplicates: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ };
16
+ execute(): Promise<void>;
17
+ private addDependency;
18
+ private viewDependencies;
19
+ }
@@ -0,0 +1,200 @@
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 SpecLink extends PMOCommand {
7
+ static description = 'Manage spec dependencies (links)';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %> my-feature # List dependencies',
10
+ '<%= config.bin %> <%= command.id %> my-feature --depends other-spec # my-feature depends on other-spec',
11
+ '<%= config.bin %> <%= command.id %> my-feature --relates other-spec # my-feature relates to other-spec',
12
+ '<%= config.bin %> <%= command.id %> my-feature --duplicates other-spec',
13
+ '<%= config.bin %> <%= command.id %> my-feature --all # Show all links',
14
+ ];
15
+ static args = {
16
+ id: Args.string({ description: 'Spec ID', required: false }),
17
+ };
18
+ static flags = {
19
+ ...pmoBaseFlags,
20
+ json: Flags.boolean({
21
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
22
+ default: false,
23
+ }),
24
+ depends: Flags.string({ char: 'd', description: 'Add depends_on dependency' }),
25
+ relates: Flags.string({ char: 'r', description: 'Add relates_to dependency' }),
26
+ duplicates: Flags.string({ description: 'Add duplicates dependency' }),
27
+ all: Flags.boolean({ char: 'a', description: 'Show all dependencies', default: false }),
28
+ };
29
+ async execute() {
30
+ const { args, flags } = await this.parse(SpecLink);
31
+ // Check if JSON output mode is active
32
+ const jsonMode = shouldOutputJson(flags);
33
+ let specId = args.id;
34
+ if (!specId) {
35
+ const specs = await this.storage.listSpecs();
36
+ if (specs.length === 0) {
37
+ if (jsonMode) {
38
+ outputErrorAsJson('NO_SPECS', 'No specs found.', createMetadata('spec link', flags));
39
+ return;
40
+ }
41
+ this.log(styles.muted('\nNo specs found.'));
42
+ return;
43
+ }
44
+ // In JSON mode, output spec selection prompt
45
+ if (jsonMode) {
46
+ const specChoices = specs.map(s => ({ name: `${s.id} - ${s.title}`, value: s.id }));
47
+ outputPromptAsJson(buildPromptConfig('list', 'id', 'Select spec to manage dependencies:', specChoices), createMetadata('spec link', flags));
48
+ return;
49
+ }
50
+ const { selected } = await inquirer.prompt([{
51
+ type: 'list',
52
+ name: 'selected',
53
+ message: 'Select spec to manage dependencies:',
54
+ choices: specs.map(s => ({ name: `${s.id} - ${s.title}`, value: s.id })),
55
+ }]);
56
+ specId = selected;
57
+ }
58
+ const spec = await this.storage.getSpec(specId);
59
+ if (!spec)
60
+ this.error(`Spec not found: ${specId}`);
61
+ // If a dependency flag is provided, add the dependency directly
62
+ if (flags.depends || flags.relates || flags.duplicates) {
63
+ const targetId = flags.depends || flags.relates || flags.duplicates;
64
+ const dependencyType = flags.depends ? 'depends_on' :
65
+ flags.relates ? 'relates_to' : 'duplicates';
66
+ await this.addDependency(specId, targetId, dependencyType, spec.title);
67
+ return;
68
+ }
69
+ // Interactive mode: show menu in a loop
70
+ let continueLoop = true;
71
+ while (continueLoop) {
72
+ const allSpecs = await this.storage.listSpecs();
73
+ const otherSpecs = allSpecs.filter(s => s.id !== specId);
74
+ const { action } = await inquirer.prompt([{
75
+ type: 'list',
76
+ name: 'action',
77
+ message: `Dependencies for ${spec.id}:`,
78
+ choices: [
79
+ { name: 'View dependencies', value: 'view' },
80
+ { name: 'Add depends_on dependency', value: 'depends_on' },
81
+ { name: 'Add relates_to dependency', value: 'relates_to' },
82
+ { name: 'Add duplicates dependency', value: 'duplicates' },
83
+ new inquirer.Separator(),
84
+ { name: 'Remove dependency', value: 'remove' },
85
+ { name: 'Done', value: 'done' },
86
+ ],
87
+ }]);
88
+ if (action === 'done') {
89
+ continueLoop = false;
90
+ continue;
91
+ }
92
+ if (action === 'view') {
93
+ await this.viewDependencies(specId, spec, flags.all);
94
+ continue;
95
+ }
96
+ if (action === 'remove') {
97
+ const dependencies = await this.storage.listSpecDependencies(specId);
98
+ if (dependencies.length === 0) {
99
+ this.log(styles.muted('\nNo dependencies to remove.'));
100
+ continue;
101
+ }
102
+ const choices = await Promise.all(dependencies.map(async (dep) => {
103
+ const depSpec = await this.storage.getSpec(dep.dependsOnSpecId);
104
+ return {
105
+ name: `${dep.dependsOnSpecId} - ${depSpec?.title || 'Unknown'} (${dep.dependencyType})`,
106
+ value: { targetId: dep.dependsOnSpecId, type: dep.dependencyType }
107
+ };
108
+ }));
109
+ const { selected } = await inquirer.prompt([{
110
+ type: 'list',
111
+ name: 'selected',
112
+ message: 'Select dependency to remove:',
113
+ choices,
114
+ }]);
115
+ await this.storage.deleteSpecDependency(specId, selected.targetId, selected.type);
116
+ this.log(styles.success(`\n✅ Removed dependency: ${specId} → ${selected.targetId}`));
117
+ continue;
118
+ }
119
+ // Add dependency
120
+ if (otherSpecs.length === 0) {
121
+ this.log(styles.muted('\nNo other specs to link to.'));
122
+ continue;
123
+ }
124
+ const { targetId } = await inquirer.prompt([{
125
+ type: 'list',
126
+ name: 'targetId',
127
+ message: `Select spec that ${specId} ${action === 'depends_on' ? 'depends on' : action === 'relates_to' ? 'relates to' : 'duplicates'}:`,
128
+ choices: otherSpecs.map(s => ({ name: `${s.id} - ${s.title}`, value: s.id })),
129
+ }]);
130
+ await this.addDependency(specId, targetId, action, spec.title);
131
+ }
132
+ }
133
+ async addDependency(specId, targetId, dependencyType, specTitle) {
134
+ const targetSpec = await this.storage.getSpec(targetId);
135
+ if (!targetSpec) {
136
+ this.error(`Spec not found: ${targetId}`);
137
+ }
138
+ try {
139
+ await this.storage.createSpecDependency(specId, targetId, dependencyType);
140
+ const typeLabel = dependencyType === 'depends_on' ? 'depends on' :
141
+ dependencyType === 'relates_to' ? 'relates to' : 'duplicates';
142
+ this.log(styles.success(`\n✅ ${styles.emphasis(specId)} ${typeLabel} ${styles.emphasis(targetId)}`));
143
+ this.log(styles.muted(` ${specTitle}`));
144
+ this.log(styles.muted(` ${typeLabel} ${targetSpec.title}`));
145
+ }
146
+ catch (error) {
147
+ if (error instanceof Error) {
148
+ if (error.message.includes('already exists')) {
149
+ this.error('Dependency already exists');
150
+ }
151
+ if (error.message.includes('self-dependency')) {
152
+ this.error('Cannot create self-dependency');
153
+ }
154
+ }
155
+ throw error;
156
+ }
157
+ }
158
+ async viewDependencies(specId, spec, showAll) {
159
+ const dependencies = await this.storage.listSpecDependencies(specId);
160
+ this.log(`\n${styles.emphasis(spec.id)}: ${spec.title}`);
161
+ const dependsOn = dependencies.filter(d => d.dependencyType === 'depends_on');
162
+ if (dependsOn.length > 0) {
163
+ this.log(styles.muted('\n Depends on:'));
164
+ for (const dep of dependsOn) {
165
+ const depSpec = await this.storage.getSpec(dep.dependsOnSpecId);
166
+ if (depSpec)
167
+ this.log(` - ${depSpec.id}: ${depSpec.title}`);
168
+ }
169
+ }
170
+ const otherDeps = dependencies.filter(d => d.dependencyType !== 'depends_on');
171
+ if (otherDeps.length > 0) {
172
+ this.log(styles.muted('\n Related:'));
173
+ for (const dep of otherDeps) {
174
+ const relatedSpec = await this.storage.getSpec(dep.dependsOnSpecId);
175
+ if (relatedSpec)
176
+ this.log(` - ${dep.dependencyType}: ${relatedSpec.id} - ${relatedSpec.title}`);
177
+ }
178
+ }
179
+ if (showAll) {
180
+ const allSpecs = await this.storage.listSpecs();
181
+ const dependedBy = [];
182
+ for (const otherSpec of allSpecs) {
183
+ if (otherSpec.id === specId)
184
+ continue;
185
+ const otherDeps = await this.storage.listSpecDependencies(otherSpec.id);
186
+ const dep = otherDeps.find(d => d.dependsOnSpecId === specId);
187
+ if (dep)
188
+ dependedBy.push({ spec: otherSpec, type: dep.dependencyType });
189
+ }
190
+ if (dependedBy.length > 0) {
191
+ this.log(styles.muted('\n Depended by:'));
192
+ for (const { spec: depSpec, type } of dependedBy)
193
+ this.log(` - ${depSpec.id}: ${depSpec.title} (${type})`);
194
+ }
195
+ }
196
+ if (dependencies.length === 0)
197
+ this.log(styles.muted('\n No dependencies.'));
198
+ this.log('');
199
+ }
200
+ }
@@ -0,0 +1,14 @@
1
+ import { PMOCommand } from '../../../lib/pmo/index.js';
2
+ export default class SpecLinkRelates 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
+ target: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
8
+ };
9
+ static flags: {
10
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ };
13
+ execute(): Promise<void>;
14
+ }
@@ -0,0 +1,63 @@
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 SpecLinkRelates extends PMOCommand {
7
+ static description = 'Add a relates_to dependency (informational link)';
8
+ static examples = ['<%= config.bin %> <%= command.id %> my-feature other-spec'];
9
+ static args = {
10
+ id: Args.string({ description: 'Spec ID', required: true }),
11
+ target: Args.string({ description: 'Related spec ID', required: false }),
12
+ };
13
+ static flags = {
14
+ ...pmoBaseFlags,
15
+ json: Flags.boolean({
16
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
17
+ default: false,
18
+ }),
19
+ };
20
+ async execute() {
21
+ const { args, flags } = await this.parse(SpecLinkRelates);
22
+ // Check if JSON output mode is active
23
+ const jsonMode = shouldOutputJson(flags);
24
+ // Helper to handle errors in JSON mode
25
+ const handleError = (code, message) => {
26
+ if (jsonMode) {
27
+ outputErrorAsJson(code, message, createMetadata('spec link relates', flags));
28
+ this.exit(1);
29
+ }
30
+ this.error(message);
31
+ };
32
+ const spec = await this.storage.getSpec(args.id);
33
+ if (!spec)
34
+ return handleError('SPEC_NOT_FOUND', `Spec not found: ${args.id}`);
35
+ let targetId = args.target;
36
+ if (!targetId) {
37
+ const allSpecs = await this.storage.listSpecs();
38
+ const otherSpecs = allSpecs.filter(s => s.id !== args.id);
39
+ if (otherSpecs.length === 0) {
40
+ if (jsonMode) {
41
+ outputErrorAsJson('NO_OTHER_SPECS', 'No other specs.', createMetadata('spec link relates', flags));
42
+ return;
43
+ }
44
+ this.log(styles.muted('\nNo other specs.'));
45
+ return;
46
+ }
47
+ // In JSON mode, output spec selection prompt
48
+ if (jsonMode) {
49
+ const specChoices = otherSpecs.map(s => ({ name: `${s.id} - ${s.title}`, value: s.id }));
50
+ outputPromptAsJson(buildPromptConfig('list', 'target', `Select spec that ${args.id} relates to:`, specChoices), createMetadata('spec link relates', flags));
51
+ return;
52
+ }
53
+ const { selected } = await inquirer.prompt([{ type: 'list', name: 'selected', message: `Select spec that ${args.id} relates to:`,
54
+ choices: otherSpecs.map(s => ({ name: `${s.id} - ${s.title}`, value: s.id })) }]);
55
+ targetId = selected;
56
+ }
57
+ const targetSpec = await this.storage.getSpec(targetId);
58
+ if (!targetSpec)
59
+ this.error(`Spec not found: ${targetId}`);
60
+ await this.storage.createSpecDependency(args.id, targetId, 'relates_to');
61
+ this.log(styles.success(`\n✅ ${styles.emphasis(args.id)} relates to ${styles.emphasis(targetId)}`));
62
+ }
63
+ }
@@ -0,0 +1,16 @@
1
+ import { PMOCommand } from '../../../lib/pmo/index.js';
2
+ export default class SpecLinkRemove 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
+ target: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
8
+ };
9
+ static flags: {
10
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ type: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ };
15
+ execute(): Promise<void>;
16
+ }
@@ -0,0 +1,94 @@
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 SpecLinkRemove extends PMOCommand {
7
+ static description = 'Remove a dependency from a spec';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %> my-feature other-spec',
10
+ '<%= config.bin %> <%= command.id %> my-feature --all',
11
+ ];
12
+ static args = {
13
+ id: Args.string({ description: 'Spec ID', required: true }),
14
+ target: Args.string({ description: 'Target spec ID to unlink', required: false }),
15
+ };
16
+ static flags = {
17
+ ...pmoBaseFlags,
18
+ json: Flags.boolean({
19
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
20
+ default: false,
21
+ }),
22
+ type: Flags.string({ char: 't', description: 'Dependency type', options: ['depends_on', 'relates_to', 'duplicates'] }),
23
+ all: Flags.boolean({ char: 'a', description: 'Remove all dependencies', default: false }),
24
+ };
25
+ async execute() {
26
+ const { args, flags } = await this.parse(SpecLinkRemove);
27
+ // Check if JSON output mode is active
28
+ const jsonMode = shouldOutputJson(flags);
29
+ // Helper to handle errors in JSON mode
30
+ const handleError = (code, message) => {
31
+ if (jsonMode) {
32
+ outputErrorAsJson(code, message, createMetadata('spec link remove', flags));
33
+ this.exit(1);
34
+ }
35
+ this.error(message);
36
+ };
37
+ const spec = await this.storage.getSpec(args.id);
38
+ if (!spec)
39
+ return handleError('SPEC_NOT_FOUND', `Spec not found: ${args.id}`);
40
+ const dependencies = await this.storage.listSpecDependencies(args.id);
41
+ if (dependencies.length === 0) {
42
+ if (jsonMode) {
43
+ outputErrorAsJson('NO_DEPENDENCIES', `Spec ${args.id} has no dependencies.`, createMetadata('spec link remove', flags));
44
+ return;
45
+ }
46
+ this.log(styles.muted(`\nSpec ${args.id} has no dependencies.`));
47
+ return;
48
+ }
49
+ if (flags.all) {
50
+ // In JSON mode, output confirmation prompt
51
+ if (jsonMode) {
52
+ const confirmChoices = [
53
+ { name: 'No', value: 'false' },
54
+ { name: 'Yes', value: 'true' },
55
+ ];
56
+ outputPromptAsJson(buildPromptConfig('list', 'confirmed', `Remove all ${dependencies.length} dependencies?`, confirmChoices), createMetadata('spec link remove', flags));
57
+ return;
58
+ }
59
+ const { confirmed } = await inquirer.prompt([{
60
+ type: 'list',
61
+ name: 'confirmed',
62
+ message: `Remove all ${dependencies.length} dependencies?`,
63
+ choices: [
64
+ { name: 'No', value: false },
65
+ { name: 'Yes', value: true },
66
+ ],
67
+ }]);
68
+ if (!confirmed) {
69
+ this.log(styles.muted('\nCancelled.'));
70
+ return;
71
+ }
72
+ for (const dep of dependencies)
73
+ await this.storage.deleteSpecDependency(args.id, dep.dependsOnSpecId, dep.dependencyType);
74
+ this.log(styles.success(`\n✅ Removed ${dependencies.length} dependencies from ${args.id}`));
75
+ return;
76
+ }
77
+ let targetId = args.target;
78
+ if (!targetId) {
79
+ const choices = await Promise.all(dependencies.map(async (dep) => {
80
+ const depSpec = await this.storage.getSpec(dep.dependsOnSpecId);
81
+ return { name: `${dep.dependsOnSpecId} - ${depSpec?.title || 'Unknown'} (${dep.dependencyType})`, value: dep.dependsOnSpecId };
82
+ }));
83
+ // In JSON mode, output dependency selection prompt
84
+ if (jsonMode) {
85
+ outputPromptAsJson(buildPromptConfig('list', 'target', 'Select dependency to remove:', choices), createMetadata('spec link remove', flags));
86
+ return;
87
+ }
88
+ const { selected } = await inquirer.prompt([{ type: 'list', name: 'selected', message: 'Select dependency to remove:', choices }]);
89
+ targetId = selected;
90
+ }
91
+ await this.storage.deleteSpecDependency(args.id, targetId, flags.type);
92
+ this.log(styles.success(`\n✅ Removed dependency: ${args.id} → ${targetId}`));
93
+ }
94
+ }
@@ -0,0 +1,12 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class SpecList extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ status: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
+ type: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ search: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ };
11
+ execute(): Promise<void>;
12
+ }
@@ -0,0 +1,75 @@
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 SpecList extends PMOCommand {
5
+ static description = 'List all specs';
6
+ static examples = [
7
+ '<%= config.bin %> <%= command.id %>',
8
+ '<%= config.bin %> <%= command.id %> --status active',
9
+ '<%= config.bin %> <%= command.id %> --type product',
10
+ ];
11
+ static flags = {
12
+ ...pmoBaseFlags,
13
+ status: Flags.string({
14
+ char: 's',
15
+ description: 'Filter by status',
16
+ options: ['draft', 'active', 'implemented'],
17
+ }),
18
+ type: Flags.string({
19
+ char: 't',
20
+ description: 'Filter by type',
21
+ options: ['product', 'platform', 'infra', 'integration'],
22
+ }),
23
+ search: Flags.string({
24
+ description: 'Search in title/problem/solution',
25
+ }),
26
+ };
27
+ async execute() {
28
+ const { flags } = await this.parse(SpecList);
29
+ // List specs with filters
30
+ const specs = await this.storage.listSpecs({
31
+ status: flags.status,
32
+ type: flags.type,
33
+ search: flags.search,
34
+ });
35
+ if (specs.length === 0) {
36
+ this.log(styles.warning('\nNo specs found'));
37
+ this.log(styles.muted(' Create your first spec: prlt spec create'));
38
+ return;
39
+ }
40
+ // Display specs grouped by status
41
+ this.log(styles.title('\n📄 Specs'));
42
+ this.log(styles.muted('═'.repeat(60)));
43
+ // Group by status
44
+ const byStatus = {};
45
+ for (const spec of specs) {
46
+ if (!byStatus[spec.status])
47
+ byStatus[spec.status] = [];
48
+ byStatus[spec.status].push(spec);
49
+ }
50
+ for (const status of ['draft', 'active', 'implemented']) {
51
+ const statusSpecs = byStatus[status];
52
+ if (!statusSpecs || statusSpecs.length === 0)
53
+ continue;
54
+ const statusEmoji = status === 'draft' ? '📝' : status === 'active' ? '🟢' : '✅';
55
+ this.log(styles.emphasis(`\n${statusEmoji} ${status.toUpperCase()} (${statusSpecs.length})`));
56
+ for (const spec of statusSpecs) {
57
+ const typeTag = spec.type ? ` (${spec.type})` : '';
58
+ const tags = spec.tags && spec.tags.length > 0 ? ` [${spec.tags.join(', ')}]` : '';
59
+ this.log(` ${styles.code(spec.id)}: ${spec.title}${typeTag}${tags}`);
60
+ if (spec.problem) {
61
+ const preview = spec.problem.length > 60
62
+ ? spec.problem.substring(0, 60) + '...'
63
+ : spec.problem;
64
+ this.log(styles.muted(` ${preview}`));
65
+ }
66
+ }
67
+ }
68
+ this.log(styles.muted('\n' + '═'.repeat(60)));
69
+ this.log(styles.emphasis(`Total: ${specs.length} spec${specs.length === 1 ? '' : 's'}`));
70
+ this.log(styles.muted('\nCommands:'));
71
+ this.log(styles.primary(' prlt spec create ') + styles.muted('Create a new spec'));
72
+ this.log(styles.primary(' prlt spec view <id> ') + styles.muted('View spec details'));
73
+ this.log(styles.primary(' prlt spec plan <id> ') + styles.muted('Generate tickets from spec'));
74
+ }
75
+ }
@@ -0,0 +1,15 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class SpecPlan extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ spec: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ spec: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ 'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ };
14
+ execute(): Promise<void>;
15
+ }