@proletariat/cli 0.2.0 → 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 +512 -253
  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,386 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import * as os from 'node:os';
4
+ import { isValidHQ } from './workspace.js';
5
+ const CONFIG_VERSION = '1.0.0';
6
+ /**
7
+ * Get the path to the machine-level config directory (~/.proletariat/).
8
+ */
9
+ export function getMachineConfigDir() {
10
+ return path.join(os.homedir(), '.proletariat');
11
+ }
12
+ /**
13
+ * Get the path to the machine-level config file (~/.proletariat/config.json).
14
+ */
15
+ export function getMachineConfigPath() {
16
+ return path.join(getMachineConfigDir(), 'config.json');
17
+ }
18
+ /**
19
+ * Ensure the machine config directory exists.
20
+ * Creates ~/.proletariat/ if it doesn't exist.
21
+ */
22
+ export function ensureMachineConfigDir() {
23
+ const configDir = getMachineConfigDir();
24
+ if (!fs.existsSync(configDir)) {
25
+ fs.mkdirSync(configDir, { recursive: true });
26
+ }
27
+ }
28
+ /**
29
+ * Normalize a workspace path for consistent storage.
30
+ * - Resolves symlinks
31
+ * - Makes path absolute
32
+ * - Removes trailing slashes
33
+ */
34
+ export function normalizePath(inputPath) {
35
+ // Expand ~ to home directory
36
+ let resolved = inputPath.startsWith('~')
37
+ ? path.join(os.homedir(), inputPath.slice(1))
38
+ : inputPath;
39
+ // Make absolute
40
+ resolved = path.resolve(resolved);
41
+ // Resolve symlinks if the path exists
42
+ if (fs.existsSync(resolved)) {
43
+ try {
44
+ resolved = fs.realpathSync(resolved);
45
+ }
46
+ catch {
47
+ // If realpath fails, use the resolved path
48
+ }
49
+ }
50
+ // Remove trailing slash (unless it's the root)
51
+ if (resolved.length > 1 && resolved.endsWith(path.sep)) {
52
+ resolved = resolved.slice(0, -1);
53
+ }
54
+ return resolved;
55
+ }
56
+ /**
57
+ * Get the default (empty) machine config structure.
58
+ */
59
+ function getDefaultConfig() {
60
+ return {
61
+ type: 'machine',
62
+ version: CONFIG_VERSION,
63
+ organizations: [],
64
+ headquarters: [],
65
+ activeHeadquarters: null,
66
+ activeOrganization: null,
67
+ };
68
+ }
69
+ /**
70
+ * Read the machine config file.
71
+ * Returns a default empty config if file doesn't exist or is invalid.
72
+ * Handles migration from old 'workspaces' format to new 'headquarters' format.
73
+ */
74
+ export function readMachineConfig() {
75
+ const configPath = getMachineConfigPath();
76
+ if (!fs.existsSync(configPath)) {
77
+ return getDefaultConfig();
78
+ }
79
+ try {
80
+ const content = fs.readFileSync(configPath, 'utf-8');
81
+ const config = JSON.parse(content);
82
+ // Validate basic structure - check for either old or new format
83
+ const hasOldFormat = Array.isArray(config.workspaces);
84
+ const hasNewFormat = Array.isArray(config.headquarters);
85
+ if (!config.version || (!hasOldFormat && !hasNewFormat)) {
86
+ return getDefaultConfig();
87
+ }
88
+ // Migrate from old format if needed
89
+ const headquarters = hasNewFormat
90
+ ? config.headquarters
91
+ : (config.workspaces || []);
92
+ const activeHeadquarters = config.activeHeadquarters ?? config.activeWorkspace ?? null;
93
+ return {
94
+ type: 'machine',
95
+ version: config.version,
96
+ organizations: config.organizations || [],
97
+ headquarters,
98
+ activeHeadquarters,
99
+ activeOrganization: config.activeOrganization ?? null,
100
+ };
101
+ }
102
+ catch {
103
+ return getDefaultConfig();
104
+ }
105
+ }
106
+ /**
107
+ * Write the machine config file atomically.
108
+ * Uses write-to-temp-then-rename pattern for safety.
109
+ */
110
+ export function writeMachineConfig(config) {
111
+ ensureMachineConfigDir();
112
+ const configPath = getMachineConfigPath();
113
+ const tempPath = `${configPath}.tmp.${process.pid}`;
114
+ try {
115
+ // Write to temp file
116
+ fs.writeFileSync(tempPath, JSON.stringify(config, null, 2), 'utf-8');
117
+ // Atomic rename
118
+ fs.renameSync(tempPath, configPath);
119
+ }
120
+ catch (error) {
121
+ // Clean up temp file if rename failed
122
+ try {
123
+ if (fs.existsSync(tempPath)) {
124
+ fs.unlinkSync(tempPath);
125
+ }
126
+ }
127
+ catch {
128
+ // Ignore cleanup errors
129
+ }
130
+ throw error;
131
+ }
132
+ }
133
+ /**
134
+ * Register a headquarters in the machine config.
135
+ *
136
+ * @param hqPath Absolute path to the headquarters (will be normalized)
137
+ * @param name Optional HQ name (defaults to directory basename)
138
+ * @param setActive If true, set as active HQ when no active HQ exists
139
+ * @param orgName Optional organization name to associate this HQ with
140
+ * @returns The registered headquarters entry
141
+ */
142
+ export function registerHeadquarters(hqPath, name, setActive = true, orgName) {
143
+ const normalizedPath = normalizePath(hqPath);
144
+ const hqName = name || path.basename(normalizedPath);
145
+ const config = readMachineConfig();
146
+ // Check if already registered
147
+ const existingIndex = config.headquarters.findIndex((hq) => normalizePath(hq.path) === normalizedPath);
148
+ const entry = {
149
+ name: hqName,
150
+ path: normalizedPath,
151
+ registeredAt: new Date().toISOString(),
152
+ orgName,
153
+ };
154
+ if (existingIndex >= 0) {
155
+ // Update existing entry
156
+ config.headquarters[existingIndex] = entry;
157
+ }
158
+ else {
159
+ // Add new entry
160
+ config.headquarters.push(entry);
161
+ }
162
+ // Set as active if requested and no active HQ exists
163
+ if (setActive && !config.activeHeadquarters) {
164
+ config.activeHeadquarters = normalizedPath;
165
+ }
166
+ writeMachineConfig(config);
167
+ return entry;
168
+ }
169
+ /** @deprecated Use registerHeadquarters instead */
170
+ export const registerWorkspace = registerHeadquarters;
171
+ /**
172
+ * Unregister a headquarters from the machine config.
173
+ *
174
+ * @param pathOrName HQ path or name to unregister
175
+ * @returns true if HQ was found and removed, false otherwise
176
+ */
177
+ export function unregisterHeadquarters(pathOrName) {
178
+ const config = readMachineConfig();
179
+ const normalizedInput = normalizePath(pathOrName);
180
+ const initialLength = config.headquarters.length;
181
+ // Try to match by path first, then by name
182
+ config.headquarters = config.headquarters.filter((hq) => {
183
+ const normalizedHqPath = normalizePath(hq.path);
184
+ return normalizedHqPath !== normalizedInput && hq.name !== pathOrName;
185
+ });
186
+ const removed = config.headquarters.length < initialLength;
187
+ if (removed) {
188
+ // Clear active HQ if it was the removed one
189
+ if (config.activeHeadquarters) {
190
+ const normalizedActive = normalizePath(config.activeHeadquarters);
191
+ const stillExists = config.headquarters.some((hq) => normalizePath(hq.path) === normalizedActive);
192
+ if (!stillExists) {
193
+ config.activeHeadquarters = null;
194
+ }
195
+ }
196
+ writeMachineConfig(config);
197
+ }
198
+ return removed;
199
+ }
200
+ /** @deprecated Use unregisterHeadquarters instead */
201
+ export const unregisterWorkspace = unregisterHeadquarters;
202
+ /**
203
+ * Get all registered headquarters.
204
+ */
205
+ export function getRegisteredHeadquarters() {
206
+ const config = readMachineConfig();
207
+ return config.headquarters;
208
+ }
209
+ /** @deprecated Use getRegisteredHeadquarters instead */
210
+ export const getRegisteredWorkspaces = getRegisteredHeadquarters;
211
+ /**
212
+ * Get the active headquarters path.
213
+ * Returns null if no active HQ is set.
214
+ */
215
+ export function getActiveHeadquarters() {
216
+ const config = readMachineConfig();
217
+ return config.activeHeadquarters;
218
+ }
219
+ /** @deprecated Use getActiveHeadquarters instead */
220
+ export const getActiveWorkspace = getActiveHeadquarters;
221
+ /**
222
+ * Set the active headquarters.
223
+ *
224
+ * @param pathOrName HQ path or name
225
+ * @returns The path of the HQ that was set as active
226
+ * @throws Error if HQ not found or not valid
227
+ */
228
+ export function setActiveHeadquarters(pathOrName) {
229
+ const config = readMachineConfig();
230
+ const normalizedInput = normalizePath(pathOrName);
231
+ // Find HQ by path or name
232
+ let hq = config.headquarters.find((h) => normalizePath(h.path) === normalizedInput);
233
+ if (!hq) {
234
+ // Try matching by name
235
+ const matches = config.headquarters.filter((h) => h.name === pathOrName);
236
+ if (matches.length === 0) {
237
+ throw new Error(`Headquarters not found: ${pathOrName}`);
238
+ }
239
+ if (matches.length > 1) {
240
+ throw new Error(`Multiple headquarters found with name "${pathOrName}". Please use the full path instead.`);
241
+ }
242
+ hq = matches[0];
243
+ }
244
+ // Validate HQ still exists on filesystem
245
+ if (!fs.existsSync(hq.path)) {
246
+ throw new Error(`Headquarters path no longer exists: ${hq.path}`);
247
+ }
248
+ // Validate it's still a valid HQ
249
+ if (!isValidHQ(hq.path)) {
250
+ throw new Error(`Path is no longer a valid headquarters: ${hq.path}`);
251
+ }
252
+ config.activeHeadquarters = hq.path;
253
+ writeMachineConfig(config);
254
+ return hq.path;
255
+ }
256
+ /** @deprecated Use setActiveHeadquarters instead */
257
+ export const setActiveWorkspace = setActiveHeadquarters;
258
+ /**
259
+ * Find headquarters by name.
260
+ * Returns array of matches (may be multiple if names are not unique).
261
+ */
262
+ export function findHeadquartersByName(name) {
263
+ const config = readMachineConfig();
264
+ return config.headquarters.filter((hq) => hq.name.toLowerCase() === name.toLowerCase());
265
+ }
266
+ /** @deprecated Use findHeadquartersByName instead */
267
+ export const findWorkspacesByName = findHeadquartersByName;
268
+ /**
269
+ * Find headquarters by path.
270
+ */
271
+ export function findHeadquartersByPath(hqPath) {
272
+ const config = readMachineConfig();
273
+ const normalized = normalizePath(hqPath);
274
+ return (config.headquarters.find((hq) => normalizePath(hq.path) === normalized) || null);
275
+ }
276
+ /** @deprecated Use findHeadquartersByPath instead */
277
+ export const findWorkspaceByPath = findHeadquartersByPath;
278
+ /**
279
+ * Check if a headquarters path is registered.
280
+ */
281
+ export function isHeadquartersRegistered(hqPath) {
282
+ return findHeadquartersByPath(hqPath) !== null;
283
+ }
284
+ /** @deprecated Use isHeadquartersRegistered instead */
285
+ export const isWorkspaceRegistered = isHeadquartersRegistered;
286
+ /**
287
+ * Get headquarters name from path (for existing HQ).
288
+ * Reads the HQ config to get the name, or falls back to directory basename.
289
+ */
290
+ export function getHeadquartersNameFromPath(hqPath) {
291
+ const configPath = path.join(hqPath, '.proletariat', 'config.json');
292
+ if (fs.existsSync(configPath)) {
293
+ try {
294
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
295
+ if (config.name) {
296
+ return config.name;
297
+ }
298
+ }
299
+ catch {
300
+ // Fall through to basename
301
+ }
302
+ }
303
+ return path.basename(hqPath);
304
+ }
305
+ /** @deprecated Use getHeadquartersNameFromPath instead */
306
+ export const getWorkspaceNameFromPath = getHeadquartersNameFromPath;
307
+ /**
308
+ * Check if there are duplicate headquarters names in the registry.
309
+ */
310
+ export function hasDuplicateNames() {
311
+ const config = readMachineConfig();
312
+ const nameMap = new Map();
313
+ for (const hq of config.headquarters) {
314
+ const existing = nameMap.get(hq.name) || [];
315
+ existing.push(hq.path);
316
+ nameMap.set(hq.name, existing);
317
+ }
318
+ const duplicates = [];
319
+ for (const [name, paths] of nameMap) {
320
+ if (paths.length > 1) {
321
+ duplicates.push({ name, paths });
322
+ }
323
+ }
324
+ return duplicates;
325
+ }
326
+ // =============================================================================
327
+ // Organization Management
328
+ // =============================================================================
329
+ /**
330
+ * Get all organizations.
331
+ */
332
+ export function getOrganizations() {
333
+ const config = readMachineConfig();
334
+ return config.organizations;
335
+ }
336
+ /**
337
+ * Get the active organization name.
338
+ */
339
+ export function getActiveOrganization() {
340
+ const config = readMachineConfig();
341
+ return config.activeOrganization;
342
+ }
343
+ /**
344
+ * Create a new organization.
345
+ */
346
+ export function createOrganization(name) {
347
+ const config = readMachineConfig();
348
+ // Check if organization already exists
349
+ const existing = config.organizations.find((o) => o.name.toLowerCase() === name.toLowerCase());
350
+ if (existing) {
351
+ return existing;
352
+ }
353
+ const org = {
354
+ name,
355
+ createdAt: new Date().toISOString(),
356
+ };
357
+ config.organizations.push(org);
358
+ // Set as active if it's the first organization
359
+ if (!config.activeOrganization) {
360
+ config.activeOrganization = name;
361
+ }
362
+ writeMachineConfig(config);
363
+ return org;
364
+ }
365
+ /**
366
+ * Set the active organization.
367
+ */
368
+ export function setActiveOrganization(name) {
369
+ const config = readMachineConfig();
370
+ // Find organization (case-insensitive)
371
+ const org = config.organizations.find((o) => o.name.toLowerCase() === name.toLowerCase());
372
+ if (!org) {
373
+ throw new Error(`Organization not found: ${name}`);
374
+ }
375
+ config.activeOrganization = org.name;
376
+ writeMachineConfig(config);
377
+ }
378
+ /**
379
+ * Get headquarters belonging to a specific organization.
380
+ */
381
+ export function getOrganizationHeadquarters(orgName) {
382
+ const config = readMachineConfig();
383
+ return config.headquarters.filter((hq) => hq.orgName?.toLowerCase() === orgName.toLowerCase());
384
+ }
385
+ /** @deprecated Use getOrganizationHeadquarters instead */
386
+ export const getOrganizationWorkspaces = getOrganizationHeadquarters;
@@ -0,0 +1,195 @@
1
+ import { Command } from '@oclif/core';
2
+ import { type PMOContext } from './pmo-context.js';
3
+ import { type JsonFlags } from '../prompt-json.js';
4
+ /**
5
+ * Base flags shared by all PMO commands
6
+ * Include these in your command's flags by spreading: ...PMOCommand.baseFlags
7
+ */
8
+ export declare const pmoBaseFlags: {
9
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ };
11
+ /**
12
+ * Base command class for PMO commands
13
+ *
14
+ * Provides automatic PMO context initialization and cleanup:
15
+ * - Initializes storage before run() executes
16
+ * - Ensures storage.close() is called even if errors occur
17
+ * - Provides common PMO flags (--project)
18
+ *
19
+ * Storage is project-agnostic - projectId is passed explicitly to operations.
20
+ *
21
+ * Usage:
22
+ * ```typescript
23
+ * import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/base-command.js';
24
+ *
25
+ * export default class MyCommand extends PMOCommand {
26
+ * static flags = {
27
+ * ...pmoBaseFlags,
28
+ * // additional flags...
29
+ * };
30
+ *
31
+ * async execute(): Promise<void> {
32
+ * // For project-agnostic operations (e.g., get ticket by ID):
33
+ * const ticket = await this.storage.getTicketById('TKT-123');
34
+ *
35
+ * // For project-scoped operations, get projectId first:
36
+ * const projectId = await this.requireProject();
37
+ * const board = await this.storage.getBoard(projectId);
38
+ *
39
+ * // Or derive from an entity:
40
+ * const projectId = ticket.projectId;
41
+ * await this.storage.moveTicket(projectId, ticket.id, 'Done');
42
+ * }
43
+ * }
44
+ * ```
45
+ */
46
+ export declare abstract class PMOCommand extends Command {
47
+ /**
48
+ * PMO context with storage, pmoPath, etc.
49
+ * Available after init() runs (before execute())
50
+ */
51
+ protected pmoContext: PMOContext;
52
+ /**
53
+ * Flag to track if context was successfully initialized
54
+ */
55
+ private contextInitialized;
56
+ /**
57
+ * Cached project ID from -P flag
58
+ */
59
+ private projectFlag?;
60
+ /**
61
+ * Logger function for PMO context
62
+ * Can be overridden to customize logging behavior
63
+ */
64
+ protected pmoLogger(msg: string): void;
65
+ /**
66
+ * oclif init hook - runs before the command executes
67
+ * Initializes PMO context with storage access
68
+ */
69
+ init(): Promise<void>;
70
+ /**
71
+ * Require a project to be selected.
72
+ * Returns projectId that should be passed to storage operations.
73
+ *
74
+ * Priority:
75
+ * 1. If -P flag was provided, uses that
76
+ * 2. If only one project exists, uses that
77
+ * 3. If multiple projects exist, prompts user to select one (or outputs JSON if jsonMode)
78
+ *
79
+ * @param options.filterEmptyProjects - Only show projects with tickets
80
+ * @param options.jsonMode - JSON mode configuration for AI agents
81
+ * @returns The selected project ID - pass this to storage operations
82
+ */
83
+ protected requireProject(options?: {
84
+ filterEmptyProjects?: boolean;
85
+ jsonMode?: {
86
+ flags: JsonFlags & Record<string, unknown>;
87
+ commandName: string;
88
+ baseCommand: string;
89
+ };
90
+ }): Promise<string>;
91
+ /**
92
+ * Get project name by ID
93
+ */
94
+ protected getProjectName(projectId: string): Promise<string>;
95
+ /**
96
+ * Select from a list of items with JSON mode support for AI agents.
97
+ *
98
+ * In JSON mode: outputs choices as JSON with command field and exits
99
+ * In interactive mode: shows prompt and returns selected value
100
+ *
101
+ * @param options Configuration for the selection
102
+ * @returns The selected value (only in interactive mode)
103
+ *
104
+ * @example
105
+ * ```typescript
106
+ * const ticketId = await this.selectFromList({
107
+ * message: 'Select ticket:',
108
+ * items: tickets,
109
+ * getName: (t) => `${t.id}: ${t.title}`,
110
+ * getValue: (t) => t.id,
111
+ * getCommand: (t) => `prlt ticket view ${t.id} --json`,
112
+ * jsonMode: { flags, commandName: 'ticket view' },
113
+ * });
114
+ * ```
115
+ */
116
+ protected selectFromList<T>(options: {
117
+ /** Prompt message shown to user */
118
+ message: string;
119
+ /** Items to select from */
120
+ items: T[];
121
+ /** Extract display name from item */
122
+ getName: (item: T) => string;
123
+ /** Extract value from item */
124
+ getValue: (item: T) => string;
125
+ /** Build command string for item (should include --json) */
126
+ getCommand: (item: T) => string;
127
+ /** JSON mode config - if provided and flags indicate JSON mode, outputs JSON */
128
+ jsonMode?: {
129
+ flags: JsonFlags & Record<string, unknown>;
130
+ commandName: string;
131
+ } | null;
132
+ /** Optional: include a Cancel option */
133
+ allowCancel?: boolean;
134
+ /** Optional: custom cancel value (default: null returned) */
135
+ cancelValue?: string;
136
+ }): Promise<string | null>;
137
+ /**
138
+ * Prompt for input with JSON mode support for AI agents.
139
+ *
140
+ * In JSON mode: outputs field info as JSON and exits
141
+ * In interactive mode: shows prompt and returns input value
142
+ *
143
+ * @param options Configuration for the input
144
+ * @returns The input value (only in interactive mode)
145
+ */
146
+ protected promptForInput(options: {
147
+ /** Prompt message shown to user */
148
+ message: string;
149
+ /** Field name for the prompt */
150
+ fieldName: string;
151
+ /** Default value */
152
+ defaultValue?: string;
153
+ /** Validation function */
154
+ validate?: (input: string) => boolean | string;
155
+ /** JSON mode config */
156
+ jsonMode?: {
157
+ flags: JsonFlags & Record<string, unknown>;
158
+ commandName: string;
159
+ /** Hint for how to provide this value */
160
+ commandHint: string;
161
+ /** Example command */
162
+ example?: string;
163
+ } | null;
164
+ }): Promise<string>;
165
+ /**
166
+ * Override run() to delegate to execute() and ensure cleanup
167
+ * Subclasses should implement execute() instead of run()
168
+ */
169
+ run(): Promise<void>;
170
+ /**
171
+ * Main command logic - implement this instead of run()
172
+ * PMO context is available via this.pmoContext
173
+ */
174
+ protected abstract execute(): Promise<void>;
175
+ /**
176
+ * Cleanup handler - ensures storage is closed
177
+ * Called automatically after execute() completes or throws
178
+ */
179
+ protected cleanup(): Promise<void>;
180
+ /**
181
+ * oclif catch hook - called when an error occurs
182
+ * Ensures cleanup even on errors
183
+ */
184
+ catch(error: Error & {
185
+ exitCode?: number;
186
+ }): Promise<void>;
187
+ /**
188
+ * oclif finally hook - called after run() completes
189
+ */
190
+ finally(_: Error | undefined): Promise<void>;
191
+ /** Storage instance */
192
+ protected get storage(): import("./storage-sqlite.js").SQLiteStorage;
193
+ /** PMO directory path */
194
+ protected get pmoPath(): string;
195
+ }