@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,18 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class ExecutionLogs extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ follow: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ tail: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ };
14
+ protected getPMOOptions(): {
15
+ promptIfMultiple: boolean;
16
+ };
17
+ execute(): Promise<void>;
18
+ }
@@ -0,0 +1,161 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import { spawn } from 'node:child_process';
5
+ import inquirer from 'inquirer';
6
+ import Database from 'better-sqlite3';
7
+ import { styles } from '../../lib/styles.js';
8
+ import { getWorkspaceInfo } from '../../lib/agents/commands.js';
9
+ import { ExecutionStorage } from '../../lib/execution/storage.js';
10
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
11
+ import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
12
+ export default class ExecutionLogs extends PMOCommand {
13
+ static description = 'View execution logs';
14
+ static examples = [
15
+ '<%= config.bin %> <%= command.id %> WORK-001',
16
+ '<%= config.bin %> <%= command.id %> WORK-001 --follow',
17
+ '<%= config.bin %> <%= command.id %> WORK-001 --tail 50',
18
+ '<%= config.bin %> <%= command.id %> # Interactive mode',
19
+ ];
20
+ static args = {
21
+ id: Args.string({
22
+ description: 'Execution ID - prompts if not provided',
23
+ required: false,
24
+ }),
25
+ };
26
+ static flags = {
27
+ ...pmoBaseFlags,
28
+ follow: Flags.boolean({
29
+ char: 'f',
30
+ description: 'Stream logs in real-time',
31
+ default: false,
32
+ }),
33
+ tail: Flags.integer({
34
+ char: 'n',
35
+ description: 'Show last n lines',
36
+ }),
37
+ json: Flags.boolean({
38
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
39
+ default: false,
40
+ }),
41
+ };
42
+ getPMOOptions() {
43
+ return { promptIfMultiple: false };
44
+ }
45
+ async execute() {
46
+ const { args, flags } = await this.parse(ExecutionLogs);
47
+ // Get workspace info
48
+ let workspaceInfo;
49
+ try {
50
+ workspaceInfo = getWorkspaceInfo();
51
+ }
52
+ catch {
53
+ this.error('Not in a workspace. Run "prlt init" first.');
54
+ }
55
+ // Open database
56
+ const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
57
+ const db = new Database(dbPath);
58
+ const executionStorage = new ExecutionStorage(db);
59
+ try {
60
+ // Get execution ID - prompt if not provided
61
+ let execId = args.id;
62
+ if (!execId) {
63
+ const executions = executionStorage.listExecutions({ limit: 20 });
64
+ // Check if JSON output mode is active
65
+ const jsonMode = shouldOutputJson(flags);
66
+ if (executions.length === 0) {
67
+ if (jsonMode) {
68
+ outputErrorAsJson('NO_EXECUTIONS', 'No executions found.', createMetadata('execution logs', flags));
69
+ db.close();
70
+ this.exit(1);
71
+ }
72
+ this.error('No executions found.');
73
+ }
74
+ // In JSON mode, output execution selection prompt
75
+ if (jsonMode) {
76
+ const execChoices = executions.map((e) => ({
77
+ name: `${e.id} - ${e.ticketId} (${e.agentName}, ${e.status})`,
78
+ value: e.id,
79
+ }));
80
+ outputPromptAsJson(buildPromptConfig('list', 'executionId', 'Select execution to view logs:', execChoices), createMetadata('execution logs', flags));
81
+ db.close();
82
+ return;
83
+ }
84
+ const { selectedId } = await inquirer.prompt([
85
+ {
86
+ type: 'list',
87
+ name: 'selectedId',
88
+ message: 'Select execution to view logs:',
89
+ choices: executions.map((e) => ({
90
+ name: `${e.id} - ${e.ticketId} (${e.agentName}, ${e.status})`,
91
+ value: e.id,
92
+ })),
93
+ },
94
+ ]);
95
+ execId = selectedId;
96
+ }
97
+ // Get execution
98
+ const execution = executionStorage.getExecution(execId);
99
+ if (!execution) {
100
+ this.error(`Execution "${execId}" not found.`);
101
+ }
102
+ // Check for log file
103
+ if (!execution.logPath) {
104
+ this.log(styles.muted(`\nNo log file for execution ${execId}`));
105
+ this.log(styles.muted(`Environment: ${execution.environment}`));
106
+ if (execution.sessionId) {
107
+ this.log('');
108
+ this.log(styles.muted('View in tmux:'));
109
+ this.log(styles.muted(` tmux attach -t ${execution.sessionId}`));
110
+ }
111
+ else if (execution.environment === 'docker' && execution.containerId) {
112
+ this.log('');
113
+ this.log(styles.muted('View docker logs:'));
114
+ this.log(styles.muted(` docker logs -f ${execution.containerId}`));
115
+ }
116
+ this.log('');
117
+ return;
118
+ }
119
+ // Check if log file exists
120
+ if (!fs.existsSync(execution.logPath)) {
121
+ this.error(`Log file not found: ${execution.logPath}`);
122
+ }
123
+ // Display logs
124
+ this.log('');
125
+ this.log(styles.header(`📜 Logs for ${execution.id} (${execution.ticketId})`));
126
+ this.log(styles.muted(` Log file: ${execution.logPath}`));
127
+ this.log('');
128
+ if (flags.follow) {
129
+ // Stream logs with tail -f
130
+ const tailProcess = spawn('tail', ['-f', execution.logPath], {
131
+ stdio: 'inherit',
132
+ });
133
+ // Handle Ctrl+C
134
+ process.on('SIGINT', () => {
135
+ tailProcess.kill();
136
+ process.exit(0);
137
+ });
138
+ await new Promise((resolve) => {
139
+ tailProcess.on('close', resolve);
140
+ });
141
+ }
142
+ else if (flags.tail) {
143
+ // Show last n lines
144
+ const tailProcess = spawn('tail', ['-n', flags.tail.toString(), execution.logPath], {
145
+ stdio: 'inherit',
146
+ });
147
+ await new Promise((resolve) => {
148
+ tailProcess.on('close', resolve);
149
+ });
150
+ }
151
+ else {
152
+ // Show entire file
153
+ const content = fs.readFileSync(execution.logPath, 'utf-8');
154
+ this.log(content);
155
+ }
156
+ }
157
+ finally {
158
+ db.close();
159
+ }
160
+ }
161
+ }
@@ -0,0 +1,22 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class ExecutionStop extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ agent: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ };
15
+ protected getPMOOptions(): {
16
+ promptIfMultiple: boolean;
17
+ };
18
+ execute(): Promise<void>;
19
+ private bulkStop;
20
+ private singleStop;
21
+ private stopExecution;
22
+ }
@@ -0,0 +1,248 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import * as path from 'node:path';
3
+ import { execSync } from 'node:child_process';
4
+ import inquirer from 'inquirer';
5
+ import Database from 'better-sqlite3';
6
+ import { styles } from '../../lib/styles.js';
7
+ import { getWorkspaceInfo } from '../../lib/agents/commands.js';
8
+ import { ExecutionStorage } from '../../lib/execution/storage.js';
9
+ import { isDockerRunning } from '../../lib/execution/runners.js';
10
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
11
+ import { shouldOutputJson, outputPromptAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
12
+ export default class ExecutionStop extends PMOCommand {
13
+ static description = 'Stop running execution(s)';
14
+ static examples = [
15
+ '<%= config.bin %> <%= command.id %> WORK-001',
16
+ '<%= config.bin %> <%= command.id %> WORK-001 --force',
17
+ '<%= config.bin %> <%= command.id %> # Interactive mode',
18
+ '<%= config.bin %> <%= command.id %> --all',
19
+ '<%= config.bin %> <%= command.id %> --all --force',
20
+ '<%= config.bin %> <%= command.id %> --agent altman',
21
+ ];
22
+ static args = {
23
+ id: Args.string({
24
+ description: 'Execution ID - prompts if not provided (ignored if --all or --agent used)',
25
+ required: false,
26
+ }),
27
+ };
28
+ static flags = {
29
+ ...pmoBaseFlags,
30
+ force: Flags.boolean({
31
+ char: 'f',
32
+ description: 'Force kill (SIGKILL instead of SIGTERM)',
33
+ default: false,
34
+ }),
35
+ all: Flags.boolean({
36
+ description: 'Stop all running executions',
37
+ default: false,
38
+ }),
39
+ agent: Flags.string({
40
+ char: 'a',
41
+ description: 'Stop all executions for a specific agent',
42
+ }),
43
+ json: Flags.boolean({
44
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
45
+ default: false,
46
+ }),
47
+ };
48
+ getPMOOptions() {
49
+ return { promptIfMultiple: false };
50
+ }
51
+ async execute() {
52
+ const { args, flags } = await this.parse(ExecutionStop);
53
+ // Get workspace info
54
+ let workspaceInfo;
55
+ try {
56
+ workspaceInfo = getWorkspaceInfo();
57
+ }
58
+ catch {
59
+ this.error('Not in a workspace. Run "prlt init" first.');
60
+ }
61
+ // Open database
62
+ const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
63
+ const db = new Database(dbPath);
64
+ const executionStorage = new ExecutionStorage(db);
65
+ try {
66
+ // Determine if bulk stop or single stop
67
+ if (flags.all || flags.agent) {
68
+ await this.bulkStop(executionStorage, flags);
69
+ }
70
+ else {
71
+ await this.singleStop(executionStorage, args.id, flags);
72
+ }
73
+ }
74
+ finally {
75
+ db.close();
76
+ }
77
+ }
78
+ async bulkStop(executionStorage, flags) {
79
+ // Get running executions
80
+ const runningExecutions = executionStorage.listExecutions({
81
+ status: 'running',
82
+ agentName: flags.agent,
83
+ limit: 100,
84
+ });
85
+ const startingExecutions = executionStorage.listExecutions({
86
+ status: 'starting',
87
+ agentName: flags.agent,
88
+ limit: 100,
89
+ });
90
+ const activeExecutions = [...runningExecutions, ...startingExecutions];
91
+ if (activeExecutions.length === 0) {
92
+ const scope = flags.agent ? ` for agent "${flags.agent}"` : '';
93
+ this.log(styles.muted(`\nNo running executions found${scope}.\n`));
94
+ return;
95
+ }
96
+ this.log('');
97
+ this.log(styles.header(`Stopping ${activeExecutions.length} execution(s)...`));
98
+ this.log('');
99
+ let stopped = 0;
100
+ let failed = 0;
101
+ for (const execution of activeExecutions) {
102
+ try {
103
+ const success = await this.stopExecution(execution, flags.force || false);
104
+ if (success) {
105
+ executionStorage.updateStatus(execution.id, 'stopped');
106
+ this.log(styles.success(` ✓ ${execution.id} (${execution.agentName} → ${execution.ticketId})`));
107
+ stopped++;
108
+ }
109
+ }
110
+ catch (error) {
111
+ this.log(styles.error(` ✗ ${execution.id}: ${error instanceof Error ? error.message : error}`));
112
+ failed++;
113
+ }
114
+ }
115
+ this.log('');
116
+ this.log(styles.header('Summary'));
117
+ this.log(styles.success(` Stopped: ${stopped}`));
118
+ if (failed > 0) {
119
+ this.log(styles.error(` Failed: ${failed}`));
120
+ }
121
+ this.log('');
122
+ }
123
+ async singleStop(executionStorage, execId, flags) {
124
+ // Get execution ID - prompt if not provided
125
+ let id = execId;
126
+ if (!id) {
127
+ const runningExecutions = executionStorage.listExecutions({
128
+ status: 'running',
129
+ limit: 50,
130
+ });
131
+ // Also include 'starting' status
132
+ const startingExecutions = executionStorage.listExecutions({
133
+ status: 'starting',
134
+ limit: 50,
135
+ });
136
+ const activeExecutions = [...runningExecutions, ...startingExecutions];
137
+ if (activeExecutions.length === 0) {
138
+ this.log(styles.muted('\nNo running executions found.\n'));
139
+ return;
140
+ }
141
+ // Check if JSON output mode is active
142
+ const jsonMode = shouldOutputJson(flags);
143
+ // In JSON mode, output execution selection prompt
144
+ if (jsonMode) {
145
+ const execChoices = activeExecutions.map((e) => ({
146
+ name: `${e.id} - ${e.ticketId} (${e.agentName}, ${e.environment})`,
147
+ value: e.id,
148
+ }));
149
+ outputPromptAsJson(buildPromptConfig('list', 'executionId', 'Select execution to stop:', execChoices), createMetadata('execution stop', flags));
150
+ return;
151
+ }
152
+ const { selectedId } = await inquirer.prompt([
153
+ {
154
+ type: 'list',
155
+ name: 'selectedId',
156
+ message: 'Select execution to stop:',
157
+ choices: activeExecutions.map((e) => ({
158
+ name: `${e.id} - ${e.ticketId} (${e.agentName}, ${e.environment})`,
159
+ value: e.id,
160
+ })),
161
+ },
162
+ ]);
163
+ id = selectedId;
164
+ }
165
+ // Get execution
166
+ const execution = executionStorage.getExecution(id);
167
+ if (!execution) {
168
+ this.error(`Execution "${id}" not found.`);
169
+ }
170
+ // Check if already stopped
171
+ if (!['starting', 'running'].includes(execution.status)) {
172
+ this.log(styles.muted(`\nExecution ${id} is not running (status: ${execution.status}).\n`));
173
+ return;
174
+ }
175
+ // Stop the execution
176
+ this.log('');
177
+ this.log(styles.muted(`Stopping ${execution.id}...`));
178
+ const stopped = await this.stopExecution(execution, flags.force || false);
179
+ if (stopped) {
180
+ // Update execution status
181
+ executionStorage.updateStatus(execution.id, 'stopped');
182
+ this.log('');
183
+ this.log(styles.success(`✓ Stopped execution ${execution.id}`));
184
+ this.log(styles.muted(` Ticket: ${execution.ticketId}`));
185
+ this.log(styles.muted(` Agent: ${execution.agentName}`));
186
+ this.log('');
187
+ }
188
+ }
189
+ async stopExecution(execution, force) {
190
+ try {
191
+ // First try to kill any tmux session (all environments use tmux for session management)
192
+ if (execution.sessionId) {
193
+ try {
194
+ // Try to kill the tmux session
195
+ if (execution.environment === 'devcontainer' && execution.containerId) {
196
+ // Kill tmux session inside container
197
+ execSync(`docker exec ${execution.containerId} tmux kill-session -t "${execution.sessionId}"`, { stdio: 'pipe' });
198
+ }
199
+ else {
200
+ // Kill host tmux session
201
+ execSync(`tmux kill-session -t "${execution.sessionId}"`, { stdio: 'pipe' });
202
+ }
203
+ }
204
+ catch {
205
+ // Session may not exist
206
+ }
207
+ }
208
+ // Handle environment-specific cleanup
209
+ switch (execution.environment) {
210
+ case 'host':
211
+ // Kill process if we have a PID
212
+ if (execution.pid) {
213
+ const signal = force ? 'SIGKILL' : 'SIGTERM';
214
+ try {
215
+ process.kill(parseInt(execution.pid), signal);
216
+ }
217
+ catch {
218
+ // Process may have already exited
219
+ }
220
+ }
221
+ return true;
222
+ case 'docker':
223
+ case 'devcontainer':
224
+ if (execution.containerId) {
225
+ if (!isDockerRunning()) {
226
+ this.warn('Docker is not running. Cannot stop container.');
227
+ return true;
228
+ }
229
+ // Note: We don't stop the container itself, just the tmux session inside
230
+ // The container can be reused for future work
231
+ }
232
+ return true;
233
+ case 'vm':
234
+ if (execution.host && execution.sessionId) {
235
+ this.warn(`Cannot automatically stop VM execution. SSH to ${execution.host} and stop manually.`);
236
+ }
237
+ return true;
238
+ default:
239
+ this.warn(`Unknown environment: ${execution.environment}`);
240
+ return true;
241
+ }
242
+ }
243
+ catch (error) {
244
+ this.warn(`Error stopping execution: ${error instanceof Error ? error.message : error}`);
245
+ return true;
246
+ }
247
+ }
248
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class GH extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ };
8
+ run(): Promise<void>;
9
+ }
@@ -0,0 +1,53 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { shouldOutputJson, outputPromptAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
4
+ export default class GH extends Command {
5
+ static description = 'GitHub CLI setup and status for PR workflow';
6
+ static examples = [
7
+ '<%= config.bin %> <%= command.id %>',
8
+ '<%= config.bin %> <%= command.id %> status',
9
+ '<%= config.bin %> <%= command.id %> login',
10
+ '<%= config.bin %> <%= command.id %> token',
11
+ ];
12
+ static flags = {
13
+ json: Flags.boolean({
14
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
15
+ default: false,
16
+ }),
17
+ };
18
+ async run() {
19
+ const { flags } = await this.parse(GH);
20
+ // Check if JSON output mode is active
21
+ const jsonMode = shouldOutputJson(flags);
22
+ // Define choices once, use for both JSON and interactive modes
23
+ const menuChoices = [
24
+ { name: 'Check status', value: 'status' },
25
+ { name: 'Login to GitHub', value: 'login' },
26
+ { name: 'Show GH_TOKEN setup', value: 'token' },
27
+ ];
28
+ const message = 'GitHub CLI Setup';
29
+ // In JSON mode, output menu prompt
30
+ if (jsonMode) {
31
+ outputPromptAsJson(buildPromptConfig('list', 'action', message, menuChoices), createMetadata('gh', flags));
32
+ return;
33
+ }
34
+ // Interactive menu when no subcommand provided
35
+ const { action } = await inquirer.prompt([{
36
+ type: 'list',
37
+ name: 'action',
38
+ message,
39
+ choices: menuChoices,
40
+ }]);
41
+ switch (action) {
42
+ case 'status':
43
+ await this.config.runCommand('gh status');
44
+ break;
45
+ case 'login':
46
+ await this.config.runCommand('gh login');
47
+ break;
48
+ case 'token':
49
+ await this.config.runCommand('gh token');
50
+ break;
51
+ }
52
+ }
53
+ }
@@ -0,0 +1,6 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class GHLogin extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ }
@@ -0,0 +1,57 @@
1
+ import { Command } from '@oclif/core';
2
+ import { spawn } from 'node:child_process';
3
+ import chalk from 'chalk';
4
+ import { styles } from '../../lib/styles.js';
5
+ import { isGHInstalled, isGHAuthenticated, getGHUsername } from '../../lib/pr/index.js';
6
+ export default class GHLogin extends Command {
7
+ static description = 'Login to GitHub CLI for PR workflow';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %>',
10
+ ];
11
+ async run() {
12
+ // Check if gh is installed
13
+ if (!isGHInstalled()) {
14
+ this.log(chalk.red(' ✗ gh CLI not installed'));
15
+ this.log(styles.muted(''));
16
+ this.log(styles.muted(' Install with Homebrew:'));
17
+ this.log(chalk.cyan(' brew install gh'));
18
+ this.log(styles.muted(''));
19
+ this.log(styles.muted(' Or see: https://cli.github.com/'));
20
+ return;
21
+ }
22
+ // Check if already authenticated
23
+ if (isGHAuthenticated()) {
24
+ const username = getGHUsername();
25
+ this.log(chalk.green(`Already authenticated${username ? ` as ${chalk.bold(username)}` : ''}`));
26
+ this.log(styles.muted(''));
27
+ this.log(styles.muted('To re-authenticate or switch accounts, run directly:'));
28
+ this.log(chalk.cyan(' gh auth login'));
29
+ return;
30
+ }
31
+ this.log(styles.muted('Starting GitHub authentication...\n'));
32
+ // Run gh auth login interactively
33
+ const child = spawn('gh', ['auth', 'login'], {
34
+ stdio: 'inherit',
35
+ shell: true,
36
+ });
37
+ await new Promise((resolve, reject) => {
38
+ child.on('close', (code) => {
39
+ if (code === 0) {
40
+ this.log(chalk.green('\n✓ Successfully authenticated!'));
41
+ this.log(styles.muted(''));
42
+ this.log(styles.muted('Next, set up GH_TOKEN for devcontainers:'));
43
+ this.log(chalk.cyan(' prlt gh token'));
44
+ resolve();
45
+ }
46
+ else {
47
+ this.log(chalk.yellow('\nAuthentication cancelled or failed.'));
48
+ resolve();
49
+ }
50
+ });
51
+ child.on('error', (err) => {
52
+ this.log(chalk.red(`\nFailed to run gh auth login: ${err.message}`));
53
+ reject(err);
54
+ });
55
+ });
56
+ }
57
+ }
@@ -0,0 +1,6 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class GHStatus extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ }
@@ -0,0 +1,48 @@
1
+ import { Command } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import { styles } from '../../lib/styles.js';
4
+ import { isGHInstalled, isGHAuthenticated, getGHUsername, isGHTokenInEnv } from '../../lib/pr/index.js';
5
+ export default class GHStatus extends Command {
6
+ static description = 'Check GitHub CLI status for PR workflow';
7
+ static examples = [
8
+ '<%= config.bin %> <%= command.id %>',
9
+ ];
10
+ async run() {
11
+ this.log(styles.muted('Checking GitHub CLI status...\n'));
12
+ // Check if gh is installed
13
+ if (!isGHInstalled()) {
14
+ this.log(chalk.red(' ✗ gh CLI not installed'));
15
+ this.log(styles.muted(''));
16
+ this.log(styles.muted(' Install with Homebrew:'));
17
+ this.log(chalk.cyan(' brew install gh'));
18
+ this.log(styles.muted(''));
19
+ this.log(styles.muted(' Or see: https://cli.github.com/'));
20
+ return;
21
+ }
22
+ this.log(chalk.green(' ✓ gh CLI installed'));
23
+ // Check if gh is authenticated
24
+ if (!isGHAuthenticated()) {
25
+ this.log(chalk.yellow(' ⚠ gh CLI not authenticated'));
26
+ this.log(styles.muted(''));
27
+ this.log(styles.muted(' Run to authenticate:'));
28
+ this.log(chalk.cyan(' prlt gh login'));
29
+ this.log(styles.muted(''));
30
+ return;
31
+ }
32
+ const username = getGHUsername();
33
+ this.log(chalk.green(` ✓ Authenticated${username ? ` as ${chalk.bold(username)}` : ''}`));
34
+ // Check if GH_TOKEN is available for devcontainers
35
+ if (isGHTokenInEnv()) {
36
+ this.log(chalk.green(' ✓ GH_TOKEN available for devcontainers'));
37
+ this.log(styles.muted(''));
38
+ this.log(chalk.green('All set! PR creation will work in both host and devcontainers.'));
39
+ }
40
+ else {
41
+ this.log(chalk.yellow(' ⚠ GH_TOKEN not set'));
42
+ this.log(styles.muted(''));
43
+ this.log(styles.muted(' PR creation works on host, but not in devcontainers.'));
44
+ this.log(styles.muted(' Run to see setup instructions:'));
45
+ this.log(chalk.cyan(' prlt gh token'));
46
+ }
47
+ }
48
+ }
@@ -0,0 +1,6 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class GHToken extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ }