@proletariat/cli 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (526) hide show
  1. package/README.md +561 -251
  2. package/bin/dev.cmd +3 -0
  3. package/bin/dev.js +5 -0
  4. package/bin/run.cmd +3 -0
  5. package/bin/run.js +23 -0
  6. package/dist/commands/action/create.d.ts +21 -0
  7. package/dist/commands/action/create.js +126 -0
  8. package/dist/commands/action/delete.d.ts +17 -0
  9. package/dist/commands/action/delete.js +78 -0
  10. package/dist/commands/action/index.d.ts +15 -0
  11. package/dist/commands/action/index.js +107 -0
  12. package/dist/commands/action/list.d.ts +14 -0
  13. package/dist/commands/action/list.js +89 -0
  14. package/dist/commands/action/run.d.ts +19 -0
  15. package/dist/commands/action/run.js +179 -0
  16. package/dist/commands/action/show.d.ts +15 -0
  17. package/dist/commands/action/show.js +47 -0
  18. package/dist/commands/action/update.d.ts +22 -0
  19. package/dist/commands/action/update.js +168 -0
  20. package/dist/commands/agent/index.d.ts +13 -0
  21. package/dist/commands/agent/index.js +131 -0
  22. package/dist/commands/agent/list.d.ts +7 -0
  23. package/dist/commands/agent/list.js +126 -0
  24. package/dist/commands/agent/login.d.ts +16 -0
  25. package/dist/commands/agent/login.js +146 -0
  26. package/dist/commands/agent/rebuild.d.ts +18 -0
  27. package/dist/commands/agent/rebuild.js +133 -0
  28. package/dist/commands/agent/restart.d.ts +17 -0
  29. package/dist/commands/agent/restart.js +116 -0
  30. package/dist/commands/agent/shell.d.ts +23 -0
  31. package/dist/commands/agent/shell.js +378 -0
  32. package/dist/commands/agent/staff/add.d.ts +15 -0
  33. package/dist/commands/agent/staff/add.js +281 -0
  34. package/dist/commands/agent/staff/index.d.ts +14 -0
  35. package/dist/commands/agent/staff/index.js +90 -0
  36. package/dist/commands/agent/staff/list.d.ts +7 -0
  37. package/dist/commands/agent/staff/list.js +90 -0
  38. package/dist/commands/agent/staff/remove.d.ts +16 -0
  39. package/dist/commands/agent/staff/remove.js +137 -0
  40. package/dist/commands/agent/status.d.ts +17 -0
  41. package/dist/commands/agent/status.js +139 -0
  42. package/dist/commands/agent/temp/cleanup.d.ts +23 -0
  43. package/dist/commands/agent/temp/cleanup.js +388 -0
  44. package/dist/commands/agent/temp/index.d.ts +14 -0
  45. package/dist/commands/agent/temp/index.js +82 -0
  46. package/dist/commands/agent/temp/list.d.ts +7 -0
  47. package/dist/commands/agent/temp/list.js +108 -0
  48. package/dist/commands/agent/themes/add-names.d.ts +10 -0
  49. package/dist/commands/agent/themes/add-names.js +67 -0
  50. package/dist/commands/agent/themes/create.d.ts +13 -0
  51. package/dist/commands/agent/themes/create.js +66 -0
  52. package/dist/commands/agent/themes/index.d.ts +9 -0
  53. package/dist/commands/agent/themes/index.js +194 -0
  54. package/dist/commands/agent/themes/list.d.ts +6 -0
  55. package/dist/commands/agent/themes/list.js +41 -0
  56. package/dist/commands/agent/themes/set.d.ts +12 -0
  57. package/dist/commands/agent/themes/set.js +77 -0
  58. package/dist/commands/agent/visit.d.ts +16 -0
  59. package/dist/commands/agent/visit.js +88 -0
  60. package/dist/commands/autocomplete/setup.d.ts +14 -0
  61. package/dist/commands/autocomplete/setup.js +154 -0
  62. package/dist/commands/board/index.d.ts +17 -0
  63. package/dist/commands/board/index.js +255 -0
  64. package/dist/commands/board/watch.d.ts +13 -0
  65. package/dist/commands/board/watch.js +52 -0
  66. package/dist/commands/branch/create.d.ts +50 -0
  67. package/dist/commands/branch/create.js +624 -0
  68. package/dist/commands/branch/index.d.ts +13 -0
  69. package/dist/commands/branch/index.js +50 -0
  70. package/dist/commands/branch/list.d.ts +17 -0
  71. package/dist/commands/branch/list.js +120 -0
  72. package/dist/commands/branch/validate.d.ts +15 -0
  73. package/dist/commands/branch/validate.js +73 -0
  74. package/dist/commands/commit.d.ts +71 -0
  75. package/dist/commands/commit.js +499 -0
  76. package/dist/commands/docker/clean.d.ts +13 -0
  77. package/dist/commands/docker/clean.js +224 -0
  78. package/dist/commands/docker/index.d.ts +19 -0
  79. package/dist/commands/docker/index.js +274 -0
  80. package/dist/commands/docker/list.d.ts +16 -0
  81. package/dist/commands/docker/list.js +200 -0
  82. package/dist/commands/docker/logs.d.ts +14 -0
  83. package/dist/commands/docker/logs.js +118 -0
  84. package/dist/commands/docker/prune.d.ts +14 -0
  85. package/dist/commands/docker/prune.js +211 -0
  86. package/dist/commands/docker/restart.d.ts +14 -0
  87. package/dist/commands/docker/restart.js +129 -0
  88. package/dist/commands/docker/shell.d.ts +14 -0
  89. package/dist/commands/docker/shell.js +103 -0
  90. package/dist/commands/docker/start.d.ts +12 -0
  91. package/dist/commands/docker/start.js +92 -0
  92. package/dist/commands/docker/status.d.ts +7 -0
  93. package/dist/commands/docker/status.js +40 -0
  94. package/dist/commands/docker/stop.d.ts +14 -0
  95. package/dist/commands/docker/stop.js +134 -0
  96. package/dist/commands/docker/sync.d.ts +15 -0
  97. package/dist/commands/docker/sync.js +112 -0
  98. package/dist/commands/epic/activate.d.ts +13 -0
  99. package/dist/commands/epic/activate.js +118 -0
  100. package/dist/commands/epic/archive.d.ts +14 -0
  101. package/dist/commands/epic/archive.js +132 -0
  102. package/dist/commands/epic/create.d.ts +15 -0
  103. package/dist/commands/epic/create.js +137 -0
  104. package/dist/commands/epic/index.d.ts +13 -0
  105. package/dist/commands/epic/index.js +88 -0
  106. package/dist/commands/epic/link/block.d.ts +14 -0
  107. package/dist/commands/epic/link/block.js +79 -0
  108. package/dist/commands/epic/link/duplicates.d.ts +14 -0
  109. package/dist/commands/epic/link/duplicates.js +66 -0
  110. package/dist/commands/epic/link/index.d.ts +19 -0
  111. package/dist/commands/epic/link/index.js +242 -0
  112. package/dist/commands/epic/link/relates.d.ts +14 -0
  113. package/dist/commands/epic/link/relates.js +66 -0
  114. package/dist/commands/epic/link/remove.d.ts +16 -0
  115. package/dist/commands/epic/link/remove.js +89 -0
  116. package/dist/commands/epic/list.d.ts +11 -0
  117. package/dist/commands/epic/list.js +87 -0
  118. package/dist/commands/epic/move.d.ts +15 -0
  119. package/dist/commands/epic/move.js +184 -0
  120. package/dist/commands/epic/progress.d.ts +16 -0
  121. package/dist/commands/epic/progress.js +166 -0
  122. package/dist/commands/epic/project.d.ts +15 -0
  123. package/dist/commands/epic/project.js +219 -0
  124. package/dist/commands/epic/reorder.d.ts +21 -0
  125. package/dist/commands/epic/reorder.js +160 -0
  126. package/dist/commands/epic/spec.d.ts +15 -0
  127. package/dist/commands/epic/spec.js +191 -0
  128. package/dist/commands/epic/ticket.d.ts +18 -0
  129. package/dist/commands/epic/ticket.js +291 -0
  130. package/dist/commands/epic/view.d.ts +13 -0
  131. package/dist/commands/epic/view.js +117 -0
  132. package/dist/commands/execution/index.d.ts +13 -0
  133. package/dist/commands/execution/index.js +70 -0
  134. package/dist/commands/execution/list.d.ts +15 -0
  135. package/dist/commands/execution/list.js +144 -0
  136. package/dist/commands/execution/logs.d.ts +18 -0
  137. package/dist/commands/execution/logs.js +161 -0
  138. package/dist/commands/execution/stop.d.ts +22 -0
  139. package/dist/commands/execution/stop.js +248 -0
  140. package/dist/commands/gh/index.d.ts +9 -0
  141. package/dist/commands/gh/index.js +53 -0
  142. package/dist/commands/gh/login.d.ts +6 -0
  143. package/dist/commands/gh/login.js +57 -0
  144. package/dist/commands/gh/status.d.ts +6 -0
  145. package/dist/commands/gh/status.js +48 -0
  146. package/dist/commands/gh/token.d.ts +6 -0
  147. package/dist/commands/gh/token.js +59 -0
  148. package/dist/commands/init.d.ts +26 -0
  149. package/dist/commands/init.js +200 -0
  150. package/dist/commands/phase/create.d.ts +22 -0
  151. package/dist/commands/phase/create.js +123 -0
  152. package/dist/commands/phase/delete.d.ts +17 -0
  153. package/dist/commands/phase/delete.js +73 -0
  154. package/dist/commands/phase/list.d.ts +12 -0
  155. package/dist/commands/phase/list.js +76 -0
  156. package/dist/commands/phase/move.d.ts +17 -0
  157. package/dist/commands/phase/move.js +115 -0
  158. package/dist/commands/phase/template/apply.d.ts +17 -0
  159. package/dist/commands/phase/template/apply.js +106 -0
  160. package/dist/commands/phase/template/create.d.ts +16 -0
  161. package/dist/commands/phase/template/create.js +58 -0
  162. package/dist/commands/phase/template/delete.d.ts +17 -0
  163. package/dist/commands/phase/template/delete.js +98 -0
  164. package/dist/commands/phase/template/index.d.ts +15 -0
  165. package/dist/commands/phase/template/index.js +128 -0
  166. package/dist/commands/phase/template/list.d.ts +16 -0
  167. package/dist/commands/phase/template/list.js +95 -0
  168. package/dist/commands/phase/template/update.d.ts +17 -0
  169. package/dist/commands/phase/template/update.js +89 -0
  170. package/dist/commands/phase/update.d.ts +23 -0
  171. package/dist/commands/phase/update.js +174 -0
  172. package/dist/commands/pmo/init.d.ts +25 -0
  173. package/dist/commands/pmo/init.js +341 -0
  174. package/dist/commands/pr/create.d.ts +17 -0
  175. package/dist/commands/pr/create.js +242 -0
  176. package/dist/commands/pr/index.d.ts +9 -0
  177. package/dist/commands/pr/index.js +68 -0
  178. package/dist/commands/pr/link.d.ts +14 -0
  179. package/dist/commands/pr/link.js +212 -0
  180. package/dist/commands/pr/status.d.ts +12 -0
  181. package/dist/commands/pr/status.js +161 -0
  182. package/dist/commands/project/archive.d.ts +17 -0
  183. package/dist/commands/project/archive.js +83 -0
  184. package/dist/commands/project/create.d.ts +22 -0
  185. package/dist/commands/project/create.js +143 -0
  186. package/dist/commands/project/delete.d.ts +17 -0
  187. package/dist/commands/project/delete.js +128 -0
  188. package/dist/commands/project/index.d.ts +13 -0
  189. package/dist/commands/project/index.js +64 -0
  190. package/dist/commands/project/list.d.ts +14 -0
  191. package/dist/commands/project/list.js +96 -0
  192. package/dist/commands/project/spec.d.ts +18 -0
  193. package/dist/commands/project/spec.js +216 -0
  194. package/dist/commands/project/unarchive.d.ts +15 -0
  195. package/dist/commands/project/unarchive.js +35 -0
  196. package/dist/commands/project/view.d.ts +16 -0
  197. package/dist/commands/project/view.js +94 -0
  198. package/dist/commands/repo/add.d.ts +21 -0
  199. package/dist/commands/repo/add.js +118 -0
  200. package/dist/commands/repo/index.d.ts +13 -0
  201. package/dist/commands/repo/index.js +114 -0
  202. package/dist/commands/repo/list.d.ts +13 -0
  203. package/dist/commands/repo/list.js +96 -0
  204. package/dist/commands/repo/remove.d.ts +23 -0
  205. package/dist/commands/repo/remove.js +217 -0
  206. package/dist/commands/repo/view.d.ts +15 -0
  207. package/dist/commands/repo/view.js +99 -0
  208. package/dist/commands/session/attach.d.ts +40 -0
  209. package/dist/commands/session/attach.js +307 -0
  210. package/dist/commands/session/index.d.ts +13 -0
  211. package/dist/commands/session/index.js +64 -0
  212. package/dist/commands/session/list.d.ts +21 -0
  213. package/dist/commands/session/list.js +181 -0
  214. package/dist/commands/spec/create.d.ts +19 -0
  215. package/dist/commands/spec/create.js +130 -0
  216. package/dist/commands/spec/index.d.ts +13 -0
  217. package/dist/commands/spec/index.js +68 -0
  218. package/dist/commands/spec/link/depends.d.ts +14 -0
  219. package/dist/commands/spec/link/depends.js +64 -0
  220. package/dist/commands/spec/link/duplicates.d.ts +14 -0
  221. package/dist/commands/spec/link/duplicates.js +63 -0
  222. package/dist/commands/spec/link/index.d.ts +19 -0
  223. package/dist/commands/spec/link/index.js +200 -0
  224. package/dist/commands/spec/link/relates.d.ts +14 -0
  225. package/dist/commands/spec/link/relates.js +63 -0
  226. package/dist/commands/spec/link/remove.d.ts +16 -0
  227. package/dist/commands/spec/link/remove.js +94 -0
  228. package/dist/commands/spec/list.d.ts +12 -0
  229. package/dist/commands/spec/list.js +75 -0
  230. package/dist/commands/spec/plan.d.ts +15 -0
  231. package/dist/commands/spec/plan.js +108 -0
  232. package/dist/commands/spec/ticket.d.ts +18 -0
  233. package/dist/commands/spec/ticket.js +160 -0
  234. package/dist/commands/spec/view.d.ts +15 -0
  235. package/dist/commands/spec/view.js +163 -0
  236. package/dist/commands/status/create.d.ts +21 -0
  237. package/dist/commands/status/create.js +140 -0
  238. package/dist/commands/status/delete.d.ts +13 -0
  239. package/dist/commands/status/delete.js +77 -0
  240. package/dist/commands/status/index.d.ts +14 -0
  241. package/dist/commands/status/index.js +91 -0
  242. package/dist/commands/status/list.d.ts +12 -0
  243. package/dist/commands/status/list.js +93 -0
  244. package/dist/commands/status/move.d.ts +14 -0
  245. package/dist/commands/status/move.js +120 -0
  246. package/dist/commands/status/update.d.ts +20 -0
  247. package/dist/commands/status/update.js +180 -0
  248. package/dist/commands/template/delete.d.ts +15 -0
  249. package/dist/commands/template/delete.js +142 -0
  250. package/dist/commands/template/index.d.ts +10 -0
  251. package/dist/commands/template/index.js +64 -0
  252. package/dist/commands/template/list.d.ts +18 -0
  253. package/dist/commands/template/list.js +157 -0
  254. package/dist/commands/template/phase/apply.d.ts +14 -0
  255. package/dist/commands/template/phase/apply.js +41 -0
  256. package/dist/commands/template/phase/create.d.ts +12 -0
  257. package/dist/commands/template/phase/create.js +29 -0
  258. package/dist/commands/template/phase/delete.d.ts +13 -0
  259. package/dist/commands/template/phase/delete.js +34 -0
  260. package/dist/commands/template/phase/index.d.ts +10 -0
  261. package/dist/commands/template/phase/index.js +62 -0
  262. package/dist/commands/template/phase/list.d.ts +11 -0
  263. package/dist/commands/template/phase/list.js +34 -0
  264. package/dist/commands/template/phase/update.d.ts +13 -0
  265. package/dist/commands/template/phase/update.js +35 -0
  266. package/dist/commands/template/ticket/apply.d.ts +17 -0
  267. package/dist/commands/template/ticket/apply.js +58 -0
  268. package/dist/commands/template/ticket/delete.d.ts +13 -0
  269. package/dist/commands/template/ticket/delete.js +34 -0
  270. package/dist/commands/template/ticket/index.d.ts +10 -0
  271. package/dist/commands/template/ticket/index.js +62 -0
  272. package/dist/commands/template/ticket/list.d.ts +11 -0
  273. package/dist/commands/template/ticket/list.js +34 -0
  274. package/dist/commands/template/ticket/save.d.ts +13 -0
  275. package/dist/commands/template/ticket/save.js +35 -0
  276. package/dist/commands/ticket/bulk.d.ts +13 -0
  277. package/dist/commands/ticket/bulk.js +145 -0
  278. package/dist/commands/ticket/complete.d.ts +16 -0
  279. package/dist/commands/ticket/complete.js +170 -0
  280. package/dist/commands/ticket/create.d.ts +22 -0
  281. package/dist/commands/ticket/create.js +390 -0
  282. package/dist/commands/ticket/delete.d.ts +16 -0
  283. package/dist/commands/ticket/delete.js +178 -0
  284. package/dist/commands/ticket/edit.d.ts +27 -0
  285. package/dist/commands/ticket/edit.js +322 -0
  286. package/dist/commands/ticket/epic.d.ts +20 -0
  287. package/dist/commands/ticket/epic.js +333 -0
  288. package/dist/commands/ticket/index.d.ts +13 -0
  289. package/dist/commands/ticket/index.js +103 -0
  290. package/dist/commands/ticket/link/block.d.ts +14 -0
  291. package/dist/commands/ticket/link/block.js +94 -0
  292. package/dist/commands/ticket/link/duplicates.d.ts +14 -0
  293. package/dist/commands/ticket/link/duplicates.js +93 -0
  294. package/dist/commands/ticket/link/index.d.ts +19 -0
  295. package/dist/commands/ticket/link/index.js +239 -0
  296. package/dist/commands/ticket/link/relates.d.ts +14 -0
  297. package/dist/commands/ticket/link/relates.js +93 -0
  298. package/dist/commands/ticket/link/remove.d.ts +16 -0
  299. package/dist/commands/ticket/link/remove.js +128 -0
  300. package/dist/commands/ticket/list.d.ts +24 -0
  301. package/dist/commands/ticket/list.js +431 -0
  302. package/dist/commands/ticket/move.d.ts +18 -0
  303. package/dist/commands/ticket/move.js +212 -0
  304. package/dist/commands/ticket/project.d.ts +18 -0
  305. package/dist/commands/ticket/project.js +254 -0
  306. package/dist/commands/ticket/reassign.d.ts +19 -0
  307. package/dist/commands/ticket/reassign.js +279 -0
  308. package/dist/commands/ticket/spec.d.ts +18 -0
  309. package/dist/commands/ticket/spec.js +259 -0
  310. package/dist/commands/ticket/status.d.ts +13 -0
  311. package/dist/commands/ticket/status.js +87 -0
  312. package/dist/commands/ticket/template/apply.d.ts +25 -0
  313. package/dist/commands/ticket/template/apply.js +249 -0
  314. package/dist/commands/ticket/template/create.d.ts +19 -0
  315. package/dist/commands/ticket/template/create.js +210 -0
  316. package/dist/commands/ticket/template/delete.d.ts +17 -0
  317. package/dist/commands/ticket/template/delete.js +92 -0
  318. package/dist/commands/ticket/template/index.d.ts +15 -0
  319. package/dist/commands/ticket/template/index.js +118 -0
  320. package/dist/commands/ticket/template/list.d.ts +16 -0
  321. package/dist/commands/ticket/template/list.js +110 -0
  322. package/dist/commands/ticket/template/save.d.ts +14 -0
  323. package/dist/commands/ticket/template/save.js +110 -0
  324. package/dist/commands/ticket/update.d.ts +18 -0
  325. package/dist/commands/ticket/update.js +325 -0
  326. package/dist/commands/ticket/view.d.ts +13 -0
  327. package/dist/commands/ticket/view.js +80 -0
  328. package/dist/commands/whoami.d.ts +9 -0
  329. package/dist/commands/whoami.js +103 -0
  330. package/dist/commands/work/complete.d.ts +13 -0
  331. package/dist/commands/work/complete.js +121 -0
  332. package/dist/commands/work/index.d.ts +13 -0
  333. package/dist/commands/work/index.js +70 -0
  334. package/dist/commands/work/ready.d.ts +24 -0
  335. package/dist/commands/work/ready.js +290 -0
  336. package/dist/commands/work/revise.d.ts +19 -0
  337. package/dist/commands/work/revise.js +377 -0
  338. package/dist/commands/work/spawn-all.d.ts +17 -0
  339. package/dist/commands/work/spawn-all.js +58 -0
  340. package/dist/commands/work/spawn.d.ts +29 -0
  341. package/dist/commands/work/spawn.js +728 -0
  342. package/dist/commands/work/start.d.ts +39 -0
  343. package/dist/commands/work/start.js +1393 -0
  344. package/dist/commands/work/watch.d.ts +31 -0
  345. package/dist/commands/work/watch.js +359 -0
  346. package/dist/commands/workflow/create.d.ts +18 -0
  347. package/dist/commands/workflow/create.js +119 -0
  348. package/dist/commands/workflow/delete.d.ts +17 -0
  349. package/dist/commands/workflow/delete.js +119 -0
  350. package/dist/commands/workflow/index.d.ts +15 -0
  351. package/dist/commands/workflow/index.js +75 -0
  352. package/dist/commands/workflow/list.d.ts +15 -0
  353. package/dist/commands/workflow/list.js +75 -0
  354. package/dist/commands/workflow/switch.d.ts +13 -0
  355. package/dist/commands/workflow/switch.js +117 -0
  356. package/dist/commands/workflow/view.d.ts +16 -0
  357. package/dist/commands/workflow/view.js +114 -0
  358. package/dist/commands/workspace/add.d.ts +12 -0
  359. package/dist/commands/workspace/add.js +74 -0
  360. package/dist/commands/workspace/list.d.ts +9 -0
  361. package/dist/commands/workspace/list.js +153 -0
  362. package/dist/commands/workspace/remove.d.ts +13 -0
  363. package/dist/commands/workspace/remove.js +98 -0
  364. package/dist/commands/workspace/use.d.ts +12 -0
  365. package/dist/commands/workspace/use.js +111 -0
  366. package/dist/hooks/init.d.ts +11 -0
  367. package/dist/hooks/init.js +57 -0
  368. package/dist/index.d.ts +1 -0
  369. package/dist/index.js +1 -0
  370. package/dist/lib/agents/commands.d.ts +189 -0
  371. package/dist/lib/agents/commands.js +893 -0
  372. package/dist/lib/agents/index.d.ts +54 -0
  373. package/dist/lib/agents/index.js +382 -0
  374. package/dist/lib/branch/index.d.ts +120 -0
  375. package/dist/lib/branch/index.js +334 -0
  376. package/dist/lib/colors.d.ts +94 -0
  377. package/dist/lib/colors.js +68 -0
  378. package/dist/lib/commands/docker-command.d.ts +21 -0
  379. package/dist/lib/commands/docker-command.js +27 -0
  380. package/dist/lib/database/index.d.ts +176 -0
  381. package/dist/lib/database/index.js +581 -0
  382. package/dist/lib/docker/resolve.d.ts +38 -0
  383. package/dist/lib/docker/resolve.js +175 -0
  384. package/dist/lib/execution/config.d.ts +150 -0
  385. package/dist/lib/execution/config.js +541 -0
  386. package/dist/lib/execution/devcontainer.d.ts +85 -0
  387. package/dist/lib/execution/devcontainer.js +594 -0
  388. package/dist/lib/execution/index.d.ts +10 -0
  389. package/dist/lib/execution/index.js +10 -0
  390. package/dist/lib/execution/runners.d.ts +53 -0
  391. package/dist/lib/execution/runners.js +1182 -0
  392. package/dist/lib/execution/spawner.d.ts +85 -0
  393. package/dist/lib/execution/spawner.js +548 -0
  394. package/dist/lib/execution/storage.d.ts +159 -0
  395. package/dist/lib/execution/storage.js +425 -0
  396. package/dist/lib/execution/types.d.ts +145 -0
  397. package/dist/lib/execution/types.js +157 -0
  398. package/dist/lib/init/index.d.ts +75 -0
  399. package/dist/lib/init/index.js +355 -0
  400. package/dist/lib/machine-config.d.ts +170 -0
  401. package/dist/lib/machine-config.js +386 -0
  402. package/dist/lib/pmo/base-command.d.ts +195 -0
  403. package/dist/lib/pmo/base-command.js +319 -0
  404. package/dist/lib/pmo/create-spec-folders.d.ts +43 -0
  405. package/dist/lib/pmo/create-spec-folders.js +64 -0
  406. package/dist/lib/pmo/epic-files.d.ts +56 -0
  407. package/dist/lib/pmo/epic-files.js +195 -0
  408. package/dist/lib/pmo/find-pmo.d.ts +14 -0
  409. package/dist/lib/pmo/find-pmo.js +172 -0
  410. package/dist/lib/pmo/index.d.ts +109 -0
  411. package/dist/lib/pmo/index.js +501 -0
  412. package/dist/lib/pmo/markdown.d.ts +31 -0
  413. package/dist/lib/pmo/markdown.js +245 -0
  414. package/dist/lib/pmo/pmo-context.d.ts +27 -0
  415. package/dist/lib/pmo/pmo-context.js +44 -0
  416. package/dist/lib/pmo/schema.d.ts +82 -0
  417. package/dist/lib/pmo/schema.js +531 -0
  418. package/dist/lib/pmo/spec-parser.d.ts +25 -0
  419. package/dist/lib/pmo/spec-parser.js +205 -0
  420. package/dist/lib/pmo/spec-types.d.ts +43 -0
  421. package/dist/lib/pmo/spec-types.js +7 -0
  422. package/dist/lib/pmo/storage/actions.d.ts +34 -0
  423. package/dist/lib/pmo/storage/actions.js +177 -0
  424. package/dist/lib/pmo/storage/base.d.ts +47 -0
  425. package/dist/lib/pmo/storage/base.js +858 -0
  426. package/dist/lib/pmo/storage/dependencies.d.ts +61 -0
  427. package/dist/lib/pmo/storage/dependencies.js +267 -0
  428. package/dist/lib/pmo/storage/epics.d.ts +46 -0
  429. package/dist/lib/pmo/storage/epics.js +243 -0
  430. package/dist/lib/pmo/storage/helpers.d.ts +33 -0
  431. package/dist/lib/pmo/storage/helpers.js +148 -0
  432. package/dist/lib/pmo/storage/index.d.ts +186 -0
  433. package/dist/lib/pmo/storage/index.js +689 -0
  434. package/dist/lib/pmo/storage/phases.d.ts +65 -0
  435. package/dist/lib/pmo/storage/phases.js +392 -0
  436. package/dist/lib/pmo/storage/projects.d.ts +79 -0
  437. package/dist/lib/pmo/storage/projects.js +303 -0
  438. package/dist/lib/pmo/storage/specs.d.ts +77 -0
  439. package/dist/lib/pmo/storage/specs.js +389 -0
  440. package/dist/lib/pmo/storage/statuses.d.ts +63 -0
  441. package/dist/lib/pmo/storage/statuses.js +404 -0
  442. package/dist/lib/pmo/storage/subtasks.d.ts +37 -0
  443. package/dist/lib/pmo/storage/subtasks.js +184 -0
  444. package/dist/lib/pmo/storage/templates.d.ts +40 -0
  445. package/dist/lib/pmo/storage/templates.js +210 -0
  446. package/dist/lib/pmo/storage/tickets.d.ts +57 -0
  447. package/dist/lib/pmo/storage/tickets.js +453 -0
  448. package/dist/lib/pmo/storage/types.d.ts +200 -0
  449. package/dist/lib/pmo/storage/types.js +5 -0
  450. package/dist/lib/pmo/storage/views.d.ts +44 -0
  451. package/dist/lib/pmo/storage/views.js +355 -0
  452. package/dist/lib/pmo/storage-sqlite.d.ts +7 -0
  453. package/dist/lib/pmo/storage-sqlite.js +7 -0
  454. package/dist/lib/pmo/sync-manager.d.ts +92 -0
  455. package/dist/lib/pmo/sync-manager.js +229 -0
  456. package/dist/lib/pmo/types.d.ts +710 -0
  457. package/dist/lib/pmo/types.js +108 -0
  458. package/dist/lib/pmo/utils.d.ts +122 -0
  459. package/dist/lib/pmo/utils.js +174 -0
  460. package/dist/lib/pmo/watcher.d.ts +43 -0
  461. package/dist/lib/pmo/watcher.js +208 -0
  462. package/dist/lib/pr/index.d.ts +150 -0
  463. package/dist/lib/pr/index.js +483 -0
  464. package/dist/lib/prompt-json.d.ts +231 -0
  465. package/dist/lib/prompt-json.js +213 -0
  466. package/dist/lib/repos/index.d.ts +81 -0
  467. package/dist/lib/repos/index.js +679 -0
  468. package/dist/lib/styles.d.ts +98 -0
  469. package/dist/lib/styles.js +195 -0
  470. package/dist/lib/themes.d.ts +128 -0
  471. package/dist/lib/themes.js +301 -0
  472. package/dist/lib/ui/BoardUI.d.ts +21 -0
  473. package/dist/lib/ui/BoardUI.js +85 -0
  474. package/dist/lib/ui/ClaimTicketUI.d.ts +17 -0
  475. package/dist/lib/ui/ClaimTicketUI.js +64 -0
  476. package/dist/lib/ui/CreateTicketUI.d.ts +13 -0
  477. package/dist/lib/ui/CreateTicketUI.js +101 -0
  478. package/dist/lib/workspace.d.ts +66 -0
  479. package/dist/lib/workspace.js +204 -0
  480. package/oclif.manifest.json +10593 -0
  481. package/package.json +103 -56
  482. package/LICENSE +0 -21
  483. package/dist/bin/prlt.d.ts +0 -11
  484. package/dist/bin/prlt.d.ts.map +0 -1
  485. package/dist/bin/prlt.js +0 -144
  486. package/dist/bin/prlt.js.map +0 -1
  487. package/dist/lib/config/index.d.ts +0 -14
  488. package/dist/lib/config/index.d.ts.map +0 -1
  489. package/dist/lib/config/index.js +0 -142
  490. package/dist/lib/config/index.js.map +0 -1
  491. package/dist/lib/config/upgrade.d.ts +0 -2
  492. package/dist/lib/config/upgrade.d.ts.map +0 -1
  493. package/dist/lib/config/upgrade.js +0 -248
  494. package/dist/lib/config/upgrade.js.map +0 -1
  495. package/dist/lib/themes/index.d.ts +0 -8
  496. package/dist/lib/themes/index.d.ts.map +0 -1
  497. package/dist/lib/themes/index.js +0 -80
  498. package/dist/lib/themes/index.js.map +0 -1
  499. package/dist/lib/utils/helpers.d.ts +0 -4
  500. package/dist/lib/utils/helpers.d.ts.map +0 -1
  501. package/dist/lib/utils/helpers.js +0 -39
  502. package/dist/lib/utils/helpers.js.map +0 -1
  503. package/dist/lib/utils/logger.d.ts +0 -4
  504. package/dist/lib/utils/logger.d.ts.map +0 -1
  505. package/dist/lib/utils/logger.js +0 -28
  506. package/dist/lib/utils/logger.js.map +0 -1
  507. package/dist/lib/workspace/index.d.ts +0 -13
  508. package/dist/lib/workspace/index.d.ts.map +0 -1
  509. package/dist/lib/workspace/index.js +0 -116
  510. package/dist/lib/workspace/index.js.map +0 -1
  511. package/dist/lib/worktree/index.d.ts +0 -7
  512. package/dist/lib/worktree/index.d.ts.map +0 -1
  513. package/dist/lib/worktree/index.js +0 -362
  514. package/dist/lib/worktree/index.js.map +0 -1
  515. package/dist/lib/worktree/migrate.d.ts +0 -2
  516. package/dist/lib/worktree/migrate.d.ts.map +0 -1
  517. package/dist/lib/worktree/migrate.js +0 -214
  518. package/dist/lib/worktree/migrate.js.map +0 -1
  519. package/dist/lib/worktree/repair.d.ts +0 -3
  520. package/dist/lib/worktree/repair.d.ts.map +0 -1
  521. package/dist/lib/worktree/repair.js +0 -320
  522. package/dist/lib/worktree/repair.js.map +0 -1
  523. package/dist/types/index.d.ts +0 -57
  524. package/dist/types/index.d.ts.map +0 -1
  525. package/dist/types/index.js +0 -3
  526. package/dist/types/index.js.map +0 -1
@@ -0,0 +1,378 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import * as path from 'node:path';
3
+ import * as fs from 'node:fs';
4
+ import { execSync, spawn } from 'node:child_process';
5
+ import inquirer from 'inquirer';
6
+ import Database from 'better-sqlite3';
7
+ import { colors } from '../../lib/colors.js';
8
+ import { getWorkspaceInfo } from '../../lib/agents/commands.js';
9
+ import { hasDevcontainerConfig } from '../../lib/execution/devcontainer.js';
10
+ import { getTerminalApp } from '../../lib/execution/config.js';
11
+ import { isDockerRunning } from '../../lib/execution/runners.js';
12
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
13
+ import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
14
+ export default class Shell extends PMOCommand {
15
+ static description = 'Open an interactive shell in an agent workspace';
16
+ static examples = [
17
+ '<%= config.bin %> <%= command.id %> altman',
18
+ '<%= config.bin %> <%= command.id %>',
19
+ ];
20
+ static args = {
21
+ name: Args.string({
22
+ description: 'Agent name to open shell in',
23
+ required: false,
24
+ }),
25
+ };
26
+ static flags = {
27
+ ...pmoBaseFlags,
28
+ json: Flags.boolean({
29
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
30
+ default: false,
31
+ }),
32
+ };
33
+ getPMOOptions() {
34
+ return { promptIfMultiple: false };
35
+ }
36
+ async execute() {
37
+ const { args, flags } = await this.parse(Shell);
38
+ // Check if JSON output mode is active
39
+ const jsonMode = shouldOutputJson(flags);
40
+ // Helper to handle errors in JSON mode
41
+ const handleError = (code, message) => {
42
+ if (jsonMode) {
43
+ outputErrorAsJson(code, message, createMetadata('agent shell', flags));
44
+ this.exit(1);
45
+ }
46
+ this.error(message);
47
+ };
48
+ // Get workspace information
49
+ const workspaceInfo = getWorkspaceInfo();
50
+ if (workspaceInfo.agents.length === 0) {
51
+ if (jsonMode) {
52
+ outputErrorAsJson('NO_AGENTS', 'No agents found. Add agents with "prlt agent add"', createMetadata('agent shell', flags));
53
+ return;
54
+ }
55
+ this.log(colors.warning('No agents found. Add agents with "prlt agent add"'));
56
+ return;
57
+ }
58
+ let agentName = args.name;
59
+ // Interactive mode if no agent specified
60
+ if (!agentName) {
61
+ // Build choices once, use for both JSON and interactive modes
62
+ const agentChoices = workspaceInfo.agents.map((agent) => ({ name: agent.name, value: agent.name }));
63
+ const selectMessage = 'Select agent to open shell in:';
64
+ // In JSON mode, output agent selection prompt and exit
65
+ if (jsonMode) {
66
+ outputPromptAsJson(buildPromptConfig('list', 'name', selectMessage, agentChoices), createMetadata('agent shell', flags));
67
+ }
68
+ const { selected } = await inquirer.prompt([
69
+ {
70
+ type: 'list',
71
+ name: 'selected',
72
+ message: selectMessage,
73
+ choices: agentChoices
74
+ }
75
+ ]);
76
+ agentName = selected;
77
+ }
78
+ // Validate agent exists
79
+ const agent = workspaceInfo.agents.find(a => a.name === agentName);
80
+ if (!agent) {
81
+ return handleError('AGENT_NOT_FOUND', `Agent "${agentName}" not found. Available agents: ${workspaceInfo.agents.map(a => a.name).join(', ')}`);
82
+ }
83
+ const agentDir = path.join(workspaceInfo.agentsPath, agentName);
84
+ // Check if agent has devcontainer
85
+ const hasDevcontainer = hasDevcontainerConfig(agentDir);
86
+ // In JSON mode with agent name provided, output config choices prompt and exit
87
+ if (jsonMode) {
88
+ const configChoices = [
89
+ { name: 'terminal - safe - devcontainer', value: 'terminal-safe-devcontainer' },
90
+ { name: 'terminal - safe - host', value: 'terminal-safe-host' },
91
+ { name: 'terminal - danger - devcontainer', value: 'terminal-danger-devcontainer' },
92
+ { name: 'terminal - danger - host', value: 'terminal-danger-host' },
93
+ { name: 'foreground - safe - devcontainer', value: 'foreground-safe-devcontainer' },
94
+ { name: 'foreground - safe - host', value: 'foreground-safe-host' },
95
+ { name: 'foreground - danger - devcontainer', value: 'foreground-danger-devcontainer' },
96
+ { name: 'foreground - danger - host', value: 'foreground-danger-host' },
97
+ ];
98
+ outputPromptAsJson({
99
+ ...buildPromptConfig('list', 'config', 'Select shell configuration (displayMode-permissionMode-environment):', hasDevcontainer ? configChoices : configChoices.filter(c => c.value.endsWith('-host'))),
100
+ context: { agentName, hasDevcontainer },
101
+ }, createMetadata('agent shell', flags));
102
+ }
103
+ // Prompt for environment
104
+ let environment = 'host';
105
+ if (hasDevcontainer) {
106
+ const { selectedEnvironment } = await inquirer.prompt([
107
+ {
108
+ type: 'list',
109
+ name: 'selectedEnvironment',
110
+ message: 'Where should the shell run?',
111
+ choices: [
112
+ { name: '🐳 devcontainer (recommended)', value: 'devcontainer' },
113
+ { name: '💻 host (agent worktree on your machine)', value: 'host' },
114
+ ],
115
+ default: 'devcontainer',
116
+ },
117
+ ]);
118
+ environment = selectedEnvironment;
119
+ }
120
+ // Prompt for display mode and permission mode
121
+ const { displayMode, permissionMode } = await inquirer.prompt([
122
+ {
123
+ type: 'list',
124
+ name: 'displayMode',
125
+ message: 'How should the shell be opened?',
126
+ choices: [
127
+ { name: 'terminal - New terminal window', value: 'terminal' },
128
+ { name: 'foreground - Run in current terminal', value: 'foreground' },
129
+ ],
130
+ default: 'terminal',
131
+ },
132
+ {
133
+ type: 'list',
134
+ name: 'permissionMode',
135
+ message: 'Permission mode for Claude Code:',
136
+ choices: [
137
+ { name: '🔒 safe - Requires approval for dangerous operations', value: 'safe' },
138
+ { name: '⚠️ danger - Skip permission checks', value: 'danger' },
139
+ ],
140
+ default: 'safe',
141
+ },
142
+ ]);
143
+ this.log('');
144
+ this.log(colors.primary(`🐚 Opening shell for agent: ${agentName}`));
145
+ this.log('');
146
+ const dangerMode = permissionMode === 'danger';
147
+ if (environment === 'devcontainer') {
148
+ await this.openDevcontainerShell(workspaceInfo.path, agentDir, agentName, displayMode, dangerMode);
149
+ }
150
+ else {
151
+ await this.openHostShell(workspaceInfo.path, agentDir, agentName, displayMode, dangerMode);
152
+ }
153
+ }
154
+ async openDevcontainerShell(hqPath, agentDir, agentName, displayMode, dangerMode) {
155
+ // Check Docker is running
156
+ if (!isDockerRunning()) {
157
+ this.error('Docker is not running. Please start Docker Desktop and try again.');
158
+ }
159
+ // Start or ensure container is running
160
+ try {
161
+ execSync(`devcontainer up --workspace-folder "${agentDir}"`, {
162
+ stdio: 'pipe',
163
+ });
164
+ }
165
+ catch (error) {
166
+ this.error(`Failed to start devcontainer: ${error instanceof Error ? error.message : error}`);
167
+ }
168
+ // Get container ID
169
+ let containerId = null;
170
+ try {
171
+ containerId = execSync(`docker ps -q --filter "label=devcontainer.local_folder=${agentDir}"`, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
172
+ }
173
+ catch {
174
+ // Ignore
175
+ }
176
+ if (!containerId) {
177
+ this.error('Failed to find running container.');
178
+ }
179
+ this.log(colors.success(`✓ Container running: ${containerId}`));
180
+ this.log('');
181
+ // The command to run inside the container
182
+ const claudeArgs = dangerMode ? ['exec', '-it', '-w', '/workspace', containerId, 'claude', '--dangerously-skip-permissions'] : ['exec', '-it', '-w', '/workspace', containerId, 'claude'];
183
+ if (displayMode === 'foreground') {
184
+ // Run Claude directly in current terminal
185
+ this.log(colors.text('Starting Claude Code in devcontainer...'));
186
+ this.log('');
187
+ const child = spawn('docker', claudeArgs, {
188
+ stdio: 'inherit'
189
+ });
190
+ await new Promise((resolve, reject) => {
191
+ child.on('close', (code) => {
192
+ if (code === 0) {
193
+ resolve();
194
+ }
195
+ else {
196
+ reject(new Error(`Claude exited with code ${code}`));
197
+ }
198
+ });
199
+ child.on('error', reject);
200
+ });
201
+ }
202
+ else {
203
+ // Open in new terminal window using the same method as work start
204
+ const dbPath = path.join(hqPath, '.proletariat', 'workspace.db');
205
+ const db = new Database(dbPath);
206
+ try {
207
+ const terminalApp = await getTerminalApp(db);
208
+ // Create script file (same pattern as runDevcontainerInTerminal)
209
+ const baseDir = path.join(hqPath, '.proletariat', 'scripts');
210
+ fs.mkdirSync(baseDir, { recursive: true });
211
+ const scriptPath = path.join(baseDir, `shell-${agentName}-${Date.now()}.sh`);
212
+ // Launch claude inside the container
213
+ const claudeCmd = dangerMode
214
+ ? `docker exec -it -w /workspace ${containerId} claude --dangerously-skip-permissions`
215
+ : `docker exec -it -w /workspace ${containerId} claude`;
216
+ const scriptContent = `#!/bin/bash
217
+ # Shell for agent ${agentName}
218
+
219
+ echo "======================================"
220
+ echo "Agent Shell: ${agentName} (devcontainer)"
221
+ echo "======================================"
222
+ echo ""
223
+
224
+ # Run Claude Code
225
+ ${claudeCmd}
226
+
227
+ # Clean up script file
228
+ rm -f "${scriptPath}"
229
+
230
+ # Keep shell open after Claude exits
231
+ exec bash
232
+ `;
233
+ fs.writeFileSync(scriptPath, scriptContent, { mode: 0o755 });
234
+ await this.runInTerminal(terminalApp, scriptPath);
235
+ this.log(colors.success('✓ Opened new terminal window'));
236
+ this.log(colors.textSecondary('An interactive shell is now available in the devcontainer.'));
237
+ }
238
+ finally {
239
+ db.close();
240
+ }
241
+ }
242
+ }
243
+ async openHostShell(hqPath, agentDir, agentName, displayMode, dangerMode) {
244
+ if (displayMode === 'foreground') {
245
+ this.log(colors.text(`Starting Claude Code in ${agentDir}...`));
246
+ this.log('');
247
+ const claudeArgs = dangerMode ? ['--dangerously-skip-permissions'] : [];
248
+ const child = spawn('claude', claudeArgs, {
249
+ stdio: 'inherit',
250
+ cwd: agentDir,
251
+ });
252
+ await new Promise((resolve, reject) => {
253
+ child.on('close', (code) => {
254
+ if (code === 0) {
255
+ resolve();
256
+ }
257
+ else {
258
+ reject(new Error(`Claude exited with code ${code}`));
259
+ }
260
+ });
261
+ child.on('error', reject);
262
+ });
263
+ }
264
+ else {
265
+ // Open in new terminal window
266
+ const dbPath = path.join(hqPath, '.proletariat', 'workspace.db');
267
+ const db = new Database(dbPath);
268
+ try {
269
+ const terminalApp = await getTerminalApp(db);
270
+ // Create script file
271
+ const baseDir = path.join(hqPath, '.proletariat', 'scripts');
272
+ fs.mkdirSync(baseDir, { recursive: true });
273
+ const scriptPath = path.join(baseDir, `shell-${agentName}-${Date.now()}.sh`);
274
+ const claudeCmd = dangerMode ? 'claude --dangerously-skip-permissions' : 'claude';
275
+ const scriptContent = `#!/bin/bash
276
+ # Shell for agent ${agentName}
277
+
278
+ echo "======================================"
279
+ echo "Agent Shell: ${agentName} (host)"
280
+ echo "======================================"
281
+ echo ""
282
+
283
+ cd "${agentDir}"
284
+
285
+ # Run Claude Code
286
+ ${claudeCmd}
287
+
288
+ # Clean up script file
289
+ rm -f "${scriptPath}"
290
+
291
+ # Keep shell open after Claude exits
292
+ exec bash
293
+ `;
294
+ fs.writeFileSync(scriptPath, scriptContent, { mode: 0o755 });
295
+ await this.runInTerminal(terminalApp, scriptPath);
296
+ this.log(colors.success('✓ Opened new terminal window'));
297
+ this.log(colors.textSecondary(`Directory: ${agentDir}`));
298
+ }
299
+ finally {
300
+ db.close();
301
+ }
302
+ }
303
+ }
304
+ /**
305
+ * Run a script in a new terminal window using the same method as work start.
306
+ * Uses osascript with proper iTerm/Terminal handling.
307
+ */
308
+ async runInTerminal(terminalApp, scriptPath) {
309
+ switch (terminalApp) {
310
+ case 'iTerm':
311
+ // Same pattern as runDevcontainerInTerminal in runners.ts
312
+ execSync(`osascript -e '
313
+ tell application "iTerm"
314
+ activate
315
+ tell current window
316
+ set newTab to (create tab with default profile)
317
+ tell current session of newTab
318
+ write text "${scriptPath}"
319
+ end tell
320
+ end tell
321
+ end tell
322
+ '`);
323
+ break;
324
+ case 'Ghostty':
325
+ execSync(`osascript -e '
326
+ tell application "Ghostty"
327
+ activate
328
+ end tell
329
+ tell application "System Events"
330
+ tell process "Ghostty"
331
+ keystroke "t" using command down
332
+ delay 0.3
333
+ keystroke "source ${scriptPath}"
334
+ keystroke return
335
+ end tell
336
+ end tell
337
+ '`);
338
+ break;
339
+ case 'WezTerm':
340
+ execSync(`wezterm cli spawn --new-window -- bash -c 'source ${scriptPath}'`);
341
+ break;
342
+ case 'Kitty':
343
+ execSync(`kitty @ launch --type=tab -- bash -c 'source ${scriptPath}'`);
344
+ break;
345
+ case 'Alacritty':
346
+ execSync(`osascript -e '
347
+ tell application "Alacritty"
348
+ activate
349
+ end tell
350
+ tell application "System Events"
351
+ tell process "Alacritty"
352
+ keystroke "n" using command down
353
+ delay 0.3
354
+ keystroke "source ${scriptPath}"
355
+ keystroke return
356
+ end tell
357
+ end tell
358
+ '`);
359
+ break;
360
+ case 'Terminal':
361
+ default:
362
+ // Same pattern as runDevcontainerInTerminal in runners.ts
363
+ execSync(`osascript -e '
364
+ tell application "Terminal"
365
+ activate
366
+ tell application "System Events"
367
+ tell process "Terminal"
368
+ keystroke "t" using command down
369
+ end tell
370
+ end tell
371
+ delay 0.3
372
+ do script "source ${scriptPath}" in front window
373
+ end tell
374
+ '`);
375
+ break;
376
+ }
377
+ }
378
+ }
@@ -0,0 +1,15 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Add extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ names: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ 'no-container': import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ theme: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ };
13
+ static strict: boolean;
14
+ run(): Promise<void>;
15
+ }
@@ -0,0 +1,281 @@
1
+ import { Command, Args, Flags } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import inquirer from 'inquirer';
4
+ import { getWorkspaceInfo, validateAgentNames, addAgentsToWorkspace } from '../../../lib/agents/commands.js';
5
+ import { ensureBuiltinThemes, BUILTIN_THEMES, isValidAgentName, normalizeAgentName } from '../../../lib/themes.js';
6
+ import { getTheme, getThemes, getAvailableThemeNames, markThemeNameUsed, getActiveTheme } from '../../../lib/database/index.js';
7
+ import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../../lib/prompt-json.js';
8
+ export default class Add extends Command {
9
+ static description = 'Add new agents to the workspace';
10
+ static examples = [
11
+ '<%= config.bin %> <%= command.id %> zeus',
12
+ '<%= config.bin %> <%= command.id %> agent-1 agent-2',
13
+ '<%= config.bin %> <%= command.id %> --theme billionaires',
14
+ '<%= config.bin %> <%= command.id %> my-agent --no-container',
15
+ ];
16
+ static args = {
17
+ names: Args.string({
18
+ description: 'Agent names to add (space-separated)',
19
+ required: false,
20
+ }),
21
+ };
22
+ static flags = {
23
+ 'no-container': Flags.boolean({
24
+ description: 'Skip devcontainer setup (not recommended for autonomous agents)',
25
+ default: false,
26
+ }),
27
+ theme: Flags.string({
28
+ char: 't',
29
+ description: 'Pick agent name(s) from a theme (billionaires, toyotas, companies, or custom)',
30
+ }),
31
+ json: Flags.boolean({
32
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
33
+ default: false,
34
+ }),
35
+ };
36
+ static strict = false; // Allow multiple agent names
37
+ async run() {
38
+ const { argv, flags } = await this.parse(Add);
39
+ // Check if JSON output mode is active
40
+ const jsonMode = shouldOutputJson(flags);
41
+ try {
42
+ // Get workspace information
43
+ const workspaceInfo = getWorkspaceInfo();
44
+ let agentNames = argv;
45
+ let themeId;
46
+ // Theme mode: pick from a specific theme
47
+ if (flags.theme) {
48
+ // Ensure built-in themes are seeded
49
+ ensureBuiltinThemes(workspaceInfo.path);
50
+ // Validate theme exists
51
+ const theme = getTheme(workspaceInfo.path, flags.theme);
52
+ if (!theme) {
53
+ const available = BUILTIN_THEMES.map(t => t.name).join(', ');
54
+ if (jsonMode) {
55
+ outputErrorAsJson('THEME_NOT_FOUND', `Theme "${flags.theme}" not found. Available: ${available}`, createMetadata('agent add', flags));
56
+ return;
57
+ }
58
+ this.error(`Theme "${flags.theme}" not found. Available: ${available}`);
59
+ }
60
+ themeId = theme.id;
61
+ // Get available names from theme
62
+ const availableNames = getAvailableThemeNames(workspaceInfo.path, themeId);
63
+ if (availableNames.length === 0) {
64
+ if (jsonMode) {
65
+ outputErrorAsJson('NO_AVAILABLE_NAMES', `No available names in theme "${theme.display_name}". All names are in use.`, createMetadata('agent add', flags));
66
+ return;
67
+ }
68
+ this.error(`No available names in theme "${theme.display_name}". All names are in use.`);
69
+ }
70
+ // Build choices once, use for both JSON and interactive modes
71
+ const nameChoices = availableNames.map(name => ({ name, value: name }));
72
+ const selectMessage = `Select agent names from ${theme.display_name}:`;
73
+ // In JSON mode, output theme names selection prompt
74
+ if (jsonMode) {
75
+ outputPromptAsJson(buildPromptConfig('checkbox', 'names', selectMessage, nameChoices), createMetadata('agent add', flags));
76
+ return;
77
+ }
78
+ // Interactive selection from theme
79
+ const { selected } = await inquirer.prompt([{
80
+ type: 'checkbox',
81
+ name: 'selected',
82
+ message: selectMessage,
83
+ choices: nameChoices,
84
+ validate: (input) => input.length > 0 || 'Please select at least one name'
85
+ }]);
86
+ agentNames = selected;
87
+ // Mark selected names as used
88
+ for (const name of agentNames) {
89
+ markThemeNameUsed(workspaceInfo.path, themeId, name);
90
+ }
91
+ }
92
+ // Interactive mode: show names from workspace's active theme
93
+ else if (agentNames.length === 0) {
94
+ // Ensure built-in themes are seeded
95
+ ensureBuiltinThemes(workspaceInfo.path);
96
+ // Check if workspace has an active theme
97
+ const activeTheme = getActiveTheme(workspaceInfo.path);
98
+ if (activeTheme) {
99
+ // Workspace has a theme - show names from it directly
100
+ themeId = activeTheme.id;
101
+ const availableNames = getAvailableThemeNames(workspaceInfo.path, activeTheme.id);
102
+ if (availableNames.length === 0) {
103
+ if (jsonMode) {
104
+ outputErrorAsJson('NO_AVAILABLE_NAMES', `No available names in ${activeTheme.display_name}. All names are in use.`, createMetadata('agent add', flags));
105
+ return;
106
+ }
107
+ this.log(chalk.yellow(`No available names in ${activeTheme.display_name}. All names are in use.`));
108
+ this.log(chalk.blue('Use --theme to pick from a different theme, or enter names directly.'));
109
+ return;
110
+ }
111
+ // Build choices once, use for both JSON and interactive modes
112
+ const nameChoices = [
113
+ ...availableNames.map(name => ({ name, value: name })),
114
+ { name: 'Enter custom name(s)...', value: '__custom__' },
115
+ ];
116
+ const selectMessage = `Select agents from ${activeTheme.display_name}:`;
117
+ // In JSON mode, output agent names selection prompt
118
+ if (jsonMode) {
119
+ outputPromptAsJson(buildPromptConfig('checkbox', 'names', selectMessage, nameChoices), createMetadata('agent add', flags));
120
+ return;
121
+ }
122
+ // Add separator before custom option for interactive mode
123
+ const choices = [
124
+ ...nameChoices.slice(0, -1),
125
+ new inquirer.Separator(),
126
+ { name: chalk.blue(nameChoices[nameChoices.length - 1].name), value: nameChoices[nameChoices.length - 1].value }
127
+ ];
128
+ const { selected } = await inquirer.prompt([{
129
+ type: 'checkbox',
130
+ name: 'selected',
131
+ message: selectMessage,
132
+ choices,
133
+ pageSize: 20,
134
+ validate: (input) => input.length > 0 || 'Please select at least one name'
135
+ }]);
136
+ // Check if custom was selected
137
+ const hasCustom = selected.includes('__custom__');
138
+ const themedSelections = selected.filter((s) => s !== '__custom__');
139
+ if (hasCustom) {
140
+ const { customNames } = await inquirer.prompt([{
141
+ type: 'input',
142
+ name: 'customNames',
143
+ message: 'Enter custom agent names (space-separated):',
144
+ validate: (input) => {
145
+ if (!input.trim())
146
+ return 'Please enter at least one name';
147
+ return true;
148
+ }
149
+ }]);
150
+ const rawNames = customNames.trim().split(/\s+/);
151
+ const normalizedCustom = rawNames.map((n) => normalizeAgentName(n)).filter((n) => n && isValidAgentName(n));
152
+ agentNames.push(...normalizedCustom);
153
+ }
154
+ if (themedSelections.length > 0) {
155
+ agentNames.push(...themedSelections);
156
+ // Mark themed names as used
157
+ for (const name of themedSelections) {
158
+ markThemeNameUsed(workspaceInfo.path, activeTheme.id, name);
159
+ }
160
+ }
161
+ }
162
+ else {
163
+ // No active theme - prompt to pick one or enter custom names
164
+ const themes = getThemes(workspaceInfo.path);
165
+ const themesWithNames = themes.map(t => ({
166
+ theme: t,
167
+ availableCount: getAvailableThemeNames(workspaceInfo.path, t.id).length
168
+ })).filter(t => t.availableCount > 0);
169
+ // Build choices once, use for both JSON and interactive modes
170
+ const themeChoices = [
171
+ ...themesWithNames.map(({ theme, availableCount }) => ({
172
+ name: `${theme.display_name} (${availableCount} available)`,
173
+ value: theme.id
174
+ })),
175
+ { name: 'Enter custom name(s)', value: '__custom__' },
176
+ ];
177
+ const selectMessage = 'No theme set. Select a theme or enter custom names:';
178
+ // In JSON mode, output theme selection prompt
179
+ if (jsonMode) {
180
+ outputPromptAsJson(buildPromptConfig('list', 'theme', selectMessage, themeChoices), createMetadata('agent add', flags));
181
+ return;
182
+ }
183
+ // Add separator and styling for interactive mode
184
+ const interactiveChoices = [
185
+ ...themeChoices.slice(0, -1).map(c => ({
186
+ name: c.name.replace(/\((\d+) available\)/, chalk.dim(`($1 available)`)),
187
+ value: c.value
188
+ })),
189
+ new inquirer.Separator(),
190
+ { name: chalk.blue(themeChoices[themeChoices.length - 1].name), value: themeChoices[themeChoices.length - 1].value }
191
+ ];
192
+ const { selectedTheme } = await inquirer.prompt([{
193
+ type: 'list',
194
+ name: 'selectedTheme',
195
+ message: selectMessage,
196
+ choices: interactiveChoices
197
+ }]);
198
+ if (selectedTheme === '__custom__') {
199
+ const { customNames } = await inquirer.prompt([{
200
+ type: 'input',
201
+ name: 'customNames',
202
+ message: 'Enter custom agent names (space-separated):',
203
+ validate: (input) => {
204
+ if (!input.trim())
205
+ return 'Please enter at least one name';
206
+ return true;
207
+ }
208
+ }]);
209
+ const rawNames = customNames.trim().split(/\s+/);
210
+ const normalizedCustom = rawNames.map((n) => ({
211
+ original: n,
212
+ normalized: normalizeAgentName(n)
213
+ })).filter((x) => x.normalized && isValidAgentName(x.normalized));
214
+ const changed = normalizedCustom.filter((x) => x.original !== x.normalized);
215
+ if (changed.length > 0) {
216
+ this.log(chalk.blue('Normalized names:'));
217
+ for (const { original, normalized } of changed) {
218
+ this.log(chalk.dim(` ${original} → ${normalized}`));
219
+ }
220
+ }
221
+ agentNames = normalizedCustom.map((x) => x.normalized);
222
+ }
223
+ else {
224
+ themeId = selectedTheme;
225
+ const theme = getTheme(workspaceInfo.path, selectedTheme);
226
+ const availableNames = getAvailableThemeNames(workspaceInfo.path, selectedTheme);
227
+ const { selected } = await inquirer.prompt([{
228
+ type: 'checkbox',
229
+ name: 'selected',
230
+ message: `Select agents from ${theme?.display_name}:`,
231
+ choices: availableNames.map(name => ({ name, value: name })),
232
+ pageSize: 20,
233
+ validate: (input) => input.length > 0 || 'Please select at least one name'
234
+ }]);
235
+ agentNames = selected;
236
+ for (const name of agentNames) {
237
+ markThemeNameUsed(workspaceInfo.path, selectedTheme, name);
238
+ }
239
+ }
240
+ }
241
+ if (agentNames.length === 0) {
242
+ this.log(chalk.yellow('No agents specified.'));
243
+ return;
244
+ }
245
+ }
246
+ // Validate agent names (skip for theme mode - already validated)
247
+ if (!flags.theme) {
248
+ const { valid, invalid } = validateAgentNames(agentNames);
249
+ if (invalid.length > 0) {
250
+ this.log(chalk.red(`Invalid agent names: ${invalid.join(', ')}`));
251
+ this.log(chalk.yellow('Agent names must be lowercase alphanumeric with optional hyphens/underscores.'));
252
+ if (valid.length === 0) {
253
+ return;
254
+ }
255
+ this.log(chalk.blue(`Proceeding with valid agents: ${valid.join(', ')}`));
256
+ }
257
+ agentNames = valid;
258
+ }
259
+ // Add agents to workspace
260
+ const addedAgents = await addAgentsToWorkspace(workspaceInfo, agentNames, {
261
+ skipDevcontainer: flags['no-container'],
262
+ themeId,
263
+ });
264
+ if (addedAgents.length === 0) {
265
+ this.log(chalk.yellow('No new agents to add. All specified agents already exist.'));
266
+ return;
267
+ }
268
+ this.log(chalk.green(`\n Successfully added ${addedAgents.length} agent(s): ${addedAgents.join(', ')}`));
269
+ if (themeId) {
270
+ const theme = getTheme(workspaceInfo.path, themeId);
271
+ this.log(chalk.blue(` From theme: ${theme?.display_name || themeId}`));
272
+ }
273
+ if (!flags['no-container']) {
274
+ this.log(chalk.blue(' Devcontainer config created for sandboxed execution'));
275
+ }
276
+ }
277
+ catch (error) {
278
+ this.error(error instanceof Error ? error.message : String(error));
279
+ }
280
+ }
281
+ }