@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,581 @@
1
+ import Database from 'better-sqlite3';
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import { getThemePersistentDir } from '../themes.js';
5
+ import { PMO_SCHEMA_SQL } from '../pmo/schema.js';
6
+ const CREATE_TABLES_SQL = `
7
+ -- Core workspace metadata
8
+ CREATE TABLE IF NOT EXISTS workspace (
9
+ id INTEGER PRIMARY KEY CHECK (id = 1),
10
+ type TEXT NOT NULL CHECK (type IN ('hq', 'workspace')),
11
+ workspace_name TEXT NOT NULL,
12
+ has_pmo BOOLEAN DEFAULT FALSE,
13
+ active_theme_id TEXT,
14
+ created_at TEXT NOT NULL,
15
+ FOREIGN KEY (active_theme_id) REFERENCES agent_themes(id) ON DELETE SET NULL
16
+ );
17
+
18
+ -- Repository management
19
+ CREATE TABLE IF NOT EXISTS repositories (
20
+ name TEXT PRIMARY KEY,
21
+ path TEXT NOT NULL,
22
+ type TEXT DEFAULT 'main' CHECK (type IN ('main', 'dependency')),
23
+ source_url TEXT,
24
+ action TEXT CHECK (action IN ('clone', 'move', 'link')),
25
+ added_at TEXT NOT NULL
26
+ );
27
+
28
+ -- Agent naming themes (optional)
29
+ CREATE TABLE IF NOT EXISTS agent_themes (
30
+ id TEXT PRIMARY KEY,
31
+ name TEXT NOT NULL UNIQUE,
32
+ display_name TEXT NOT NULL,
33
+ description TEXT,
34
+ builtin BOOLEAN DEFAULT FALSE,
35
+ created_at TEXT NOT NULL
36
+ );
37
+
38
+ -- Names available within each theme
39
+ CREATE TABLE IF NOT EXISTS agent_theme_names (
40
+ theme_id TEXT NOT NULL,
41
+ name TEXT NOT NULL,
42
+ used BOOLEAN DEFAULT FALSE,
43
+ PRIMARY KEY (theme_id, name),
44
+ FOREIGN KEY (theme_id) REFERENCES agent_themes(id) ON DELETE CASCADE
45
+ );
46
+
47
+ -- Agent instances in workspace
48
+ CREATE TABLE IF NOT EXISTS agents (
49
+ name TEXT PRIMARY KEY,
50
+ type TEXT NOT NULL DEFAULT 'persistent' CHECK (type IN ('persistent', 'ephemeral')),
51
+ status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'cleaned')),
52
+ base_name TEXT,
53
+ theme_id TEXT,
54
+ worktree_path TEXT,
55
+ created_at TEXT NOT NULL,
56
+ cleaned_at TEXT,
57
+ FOREIGN KEY (theme_id) REFERENCES agent_themes(id) ON DELETE SET NULL
58
+ );
59
+
60
+ -- Agent-owned worktrees
61
+ CREATE TABLE IF NOT EXISTS agent_worktrees (
62
+ agent_name TEXT NOT NULL,
63
+ repo_name TEXT NOT NULL,
64
+ worktree_path TEXT NOT NULL,
65
+ branch TEXT NOT NULL,
66
+ created_at TEXT NOT NULL,
67
+ PRIMARY KEY (agent_name, repo_name),
68
+ FOREIGN KEY (agent_name) REFERENCES agents(name) ON DELETE CASCADE,
69
+ FOREIGN KEY (repo_name) REFERENCES repositories(name) ON DELETE CASCADE
70
+ );
71
+
72
+ -- Workspace-level settings (key-value store)
73
+ CREATE TABLE IF NOT EXISTS workspace_settings (
74
+ key TEXT PRIMARY KEY,
75
+ value TEXT NOT NULL
76
+ );
77
+
78
+ -- =============================================================================
79
+ -- Indexes
80
+ -- =============================================================================
81
+
82
+ CREATE INDEX IF NOT EXISTS idx_worktrees_agent ON agent_worktrees(agent_name);
83
+ CREATE INDEX IF NOT EXISTS idx_worktrees_repo ON agent_worktrees(repo_name);
84
+ CREATE INDEX IF NOT EXISTS idx_theme_names_theme ON agent_theme_names(theme_id);
85
+ CREATE INDEX IF NOT EXISTS idx_agents_theme ON agents(theme_id);
86
+ `;
87
+ /**
88
+ * Ensure ephemeral agents are correctly typed based on their worktree path or naming pattern
89
+ */
90
+ function ensureEphemeralAgentTypes(db) {
91
+ // Check if agents table exists
92
+ const tableExists = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='agents'").get();
93
+ if (!tableExists) {
94
+ return;
95
+ }
96
+ // Agents in temp directory should be ephemeral
97
+ db.exec("UPDATE agents SET type = 'ephemeral' WHERE worktree_path LIKE 'agents/temp/%' AND type != 'ephemeral'");
98
+ // Detect ephemeral agents by naming pattern: adjective-name-number (e.g., blue-khosla-1)
99
+ // Staff agents are single names like 'lecun', 'musk', 'gates'
100
+ db.exec(`
101
+ UPDATE agents SET type = 'ephemeral'
102
+ WHERE type != 'ephemeral'
103
+ AND name GLOB '*-*-[0-9]*'
104
+ `);
105
+ }
106
+ /**
107
+ * Get the database path for a workspace
108
+ */
109
+ export function getDatabasePath(workspacePath) {
110
+ return path.join(workspacePath, '.proletariat', 'workspace.db');
111
+ }
112
+ /**
113
+ * Get the config path for a workspace
114
+ */
115
+ export function getConfigPath(workspacePath) {
116
+ return path.join(workspacePath, '.proletariat', 'config.json');
117
+ }
118
+ /**
119
+ * Open workspace database connection
120
+ */
121
+ export function openWorkspaceDatabase(workspacePath) {
122
+ const dbPath = getDatabasePath(workspacePath);
123
+ if (!fs.existsSync(dbPath)) {
124
+ throw new Error(`Database not found: ${dbPath}. Run 'prlt init' first.`);
125
+ }
126
+ const db = new Database(dbPath);
127
+ db.pragma('foreign_keys = ON');
128
+ // Ensure ephemeral agents are correctly typed
129
+ ensureEphemeralAgentTypes(db);
130
+ // Ensure theme tables exist
131
+ db.exec(`
132
+ CREATE TABLE IF NOT EXISTS agent_themes (
133
+ id TEXT PRIMARY KEY,
134
+ name TEXT NOT NULL UNIQUE,
135
+ display_name TEXT NOT NULL,
136
+ description TEXT,
137
+ builtin BOOLEAN DEFAULT FALSE,
138
+ created_at TEXT NOT NULL
139
+ );
140
+ CREATE TABLE IF NOT EXISTS agent_theme_names (
141
+ theme_id TEXT NOT NULL,
142
+ name TEXT NOT NULL,
143
+ used BOOLEAN DEFAULT FALSE,
144
+ PRIMARY KEY (theme_id, name),
145
+ FOREIGN KEY (theme_id) REFERENCES agent_themes(id) ON DELETE CASCADE
146
+ );
147
+ CREATE INDEX IF NOT EXISTS idx_theme_names_theme ON agent_theme_names(theme_id);
148
+ CREATE INDEX IF NOT EXISTS idx_agents_theme ON agents(theme_id);
149
+ `);
150
+ return db;
151
+ }
152
+ /**
153
+ * Create and initialize workspace database
154
+ */
155
+ export function createWorkspaceDatabase(workspacePath, type, workspaceName, hasPMO = false) {
156
+ const dbPath = getDatabasePath(workspacePath);
157
+ const configPath = getConfigPath(workspacePath);
158
+ // Ensure .proletariat directory exists
159
+ const proletariatDir = path.dirname(dbPath);
160
+ if (!fs.existsSync(proletariatDir)) {
161
+ fs.mkdirSync(proletariatDir, { recursive: true });
162
+ }
163
+ // Create minimal config.json (bootstrap only)
164
+ const bootstrapConfig = {
165
+ version: "1.0.0",
166
+ schemaVersion: 1
167
+ };
168
+ fs.writeFileSync(configPath, JSON.stringify(bootstrapConfig, null, 2));
169
+ // Create and setup SQLite database
170
+ const db = new Database(dbPath);
171
+ // Enable foreign keys
172
+ db.pragma('foreign_keys = ON');
173
+ // Create core workspace tables (agents, repos, etc)
174
+ db.exec(CREATE_TABLES_SQL);
175
+ // Create PMO tables (from shared schema)
176
+ db.exec(PMO_SCHEMA_SQL);
177
+ // Insert workspace data (convert boolean to number for SQLite)
178
+ db.prepare(`
179
+ INSERT INTO workspace (id, type, workspace_name, has_pmo, created_at)
180
+ VALUES (1, ?, ?, ?, ?)
181
+ `).run(type, workspaceName, hasPMO ? 1 : 0, new Date().toISOString());
182
+ return db;
183
+ }
184
+ /**
185
+ * Get workspace configuration
186
+ */
187
+ export function getWorkspaceConfig(workspacePath) {
188
+ try {
189
+ const db = openWorkspaceDatabase(workspacePath);
190
+ const config = db.prepare('SELECT * FROM workspace LIMIT 1').get();
191
+ db.close();
192
+ return config || null;
193
+ }
194
+ catch {
195
+ return null;
196
+ }
197
+ }
198
+ /**
199
+ * Get the active theme for a workspace
200
+ * Auto-detects theme from existing agents if not explicitly set
201
+ */
202
+ export function getActiveTheme(workspacePath) {
203
+ const config = getWorkspaceConfig(workspacePath);
204
+ // If explicitly set, use that
205
+ if (config?.active_theme_id) {
206
+ return getTheme(workspacePath, config.active_theme_id);
207
+ }
208
+ // Auto-detect from existing agents
209
+ const agents = getWorkspaceAgents(workspacePath);
210
+ if (agents.length === 0) {
211
+ return null;
212
+ }
213
+ // Check if any agent has a theme_id set
214
+ const themedAgent = agents.find(a => a.theme_id);
215
+ if (themedAgent?.theme_id) {
216
+ const theme = getTheme(workspacePath, themedAgent.theme_id);
217
+ if (theme) {
218
+ // Auto-set it for future use
219
+ setActiveTheme(workspacePath, themedAgent.theme_id);
220
+ return theme;
221
+ }
222
+ }
223
+ // Check if agent names match any builtin theme
224
+ const themes = getThemes(workspacePath);
225
+ for (const theme of themes) {
226
+ const themeNames = getThemeNames(workspacePath, theme.id);
227
+ const themeNameSet = new Set(themeNames.map(n => n.name.toLowerCase()));
228
+ // If any existing agent matches this theme's names
229
+ const matchingAgent = agents.find(a => themeNameSet.has(a.name.toLowerCase()));
230
+ if (matchingAgent) {
231
+ // Auto-set it for future use
232
+ setActiveTheme(workspacePath, theme.id);
233
+ return theme;
234
+ }
235
+ }
236
+ return null;
237
+ }
238
+ /**
239
+ * Set the active theme for a workspace
240
+ */
241
+ export function setActiveTheme(workspacePath, themeId) {
242
+ const db = openWorkspaceDatabase(workspacePath);
243
+ if (themeId) {
244
+ // Validate theme exists
245
+ const theme = db.prepare('SELECT id FROM agent_themes WHERE id = ?').get(themeId);
246
+ if (!theme) {
247
+ db.close();
248
+ throw new Error(`Theme "${themeId}" not found`);
249
+ }
250
+ }
251
+ db.prepare('UPDATE workspace SET active_theme_id = ? WHERE id = 1').run(themeId);
252
+ db.close();
253
+ }
254
+ /**
255
+ * Add repositories to database
256
+ */
257
+ export function addRepositoriesToDatabase(workspacePath, repos) {
258
+ const db = openWorkspaceDatabase(workspacePath);
259
+ const insertRepo = db.prepare(`
260
+ INSERT OR REPLACE INTO repositories (name, path, type, source_url, action, added_at)
261
+ VALUES (?, ?, ?, ?, ?, ?)
262
+ `);
263
+ const transaction = db.transaction(() => {
264
+ for (const repo of repos) {
265
+ insertRepo.run(repo.name, repo.path, 'main', repo.source_url || null, repo.action || null, new Date().toISOString());
266
+ }
267
+ });
268
+ transaction();
269
+ db.close();
270
+ }
271
+ /**
272
+ * Add agents to database (case-insensitive uniqueness)
273
+ */
274
+ export function addAgentsToDatabase(workspacePath, agentNames, themeId) {
275
+ const db = openWorkspaceDatabase(workspacePath);
276
+ // Check for existing agents (case-insensitive)
277
+ const checkExisting = db.prepare('SELECT name FROM agents WHERE LOWER(name) = LOWER(?)');
278
+ const insertAgent = db.prepare(`
279
+ INSERT OR REPLACE INTO agents (name, type, base_name, theme_id, worktree_path, created_at)
280
+ VALUES (?, ?, ?, ?, ?, ?)
281
+ `);
282
+ const insertWorktree = db.prepare(`
283
+ INSERT OR REPLACE INTO agent_worktrees (agent_name, repo_name, worktree_path, branch, created_at)
284
+ VALUES (?, ?, ?, ?, ?)
285
+ `);
286
+ // Get workspace config to determine paths
287
+ const workspace = db.prepare('SELECT * FROM workspace').get();
288
+ // Get all repos for this workspace
289
+ const repos = db.prepare('SELECT name FROM repositories').all();
290
+ // Determine the effective theme ID (provided or active theme)
291
+ const effectiveThemeId = themeId || workspace.active_theme_id || undefined;
292
+ const persistentDir = getThemePersistentDir(effectiveThemeId);
293
+ const transaction = db.transaction(() => {
294
+ for (const agentName of agentNames) {
295
+ // Skip if agent already exists (case-insensitive check)
296
+ const existing = checkExisting.get(agentName);
297
+ if (existing) {
298
+ continue; // Agent already exists with same name (different case)
299
+ }
300
+ const now = new Date().toISOString();
301
+ // Determine worktree path for the agent
302
+ const agentWorktreePath = workspace.type === 'hq'
303
+ ? `agents/${persistentDir}/${agentName}`
304
+ : agentName;
305
+ // Add agent (persistent type for manually added agents)
306
+ insertAgent.run(agentName, 'persistent', null, effectiveThemeId || null, agentWorktreePath, now);
307
+ // Add worktrees for all repos
308
+ for (const repo of repos) {
309
+ const worktreePath = workspace.type === 'hq'
310
+ ? `agents/${persistentDir}/${agentName}/${repo.name}`
311
+ : `${agentName}/${repo.name}`;
312
+ insertWorktree.run(agentName, repo.name, worktreePath, `agent-${agentName}`, now);
313
+ }
314
+ }
315
+ });
316
+ transaction();
317
+ db.close();
318
+ }
319
+ /**
320
+ * Add an ephemeral agent to the database
321
+ */
322
+ export function addEphemeralAgentToDatabase(workspacePath, agentName, baseName, themeId) {
323
+ const db = openWorkspaceDatabase(workspacePath);
324
+ const now = new Date().toISOString();
325
+ const worktreePath = `agents/temp/${agentName}`;
326
+ db.prepare(`
327
+ INSERT INTO agents (name, type, status, base_name, theme_id, worktree_path, created_at)
328
+ VALUES (?, ?, ?, ?, ?, ?, ?)
329
+ `).run(agentName, 'ephemeral', 'active', baseName, themeId || null, worktreePath, now);
330
+ const agent = db.prepare('SELECT * FROM agents WHERE name = ?').get(agentName);
331
+ db.close();
332
+ return {
333
+ name: agent.name,
334
+ type: agent.type,
335
+ status: agent.status,
336
+ base_name: agent.base_name,
337
+ theme_id: agent.theme_id,
338
+ worktree_path: agent.worktree_path,
339
+ created_at: agent.created_at,
340
+ cleaned_at: agent.cleaned_at,
341
+ };
342
+ }
343
+ /**
344
+ * Get all ephemeral agent names from the database
345
+ */
346
+ export function getEphemeralAgentNames(workspacePath) {
347
+ const db = openWorkspaceDatabase(workspacePath);
348
+ const agents = db.prepare("SELECT name FROM agents WHERE type = 'ephemeral'").all();
349
+ db.close();
350
+ return new Set(agents.map(a => a.name.toLowerCase()));
351
+ }
352
+ /**
353
+ * Remove an ephemeral agent from the database
354
+ */
355
+ export function removeEphemeralAgent(workspacePath, agentName) {
356
+ const db = openWorkspaceDatabase(workspacePath);
357
+ db.prepare("DELETE FROM agents WHERE name = ? AND type = 'ephemeral'").run(agentName);
358
+ db.close();
359
+ }
360
+ /**
361
+ * Get all agents in workspace
362
+ */
363
+ export function getWorkspaceAgents(workspacePath, includeCleanedUp = false) {
364
+ const db = openWorkspaceDatabase(workspacePath);
365
+ const query = includeCleanedUp
366
+ ? 'SELECT * FROM agents ORDER BY created_at'
367
+ : "SELECT * FROM agents WHERE status = 'active' OR status IS NULL ORDER BY created_at";
368
+ const rows = db.prepare(query).all();
369
+ db.close();
370
+ // Map rows to Agent type, handling missing columns in old databases
371
+ return rows.map(row => ({
372
+ name: row.name,
373
+ type: (row.type || 'persistent'),
374
+ status: (row.status || 'active'),
375
+ base_name: row.base_name,
376
+ theme_id: row.theme_id,
377
+ worktree_path: row.worktree_path,
378
+ created_at: row.created_at,
379
+ cleaned_at: row.cleaned_at,
380
+ }));
381
+ }
382
+ /**
383
+ * Mark an agent as cleaned up (keeps the record for history)
384
+ */
385
+ export function markAgentCleaned(workspacePath, agentName) {
386
+ const db = openWorkspaceDatabase(workspacePath);
387
+ const now = new Date().toISOString();
388
+ db.prepare("UPDATE agents SET status = 'cleaned', cleaned_at = ? WHERE name = ?").run(now, agentName);
389
+ db.close();
390
+ }
391
+ /**
392
+ * Sync agents in database with what exists on disk.
393
+ * Marks agents as 'cleaned' if their directory no longer exists.
394
+ * Returns list of agents that were cleaned up.
395
+ */
396
+ export function syncAgentsWithDisk(workspacePath) {
397
+ const agents = getWorkspaceAgents(workspacePath, false); // Only active agents
398
+ const cleanedAgents = [];
399
+ for (const agent of agents) {
400
+ // Determine expected directory path
401
+ let agentDir;
402
+ if (agent.worktree_path) {
403
+ agentDir = path.join(workspacePath, agent.worktree_path);
404
+ }
405
+ else if (agent.type === 'ephemeral') {
406
+ agentDir = path.join(workspacePath, 'agents', 'temp', agent.name);
407
+ }
408
+ else {
409
+ agentDir = path.join(workspacePath, 'agents', 'staff', agent.name);
410
+ }
411
+ // If directory doesn't exist, mark agent as cleaned
412
+ if (!fs.existsSync(agentDir)) {
413
+ markAgentCleaned(workspacePath, agent.name);
414
+ cleanedAgents.push(agent.name);
415
+ }
416
+ }
417
+ return cleanedAgents;
418
+ }
419
+ /**
420
+ * Get all repositories in workspace
421
+ */
422
+ export function getWorkspaceRepositories(workspacePath) {
423
+ const db = openWorkspaceDatabase(workspacePath);
424
+ const repos = db.prepare('SELECT * FROM repositories ORDER BY added_at').all();
425
+ db.close();
426
+ return repos;
427
+ }
428
+ /**
429
+ * Get worktrees for a specific agent
430
+ */
431
+ export function getAgentWorktrees(workspacePath, agentName) {
432
+ const db = openWorkspaceDatabase(workspacePath);
433
+ const worktrees = db.prepare('SELECT * FROM agent_worktrees WHERE agent_name = ?').all(agentName);
434
+ db.close();
435
+ return worktrees;
436
+ }
437
+ /**
438
+ * Remove agents from database
439
+ */
440
+ export function removeAgentsFromDatabase(workspacePath, agentNames) {
441
+ const db = openWorkspaceDatabase(workspacePath);
442
+ const getAgent = db.prepare('SELECT theme_id, name FROM agents WHERE name = ?');
443
+ const deleteAgent = db.prepare('DELETE FROM agents WHERE name = ?');
444
+ const clearUsedFlag = db.prepare('UPDATE agent_theme_names SET used = 0 WHERE theme_id = ? AND name = ?');
445
+ // Note: agent_worktrees will be deleted automatically due to CASCADE
446
+ const transaction = db.transaction(() => {
447
+ for (const agentName of agentNames) {
448
+ // Clear used flag if agent came from a theme
449
+ const agent = getAgent.get(agentName);
450
+ if (agent?.theme_id) {
451
+ clearUsedFlag.run(agent.theme_id, agentName);
452
+ }
453
+ deleteAgent.run(agentName);
454
+ }
455
+ });
456
+ transaction();
457
+ db.close();
458
+ }
459
+ // =============================================================================
460
+ // Theme CRUD Operations
461
+ // =============================================================================
462
+ /**
463
+ * Get all themes
464
+ */
465
+ export function getThemes(workspacePath) {
466
+ const db = openWorkspaceDatabase(workspacePath);
467
+ const themes = db.prepare('SELECT * FROM agent_themes ORDER BY builtin DESC, name').all();
468
+ db.close();
469
+ return themes;
470
+ }
471
+ /**
472
+ * Get a theme by ID
473
+ */
474
+ export function getTheme(workspacePath, themeId) {
475
+ const db = openWorkspaceDatabase(workspacePath);
476
+ const theme = db.prepare('SELECT * FROM agent_themes WHERE id = ?').get(themeId);
477
+ db.close();
478
+ return theme || null;
479
+ }
480
+ /**
481
+ * Create a new theme
482
+ */
483
+ export function createTheme(workspacePath, theme) {
484
+ const db = openWorkspaceDatabase(workspacePath);
485
+ const now = new Date().toISOString();
486
+ db.prepare(`
487
+ INSERT INTO agent_themes (id, name, display_name, description, builtin, created_at)
488
+ VALUES (?, ?, ?, ?, ?, ?)
489
+ `).run(theme.id, theme.name, theme.displayName, theme.description || null, theme.builtin ? 1 : 0, now);
490
+ const created = db.prepare('SELECT * FROM agent_themes WHERE id = ?').get(theme.id);
491
+ db.close();
492
+ return created;
493
+ }
494
+ /**
495
+ * Delete a theme (cannot delete builtin themes)
496
+ */
497
+ export function deleteTheme(workspacePath, themeId) {
498
+ const db = openWorkspaceDatabase(workspacePath);
499
+ // Check if builtin
500
+ const theme = db.prepare('SELECT builtin FROM agent_themes WHERE id = ?').get(themeId);
501
+ if (!theme) {
502
+ db.close();
503
+ return false;
504
+ }
505
+ if (theme.builtin) {
506
+ db.close();
507
+ throw new Error('Cannot delete built-in themes');
508
+ }
509
+ db.prepare('DELETE FROM agent_themes WHERE id = ?').run(themeId);
510
+ db.close();
511
+ return true;
512
+ }
513
+ /**
514
+ * Get names for a theme
515
+ */
516
+ export function getThemeNames(workspacePath, themeId, includeUsed = true) {
517
+ const db = openWorkspaceDatabase(workspacePath);
518
+ const query = includeUsed
519
+ ? 'SELECT * FROM agent_theme_names WHERE theme_id = ? ORDER BY name'
520
+ : 'SELECT * FROM agent_theme_names WHERE theme_id = ? AND used = 0 ORDER BY name';
521
+ const names = db.prepare(query).all(themeId);
522
+ db.close();
523
+ return names;
524
+ }
525
+ /**
526
+ * Get available (unused) names for a theme
527
+ * Also excludes names that match existing agents (case-insensitive)
528
+ */
529
+ export function getAvailableThemeNames(workspacePath, themeId) {
530
+ const db = openWorkspaceDatabase(workspacePath);
531
+ // Get unused theme names
532
+ const names = db.prepare('SELECT name FROM agent_theme_names WHERE theme_id = ? AND used = 0 ORDER BY name').all(themeId);
533
+ // Get existing agent names (lowercase for comparison)
534
+ const existingAgents = db.prepare('SELECT LOWER(name) as name FROM agents').all();
535
+ const existingSet = new Set(existingAgents.map(a => a.name));
536
+ db.close();
537
+ // Filter out names that match existing agents
538
+ return names
539
+ .map(n => n.name)
540
+ .filter(name => !existingSet.has(name.toLowerCase()));
541
+ }
542
+ /**
543
+ * Add names to a theme (case-insensitive uniqueness)
544
+ */
545
+ export function addThemeNames(workspacePath, themeId, names) {
546
+ const db = openWorkspaceDatabase(workspacePath);
547
+ // Check for existing name (case-insensitive)
548
+ const checkExisting = db.prepare('SELECT name FROM agent_theme_names WHERE theme_id = ? AND LOWER(name) = LOWER(?)');
549
+ const insertName = db.prepare(`
550
+ INSERT INTO agent_theme_names (theme_id, name, used)
551
+ VALUES (?, ?, 0)
552
+ `);
553
+ const transaction = db.transaction(() => {
554
+ for (const name of names) {
555
+ // Skip if name already exists (case-insensitive)
556
+ const existing = checkExisting.get(themeId, name);
557
+ if (existing) {
558
+ continue;
559
+ }
560
+ insertName.run(themeId, name);
561
+ }
562
+ });
563
+ transaction();
564
+ db.close();
565
+ }
566
+ /**
567
+ * Mark a theme name as used
568
+ */
569
+ export function markThemeNameUsed(workspacePath, themeId, name) {
570
+ const db = openWorkspaceDatabase(workspacePath);
571
+ db.prepare('UPDATE agent_theme_names SET used = 1 WHERE theme_id = ? AND name = ?').run(themeId, name);
572
+ db.close();
573
+ }
574
+ /**
575
+ * Mark a theme name as available
576
+ */
577
+ export function markThemeNameAvailable(workspacePath, themeId, name) {
578
+ const db = openWorkspaceDatabase(workspacePath);
579
+ db.prepare('UPDATE agent_theme_names SET used = 0 WHERE theme_id = ? AND name = ?').run(themeId, name);
580
+ db.close();
581
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Docker Container Resolution
3
+ *
4
+ * Resolves various identifiers to Docker container IDs.
5
+ * Accepts: execution ID (WORK-XXX), agent name, or container ID.
6
+ */
7
+ import { ExecutionStorage } from '../execution/storage.js';
8
+ /**
9
+ * Validate and sanitize a container ID to prevent shell injection.
10
+ * Docker container IDs are 64-character hex strings (or 12-char short form).
11
+ * Container names can contain alphanumeric, underscore, hyphen, and period.
12
+ *
13
+ * @throws Error if the ID contains invalid characters
14
+ */
15
+ export declare function sanitizeContainerId(id: string): string;
16
+ export interface ResolveResult {
17
+ containerId: string | null;
18
+ executionId?: string;
19
+ agentName?: string;
20
+ displayName: string;
21
+ error?: string;
22
+ }
23
+ /**
24
+ * Resolve a target identifier to a Docker container ID.
25
+ *
26
+ * @param target - Execution ID (WORK-XXX), agent name, or container ID
27
+ * @param executionStorage - ExecutionStorage instance
28
+ * @returns ResolveResult with containerId or error
29
+ */
30
+ export declare function resolveContainerId(target: string, executionStorage: ExecutionStorage): ResolveResult;
31
+ /**
32
+ * Check if a container is currently running.
33
+ */
34
+ export declare function isContainerRunning(containerId: string): boolean;
35
+ /**
36
+ * Check if a container exists (running or stopped).
37
+ */
38
+ export declare function containerExists(containerId: string): boolean;