@proletariat/cli 0.1.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (526) hide show
  1. package/README.md +510 -255
  2. package/bin/dev.cmd +3 -0
  3. package/bin/dev.js +5 -0
  4. package/bin/run.cmd +3 -0
  5. package/bin/run.js +23 -0
  6. package/dist/commands/action/create.d.ts +21 -0
  7. package/dist/commands/action/create.js +126 -0
  8. package/dist/commands/action/delete.d.ts +17 -0
  9. package/dist/commands/action/delete.js +78 -0
  10. package/dist/commands/action/index.d.ts +15 -0
  11. package/dist/commands/action/index.js +107 -0
  12. package/dist/commands/action/list.d.ts +14 -0
  13. package/dist/commands/action/list.js +89 -0
  14. package/dist/commands/action/run.d.ts +19 -0
  15. package/dist/commands/action/run.js +179 -0
  16. package/dist/commands/action/show.d.ts +15 -0
  17. package/dist/commands/action/show.js +47 -0
  18. package/dist/commands/action/update.d.ts +22 -0
  19. package/dist/commands/action/update.js +168 -0
  20. package/dist/commands/agent/index.d.ts +13 -0
  21. package/dist/commands/agent/index.js +131 -0
  22. package/dist/commands/agent/list.d.ts +7 -0
  23. package/dist/commands/agent/list.js +126 -0
  24. package/dist/commands/agent/login.d.ts +16 -0
  25. package/dist/commands/agent/login.js +146 -0
  26. package/dist/commands/agent/rebuild.d.ts +18 -0
  27. package/dist/commands/agent/rebuild.js +133 -0
  28. package/dist/commands/agent/restart.d.ts +17 -0
  29. package/dist/commands/agent/restart.js +116 -0
  30. package/dist/commands/agent/shell.d.ts +23 -0
  31. package/dist/commands/agent/shell.js +378 -0
  32. package/dist/commands/agent/staff/add.d.ts +15 -0
  33. package/dist/commands/agent/staff/add.js +281 -0
  34. package/dist/commands/agent/staff/index.d.ts +14 -0
  35. package/dist/commands/agent/staff/index.js +90 -0
  36. package/dist/commands/agent/staff/list.d.ts +7 -0
  37. package/dist/commands/agent/staff/list.js +90 -0
  38. package/dist/commands/agent/staff/remove.d.ts +16 -0
  39. package/dist/commands/agent/staff/remove.js +137 -0
  40. package/dist/commands/agent/status.d.ts +17 -0
  41. package/dist/commands/agent/status.js +139 -0
  42. package/dist/commands/agent/temp/cleanup.d.ts +23 -0
  43. package/dist/commands/agent/temp/cleanup.js +388 -0
  44. package/dist/commands/agent/temp/index.d.ts +14 -0
  45. package/dist/commands/agent/temp/index.js +82 -0
  46. package/dist/commands/agent/temp/list.d.ts +7 -0
  47. package/dist/commands/agent/temp/list.js +108 -0
  48. package/dist/commands/agent/themes/add-names.d.ts +10 -0
  49. package/dist/commands/agent/themes/add-names.js +67 -0
  50. package/dist/commands/agent/themes/create.d.ts +13 -0
  51. package/dist/commands/agent/themes/create.js +66 -0
  52. package/dist/commands/agent/themes/index.d.ts +9 -0
  53. package/dist/commands/agent/themes/index.js +194 -0
  54. package/dist/commands/agent/themes/list.d.ts +6 -0
  55. package/dist/commands/agent/themes/list.js +41 -0
  56. package/dist/commands/agent/themes/set.d.ts +12 -0
  57. package/dist/commands/agent/themes/set.js +77 -0
  58. package/dist/commands/agent/visit.d.ts +16 -0
  59. package/dist/commands/agent/visit.js +88 -0
  60. package/dist/commands/autocomplete/setup.d.ts +14 -0
  61. package/dist/commands/autocomplete/setup.js +154 -0
  62. package/dist/commands/board/index.d.ts +17 -0
  63. package/dist/commands/board/index.js +255 -0
  64. package/dist/commands/board/watch.d.ts +13 -0
  65. package/dist/commands/board/watch.js +52 -0
  66. package/dist/commands/branch/create.d.ts +50 -0
  67. package/dist/commands/branch/create.js +624 -0
  68. package/dist/commands/branch/index.d.ts +13 -0
  69. package/dist/commands/branch/index.js +50 -0
  70. package/dist/commands/branch/list.d.ts +17 -0
  71. package/dist/commands/branch/list.js +120 -0
  72. package/dist/commands/branch/validate.d.ts +15 -0
  73. package/dist/commands/branch/validate.js +73 -0
  74. package/dist/commands/commit.d.ts +71 -0
  75. package/dist/commands/commit.js +499 -0
  76. package/dist/commands/docker/clean.d.ts +13 -0
  77. package/dist/commands/docker/clean.js +224 -0
  78. package/dist/commands/docker/index.d.ts +19 -0
  79. package/dist/commands/docker/index.js +274 -0
  80. package/dist/commands/docker/list.d.ts +16 -0
  81. package/dist/commands/docker/list.js +200 -0
  82. package/dist/commands/docker/logs.d.ts +14 -0
  83. package/dist/commands/docker/logs.js +118 -0
  84. package/dist/commands/docker/prune.d.ts +14 -0
  85. package/dist/commands/docker/prune.js +211 -0
  86. package/dist/commands/docker/restart.d.ts +14 -0
  87. package/dist/commands/docker/restart.js +129 -0
  88. package/dist/commands/docker/shell.d.ts +14 -0
  89. package/dist/commands/docker/shell.js +103 -0
  90. package/dist/commands/docker/start.d.ts +12 -0
  91. package/dist/commands/docker/start.js +92 -0
  92. package/dist/commands/docker/status.d.ts +7 -0
  93. package/dist/commands/docker/status.js +40 -0
  94. package/dist/commands/docker/stop.d.ts +14 -0
  95. package/dist/commands/docker/stop.js +134 -0
  96. package/dist/commands/docker/sync.d.ts +15 -0
  97. package/dist/commands/docker/sync.js +112 -0
  98. package/dist/commands/epic/activate.d.ts +13 -0
  99. package/dist/commands/epic/activate.js +118 -0
  100. package/dist/commands/epic/archive.d.ts +14 -0
  101. package/dist/commands/epic/archive.js +132 -0
  102. package/dist/commands/epic/create.d.ts +15 -0
  103. package/dist/commands/epic/create.js +137 -0
  104. package/dist/commands/epic/index.d.ts +13 -0
  105. package/dist/commands/epic/index.js +88 -0
  106. package/dist/commands/epic/link/block.d.ts +14 -0
  107. package/dist/commands/epic/link/block.js +79 -0
  108. package/dist/commands/epic/link/duplicates.d.ts +14 -0
  109. package/dist/commands/epic/link/duplicates.js +66 -0
  110. package/dist/commands/epic/link/index.d.ts +19 -0
  111. package/dist/commands/epic/link/index.js +242 -0
  112. package/dist/commands/epic/link/relates.d.ts +14 -0
  113. package/dist/commands/epic/link/relates.js +66 -0
  114. package/dist/commands/epic/link/remove.d.ts +16 -0
  115. package/dist/commands/epic/link/remove.js +89 -0
  116. package/dist/commands/epic/list.d.ts +11 -0
  117. package/dist/commands/epic/list.js +87 -0
  118. package/dist/commands/epic/move.d.ts +15 -0
  119. package/dist/commands/epic/move.js +184 -0
  120. package/dist/commands/epic/progress.d.ts +16 -0
  121. package/dist/commands/epic/progress.js +166 -0
  122. package/dist/commands/epic/project.d.ts +15 -0
  123. package/dist/commands/epic/project.js +219 -0
  124. package/dist/commands/epic/reorder.d.ts +21 -0
  125. package/dist/commands/epic/reorder.js +160 -0
  126. package/dist/commands/epic/spec.d.ts +15 -0
  127. package/dist/commands/epic/spec.js +191 -0
  128. package/dist/commands/epic/ticket.d.ts +18 -0
  129. package/dist/commands/epic/ticket.js +291 -0
  130. package/dist/commands/epic/view.d.ts +13 -0
  131. package/dist/commands/epic/view.js +117 -0
  132. package/dist/commands/execution/index.d.ts +13 -0
  133. package/dist/commands/execution/index.js +70 -0
  134. package/dist/commands/execution/list.d.ts +15 -0
  135. package/dist/commands/execution/list.js +144 -0
  136. package/dist/commands/execution/logs.d.ts +18 -0
  137. package/dist/commands/execution/logs.js +161 -0
  138. package/dist/commands/execution/stop.d.ts +22 -0
  139. package/dist/commands/execution/stop.js +248 -0
  140. package/dist/commands/gh/index.d.ts +9 -0
  141. package/dist/commands/gh/index.js +53 -0
  142. package/dist/commands/gh/login.d.ts +6 -0
  143. package/dist/commands/gh/login.js +57 -0
  144. package/dist/commands/gh/status.d.ts +6 -0
  145. package/dist/commands/gh/status.js +48 -0
  146. package/dist/commands/gh/token.d.ts +6 -0
  147. package/dist/commands/gh/token.js +59 -0
  148. package/dist/commands/init.d.ts +26 -0
  149. package/dist/commands/init.js +200 -0
  150. package/dist/commands/phase/create.d.ts +22 -0
  151. package/dist/commands/phase/create.js +123 -0
  152. package/dist/commands/phase/delete.d.ts +17 -0
  153. package/dist/commands/phase/delete.js +73 -0
  154. package/dist/commands/phase/list.d.ts +12 -0
  155. package/dist/commands/phase/list.js +76 -0
  156. package/dist/commands/phase/move.d.ts +17 -0
  157. package/dist/commands/phase/move.js +115 -0
  158. package/dist/commands/phase/template/apply.d.ts +17 -0
  159. package/dist/commands/phase/template/apply.js +106 -0
  160. package/dist/commands/phase/template/create.d.ts +16 -0
  161. package/dist/commands/phase/template/create.js +58 -0
  162. package/dist/commands/phase/template/delete.d.ts +17 -0
  163. package/dist/commands/phase/template/delete.js +98 -0
  164. package/dist/commands/phase/template/index.d.ts +15 -0
  165. package/dist/commands/phase/template/index.js +128 -0
  166. package/dist/commands/phase/template/list.d.ts +16 -0
  167. package/dist/commands/phase/template/list.js +95 -0
  168. package/dist/commands/phase/template/update.d.ts +17 -0
  169. package/dist/commands/phase/template/update.js +89 -0
  170. package/dist/commands/phase/update.d.ts +23 -0
  171. package/dist/commands/phase/update.js +174 -0
  172. package/dist/commands/pmo/init.d.ts +25 -0
  173. package/dist/commands/pmo/init.js +341 -0
  174. package/dist/commands/pr/create.d.ts +17 -0
  175. package/dist/commands/pr/create.js +242 -0
  176. package/dist/commands/pr/index.d.ts +9 -0
  177. package/dist/commands/pr/index.js +68 -0
  178. package/dist/commands/pr/link.d.ts +14 -0
  179. package/dist/commands/pr/link.js +212 -0
  180. package/dist/commands/pr/status.d.ts +12 -0
  181. package/dist/commands/pr/status.js +161 -0
  182. package/dist/commands/project/archive.d.ts +17 -0
  183. package/dist/commands/project/archive.js +83 -0
  184. package/dist/commands/project/create.d.ts +22 -0
  185. package/dist/commands/project/create.js +143 -0
  186. package/dist/commands/project/delete.d.ts +17 -0
  187. package/dist/commands/project/delete.js +128 -0
  188. package/dist/commands/project/index.d.ts +13 -0
  189. package/dist/commands/project/index.js +64 -0
  190. package/dist/commands/project/list.d.ts +14 -0
  191. package/dist/commands/project/list.js +96 -0
  192. package/dist/commands/project/spec.d.ts +18 -0
  193. package/dist/commands/project/spec.js +216 -0
  194. package/dist/commands/project/unarchive.d.ts +15 -0
  195. package/dist/commands/project/unarchive.js +35 -0
  196. package/dist/commands/project/view.d.ts +16 -0
  197. package/dist/commands/project/view.js +94 -0
  198. package/dist/commands/repo/add.d.ts +21 -0
  199. package/dist/commands/repo/add.js +118 -0
  200. package/dist/commands/repo/index.d.ts +13 -0
  201. package/dist/commands/repo/index.js +114 -0
  202. package/dist/commands/repo/list.d.ts +13 -0
  203. package/dist/commands/repo/list.js +96 -0
  204. package/dist/commands/repo/remove.d.ts +23 -0
  205. package/dist/commands/repo/remove.js +217 -0
  206. package/dist/commands/repo/view.d.ts +15 -0
  207. package/dist/commands/repo/view.js +99 -0
  208. package/dist/commands/session/attach.d.ts +40 -0
  209. package/dist/commands/session/attach.js +307 -0
  210. package/dist/commands/session/index.d.ts +13 -0
  211. package/dist/commands/session/index.js +64 -0
  212. package/dist/commands/session/list.d.ts +21 -0
  213. package/dist/commands/session/list.js +181 -0
  214. package/dist/commands/spec/create.d.ts +19 -0
  215. package/dist/commands/spec/create.js +130 -0
  216. package/dist/commands/spec/index.d.ts +13 -0
  217. package/dist/commands/spec/index.js +68 -0
  218. package/dist/commands/spec/link/depends.d.ts +14 -0
  219. package/dist/commands/spec/link/depends.js +64 -0
  220. package/dist/commands/spec/link/duplicates.d.ts +14 -0
  221. package/dist/commands/spec/link/duplicates.js +63 -0
  222. package/dist/commands/spec/link/index.d.ts +19 -0
  223. package/dist/commands/spec/link/index.js +200 -0
  224. package/dist/commands/spec/link/relates.d.ts +14 -0
  225. package/dist/commands/spec/link/relates.js +63 -0
  226. package/dist/commands/spec/link/remove.d.ts +16 -0
  227. package/dist/commands/spec/link/remove.js +94 -0
  228. package/dist/commands/spec/list.d.ts +12 -0
  229. package/dist/commands/spec/list.js +75 -0
  230. package/dist/commands/spec/plan.d.ts +15 -0
  231. package/dist/commands/spec/plan.js +108 -0
  232. package/dist/commands/spec/ticket.d.ts +18 -0
  233. package/dist/commands/spec/ticket.js +160 -0
  234. package/dist/commands/spec/view.d.ts +15 -0
  235. package/dist/commands/spec/view.js +163 -0
  236. package/dist/commands/status/create.d.ts +21 -0
  237. package/dist/commands/status/create.js +140 -0
  238. package/dist/commands/status/delete.d.ts +13 -0
  239. package/dist/commands/status/delete.js +77 -0
  240. package/dist/commands/status/index.d.ts +14 -0
  241. package/dist/commands/status/index.js +91 -0
  242. package/dist/commands/status/list.d.ts +12 -0
  243. package/dist/commands/status/list.js +93 -0
  244. package/dist/commands/status/move.d.ts +14 -0
  245. package/dist/commands/status/move.js +120 -0
  246. package/dist/commands/status/update.d.ts +20 -0
  247. package/dist/commands/status/update.js +180 -0
  248. package/dist/commands/template/delete.d.ts +15 -0
  249. package/dist/commands/template/delete.js +142 -0
  250. package/dist/commands/template/index.d.ts +10 -0
  251. package/dist/commands/template/index.js +64 -0
  252. package/dist/commands/template/list.d.ts +18 -0
  253. package/dist/commands/template/list.js +157 -0
  254. package/dist/commands/template/phase/apply.d.ts +14 -0
  255. package/dist/commands/template/phase/apply.js +41 -0
  256. package/dist/commands/template/phase/create.d.ts +12 -0
  257. package/dist/commands/template/phase/create.js +29 -0
  258. package/dist/commands/template/phase/delete.d.ts +13 -0
  259. package/dist/commands/template/phase/delete.js +34 -0
  260. package/dist/commands/template/phase/index.d.ts +10 -0
  261. package/dist/commands/template/phase/index.js +62 -0
  262. package/dist/commands/template/phase/list.d.ts +11 -0
  263. package/dist/commands/template/phase/list.js +34 -0
  264. package/dist/commands/template/phase/update.d.ts +13 -0
  265. package/dist/commands/template/phase/update.js +35 -0
  266. package/dist/commands/template/ticket/apply.d.ts +17 -0
  267. package/dist/commands/template/ticket/apply.js +58 -0
  268. package/dist/commands/template/ticket/delete.d.ts +13 -0
  269. package/dist/commands/template/ticket/delete.js +34 -0
  270. package/dist/commands/template/ticket/index.d.ts +10 -0
  271. package/dist/commands/template/ticket/index.js +62 -0
  272. package/dist/commands/template/ticket/list.d.ts +11 -0
  273. package/dist/commands/template/ticket/list.js +34 -0
  274. package/dist/commands/template/ticket/save.d.ts +13 -0
  275. package/dist/commands/template/ticket/save.js +35 -0
  276. package/dist/commands/ticket/bulk.d.ts +13 -0
  277. package/dist/commands/ticket/bulk.js +145 -0
  278. package/dist/commands/ticket/complete.d.ts +16 -0
  279. package/dist/commands/ticket/complete.js +170 -0
  280. package/dist/commands/ticket/create.d.ts +22 -0
  281. package/dist/commands/ticket/create.js +390 -0
  282. package/dist/commands/ticket/delete.d.ts +16 -0
  283. package/dist/commands/ticket/delete.js +178 -0
  284. package/dist/commands/ticket/edit.d.ts +27 -0
  285. package/dist/commands/ticket/edit.js +322 -0
  286. package/dist/commands/ticket/epic.d.ts +20 -0
  287. package/dist/commands/ticket/epic.js +333 -0
  288. package/dist/commands/ticket/index.d.ts +13 -0
  289. package/dist/commands/ticket/index.js +103 -0
  290. package/dist/commands/ticket/link/block.d.ts +14 -0
  291. package/dist/commands/ticket/link/block.js +94 -0
  292. package/dist/commands/ticket/link/duplicates.d.ts +14 -0
  293. package/dist/commands/ticket/link/duplicates.js +93 -0
  294. package/dist/commands/ticket/link/index.d.ts +19 -0
  295. package/dist/commands/ticket/link/index.js +239 -0
  296. package/dist/commands/ticket/link/relates.d.ts +14 -0
  297. package/dist/commands/ticket/link/relates.js +93 -0
  298. package/dist/commands/ticket/link/remove.d.ts +16 -0
  299. package/dist/commands/ticket/link/remove.js +128 -0
  300. package/dist/commands/ticket/list.d.ts +24 -0
  301. package/dist/commands/ticket/list.js +431 -0
  302. package/dist/commands/ticket/move.d.ts +18 -0
  303. package/dist/commands/ticket/move.js +212 -0
  304. package/dist/commands/ticket/project.d.ts +18 -0
  305. package/dist/commands/ticket/project.js +254 -0
  306. package/dist/commands/ticket/reassign.d.ts +19 -0
  307. package/dist/commands/ticket/reassign.js +279 -0
  308. package/dist/commands/ticket/spec.d.ts +18 -0
  309. package/dist/commands/ticket/spec.js +259 -0
  310. package/dist/commands/ticket/status.d.ts +13 -0
  311. package/dist/commands/ticket/status.js +87 -0
  312. package/dist/commands/ticket/template/apply.d.ts +25 -0
  313. package/dist/commands/ticket/template/apply.js +249 -0
  314. package/dist/commands/ticket/template/create.d.ts +19 -0
  315. package/dist/commands/ticket/template/create.js +210 -0
  316. package/dist/commands/ticket/template/delete.d.ts +17 -0
  317. package/dist/commands/ticket/template/delete.js +92 -0
  318. package/dist/commands/ticket/template/index.d.ts +15 -0
  319. package/dist/commands/ticket/template/index.js +118 -0
  320. package/dist/commands/ticket/template/list.d.ts +16 -0
  321. package/dist/commands/ticket/template/list.js +110 -0
  322. package/dist/commands/ticket/template/save.d.ts +14 -0
  323. package/dist/commands/ticket/template/save.js +110 -0
  324. package/dist/commands/ticket/update.d.ts +18 -0
  325. package/dist/commands/ticket/update.js +325 -0
  326. package/dist/commands/ticket/view.d.ts +13 -0
  327. package/dist/commands/ticket/view.js +80 -0
  328. package/dist/commands/whoami.d.ts +9 -0
  329. package/dist/commands/whoami.js +103 -0
  330. package/dist/commands/work/complete.d.ts +13 -0
  331. package/dist/commands/work/complete.js +121 -0
  332. package/dist/commands/work/index.d.ts +13 -0
  333. package/dist/commands/work/index.js +70 -0
  334. package/dist/commands/work/ready.d.ts +24 -0
  335. package/dist/commands/work/ready.js +290 -0
  336. package/dist/commands/work/revise.d.ts +19 -0
  337. package/dist/commands/work/revise.js +377 -0
  338. package/dist/commands/work/spawn-all.d.ts +17 -0
  339. package/dist/commands/work/spawn-all.js +58 -0
  340. package/dist/commands/work/spawn.d.ts +29 -0
  341. package/dist/commands/work/spawn.js +728 -0
  342. package/dist/commands/work/start.d.ts +39 -0
  343. package/dist/commands/work/start.js +1393 -0
  344. package/dist/commands/work/watch.d.ts +31 -0
  345. package/dist/commands/work/watch.js +359 -0
  346. package/dist/commands/workflow/create.d.ts +18 -0
  347. package/dist/commands/workflow/create.js +119 -0
  348. package/dist/commands/workflow/delete.d.ts +17 -0
  349. package/dist/commands/workflow/delete.js +119 -0
  350. package/dist/commands/workflow/index.d.ts +15 -0
  351. package/dist/commands/workflow/index.js +75 -0
  352. package/dist/commands/workflow/list.d.ts +15 -0
  353. package/dist/commands/workflow/list.js +75 -0
  354. package/dist/commands/workflow/switch.d.ts +13 -0
  355. package/dist/commands/workflow/switch.js +117 -0
  356. package/dist/commands/workflow/view.d.ts +16 -0
  357. package/dist/commands/workflow/view.js +114 -0
  358. package/dist/commands/workspace/add.d.ts +12 -0
  359. package/dist/commands/workspace/add.js +74 -0
  360. package/dist/commands/workspace/list.d.ts +9 -0
  361. package/dist/commands/workspace/list.js +153 -0
  362. package/dist/commands/workspace/remove.d.ts +13 -0
  363. package/dist/commands/workspace/remove.js +98 -0
  364. package/dist/commands/workspace/use.d.ts +12 -0
  365. package/dist/commands/workspace/use.js +111 -0
  366. package/dist/hooks/init.d.ts +11 -0
  367. package/dist/hooks/init.js +57 -0
  368. package/dist/index.d.ts +1 -0
  369. package/dist/index.js +1 -0
  370. package/dist/lib/agents/commands.d.ts +189 -0
  371. package/dist/lib/agents/commands.js +893 -0
  372. package/dist/lib/agents/index.d.ts +54 -0
  373. package/dist/lib/agents/index.js +382 -0
  374. package/dist/lib/branch/index.d.ts +120 -0
  375. package/dist/lib/branch/index.js +334 -0
  376. package/dist/lib/colors.d.ts +94 -0
  377. package/dist/lib/colors.js +68 -0
  378. package/dist/lib/commands/docker-command.d.ts +21 -0
  379. package/dist/lib/commands/docker-command.js +27 -0
  380. package/dist/lib/database/index.d.ts +176 -0
  381. package/dist/lib/database/index.js +581 -0
  382. package/dist/lib/docker/resolve.d.ts +38 -0
  383. package/dist/lib/docker/resolve.js +175 -0
  384. package/dist/lib/execution/config.d.ts +150 -0
  385. package/dist/lib/execution/config.js +541 -0
  386. package/dist/lib/execution/devcontainer.d.ts +85 -0
  387. package/dist/lib/execution/devcontainer.js +594 -0
  388. package/dist/lib/execution/index.d.ts +10 -0
  389. package/dist/lib/execution/index.js +10 -0
  390. package/dist/lib/execution/runners.d.ts +53 -0
  391. package/dist/lib/execution/runners.js +1182 -0
  392. package/dist/lib/execution/spawner.d.ts +85 -0
  393. package/dist/lib/execution/spawner.js +548 -0
  394. package/dist/lib/execution/storage.d.ts +159 -0
  395. package/dist/lib/execution/storage.js +425 -0
  396. package/dist/lib/execution/types.d.ts +145 -0
  397. package/dist/lib/execution/types.js +157 -0
  398. package/dist/lib/init/index.d.ts +75 -0
  399. package/dist/lib/init/index.js +355 -0
  400. package/dist/lib/machine-config.d.ts +170 -0
  401. package/dist/lib/machine-config.js +386 -0
  402. package/dist/lib/pmo/base-command.d.ts +195 -0
  403. package/dist/lib/pmo/base-command.js +319 -0
  404. package/dist/lib/pmo/create-spec-folders.d.ts +43 -0
  405. package/dist/lib/pmo/create-spec-folders.js +64 -0
  406. package/dist/lib/pmo/epic-files.d.ts +56 -0
  407. package/dist/lib/pmo/epic-files.js +195 -0
  408. package/dist/lib/pmo/find-pmo.d.ts +14 -0
  409. package/dist/lib/pmo/find-pmo.js +172 -0
  410. package/dist/lib/pmo/index.d.ts +109 -0
  411. package/dist/lib/pmo/index.js +501 -0
  412. package/dist/lib/pmo/markdown.d.ts +31 -0
  413. package/dist/lib/pmo/markdown.js +245 -0
  414. package/dist/lib/pmo/pmo-context.d.ts +27 -0
  415. package/dist/lib/pmo/pmo-context.js +44 -0
  416. package/dist/lib/pmo/schema.d.ts +82 -0
  417. package/dist/lib/pmo/schema.js +531 -0
  418. package/dist/lib/pmo/spec-parser.d.ts +25 -0
  419. package/dist/lib/pmo/spec-parser.js +205 -0
  420. package/dist/lib/pmo/spec-types.d.ts +43 -0
  421. package/dist/lib/pmo/spec-types.js +7 -0
  422. package/dist/lib/pmo/storage/actions.d.ts +34 -0
  423. package/dist/lib/pmo/storage/actions.js +177 -0
  424. package/dist/lib/pmo/storage/base.d.ts +47 -0
  425. package/dist/lib/pmo/storage/base.js +858 -0
  426. package/dist/lib/pmo/storage/dependencies.d.ts +61 -0
  427. package/dist/lib/pmo/storage/dependencies.js +267 -0
  428. package/dist/lib/pmo/storage/epics.d.ts +46 -0
  429. package/dist/lib/pmo/storage/epics.js +243 -0
  430. package/dist/lib/pmo/storage/helpers.d.ts +33 -0
  431. package/dist/lib/pmo/storage/helpers.js +148 -0
  432. package/dist/lib/pmo/storage/index.d.ts +186 -0
  433. package/dist/lib/pmo/storage/index.js +689 -0
  434. package/dist/lib/pmo/storage/phases.d.ts +65 -0
  435. package/dist/lib/pmo/storage/phases.js +392 -0
  436. package/dist/lib/pmo/storage/projects.d.ts +79 -0
  437. package/dist/lib/pmo/storage/projects.js +303 -0
  438. package/dist/lib/pmo/storage/specs.d.ts +77 -0
  439. package/dist/lib/pmo/storage/specs.js +389 -0
  440. package/dist/lib/pmo/storage/statuses.d.ts +63 -0
  441. package/dist/lib/pmo/storage/statuses.js +404 -0
  442. package/dist/lib/pmo/storage/subtasks.d.ts +37 -0
  443. package/dist/lib/pmo/storage/subtasks.js +184 -0
  444. package/dist/lib/pmo/storage/templates.d.ts +40 -0
  445. package/dist/lib/pmo/storage/templates.js +210 -0
  446. package/dist/lib/pmo/storage/tickets.d.ts +57 -0
  447. package/dist/lib/pmo/storage/tickets.js +453 -0
  448. package/dist/lib/pmo/storage/types.d.ts +200 -0
  449. package/dist/lib/pmo/storage/types.js +5 -0
  450. package/dist/lib/pmo/storage/views.d.ts +44 -0
  451. package/dist/lib/pmo/storage/views.js +355 -0
  452. package/dist/lib/pmo/storage-sqlite.d.ts +7 -0
  453. package/dist/lib/pmo/storage-sqlite.js +7 -0
  454. package/dist/lib/pmo/sync-manager.d.ts +92 -0
  455. package/dist/lib/pmo/sync-manager.js +229 -0
  456. package/dist/lib/pmo/types.d.ts +710 -0
  457. package/dist/lib/pmo/types.js +108 -0
  458. package/dist/lib/pmo/utils.d.ts +122 -0
  459. package/dist/lib/pmo/utils.js +174 -0
  460. package/dist/lib/pmo/watcher.d.ts +43 -0
  461. package/dist/lib/pmo/watcher.js +208 -0
  462. package/dist/lib/pr/index.d.ts +150 -0
  463. package/dist/lib/pr/index.js +483 -0
  464. package/dist/lib/prompt-json.d.ts +231 -0
  465. package/dist/lib/prompt-json.js +213 -0
  466. package/dist/lib/repos/index.d.ts +81 -0
  467. package/dist/lib/repos/index.js +679 -0
  468. package/dist/lib/styles.d.ts +98 -0
  469. package/dist/lib/styles.js +195 -0
  470. package/dist/lib/themes.d.ts +128 -0
  471. package/dist/lib/themes.js +301 -0
  472. package/dist/lib/ui/BoardUI.d.ts +21 -0
  473. package/dist/lib/ui/BoardUI.js +85 -0
  474. package/dist/lib/ui/ClaimTicketUI.d.ts +17 -0
  475. package/dist/lib/ui/ClaimTicketUI.js +64 -0
  476. package/dist/lib/ui/CreateTicketUI.d.ts +13 -0
  477. package/dist/lib/ui/CreateTicketUI.js +101 -0
  478. package/dist/lib/workspace.d.ts +66 -0
  479. package/dist/lib/workspace.js +204 -0
  480. package/oclif.manifest.json +10593 -0
  481. package/package.json +104 -52
  482. package/LICENSE +0 -21
  483. package/dist/bin/prlt.d.ts +0 -11
  484. package/dist/bin/prlt.d.ts.map +0 -1
  485. package/dist/bin/prlt.js +0 -144
  486. package/dist/bin/prlt.js.map +0 -1
  487. package/dist/lib/config/index.d.ts +0 -14
  488. package/dist/lib/config/index.d.ts.map +0 -1
  489. package/dist/lib/config/index.js +0 -139
  490. package/dist/lib/config/index.js.map +0 -1
  491. package/dist/lib/config/upgrade.d.ts +0 -2
  492. package/dist/lib/config/upgrade.d.ts.map +0 -1
  493. package/dist/lib/config/upgrade.js +0 -173
  494. package/dist/lib/config/upgrade.js.map +0 -1
  495. package/dist/lib/themes/index.d.ts +0 -8
  496. package/dist/lib/themes/index.d.ts.map +0 -1
  497. package/dist/lib/themes/index.js +0 -80
  498. package/dist/lib/themes/index.js.map +0 -1
  499. package/dist/lib/utils/helpers.d.ts +0 -4
  500. package/dist/lib/utils/helpers.d.ts.map +0 -1
  501. package/dist/lib/utils/helpers.js +0 -39
  502. package/dist/lib/utils/helpers.js.map +0 -1
  503. package/dist/lib/utils/logger.d.ts +0 -4
  504. package/dist/lib/utils/logger.d.ts.map +0 -1
  505. package/dist/lib/utils/logger.js +0 -28
  506. package/dist/lib/utils/logger.js.map +0 -1
  507. package/dist/lib/workspace/index.d.ts +0 -13
  508. package/dist/lib/workspace/index.d.ts.map +0 -1
  509. package/dist/lib/workspace/index.js +0 -116
  510. package/dist/lib/workspace/index.js.map +0 -1
  511. package/dist/lib/worktree/index.d.ts +0 -7
  512. package/dist/lib/worktree/index.d.ts.map +0 -1
  513. package/dist/lib/worktree/index.js +0 -362
  514. package/dist/lib/worktree/index.js.map +0 -1
  515. package/dist/lib/worktree/migrate.d.ts +0 -2
  516. package/dist/lib/worktree/migrate.d.ts.map +0 -1
  517. package/dist/lib/worktree/migrate.js +0 -212
  518. package/dist/lib/worktree/migrate.js.map +0 -1
  519. package/dist/lib/worktree/repair.d.ts +0 -3
  520. package/dist/lib/worktree/repair.d.ts.map +0 -1
  521. package/dist/lib/worktree/repair.js +0 -140
  522. package/dist/lib/worktree/repair.js.map +0 -1
  523. package/dist/types/index.d.ts +0 -57
  524. package/dist/types/index.d.ts.map +0 -1
  525. package/dist/types/index.js +0 -3
  526. package/dist/types/index.js.map +0 -1
@@ -0,0 +1,594 @@
1
+ /**
2
+ * Devcontainer Template Generator
3
+ *
4
+ * Generates .devcontainer/ configuration for agent sandboxed execution.
5
+ * Uses a custom Dockerfile with network firewall for security sandboxing.
6
+ */
7
+ import * as fs from 'node:fs';
8
+ import * as path from 'node:path';
9
+ import { DEFAULT_EXECUTION_CONFIG } from './types.js';
10
+ /**
11
+ * Generate default devcontainer.json content
12
+ *
13
+ * Uses a custom Dockerfile with firewall for network sandboxing.
14
+ * Mounts the entire agent workspace directory so all contents (repos, prompt files, etc.)
15
+ * are accessible inside the container at /workspace.
16
+ */
17
+ export function generateDevcontainerJson(options, config) {
18
+ const cfg = config || DEFAULT_EXECUTION_CONFIG;
19
+ const devcontainerJson = {
20
+ name: `Agent: ${options.agentName}`,
21
+ build: {
22
+ dockerfile: 'Dockerfile',
23
+ args: {
24
+ TZ: options.timezone || 'America/Los_Angeles',
25
+ },
26
+ },
27
+ customizations: {
28
+ vscode: {
29
+ extensions: [
30
+ 'anthropic.claude-code',
31
+ 'dbaeumer.vscode-eslint',
32
+ 'esbenp.prettier-vscode',
33
+ ],
34
+ settings: {
35
+ 'editor.formatOnSave': true,
36
+ 'editor.defaultFormatter': 'esbenp.prettier-vscode',
37
+ },
38
+ },
39
+ },
40
+ capAdd: ['NET_ADMIN', 'NET_RAW'],
41
+ runArgs: [
42
+ `--memory=${options.memory || cfg.devcontainer.memory}`,
43
+ `--cpus=${options.cpus || cfg.devcontainer.cpus}`,
44
+ ],
45
+ remoteUser: 'node',
46
+ mounts: [
47
+ 'source=${localWorkspaceFolder},target=/workspace,type=bind',
48
+ 'source=claude-bash-history,target=/commandhistory,type=volume',
49
+ 'source=claude-credentials,target=/home/node/.claude,type=volume',
50
+ // NOTE: ~/.claude.json is COPIED (not mounted) to /workspace/.claude.json
51
+ // to avoid corruption from concurrent writes by multiple containers
52
+ 'source=${localEnv:PRLT_HQ_PATH}/.proletariat,target=/hq/.proletariat,type=bind',
53
+ // PMO path can be anywhere (e.g., /hq/pmo or /hq/repos/myrepo/pmo)
54
+ // Use PRLT_PMO_PATH env var to mount the actual location to /hq/pmo
55
+ 'source=${localEnv:PRLT_PMO_PATH},target=/hq/pmo,type=bind',
56
+ // Mount each repo's directory so git worktrees can resolve their parent
57
+ // Worktree .git files reference paths like /Users/.../repos/{repoName}/.git/worktrees/name
58
+ // These mounts make those paths accessible inside the container at /hq/repos/{repoName}
59
+ ...(options.repoWorktrees || []).map(repoName => `source=\${localEnv:PRLT_HQ_PATH}/repos/${repoName},target=/hq/repos/${repoName},type=bind`),
60
+ ],
61
+ containerEnv: {
62
+ DEVCONTAINER: 'true',
63
+ ANTHROPIC_API_KEY: '${localEnv:ANTHROPIC_API_KEY}',
64
+ // GH_TOKEN enables gh CLI in container (for PR creation, etc.)
65
+ GH_TOKEN: '${localEnv:GH_TOKEN}',
66
+ GITHUB_TOKEN: '${localEnv:GITHUB_TOKEN}',
67
+ PRLT_HQ_PATH: '/hq',
68
+ // /hq/.proletariat/bin contains prlt wrapper with ESM loader for native modules
69
+ PATH: '/hq/.proletariat/bin:/home/node/.npm-global/bin:/usr/local/bin:/usr/bin:/bin',
70
+ },
71
+ workspaceFolder: '/workspace',
72
+ postStartCommand: 'sudo /usr/local/bin/init-firewall.sh && /usr/local/bin/setup-prlt.sh',
73
+ waitFor: 'postStartCommand',
74
+ };
75
+ return devcontainerJson;
76
+ }
77
+ /**
78
+ * Generate Dockerfile content for the devcontainer.
79
+ * Uses architecture auto-detection for cross-platform compatibility.
80
+ */
81
+ export function generateDockerfile(options) {
82
+ const timezone = options.timezone || 'America/Los_Angeles';
83
+ return `FROM node:20
84
+
85
+ # Ensure we run as root for apt-get and system setup
86
+ USER root
87
+
88
+ ARG TZ=${timezone}
89
+ ENV TZ=\${TZ}
90
+ ENV DEVCONTAINER=true
91
+
92
+ # Install system dependencies
93
+ RUN apt-get update && apt-get install -y \\
94
+ less git git-lfs procps sudo fzf zsh man-db unzip gnupg2 gh tmux \\
95
+ iptables ipset iproute2 dnsutils jq nano vim \\
96
+ && rm -rf /var/lib/apt/lists/* \\
97
+ && git lfs install
98
+
99
+ # Create workspace and claude directories
100
+ RUN mkdir -p /workspace /home/node/.claude \\
101
+ && chown -R node:node /workspace /home/node/.claude
102
+
103
+ # Set up persistent bash history
104
+ RUN mkdir -p /commandhistory \\
105
+ && touch /commandhistory/.bash_history \\
106
+ && chown -R node:node /commandhistory
107
+
108
+ # Install git-delta for better diffs (architecture-aware)
109
+ RUN ARCH=$(dpkg --print-architecture) && \\
110
+ curl -L "https://github.com/dandavison/delta/releases/download/0.18.2/git-delta_0.18.2_\${ARCH}.deb" -o /tmp/delta.deb && \\
111
+ dpkg -i /tmp/delta.deb && \\
112
+ rm /tmp/delta.deb
113
+
114
+ # Install zsh with oh-my-zsh
115
+ RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended \\
116
+ && chsh -s /bin/zsh node
117
+
118
+ # Configure npm global directory
119
+ RUN mkdir -p /home/node/.npm-global/bin /home/node/.npm-global/lib \\
120
+ && chown -R node:node /home/node/.npm-global
121
+ ENV NPM_CONFIG_PREFIX=/home/node/.npm-global
122
+ ENV PATH=/home/node/.npm-global/bin:\$PATH
123
+
124
+ # Install pnpm
125
+ RUN npm install -g pnpm
126
+
127
+ # Install Claude Code as node user so files are owned correctly
128
+ USER node
129
+ RUN npm install -g @anthropic-ai/claude-code
130
+ USER root
131
+
132
+ # Install prlt CLI from GitHub Packages
133
+ # Requires GITHUB_TOKEN build arg with read:packages scope
134
+ ARG GITHUB_TOKEN
135
+ RUN if [ -n "\${GITHUB_TOKEN}" ]; then \\
136
+ echo "//npm.pkg.github.com/:_authToken=\${GITHUB_TOKEN}" >> /home/node/.npmrc && \\
137
+ echo "@chrismcdermut:registry=https://npm.pkg.github.com" >> /home/node/.npmrc && \\
138
+ npm install -g @chrismcdermut/prlt && \\
139
+ rm /home/node/.npmrc; \\
140
+ else \\
141
+ echo "GITHUB_TOKEN not provided, prlt will be mounted from host"; \\
142
+ fi
143
+
144
+ # Copy and set up scripts
145
+ COPY init-firewall.sh /usr/local/bin/init-firewall.sh
146
+ COPY setup-prlt.sh /usr/local/bin/setup-prlt.sh
147
+ RUN chmod +x /usr/local/bin/init-firewall.sh /usr/local/bin/setup-prlt.sh
148
+
149
+ # Allow node user to run firewall script without password
150
+ RUN echo "node ALL=(ALL) NOPASSWD: /usr/local/bin/init-firewall.sh" >> /etc/sudoers
151
+
152
+ # Set default editor
153
+ ENV EDITOR=nano
154
+
155
+ # Configure shell history
156
+ ENV HISTFILE=/commandhistory/.bash_history
157
+
158
+ USER node
159
+ WORKDIR /workspace
160
+ `;
161
+ }
162
+ /**
163
+ * Generate firewall initialization script.
164
+ * Whitelists only necessary domains for Claude Code operation.
165
+ */
166
+ export function generateFirewallScript() {
167
+ return `#!/bin/bash
168
+ set -e
169
+
170
+ echo "Initializing firewall..."
171
+
172
+ # Preserve Docker's DNS rules before flushing
173
+ DOCKER_DNS_RULES=$(iptables-save | grep -E "DOCKER|docker" || true)
174
+
175
+ # Flush existing rules
176
+ iptables -F
177
+ iptables -X
178
+ iptables -t nat -F
179
+ iptables -t nat -X
180
+
181
+ # Restore Docker DNS rules
182
+ if [ -n "$DOCKER_DNS_RULES" ]; then
183
+ echo "$DOCKER_DNS_RULES" | iptables-restore -n
184
+ fi
185
+
186
+ # Create ipset for allowed domains (use hash:net to support CIDR ranges)
187
+ ipset create allowed-domains hash:net -exist
188
+
189
+ # Allow localhost
190
+ iptables -A INPUT -i lo -j ACCEPT
191
+ iptables -A OUTPUT -o lo -j ACCEPT
192
+
193
+ # Allow established connections
194
+ iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
195
+ iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
196
+
197
+ # Allow DNS
198
+ iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
199
+ iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
200
+
201
+ # Get host network and allow it (needed for Docker networking)
202
+ HOST_NETWORK=$(ip route | grep default | awk '{print $3}' | head -1)
203
+ if [ -n "$HOST_NETWORK" ]; then
204
+ HOST_SUBNET=$(echo $HOST_NETWORK | sed 's/\\.[0-9]*$/.0\\/24/')
205
+ iptables -A OUTPUT -d $HOST_SUBNET -j ACCEPT
206
+ fi
207
+
208
+ # Function to resolve and add domain IPs
209
+ add_domain() {
210
+ local domain=$1
211
+ echo "Adding $domain..."
212
+ for ip in $(dig +short $domain A 2>/dev/null || true); do
213
+ if [[ $ip =~ ^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+$ ]]; then
214
+ ipset add allowed-domains $ip -exist
215
+ fi
216
+ done
217
+ }
218
+
219
+ # Add hardcoded GitHub IP ranges (from https://api.github.com/meta)
220
+ # These are stable and published by GitHub
221
+ echo "Adding GitHub IP ranges..."
222
+ # GitHub git operations
223
+ ipset add allowed-domains 192.30.252.0/22 -exist 2>/dev/null || true
224
+ ipset add allowed-domains 185.199.108.0/22 -exist 2>/dev/null || true
225
+ ipset add allowed-domains 140.82.112.0/20 -exist 2>/dev/null || true
226
+ ipset add allowed-domains 143.55.64.0/20 -exist 2>/dev/null || true
227
+ # GitHub API
228
+ ipset add allowed-domains 20.201.28.151/32 -exist 2>/dev/null || true
229
+ ipset add allowed-domains 20.205.243.166/32 -exist 2>/dev/null || true
230
+ ipset add allowed-domains 20.87.245.0/24 -exist 2>/dev/null || true
231
+ ipset add allowed-domains 20.248.137.48/32 -exist 2>/dev/null || true
232
+ ipset add allowed-domains 20.207.73.82/32 -exist 2>/dev/null || true
233
+ ipset add allowed-domains 20.27.177.113/32 -exist 2>/dev/null || true
234
+ ipset add allowed-domains 20.200.245.247/32 -exist 2>/dev/null || true
235
+ ipset add allowed-domains 20.233.54.53/32 -exist 2>/dev/null || true
236
+ ipset add allowed-domains 4.208.26.197/32 -exist 2>/dev/null || true
237
+ # GitHub web/packages
238
+ ipset add allowed-domains 20.26.156.215/32 -exist 2>/dev/null || true
239
+
240
+ # Also resolve github.com domains dynamically (in case IPs change)
241
+ add_domain "github.com"
242
+ add_domain "api.github.com"
243
+ add_domain "codeload.github.com"
244
+ add_domain "objects.githubusercontent.com"
245
+ add_domain "raw.githubusercontent.com"
246
+ add_domain "npm.pkg.github.com"
247
+
248
+ # Add other allowed domains
249
+ add_domain "api.anthropic.com"
250
+ add_domain "console.anthropic.com"
251
+ add_domain "statsigapi.net"
252
+ add_domain "sentry.io"
253
+ add_domain "registry.npmjs.org"
254
+ add_domain "npmjs.com"
255
+ add_domain "nodejs.org"
256
+ add_domain "update.code.visualstudio.com"
257
+ add_domain "vscode.download.prss.microsoft.com"
258
+
259
+ # Allow traffic to whitelisted IPs
260
+ iptables -A OUTPUT -m set --match-set allowed-domains dst -j ACCEPT
261
+
262
+ # Set default policies
263
+ iptables -P INPUT DROP
264
+ iptables -P FORWARD DROP
265
+ iptables -P OUTPUT DROP
266
+
267
+ # Allow SSH (in case needed for debugging)
268
+ iptables -A INPUT -p tcp --dport 22 -j ACCEPT
269
+
270
+ echo "Firewall initialized."
271
+
272
+ # Verify firewall is working
273
+ echo "Testing firewall..."
274
+ if curl -s --max-time 3 https://example.com >/dev/null 2>&1; then
275
+ echo "WARNING: example.com is reachable (should be blocked)"
276
+ else
277
+ echo "✓ example.com blocked as expected"
278
+ fi
279
+
280
+ if curl -s --max-time 5 https://api.anthropic.com >/dev/null 2>&1; then
281
+ echo "✓ api.anthropic.com reachable"
282
+ else
283
+ echo "Note: api.anthropic.com not reachable (may need auth)"
284
+ fi
285
+
286
+ if curl -s --max-time 5 https://github.com >/dev/null 2>&1; then
287
+ echo "✓ github.com reachable"
288
+ else
289
+ echo "WARNING: github.com not reachable"
290
+ fi
291
+
292
+ echo "Firewall setup complete."
293
+ `;
294
+ }
295
+ /**
296
+ * Generate prlt setup script.
297
+ * Rebuilds better-sqlite3 if prlt is mounted from host (not installed via npm).
298
+ */
299
+ export function generatePrltSetupScript() {
300
+ // Note: Using single quotes in heredoc marker ('GITWRAPPER') prevents bash variable expansion
301
+ // but TypeScript still sees ${} as template literals, so we escape them with backslash
302
+ return `#!/bin/bash
303
+ # Setup prlt CLI - rebuild native modules if using mounted version
304
+
305
+ # Configure git wrapper to handle worktree path translation
306
+ # Worktree .git files contain host paths like: gitdir: /Users/.../repos/{repoName}/.git/worktrees/name
307
+ # Inside container, the parent repos are mounted at /hq/repos/{repoName}
308
+ #
309
+ # We create a git wrapper that translates paths on-the-fly using GIT_DIR
310
+ # This avoids modifying the .git file which is bind-mounted from the host
311
+ #
312
+ setup_git_wrapper() {
313
+ # Create git wrapper script in user's bin directory (already in PATH before /usr/bin)
314
+ mkdir -p /home/node/.npm-global/bin
315
+ cat > /home/node/.npm-global/bin/git << 'GITWRAPPER'
316
+ #!/bin/bash
317
+ # Git wrapper that handles worktree path translation for containers
318
+ # Translates host paths in .git files to container paths
319
+
320
+ # Find the .git file/dir by walking up the directory tree
321
+ find_git_file() {
322
+ local dir="$PWD"
323
+ while [ "$dir" != "/" ]; do
324
+ if [ -f "$dir/.git" ]; then
325
+ echo "$dir/.git"
326
+ return 0
327
+ elif [ -d "$dir/.git" ]; then
328
+ # Regular git repo, not a worktree - no translation needed
329
+ return 1
330
+ fi
331
+ dir="$(dirname "$dir")"
332
+ done
333
+ return 1
334
+ }
335
+
336
+ # Check if we need to translate the path
337
+ GIT_FILE="$(find_git_file)"
338
+ if [ -n "$GIT_FILE" ]; then
339
+ # Read the gitdir path from the .git file
340
+ # Format is: gitdir: /path/to/repos/{repoName}/.git/worktrees/name
341
+ HOST_PATH="$(sed -n 's/^gitdir: *//p' "$GIT_FILE")"
342
+
343
+ # Check if it's a host path that needs translation
344
+ case "$HOST_PATH" in
345
+ /Users/*|/home/*)
346
+ WORKTREE_NAME="$(basename "$HOST_PATH")"
347
+ # Extract repo name from host path: .../repos/{repoName}/.git/worktrees/...
348
+ # Remove .git/worktrees/name suffix, then get basename
349
+ REPO_PATH="$(echo "$HOST_PATH" | sed 's|/.git/worktrees/.*||')"
350
+ REPO_NAME="$(basename "$REPO_PATH")"
351
+ CONTAINER_PATH="/hq/repos/$REPO_NAME/.git/worktrees/$WORKTREE_NAME"
352
+ if [ -d "$CONTAINER_PATH" ]; then
353
+ export GIT_DIR="$CONTAINER_PATH"
354
+ export GIT_WORK_TREE="$(dirname "$GIT_FILE")"
355
+ fi
356
+ ;;
357
+ esac
358
+ fi
359
+
360
+ # Run the real git command
361
+ exec /usr/bin/git "$@"
362
+ GITWRAPPER
363
+
364
+ chmod +x /home/node/.npm-global/bin/git
365
+ echo "Git wrapper installed for worktree path translation"
366
+ }
367
+
368
+ # Set up git wrapper for worktree path translation
369
+ setup_git_wrapper
370
+
371
+ # Copy Claude credentials from workspace to home (each container gets its own copy)
372
+ if [ -f "/workspace/.claude.json" ]; then
373
+ cp /workspace/.claude.json /home/node/.claude.json
374
+ echo "Claude credentials copied"
375
+ fi
376
+
377
+ # Configure git to use GitHub token for authentication
378
+ # Check for token in environment or get from gh CLI
379
+ TOKEN=""
380
+ if [ -n "$GITHUB_TOKEN" ]; then
381
+ TOKEN="$GITHUB_TOKEN"
382
+ echo "Using GITHUB_TOKEN from environment"
383
+ elif [ -n "$GH_TOKEN" ]; then
384
+ TOKEN="$GH_TOKEN"
385
+ echo "Using GH_TOKEN from environment"
386
+ elif command -v gh &> /dev/null && gh auth status &>/dev/null; then
387
+ TOKEN=$(gh auth token 2>/dev/null)
388
+ if [ -n "$TOKEN" ]; then
389
+ echo "Using token from gh CLI"
390
+ export GH_TOKEN="$TOKEN"
391
+ fi
392
+ fi
393
+
394
+ if [ -n "$TOKEN" ]; then
395
+ # Store token in a file for the credential helper (avoids env var issues)
396
+ echo "$TOKEN" > /home/node/.github-token
397
+ chmod 600 /home/node/.github-token
398
+
399
+ # Configure git credential helper to read token from file
400
+ git config --global credential.helper "!f() { echo \\"username=x-access-token\\"; echo \\"password=\\$(cat /home/node/.github-token)\\"; }; f"
401
+
402
+ # Convert SSH URLs to HTTPS (SCP style: git@github.com:user/repo.git)
403
+ git config --global url."https://github.com/".insteadOf "git@github.com:"
404
+
405
+ # Configure gh CLI to use the token
406
+ echo "$TOKEN" | gh auth login --with-token 2>/dev/null && echo "gh CLI authenticated" || echo "gh CLI auth (optional)"
407
+
408
+ echo "Git configured for GitHub push via HTTPS"
409
+ else
410
+ echo "Warning: No GitHub token found, push to GitHub will require manual auth"
411
+ fi
412
+
413
+ # Check if prlt is already installed globally (via npm from GitHub Packages)
414
+ if command -v prlt &> /dev/null; then
415
+ PRLT_PATH=$(which prlt)
416
+ if [[ "$PRLT_PATH" == "/home/node/.npm-global/bin/prlt" ]]; then
417
+ echo "prlt installed via npm, no setup needed"
418
+ exit 0
419
+ fi
420
+ fi
421
+
422
+ # Check if mounted prlt exists at /opt/prlt
423
+ if [ -d "/opt/prlt/apps/cli" ]; then
424
+ echo "Setting up mounted prlt..."
425
+
426
+ PRLT_LOCAL="/home/node/.prlt-local"
427
+
428
+ # Only rebuild if not already done
429
+ if [ ! -f "$PRLT_LOCAL/.setup-complete" ]; then
430
+ echo "Rebuilding native modules for container architecture..."
431
+ mkdir -p "$PRLT_LOCAL"
432
+
433
+ # Install only better-sqlite3 with correct architecture
434
+ cd "$PRLT_LOCAL"
435
+ npm init -y > /dev/null 2>&1
436
+ npm install better-sqlite3@11.6.0 --build-from-source 2>&1 || {
437
+ echo "Warning: better-sqlite3 rebuild failed"
438
+ }
439
+
440
+ touch "$PRLT_LOCAL/.setup-complete"
441
+ echo "Native module rebuild complete"
442
+ else
443
+ echo "prlt native modules already set up"
444
+ fi
445
+
446
+ # Create ESM loader to redirect better-sqlite3 to rebuilt version
447
+ LOADER="/home/node/.prlt-local/loader.mjs"
448
+ cat > "$LOADER" << 'LOADER_EOF'
449
+ export async function resolve(specifier, context, nextResolve) {
450
+ if (specifier === "better-sqlite3") {
451
+ return {
452
+ shortCircuit: true,
453
+ url: "file:///home/node/.prlt-local/node_modules/better-sqlite3/lib/index.js"
454
+ };
455
+ }
456
+ return nextResolve(specifier, context);
457
+ }
458
+ LOADER_EOF
459
+
460
+ # Create wrapper script that uses ESM loader for native module resolution
461
+ WRAPPER="/home/node/.npm-global/bin/prlt"
462
+ mkdir -p /home/node/.npm-global/bin
463
+ cat > "$WRAPPER" << 'WRAPPER_EOF'
464
+ #!/bin/bash
465
+ NODE_NO_WARNINGS=1 exec node --experimental-loader /home/node/.prlt-local/loader.mjs /opt/prlt/apps/cli/bin/run.js "$@"
466
+ WRAPPER_EOF
467
+ chmod +x "$WRAPPER"
468
+ echo "prlt wrapper ready at $WRAPPER"
469
+ else
470
+ echo "No mounted prlt found, skipping setup"
471
+ fi
472
+
473
+ # Install workspace dependencies if package.json exists
474
+ install_workspace_deps() {
475
+ local workspace_dir="$1"
476
+ if [ -f "$workspace_dir/package.json" ]; then
477
+ echo "Installing dependencies in $workspace_dir..."
478
+ cd "$workspace_dir"
479
+ if [ -f "pnpm-lock.yaml" ]; then
480
+ pnpm install 2>&1 || npm install 2>&1
481
+ elif [ -f "package-lock.json" ]; then
482
+ npm ci 2>&1 || npm install 2>&1
483
+ else
484
+ npm install 2>&1
485
+ fi
486
+ fi
487
+ }
488
+
489
+ # Check workspace repos for package.json and install deps
490
+ for repo_dir in /workspace/*/; do
491
+ if [ -d "$repo_dir" ] && [ -f "$repo_dir/package.json" ]; then
492
+ install_workspace_deps "$repo_dir"
493
+ # Also check for monorepo structure (apps/cli for prlt)
494
+ if [ -f "$repo_dir/apps/cli/package.json" ]; then
495
+ install_workspace_deps "$repo_dir/apps/cli"
496
+ fi
497
+ fi
498
+ done
499
+
500
+ echo "Workspace setup complete"
501
+ `;
502
+ }
503
+ /**
504
+ * Create .devcontainer/ directory structure for an agent
505
+ * Writes devcontainer.json, Dockerfile, and init-firewall.sh
506
+ */
507
+ export function createDevcontainerConfig(options, config) {
508
+ const devcontainerDir = path.join(options.agentDir, '.devcontainer');
509
+ // Create .devcontainer directory
510
+ fs.mkdirSync(devcontainerDir, { recursive: true });
511
+ // Generate and write devcontainer.json
512
+ const devcontainerJson = generateDevcontainerJson(options, config);
513
+ const devcontainerJsonPath = path.join(devcontainerDir, 'devcontainer.json');
514
+ fs.writeFileSync(devcontainerJsonPath, JSON.stringify(devcontainerJson, null, 2) + '\n');
515
+ // Generate and write Dockerfile
516
+ const dockerfile = generateDockerfile(options);
517
+ const dockerfilePath = path.join(devcontainerDir, 'Dockerfile');
518
+ fs.writeFileSync(dockerfilePath, dockerfile);
519
+ // Generate and write firewall script
520
+ const firewallScript = generateFirewallScript();
521
+ const firewallScriptPath = path.join(devcontainerDir, 'init-firewall.sh');
522
+ fs.writeFileSync(firewallScriptPath, firewallScript, { mode: 0o755 });
523
+ // Generate and write prlt setup script
524
+ const setupScript = generatePrltSetupScript();
525
+ const setupScriptPath = path.join(devcontainerDir, 'setup-prlt.sh');
526
+ fs.writeFileSync(setupScriptPath, setupScript, { mode: 0o755 });
527
+ }
528
+ /**
529
+ * Check if agent has devcontainer configuration
530
+ */
531
+ export function hasDevcontainerConfig(agentDir) {
532
+ const devcontainerJsonPath = path.join(agentDir, '.devcontainer', 'devcontainer.json');
533
+ return fs.existsSync(devcontainerJsonPath);
534
+ }
535
+ /**
536
+ * Read existing devcontainer.json
537
+ */
538
+ export function readDevcontainerJson(agentDir) {
539
+ const devcontainerJsonPath = path.join(agentDir, '.devcontainer', 'devcontainer.json');
540
+ if (!fs.existsSync(devcontainerJsonPath)) {
541
+ return null;
542
+ }
543
+ try {
544
+ const content = fs.readFileSync(devcontainerJsonPath, 'utf-8');
545
+ return JSON.parse(content);
546
+ }
547
+ catch {
548
+ return null;
549
+ }
550
+ }
551
+ /**
552
+ * Update devcontainer.json with new mounts (e.g., when new repo worktrees are added)
553
+ *
554
+ * Note: With the simplified mount strategy (entire agent workspace), this is mainly
555
+ * for backwards compatibility or if someone wants to customize mounts.
556
+ */
557
+ export function updateDevcontainerMounts(agentDir, _repoWorktrees) {
558
+ const devcontainerJson = readDevcontainerJson(agentDir);
559
+ if (!devcontainerJson) {
560
+ return;
561
+ }
562
+ // Use single mount for entire workspace - includes all repos and temp files
563
+ // NOTE: ~/.claude.json is COPIED (not mounted) to /workspace/.claude.json
564
+ // to avoid corruption from concurrent writes by multiple containers
565
+ devcontainerJson.mounts = [
566
+ 'source=${localWorkspaceFolder},target=/workspace,type=bind',
567
+ 'source=claude-bash-history,target=/commandhistory,type=volume',
568
+ 'source=claude-credentials,target=/home/node/.claude,type=volume',
569
+ ];
570
+ // Write back
571
+ const devcontainerJsonPath = path.join(agentDir, '.devcontainer', 'devcontainer.json');
572
+ fs.writeFileSync(devcontainerJsonPath, JSON.stringify(devcontainerJson, null, 2) + '\n');
573
+ }
574
+ /**
575
+ * Get list of repo directories inside the agent workspace.
576
+ * With the full workspace mount, this returns all non-hidden subdirectories
577
+ * (excluding .devcontainer).
578
+ */
579
+ export function getMountedRepos(agentDir) {
580
+ try {
581
+ const entries = fs.readdirSync(agentDir, { withFileTypes: true });
582
+ return entries
583
+ .filter((entry) => {
584
+ // Include directories that are not hidden and not .devcontainer
585
+ return entry.isDirectory() &&
586
+ !entry.name.startsWith('.') &&
587
+ entry.name !== '.devcontainer';
588
+ })
589
+ .map((entry) => entry.name);
590
+ }
591
+ catch {
592
+ return [];
593
+ }
594
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Execution Module
3
+ *
4
+ * Handles spinning up and managing coding agents.
5
+ */
6
+ export * from './types.js';
7
+ export * from './runners.js';
8
+ export * from './storage.js';
9
+ export * from './config.js';
10
+ export * from './devcontainer.js';
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Execution Module
3
+ *
4
+ * Handles spinning up and managing coding agents.
5
+ */
6
+ export * from './types.js';
7
+ export * from './runners.js';
8
+ export * from './storage.js';
9
+ export * from './config.js';
10
+ export * from './devcontainer.js';
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Execution Runners
3
+ *
4
+ * Implementations for each execution environment (devcontainer, host, docker, vm).
5
+ */
6
+ import { ExecutionEnvironment, DisplayMode, SessionManager, ExecutorType, ExecutionContext, ExecutionConfig } from './types.js';
7
+ /**
8
+ * Build a unified name for tmux sessions, window names, and tab titles.
9
+ * Format: "{ticketId}-{action}-{agentName}"
10
+ * Example: "TKT-347-implement-altman"
11
+ */
12
+ export declare function buildSessionName(context: ExecutionContext): string;
13
+ export interface RunnerResult {
14
+ success: boolean;
15
+ pid?: string;
16
+ containerId?: string;
17
+ sessionId?: string;
18
+ logPath?: string;
19
+ error?: string;
20
+ }
21
+ export type Runner = (context: ExecutionContext, executor: ExecutorType, config: ExecutionConfig) => Promise<RunnerResult>;
22
+ /**
23
+ * Run command on the host machine with tmux session for persistence.
24
+ * Supports multiple terminal emulators on macOS.
25
+ *
26
+ * Architecture (same as devcontainer):
27
+ * - Always creates a host tmux session for session persistence
28
+ * - displayMode controls whether to open a terminal tab attached to the session
29
+ * - User can reattach with `prlt session attach` if tab is closed
30
+ */
31
+ export declare function runHost(context: ExecutionContext, executor: ExecutorType, config: ExecutionConfig, displayMode?: DisplayMode): Promise<RunnerResult>;
32
+ /**
33
+ * Check if Docker daemon is running.
34
+ * Returns true if Docker is available and responsive.
35
+ * Uses retry logic to handle slow Docker Desktop startup.
36
+ */
37
+ export declare function isDockerRunning(): boolean;
38
+ /**
39
+ * Run command inside a devcontainer.
40
+ * Uses the devcontainer CLI to start/exec in a VS Code devcontainer.
41
+ * Provides filesystem isolation - agent can only access mounted worktrees.
42
+ *
43
+ * @param displayMode - How to display output (terminal, foreground, background, tmux)
44
+ * @param sessionManager - How to manage the session inside the container (tmux, direct)
45
+ */
46
+ export declare function runDevcontainer(context: ExecutionContext, executor: ExecutorType, config: ExecutionConfig, displayMode?: DisplayMode, sessionManager?: SessionManager): Promise<RunnerResult>;
47
+ export declare function runDocker(context: ExecutionContext, executor: ExecutorType, config: ExecutionConfig): Promise<RunnerResult>;
48
+ export declare function runVm(context: ExecutionContext, executor: ExecutorType, config: ExecutionConfig, host?: string): Promise<RunnerResult>;
49
+ export declare function runExecution(environment: ExecutionEnvironment, context: ExecutionContext, executor: ExecutorType, config?: ExecutionConfig, options?: {
50
+ host?: string;
51
+ displayMode?: DisplayMode;
52
+ sessionManager?: SessionManager;
53
+ }): Promise<RunnerResult>;