@proletariat/cli 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +561 -251
- 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,224 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import { execSync } from 'child_process';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import Database from 'better-sqlite3';
|
|
5
|
+
import inquirer from 'inquirer';
|
|
6
|
+
import { styles } from '../../lib/styles.js';
|
|
7
|
+
import { getWorkspaceInfo } from '../../lib/agents/commands.js';
|
|
8
|
+
import { ExecutionStorage } from '../../lib/execution/storage.js';
|
|
9
|
+
import { isDockerRunning } from '../../lib/execution/runners.js';
|
|
10
|
+
import { sanitizeContainerId } from '../../lib/docker/resolve.js';
|
|
11
|
+
import { shouldOutputJson, outputPromptAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
|
|
12
|
+
export default class DockerClean extends Command {
|
|
13
|
+
static description = 'Remove orphaned containers (containers without running agents)';
|
|
14
|
+
static examples = [
|
|
15
|
+
'<%= config.bin %> <%= command.id %>',
|
|
16
|
+
'<%= config.bin %> <%= command.id %> --force',
|
|
17
|
+
'<%= config.bin %> <%= command.id %> --dry-run',
|
|
18
|
+
];
|
|
19
|
+
static flags = {
|
|
20
|
+
force: Flags.boolean({
|
|
21
|
+
char: 'f',
|
|
22
|
+
aliases: ['yes', 'y'],
|
|
23
|
+
description: 'Skip confirmation prompt',
|
|
24
|
+
default: false,
|
|
25
|
+
}),
|
|
26
|
+
'dry-run': Flags.boolean({
|
|
27
|
+
char: 'd',
|
|
28
|
+
description: 'Show what would be removed without removing',
|
|
29
|
+
default: false,
|
|
30
|
+
}),
|
|
31
|
+
all: Flags.boolean({
|
|
32
|
+
char: 'a',
|
|
33
|
+
description: 'Remove all stopped devcontainers (not just orphaned)',
|
|
34
|
+
default: false,
|
|
35
|
+
}),
|
|
36
|
+
json: Flags.boolean({
|
|
37
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
38
|
+
default: false,
|
|
39
|
+
}),
|
|
40
|
+
};
|
|
41
|
+
async run() {
|
|
42
|
+
const { flags } = await this.parse(DockerClean);
|
|
43
|
+
// Check Docker status first
|
|
44
|
+
if (!isDockerRunning()) {
|
|
45
|
+
this.log(`\n${styles.error('Docker is not running')}`);
|
|
46
|
+
this.log(`${styles.muted('Start Docker Desktop or the Docker daemon first.')}\n`);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// Get workspace info
|
|
50
|
+
let workspaceInfo;
|
|
51
|
+
try {
|
|
52
|
+
workspaceInfo = getWorkspaceInfo();
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
this.error('Not in a workspace. Run "prlt init" first.');
|
|
56
|
+
}
|
|
57
|
+
// Open database
|
|
58
|
+
const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
|
|
59
|
+
let db;
|
|
60
|
+
try {
|
|
61
|
+
db = new Database(dbPath);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
this.error('Could not open workspace database.');
|
|
65
|
+
}
|
|
66
|
+
const executionStorage = new ExecutionStorage(db);
|
|
67
|
+
try {
|
|
68
|
+
// Find orphaned containers
|
|
69
|
+
const orphanedContainers = this.findOrphanedContainers(executionStorage, workspaceInfo.agentsPath, flags.all);
|
|
70
|
+
if (orphanedContainers.length === 0) {
|
|
71
|
+
this.log(`\n${styles.success('No orphaned containers found.')}\n`);
|
|
72
|
+
db.close();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// Display orphaned containers
|
|
76
|
+
this.log(`\n${styles.header('Orphaned Containers')}`);
|
|
77
|
+
this.log('='.repeat(80));
|
|
78
|
+
this.log(styles.muted(padEnd('Container ID', 15) +
|
|
79
|
+
padEnd('Name', 30) +
|
|
80
|
+
padEnd('Status', 15) +
|
|
81
|
+
'Reason'));
|
|
82
|
+
this.log('-'.repeat(80));
|
|
83
|
+
for (const container of orphanedContainers) {
|
|
84
|
+
this.log(padEnd(container.id, 15) +
|
|
85
|
+
padEnd(truncate(container.name, 28), 30) +
|
|
86
|
+
padEnd(container.status, 15) +
|
|
87
|
+
styles.muted(container.reason));
|
|
88
|
+
}
|
|
89
|
+
if (flags['dry-run']) {
|
|
90
|
+
this.log(`\n${styles.warning(`[DRY RUN] Would remove ${orphanedContainers.length} container(s)`)}\n`);
|
|
91
|
+
db.close();
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
// Confirm removal
|
|
95
|
+
if (!flags.force) {
|
|
96
|
+
// Check if JSON output mode is active
|
|
97
|
+
const jsonMode = shouldOutputJson(flags);
|
|
98
|
+
// Build choices once, use for both JSON and interactive modes
|
|
99
|
+
const confirmChoices = [
|
|
100
|
+
{ name: 'No', value: 'false' },
|
|
101
|
+
{ name: 'Yes', value: 'true' },
|
|
102
|
+
];
|
|
103
|
+
const confirmMessage = `Remove ${orphanedContainers.length} orphaned container(s)?`;
|
|
104
|
+
// In JSON mode, output confirmation prompt
|
|
105
|
+
if (jsonMode) {
|
|
106
|
+
outputPromptAsJson(buildPromptConfig('list', 'confirmed', confirmMessage, confirmChoices), createMetadata('docker clean', flags));
|
|
107
|
+
db.close();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const { confirm } = await inquirer.prompt([
|
|
111
|
+
{
|
|
112
|
+
type: 'confirm',
|
|
113
|
+
name: 'confirm',
|
|
114
|
+
message: confirmMessage,
|
|
115
|
+
default: false,
|
|
116
|
+
},
|
|
117
|
+
]);
|
|
118
|
+
if (!confirm) {
|
|
119
|
+
this.log(`\n${styles.muted('Aborted.')}\n`);
|
|
120
|
+
db.close();
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Remove containers
|
|
125
|
+
let removed = 0;
|
|
126
|
+
let failed = 0;
|
|
127
|
+
for (const container of orphanedContainers) {
|
|
128
|
+
try {
|
|
129
|
+
const safeId = sanitizeContainerId(container.id);
|
|
130
|
+
// Stop container if running
|
|
131
|
+
if (container.status.includes('Up')) {
|
|
132
|
+
this.log(styles.muted(`Stopping ${container.id}...`));
|
|
133
|
+
execSync(`docker stop ${safeId}`, {
|
|
134
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
135
|
+
timeout: 30000,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
// Remove container
|
|
139
|
+
this.log(styles.muted(`Removing ${container.id}...`));
|
|
140
|
+
execSync(`docker rm ${safeId}`, {
|
|
141
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
142
|
+
});
|
|
143
|
+
removed++;
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
this.log(styles.error(`Failed to remove ${container.id}: ${error instanceof Error ? error.message : error}`));
|
|
147
|
+
failed++;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (removed > 0) {
|
|
151
|
+
this.log(`\n${styles.success(`Removed ${removed} container(s)`)}`);
|
|
152
|
+
}
|
|
153
|
+
if (failed > 0) {
|
|
154
|
+
this.log(styles.error(`Failed to remove ${failed} container(s)`));
|
|
155
|
+
}
|
|
156
|
+
this.log('');
|
|
157
|
+
db.close();
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
db.close();
|
|
161
|
+
throw error;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
findOrphanedContainers(executionStorage, agentsPath, includeAllStopped) {
|
|
165
|
+
const orphaned = [];
|
|
166
|
+
try {
|
|
167
|
+
// Get all devcontainers
|
|
168
|
+
const output = execSync('docker ps -a --format "{{.ID}}|{{.Names}}|{{.Status}}|{{.Label \\"devcontainer.local_folder\\"}}"', {
|
|
169
|
+
encoding: 'utf-8',
|
|
170
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
171
|
+
}).trim();
|
|
172
|
+
if (!output)
|
|
173
|
+
return [];
|
|
174
|
+
// Get running executions from database
|
|
175
|
+
const runningExecutions = executionStorage.listExecutions({ status: 'running' });
|
|
176
|
+
const startingExecutions = executionStorage.listExecutions({ status: 'starting' });
|
|
177
|
+
const activeExecutions = [...runningExecutions, ...startingExecutions];
|
|
178
|
+
const lines = output.split('\n');
|
|
179
|
+
for (const line of lines) {
|
|
180
|
+
const [id, name, status, agentDir] = line.split('|');
|
|
181
|
+
// Only consider devcontainers (have agentDir label)
|
|
182
|
+
if (!agentDir)
|
|
183
|
+
continue;
|
|
184
|
+
const isRunning = status.includes('Up');
|
|
185
|
+
const isStopped = !isRunning;
|
|
186
|
+
// Check if this container has an active execution
|
|
187
|
+
const hasActiveExecution = activeExecutions.some(exec => exec.containerId && (exec.containerId === id ||
|
|
188
|
+
exec.containerId.startsWith(id) ||
|
|
189
|
+
id.startsWith(exec.containerId)));
|
|
190
|
+
// Skip healthy containers (running with active execution)
|
|
191
|
+
if (isRunning && hasActiveExecution)
|
|
192
|
+
continue;
|
|
193
|
+
// Skip normal stopped containers unless --all flag
|
|
194
|
+
if (isStopped && !hasActiveExecution && !includeAllStopped)
|
|
195
|
+
continue;
|
|
196
|
+
// Remaining containers are orphaned - determine reason
|
|
197
|
+
const reason = isStopped
|
|
198
|
+
? hasActiveExecution
|
|
199
|
+
? 'Container stopped but execution active'
|
|
200
|
+
: 'Stopped devcontainer'
|
|
201
|
+
: 'No active execution';
|
|
202
|
+
orphaned.push({
|
|
203
|
+
id,
|
|
204
|
+
name,
|
|
205
|
+
status: status.split(' ').slice(0, 2).join(' '),
|
|
206
|
+
agentDir,
|
|
207
|
+
reason,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
return orphaned;
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
return [];
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
function padEnd(str, length) {
|
|
218
|
+
return str.padEnd(length);
|
|
219
|
+
}
|
|
220
|
+
function truncate(str, maxLength) {
|
|
221
|
+
if (str.length <= maxLength)
|
|
222
|
+
return str;
|
|
223
|
+
return str.substring(0, maxLength - 2) + '..';
|
|
224
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class Docker extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
};
|
|
8
|
+
run(): Promise<void>;
|
|
9
|
+
private selectContainer;
|
|
10
|
+
/**
|
|
11
|
+
* Get raw container info from Docker (no agent name inference)
|
|
12
|
+
*/
|
|
13
|
+
private getDockerContainers;
|
|
14
|
+
/**
|
|
15
|
+
* Extract agent name from devcontainer image name.
|
|
16
|
+
* Only used for NEW/untracked containers - DB is source of truth otherwise.
|
|
17
|
+
*/
|
|
18
|
+
private extractAgentFromImage;
|
|
19
|
+
}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { execSync } from 'child_process';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import Database from 'better-sqlite3';
|
|
6
|
+
import { styles } from '../../lib/styles.js';
|
|
7
|
+
import { getWorkspaceInfo } from '../../lib/agents/commands.js';
|
|
8
|
+
import { ExecutionStorage, ContainerStorage } from '../../lib/execution/storage.js';
|
|
9
|
+
import { isDockerRunning } from '../../lib/execution/runners.js';
|
|
10
|
+
import { shouldOutputJson, outputPromptAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
|
|
11
|
+
export default class Docker extends Command {
|
|
12
|
+
static description = 'Manage Docker containers used by agents';
|
|
13
|
+
static examples = [
|
|
14
|
+
'<%= config.bin %> <%= command.id %>',
|
|
15
|
+
'<%= config.bin %> docker status',
|
|
16
|
+
'<%= config.bin %> docker list',
|
|
17
|
+
'<%= config.bin %> docker logs WORK-001',
|
|
18
|
+
'<%= config.bin %> docker start WORK-001',
|
|
19
|
+
'<%= config.bin %> docker stop kalanick',
|
|
20
|
+
'<%= config.bin %> docker shell WORK-001',
|
|
21
|
+
'<%= config.bin %> docker restart abc123',
|
|
22
|
+
'<%= config.bin %> docker sync',
|
|
23
|
+
'<%= config.bin %> docker clean',
|
|
24
|
+
'<%= config.bin %> docker prune',
|
|
25
|
+
];
|
|
26
|
+
static flags = {
|
|
27
|
+
json: Flags.boolean({
|
|
28
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
29
|
+
default: false,
|
|
30
|
+
}),
|
|
31
|
+
};
|
|
32
|
+
async run() {
|
|
33
|
+
const { flags } = await this.parse(Docker);
|
|
34
|
+
// Check if JSON output mode is active
|
|
35
|
+
const jsonMode = shouldOutputJson(flags);
|
|
36
|
+
// Define choices once, use for both JSON and interactive modes
|
|
37
|
+
const menuChoices = [
|
|
38
|
+
{ name: 'Check Docker status', value: 'status' },
|
|
39
|
+
{ name: 'List containers', value: 'list' },
|
|
40
|
+
{ name: 'View container logs', value: 'logs' },
|
|
41
|
+
{ name: 'Start a container', value: 'start' },
|
|
42
|
+
{ name: 'Stop a container', value: 'stop' },
|
|
43
|
+
{ name: 'Shell into container', value: 'shell' },
|
|
44
|
+
{ name: 'Restart a container', value: 'restart' },
|
|
45
|
+
{ name: 'Sync containers from Docker', value: 'sync' },
|
|
46
|
+
{ name: 'Clean orphaned containers', value: 'clean' },
|
|
47
|
+
{ name: 'Prune unused resources', value: 'prune' },
|
|
48
|
+
{ name: 'Exit', value: 'exit' },
|
|
49
|
+
];
|
|
50
|
+
const message = 'What would you like to do?';
|
|
51
|
+
// In JSON mode, output menu prompt
|
|
52
|
+
if (jsonMode) {
|
|
53
|
+
outputPromptAsJson(buildPromptConfig('list', 'action', message, menuChoices), createMetadata('docker', flags));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this.log('');
|
|
57
|
+
this.log(styles.header('Docker Management'));
|
|
58
|
+
this.log('');
|
|
59
|
+
const { action } = await inquirer.prompt([
|
|
60
|
+
{
|
|
61
|
+
type: 'list',
|
|
62
|
+
name: 'action',
|
|
63
|
+
message,
|
|
64
|
+
choices: [
|
|
65
|
+
...menuChoices.slice(0, 7),
|
|
66
|
+
new inquirer.Separator(),
|
|
67
|
+
...menuChoices.slice(7, 10),
|
|
68
|
+
new inquirer.Separator(),
|
|
69
|
+
menuChoices[10],
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
]);
|
|
73
|
+
if (action === 'exit') {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// Commands that require a target
|
|
77
|
+
const targetCommands = ['logs', 'start', 'stop', 'shell', 'restart'];
|
|
78
|
+
if (targetCommands.includes(action)) {
|
|
79
|
+
const target = await this.selectContainer(action);
|
|
80
|
+
if (!target)
|
|
81
|
+
return;
|
|
82
|
+
await this.config.runCommand(`docker:${action}`, [target]);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
await this.config.runCommand(`docker:${action}`, []);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async selectContainer(action) {
|
|
89
|
+
// Check Docker first
|
|
90
|
+
const dockerRunning = isDockerRunning();
|
|
91
|
+
if (!dockerRunning) {
|
|
92
|
+
this.error('Docker is not running. Start Docker Desktop or the Docker daemon first.');
|
|
93
|
+
}
|
|
94
|
+
// Get workspace info (optional - we can still show docker containers without it)
|
|
95
|
+
let workspaceInfo;
|
|
96
|
+
let db = null;
|
|
97
|
+
let executionStorage = null;
|
|
98
|
+
let containerStorage = null;
|
|
99
|
+
try {
|
|
100
|
+
workspaceInfo = getWorkspaceInfo();
|
|
101
|
+
const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
|
|
102
|
+
db = new Database(dbPath);
|
|
103
|
+
executionStorage = new ExecutionStorage(db);
|
|
104
|
+
containerStorage = new ContainerStorage(db);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// No workspace - that's ok, we'll just show docker containers
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
// Get raw docker container info (just IDs and status)
|
|
111
|
+
const dockerContainers = this.getDockerContainers();
|
|
112
|
+
// Sync containers to database (if we have a workspace)
|
|
113
|
+
// This uses image name to determine agent for NEW containers only
|
|
114
|
+
if (containerStorage && dockerContainers.length > 0) {
|
|
115
|
+
const containersWithAgent = dockerContainers.map(c => ({
|
|
116
|
+
...c,
|
|
117
|
+
agentName: this.extractAgentFromImage(c.image),
|
|
118
|
+
}));
|
|
119
|
+
containerStorage.syncFromDocker(containersWithAgent);
|
|
120
|
+
}
|
|
121
|
+
// Get tracked containers from DB (source of truth for agent names)
|
|
122
|
+
const trackedContainers = containerStorage
|
|
123
|
+
? containerStorage.listContainers({ limit: 50 })
|
|
124
|
+
: [];
|
|
125
|
+
// Get tracked executions with containers from DB
|
|
126
|
+
const trackedExecutions = executionStorage
|
|
127
|
+
? executionStorage.listExecutions({ limit: 50 }).filter(e => e.environment === 'devcontainer' || e.containerId)
|
|
128
|
+
: [];
|
|
129
|
+
// Track which docker IDs we've already added
|
|
130
|
+
const addedDockerIds = new Set();
|
|
131
|
+
// Build choices
|
|
132
|
+
const choices = [];
|
|
133
|
+
// Column header
|
|
134
|
+
const header = styles.muted(` ${'ID'.padEnd(14)} ${'Agent'.padEnd(15)} Status`);
|
|
135
|
+
// Add active executions first (with container info from DB)
|
|
136
|
+
const activeExecutions = trackedExecutions.filter(e => e.status === 'running' || e.status === 'starting');
|
|
137
|
+
if (activeExecutions.length > 0) {
|
|
138
|
+
choices.push(new inquirer.Separator('── Active Executions ──'));
|
|
139
|
+
choices.push(new inquirer.Separator(header));
|
|
140
|
+
for (const exec of activeExecutions) {
|
|
141
|
+
// Get container from DB (source of truth)
|
|
142
|
+
const container = trackedContainers.find(c => c.currentExecutionId === exec.id);
|
|
143
|
+
const dockerContainer = exec.containerId
|
|
144
|
+
? dockerContainers.find(c => c.id.startsWith(exec.containerId.substring(0, 12)))
|
|
145
|
+
: null;
|
|
146
|
+
const isRunning = dockerContainer?.status.startsWith('Up') || container?.status === 'running';
|
|
147
|
+
const statusIcon = isRunning ? styles.success('●') : styles.warning('◐');
|
|
148
|
+
// Use agent name from execution record (DB source of truth)
|
|
149
|
+
choices.push({
|
|
150
|
+
name: `${statusIcon} ${exec.id.padEnd(14)} ${exec.agentName.padEnd(15)} ${styles.success(exec.status)}`,
|
|
151
|
+
value: exec.id,
|
|
152
|
+
});
|
|
153
|
+
if (exec.containerId) {
|
|
154
|
+
addedDockerIds.add(exec.containerId.substring(0, 12));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Add containers from database (not tied to active executions)
|
|
159
|
+
// Agent name comes from DB - the authoritative source
|
|
160
|
+
const standbyContainers = trackedContainers.filter(c => !activeExecutions.some(e => e.containerId?.startsWith(c.dockerId.substring(0, 12))) &&
|
|
161
|
+
c.status !== 'removed');
|
|
162
|
+
if (standbyContainers.length > 0) {
|
|
163
|
+
choices.push(new inquirer.Separator('── Containers ──'));
|
|
164
|
+
if (activeExecutions.length === 0) {
|
|
165
|
+
choices.push(new inquirer.Separator(header));
|
|
166
|
+
}
|
|
167
|
+
for (const container of standbyContainers) {
|
|
168
|
+
const dockerStatus = dockerContainers.find(d => d.id.startsWith(container.dockerId.substring(0, 12)));
|
|
169
|
+
const isRunning = dockerStatus?.status.startsWith('Up');
|
|
170
|
+
const statusIcon = isRunning ? styles.success('●') : styles.muted('○');
|
|
171
|
+
const statusText = isRunning ? styles.success('running') : styles.muted(container.status);
|
|
172
|
+
// Agent name from DB (source of truth)
|
|
173
|
+
choices.push({
|
|
174
|
+
name: `${statusIcon} ${container.dockerId.substring(0, 12).padEnd(14)} ${container.agentName.padEnd(15)} ${statusText}`,
|
|
175
|
+
value: container.dockerId,
|
|
176
|
+
});
|
|
177
|
+
addedDockerIds.add(container.dockerId.substring(0, 12));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Add devcontainers from Docker that aren't in DB yet
|
|
181
|
+
// Fall back to parsing image name only for untracked containers
|
|
182
|
+
const untracked = dockerContainers.filter(c => !addedDockerIds.has(c.id.substring(0, 12)));
|
|
183
|
+
if (untracked.length > 0) {
|
|
184
|
+
choices.push(new inquirer.Separator('── Untracked (run sync) ──'));
|
|
185
|
+
for (const container of untracked) {
|
|
186
|
+
const isRunning = container.status.startsWith('Up');
|
|
187
|
+
const statusIcon = isRunning ? styles.success('●') : styles.muted('○');
|
|
188
|
+
const statusText = isRunning ? styles.success('running') : styles.muted(container.status.toLowerCase());
|
|
189
|
+
// Parse agent from image only for untracked containers
|
|
190
|
+
const agentName = this.extractAgentFromImage(container.image);
|
|
191
|
+
choices.push({
|
|
192
|
+
name: `${statusIcon} ${container.id.substring(0, 12).padEnd(14)} ${agentName.padEnd(15)} ${statusText}`,
|
|
193
|
+
value: container.id,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// Add separator and options
|
|
198
|
+
choices.push(new inquirer.Separator());
|
|
199
|
+
choices.push({ name: 'Enter container ID manually...', value: '__manual__' });
|
|
200
|
+
choices.push({ name: styles.muted('Cancel'), value: '__cancel__' });
|
|
201
|
+
if (db)
|
|
202
|
+
db.close();
|
|
203
|
+
if (choices.length <= 2) {
|
|
204
|
+
// Only manual option, just ask for input
|
|
205
|
+
const { target } = await inquirer.prompt([
|
|
206
|
+
{
|
|
207
|
+
type: 'input',
|
|
208
|
+
name: 'target',
|
|
209
|
+
message: 'No containers found. Enter container ID:',
|
|
210
|
+
validate: (input) => input.trim().length > 0 || 'Target is required',
|
|
211
|
+
},
|
|
212
|
+
]);
|
|
213
|
+
return target.trim();
|
|
214
|
+
}
|
|
215
|
+
const { target } = await inquirer.prompt([
|
|
216
|
+
{
|
|
217
|
+
type: 'list',
|
|
218
|
+
name: 'target',
|
|
219
|
+
message: `Select container to ${action}:`,
|
|
220
|
+
choices,
|
|
221
|
+
pageSize: 15,
|
|
222
|
+
},
|
|
223
|
+
]);
|
|
224
|
+
if (target === '__cancel__') {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
if (target === '__manual__') {
|
|
228
|
+
const { manualTarget } = await inquirer.prompt([
|
|
229
|
+
{
|
|
230
|
+
type: 'input',
|
|
231
|
+
name: 'manualTarget',
|
|
232
|
+
message: 'Enter execution ID (WORK-XXX), agent name, or container ID:',
|
|
233
|
+
validate: (input) => input.trim().length > 0 || 'Target is required',
|
|
234
|
+
},
|
|
235
|
+
]);
|
|
236
|
+
return manualTarget.trim();
|
|
237
|
+
}
|
|
238
|
+
return target;
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
if (db)
|
|
242
|
+
db.close();
|
|
243
|
+
throw error;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Get raw container info from Docker (no agent name inference)
|
|
248
|
+
*/
|
|
249
|
+
getDockerContainers() {
|
|
250
|
+
try {
|
|
251
|
+
const output = execSync('docker ps -a --format "{{.ID}}|{{.Names}}|{{.Image}}|{{.Status}}"', {
|
|
252
|
+
encoding: 'utf-8',
|
|
253
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
254
|
+
}).trim();
|
|
255
|
+
if (!output)
|
|
256
|
+
return [];
|
|
257
|
+
return output.split('\n').filter(Boolean).map(line => {
|
|
258
|
+
const [id, name, image, status] = line.split('|');
|
|
259
|
+
return { id, name, image, status };
|
|
260
|
+
}).filter(c => c.image.startsWith('vsc-')); // Only devcontainers
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
return [];
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Extract agent name from devcontainer image name.
|
|
268
|
+
* Only used for NEW/untracked containers - DB is source of truth otherwise.
|
|
269
|
+
*/
|
|
270
|
+
extractAgentFromImage(image) {
|
|
271
|
+
const match = image.match(/^vsc-([^-]+)-/);
|
|
272
|
+
return match ? match[1] : 'unknown';
|
|
273
|
+
}
|
|
274
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class DockerList extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
running: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
};
|
|
9
|
+
run(): Promise<void>;
|
|
10
|
+
private getTrackedContainers;
|
|
11
|
+
private getDockerContainers;
|
|
12
|
+
/**
|
|
13
|
+
* Extract agent name from devcontainer image name (fallback only)
|
|
14
|
+
*/
|
|
15
|
+
private extractAgentFromImage;
|
|
16
|
+
}
|