@proletariat/cli 0.2.0 → 0.3.1

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 +561 -251
  2. package/bin/dev.cmd +3 -0
  3. package/bin/dev.js +5 -0
  4. package/bin/run.cmd +3 -0
  5. package/bin/run.js +23 -0
  6. package/dist/commands/action/create.d.ts +21 -0
  7. package/dist/commands/action/create.js +126 -0
  8. package/dist/commands/action/delete.d.ts +17 -0
  9. package/dist/commands/action/delete.js +78 -0
  10. package/dist/commands/action/index.d.ts +15 -0
  11. package/dist/commands/action/index.js +107 -0
  12. package/dist/commands/action/list.d.ts +14 -0
  13. package/dist/commands/action/list.js +89 -0
  14. package/dist/commands/action/run.d.ts +19 -0
  15. package/dist/commands/action/run.js +179 -0
  16. package/dist/commands/action/show.d.ts +15 -0
  17. package/dist/commands/action/show.js +47 -0
  18. package/dist/commands/action/update.d.ts +22 -0
  19. package/dist/commands/action/update.js +168 -0
  20. package/dist/commands/agent/index.d.ts +13 -0
  21. package/dist/commands/agent/index.js +131 -0
  22. package/dist/commands/agent/list.d.ts +7 -0
  23. package/dist/commands/agent/list.js +126 -0
  24. package/dist/commands/agent/login.d.ts +16 -0
  25. package/dist/commands/agent/login.js +146 -0
  26. package/dist/commands/agent/rebuild.d.ts +18 -0
  27. package/dist/commands/agent/rebuild.js +133 -0
  28. package/dist/commands/agent/restart.d.ts +17 -0
  29. package/dist/commands/agent/restart.js +116 -0
  30. package/dist/commands/agent/shell.d.ts +23 -0
  31. package/dist/commands/agent/shell.js +378 -0
  32. package/dist/commands/agent/staff/add.d.ts +15 -0
  33. package/dist/commands/agent/staff/add.js +281 -0
  34. package/dist/commands/agent/staff/index.d.ts +14 -0
  35. package/dist/commands/agent/staff/index.js +90 -0
  36. package/dist/commands/agent/staff/list.d.ts +7 -0
  37. package/dist/commands/agent/staff/list.js +90 -0
  38. package/dist/commands/agent/staff/remove.d.ts +16 -0
  39. package/dist/commands/agent/staff/remove.js +137 -0
  40. package/dist/commands/agent/status.d.ts +17 -0
  41. package/dist/commands/agent/status.js +139 -0
  42. package/dist/commands/agent/temp/cleanup.d.ts +23 -0
  43. package/dist/commands/agent/temp/cleanup.js +388 -0
  44. package/dist/commands/agent/temp/index.d.ts +14 -0
  45. package/dist/commands/agent/temp/index.js +82 -0
  46. package/dist/commands/agent/temp/list.d.ts +7 -0
  47. package/dist/commands/agent/temp/list.js +108 -0
  48. package/dist/commands/agent/themes/add-names.d.ts +10 -0
  49. package/dist/commands/agent/themes/add-names.js +67 -0
  50. package/dist/commands/agent/themes/create.d.ts +13 -0
  51. package/dist/commands/agent/themes/create.js +66 -0
  52. package/dist/commands/agent/themes/index.d.ts +9 -0
  53. package/dist/commands/agent/themes/index.js +194 -0
  54. package/dist/commands/agent/themes/list.d.ts +6 -0
  55. package/dist/commands/agent/themes/list.js +41 -0
  56. package/dist/commands/agent/themes/set.d.ts +12 -0
  57. package/dist/commands/agent/themes/set.js +77 -0
  58. package/dist/commands/agent/visit.d.ts +16 -0
  59. package/dist/commands/agent/visit.js +88 -0
  60. package/dist/commands/autocomplete/setup.d.ts +14 -0
  61. package/dist/commands/autocomplete/setup.js +154 -0
  62. package/dist/commands/board/index.d.ts +17 -0
  63. package/dist/commands/board/index.js +255 -0
  64. package/dist/commands/board/watch.d.ts +13 -0
  65. package/dist/commands/board/watch.js +52 -0
  66. package/dist/commands/branch/create.d.ts +50 -0
  67. package/dist/commands/branch/create.js +624 -0
  68. package/dist/commands/branch/index.d.ts +13 -0
  69. package/dist/commands/branch/index.js +50 -0
  70. package/dist/commands/branch/list.d.ts +17 -0
  71. package/dist/commands/branch/list.js +120 -0
  72. package/dist/commands/branch/validate.d.ts +15 -0
  73. package/dist/commands/branch/validate.js +73 -0
  74. package/dist/commands/commit.d.ts +71 -0
  75. package/dist/commands/commit.js +499 -0
  76. package/dist/commands/docker/clean.d.ts +13 -0
  77. package/dist/commands/docker/clean.js +224 -0
  78. package/dist/commands/docker/index.d.ts +19 -0
  79. package/dist/commands/docker/index.js +274 -0
  80. package/dist/commands/docker/list.d.ts +16 -0
  81. package/dist/commands/docker/list.js +200 -0
  82. package/dist/commands/docker/logs.d.ts +14 -0
  83. package/dist/commands/docker/logs.js +118 -0
  84. package/dist/commands/docker/prune.d.ts +14 -0
  85. package/dist/commands/docker/prune.js +211 -0
  86. package/dist/commands/docker/restart.d.ts +14 -0
  87. package/dist/commands/docker/restart.js +129 -0
  88. package/dist/commands/docker/shell.d.ts +14 -0
  89. package/dist/commands/docker/shell.js +103 -0
  90. package/dist/commands/docker/start.d.ts +12 -0
  91. package/dist/commands/docker/start.js +92 -0
  92. package/dist/commands/docker/status.d.ts +7 -0
  93. package/dist/commands/docker/status.js +40 -0
  94. package/dist/commands/docker/stop.d.ts +14 -0
  95. package/dist/commands/docker/stop.js +134 -0
  96. package/dist/commands/docker/sync.d.ts +15 -0
  97. package/dist/commands/docker/sync.js +112 -0
  98. package/dist/commands/epic/activate.d.ts +13 -0
  99. package/dist/commands/epic/activate.js +118 -0
  100. package/dist/commands/epic/archive.d.ts +14 -0
  101. package/dist/commands/epic/archive.js +132 -0
  102. package/dist/commands/epic/create.d.ts +15 -0
  103. package/dist/commands/epic/create.js +137 -0
  104. package/dist/commands/epic/index.d.ts +13 -0
  105. package/dist/commands/epic/index.js +88 -0
  106. package/dist/commands/epic/link/block.d.ts +14 -0
  107. package/dist/commands/epic/link/block.js +79 -0
  108. package/dist/commands/epic/link/duplicates.d.ts +14 -0
  109. package/dist/commands/epic/link/duplicates.js +66 -0
  110. package/dist/commands/epic/link/index.d.ts +19 -0
  111. package/dist/commands/epic/link/index.js +242 -0
  112. package/dist/commands/epic/link/relates.d.ts +14 -0
  113. package/dist/commands/epic/link/relates.js +66 -0
  114. package/dist/commands/epic/link/remove.d.ts +16 -0
  115. package/dist/commands/epic/link/remove.js +89 -0
  116. package/dist/commands/epic/list.d.ts +11 -0
  117. package/dist/commands/epic/list.js +87 -0
  118. package/dist/commands/epic/move.d.ts +15 -0
  119. package/dist/commands/epic/move.js +184 -0
  120. package/dist/commands/epic/progress.d.ts +16 -0
  121. package/dist/commands/epic/progress.js +166 -0
  122. package/dist/commands/epic/project.d.ts +15 -0
  123. package/dist/commands/epic/project.js +219 -0
  124. package/dist/commands/epic/reorder.d.ts +21 -0
  125. package/dist/commands/epic/reorder.js +160 -0
  126. package/dist/commands/epic/spec.d.ts +15 -0
  127. package/dist/commands/epic/spec.js +191 -0
  128. package/dist/commands/epic/ticket.d.ts +18 -0
  129. package/dist/commands/epic/ticket.js +291 -0
  130. package/dist/commands/epic/view.d.ts +13 -0
  131. package/dist/commands/epic/view.js +117 -0
  132. package/dist/commands/execution/index.d.ts +13 -0
  133. package/dist/commands/execution/index.js +70 -0
  134. package/dist/commands/execution/list.d.ts +15 -0
  135. package/dist/commands/execution/list.js +144 -0
  136. package/dist/commands/execution/logs.d.ts +18 -0
  137. package/dist/commands/execution/logs.js +161 -0
  138. package/dist/commands/execution/stop.d.ts +22 -0
  139. package/dist/commands/execution/stop.js +248 -0
  140. package/dist/commands/gh/index.d.ts +9 -0
  141. package/dist/commands/gh/index.js +53 -0
  142. package/dist/commands/gh/login.d.ts +6 -0
  143. package/dist/commands/gh/login.js +57 -0
  144. package/dist/commands/gh/status.d.ts +6 -0
  145. package/dist/commands/gh/status.js +48 -0
  146. package/dist/commands/gh/token.d.ts +6 -0
  147. package/dist/commands/gh/token.js +59 -0
  148. package/dist/commands/init.d.ts +26 -0
  149. package/dist/commands/init.js +200 -0
  150. package/dist/commands/phase/create.d.ts +22 -0
  151. package/dist/commands/phase/create.js +123 -0
  152. package/dist/commands/phase/delete.d.ts +17 -0
  153. package/dist/commands/phase/delete.js +73 -0
  154. package/dist/commands/phase/list.d.ts +12 -0
  155. package/dist/commands/phase/list.js +76 -0
  156. package/dist/commands/phase/move.d.ts +17 -0
  157. package/dist/commands/phase/move.js +115 -0
  158. package/dist/commands/phase/template/apply.d.ts +17 -0
  159. package/dist/commands/phase/template/apply.js +106 -0
  160. package/dist/commands/phase/template/create.d.ts +16 -0
  161. package/dist/commands/phase/template/create.js +58 -0
  162. package/dist/commands/phase/template/delete.d.ts +17 -0
  163. package/dist/commands/phase/template/delete.js +98 -0
  164. package/dist/commands/phase/template/index.d.ts +15 -0
  165. package/dist/commands/phase/template/index.js +128 -0
  166. package/dist/commands/phase/template/list.d.ts +16 -0
  167. package/dist/commands/phase/template/list.js +95 -0
  168. package/dist/commands/phase/template/update.d.ts +17 -0
  169. package/dist/commands/phase/template/update.js +89 -0
  170. package/dist/commands/phase/update.d.ts +23 -0
  171. package/dist/commands/phase/update.js +174 -0
  172. package/dist/commands/pmo/init.d.ts +25 -0
  173. package/dist/commands/pmo/init.js +341 -0
  174. package/dist/commands/pr/create.d.ts +17 -0
  175. package/dist/commands/pr/create.js +242 -0
  176. package/dist/commands/pr/index.d.ts +9 -0
  177. package/dist/commands/pr/index.js +68 -0
  178. package/dist/commands/pr/link.d.ts +14 -0
  179. package/dist/commands/pr/link.js +212 -0
  180. package/dist/commands/pr/status.d.ts +12 -0
  181. package/dist/commands/pr/status.js +161 -0
  182. package/dist/commands/project/archive.d.ts +17 -0
  183. package/dist/commands/project/archive.js +83 -0
  184. package/dist/commands/project/create.d.ts +22 -0
  185. package/dist/commands/project/create.js +143 -0
  186. package/dist/commands/project/delete.d.ts +17 -0
  187. package/dist/commands/project/delete.js +128 -0
  188. package/dist/commands/project/index.d.ts +13 -0
  189. package/dist/commands/project/index.js +64 -0
  190. package/dist/commands/project/list.d.ts +14 -0
  191. package/dist/commands/project/list.js +96 -0
  192. package/dist/commands/project/spec.d.ts +18 -0
  193. package/dist/commands/project/spec.js +216 -0
  194. package/dist/commands/project/unarchive.d.ts +15 -0
  195. package/dist/commands/project/unarchive.js +35 -0
  196. package/dist/commands/project/view.d.ts +16 -0
  197. package/dist/commands/project/view.js +94 -0
  198. package/dist/commands/repo/add.d.ts +21 -0
  199. package/dist/commands/repo/add.js +118 -0
  200. package/dist/commands/repo/index.d.ts +13 -0
  201. package/dist/commands/repo/index.js +114 -0
  202. package/dist/commands/repo/list.d.ts +13 -0
  203. package/dist/commands/repo/list.js +96 -0
  204. package/dist/commands/repo/remove.d.ts +23 -0
  205. package/dist/commands/repo/remove.js +217 -0
  206. package/dist/commands/repo/view.d.ts +15 -0
  207. package/dist/commands/repo/view.js +99 -0
  208. package/dist/commands/session/attach.d.ts +40 -0
  209. package/dist/commands/session/attach.js +307 -0
  210. package/dist/commands/session/index.d.ts +13 -0
  211. package/dist/commands/session/index.js +64 -0
  212. package/dist/commands/session/list.d.ts +21 -0
  213. package/dist/commands/session/list.js +181 -0
  214. package/dist/commands/spec/create.d.ts +19 -0
  215. package/dist/commands/spec/create.js +130 -0
  216. package/dist/commands/spec/index.d.ts +13 -0
  217. package/dist/commands/spec/index.js +68 -0
  218. package/dist/commands/spec/link/depends.d.ts +14 -0
  219. package/dist/commands/spec/link/depends.js +64 -0
  220. package/dist/commands/spec/link/duplicates.d.ts +14 -0
  221. package/dist/commands/spec/link/duplicates.js +63 -0
  222. package/dist/commands/spec/link/index.d.ts +19 -0
  223. package/dist/commands/spec/link/index.js +200 -0
  224. package/dist/commands/spec/link/relates.d.ts +14 -0
  225. package/dist/commands/spec/link/relates.js +63 -0
  226. package/dist/commands/spec/link/remove.d.ts +16 -0
  227. package/dist/commands/spec/link/remove.js +94 -0
  228. package/dist/commands/spec/list.d.ts +12 -0
  229. package/dist/commands/spec/list.js +75 -0
  230. package/dist/commands/spec/plan.d.ts +15 -0
  231. package/dist/commands/spec/plan.js +108 -0
  232. package/dist/commands/spec/ticket.d.ts +18 -0
  233. package/dist/commands/spec/ticket.js +160 -0
  234. package/dist/commands/spec/view.d.ts +15 -0
  235. package/dist/commands/spec/view.js +163 -0
  236. package/dist/commands/status/create.d.ts +21 -0
  237. package/dist/commands/status/create.js +140 -0
  238. package/dist/commands/status/delete.d.ts +13 -0
  239. package/dist/commands/status/delete.js +77 -0
  240. package/dist/commands/status/index.d.ts +14 -0
  241. package/dist/commands/status/index.js +91 -0
  242. package/dist/commands/status/list.d.ts +12 -0
  243. package/dist/commands/status/list.js +93 -0
  244. package/dist/commands/status/move.d.ts +14 -0
  245. package/dist/commands/status/move.js +120 -0
  246. package/dist/commands/status/update.d.ts +20 -0
  247. package/dist/commands/status/update.js +180 -0
  248. package/dist/commands/template/delete.d.ts +15 -0
  249. package/dist/commands/template/delete.js +142 -0
  250. package/dist/commands/template/index.d.ts +10 -0
  251. package/dist/commands/template/index.js +64 -0
  252. package/dist/commands/template/list.d.ts +18 -0
  253. package/dist/commands/template/list.js +157 -0
  254. package/dist/commands/template/phase/apply.d.ts +14 -0
  255. package/dist/commands/template/phase/apply.js +41 -0
  256. package/dist/commands/template/phase/create.d.ts +12 -0
  257. package/dist/commands/template/phase/create.js +29 -0
  258. package/dist/commands/template/phase/delete.d.ts +13 -0
  259. package/dist/commands/template/phase/delete.js +34 -0
  260. package/dist/commands/template/phase/index.d.ts +10 -0
  261. package/dist/commands/template/phase/index.js +62 -0
  262. package/dist/commands/template/phase/list.d.ts +11 -0
  263. package/dist/commands/template/phase/list.js +34 -0
  264. package/dist/commands/template/phase/update.d.ts +13 -0
  265. package/dist/commands/template/phase/update.js +35 -0
  266. package/dist/commands/template/ticket/apply.d.ts +17 -0
  267. package/dist/commands/template/ticket/apply.js +58 -0
  268. package/dist/commands/template/ticket/delete.d.ts +13 -0
  269. package/dist/commands/template/ticket/delete.js +34 -0
  270. package/dist/commands/template/ticket/index.d.ts +10 -0
  271. package/dist/commands/template/ticket/index.js +62 -0
  272. package/dist/commands/template/ticket/list.d.ts +11 -0
  273. package/dist/commands/template/ticket/list.js +34 -0
  274. package/dist/commands/template/ticket/save.d.ts +13 -0
  275. package/dist/commands/template/ticket/save.js +35 -0
  276. package/dist/commands/ticket/bulk.d.ts +13 -0
  277. package/dist/commands/ticket/bulk.js +145 -0
  278. package/dist/commands/ticket/complete.d.ts +16 -0
  279. package/dist/commands/ticket/complete.js +170 -0
  280. package/dist/commands/ticket/create.d.ts +22 -0
  281. package/dist/commands/ticket/create.js +390 -0
  282. package/dist/commands/ticket/delete.d.ts +16 -0
  283. package/dist/commands/ticket/delete.js +178 -0
  284. package/dist/commands/ticket/edit.d.ts +27 -0
  285. package/dist/commands/ticket/edit.js +322 -0
  286. package/dist/commands/ticket/epic.d.ts +20 -0
  287. package/dist/commands/ticket/epic.js +333 -0
  288. package/dist/commands/ticket/index.d.ts +13 -0
  289. package/dist/commands/ticket/index.js +103 -0
  290. package/dist/commands/ticket/link/block.d.ts +14 -0
  291. package/dist/commands/ticket/link/block.js +94 -0
  292. package/dist/commands/ticket/link/duplicates.d.ts +14 -0
  293. package/dist/commands/ticket/link/duplicates.js +93 -0
  294. package/dist/commands/ticket/link/index.d.ts +19 -0
  295. package/dist/commands/ticket/link/index.js +239 -0
  296. package/dist/commands/ticket/link/relates.d.ts +14 -0
  297. package/dist/commands/ticket/link/relates.js +93 -0
  298. package/dist/commands/ticket/link/remove.d.ts +16 -0
  299. package/dist/commands/ticket/link/remove.js +128 -0
  300. package/dist/commands/ticket/list.d.ts +24 -0
  301. package/dist/commands/ticket/list.js +431 -0
  302. package/dist/commands/ticket/move.d.ts +18 -0
  303. package/dist/commands/ticket/move.js +212 -0
  304. package/dist/commands/ticket/project.d.ts +18 -0
  305. package/dist/commands/ticket/project.js +254 -0
  306. package/dist/commands/ticket/reassign.d.ts +19 -0
  307. package/dist/commands/ticket/reassign.js +279 -0
  308. package/dist/commands/ticket/spec.d.ts +18 -0
  309. package/dist/commands/ticket/spec.js +259 -0
  310. package/dist/commands/ticket/status.d.ts +13 -0
  311. package/dist/commands/ticket/status.js +87 -0
  312. package/dist/commands/ticket/template/apply.d.ts +25 -0
  313. package/dist/commands/ticket/template/apply.js +249 -0
  314. package/dist/commands/ticket/template/create.d.ts +19 -0
  315. package/dist/commands/ticket/template/create.js +210 -0
  316. package/dist/commands/ticket/template/delete.d.ts +17 -0
  317. package/dist/commands/ticket/template/delete.js +92 -0
  318. package/dist/commands/ticket/template/index.d.ts +15 -0
  319. package/dist/commands/ticket/template/index.js +118 -0
  320. package/dist/commands/ticket/template/list.d.ts +16 -0
  321. package/dist/commands/ticket/template/list.js +110 -0
  322. package/dist/commands/ticket/template/save.d.ts +14 -0
  323. package/dist/commands/ticket/template/save.js +110 -0
  324. package/dist/commands/ticket/update.d.ts +18 -0
  325. package/dist/commands/ticket/update.js +325 -0
  326. package/dist/commands/ticket/view.d.ts +13 -0
  327. package/dist/commands/ticket/view.js +80 -0
  328. package/dist/commands/whoami.d.ts +9 -0
  329. package/dist/commands/whoami.js +103 -0
  330. package/dist/commands/work/complete.d.ts +13 -0
  331. package/dist/commands/work/complete.js +121 -0
  332. package/dist/commands/work/index.d.ts +13 -0
  333. package/dist/commands/work/index.js +70 -0
  334. package/dist/commands/work/ready.d.ts +24 -0
  335. package/dist/commands/work/ready.js +290 -0
  336. package/dist/commands/work/revise.d.ts +19 -0
  337. package/dist/commands/work/revise.js +377 -0
  338. package/dist/commands/work/spawn-all.d.ts +17 -0
  339. package/dist/commands/work/spawn-all.js +58 -0
  340. package/dist/commands/work/spawn.d.ts +29 -0
  341. package/dist/commands/work/spawn.js +728 -0
  342. package/dist/commands/work/start.d.ts +39 -0
  343. package/dist/commands/work/start.js +1393 -0
  344. package/dist/commands/work/watch.d.ts +31 -0
  345. package/dist/commands/work/watch.js +359 -0
  346. package/dist/commands/workflow/create.d.ts +18 -0
  347. package/dist/commands/workflow/create.js +119 -0
  348. package/dist/commands/workflow/delete.d.ts +17 -0
  349. package/dist/commands/workflow/delete.js +119 -0
  350. package/dist/commands/workflow/index.d.ts +15 -0
  351. package/dist/commands/workflow/index.js +75 -0
  352. package/dist/commands/workflow/list.d.ts +15 -0
  353. package/dist/commands/workflow/list.js +75 -0
  354. package/dist/commands/workflow/switch.d.ts +13 -0
  355. package/dist/commands/workflow/switch.js +117 -0
  356. package/dist/commands/workflow/view.d.ts +16 -0
  357. package/dist/commands/workflow/view.js +114 -0
  358. package/dist/commands/workspace/add.d.ts +12 -0
  359. package/dist/commands/workspace/add.js +74 -0
  360. package/dist/commands/workspace/list.d.ts +9 -0
  361. package/dist/commands/workspace/list.js +153 -0
  362. package/dist/commands/workspace/remove.d.ts +13 -0
  363. package/dist/commands/workspace/remove.js +98 -0
  364. package/dist/commands/workspace/use.d.ts +12 -0
  365. package/dist/commands/workspace/use.js +111 -0
  366. package/dist/hooks/init.d.ts +11 -0
  367. package/dist/hooks/init.js +57 -0
  368. package/dist/index.d.ts +1 -0
  369. package/dist/index.js +1 -0
  370. package/dist/lib/agents/commands.d.ts +189 -0
  371. package/dist/lib/agents/commands.js +893 -0
  372. package/dist/lib/agents/index.d.ts +54 -0
  373. package/dist/lib/agents/index.js +382 -0
  374. package/dist/lib/branch/index.d.ts +120 -0
  375. package/dist/lib/branch/index.js +334 -0
  376. package/dist/lib/colors.d.ts +94 -0
  377. package/dist/lib/colors.js +68 -0
  378. package/dist/lib/commands/docker-command.d.ts +21 -0
  379. package/dist/lib/commands/docker-command.js +27 -0
  380. package/dist/lib/database/index.d.ts +176 -0
  381. package/dist/lib/database/index.js +581 -0
  382. package/dist/lib/docker/resolve.d.ts +38 -0
  383. package/dist/lib/docker/resolve.js +175 -0
  384. package/dist/lib/execution/config.d.ts +150 -0
  385. package/dist/lib/execution/config.js +541 -0
  386. package/dist/lib/execution/devcontainer.d.ts +85 -0
  387. package/dist/lib/execution/devcontainer.js +594 -0
  388. package/dist/lib/execution/index.d.ts +10 -0
  389. package/dist/lib/execution/index.js +10 -0
  390. package/dist/lib/execution/runners.d.ts +53 -0
  391. package/dist/lib/execution/runners.js +1182 -0
  392. package/dist/lib/execution/spawner.d.ts +85 -0
  393. package/dist/lib/execution/spawner.js +548 -0
  394. package/dist/lib/execution/storage.d.ts +159 -0
  395. package/dist/lib/execution/storage.js +425 -0
  396. package/dist/lib/execution/types.d.ts +145 -0
  397. package/dist/lib/execution/types.js +157 -0
  398. package/dist/lib/init/index.d.ts +75 -0
  399. package/dist/lib/init/index.js +355 -0
  400. package/dist/lib/machine-config.d.ts +170 -0
  401. package/dist/lib/machine-config.js +386 -0
  402. package/dist/lib/pmo/base-command.d.ts +195 -0
  403. package/dist/lib/pmo/base-command.js +319 -0
  404. package/dist/lib/pmo/create-spec-folders.d.ts +43 -0
  405. package/dist/lib/pmo/create-spec-folders.js +64 -0
  406. package/dist/lib/pmo/epic-files.d.ts +56 -0
  407. package/dist/lib/pmo/epic-files.js +195 -0
  408. package/dist/lib/pmo/find-pmo.d.ts +14 -0
  409. package/dist/lib/pmo/find-pmo.js +172 -0
  410. package/dist/lib/pmo/index.d.ts +109 -0
  411. package/dist/lib/pmo/index.js +501 -0
  412. package/dist/lib/pmo/markdown.d.ts +31 -0
  413. package/dist/lib/pmo/markdown.js +245 -0
  414. package/dist/lib/pmo/pmo-context.d.ts +27 -0
  415. package/dist/lib/pmo/pmo-context.js +44 -0
  416. package/dist/lib/pmo/schema.d.ts +82 -0
  417. package/dist/lib/pmo/schema.js +531 -0
  418. package/dist/lib/pmo/spec-parser.d.ts +25 -0
  419. package/dist/lib/pmo/spec-parser.js +205 -0
  420. package/dist/lib/pmo/spec-types.d.ts +43 -0
  421. package/dist/lib/pmo/spec-types.js +7 -0
  422. package/dist/lib/pmo/storage/actions.d.ts +34 -0
  423. package/dist/lib/pmo/storage/actions.js +177 -0
  424. package/dist/lib/pmo/storage/base.d.ts +47 -0
  425. package/dist/lib/pmo/storage/base.js +858 -0
  426. package/dist/lib/pmo/storage/dependencies.d.ts +61 -0
  427. package/dist/lib/pmo/storage/dependencies.js +267 -0
  428. package/dist/lib/pmo/storage/epics.d.ts +46 -0
  429. package/dist/lib/pmo/storage/epics.js +243 -0
  430. package/dist/lib/pmo/storage/helpers.d.ts +33 -0
  431. package/dist/lib/pmo/storage/helpers.js +148 -0
  432. package/dist/lib/pmo/storage/index.d.ts +186 -0
  433. package/dist/lib/pmo/storage/index.js +689 -0
  434. package/dist/lib/pmo/storage/phases.d.ts +65 -0
  435. package/dist/lib/pmo/storage/phases.js +392 -0
  436. package/dist/lib/pmo/storage/projects.d.ts +79 -0
  437. package/dist/lib/pmo/storage/projects.js +303 -0
  438. package/dist/lib/pmo/storage/specs.d.ts +77 -0
  439. package/dist/lib/pmo/storage/specs.js +389 -0
  440. package/dist/lib/pmo/storage/statuses.d.ts +63 -0
  441. package/dist/lib/pmo/storage/statuses.js +404 -0
  442. package/dist/lib/pmo/storage/subtasks.d.ts +37 -0
  443. package/dist/lib/pmo/storage/subtasks.js +184 -0
  444. package/dist/lib/pmo/storage/templates.d.ts +40 -0
  445. package/dist/lib/pmo/storage/templates.js +210 -0
  446. package/dist/lib/pmo/storage/tickets.d.ts +57 -0
  447. package/dist/lib/pmo/storage/tickets.js +453 -0
  448. package/dist/lib/pmo/storage/types.d.ts +200 -0
  449. package/dist/lib/pmo/storage/types.js +5 -0
  450. package/dist/lib/pmo/storage/views.d.ts +44 -0
  451. package/dist/lib/pmo/storage/views.js +355 -0
  452. package/dist/lib/pmo/storage-sqlite.d.ts +7 -0
  453. package/dist/lib/pmo/storage-sqlite.js +7 -0
  454. package/dist/lib/pmo/sync-manager.d.ts +92 -0
  455. package/dist/lib/pmo/sync-manager.js +229 -0
  456. package/dist/lib/pmo/types.d.ts +710 -0
  457. package/dist/lib/pmo/types.js +108 -0
  458. package/dist/lib/pmo/utils.d.ts +122 -0
  459. package/dist/lib/pmo/utils.js +174 -0
  460. package/dist/lib/pmo/watcher.d.ts +43 -0
  461. package/dist/lib/pmo/watcher.js +208 -0
  462. package/dist/lib/pr/index.d.ts +150 -0
  463. package/dist/lib/pr/index.js +483 -0
  464. package/dist/lib/prompt-json.d.ts +231 -0
  465. package/dist/lib/prompt-json.js +213 -0
  466. package/dist/lib/repos/index.d.ts +81 -0
  467. package/dist/lib/repos/index.js +679 -0
  468. package/dist/lib/styles.d.ts +98 -0
  469. package/dist/lib/styles.js +195 -0
  470. package/dist/lib/themes.d.ts +128 -0
  471. package/dist/lib/themes.js +301 -0
  472. package/dist/lib/ui/BoardUI.d.ts +21 -0
  473. package/dist/lib/ui/BoardUI.js +85 -0
  474. package/dist/lib/ui/ClaimTicketUI.d.ts +17 -0
  475. package/dist/lib/ui/ClaimTicketUI.js +64 -0
  476. package/dist/lib/ui/CreateTicketUI.d.ts +13 -0
  477. package/dist/lib/ui/CreateTicketUI.js +101 -0
  478. package/dist/lib/workspace.d.ts +66 -0
  479. package/dist/lib/workspace.js +204 -0
  480. package/oclif.manifest.json +10593 -0
  481. package/package.json +103 -56
  482. package/LICENSE +0 -21
  483. package/dist/bin/prlt.d.ts +0 -11
  484. package/dist/bin/prlt.d.ts.map +0 -1
  485. package/dist/bin/prlt.js +0 -144
  486. package/dist/bin/prlt.js.map +0 -1
  487. package/dist/lib/config/index.d.ts +0 -14
  488. package/dist/lib/config/index.d.ts.map +0 -1
  489. package/dist/lib/config/index.js +0 -142
  490. package/dist/lib/config/index.js.map +0 -1
  491. package/dist/lib/config/upgrade.d.ts +0 -2
  492. package/dist/lib/config/upgrade.d.ts.map +0 -1
  493. package/dist/lib/config/upgrade.js +0 -248
  494. package/dist/lib/config/upgrade.js.map +0 -1
  495. package/dist/lib/themes/index.d.ts +0 -8
  496. package/dist/lib/themes/index.d.ts.map +0 -1
  497. package/dist/lib/themes/index.js +0 -80
  498. package/dist/lib/themes/index.js.map +0 -1
  499. package/dist/lib/utils/helpers.d.ts +0 -4
  500. package/dist/lib/utils/helpers.d.ts.map +0 -1
  501. package/dist/lib/utils/helpers.js +0 -39
  502. package/dist/lib/utils/helpers.js.map +0 -1
  503. package/dist/lib/utils/logger.d.ts +0 -4
  504. package/dist/lib/utils/logger.d.ts.map +0 -1
  505. package/dist/lib/utils/logger.js +0 -28
  506. package/dist/lib/utils/logger.js.map +0 -1
  507. package/dist/lib/workspace/index.d.ts +0 -13
  508. package/dist/lib/workspace/index.d.ts.map +0 -1
  509. package/dist/lib/workspace/index.js +0 -116
  510. package/dist/lib/workspace/index.js.map +0 -1
  511. package/dist/lib/worktree/index.d.ts +0 -7
  512. package/dist/lib/worktree/index.d.ts.map +0 -1
  513. package/dist/lib/worktree/index.js +0 -362
  514. package/dist/lib/worktree/index.js.map +0 -1
  515. package/dist/lib/worktree/migrate.d.ts +0 -2
  516. package/dist/lib/worktree/migrate.d.ts.map +0 -1
  517. package/dist/lib/worktree/migrate.js +0 -214
  518. package/dist/lib/worktree/migrate.js.map +0 -1
  519. package/dist/lib/worktree/repair.d.ts +0 -3
  520. package/dist/lib/worktree/repair.d.ts.map +0 -1
  521. package/dist/lib/worktree/repair.js +0 -320
  522. package/dist/lib/worktree/repair.js.map +0 -1
  523. package/dist/types/index.d.ts +0 -57
  524. package/dist/types/index.d.ts.map +0 -1
  525. package/dist/types/index.js +0 -3
  526. package/dist/types/index.js.map +0 -1
@@ -0,0 +1,13 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class Session 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 inquirer from 'inquirer';
3
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
4
+ import { shouldOutputJson, outputPromptAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
5
+ export default class Session extends PMOCommand {
6
+ static description = 'Manage agent tmux sessions (list, attach, detach)';
7
+ static examples = [
8
+ '<%= config.bin %> <%= command.id %>',
9
+ '<%= config.bin %> <%= command.id %> list',
10
+ '<%= config.bin %> <%= command.id %> attach TKT-347-implement',
11
+ ];
12
+ static flags = {
13
+ ...pmoBaseFlags,
14
+ json: Flags.boolean({
15
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
16
+ default: false,
17
+ }),
18
+ };
19
+ getPMOOptions() {
20
+ return { promptIfMultiple: false };
21
+ }
22
+ async execute() {
23
+ const { flags } = await this.parse(Session);
24
+ // Check if JSON output mode is active
25
+ const jsonMode = shouldOutputJson(flags);
26
+ // Define choices
27
+ const menuChoices = [
28
+ { name: 'List active sessions', value: 'list' },
29
+ { name: 'Attach to a session', value: 'attach' },
30
+ { name: 'Cancel', value: 'cancel' },
31
+ ];
32
+ const message = 'Session Management - What would you like to do?';
33
+ // In JSON mode, output menu prompt
34
+ if (jsonMode) {
35
+ outputPromptAsJson(buildPromptConfig('list', 'action', message, menuChoices), createMetadata('session', flags));
36
+ return;
37
+ }
38
+ const { action } = await inquirer.prompt([
39
+ {
40
+ type: 'list',
41
+ name: 'action',
42
+ message: 'šŸ–„ļø ' + message,
43
+ choices: [
44
+ { name: 'šŸ“‹ ' + menuChoices[0].name, value: menuChoices[0].value },
45
+ { name: 'šŸ”— ' + menuChoices[1].name, value: menuChoices[1].value },
46
+ new inquirer.Separator(),
47
+ { name: 'āŒ ' + menuChoices[2].name, value: menuChoices[2].value },
48
+ ],
49
+ },
50
+ ]);
51
+ if (action === 'cancel') {
52
+ return;
53
+ }
54
+ // Run the selected subcommand
55
+ switch (action) {
56
+ case 'list':
57
+ await this.config.runCommand('session:list', []);
58
+ break;
59
+ case 'attach':
60
+ await this.config.runCommand('session:attach', []);
61
+ break;
62
+ }
63
+ }
64
+ }
@@ -0,0 +1,21 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class SessionList extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ all: 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
+ /**
14
+ * Get list of host tmux session names
15
+ */
16
+ private getHostTmuxSessionNames;
17
+ /**
18
+ * Get map of containerId -> tmux session names
19
+ */
20
+ private getContainerTmuxSessionMap;
21
+ }
@@ -0,0 +1,181 @@
1
+ import { Flags } from '@oclif/core';
2
+ import { execSync } from 'node:child_process';
3
+ import * as path from 'node:path';
4
+ import Database from 'better-sqlite3';
5
+ import { styles } from '../../lib/styles.js';
6
+ import { getWorkspaceInfo } from '../../lib/agents/commands.js';
7
+ import { ExecutionStorage } from '../../lib/execution/index.js';
8
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
9
+ export default class SessionList extends PMOCommand {
10
+ static description = 'List active tmux sessions (host and container)';
11
+ static examples = [
12
+ '<%= config.bin %> <%= command.id %>',
13
+ '<%= config.bin %> <%= command.id %> --all',
14
+ ];
15
+ static flags = {
16
+ ...pmoBaseFlags,
17
+ all: Flags.boolean({
18
+ char: 'a',
19
+ description: 'Show all sessions including stale DB records',
20
+ default: false,
21
+ }),
22
+ };
23
+ getPMOOptions() {
24
+ return { promptIfMultiple: false };
25
+ }
26
+ async execute() {
27
+ const { flags } = await this.parse(SessionList);
28
+ // Get workspace info for execution records
29
+ let executionStorage = null;
30
+ let db = null;
31
+ try {
32
+ const workspaceInfo = getWorkspaceInfo();
33
+ const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
34
+ db = new Database(dbPath);
35
+ executionStorage = new ExecutionStorage(db);
36
+ }
37
+ catch {
38
+ this.log('');
39
+ this.log(styles.muted('Not in a workspace. Run from a proletariat HQ directory.'));
40
+ this.log('');
41
+ return;
42
+ }
43
+ try {
44
+ // DB-driven approach: Start with executions, verify tmux sessions exist
45
+ const runningExecutions = executionStorage.listExecutions({ status: 'running' }) || [];
46
+ const startingExecutions = executionStorage.listExecutions({ status: 'starting' }) || [];
47
+ const activeExecutions = [...runningExecutions, ...startingExecutions];
48
+ // Get list of actual tmux sessions for verification
49
+ const hostTmuxSessions = this.getHostTmuxSessionNames();
50
+ const containerTmuxSessions = this.getContainerTmuxSessionMap();
51
+ // Build verified session list from DB records
52
+ const sessions = [];
53
+ for (const exec of activeExecutions) {
54
+ if (!exec.sessionId)
55
+ continue; // Skip executions without sessionId
56
+ const isContainer = exec.environment === 'devcontainer';
57
+ let exists = false;
58
+ let containerId;
59
+ if (isContainer && exec.containerId) {
60
+ // Check if session exists in container
61
+ const containerSessions = containerTmuxSessions.get(exec.containerId);
62
+ exists = containerSessions?.includes(exec.sessionId) ?? false;
63
+ containerId = exec.containerId;
64
+ }
65
+ else {
66
+ // Check if session exists on host
67
+ exists = hostTmuxSessions.includes(exec.sessionId);
68
+ }
69
+ // Only include if session exists, unless --all flag
70
+ if (exists || flags.all) {
71
+ sessions.push({
72
+ sessionId: exec.sessionId,
73
+ ticketId: exec.ticketId,
74
+ agentName: exec.agentName,
75
+ status: exists ? exec.status : 'stale',
76
+ environment: isContainer ? 'container' : 'host',
77
+ containerId,
78
+ exists,
79
+ });
80
+ }
81
+ }
82
+ if (sessions.length > 0) {
83
+ this.log('');
84
+ this.log(styles.header('šŸ–„ļø Active Sessions'));
85
+ this.log('═'.repeat(90));
86
+ this.log(styles.muted(' ' +
87
+ padEnd('Session', 28) +
88
+ padEnd('Ticket', 12) +
89
+ padEnd('Agent', 14) +
90
+ padEnd('Type', 15) +
91
+ 'Status'));
92
+ this.log(' ' + '─'.repeat(80));
93
+ for (const session of sessions) {
94
+ const typeIcon = session.environment === 'container' ? '🐳 container' : 'šŸ’» host';
95
+ const statusColor = session.status === 'running' ? styles.success :
96
+ session.status === 'starting' ? styles.warning :
97
+ session.status === 'stale' ? styles.error : styles.muted;
98
+ this.log(' ' +
99
+ padEnd(session.sessionId, 28) +
100
+ padEnd(session.ticketId, 12) +
101
+ padEnd(session.agentName, 14) +
102
+ padEnd(typeIcon, 15) +
103
+ statusColor(session.status));
104
+ }
105
+ this.log('');
106
+ this.log('═'.repeat(90));
107
+ // Show attach command example
108
+ const firstSession = sessions.find(s => s.exists);
109
+ if (firstSession) {
110
+ this.log(styles.muted('\nCommands:'));
111
+ this.log(styles.muted(` prlt session attach ${firstSession.sessionId} Attach to session`));
112
+ this.log('');
113
+ }
114
+ // Show stale sessions warning
115
+ const staleSessions = sessions.filter(s => !s.exists);
116
+ if (staleSessions.length > 0) {
117
+ this.log(styles.warning(`\nāš ļø ${staleSessions.length} stale session(s) in DB without tmux process.`));
118
+ this.log(styles.muted(' Run `prlt work stop <work-id>` to clean up.'));
119
+ this.log('');
120
+ }
121
+ }
122
+ else {
123
+ this.log('');
124
+ this.log(styles.muted('No active sessions found.'));
125
+ this.log('');
126
+ this.log(styles.muted('Start work with: prlt work start <ticket-id>'));
127
+ this.log('');
128
+ }
129
+ }
130
+ finally {
131
+ db?.close();
132
+ }
133
+ }
134
+ /**
135
+ * Get list of host tmux session names
136
+ */
137
+ getHostTmuxSessionNames() {
138
+ try {
139
+ execSync('which tmux', { stdio: 'pipe' });
140
+ const output = execSync('tmux list-sessions -F "#{session_name}"', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
141
+ if (!output)
142
+ return [];
143
+ return output.split('\n');
144
+ }
145
+ catch {
146
+ return [];
147
+ }
148
+ }
149
+ /**
150
+ * Get map of containerId -> tmux session names
151
+ */
152
+ getContainerTmuxSessionMap() {
153
+ const sessionMap = new Map();
154
+ try {
155
+ const containersOutput = execSync('docker ps --filter "label=devcontainer.local_folder" --format "{{.ID}}"', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
156
+ if (!containersOutput)
157
+ return sessionMap;
158
+ for (const containerId of containersOutput.split('\n')) {
159
+ try {
160
+ const tmuxOutput = execSync(`docker exec ${containerId} tmux list-sessions -F "#{session_name}" 2>/dev/null`, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
161
+ if (tmuxOutput) {
162
+ sessionMap.set(containerId, tmuxOutput.split('\n'));
163
+ }
164
+ }
165
+ catch {
166
+ // Container has no tmux sessions
167
+ }
168
+ }
169
+ }
170
+ catch {
171
+ // Docker not available
172
+ }
173
+ return sessionMap;
174
+ }
175
+ }
176
+ // =============================================================================
177
+ // Helper Functions
178
+ // =============================================================================
179
+ function padEnd(str, length) {
180
+ return str.padEnd(length);
181
+ }
@@ -0,0 +1,19 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class SpecCreate extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ title: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ title: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ status: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
+ type: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ problem: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ interactive: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ };
17
+ execute(): Promise<void>;
18
+ private promptSpecData;
19
+ }
@@ -0,0 +1,130 @@
1
+ import { Flags, Args } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
4
+ import { styles } from '../../lib/styles.js';
5
+ import { slugify } from '../../lib/pmo/utils.js';
6
+ import { shouldOutputJson, outputPromptAsJson, createMetadata, buildFormPromptConfig, } from '../../lib/prompt-json.js';
7
+ export default class SpecCreate extends PMOCommand {
8
+ static description = 'Create a new spec';
9
+ static examples = [
10
+ '<%= config.bin %> <%= command.id %> "User Authentication"',
11
+ '<%= config.bin %> <%= command.id %> --title "API Design" --type product',
12
+ '<%= config.bin %> <%= command.id %> -i # Interactive mode',
13
+ ];
14
+ static args = {
15
+ title: Args.string({
16
+ description: 'Spec title',
17
+ required: false,
18
+ }),
19
+ };
20
+ static flags = {
21
+ ...pmoBaseFlags,
22
+ title: Flags.string({
23
+ char: 't',
24
+ description: 'Spec title',
25
+ }),
26
+ status: Flags.string({
27
+ char: 's',
28
+ description: 'Spec status',
29
+ options: ['draft', 'active', 'implemented'],
30
+ default: 'draft',
31
+ }),
32
+ type: Flags.string({
33
+ description: 'Spec type',
34
+ options: ['product', 'platform', 'infra', 'integration'],
35
+ }),
36
+ problem: Flags.string({
37
+ description: 'Problem statement',
38
+ }),
39
+ interactive: Flags.boolean({
40
+ char: 'i',
41
+ description: 'Interactive mode',
42
+ default: false,
43
+ }),
44
+ json: Flags.boolean({
45
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
46
+ default: false,
47
+ }),
48
+ };
49
+ async execute() {
50
+ const { args, flags } = await this.parse(SpecCreate);
51
+ // Check if JSON output mode is active
52
+ const jsonMode = shouldOutputJson(flags);
53
+ // Get spec data
54
+ let specData;
55
+ if (flags.interactive || (!args.title && !flags.title)) {
56
+ // Build choices once - single source of truth
57
+ const typeChoices = [
58
+ { name: 'Product (user-facing feature)', value: 'product' },
59
+ { name: 'Platform (internal tooling)', value: 'platform' },
60
+ { name: 'Infra (technical infrastructure)', value: 'infra' },
61
+ { name: 'Integration (external service)', value: 'integration' },
62
+ { name: 'None', value: '' },
63
+ ];
64
+ const statusChoices = [
65
+ { name: 'Draft (planning)', value: 'draft' },
66
+ { name: 'Active (in progress)', value: 'active' },
67
+ { name: 'Implemented (complete)', value: 'implemented' },
68
+ ];
69
+ // Define fields once - single source of truth for both JSON and interactive modes
70
+ const fields = [
71
+ { type: 'input', name: 'title', message: 'Spec title:', default: flags.title },
72
+ { type: 'list', name: 'type', message: 'Spec type:', choices: typeChoices, default: flags.type },
73
+ { type: 'list', name: 'status', message: 'Status:', choices: statusChoices, default: flags.status || 'draft' },
74
+ { type: 'input', name: 'problem', message: 'Problem statement (optional):', default: flags.problem },
75
+ ];
76
+ // In JSON mode, output form prompts
77
+ if (jsonMode) {
78
+ outputPromptAsJson(buildFormPromptConfig(fields), createMetadata('spec create', flags));
79
+ }
80
+ specData = await this.promptSpecData(fields);
81
+ }
82
+ else {
83
+ specData = {
84
+ title: args.title || flags.title || 'Untitled Spec',
85
+ status: flags.status || 'draft',
86
+ type: flags.type,
87
+ problem: flags.problem,
88
+ };
89
+ }
90
+ // Generate ID from title
91
+ const specId = slugify(specData.title);
92
+ // Create spec in database
93
+ const spec = await this.storage.createSpec({
94
+ id: specId,
95
+ title: specData.title,
96
+ status: specData.status,
97
+ type: specData.type,
98
+ problem: specData.problem,
99
+ });
100
+ this.log(styles.success(`\nāœ… Created spec "${styles.emphasis(spec.title)}"`));
101
+ this.log(styles.muted(` ID: ${spec.id}`));
102
+ this.log(styles.muted(` Status: ${spec.status}`));
103
+ if (spec.type)
104
+ this.log(styles.muted(` Type: ${spec.type}`));
105
+ this.log(styles.muted(`\nNext steps:`));
106
+ this.log(styles.muted(` 1. prlt spec view ${spec.id}`));
107
+ this.log(styles.muted(` 2. prlt spec edit ${spec.id} (to add details)`));
108
+ this.log(styles.muted(` 3. prlt spec plan ${spec.id} (to generate tickets)`));
109
+ }
110
+ async promptSpecData(fields) {
111
+ // Build inquirer prompts from fields, adding validators
112
+ const answers = await inquirer.prompt(fields.map(field => ({
113
+ ...field,
114
+ // Convert empty string value to undefined for 'type' field
115
+ choices: field.name === 'type' && field.choices
116
+ ? field.choices.map(c => ({ ...c, value: c.value || undefined }))
117
+ : field.choices,
118
+ // Add validator for required title field
119
+ validate: field.name === 'title'
120
+ ? ((input) => input.length > 0 || 'Title is required')
121
+ : undefined,
122
+ })));
123
+ return {
124
+ title: answers.title,
125
+ status: answers.status,
126
+ type: answers.type,
127
+ problem: answers.problem || undefined,
128
+ };
129
+ }
130
+ }
@@ -0,0 +1,13 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class Spec 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,68 @@
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 Spec extends PMOCommand {
5
+ static description = 'Interactive menu for spec 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(Spec);
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 spec', command: 'prlt spec create --json' },
27
+ { id: 'list', name: 'List all specs', command: 'prlt spec list --format json' },
28
+ { id: 'view', name: 'View spec', command: 'prlt spec view --json' },
29
+ { id: 'generate', name: 'Generate tickets from spec', command: 'prlt spec plan --json' },
30
+ { id: 'ticket', name: 'Assign ticket to spec', command: 'prlt spec ticket --json' },
31
+ { id: 'link', name: 'Manage dependencies', command: 'prlt spec link --json' },
32
+ { id: 'cancel', name: 'Cancel', command: '' },
33
+ ];
34
+ const message = 'Spec Operations - What would you like to do?';
35
+ const action = await this.selectFromList({
36
+ message: 'šŸ“„ ' + message,
37
+ items: menuChoices,
38
+ getName: (c) => c.name,
39
+ getValue: (c) => c.id,
40
+ getCommand: (c) => c.command,
41
+ jsonMode: jsonMode ? { flags, commandName: 'spec' } : null,
42
+ });
43
+ if (action === 'cancel' || !action) {
44
+ return;
45
+ }
46
+ // Run the selected subcommand
47
+ switch (action) {
48
+ case 'create':
49
+ await this.config.runCommand('spec:create', []);
50
+ break;
51
+ case 'list':
52
+ await this.config.runCommand('spec:list', []);
53
+ break;
54
+ case 'view':
55
+ await this.config.runCommand('spec:view', []);
56
+ break;
57
+ case 'generate':
58
+ await this.config.runCommand('spec:generate-tickets', []);
59
+ break;
60
+ case 'ticket':
61
+ await this.config.runCommand('spec:ticket', []);
62
+ break;
63
+ case 'link':
64
+ await this.config.runCommand('spec:link', []);
65
+ break;
66
+ }
67
+ }
68
+ }
@@ -0,0 +1,14 @@
1
+ import { PMOCommand } from '../../../lib/pmo/index.js';
2
+ export default class SpecLinkDepends 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,64 @@
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 SpecLinkDepends extends PMOCommand {
7
+ static description = 'Add a depends_on dependency (spec requires another to be completed first)';
8
+ static examples = ['<%= config.bin %> <%= command.id %> my-feature other-spec'];
9
+ static args = {
10
+ id: Args.string({ description: 'Spec ID that depends on another', required: true }),
11
+ target: Args.string({ description: 'Spec ID that this spec depends on', 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(SpecLinkDepends);
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 depends', 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 depends', 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} depends on:`, specChoices), createMetadata('spec link depends', flags));
51
+ return;
52
+ }
53
+ const { selected } = await inquirer.prompt([{ type: 'list', name: 'selected', message: `Select spec that ${args.id} depends on:`,
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, 'depends_on');
61
+ this.log(styles.success(`\nāœ… ${styles.emphasis(args.id)} depends on ${styles.emphasis(targetId)}`));
62
+ this.log(styles.muted(` ${spec.title} depends on: ${targetSpec.title}`));
63
+ }
64
+ }
@@ -0,0 +1,14 @@
1
+ import { PMOCommand } from '../../../lib/pmo/index.js';
2
+ export default class SpecLinkDuplicates 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
+ original: 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
+ }