@proletariat/cli 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +512 -253
- package/bin/dev.cmd +3 -0
- package/bin/dev.js +5 -0
- package/bin/run.cmd +3 -0
- package/bin/run.js +23 -0
- package/dist/commands/action/create.d.ts +21 -0
- package/dist/commands/action/create.js +126 -0
- package/dist/commands/action/delete.d.ts +17 -0
- package/dist/commands/action/delete.js +78 -0
- package/dist/commands/action/index.d.ts +15 -0
- package/dist/commands/action/index.js +107 -0
- package/dist/commands/action/list.d.ts +14 -0
- package/dist/commands/action/list.js +89 -0
- package/dist/commands/action/run.d.ts +19 -0
- package/dist/commands/action/run.js +179 -0
- package/dist/commands/action/show.d.ts +15 -0
- package/dist/commands/action/show.js +47 -0
- package/dist/commands/action/update.d.ts +22 -0
- package/dist/commands/action/update.js +168 -0
- package/dist/commands/agent/index.d.ts +13 -0
- package/dist/commands/agent/index.js +131 -0
- package/dist/commands/agent/list.d.ts +7 -0
- package/dist/commands/agent/list.js +126 -0
- package/dist/commands/agent/login.d.ts +16 -0
- package/dist/commands/agent/login.js +146 -0
- package/dist/commands/agent/rebuild.d.ts +18 -0
- package/dist/commands/agent/rebuild.js +133 -0
- package/dist/commands/agent/restart.d.ts +17 -0
- package/dist/commands/agent/restart.js +116 -0
- package/dist/commands/agent/shell.d.ts +23 -0
- package/dist/commands/agent/shell.js +378 -0
- package/dist/commands/agent/staff/add.d.ts +15 -0
- package/dist/commands/agent/staff/add.js +281 -0
- package/dist/commands/agent/staff/index.d.ts +14 -0
- package/dist/commands/agent/staff/index.js +90 -0
- package/dist/commands/agent/staff/list.d.ts +7 -0
- package/dist/commands/agent/staff/list.js +90 -0
- package/dist/commands/agent/staff/remove.d.ts +16 -0
- package/dist/commands/agent/staff/remove.js +137 -0
- package/dist/commands/agent/status.d.ts +17 -0
- package/dist/commands/agent/status.js +139 -0
- package/dist/commands/agent/temp/cleanup.d.ts +23 -0
- package/dist/commands/agent/temp/cleanup.js +388 -0
- package/dist/commands/agent/temp/index.d.ts +14 -0
- package/dist/commands/agent/temp/index.js +82 -0
- package/dist/commands/agent/temp/list.d.ts +7 -0
- package/dist/commands/agent/temp/list.js +108 -0
- package/dist/commands/agent/themes/add-names.d.ts +10 -0
- package/dist/commands/agent/themes/add-names.js +67 -0
- package/dist/commands/agent/themes/create.d.ts +13 -0
- package/dist/commands/agent/themes/create.js +66 -0
- package/dist/commands/agent/themes/index.d.ts +9 -0
- package/dist/commands/agent/themes/index.js +194 -0
- package/dist/commands/agent/themes/list.d.ts +6 -0
- package/dist/commands/agent/themes/list.js +41 -0
- package/dist/commands/agent/themes/set.d.ts +12 -0
- package/dist/commands/agent/themes/set.js +77 -0
- package/dist/commands/agent/visit.d.ts +16 -0
- package/dist/commands/agent/visit.js +88 -0
- package/dist/commands/autocomplete/setup.d.ts +14 -0
- package/dist/commands/autocomplete/setup.js +154 -0
- package/dist/commands/board/index.d.ts +17 -0
- package/dist/commands/board/index.js +255 -0
- package/dist/commands/board/watch.d.ts +13 -0
- package/dist/commands/board/watch.js +52 -0
- package/dist/commands/branch/create.d.ts +50 -0
- package/dist/commands/branch/create.js +624 -0
- package/dist/commands/branch/index.d.ts +13 -0
- package/dist/commands/branch/index.js +50 -0
- package/dist/commands/branch/list.d.ts +17 -0
- package/dist/commands/branch/list.js +120 -0
- package/dist/commands/branch/validate.d.ts +15 -0
- package/dist/commands/branch/validate.js +73 -0
- package/dist/commands/commit.d.ts +71 -0
- package/dist/commands/commit.js +499 -0
- package/dist/commands/docker/clean.d.ts +13 -0
- package/dist/commands/docker/clean.js +224 -0
- package/dist/commands/docker/index.d.ts +19 -0
- package/dist/commands/docker/index.js +274 -0
- package/dist/commands/docker/list.d.ts +16 -0
- package/dist/commands/docker/list.js +200 -0
- package/dist/commands/docker/logs.d.ts +14 -0
- package/dist/commands/docker/logs.js +118 -0
- package/dist/commands/docker/prune.d.ts +14 -0
- package/dist/commands/docker/prune.js +211 -0
- package/dist/commands/docker/restart.d.ts +14 -0
- package/dist/commands/docker/restart.js +129 -0
- package/dist/commands/docker/shell.d.ts +14 -0
- package/dist/commands/docker/shell.js +103 -0
- package/dist/commands/docker/start.d.ts +12 -0
- package/dist/commands/docker/start.js +92 -0
- package/dist/commands/docker/status.d.ts +7 -0
- package/dist/commands/docker/status.js +40 -0
- package/dist/commands/docker/stop.d.ts +14 -0
- package/dist/commands/docker/stop.js +134 -0
- package/dist/commands/docker/sync.d.ts +15 -0
- package/dist/commands/docker/sync.js +112 -0
- package/dist/commands/epic/activate.d.ts +13 -0
- package/dist/commands/epic/activate.js +118 -0
- package/dist/commands/epic/archive.d.ts +14 -0
- package/dist/commands/epic/archive.js +132 -0
- package/dist/commands/epic/create.d.ts +15 -0
- package/dist/commands/epic/create.js +137 -0
- package/dist/commands/epic/index.d.ts +13 -0
- package/dist/commands/epic/index.js +88 -0
- package/dist/commands/epic/link/block.d.ts +14 -0
- package/dist/commands/epic/link/block.js +79 -0
- package/dist/commands/epic/link/duplicates.d.ts +14 -0
- package/dist/commands/epic/link/duplicates.js +66 -0
- package/dist/commands/epic/link/index.d.ts +19 -0
- package/dist/commands/epic/link/index.js +242 -0
- package/dist/commands/epic/link/relates.d.ts +14 -0
- package/dist/commands/epic/link/relates.js +66 -0
- package/dist/commands/epic/link/remove.d.ts +16 -0
- package/dist/commands/epic/link/remove.js +89 -0
- package/dist/commands/epic/list.d.ts +11 -0
- package/dist/commands/epic/list.js +87 -0
- package/dist/commands/epic/move.d.ts +15 -0
- package/dist/commands/epic/move.js +184 -0
- package/dist/commands/epic/progress.d.ts +16 -0
- package/dist/commands/epic/progress.js +166 -0
- package/dist/commands/epic/project.d.ts +15 -0
- package/dist/commands/epic/project.js +219 -0
- package/dist/commands/epic/reorder.d.ts +21 -0
- package/dist/commands/epic/reorder.js +160 -0
- package/dist/commands/epic/spec.d.ts +15 -0
- package/dist/commands/epic/spec.js +191 -0
- package/dist/commands/epic/ticket.d.ts +18 -0
- package/dist/commands/epic/ticket.js +291 -0
- package/dist/commands/epic/view.d.ts +13 -0
- package/dist/commands/epic/view.js +117 -0
- package/dist/commands/execution/index.d.ts +13 -0
- package/dist/commands/execution/index.js +70 -0
- package/dist/commands/execution/list.d.ts +15 -0
- package/dist/commands/execution/list.js +144 -0
- package/dist/commands/execution/logs.d.ts +18 -0
- package/dist/commands/execution/logs.js +161 -0
- package/dist/commands/execution/stop.d.ts +22 -0
- package/dist/commands/execution/stop.js +248 -0
- package/dist/commands/gh/index.d.ts +9 -0
- package/dist/commands/gh/index.js +53 -0
- package/dist/commands/gh/login.d.ts +6 -0
- package/dist/commands/gh/login.js +57 -0
- package/dist/commands/gh/status.d.ts +6 -0
- package/dist/commands/gh/status.js +48 -0
- package/dist/commands/gh/token.d.ts +6 -0
- package/dist/commands/gh/token.js +59 -0
- package/dist/commands/init.d.ts +26 -0
- package/dist/commands/init.js +200 -0
- package/dist/commands/phase/create.d.ts +22 -0
- package/dist/commands/phase/create.js +123 -0
- package/dist/commands/phase/delete.d.ts +17 -0
- package/dist/commands/phase/delete.js +73 -0
- package/dist/commands/phase/list.d.ts +12 -0
- package/dist/commands/phase/list.js +76 -0
- package/dist/commands/phase/move.d.ts +17 -0
- package/dist/commands/phase/move.js +115 -0
- package/dist/commands/phase/template/apply.d.ts +17 -0
- package/dist/commands/phase/template/apply.js +106 -0
- package/dist/commands/phase/template/create.d.ts +16 -0
- package/dist/commands/phase/template/create.js +58 -0
- package/dist/commands/phase/template/delete.d.ts +17 -0
- package/dist/commands/phase/template/delete.js +98 -0
- package/dist/commands/phase/template/index.d.ts +15 -0
- package/dist/commands/phase/template/index.js +128 -0
- package/dist/commands/phase/template/list.d.ts +16 -0
- package/dist/commands/phase/template/list.js +95 -0
- package/dist/commands/phase/template/update.d.ts +17 -0
- package/dist/commands/phase/template/update.js +89 -0
- package/dist/commands/phase/update.d.ts +23 -0
- package/dist/commands/phase/update.js +174 -0
- package/dist/commands/pmo/init.d.ts +25 -0
- package/dist/commands/pmo/init.js +341 -0
- package/dist/commands/pr/create.d.ts +17 -0
- package/dist/commands/pr/create.js +242 -0
- package/dist/commands/pr/index.d.ts +9 -0
- package/dist/commands/pr/index.js +68 -0
- package/dist/commands/pr/link.d.ts +14 -0
- package/dist/commands/pr/link.js +212 -0
- package/dist/commands/pr/status.d.ts +12 -0
- package/dist/commands/pr/status.js +161 -0
- package/dist/commands/project/archive.d.ts +17 -0
- package/dist/commands/project/archive.js +83 -0
- package/dist/commands/project/create.d.ts +22 -0
- package/dist/commands/project/create.js +143 -0
- package/dist/commands/project/delete.d.ts +17 -0
- package/dist/commands/project/delete.js +128 -0
- package/dist/commands/project/index.d.ts +13 -0
- package/dist/commands/project/index.js +64 -0
- package/dist/commands/project/list.d.ts +14 -0
- package/dist/commands/project/list.js +96 -0
- package/dist/commands/project/spec.d.ts +18 -0
- package/dist/commands/project/spec.js +216 -0
- package/dist/commands/project/unarchive.d.ts +15 -0
- package/dist/commands/project/unarchive.js +35 -0
- package/dist/commands/project/view.d.ts +16 -0
- package/dist/commands/project/view.js +94 -0
- package/dist/commands/repo/add.d.ts +21 -0
- package/dist/commands/repo/add.js +118 -0
- package/dist/commands/repo/index.d.ts +13 -0
- package/dist/commands/repo/index.js +114 -0
- package/dist/commands/repo/list.d.ts +13 -0
- package/dist/commands/repo/list.js +96 -0
- package/dist/commands/repo/remove.d.ts +23 -0
- package/dist/commands/repo/remove.js +217 -0
- package/dist/commands/repo/view.d.ts +15 -0
- package/dist/commands/repo/view.js +99 -0
- package/dist/commands/session/attach.d.ts +40 -0
- package/dist/commands/session/attach.js +307 -0
- package/dist/commands/session/index.d.ts +13 -0
- package/dist/commands/session/index.js +64 -0
- package/dist/commands/session/list.d.ts +21 -0
- package/dist/commands/session/list.js +181 -0
- package/dist/commands/spec/create.d.ts +19 -0
- package/dist/commands/spec/create.js +130 -0
- package/dist/commands/spec/index.d.ts +13 -0
- package/dist/commands/spec/index.js +68 -0
- package/dist/commands/spec/link/depends.d.ts +14 -0
- package/dist/commands/spec/link/depends.js +64 -0
- package/dist/commands/spec/link/duplicates.d.ts +14 -0
- package/dist/commands/spec/link/duplicates.js +63 -0
- package/dist/commands/spec/link/index.d.ts +19 -0
- package/dist/commands/spec/link/index.js +200 -0
- package/dist/commands/spec/link/relates.d.ts +14 -0
- package/dist/commands/spec/link/relates.js +63 -0
- package/dist/commands/spec/link/remove.d.ts +16 -0
- package/dist/commands/spec/link/remove.js +94 -0
- package/dist/commands/spec/list.d.ts +12 -0
- package/dist/commands/spec/list.js +75 -0
- package/dist/commands/spec/plan.d.ts +15 -0
- package/dist/commands/spec/plan.js +108 -0
- package/dist/commands/spec/ticket.d.ts +18 -0
- package/dist/commands/spec/ticket.js +160 -0
- package/dist/commands/spec/view.d.ts +15 -0
- package/dist/commands/spec/view.js +163 -0
- package/dist/commands/status/create.d.ts +21 -0
- package/dist/commands/status/create.js +140 -0
- package/dist/commands/status/delete.d.ts +13 -0
- package/dist/commands/status/delete.js +77 -0
- package/dist/commands/status/index.d.ts +14 -0
- package/dist/commands/status/index.js +91 -0
- package/dist/commands/status/list.d.ts +12 -0
- package/dist/commands/status/list.js +93 -0
- package/dist/commands/status/move.d.ts +14 -0
- package/dist/commands/status/move.js +120 -0
- package/dist/commands/status/update.d.ts +20 -0
- package/dist/commands/status/update.js +180 -0
- package/dist/commands/template/delete.d.ts +15 -0
- package/dist/commands/template/delete.js +142 -0
- package/dist/commands/template/index.d.ts +10 -0
- package/dist/commands/template/index.js +64 -0
- package/dist/commands/template/list.d.ts +18 -0
- package/dist/commands/template/list.js +157 -0
- package/dist/commands/template/phase/apply.d.ts +14 -0
- package/dist/commands/template/phase/apply.js +41 -0
- package/dist/commands/template/phase/create.d.ts +12 -0
- package/dist/commands/template/phase/create.js +29 -0
- package/dist/commands/template/phase/delete.d.ts +13 -0
- package/dist/commands/template/phase/delete.js +34 -0
- package/dist/commands/template/phase/index.d.ts +10 -0
- package/dist/commands/template/phase/index.js +62 -0
- package/dist/commands/template/phase/list.d.ts +11 -0
- package/dist/commands/template/phase/list.js +34 -0
- package/dist/commands/template/phase/update.d.ts +13 -0
- package/dist/commands/template/phase/update.js +35 -0
- package/dist/commands/template/ticket/apply.d.ts +17 -0
- package/dist/commands/template/ticket/apply.js +58 -0
- package/dist/commands/template/ticket/delete.d.ts +13 -0
- package/dist/commands/template/ticket/delete.js +34 -0
- package/dist/commands/template/ticket/index.d.ts +10 -0
- package/dist/commands/template/ticket/index.js +62 -0
- package/dist/commands/template/ticket/list.d.ts +11 -0
- package/dist/commands/template/ticket/list.js +34 -0
- package/dist/commands/template/ticket/save.d.ts +13 -0
- package/dist/commands/template/ticket/save.js +35 -0
- package/dist/commands/ticket/bulk.d.ts +13 -0
- package/dist/commands/ticket/bulk.js +145 -0
- package/dist/commands/ticket/complete.d.ts +16 -0
- package/dist/commands/ticket/complete.js +170 -0
- package/dist/commands/ticket/create.d.ts +22 -0
- package/dist/commands/ticket/create.js +390 -0
- package/dist/commands/ticket/delete.d.ts +16 -0
- package/dist/commands/ticket/delete.js +178 -0
- package/dist/commands/ticket/edit.d.ts +27 -0
- package/dist/commands/ticket/edit.js +322 -0
- package/dist/commands/ticket/epic.d.ts +20 -0
- package/dist/commands/ticket/epic.js +333 -0
- package/dist/commands/ticket/index.d.ts +13 -0
- package/dist/commands/ticket/index.js +103 -0
- package/dist/commands/ticket/link/block.d.ts +14 -0
- package/dist/commands/ticket/link/block.js +94 -0
- package/dist/commands/ticket/link/duplicates.d.ts +14 -0
- package/dist/commands/ticket/link/duplicates.js +93 -0
- package/dist/commands/ticket/link/index.d.ts +19 -0
- package/dist/commands/ticket/link/index.js +239 -0
- package/dist/commands/ticket/link/relates.d.ts +14 -0
- package/dist/commands/ticket/link/relates.js +93 -0
- package/dist/commands/ticket/link/remove.d.ts +16 -0
- package/dist/commands/ticket/link/remove.js +128 -0
- package/dist/commands/ticket/list.d.ts +24 -0
- package/dist/commands/ticket/list.js +431 -0
- package/dist/commands/ticket/move.d.ts +18 -0
- package/dist/commands/ticket/move.js +212 -0
- package/dist/commands/ticket/project.d.ts +18 -0
- package/dist/commands/ticket/project.js +254 -0
- package/dist/commands/ticket/reassign.d.ts +19 -0
- package/dist/commands/ticket/reassign.js +279 -0
- package/dist/commands/ticket/spec.d.ts +18 -0
- package/dist/commands/ticket/spec.js +259 -0
- package/dist/commands/ticket/status.d.ts +13 -0
- package/dist/commands/ticket/status.js +87 -0
- package/dist/commands/ticket/template/apply.d.ts +25 -0
- package/dist/commands/ticket/template/apply.js +249 -0
- package/dist/commands/ticket/template/create.d.ts +19 -0
- package/dist/commands/ticket/template/create.js +210 -0
- package/dist/commands/ticket/template/delete.d.ts +17 -0
- package/dist/commands/ticket/template/delete.js +92 -0
- package/dist/commands/ticket/template/index.d.ts +15 -0
- package/dist/commands/ticket/template/index.js +118 -0
- package/dist/commands/ticket/template/list.d.ts +16 -0
- package/dist/commands/ticket/template/list.js +110 -0
- package/dist/commands/ticket/template/save.d.ts +14 -0
- package/dist/commands/ticket/template/save.js +110 -0
- package/dist/commands/ticket/update.d.ts +18 -0
- package/dist/commands/ticket/update.js +325 -0
- package/dist/commands/ticket/view.d.ts +13 -0
- package/dist/commands/ticket/view.js +80 -0
- package/dist/commands/whoami.d.ts +9 -0
- package/dist/commands/whoami.js +103 -0
- package/dist/commands/work/complete.d.ts +13 -0
- package/dist/commands/work/complete.js +121 -0
- package/dist/commands/work/index.d.ts +13 -0
- package/dist/commands/work/index.js +70 -0
- package/dist/commands/work/ready.d.ts +24 -0
- package/dist/commands/work/ready.js +290 -0
- package/dist/commands/work/revise.d.ts +19 -0
- package/dist/commands/work/revise.js +377 -0
- package/dist/commands/work/spawn-all.d.ts +17 -0
- package/dist/commands/work/spawn-all.js +58 -0
- package/dist/commands/work/spawn.d.ts +29 -0
- package/dist/commands/work/spawn.js +728 -0
- package/dist/commands/work/start.d.ts +39 -0
- package/dist/commands/work/start.js +1393 -0
- package/dist/commands/work/watch.d.ts +31 -0
- package/dist/commands/work/watch.js +359 -0
- package/dist/commands/workflow/create.d.ts +18 -0
- package/dist/commands/workflow/create.js +119 -0
- package/dist/commands/workflow/delete.d.ts +17 -0
- package/dist/commands/workflow/delete.js +119 -0
- package/dist/commands/workflow/index.d.ts +15 -0
- package/dist/commands/workflow/index.js +75 -0
- package/dist/commands/workflow/list.d.ts +15 -0
- package/dist/commands/workflow/list.js +75 -0
- package/dist/commands/workflow/switch.d.ts +13 -0
- package/dist/commands/workflow/switch.js +117 -0
- package/dist/commands/workflow/view.d.ts +16 -0
- package/dist/commands/workflow/view.js +114 -0
- package/dist/commands/workspace/add.d.ts +12 -0
- package/dist/commands/workspace/add.js +74 -0
- package/dist/commands/workspace/list.d.ts +9 -0
- package/dist/commands/workspace/list.js +153 -0
- package/dist/commands/workspace/remove.d.ts +13 -0
- package/dist/commands/workspace/remove.js +98 -0
- package/dist/commands/workspace/use.d.ts +12 -0
- package/dist/commands/workspace/use.js +111 -0
- package/dist/hooks/init.d.ts +11 -0
- package/dist/hooks/init.js +57 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/lib/agents/commands.d.ts +189 -0
- package/dist/lib/agents/commands.js +893 -0
- package/dist/lib/agents/index.d.ts +54 -0
- package/dist/lib/agents/index.js +382 -0
- package/dist/lib/branch/index.d.ts +120 -0
- package/dist/lib/branch/index.js +334 -0
- package/dist/lib/colors.d.ts +94 -0
- package/dist/lib/colors.js +68 -0
- package/dist/lib/commands/docker-command.d.ts +21 -0
- package/dist/lib/commands/docker-command.js +27 -0
- package/dist/lib/database/index.d.ts +176 -0
- package/dist/lib/database/index.js +581 -0
- package/dist/lib/docker/resolve.d.ts +38 -0
- package/dist/lib/docker/resolve.js +175 -0
- package/dist/lib/execution/config.d.ts +150 -0
- package/dist/lib/execution/config.js +541 -0
- package/dist/lib/execution/devcontainer.d.ts +85 -0
- package/dist/lib/execution/devcontainer.js +594 -0
- package/dist/lib/execution/index.d.ts +10 -0
- package/dist/lib/execution/index.js +10 -0
- package/dist/lib/execution/runners.d.ts +53 -0
- package/dist/lib/execution/runners.js +1182 -0
- package/dist/lib/execution/spawner.d.ts +85 -0
- package/dist/lib/execution/spawner.js +548 -0
- package/dist/lib/execution/storage.d.ts +159 -0
- package/dist/lib/execution/storage.js +425 -0
- package/dist/lib/execution/types.d.ts +145 -0
- package/dist/lib/execution/types.js +157 -0
- package/dist/lib/init/index.d.ts +75 -0
- package/dist/lib/init/index.js +355 -0
- package/dist/lib/machine-config.d.ts +170 -0
- package/dist/lib/machine-config.js +386 -0
- package/dist/lib/pmo/base-command.d.ts +195 -0
- package/dist/lib/pmo/base-command.js +319 -0
- package/dist/lib/pmo/create-spec-folders.d.ts +43 -0
- package/dist/lib/pmo/create-spec-folders.js +64 -0
- package/dist/lib/pmo/epic-files.d.ts +56 -0
- package/dist/lib/pmo/epic-files.js +195 -0
- package/dist/lib/pmo/find-pmo.d.ts +14 -0
- package/dist/lib/pmo/find-pmo.js +172 -0
- package/dist/lib/pmo/index.d.ts +109 -0
- package/dist/lib/pmo/index.js +501 -0
- package/dist/lib/pmo/markdown.d.ts +31 -0
- package/dist/lib/pmo/markdown.js +245 -0
- package/dist/lib/pmo/pmo-context.d.ts +27 -0
- package/dist/lib/pmo/pmo-context.js +44 -0
- package/dist/lib/pmo/schema.d.ts +82 -0
- package/dist/lib/pmo/schema.js +531 -0
- package/dist/lib/pmo/spec-parser.d.ts +25 -0
- package/dist/lib/pmo/spec-parser.js +205 -0
- package/dist/lib/pmo/spec-types.d.ts +43 -0
- package/dist/lib/pmo/spec-types.js +7 -0
- package/dist/lib/pmo/storage/actions.d.ts +34 -0
- package/dist/lib/pmo/storage/actions.js +177 -0
- package/dist/lib/pmo/storage/base.d.ts +47 -0
- package/dist/lib/pmo/storage/base.js +858 -0
- package/dist/lib/pmo/storage/dependencies.d.ts +61 -0
- package/dist/lib/pmo/storage/dependencies.js +267 -0
- package/dist/lib/pmo/storage/epics.d.ts +46 -0
- package/dist/lib/pmo/storage/epics.js +243 -0
- package/dist/lib/pmo/storage/helpers.d.ts +33 -0
- package/dist/lib/pmo/storage/helpers.js +148 -0
- package/dist/lib/pmo/storage/index.d.ts +186 -0
- package/dist/lib/pmo/storage/index.js +689 -0
- package/dist/lib/pmo/storage/phases.d.ts +65 -0
- package/dist/lib/pmo/storage/phases.js +392 -0
- package/dist/lib/pmo/storage/projects.d.ts +79 -0
- package/dist/lib/pmo/storage/projects.js +303 -0
- package/dist/lib/pmo/storage/specs.d.ts +77 -0
- package/dist/lib/pmo/storage/specs.js +389 -0
- package/dist/lib/pmo/storage/statuses.d.ts +63 -0
- package/dist/lib/pmo/storage/statuses.js +404 -0
- package/dist/lib/pmo/storage/subtasks.d.ts +37 -0
- package/dist/lib/pmo/storage/subtasks.js +184 -0
- package/dist/lib/pmo/storage/templates.d.ts +40 -0
- package/dist/lib/pmo/storage/templates.js +210 -0
- package/dist/lib/pmo/storage/tickets.d.ts +57 -0
- package/dist/lib/pmo/storage/tickets.js +453 -0
- package/dist/lib/pmo/storage/types.d.ts +200 -0
- package/dist/lib/pmo/storage/types.js +5 -0
- package/dist/lib/pmo/storage/views.d.ts +44 -0
- package/dist/lib/pmo/storage/views.js +355 -0
- package/dist/lib/pmo/storage-sqlite.d.ts +7 -0
- package/dist/lib/pmo/storage-sqlite.js +7 -0
- package/dist/lib/pmo/sync-manager.d.ts +92 -0
- package/dist/lib/pmo/sync-manager.js +229 -0
- package/dist/lib/pmo/types.d.ts +710 -0
- package/dist/lib/pmo/types.js +108 -0
- package/dist/lib/pmo/utils.d.ts +122 -0
- package/dist/lib/pmo/utils.js +174 -0
- package/dist/lib/pmo/watcher.d.ts +43 -0
- package/dist/lib/pmo/watcher.js +208 -0
- package/dist/lib/pr/index.d.ts +150 -0
- package/dist/lib/pr/index.js +483 -0
- package/dist/lib/prompt-json.d.ts +231 -0
- package/dist/lib/prompt-json.js +213 -0
- package/dist/lib/repos/index.d.ts +81 -0
- package/dist/lib/repos/index.js +679 -0
- package/dist/lib/styles.d.ts +98 -0
- package/dist/lib/styles.js +195 -0
- package/dist/lib/themes.d.ts +128 -0
- package/dist/lib/themes.js +301 -0
- package/dist/lib/ui/BoardUI.d.ts +21 -0
- package/dist/lib/ui/BoardUI.js +85 -0
- package/dist/lib/ui/ClaimTicketUI.d.ts +17 -0
- package/dist/lib/ui/ClaimTicketUI.js +64 -0
- package/dist/lib/ui/CreateTicketUI.d.ts +13 -0
- package/dist/lib/ui/CreateTicketUI.js +101 -0
- package/dist/lib/workspace.d.ts +66 -0
- package/dist/lib/workspace.js +204 -0
- package/oclif.manifest.json +10593 -0
- package/package.json +103 -56
- package/LICENSE +0 -21
- package/dist/bin/prlt.d.ts +0 -11
- package/dist/bin/prlt.d.ts.map +0 -1
- package/dist/bin/prlt.js +0 -144
- package/dist/bin/prlt.js.map +0 -1
- package/dist/lib/config/index.d.ts +0 -14
- package/dist/lib/config/index.d.ts.map +0 -1
- package/dist/lib/config/index.js +0 -142
- package/dist/lib/config/index.js.map +0 -1
- package/dist/lib/config/upgrade.d.ts +0 -2
- package/dist/lib/config/upgrade.d.ts.map +0 -1
- package/dist/lib/config/upgrade.js +0 -248
- package/dist/lib/config/upgrade.js.map +0 -1
- package/dist/lib/themes/index.d.ts +0 -8
- package/dist/lib/themes/index.d.ts.map +0 -1
- package/dist/lib/themes/index.js +0 -80
- package/dist/lib/themes/index.js.map +0 -1
- package/dist/lib/utils/helpers.d.ts +0 -4
- package/dist/lib/utils/helpers.d.ts.map +0 -1
- package/dist/lib/utils/helpers.js +0 -39
- package/dist/lib/utils/helpers.js.map +0 -1
- package/dist/lib/utils/logger.d.ts +0 -4
- package/dist/lib/utils/logger.d.ts.map +0 -1
- package/dist/lib/utils/logger.js +0 -28
- package/dist/lib/utils/logger.js.map +0 -1
- package/dist/lib/workspace/index.d.ts +0 -13
- package/dist/lib/workspace/index.d.ts.map +0 -1
- package/dist/lib/workspace/index.js +0 -116
- package/dist/lib/workspace/index.js.map +0 -1
- package/dist/lib/worktree/index.d.ts +0 -7
- package/dist/lib/worktree/index.d.ts.map +0 -1
- package/dist/lib/worktree/index.js +0 -362
- package/dist/lib/worktree/index.js.map +0 -1
- package/dist/lib/worktree/migrate.d.ts +0 -2
- package/dist/lib/worktree/migrate.d.ts.map +0 -1
- package/dist/lib/worktree/migrate.js +0 -214
- package/dist/lib/worktree/migrate.js.map +0 -1
- package/dist/lib/worktree/repair.d.ts +0 -3
- package/dist/lib/worktree/repair.d.ts.map +0 -1
- package/dist/lib/worktree/repair.js +0 -320
- package/dist/lib/worktree/repair.js.map +0 -1
- package/dist/types/index.d.ts +0 -57
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -3
- 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;
|