@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,110 @@
1
+ import { Flags, Args } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { PMOCommand, pmoBaseFlags } from '../../../lib/pmo/index.js';
4
+ import { styles } from '../../../lib/styles.js';
5
+ export default class TicketTemplateSave extends PMOCommand {
6
+ static description = 'Create a template from an existing ticket';
7
+ static examples = [
8
+ '<%= config.bin %> <%= command.id %> TKT-001 "Bug Report Template"',
9
+ '<%= config.bin %> <%= command.id %> TKT-042 "Feature Request" --description "Standard feature request template"',
10
+ ];
11
+ static args = {
12
+ ticket: Args.string({
13
+ description: 'Ticket ID to create template from',
14
+ required: false,
15
+ }),
16
+ name: Args.string({
17
+ description: 'Template name',
18
+ required: false,
19
+ }),
20
+ };
21
+ static flags = {
22
+ ...pmoBaseFlags,
23
+ description: Flags.string({
24
+ char: 'd',
25
+ description: 'Template description',
26
+ }),
27
+ };
28
+ async execute() {
29
+ const { args, flags } = await this.parse(TicketTemplateSave);
30
+ // Get ticket ID - prompt with picker if not provided
31
+ let ticketId = args.ticket;
32
+ if (!ticketId) {
33
+ const projectId = await this.requireProject();
34
+ const tickets = await this.storage.listTickets(projectId);
35
+ if (tickets.length === 0) {
36
+ this.error('No tickets found in this project.\nCreate a ticket first: prlt ticket create');
37
+ }
38
+ const { selectedTicket } = await inquirer.prompt([{
39
+ type: 'list',
40
+ name: 'selectedTicket',
41
+ message: 'Select a ticket to save as template:',
42
+ choices: tickets.slice(0, 20).map(t => ({
43
+ name: `${t.id} - ${t.title}`,
44
+ value: t.id,
45
+ })),
46
+ }]);
47
+ ticketId = selectedTicket;
48
+ }
49
+ // Verify ticket exists
50
+ const ticket = await this.storage.getTicket(ticketId);
51
+ if (!ticket) {
52
+ this.error(`Ticket not found: ${ticketId}\nRun 'prlt ticket list' to see available tickets.`);
53
+ }
54
+ // Get template name - prompt if not provided
55
+ let templateName = args.name;
56
+ if (!templateName) {
57
+ const { name } = await inquirer.prompt([{
58
+ type: 'input',
59
+ name: 'name',
60
+ message: 'Template name:',
61
+ default: ticket.category || ticket.title.split(' ')[0],
62
+ validate: (input) => input.length > 0 || 'Name is required',
63
+ }]);
64
+ templateName = name;
65
+ }
66
+ // Get description if not provided
67
+ let description = flags.description;
68
+ if (description === undefined) {
69
+ const { desc } = await inquirer.prompt([{
70
+ type: 'input',
71
+ name: 'desc',
72
+ message: 'Description (optional):',
73
+ }]);
74
+ description = desc || undefined;
75
+ }
76
+ // Create template from ticket
77
+ const template = await this.storage.createTicketTemplateFromTicket(ticketId, templateName, description);
78
+ this.log(styles.success(`\nCreated template "${styles.emphasis(template.name)}" from ticket ${ticketId}`));
79
+ this.log(styles.muted(` ID: ${template.id}`));
80
+ if (template.description) {
81
+ this.log(styles.muted(` Description: ${template.description}`));
82
+ }
83
+ if (template.titlePattern) {
84
+ this.log(styles.muted(` Title pattern: ${template.titlePattern}`));
85
+ }
86
+ if (template.defaultPriority) {
87
+ this.log(styles.muted(` Default priority: ${template.defaultPriority}`));
88
+ }
89
+ if (template.defaultCategory) {
90
+ this.log(styles.muted(` Default category: ${template.defaultCategory}`));
91
+ }
92
+ if (template.defaultStatusId) {
93
+ this.log(styles.muted(` Default status: ${template.defaultStatusId}`));
94
+ }
95
+ if (template.defaultAssignee) {
96
+ this.log(styles.muted(` Default assignee: ${template.defaultAssignee}`));
97
+ }
98
+ if (template.defaultOwner) {
99
+ this.log(styles.muted(` Default owner: ${template.defaultOwner}`));
100
+ }
101
+ if (template.defaultLabels && template.defaultLabels.length > 0) {
102
+ this.log(styles.muted(` Default labels: ${template.defaultLabels.join(', ')}`));
103
+ }
104
+ if (template.suggestedSubtasks.length > 0) {
105
+ this.log(styles.muted(` Subtasks: ${template.suggestedSubtasks.length}`));
106
+ }
107
+ this.log('');
108
+ this.log(styles.muted(`Create ticket from template: prlt ticket template apply ${template.id}`));
109
+ }
110
+ }
@@ -0,0 +1,18 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class TicketUpdate extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ ticketId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ priority: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ category: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ force: 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 executeBulk;
18
+ }
@@ -0,0 +1,325 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { PMOCommand, pmoBaseFlags, autoExportToBoard } from '../../lib/pmo/index.js';
4
+ import { PRIORITIES, PRIORITY_LABELS } from '../../lib/pmo/types.js';
5
+ import { styles } from '../../lib/styles.js';
6
+ import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
7
+ export default class TicketUpdate extends PMOCommand {
8
+ static description = 'Update priority/category for ticket(s)';
9
+ static examples = [
10
+ '<%= config.bin %> <%= command.id %> TKT-001 --priority HIGH',
11
+ '<%= config.bin %> <%= command.id %> TKT-001 --category bug',
12
+ '<%= config.bin %> <%= command.id %> --bulk',
13
+ '<%= config.bin %> <%= command.id %> --bulk --priority HIGH',
14
+ '<%= config.bin %> <%= command.id %> --json # Output choices as JSON',
15
+ ];
16
+ static args = {
17
+ ticketId: Args.string({
18
+ description: 'Ticket ID - prompts with dropdown if not provided',
19
+ required: false,
20
+ }),
21
+ };
22
+ static flags = {
23
+ ...pmoBaseFlags,
24
+ json: Flags.boolean({
25
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
26
+ default: false,
27
+ }),
28
+ priority: Flags.string({
29
+ char: 'p',
30
+ description: 'Set priority (P0, P1, P2, P3)',
31
+ options: [...PRIORITIES],
32
+ }),
33
+ category: Flags.string({
34
+ char: 'c',
35
+ description: 'Set category (e.g., feature, bug, refactor)',
36
+ }),
37
+ bulk: Flags.boolean({
38
+ char: 'b',
39
+ description: 'Enable bulk mode to update multiple tickets',
40
+ default: false,
41
+ }),
42
+ force: Flags.boolean({
43
+ char: 'f',
44
+ description: 'Skip confirmation prompt',
45
+ default: false,
46
+ }),
47
+ };
48
+ async execute() {
49
+ const { args, flags } = await this.parse(TicketUpdate);
50
+ const projectId = flags.project;
51
+ // Check if JSON output mode is active
52
+ const jsonMode = shouldOutputJson(flags);
53
+ // Get all tickets
54
+ const allTickets = await this.storage.listTickets(projectId);
55
+ if (allTickets.length === 0) {
56
+ if (jsonMode) {
57
+ outputErrorAsJson('NO_TICKETS', 'No tickets found.', createMetadata('ticket update', flags));
58
+ return;
59
+ }
60
+ this.log(styles.warning('No tickets found.'));
61
+ return;
62
+ }
63
+ // Bulk mode
64
+ if (flags.bulk) {
65
+ await this.executeBulk(allTickets, flags);
66
+ return;
67
+ }
68
+ // Single ticket mode
69
+ let ticketId = args.ticketId;
70
+ if (!ticketId) {
71
+ const selected = await this.selectFromList({
72
+ message: 'Select ticket to update:',
73
+ items: allTickets,
74
+ getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
75
+ getValue: (t) => t.id,
76
+ getCommand: (t) => `prlt ticket update ${t.id} --json`,
77
+ jsonMode: jsonMode ? { flags, commandName: 'ticket update' } : null,
78
+ });
79
+ if (!selected) {
80
+ return;
81
+ }
82
+ ticketId = selected;
83
+ }
84
+ // Get ticket
85
+ const ticket = await this.storage.getTicket(ticketId);
86
+ if (!ticket) {
87
+ this.error(`Ticket "${ticketId}" not found.`);
88
+ }
89
+ // Determine what to update
90
+ let updatePriority = flags.priority;
91
+ let updateCategory = flags.category;
92
+ if (!updatePriority && !updateCategory) {
93
+ // Ask what to update
94
+ const { updateType } = await inquirer.prompt([{
95
+ type: 'list',
96
+ name: 'updateType',
97
+ message: 'What would you like to update?',
98
+ choices: [
99
+ { name: 'Priority', value: 'priority' },
100
+ { name: 'Category', value: 'category' },
101
+ { name: 'Both', value: 'both' },
102
+ ],
103
+ }]);
104
+ if (updateType === 'priority' || updateType === 'both') {
105
+ const { priority } = await inquirer.prompt([{
106
+ type: 'list',
107
+ name: 'priority',
108
+ message: 'Set priority to:',
109
+ choices: [
110
+ { name: `(Keep existing: ${ticket.priority || 'none'})`, value: null },
111
+ ...PRIORITIES.map(p => ({ name: PRIORITY_LABELS[p], value: p })),
112
+ { name: 'None (clear priority)', value: '' },
113
+ ],
114
+ }]);
115
+ if (priority !== null) {
116
+ updatePriority = priority;
117
+ }
118
+ }
119
+ if (updateType === 'category' || updateType === 'both') {
120
+ const { categoryChoice } = await inquirer.prompt([{
121
+ type: 'list',
122
+ name: 'categoryChoice',
123
+ message: 'Set category to:',
124
+ choices: [
125
+ { name: `(Keep existing: ${ticket.category || 'none'})`, value: null },
126
+ { name: 'feature', value: 'feature' },
127
+ { name: 'bug', value: 'bug' },
128
+ { name: 'refactor', value: 'refactor' },
129
+ { name: 'docs', value: 'docs' },
130
+ { name: 'test', value: 'test' },
131
+ { name: 'chore', value: 'chore' },
132
+ { name: 'None (clear category)', value: '' },
133
+ { name: 'Custom...', value: '__custom__' },
134
+ ],
135
+ }]);
136
+ if (categoryChoice === '__custom__') {
137
+ const { customCategory } = await inquirer.prompt([{
138
+ type: 'input',
139
+ name: 'customCategory',
140
+ message: 'Enter custom category:',
141
+ validate: (input) => input.length > 0 || 'Category is required',
142
+ }]);
143
+ updateCategory = customCategory;
144
+ }
145
+ else if (categoryChoice !== null) {
146
+ updateCategory = categoryChoice;
147
+ }
148
+ }
149
+ }
150
+ // Check if anything to update
151
+ if (updatePriority === undefined && updateCategory === undefined) {
152
+ this.log(styles.muted('Nothing to update.'));
153
+ return;
154
+ }
155
+ // Build changes
156
+ const changes = {};
157
+ if (updatePriority !== undefined) {
158
+ changes.priority = updatePriority || undefined;
159
+ }
160
+ if (updateCategory !== undefined) {
161
+ changes.category = updateCategory || undefined;
162
+ }
163
+ // Update ticket
164
+ await this.storage.updateTicket(ticketId, changes);
165
+ // Auto-export
166
+ await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
167
+ const updates = [];
168
+ if (updatePriority !== undefined)
169
+ updates.push(`Priority: ${updatePriority || 'none'}`);
170
+ if (updateCategory !== undefined)
171
+ updates.push(`Category: ${updateCategory || 'none'}`);
172
+ this.log(styles.success(`\n✅ Updated ticket ${styles.emphasis(ticketId)}`));
173
+ this.log(styles.muted(` ${updates.join(', ')}`));
174
+ }
175
+ async executeBulk(allTickets, flags) {
176
+ this.log(styles.emphasis('✏️ Update Multiple Tickets\n'));
177
+ // Select tickets to update
178
+ const { selectedTickets } = await inquirer.prompt([{
179
+ type: 'checkbox',
180
+ name: 'selectedTickets',
181
+ message: 'Select tickets to update:',
182
+ choices: allTickets.map(t => ({
183
+ name: `${t.id} - ${t.title} [P:${t.priority || 'none'} C:${t.category || 'none'}]`,
184
+ value: t.id,
185
+ })),
186
+ }]);
187
+ if (selectedTickets.length === 0) {
188
+ this.log(styles.muted('No tickets selected.'));
189
+ return;
190
+ }
191
+ // Determine what to update
192
+ let updatePriority = flags.priority;
193
+ let updateCategory = flags.category;
194
+ if (!updatePriority && !updateCategory) {
195
+ // Ask what to update
196
+ const { updateType } = await inquirer.prompt([{
197
+ type: 'list',
198
+ name: 'updateType',
199
+ message: 'What would you like to update?',
200
+ choices: [
201
+ { name: 'Priority', value: 'priority' },
202
+ { name: 'Category', value: 'category' },
203
+ { name: 'Both', value: 'both' },
204
+ ],
205
+ }]);
206
+ if (updateType === 'priority' || updateType === 'both') {
207
+ const { priority } = await inquirer.prompt([{
208
+ type: 'list',
209
+ name: 'priority',
210
+ message: 'Set priority to:',
211
+ choices: [
212
+ { name: '(Keep existing)', value: null },
213
+ ...PRIORITIES.map(p => ({ name: PRIORITY_LABELS[p], value: p })),
214
+ { name: 'None (clear priority)', value: '' },
215
+ ],
216
+ }]);
217
+ if (priority !== null) {
218
+ updatePriority = priority;
219
+ }
220
+ }
221
+ if (updateType === 'category' || updateType === 'both') {
222
+ const { categoryChoice } = await inquirer.prompt([{
223
+ type: 'list',
224
+ name: 'categoryChoice',
225
+ message: 'Set category to:',
226
+ choices: [
227
+ { name: '(Keep existing)', value: null },
228
+ { name: 'feature', value: 'feature' },
229
+ { name: 'bug', value: 'bug' },
230
+ { name: 'refactor', value: 'refactor' },
231
+ { name: 'docs', value: 'docs' },
232
+ { name: 'test', value: 'test' },
233
+ { name: 'chore', value: 'chore' },
234
+ { name: 'None (clear category)', value: '' },
235
+ { name: 'Custom...', value: '__custom__' },
236
+ ],
237
+ }]);
238
+ if (categoryChoice === '__custom__') {
239
+ const { customCategory } = await inquirer.prompt([{
240
+ type: 'input',
241
+ name: 'customCategory',
242
+ message: 'Enter custom category:',
243
+ validate: (input) => input.length > 0 || 'Category is required',
244
+ }]);
245
+ updateCategory = customCategory;
246
+ }
247
+ else if (categoryChoice !== null) {
248
+ updateCategory = categoryChoice;
249
+ }
250
+ }
251
+ }
252
+ // Check if anything to update
253
+ if (updatePriority === undefined && updateCategory === undefined) {
254
+ this.log(styles.muted('Nothing to update.'));
255
+ return;
256
+ }
257
+ // Confirmation
258
+ if (!flags.force) {
259
+ this.log(styles.primary('\nWill update:'));
260
+ if (updatePriority !== undefined) {
261
+ this.log(styles.primary(` Priority → ${updatePriority || '(clear)'}`));
262
+ }
263
+ if (updateCategory !== undefined) {
264
+ this.log(styles.primary(` Category → ${updateCategory || '(clear)'}`));
265
+ }
266
+ this.log(styles.primary('\nTickets:'));
267
+ for (const ticketId of selectedTickets) {
268
+ const ticket = allTickets.find(t => t.id === ticketId);
269
+ this.log(styles.primary(` • ${ticketId}: ${ticket?.title}`));
270
+ }
271
+ this.log('');
272
+ const { confirm } = await inquirer.prompt([{
273
+ type: 'list',
274
+ name: 'confirm',
275
+ message: 'Continue?',
276
+ choices: [
277
+ { name: 'No, cancel', value: false },
278
+ { name: 'Yes, update tickets', value: true }
279
+ ],
280
+ default: 0
281
+ }]);
282
+ if (!confirm) {
283
+ this.log(styles.muted('Operation cancelled.'));
284
+ return;
285
+ }
286
+ }
287
+ this.log('');
288
+ // Update each ticket
289
+ let successCount = 0;
290
+ let failCount = 0;
291
+ for (const ticketId of selectedTickets) {
292
+ try {
293
+ const changes = {};
294
+ if (updatePriority !== undefined) {
295
+ changes.priority = updatePriority || undefined;
296
+ }
297
+ if (updateCategory !== undefined) {
298
+ changes.category = updateCategory || undefined;
299
+ }
300
+ await this.storage.updateTicket(ticketId, changes);
301
+ const updates = [];
302
+ if (updatePriority !== undefined)
303
+ updates.push(`P:${updatePriority || 'none'}`);
304
+ if (updateCategory !== undefined)
305
+ updates.push(`C:${updateCategory || 'none'}`);
306
+ this.log(styles.success(`${ticketId}: ${updates.join(', ')}`));
307
+ successCount++;
308
+ }
309
+ catch (error) {
310
+ this.log(styles.error(`Failed to update ${ticketId}: ${error instanceof Error ? error.message : String(error)}`));
311
+ failCount++;
312
+ }
313
+ }
314
+ // Auto-export to kanban.md
315
+ await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
316
+ // Summary
317
+ this.log('');
318
+ if (successCount > 0) {
319
+ this.log(styles.success(`Updated ${successCount} ticket(s)`));
320
+ }
321
+ if (failCount > 0) {
322
+ this.log(styles.error(`Failed to update ${failCount} ticket(s)`));
323
+ }
324
+ }
325
+ }
@@ -0,0 +1,13 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class TicketView 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
+ static args: {
10
+ ticketId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
11
+ };
12
+ execute(): Promise<void>;
13
+ }
@@ -0,0 +1,80 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
3
+ import { styles } from '../../lib/styles.js';
4
+ import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
5
+ export default class TicketView extends PMOCommand {
6
+ static description = 'View detailed ticket information';
7
+ static examples = [
8
+ '<%= config.bin %> <%= command.id %> TICK-001',
9
+ '<%= config.bin %> <%= command.id %> # Interactive mode',
10
+ ];
11
+ static flags = {
12
+ ...pmoBaseFlags,
13
+ json: Flags.boolean({
14
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
15
+ default: false,
16
+ }),
17
+ };
18
+ static args = {
19
+ ticketId: Args.string({
20
+ description: 'Ticket ID to view - prompts with dropdown if not provided',
21
+ required: false,
22
+ }),
23
+ };
24
+ async execute() {
25
+ const { args, flags } = await this.parse(TicketView);
26
+ const projectId = flags.project;
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('ticket view', flags));
33
+ this.exit(1);
34
+ }
35
+ this.error(message);
36
+ };
37
+ // Get ticketId - prompt if not provided
38
+ let ticketId = args.ticketId;
39
+ if (!ticketId) {
40
+ // Get all tickets for selection
41
+ const allTickets = await this.storage.listTickets(projectId);
42
+ if (allTickets.length === 0) {
43
+ return handleError('NO_TICKETS', 'No tickets found. Create a ticket first with "prlt ticket create".');
44
+ }
45
+ // Use helper for ticket selection (handles JSON mode automatically)
46
+ const selected = await this.selectFromList({
47
+ message: 'Select ticket to view:',
48
+ items: allTickets,
49
+ getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
50
+ getValue: (t) => t.id,
51
+ getCommand: (t) => `prlt ticket view ${t.id} --json`,
52
+ jsonMode: jsonMode ? { flags, commandName: 'ticket view' } : null,
53
+ });
54
+ if (!selected) {
55
+ return; // Cancelled or JSON mode (already exited)
56
+ }
57
+ ticketId = selected;
58
+ }
59
+ // Get ticket
60
+ const ticket = await this.storage.getTicket(ticketId);
61
+ if (!ticket) {
62
+ this.error(`Ticket "${ticketId}" not found.`);
63
+ }
64
+ const board = await this.storage.getBoard(ticket.projectId);
65
+ // Display ticket details
66
+ this.log(`\n${styles.header('📄 Ticket')} ${styles.emphasis(ticket.id)}\n`);
67
+ this.log(`${styles.header('Title:')} ${ticket.title}`);
68
+ this.log(`${styles.header('Project:')} ${board.name}`);
69
+ this.log(`${styles.header('Status:')} ${ticket.statusName}`);
70
+ this.log(`${styles.header('Priority:')} ${ticket.priority || 'none'}`);
71
+ this.log(`${styles.header('Category:')} ${ticket.category || 'none'}`);
72
+ this.log(`${styles.header('Created:')} ${ticket.createdAt ? new Date(ticket.createdAt).toLocaleString() : 'unknown'}`);
73
+ this.log(`${styles.header('Updated:')} ${ticket.updatedAt ? new Date(ticket.updatedAt).toLocaleString() : 'unknown'}`);
74
+ if (ticket.description) {
75
+ this.log(`\n${styles.header('Description:')}`);
76
+ this.log(` ${ticket.description.split('\n').join('\n ')}`);
77
+ }
78
+ this.log('');
79
+ }
80
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Whoami extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ private detectAgentName;
7
+ private detectRepoName;
8
+ private getCurrentBranch;
9
+ }
@@ -0,0 +1,103 @@
1
+ import { Command } from '@oclif/core';
2
+ import * as path from 'node:path';
3
+ import { execSync } from 'node:child_process';
4
+ import { colors } from '../lib/colors.js';
5
+ export default class Whoami extends Command {
6
+ static description = 'Show current agent/environment context';
7
+ static examples = [
8
+ '<%= config.bin %> <%= command.id %>',
9
+ ];
10
+ async run() {
11
+ const isDevcontainer = process.env.DEVCONTAINER === 'true';
12
+ const agentName = this.detectAgentName();
13
+ const repoName = this.detectRepoName();
14
+ const branch = this.getCurrentBranch();
15
+ const hqPath = process.env.PRLT_HQ_PATH;
16
+ this.log('');
17
+ this.log(colors.primary('🔍 Proletariat Context'));
18
+ this.log('');
19
+ // Agent info
20
+ if (agentName) {
21
+ this.log(` Agent: ${colors.primary(agentName)}`);
22
+ }
23
+ else {
24
+ this.log(` Agent: ${colors.textMuted('(not detected)')}`);
25
+ }
26
+ // Repository info
27
+ if (repoName) {
28
+ this.log(` Repository: ${colors.text(repoName)}`);
29
+ }
30
+ // Branch info
31
+ if (branch) {
32
+ this.log(` Branch: ${colors.text(branch)}`);
33
+ }
34
+ // Environment
35
+ this.log('');
36
+ this.log(` Environment: ${isDevcontainer ? colors.primary('devcontainer') : colors.text('host')}`);
37
+ this.log(` Working dir: ${colors.textMuted(process.cwd())}`);
38
+ if (hqPath) {
39
+ this.log(` HQ path: ${colors.textMuted(hqPath)}`);
40
+ }
41
+ // Show PMO path if available
42
+ const pmoPath = process.env.PRLT_PMO_PATH;
43
+ if (pmoPath) {
44
+ this.log(` PMO path: ${colors.textMuted(pmoPath)}`);
45
+ }
46
+ this.log('');
47
+ }
48
+ detectAgentName() {
49
+ // Check environment variable first (set in devcontainer)
50
+ if (process.env.PRLT_AGENT_NAME) {
51
+ return process.env.PRLT_AGENT_NAME;
52
+ }
53
+ // Try to detect from directory structure
54
+ // Pattern: /workspace/proletariat-{agentName} or agents/staff/{agentName}
55
+ const cwd = process.cwd();
56
+ // Devcontainer pattern: /workspace/proletariat-{agent}
57
+ const workspaceMatch = cwd.match(/\/workspace\/[^/]+-(\w+)/);
58
+ if (workspaceMatch) {
59
+ return workspaceMatch[1];
60
+ }
61
+ // Host pattern: agents/staff/{agent}
62
+ const staffMatch = cwd.match(/agents\/staff\/(\w+)/);
63
+ if (staffMatch) {
64
+ return staffMatch[1];
65
+ }
66
+ // Try git branch pattern: agent-{name}
67
+ try {
68
+ const branch = execSync('git branch --show-current', { encoding: 'utf-8', stdio: 'pipe' }).trim();
69
+ const agentBranchMatch = branch.match(/^agent-(\w+)$/);
70
+ if (agentBranchMatch) {
71
+ return agentBranchMatch[1];
72
+ }
73
+ }
74
+ catch {
75
+ // Ignore git errors
76
+ }
77
+ return null;
78
+ }
79
+ detectRepoName() {
80
+ // Try to get repo name from directory or git remote
81
+ try {
82
+ const remote = execSync('git remote get-url origin', { encoding: 'utf-8', stdio: 'pipe' }).trim();
83
+ const match = remote.match(/\/([^/]+?)(?:\.git)?$/);
84
+ if (match) {
85
+ return match[1];
86
+ }
87
+ }
88
+ catch {
89
+ // Ignore git errors
90
+ }
91
+ // Fallback to directory name
92
+ const cwd = process.cwd();
93
+ return path.basename(cwd);
94
+ }
95
+ getCurrentBranch() {
96
+ try {
97
+ return execSync('git branch --show-current', { encoding: 'utf-8', stdio: 'pipe' }).trim();
98
+ }
99
+ catch {
100
+ return null;
101
+ }
102
+ }
103
+ }
@@ -0,0 +1,13 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class WorkComplete extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ ticketId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ };
12
+ execute(): Promise<void>;
13
+ }