@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,200 @@
|
|
|
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 { styles } from '../../lib/styles.js';
|
|
6
|
+
import { getWorkspaceInfo } from '../../lib/agents/commands.js';
|
|
7
|
+
import { ExecutionStorage, ContainerStorage } from '../../lib/execution/storage.js';
|
|
8
|
+
import { isDockerRunning } from '../../lib/execution/runners.js';
|
|
9
|
+
export default class DockerList extends Command {
|
|
10
|
+
static description = 'Show Docker containers from agent_work table with status';
|
|
11
|
+
static examples = [
|
|
12
|
+
'<%= config.bin %> <%= command.id %>',
|
|
13
|
+
'<%= config.bin %> <%= command.id %> --all',
|
|
14
|
+
'<%= config.bin %> <%= command.id %> --running',
|
|
15
|
+
];
|
|
16
|
+
static flags = {
|
|
17
|
+
all: Flags.boolean({
|
|
18
|
+
char: 'a',
|
|
19
|
+
description: 'Show all containers (including non-devcontainer)',
|
|
20
|
+
default: false,
|
|
21
|
+
}),
|
|
22
|
+
running: Flags.boolean({
|
|
23
|
+
char: 'r',
|
|
24
|
+
description: 'Only show running containers',
|
|
25
|
+
default: false,
|
|
26
|
+
}),
|
|
27
|
+
};
|
|
28
|
+
async run() {
|
|
29
|
+
const { flags } = await this.parse(DockerList);
|
|
30
|
+
// Check Docker status first
|
|
31
|
+
if (!isDockerRunning()) {
|
|
32
|
+
this.log(`\n${styles.error('Docker is not running')}`);
|
|
33
|
+
this.log(`${styles.muted('Start Docker Desktop or the Docker daemon first.')}\n`);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
// Get workspace info
|
|
37
|
+
let workspaceInfo;
|
|
38
|
+
try {
|
|
39
|
+
workspaceInfo = getWorkspaceInfo();
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
this.error('Not in a workspace. Run "prlt init" first.');
|
|
43
|
+
}
|
|
44
|
+
// Open database
|
|
45
|
+
const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
|
|
46
|
+
let db;
|
|
47
|
+
try {
|
|
48
|
+
db = new Database(dbPath);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
this.error('Could not open workspace database.');
|
|
52
|
+
}
|
|
53
|
+
const executionStorage = new ExecutionStorage(db);
|
|
54
|
+
const containerStorage = new ContainerStorage(db);
|
|
55
|
+
try {
|
|
56
|
+
// Get containers tracked in agent_work (executions)
|
|
57
|
+
const trackedExecutions = this.getTrackedContainers(executionStorage);
|
|
58
|
+
// Get containers from containers table (source of truth for agent names)
|
|
59
|
+
const dbContainers = containerStorage.listContainers({ limit: 50 });
|
|
60
|
+
// Get running docker containers
|
|
61
|
+
const runningContainers = this.getDockerContainers(workspaceInfo.agentsPath, flags.all);
|
|
62
|
+
this.log(`\n${styles.header('Docker Containers')}`);
|
|
63
|
+
this.log('='.repeat(100));
|
|
64
|
+
// Display active executions from database
|
|
65
|
+
const activeExecutions = trackedExecutions.filter(e => e.status === 'running' || e.status === 'starting');
|
|
66
|
+
if (activeExecutions.length > 0) {
|
|
67
|
+
this.log(styles.subheader('\nActive Executions:'));
|
|
68
|
+
this.log(styles.muted(padEnd('ID', 15) +
|
|
69
|
+
padEnd('Agent', 15) +
|
|
70
|
+
padEnd('Ticket', 12) +
|
|
71
|
+
padEnd('Status', 12) +
|
|
72
|
+
'Container'));
|
|
73
|
+
this.log('-'.repeat(80));
|
|
74
|
+
for (const exec of activeExecutions) {
|
|
75
|
+
const statusColor = getStatusColor(exec.status);
|
|
76
|
+
const containerId = exec.containerId ? exec.containerId.substring(0, 12) : styles.muted('none');
|
|
77
|
+
// Check if container is actually running in Docker
|
|
78
|
+
let containerStatus = '';
|
|
79
|
+
if (exec.containerId) {
|
|
80
|
+
const isRunning = runningContainers.some(c => c.id.startsWith(exec.containerId.substring(0, 12)));
|
|
81
|
+
containerStatus = isRunning ? styles.success(' (up)') : styles.warning(' (down)');
|
|
82
|
+
}
|
|
83
|
+
this.log(padEnd(exec.id, 15) +
|
|
84
|
+
padEnd(exec.agentName, 15) +
|
|
85
|
+
padEnd(exec.ticketId, 12) +
|
|
86
|
+
statusColor(padEnd(exec.status, 12)) +
|
|
87
|
+
containerId + containerStatus);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Display containers from DB (with agent names - source of truth)
|
|
91
|
+
const filteredContainers = flags.running
|
|
92
|
+
? runningContainers.filter(c => c.status.includes('Up'))
|
|
93
|
+
: runningContainers;
|
|
94
|
+
if (filteredContainers.length > 0) {
|
|
95
|
+
this.log(styles.subheader('\nDocker Containers' + (flags.all ? ' (all)' : ' (devcontainers)') + ':'));
|
|
96
|
+
this.log(styles.muted(padEnd('Container ID', 15) +
|
|
97
|
+
padEnd('Agent', 15) +
|
|
98
|
+
padEnd('Status', 15) +
|
|
99
|
+
'Uptime'));
|
|
100
|
+
this.log('-'.repeat(70));
|
|
101
|
+
for (const container of filteredContainers) {
|
|
102
|
+
const statusColor = container.status.includes('Up') ? styles.success : styles.muted;
|
|
103
|
+
// Look up agent name from DB (source of truth)
|
|
104
|
+
const dbContainer = dbContainers.find(c => c.dockerId.startsWith(container.id.substring(0, 12)));
|
|
105
|
+
const agentName = dbContainer?.agentName || this.extractAgentFromImage(container.image) || container.name;
|
|
106
|
+
this.log(padEnd(container.id, 15) +
|
|
107
|
+
padEnd(agentName, 15) +
|
|
108
|
+
statusColor(padEnd(container.status, 15)) +
|
|
109
|
+
styles.muted(container.uptime));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else if (!flags.running) {
|
|
113
|
+
this.log(styles.muted('\nNo devcontainer Docker containers found.'));
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
this.log(styles.muted('\nNo running containers found.'));
|
|
117
|
+
}
|
|
118
|
+
this.log(`\n${styles.muted('Commands:')}`);
|
|
119
|
+
this.log(styles.muted(' prlt docker status Check Docker daemon status'));
|
|
120
|
+
this.log(`${styles.muted(' prlt docker clean Remove orphaned containers')}\n`);
|
|
121
|
+
db.close();
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
db.close();
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
getTrackedContainers(executionStorage) {
|
|
129
|
+
// Get executions that used devcontainer environment
|
|
130
|
+
const executions = executionStorage.listExecutions({ limit: 50 });
|
|
131
|
+
return executions.filter(e => e.environment === 'devcontainer' ||
|
|
132
|
+
e.containerId);
|
|
133
|
+
}
|
|
134
|
+
getDockerContainers(agentsPath, showAll) {
|
|
135
|
+
try {
|
|
136
|
+
// Get containers - filter by devcontainer label unless --all
|
|
137
|
+
let cmd = 'docker ps -a --format "{{.ID}}|{{.Names}}|{{.Image}}|{{.Status}}|{{.Label \\"devcontainer.local_folder\\"}}"';
|
|
138
|
+
const output = execSync(cmd, {
|
|
139
|
+
encoding: 'utf-8',
|
|
140
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
141
|
+
}).trim();
|
|
142
|
+
if (!output)
|
|
143
|
+
return [];
|
|
144
|
+
const containers = [];
|
|
145
|
+
const lines = output.split('\n');
|
|
146
|
+
for (const line of lines) {
|
|
147
|
+
const [id, name, image, status, agentDir] = line.split('|');
|
|
148
|
+
// Filter to devcontainers unless --all
|
|
149
|
+
if (!showAll && !agentDir)
|
|
150
|
+
continue;
|
|
151
|
+
// Extract uptime from status
|
|
152
|
+
const uptimeMatch = status.match(/Up (.+)/);
|
|
153
|
+
const uptime = uptimeMatch ? uptimeMatch[1] : '-';
|
|
154
|
+
containers.push({
|
|
155
|
+
id,
|
|
156
|
+
name,
|
|
157
|
+
image,
|
|
158
|
+
status: status.split(' ').slice(0, 2).join(' '),
|
|
159
|
+
agentDir: agentDir || null,
|
|
160
|
+
uptime,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
return containers;
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Extract agent name from devcontainer image name (fallback only)
|
|
171
|
+
*/
|
|
172
|
+
extractAgentFromImage(image) {
|
|
173
|
+
const match = image.match(/^vsc-([^-]+)-/);
|
|
174
|
+
return match ? match[1] : null;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function padEnd(str, length) {
|
|
178
|
+
return str.padEnd(length);
|
|
179
|
+
}
|
|
180
|
+
function truncate(str, maxLength) {
|
|
181
|
+
if (str.length <= maxLength)
|
|
182
|
+
return str;
|
|
183
|
+
return str.substring(0, maxLength - 2) + '..';
|
|
184
|
+
}
|
|
185
|
+
function getStatusColor(status) {
|
|
186
|
+
switch (status) {
|
|
187
|
+
case 'running':
|
|
188
|
+
return styles.success;
|
|
189
|
+
case 'starting':
|
|
190
|
+
return styles.warning;
|
|
191
|
+
case 'completed':
|
|
192
|
+
return styles.muted;
|
|
193
|
+
case 'failed':
|
|
194
|
+
return styles.error;
|
|
195
|
+
case 'stopped':
|
|
196
|
+
return styles.muted;
|
|
197
|
+
default:
|
|
198
|
+
return (s) => s;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class DockerLogs extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
follow: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
tail: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
timestamps: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
};
|
|
10
|
+
static args: {
|
|
11
|
+
target: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
12
|
+
};
|
|
13
|
+
run(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { Args, Command, Flags } from '@oclif/core';
|
|
2
|
+
import { execSync, spawn } from 'child_process';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import Database from 'better-sqlite3';
|
|
5
|
+
import { styles } from '../../lib/styles.js';
|
|
6
|
+
import { getWorkspaceInfo } from '../../lib/agents/commands.js';
|
|
7
|
+
import { ExecutionStorage } from '../../lib/execution/storage.js';
|
|
8
|
+
import { isDockerRunning } from '../../lib/execution/runners.js';
|
|
9
|
+
import { resolveContainerId } from '../../lib/docker/resolve.js';
|
|
10
|
+
export default class DockerLogs extends Command {
|
|
11
|
+
static description = 'View logs from a container (by execution ID, agent name, or container ID)';
|
|
12
|
+
static examples = [
|
|
13
|
+
'<%= config.bin %> <%= command.id %> WORK-001',
|
|
14
|
+
'<%= config.bin %> <%= command.id %> kalanick',
|
|
15
|
+
'<%= config.bin %> <%= command.id %> abc123 --follow',
|
|
16
|
+
'<%= config.bin %> <%= command.id %> WORK-001 --tail 100',
|
|
17
|
+
];
|
|
18
|
+
static flags = {
|
|
19
|
+
follow: Flags.boolean({
|
|
20
|
+
char: 'f',
|
|
21
|
+
description: 'Follow log output',
|
|
22
|
+
default: false,
|
|
23
|
+
}),
|
|
24
|
+
tail: Flags.integer({
|
|
25
|
+
char: 'n',
|
|
26
|
+
description: 'Number of lines to show from the end',
|
|
27
|
+
default: 100,
|
|
28
|
+
}),
|
|
29
|
+
timestamps: Flags.boolean({
|
|
30
|
+
char: 't',
|
|
31
|
+
description: 'Show timestamps',
|
|
32
|
+
default: false,
|
|
33
|
+
}),
|
|
34
|
+
};
|
|
35
|
+
static args = {
|
|
36
|
+
target: Args.string({
|
|
37
|
+
description: 'Execution ID (WORK-XXX), agent name, or container ID',
|
|
38
|
+
required: true,
|
|
39
|
+
}),
|
|
40
|
+
};
|
|
41
|
+
async run() {
|
|
42
|
+
const { args, flags } = await this.parse(DockerLogs);
|
|
43
|
+
if (!isDockerRunning()) {
|
|
44
|
+
this.error('Docker is not running. Start Docker Desktop or the Docker daemon first.');
|
|
45
|
+
}
|
|
46
|
+
// Get workspace info
|
|
47
|
+
let workspaceInfo;
|
|
48
|
+
try {
|
|
49
|
+
workspaceInfo = getWorkspaceInfo();
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
this.error('Not in a workspace. Run "prlt init" first.');
|
|
53
|
+
}
|
|
54
|
+
// Open database
|
|
55
|
+
const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
|
|
56
|
+
let db;
|
|
57
|
+
try {
|
|
58
|
+
db = new Database(dbPath);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
this.error('Could not open workspace database.');
|
|
62
|
+
}
|
|
63
|
+
const executionStorage = new ExecutionStorage(db);
|
|
64
|
+
try {
|
|
65
|
+
const result = resolveContainerId(args.target, executionStorage);
|
|
66
|
+
if (!result.containerId) {
|
|
67
|
+
db.close();
|
|
68
|
+
this.error(result.error || 'Could not find container');
|
|
69
|
+
}
|
|
70
|
+
// Build docker logs command
|
|
71
|
+
const dockerArgs = ['logs'];
|
|
72
|
+
if (flags.follow) {
|
|
73
|
+
dockerArgs.push('--follow');
|
|
74
|
+
}
|
|
75
|
+
if (flags.tail) {
|
|
76
|
+
dockerArgs.push('--tail', String(flags.tail));
|
|
77
|
+
}
|
|
78
|
+
if (flags.timestamps) {
|
|
79
|
+
dockerArgs.push('--timestamps');
|
|
80
|
+
}
|
|
81
|
+
dockerArgs.push(result.containerId);
|
|
82
|
+
this.log(`\n${styles.header(`Logs for ${result.displayName}`)}`);
|
|
83
|
+
this.log(styles.muted(`Container: ${result.containerId}`));
|
|
84
|
+
this.log('─'.repeat(60) + '\n');
|
|
85
|
+
db.close();
|
|
86
|
+
if (flags.follow) {
|
|
87
|
+
// Stream logs
|
|
88
|
+
const proc = spawn('docker', dockerArgs, {
|
|
89
|
+
stdio: 'inherit',
|
|
90
|
+
});
|
|
91
|
+
proc.on('error', (err) => {
|
|
92
|
+
this.error(`Failed to get logs: ${err.message}`);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
// Get logs synchronously
|
|
97
|
+
try {
|
|
98
|
+
const output = execSync(`docker ${dockerArgs.join(' ')}`, {
|
|
99
|
+
encoding: 'utf-8',
|
|
100
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
101
|
+
maxBuffer: 10 * 1024 * 1024, // 10MB buffer
|
|
102
|
+
});
|
|
103
|
+
this.log(output);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
if (error instanceof Error && 'stderr' in error) {
|
|
107
|
+
this.error(`Failed to get logs: ${error.stderr}`);
|
|
108
|
+
}
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
db.close();
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class DockerPrune extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
volumes: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
};
|
|
12
|
+
run(): Promise<void>;
|
|
13
|
+
private showPrunePreview;
|
|
14
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import { execSync } from 'child_process';
|
|
3
|
+
import inquirer from 'inquirer';
|
|
4
|
+
import { styles } from '../../lib/styles.js';
|
|
5
|
+
import { isDockerRunning } from '../../lib/execution/runners.js';
|
|
6
|
+
import { shouldOutputJson, outputPromptAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
|
|
7
|
+
export default class DockerPrune extends Command {
|
|
8
|
+
static description = 'Remove unused Docker resources (containers, images, volumes, networks)';
|
|
9
|
+
static examples = [
|
|
10
|
+
'<%= config.bin %> <%= command.id %>',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> --all',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> --volumes',
|
|
13
|
+
'<%= config.bin %> <%= command.id %> --dry-run',
|
|
14
|
+
];
|
|
15
|
+
static flags = {
|
|
16
|
+
force: Flags.boolean({
|
|
17
|
+
char: 'f',
|
|
18
|
+
aliases: ['yes', 'y'],
|
|
19
|
+
description: 'Skip confirmation prompt',
|
|
20
|
+
default: false,
|
|
21
|
+
}),
|
|
22
|
+
'dry-run': Flags.boolean({
|
|
23
|
+
char: 'd',
|
|
24
|
+
description: 'Show what would be removed without removing',
|
|
25
|
+
default: false,
|
|
26
|
+
}),
|
|
27
|
+
all: Flags.boolean({
|
|
28
|
+
char: 'a',
|
|
29
|
+
description: 'Remove all unused images, not just dangling ones',
|
|
30
|
+
default: false,
|
|
31
|
+
}),
|
|
32
|
+
volumes: Flags.boolean({
|
|
33
|
+
description: 'Also prune volumes (dangerous - data loss possible)',
|
|
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(DockerPrune);
|
|
43
|
+
if (!isDockerRunning()) {
|
|
44
|
+
this.error('Docker is not running. Start Docker Desktop or the Docker daemon first.');
|
|
45
|
+
}
|
|
46
|
+
this.log(`\n${styles.header('Docker Prune')}`);
|
|
47
|
+
this.log('─'.repeat(60));
|
|
48
|
+
// Get current disk usage
|
|
49
|
+
this.log(styles.subheader('\nCurrent Docker disk usage:'));
|
|
50
|
+
try {
|
|
51
|
+
const dfOutput = execSync('docker system df', {
|
|
52
|
+
encoding: 'utf-8',
|
|
53
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
54
|
+
});
|
|
55
|
+
this.log(styles.muted(dfOutput));
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
this.log(styles.muted('Could not get disk usage info'));
|
|
59
|
+
}
|
|
60
|
+
// Show what will be pruned
|
|
61
|
+
this.log(styles.subheader('Will remove:'));
|
|
62
|
+
this.log(styles.muted(' • Stopped containers'));
|
|
63
|
+
this.log(styles.muted(' • Unused networks'));
|
|
64
|
+
if (flags.all) {
|
|
65
|
+
this.log(styles.muted(' • All unused images (not just dangling)'));
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
this.log(styles.muted(' • Dangling images'));
|
|
69
|
+
}
|
|
70
|
+
this.log(styles.muted(' • Build cache'));
|
|
71
|
+
if (flags.volumes) {
|
|
72
|
+
this.log(styles.warning(' • Unused volumes (DATA LOSS POSSIBLE)'));
|
|
73
|
+
}
|
|
74
|
+
if (flags['dry-run']) {
|
|
75
|
+
this.log(`\n${styles.warning('[DRY RUN] Would prune the above resources')}\n`);
|
|
76
|
+
// Show what would be removed
|
|
77
|
+
this.showPrunePreview(flags.all, flags.volumes);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// Confirm
|
|
81
|
+
if (!flags.force) {
|
|
82
|
+
// Check if JSON output mode is active
|
|
83
|
+
const jsonMode = shouldOutputJson(flags);
|
|
84
|
+
// Build choices once, use for both JSON and interactive modes
|
|
85
|
+
const confirmChoices = [
|
|
86
|
+
{ name: 'No', value: 'false' },
|
|
87
|
+
{ name: 'Yes', value: 'true' },
|
|
88
|
+
];
|
|
89
|
+
const confirmMessage = flags.volumes
|
|
90
|
+
? 'This will remove unused resources INCLUDING VOLUMES. Data may be lost. Continue?'
|
|
91
|
+
: 'Remove unused Docker resources?';
|
|
92
|
+
// In JSON mode, output confirmation prompt
|
|
93
|
+
if (jsonMode) {
|
|
94
|
+
outputPromptAsJson(buildPromptConfig('list', 'confirmed', confirmMessage, confirmChoices), createMetadata('docker prune', flags));
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const { confirm } = await inquirer.prompt([
|
|
98
|
+
{
|
|
99
|
+
type: 'confirm',
|
|
100
|
+
name: 'confirm',
|
|
101
|
+
message: confirmMessage,
|
|
102
|
+
default: false,
|
|
103
|
+
},
|
|
104
|
+
]);
|
|
105
|
+
if (!confirm) {
|
|
106
|
+
this.log(`${styles.muted('Aborted.')}\n`);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Run prune
|
|
111
|
+
this.log(`\n${styles.muted('Pruning Docker resources...')}\n`);
|
|
112
|
+
try {
|
|
113
|
+
// Prune containers
|
|
114
|
+
this.log(styles.muted('Removing stopped containers...'));
|
|
115
|
+
const containerResult = execSync('docker container prune -f', {
|
|
116
|
+
encoding: 'utf-8',
|
|
117
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
118
|
+
});
|
|
119
|
+
this.log(styles.muted(containerResult.trim()));
|
|
120
|
+
// Prune networks
|
|
121
|
+
this.log(styles.muted('\nRemoving unused networks...'));
|
|
122
|
+
const networkResult = execSync('docker network prune -f', {
|
|
123
|
+
encoding: 'utf-8',
|
|
124
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
125
|
+
});
|
|
126
|
+
this.log(styles.muted(networkResult.trim()));
|
|
127
|
+
// Prune images
|
|
128
|
+
this.log(styles.muted('\nRemoving unused images...'));
|
|
129
|
+
const imageCmd = flags.all ? 'docker image prune -af' : 'docker image prune -f';
|
|
130
|
+
const imageResult = execSync(imageCmd, {
|
|
131
|
+
encoding: 'utf-8',
|
|
132
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
133
|
+
});
|
|
134
|
+
this.log(styles.muted(imageResult.trim()));
|
|
135
|
+
// Prune build cache
|
|
136
|
+
this.log(styles.muted('\nRemoving build cache...'));
|
|
137
|
+
const buildResult = execSync('docker builder prune -f', {
|
|
138
|
+
encoding: 'utf-8',
|
|
139
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
140
|
+
});
|
|
141
|
+
this.log(styles.muted(buildResult.trim()));
|
|
142
|
+
// Prune volumes if requested
|
|
143
|
+
if (flags.volumes) {
|
|
144
|
+
this.log(styles.warning('\nRemoving unused volumes...'));
|
|
145
|
+
const volumeResult = execSync('docker volume prune -f', {
|
|
146
|
+
encoding: 'utf-8',
|
|
147
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
148
|
+
});
|
|
149
|
+
this.log(styles.muted(volumeResult.trim()));
|
|
150
|
+
}
|
|
151
|
+
this.log(`\n${styles.success('Docker prune completed')}`);
|
|
152
|
+
// Show new disk usage
|
|
153
|
+
this.log(styles.subheader('\nNew Docker disk usage:'));
|
|
154
|
+
const newDfOutput = execSync('docker system df', {
|
|
155
|
+
encoding: 'utf-8',
|
|
156
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
157
|
+
});
|
|
158
|
+
this.log(styles.muted(newDfOutput));
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
this.log(styles.error(`Prune failed: ${error instanceof Error ? error.message : error}`));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
showPrunePreview(includeAllImages, includeVolumes) {
|
|
165
|
+
this.log(styles.subheader('Preview of resources to remove:'));
|
|
166
|
+
this.log('');
|
|
167
|
+
// Stopped containers
|
|
168
|
+
try {
|
|
169
|
+
const containers = execSync('docker ps -aq --filter "status=exited" --filter "status=created"', {
|
|
170
|
+
encoding: 'utf-8',
|
|
171
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
172
|
+
}).trim();
|
|
173
|
+
const containerCount = containers ? containers.split('\n').length : 0;
|
|
174
|
+
this.log(styles.muted(`Containers: ${containerCount} stopped container(s)`));
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
this.log(styles.muted('Containers: Unable to check'));
|
|
178
|
+
}
|
|
179
|
+
// Dangling images
|
|
180
|
+
try {
|
|
181
|
+
const imageCmd = includeAllImages
|
|
182
|
+
? 'docker images -q --filter "dangling=false" | wc -l'
|
|
183
|
+
: 'docker images -q --filter "dangling=true" | wc -l';
|
|
184
|
+
const imageCount = execSync(imageCmd, {
|
|
185
|
+
encoding: 'utf-8',
|
|
186
|
+
shell: '/bin/sh',
|
|
187
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
188
|
+
}).trim();
|
|
189
|
+
const label = includeAllImages ? 'unused image(s)' : 'dangling image(s)';
|
|
190
|
+
this.log(styles.muted(`Images: ${imageCount} ${label}`));
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
this.log(styles.muted('Images: Unable to check'));
|
|
194
|
+
}
|
|
195
|
+
// Volumes
|
|
196
|
+
if (includeVolumes) {
|
|
197
|
+
try {
|
|
198
|
+
const volumes = execSync('docker volume ls -q --filter "dangling=true"', {
|
|
199
|
+
encoding: 'utf-8',
|
|
200
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
201
|
+
}).trim();
|
|
202
|
+
const volumeCount = volumes ? volumes.split('\n').length : 0;
|
|
203
|
+
this.log(styles.warning(`Volumes: ${volumeCount} unused volume(s)`));
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
this.log(styles.muted('Volumes: Unable to check'));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
this.log('');
|
|
210
|
+
}
|
|
211
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class DockerRestart extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
time: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
};
|
|
10
|
+
static args: {
|
|
11
|
+
target: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
12
|
+
};
|
|
13
|
+
run(): Promise<void>;
|
|
14
|
+
}
|