@proletariat/cli 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +512 -253
- package/bin/dev.cmd +3 -0
- package/bin/dev.js +5 -0
- package/bin/run.cmd +3 -0
- package/bin/run.js +23 -0
- package/dist/commands/action/create.d.ts +21 -0
- package/dist/commands/action/create.js +126 -0
- package/dist/commands/action/delete.d.ts +17 -0
- package/dist/commands/action/delete.js +78 -0
- package/dist/commands/action/index.d.ts +15 -0
- package/dist/commands/action/index.js +107 -0
- package/dist/commands/action/list.d.ts +14 -0
- package/dist/commands/action/list.js +89 -0
- package/dist/commands/action/run.d.ts +19 -0
- package/dist/commands/action/run.js +179 -0
- package/dist/commands/action/show.d.ts +15 -0
- package/dist/commands/action/show.js +47 -0
- package/dist/commands/action/update.d.ts +22 -0
- package/dist/commands/action/update.js +168 -0
- package/dist/commands/agent/index.d.ts +13 -0
- package/dist/commands/agent/index.js +131 -0
- package/dist/commands/agent/list.d.ts +7 -0
- package/dist/commands/agent/list.js +126 -0
- package/dist/commands/agent/login.d.ts +16 -0
- package/dist/commands/agent/login.js +146 -0
- package/dist/commands/agent/rebuild.d.ts +18 -0
- package/dist/commands/agent/rebuild.js +133 -0
- package/dist/commands/agent/restart.d.ts +17 -0
- package/dist/commands/agent/restart.js +116 -0
- package/dist/commands/agent/shell.d.ts +23 -0
- package/dist/commands/agent/shell.js +378 -0
- package/dist/commands/agent/staff/add.d.ts +15 -0
- package/dist/commands/agent/staff/add.js +281 -0
- package/dist/commands/agent/staff/index.d.ts +14 -0
- package/dist/commands/agent/staff/index.js +90 -0
- package/dist/commands/agent/staff/list.d.ts +7 -0
- package/dist/commands/agent/staff/list.js +90 -0
- package/dist/commands/agent/staff/remove.d.ts +16 -0
- package/dist/commands/agent/staff/remove.js +137 -0
- package/dist/commands/agent/status.d.ts +17 -0
- package/dist/commands/agent/status.js +139 -0
- package/dist/commands/agent/temp/cleanup.d.ts +23 -0
- package/dist/commands/agent/temp/cleanup.js +388 -0
- package/dist/commands/agent/temp/index.d.ts +14 -0
- package/dist/commands/agent/temp/index.js +82 -0
- package/dist/commands/agent/temp/list.d.ts +7 -0
- package/dist/commands/agent/temp/list.js +108 -0
- package/dist/commands/agent/themes/add-names.d.ts +10 -0
- package/dist/commands/agent/themes/add-names.js +67 -0
- package/dist/commands/agent/themes/create.d.ts +13 -0
- package/dist/commands/agent/themes/create.js +66 -0
- package/dist/commands/agent/themes/index.d.ts +9 -0
- package/dist/commands/agent/themes/index.js +194 -0
- package/dist/commands/agent/themes/list.d.ts +6 -0
- package/dist/commands/agent/themes/list.js +41 -0
- package/dist/commands/agent/themes/set.d.ts +12 -0
- package/dist/commands/agent/themes/set.js +77 -0
- package/dist/commands/agent/visit.d.ts +16 -0
- package/dist/commands/agent/visit.js +88 -0
- package/dist/commands/autocomplete/setup.d.ts +14 -0
- package/dist/commands/autocomplete/setup.js +154 -0
- package/dist/commands/board/index.d.ts +17 -0
- package/dist/commands/board/index.js +255 -0
- package/dist/commands/board/watch.d.ts +13 -0
- package/dist/commands/board/watch.js +52 -0
- package/dist/commands/branch/create.d.ts +50 -0
- package/dist/commands/branch/create.js +624 -0
- package/dist/commands/branch/index.d.ts +13 -0
- package/dist/commands/branch/index.js +50 -0
- package/dist/commands/branch/list.d.ts +17 -0
- package/dist/commands/branch/list.js +120 -0
- package/dist/commands/branch/validate.d.ts +15 -0
- package/dist/commands/branch/validate.js +73 -0
- package/dist/commands/commit.d.ts +71 -0
- package/dist/commands/commit.js +499 -0
- package/dist/commands/docker/clean.d.ts +13 -0
- package/dist/commands/docker/clean.js +224 -0
- package/dist/commands/docker/index.d.ts +19 -0
- package/dist/commands/docker/index.js +274 -0
- package/dist/commands/docker/list.d.ts +16 -0
- package/dist/commands/docker/list.js +200 -0
- package/dist/commands/docker/logs.d.ts +14 -0
- package/dist/commands/docker/logs.js +118 -0
- package/dist/commands/docker/prune.d.ts +14 -0
- package/dist/commands/docker/prune.js +211 -0
- package/dist/commands/docker/restart.d.ts +14 -0
- package/dist/commands/docker/restart.js +129 -0
- package/dist/commands/docker/shell.d.ts +14 -0
- package/dist/commands/docker/shell.js +103 -0
- package/dist/commands/docker/start.d.ts +12 -0
- package/dist/commands/docker/start.js +92 -0
- package/dist/commands/docker/status.d.ts +7 -0
- package/dist/commands/docker/status.js +40 -0
- package/dist/commands/docker/stop.d.ts +14 -0
- package/dist/commands/docker/stop.js +134 -0
- package/dist/commands/docker/sync.d.ts +15 -0
- package/dist/commands/docker/sync.js +112 -0
- package/dist/commands/epic/activate.d.ts +13 -0
- package/dist/commands/epic/activate.js +118 -0
- package/dist/commands/epic/archive.d.ts +14 -0
- package/dist/commands/epic/archive.js +132 -0
- package/dist/commands/epic/create.d.ts +15 -0
- package/dist/commands/epic/create.js +137 -0
- package/dist/commands/epic/index.d.ts +13 -0
- package/dist/commands/epic/index.js +88 -0
- package/dist/commands/epic/link/block.d.ts +14 -0
- package/dist/commands/epic/link/block.js +79 -0
- package/dist/commands/epic/link/duplicates.d.ts +14 -0
- package/dist/commands/epic/link/duplicates.js +66 -0
- package/dist/commands/epic/link/index.d.ts +19 -0
- package/dist/commands/epic/link/index.js +242 -0
- package/dist/commands/epic/link/relates.d.ts +14 -0
- package/dist/commands/epic/link/relates.js +66 -0
- package/dist/commands/epic/link/remove.d.ts +16 -0
- package/dist/commands/epic/link/remove.js +89 -0
- package/dist/commands/epic/list.d.ts +11 -0
- package/dist/commands/epic/list.js +87 -0
- package/dist/commands/epic/move.d.ts +15 -0
- package/dist/commands/epic/move.js +184 -0
- package/dist/commands/epic/progress.d.ts +16 -0
- package/dist/commands/epic/progress.js +166 -0
- package/dist/commands/epic/project.d.ts +15 -0
- package/dist/commands/epic/project.js +219 -0
- package/dist/commands/epic/reorder.d.ts +21 -0
- package/dist/commands/epic/reorder.js +160 -0
- package/dist/commands/epic/spec.d.ts +15 -0
- package/dist/commands/epic/spec.js +191 -0
- package/dist/commands/epic/ticket.d.ts +18 -0
- package/dist/commands/epic/ticket.js +291 -0
- package/dist/commands/epic/view.d.ts +13 -0
- package/dist/commands/epic/view.js +117 -0
- package/dist/commands/execution/index.d.ts +13 -0
- package/dist/commands/execution/index.js +70 -0
- package/dist/commands/execution/list.d.ts +15 -0
- package/dist/commands/execution/list.js +144 -0
- package/dist/commands/execution/logs.d.ts +18 -0
- package/dist/commands/execution/logs.js +161 -0
- package/dist/commands/execution/stop.d.ts +22 -0
- package/dist/commands/execution/stop.js +248 -0
- package/dist/commands/gh/index.d.ts +9 -0
- package/dist/commands/gh/index.js +53 -0
- package/dist/commands/gh/login.d.ts +6 -0
- package/dist/commands/gh/login.js +57 -0
- package/dist/commands/gh/status.d.ts +6 -0
- package/dist/commands/gh/status.js +48 -0
- package/dist/commands/gh/token.d.ts +6 -0
- package/dist/commands/gh/token.js +59 -0
- package/dist/commands/init.d.ts +26 -0
- package/dist/commands/init.js +200 -0
- package/dist/commands/phase/create.d.ts +22 -0
- package/dist/commands/phase/create.js +123 -0
- package/dist/commands/phase/delete.d.ts +17 -0
- package/dist/commands/phase/delete.js +73 -0
- package/dist/commands/phase/list.d.ts +12 -0
- package/dist/commands/phase/list.js +76 -0
- package/dist/commands/phase/move.d.ts +17 -0
- package/dist/commands/phase/move.js +115 -0
- package/dist/commands/phase/template/apply.d.ts +17 -0
- package/dist/commands/phase/template/apply.js +106 -0
- package/dist/commands/phase/template/create.d.ts +16 -0
- package/dist/commands/phase/template/create.js +58 -0
- package/dist/commands/phase/template/delete.d.ts +17 -0
- package/dist/commands/phase/template/delete.js +98 -0
- package/dist/commands/phase/template/index.d.ts +15 -0
- package/dist/commands/phase/template/index.js +128 -0
- package/dist/commands/phase/template/list.d.ts +16 -0
- package/dist/commands/phase/template/list.js +95 -0
- package/dist/commands/phase/template/update.d.ts +17 -0
- package/dist/commands/phase/template/update.js +89 -0
- package/dist/commands/phase/update.d.ts +23 -0
- package/dist/commands/phase/update.js +174 -0
- package/dist/commands/pmo/init.d.ts +25 -0
- package/dist/commands/pmo/init.js +341 -0
- package/dist/commands/pr/create.d.ts +17 -0
- package/dist/commands/pr/create.js +242 -0
- package/dist/commands/pr/index.d.ts +9 -0
- package/dist/commands/pr/index.js +68 -0
- package/dist/commands/pr/link.d.ts +14 -0
- package/dist/commands/pr/link.js +212 -0
- package/dist/commands/pr/status.d.ts +12 -0
- package/dist/commands/pr/status.js +161 -0
- package/dist/commands/project/archive.d.ts +17 -0
- package/dist/commands/project/archive.js +83 -0
- package/dist/commands/project/create.d.ts +22 -0
- package/dist/commands/project/create.js +143 -0
- package/dist/commands/project/delete.d.ts +17 -0
- package/dist/commands/project/delete.js +128 -0
- package/dist/commands/project/index.d.ts +13 -0
- package/dist/commands/project/index.js +64 -0
- package/dist/commands/project/list.d.ts +14 -0
- package/dist/commands/project/list.js +96 -0
- package/dist/commands/project/spec.d.ts +18 -0
- package/dist/commands/project/spec.js +216 -0
- package/dist/commands/project/unarchive.d.ts +15 -0
- package/dist/commands/project/unarchive.js +35 -0
- package/dist/commands/project/view.d.ts +16 -0
- package/dist/commands/project/view.js +94 -0
- package/dist/commands/repo/add.d.ts +21 -0
- package/dist/commands/repo/add.js +118 -0
- package/dist/commands/repo/index.d.ts +13 -0
- package/dist/commands/repo/index.js +114 -0
- package/dist/commands/repo/list.d.ts +13 -0
- package/dist/commands/repo/list.js +96 -0
- package/dist/commands/repo/remove.d.ts +23 -0
- package/dist/commands/repo/remove.js +217 -0
- package/dist/commands/repo/view.d.ts +15 -0
- package/dist/commands/repo/view.js +99 -0
- package/dist/commands/session/attach.d.ts +40 -0
- package/dist/commands/session/attach.js +307 -0
- package/dist/commands/session/index.d.ts +13 -0
- package/dist/commands/session/index.js +64 -0
- package/dist/commands/session/list.d.ts +21 -0
- package/dist/commands/session/list.js +181 -0
- package/dist/commands/spec/create.d.ts +19 -0
- package/dist/commands/spec/create.js +130 -0
- package/dist/commands/spec/index.d.ts +13 -0
- package/dist/commands/spec/index.js +68 -0
- package/dist/commands/spec/link/depends.d.ts +14 -0
- package/dist/commands/spec/link/depends.js +64 -0
- package/dist/commands/spec/link/duplicates.d.ts +14 -0
- package/dist/commands/spec/link/duplicates.js +63 -0
- package/dist/commands/spec/link/index.d.ts +19 -0
- package/dist/commands/spec/link/index.js +200 -0
- package/dist/commands/spec/link/relates.d.ts +14 -0
- package/dist/commands/spec/link/relates.js +63 -0
- package/dist/commands/spec/link/remove.d.ts +16 -0
- package/dist/commands/spec/link/remove.js +94 -0
- package/dist/commands/spec/list.d.ts +12 -0
- package/dist/commands/spec/list.js +75 -0
- package/dist/commands/spec/plan.d.ts +15 -0
- package/dist/commands/spec/plan.js +108 -0
- package/dist/commands/spec/ticket.d.ts +18 -0
- package/dist/commands/spec/ticket.js +160 -0
- package/dist/commands/spec/view.d.ts +15 -0
- package/dist/commands/spec/view.js +163 -0
- package/dist/commands/status/create.d.ts +21 -0
- package/dist/commands/status/create.js +140 -0
- package/dist/commands/status/delete.d.ts +13 -0
- package/dist/commands/status/delete.js +77 -0
- package/dist/commands/status/index.d.ts +14 -0
- package/dist/commands/status/index.js +91 -0
- package/dist/commands/status/list.d.ts +12 -0
- package/dist/commands/status/list.js +93 -0
- package/dist/commands/status/move.d.ts +14 -0
- package/dist/commands/status/move.js +120 -0
- package/dist/commands/status/update.d.ts +20 -0
- package/dist/commands/status/update.js +180 -0
- package/dist/commands/template/delete.d.ts +15 -0
- package/dist/commands/template/delete.js +142 -0
- package/dist/commands/template/index.d.ts +10 -0
- package/dist/commands/template/index.js +64 -0
- package/dist/commands/template/list.d.ts +18 -0
- package/dist/commands/template/list.js +157 -0
- package/dist/commands/template/phase/apply.d.ts +14 -0
- package/dist/commands/template/phase/apply.js +41 -0
- package/dist/commands/template/phase/create.d.ts +12 -0
- package/dist/commands/template/phase/create.js +29 -0
- package/dist/commands/template/phase/delete.d.ts +13 -0
- package/dist/commands/template/phase/delete.js +34 -0
- package/dist/commands/template/phase/index.d.ts +10 -0
- package/dist/commands/template/phase/index.js +62 -0
- package/dist/commands/template/phase/list.d.ts +11 -0
- package/dist/commands/template/phase/list.js +34 -0
- package/dist/commands/template/phase/update.d.ts +13 -0
- package/dist/commands/template/phase/update.js +35 -0
- package/dist/commands/template/ticket/apply.d.ts +17 -0
- package/dist/commands/template/ticket/apply.js +58 -0
- package/dist/commands/template/ticket/delete.d.ts +13 -0
- package/dist/commands/template/ticket/delete.js +34 -0
- package/dist/commands/template/ticket/index.d.ts +10 -0
- package/dist/commands/template/ticket/index.js +62 -0
- package/dist/commands/template/ticket/list.d.ts +11 -0
- package/dist/commands/template/ticket/list.js +34 -0
- package/dist/commands/template/ticket/save.d.ts +13 -0
- package/dist/commands/template/ticket/save.js +35 -0
- package/dist/commands/ticket/bulk.d.ts +13 -0
- package/dist/commands/ticket/bulk.js +145 -0
- package/dist/commands/ticket/complete.d.ts +16 -0
- package/dist/commands/ticket/complete.js +170 -0
- package/dist/commands/ticket/create.d.ts +22 -0
- package/dist/commands/ticket/create.js +390 -0
- package/dist/commands/ticket/delete.d.ts +16 -0
- package/dist/commands/ticket/delete.js +178 -0
- package/dist/commands/ticket/edit.d.ts +27 -0
- package/dist/commands/ticket/edit.js +322 -0
- package/dist/commands/ticket/epic.d.ts +20 -0
- package/dist/commands/ticket/epic.js +333 -0
- package/dist/commands/ticket/index.d.ts +13 -0
- package/dist/commands/ticket/index.js +103 -0
- package/dist/commands/ticket/link/block.d.ts +14 -0
- package/dist/commands/ticket/link/block.js +94 -0
- package/dist/commands/ticket/link/duplicates.d.ts +14 -0
- package/dist/commands/ticket/link/duplicates.js +93 -0
- package/dist/commands/ticket/link/index.d.ts +19 -0
- package/dist/commands/ticket/link/index.js +239 -0
- package/dist/commands/ticket/link/relates.d.ts +14 -0
- package/dist/commands/ticket/link/relates.js +93 -0
- package/dist/commands/ticket/link/remove.d.ts +16 -0
- package/dist/commands/ticket/link/remove.js +128 -0
- package/dist/commands/ticket/list.d.ts +24 -0
- package/dist/commands/ticket/list.js +431 -0
- package/dist/commands/ticket/move.d.ts +18 -0
- package/dist/commands/ticket/move.js +212 -0
- package/dist/commands/ticket/project.d.ts +18 -0
- package/dist/commands/ticket/project.js +254 -0
- package/dist/commands/ticket/reassign.d.ts +19 -0
- package/dist/commands/ticket/reassign.js +279 -0
- package/dist/commands/ticket/spec.d.ts +18 -0
- package/dist/commands/ticket/spec.js +259 -0
- package/dist/commands/ticket/status.d.ts +13 -0
- package/dist/commands/ticket/status.js +87 -0
- package/dist/commands/ticket/template/apply.d.ts +25 -0
- package/dist/commands/ticket/template/apply.js +249 -0
- package/dist/commands/ticket/template/create.d.ts +19 -0
- package/dist/commands/ticket/template/create.js +210 -0
- package/dist/commands/ticket/template/delete.d.ts +17 -0
- package/dist/commands/ticket/template/delete.js +92 -0
- package/dist/commands/ticket/template/index.d.ts +15 -0
- package/dist/commands/ticket/template/index.js +118 -0
- package/dist/commands/ticket/template/list.d.ts +16 -0
- package/dist/commands/ticket/template/list.js +110 -0
- package/dist/commands/ticket/template/save.d.ts +14 -0
- package/dist/commands/ticket/template/save.js +110 -0
- package/dist/commands/ticket/update.d.ts +18 -0
- package/dist/commands/ticket/update.js +325 -0
- package/dist/commands/ticket/view.d.ts +13 -0
- package/dist/commands/ticket/view.js +80 -0
- package/dist/commands/whoami.d.ts +9 -0
- package/dist/commands/whoami.js +103 -0
- package/dist/commands/work/complete.d.ts +13 -0
- package/dist/commands/work/complete.js +121 -0
- package/dist/commands/work/index.d.ts +13 -0
- package/dist/commands/work/index.js +70 -0
- package/dist/commands/work/ready.d.ts +24 -0
- package/dist/commands/work/ready.js +290 -0
- package/dist/commands/work/revise.d.ts +19 -0
- package/dist/commands/work/revise.js +377 -0
- package/dist/commands/work/spawn-all.d.ts +17 -0
- package/dist/commands/work/spawn-all.js +58 -0
- package/dist/commands/work/spawn.d.ts +29 -0
- package/dist/commands/work/spawn.js +728 -0
- package/dist/commands/work/start.d.ts +39 -0
- package/dist/commands/work/start.js +1393 -0
- package/dist/commands/work/watch.d.ts +31 -0
- package/dist/commands/work/watch.js +359 -0
- package/dist/commands/workflow/create.d.ts +18 -0
- package/dist/commands/workflow/create.js +119 -0
- package/dist/commands/workflow/delete.d.ts +17 -0
- package/dist/commands/workflow/delete.js +119 -0
- package/dist/commands/workflow/index.d.ts +15 -0
- package/dist/commands/workflow/index.js +75 -0
- package/dist/commands/workflow/list.d.ts +15 -0
- package/dist/commands/workflow/list.js +75 -0
- package/dist/commands/workflow/switch.d.ts +13 -0
- package/dist/commands/workflow/switch.js +117 -0
- package/dist/commands/workflow/view.d.ts +16 -0
- package/dist/commands/workflow/view.js +114 -0
- package/dist/commands/workspace/add.d.ts +12 -0
- package/dist/commands/workspace/add.js +74 -0
- package/dist/commands/workspace/list.d.ts +9 -0
- package/dist/commands/workspace/list.js +153 -0
- package/dist/commands/workspace/remove.d.ts +13 -0
- package/dist/commands/workspace/remove.js +98 -0
- package/dist/commands/workspace/use.d.ts +12 -0
- package/dist/commands/workspace/use.js +111 -0
- package/dist/hooks/init.d.ts +11 -0
- package/dist/hooks/init.js +57 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/lib/agents/commands.d.ts +189 -0
- package/dist/lib/agents/commands.js +893 -0
- package/dist/lib/agents/index.d.ts +54 -0
- package/dist/lib/agents/index.js +382 -0
- package/dist/lib/branch/index.d.ts +120 -0
- package/dist/lib/branch/index.js +334 -0
- package/dist/lib/colors.d.ts +94 -0
- package/dist/lib/colors.js +68 -0
- package/dist/lib/commands/docker-command.d.ts +21 -0
- package/dist/lib/commands/docker-command.js +27 -0
- package/dist/lib/database/index.d.ts +176 -0
- package/dist/lib/database/index.js +581 -0
- package/dist/lib/docker/resolve.d.ts +38 -0
- package/dist/lib/docker/resolve.js +175 -0
- package/dist/lib/execution/config.d.ts +150 -0
- package/dist/lib/execution/config.js +541 -0
- package/dist/lib/execution/devcontainer.d.ts +85 -0
- package/dist/lib/execution/devcontainer.js +594 -0
- package/dist/lib/execution/index.d.ts +10 -0
- package/dist/lib/execution/index.js +10 -0
- package/dist/lib/execution/runners.d.ts +53 -0
- package/dist/lib/execution/runners.js +1182 -0
- package/dist/lib/execution/spawner.d.ts +85 -0
- package/dist/lib/execution/spawner.js +548 -0
- package/dist/lib/execution/storage.d.ts +159 -0
- package/dist/lib/execution/storage.js +425 -0
- package/dist/lib/execution/types.d.ts +145 -0
- package/dist/lib/execution/types.js +157 -0
- package/dist/lib/init/index.d.ts +75 -0
- package/dist/lib/init/index.js +355 -0
- package/dist/lib/machine-config.d.ts +170 -0
- package/dist/lib/machine-config.js +386 -0
- package/dist/lib/pmo/base-command.d.ts +195 -0
- package/dist/lib/pmo/base-command.js +319 -0
- package/dist/lib/pmo/create-spec-folders.d.ts +43 -0
- package/dist/lib/pmo/create-spec-folders.js +64 -0
- package/dist/lib/pmo/epic-files.d.ts +56 -0
- package/dist/lib/pmo/epic-files.js +195 -0
- package/dist/lib/pmo/find-pmo.d.ts +14 -0
- package/dist/lib/pmo/find-pmo.js +172 -0
- package/dist/lib/pmo/index.d.ts +109 -0
- package/dist/lib/pmo/index.js +501 -0
- package/dist/lib/pmo/markdown.d.ts +31 -0
- package/dist/lib/pmo/markdown.js +245 -0
- package/dist/lib/pmo/pmo-context.d.ts +27 -0
- package/dist/lib/pmo/pmo-context.js +44 -0
- package/dist/lib/pmo/schema.d.ts +82 -0
- package/dist/lib/pmo/schema.js +531 -0
- package/dist/lib/pmo/spec-parser.d.ts +25 -0
- package/dist/lib/pmo/spec-parser.js +205 -0
- package/dist/lib/pmo/spec-types.d.ts +43 -0
- package/dist/lib/pmo/spec-types.js +7 -0
- package/dist/lib/pmo/storage/actions.d.ts +34 -0
- package/dist/lib/pmo/storage/actions.js +177 -0
- package/dist/lib/pmo/storage/base.d.ts +47 -0
- package/dist/lib/pmo/storage/base.js +858 -0
- package/dist/lib/pmo/storage/dependencies.d.ts +61 -0
- package/dist/lib/pmo/storage/dependencies.js +267 -0
- package/dist/lib/pmo/storage/epics.d.ts +46 -0
- package/dist/lib/pmo/storage/epics.js +243 -0
- package/dist/lib/pmo/storage/helpers.d.ts +33 -0
- package/dist/lib/pmo/storage/helpers.js +148 -0
- package/dist/lib/pmo/storage/index.d.ts +186 -0
- package/dist/lib/pmo/storage/index.js +689 -0
- package/dist/lib/pmo/storage/phases.d.ts +65 -0
- package/dist/lib/pmo/storage/phases.js +392 -0
- package/dist/lib/pmo/storage/projects.d.ts +79 -0
- package/dist/lib/pmo/storage/projects.js +303 -0
- package/dist/lib/pmo/storage/specs.d.ts +77 -0
- package/dist/lib/pmo/storage/specs.js +389 -0
- package/dist/lib/pmo/storage/statuses.d.ts +63 -0
- package/dist/lib/pmo/storage/statuses.js +404 -0
- package/dist/lib/pmo/storage/subtasks.d.ts +37 -0
- package/dist/lib/pmo/storage/subtasks.js +184 -0
- package/dist/lib/pmo/storage/templates.d.ts +40 -0
- package/dist/lib/pmo/storage/templates.js +210 -0
- package/dist/lib/pmo/storage/tickets.d.ts +57 -0
- package/dist/lib/pmo/storage/tickets.js +453 -0
- package/dist/lib/pmo/storage/types.d.ts +200 -0
- package/dist/lib/pmo/storage/types.js +5 -0
- package/dist/lib/pmo/storage/views.d.ts +44 -0
- package/dist/lib/pmo/storage/views.js +355 -0
- package/dist/lib/pmo/storage-sqlite.d.ts +7 -0
- package/dist/lib/pmo/storage-sqlite.js +7 -0
- package/dist/lib/pmo/sync-manager.d.ts +92 -0
- package/dist/lib/pmo/sync-manager.js +229 -0
- package/dist/lib/pmo/types.d.ts +710 -0
- package/dist/lib/pmo/types.js +108 -0
- package/dist/lib/pmo/utils.d.ts +122 -0
- package/dist/lib/pmo/utils.js +174 -0
- package/dist/lib/pmo/watcher.d.ts +43 -0
- package/dist/lib/pmo/watcher.js +208 -0
- package/dist/lib/pr/index.d.ts +150 -0
- package/dist/lib/pr/index.js +483 -0
- package/dist/lib/prompt-json.d.ts +231 -0
- package/dist/lib/prompt-json.js +213 -0
- package/dist/lib/repos/index.d.ts +81 -0
- package/dist/lib/repos/index.js +679 -0
- package/dist/lib/styles.d.ts +98 -0
- package/dist/lib/styles.js +195 -0
- package/dist/lib/themes.d.ts +128 -0
- package/dist/lib/themes.js +301 -0
- package/dist/lib/ui/BoardUI.d.ts +21 -0
- package/dist/lib/ui/BoardUI.js +85 -0
- package/dist/lib/ui/ClaimTicketUI.d.ts +17 -0
- package/dist/lib/ui/ClaimTicketUI.js +64 -0
- package/dist/lib/ui/CreateTicketUI.d.ts +13 -0
- package/dist/lib/ui/CreateTicketUI.js +101 -0
- package/dist/lib/workspace.d.ts +66 -0
- package/dist/lib/workspace.js +204 -0
- package/oclif.manifest.json +10593 -0
- package/package.json +103 -56
- package/LICENSE +0 -21
- package/dist/bin/prlt.d.ts +0 -11
- package/dist/bin/prlt.d.ts.map +0 -1
- package/dist/bin/prlt.js +0 -144
- package/dist/bin/prlt.js.map +0 -1
- package/dist/lib/config/index.d.ts +0 -14
- package/dist/lib/config/index.d.ts.map +0 -1
- package/dist/lib/config/index.js +0 -142
- package/dist/lib/config/index.js.map +0 -1
- package/dist/lib/config/upgrade.d.ts +0 -2
- package/dist/lib/config/upgrade.d.ts.map +0 -1
- package/dist/lib/config/upgrade.js +0 -248
- package/dist/lib/config/upgrade.js.map +0 -1
- package/dist/lib/themes/index.d.ts +0 -8
- package/dist/lib/themes/index.d.ts.map +0 -1
- package/dist/lib/themes/index.js +0 -80
- package/dist/lib/themes/index.js.map +0 -1
- package/dist/lib/utils/helpers.d.ts +0 -4
- package/dist/lib/utils/helpers.d.ts.map +0 -1
- package/dist/lib/utils/helpers.js +0 -39
- package/dist/lib/utils/helpers.js.map +0 -1
- package/dist/lib/utils/logger.d.ts +0 -4
- package/dist/lib/utils/logger.d.ts.map +0 -1
- package/dist/lib/utils/logger.js +0 -28
- package/dist/lib/utils/logger.js.map +0 -1
- package/dist/lib/workspace/index.d.ts +0 -13
- package/dist/lib/workspace/index.d.ts.map +0 -1
- package/dist/lib/workspace/index.js +0 -116
- package/dist/lib/workspace/index.js.map +0 -1
- package/dist/lib/worktree/index.d.ts +0 -7
- package/dist/lib/worktree/index.d.ts.map +0 -1
- package/dist/lib/worktree/index.js +0 -362
- package/dist/lib/worktree/index.js.map +0 -1
- package/dist/lib/worktree/migrate.d.ts +0 -2
- package/dist/lib/worktree/migrate.d.ts.map +0 -1
- package/dist/lib/worktree/migrate.js +0 -214
- package/dist/lib/worktree/migrate.js.map +0 -1
- package/dist/lib/worktree/repair.d.ts +0 -3
- package/dist/lib/worktree/repair.d.ts.map +0 -1
- package/dist/lib/worktree/repair.js +0 -320
- package/dist/lib/worktree/repair.js.map +0 -1
- package/dist/types/index.d.ts +0 -57
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -3
- package/dist/types/index.js.map +0 -1
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { colors, format } from '../../../lib/colors.js';
|
|
4
|
+
import { getWorkspaceInfo, cleanupAgent, getCleanableAgents, getAgentTmuxSessions } from '../../../lib/agents/commands.js';
|
|
5
|
+
import { PMOCommand, pmoBaseFlags } from '../../../lib/pmo/index.js';
|
|
6
|
+
import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, outputSuccessAsJson, createMetadata, buildPromptConfig, } from '../../../lib/prompt-json.js';
|
|
7
|
+
export default class Cleanup extends PMOCommand {
|
|
8
|
+
static description = 'Clean up agent resources (containers, directories, tmux sessions)';
|
|
9
|
+
static examples = [
|
|
10
|
+
'<%= config.bin %> <%= command.id %> bold-bezos-1',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> --temp',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> --temp --dry-run',
|
|
13
|
+
'<%= config.bin %> <%= command.id %> --all',
|
|
14
|
+
'<%= config.bin %> <%= command.id %> --json',
|
|
15
|
+
];
|
|
16
|
+
static args = {
|
|
17
|
+
name: Args.string({
|
|
18
|
+
description: 'Agent name to clean up',
|
|
19
|
+
required: false,
|
|
20
|
+
}),
|
|
21
|
+
};
|
|
22
|
+
static flags = {
|
|
23
|
+
...pmoBaseFlags,
|
|
24
|
+
temp: Flags.boolean({
|
|
25
|
+
description: 'Clean up all ephemeral agents with no running work',
|
|
26
|
+
default: false,
|
|
27
|
+
}),
|
|
28
|
+
all: Flags.boolean({
|
|
29
|
+
description: 'Clean up ALL ephemeral agents (including those with running work)',
|
|
30
|
+
default: false,
|
|
31
|
+
}),
|
|
32
|
+
'dry-run': Flags.boolean({
|
|
33
|
+
description: 'Show what would be cleaned without actually doing it',
|
|
34
|
+
default: false,
|
|
35
|
+
}),
|
|
36
|
+
yes: Flags.boolean({
|
|
37
|
+
char: 'y',
|
|
38
|
+
description: 'Skip confirmation prompt',
|
|
39
|
+
default: false,
|
|
40
|
+
}),
|
|
41
|
+
force: Flags.boolean({
|
|
42
|
+
char: 'f',
|
|
43
|
+
description: 'Force cleanup even if there is uncommitted/unpushed work',
|
|
44
|
+
default: false,
|
|
45
|
+
}),
|
|
46
|
+
push: Flags.boolean({
|
|
47
|
+
description: 'Push unpushed commits before cleanup',
|
|
48
|
+
default: false,
|
|
49
|
+
}),
|
|
50
|
+
json: Flags.boolean({
|
|
51
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
52
|
+
default: false,
|
|
53
|
+
}),
|
|
54
|
+
'no-interactive': Flags.boolean({
|
|
55
|
+
description: 'Alias for --json flag',
|
|
56
|
+
default: false,
|
|
57
|
+
}),
|
|
58
|
+
};
|
|
59
|
+
getPMOOptions() {
|
|
60
|
+
return { promptIfMultiple: false };
|
|
61
|
+
}
|
|
62
|
+
async execute() {
|
|
63
|
+
const { args, flags } = await this.parse(Cleanup);
|
|
64
|
+
// Check if JSON output mode is active
|
|
65
|
+
const jsonMode = shouldOutputJson(flags);
|
|
66
|
+
// Helper to handle errors in JSON mode
|
|
67
|
+
const handleError = (code, message) => {
|
|
68
|
+
if (jsonMode) {
|
|
69
|
+
outputErrorAsJson(code, message, createMetadata('agent cleanup', flags));
|
|
70
|
+
this.exit(1);
|
|
71
|
+
}
|
|
72
|
+
this.error(message);
|
|
73
|
+
};
|
|
74
|
+
// Get workspace information
|
|
75
|
+
const workspaceInfo = getWorkspaceInfo();
|
|
76
|
+
const dryRun = flags['dry-run'];
|
|
77
|
+
const skipConfirm = flags.yes;
|
|
78
|
+
const forceCleanup = flags.force;
|
|
79
|
+
const pushFirst = flags.push;
|
|
80
|
+
// Determine which agents to clean up
|
|
81
|
+
let agentsToCleanup = [];
|
|
82
|
+
if (args.name) {
|
|
83
|
+
// Single agent specified
|
|
84
|
+
const agent = workspaceInfo.agents.find(a => a.name === args.name);
|
|
85
|
+
if (!agent) {
|
|
86
|
+
return handleError('AGENT_NOT_FOUND', `Agent "${args.name}" not found.`);
|
|
87
|
+
}
|
|
88
|
+
if (agent.status === 'cleaned') {
|
|
89
|
+
if (jsonMode) {
|
|
90
|
+
outputErrorAsJson('ALREADY_CLEANED', `Agent "${args.name}" has already been cleaned up.`, createMetadata('agent cleanup', flags));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
this.log(colors.warning(`Agent "${args.name}" has already been cleaned up.`));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
agentsToCleanup = [args.name];
|
|
97
|
+
}
|
|
98
|
+
else if (flags.all) {
|
|
99
|
+
// All ephemeral agents (even running ones)
|
|
100
|
+
const allEphemeral = workspaceInfo.agents.filter(a => a.type === 'ephemeral' && a.status === 'active');
|
|
101
|
+
if (allEphemeral.length === 0) {
|
|
102
|
+
if (jsonMode) {
|
|
103
|
+
outputErrorAsJson('NO_AGENTS', 'No ephemeral agents to clean up.', createMetadata('agent cleanup', flags));
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
this.log(colors.textMuted('No ephemeral agents to clean up.'));
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
agentsToCleanup = allEphemeral.map(a => a.name);
|
|
110
|
+
}
|
|
111
|
+
else if (flags.temp) {
|
|
112
|
+
// Only ephemeral agents with no running work
|
|
113
|
+
const cleanable = getCleanableAgents(workspaceInfo, true);
|
|
114
|
+
if (cleanable.length === 0) {
|
|
115
|
+
if (jsonMode) {
|
|
116
|
+
outputErrorAsJson('NO_AGENTS', 'No ephemeral agents available for cleanup (all may have running work).', createMetadata('agent cleanup', flags));
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
this.log(colors.textMuted('No ephemeral agents available for cleanup (all may have running work).'));
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
agentsToCleanup = cleanable.map(a => a.name);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// Interactive mode - show list of cleanable agents
|
|
126
|
+
const allAgents = workspaceInfo.agents.filter(a => a.status === 'active');
|
|
127
|
+
if (allAgents.length === 0) {
|
|
128
|
+
if (jsonMode) {
|
|
129
|
+
outputErrorAsJson('NO_AGENTS', 'No agents to clean up.', createMetadata('agent cleanup', flags));
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
this.log(colors.textMuted('No agents to clean up.'));
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
// Separate temp and staff agents
|
|
136
|
+
const tempAgents = allAgents.filter(a => a.type === 'ephemeral');
|
|
137
|
+
const staffAgents = allAgents.filter(a => a.type !== 'ephemeral');
|
|
138
|
+
// Build choices with separators
|
|
139
|
+
const choices = [];
|
|
140
|
+
// Add "All temp agents" option if there are temp agents
|
|
141
|
+
if (tempAgents.length > 0) {
|
|
142
|
+
const cleanableTempAgents = tempAgents.filter(a => {
|
|
143
|
+
const sessions = getAgentTmuxSessions(a.name);
|
|
144
|
+
return sessions.length === 0;
|
|
145
|
+
});
|
|
146
|
+
if (cleanableTempAgents.length > 0) {
|
|
147
|
+
choices.push({ name: `🧹 All temp agents (${cleanableTempAgents.length} cleanable)`, value: '__all_temp__' });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
choices.push(new inquirer.Separator('── Cancel ──'));
|
|
151
|
+
choices.push({ name: '✗ Cancel', value: '__cancel__' });
|
|
152
|
+
// Add temp agents
|
|
153
|
+
if (tempAgents.length > 0) {
|
|
154
|
+
choices.push(new inquirer.Separator(`── Temp Agents (${tempAgents.length}) ──`));
|
|
155
|
+
for (const agent of tempAgents) {
|
|
156
|
+
const sessions = getAgentTmuxSessions(agent.name);
|
|
157
|
+
const hasRunningWork = sessions.length > 0;
|
|
158
|
+
const statusLabel = hasRunningWork ? ' (running)' : '';
|
|
159
|
+
choices.push({
|
|
160
|
+
name: `${agent.name}${statusLabel}`,
|
|
161
|
+
value: agent.name,
|
|
162
|
+
disabled: hasRunningWork ? 'has running work' : false,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Add staff agents
|
|
167
|
+
if (staffAgents.length > 0) {
|
|
168
|
+
choices.push(new inquirer.Separator(`── Staff Agents (${staffAgents.length}) ──`));
|
|
169
|
+
for (const agent of staffAgents) {
|
|
170
|
+
const sessions = getAgentTmuxSessions(agent.name);
|
|
171
|
+
const hasRunningWork = sessions.length > 0;
|
|
172
|
+
const statusLabel = hasRunningWork ? ' (running)' : '';
|
|
173
|
+
choices.push({
|
|
174
|
+
name: `${agent.name}${statusLabel}`,
|
|
175
|
+
value: agent.name,
|
|
176
|
+
disabled: hasRunningWork ? 'has running work' : false,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
const selectMessage = 'Select agents to clean up:';
|
|
181
|
+
// In JSON mode, output agent selection prompt
|
|
182
|
+
if (jsonMode) {
|
|
183
|
+
outputPromptAsJson(buildPromptConfig('checkbox', 'agents', selectMessage, choices), createMetadata('agent cleanup', flags));
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const { selected } = await inquirer.prompt([
|
|
187
|
+
{
|
|
188
|
+
type: 'checkbox',
|
|
189
|
+
name: 'selected',
|
|
190
|
+
message: selectMessage,
|
|
191
|
+
choices,
|
|
192
|
+
},
|
|
193
|
+
]);
|
|
194
|
+
if (selected.length === 0 || selected.includes('__cancel__')) {
|
|
195
|
+
this.log(colors.textMuted('Operation cancelled.'));
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
// Handle "All temp agents" selection
|
|
199
|
+
if (selected.includes('__all_temp__')) {
|
|
200
|
+
const cleanableTempAgents = tempAgents.filter(a => {
|
|
201
|
+
const sessions = getAgentTmuxSessions(a.name);
|
|
202
|
+
return sessions.length === 0;
|
|
203
|
+
});
|
|
204
|
+
agentsToCleanup = cleanableTempAgents.map(a => a.name);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
agentsToCleanup = selected.filter((s) => !s.startsWith('__'));
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (agentsToCleanup.length === 0) {
|
|
211
|
+
if (jsonMode) {
|
|
212
|
+
outputErrorAsJson('NO_SELECTION', 'No agents selected for cleanup.', createMetadata('agent cleanup', flags));
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
this.log(colors.textMuted('No agents selected for cleanup.'));
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
// Build confirmation choices
|
|
219
|
+
const confirmChoices = [
|
|
220
|
+
{ name: 'No, cancel', value: 'false' },
|
|
221
|
+
{ name: 'Yes, clean up', value: 'true' },
|
|
222
|
+
];
|
|
223
|
+
const confirmMessage = `Clean up ${agentsToCleanup.length} agent(s)? This will remove directories, containers, and tmux sessions.`;
|
|
224
|
+
// Confirm unless --yes or dry-run
|
|
225
|
+
if (!skipConfirm && !dryRun) {
|
|
226
|
+
// In JSON mode, output confirmation prompt with context
|
|
227
|
+
if (jsonMode) {
|
|
228
|
+
const promptConfig = buildPromptConfig('list', 'confirmed', confirmMessage, confirmChoices);
|
|
229
|
+
// Add context about what will be cleaned
|
|
230
|
+
promptConfig.context = { agentsToCleanup };
|
|
231
|
+
outputPromptAsJson(promptConfig, createMetadata('agent cleanup', flags));
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
// Show what will be cleaned
|
|
235
|
+
this.log(colors.primary(`\nAgents to clean up:`));
|
|
236
|
+
for (const name of agentsToCleanup) {
|
|
237
|
+
const agent = workspaceInfo.agents.find(a => a.name === name);
|
|
238
|
+
const typeLabel = agent?.type === 'ephemeral' ? '[temp]' : '[staff]';
|
|
239
|
+
this.log(` - ${name} ${typeLabel}`);
|
|
240
|
+
}
|
|
241
|
+
this.log('');
|
|
242
|
+
const { confirm } = await inquirer.prompt([
|
|
243
|
+
{
|
|
244
|
+
type: 'list',
|
|
245
|
+
name: 'confirm',
|
|
246
|
+
message: confirmMessage,
|
|
247
|
+
choices: [
|
|
248
|
+
{ name: '❌ No, cancel', value: false },
|
|
249
|
+
{ name: '✓ Yes, clean up', value: true },
|
|
250
|
+
],
|
|
251
|
+
default: 0,
|
|
252
|
+
},
|
|
253
|
+
]);
|
|
254
|
+
if (!confirm) {
|
|
255
|
+
this.log(colors.textMuted('Operation cancelled.'));
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
else if (!jsonMode) {
|
|
260
|
+
// Show what will be cleaned (for dry-run or force mode)
|
|
261
|
+
this.log(colors.primary(`\n${dryRun ? '[DRY RUN] ' : ''}Agents to clean up:`));
|
|
262
|
+
for (const name of agentsToCleanup) {
|
|
263
|
+
const agent = workspaceInfo.agents.find(a => a.name === name);
|
|
264
|
+
const typeLabel = agent?.type === 'ephemeral' ? '[temp]' : '[staff]';
|
|
265
|
+
this.log(` - ${name} ${typeLabel}`);
|
|
266
|
+
}
|
|
267
|
+
this.log('');
|
|
268
|
+
}
|
|
269
|
+
// Perform cleanup
|
|
270
|
+
const results = [];
|
|
271
|
+
for (const agentName of agentsToCleanup) {
|
|
272
|
+
if (!jsonMode) {
|
|
273
|
+
this.log(colors.primary(`\nCleaning up: ${agentName}`));
|
|
274
|
+
}
|
|
275
|
+
const result = await cleanupAgent(workspaceInfo, agentName, {
|
|
276
|
+
log: jsonMode ? undefined : (msg) => this.log(colors.textMuted(` ${msg}`)),
|
|
277
|
+
dryRun,
|
|
278
|
+
force: forceCleanup,
|
|
279
|
+
pushFirst,
|
|
280
|
+
});
|
|
281
|
+
// Handle blocked by git status - offer interactive options
|
|
282
|
+
if (result.blockedByGit && !jsonMode && !forceCleanup && !pushFirst) {
|
|
283
|
+
this.log(colors.warning(`\n⚠️ Agent "${agentName}" has unsaved work:`));
|
|
284
|
+
// Determine what kind of unsaved work exists
|
|
285
|
+
let hasUncommitted = false;
|
|
286
|
+
let hasUnpushed = false;
|
|
287
|
+
if (result.gitStatus) {
|
|
288
|
+
for (const wt of result.gitStatus.worktrees) {
|
|
289
|
+
if (wt.hasUncommittedChanges) {
|
|
290
|
+
hasUncommitted = true;
|
|
291
|
+
this.log(colors.textMuted(` ${wt.repoName}: ${wt.uncommittedFiles.length} uncommitted file(s)`));
|
|
292
|
+
}
|
|
293
|
+
if (wt.hasUnpushedCommits) {
|
|
294
|
+
hasUnpushed = true;
|
|
295
|
+
this.log(colors.textMuted(` ${wt.repoName}: ${wt.unpushedCount} unpushed commit(s) on ${wt.branch}`));
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// Build choices based on what's unsaved
|
|
300
|
+
const choices = [];
|
|
301
|
+
if (hasUncommitted && hasUnpushed) {
|
|
302
|
+
// Both uncommitted and unpushed - will commit all and push
|
|
303
|
+
choices.push({ name: '💾 Commit all changes, push, and cleanup', value: 'push' });
|
|
304
|
+
}
|
|
305
|
+
else if (hasUncommitted) {
|
|
306
|
+
// Only uncommitted - will commit and push
|
|
307
|
+
choices.push({ name: '💾 Commit changes, push, and cleanup', value: 'push' });
|
|
308
|
+
}
|
|
309
|
+
else if (hasUnpushed) {
|
|
310
|
+
// Only unpushed commits - just push
|
|
311
|
+
choices.push({ name: '⬆️ Push commits and cleanup', value: 'push' });
|
|
312
|
+
}
|
|
313
|
+
choices.push({ name: '🗑️ Force cleanup (discard all changes)', value: 'force' });
|
|
314
|
+
choices.push({ name: '⏭️ Skip this agent', value: 'skip' });
|
|
315
|
+
// In interactive mode, prompt for action
|
|
316
|
+
const { action } = await inquirer.prompt([
|
|
317
|
+
{
|
|
318
|
+
type: 'list',
|
|
319
|
+
name: 'action',
|
|
320
|
+
message: `What would you like to do with ${agentName}?`,
|
|
321
|
+
choices,
|
|
322
|
+
},
|
|
323
|
+
]);
|
|
324
|
+
if (action === 'skip') {
|
|
325
|
+
this.log(colors.textMuted(` Skipping ${agentName}`));
|
|
326
|
+
results.push(result);
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
// Re-run cleanup with the selected option
|
|
330
|
+
const retryResult = await cleanupAgent(workspaceInfo, agentName, {
|
|
331
|
+
log: (msg) => this.log(colors.textMuted(` ${msg}`)),
|
|
332
|
+
dryRun,
|
|
333
|
+
force: action === 'force',
|
|
334
|
+
pushFirst: action === 'push',
|
|
335
|
+
});
|
|
336
|
+
results.push(retryResult);
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
results.push(result);
|
|
340
|
+
}
|
|
341
|
+
// JSON mode: output results
|
|
342
|
+
if (jsonMode) {
|
|
343
|
+
outputSuccessAsJson({
|
|
344
|
+
message: `${dryRun ? 'Would clean' : 'Cleaned'} ${results.filter(r => r.success).length} agent(s)`,
|
|
345
|
+
dryRun,
|
|
346
|
+
cleaned: results.filter(r => r.success).map(r => r.agent),
|
|
347
|
+
failed: results.filter(r => !r.success).map(r => r.agent),
|
|
348
|
+
details: results.map(r => ({
|
|
349
|
+
agent: r.agent,
|
|
350
|
+
success: r.success,
|
|
351
|
+
tmuxSessionsKilled: r.tmuxSessionsKilled,
|
|
352
|
+
containersRemoved: r.containersRemoved,
|
|
353
|
+
directoriesRemoved: r.directoriesRemoved,
|
|
354
|
+
errors: r.errors,
|
|
355
|
+
})),
|
|
356
|
+
}, createMetadata('agent cleanup', flags));
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
// Summary
|
|
360
|
+
this.log(colors.primary('\n--- Summary ---'));
|
|
361
|
+
const successful = results.filter(r => r.success);
|
|
362
|
+
const failed = results.filter(r => !r.success);
|
|
363
|
+
if (successful.length > 0) {
|
|
364
|
+
this.log(format.success(`${dryRun ? 'Would clean' : 'Cleaned'} ${successful.length} agent(s): ${successful.map(r => r.agent).join(', ')}`));
|
|
365
|
+
}
|
|
366
|
+
if (failed.length > 0) {
|
|
367
|
+
this.log(format.error(`Failed to clean ${failed.length} agent(s): ${failed.map(r => r.agent).join(', ')}`));
|
|
368
|
+
for (const result of failed) {
|
|
369
|
+
for (const error of result.errors) {
|
|
370
|
+
this.log(colors.warning(` - ${result.agent}: ${error}`));
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// Total resources cleaned
|
|
375
|
+
const totalTmux = results.reduce((sum, r) => sum + r.tmuxSessionsKilled.length, 0);
|
|
376
|
+
const totalContainers = results.reduce((sum, r) => sum + r.containersRemoved.length, 0);
|
|
377
|
+
const totalDirs = results.reduce((sum, r) => sum + r.directoriesRemoved.length, 0);
|
|
378
|
+
if (totalTmux > 0 || totalContainers > 0 || totalDirs > 0) {
|
|
379
|
+
this.log(colors.textMuted(`\nResources ${dryRun ? 'that would be ' : ''}cleaned:`));
|
|
380
|
+
if (totalTmux > 0)
|
|
381
|
+
this.log(colors.textMuted(` - Tmux sessions: ${totalTmux}`));
|
|
382
|
+
if (totalContainers > 0)
|
|
383
|
+
this.log(colors.textMuted(` - Containers: ${totalContainers}`));
|
|
384
|
+
if (totalDirs > 0)
|
|
385
|
+
this.log(colors.textMuted(` - Directories: ${totalDirs}`));
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PMOCommand } from '../../../lib/pmo/index.js';
|
|
2
|
+
export default class Temp extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
'no-interactive': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
};
|
|
10
|
+
protected getPMOOptions(): {
|
|
11
|
+
promptIfMultiple: boolean;
|
|
12
|
+
};
|
|
13
|
+
execute(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { colors } from '../../../lib/colors.js';
|
|
4
|
+
import { PMOCommand, pmoBaseFlags } from '../../../lib/pmo/index.js';
|
|
5
|
+
import { shouldOutputJson, outputPromptAsJson, createMetadata, buildPromptConfig, } from '../../../lib/prompt-json.js';
|
|
6
|
+
export default class Temp extends PMOCommand {
|
|
7
|
+
static description = 'Manage temporary (ephemeral) agents';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %> list',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> cleanup --temp',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> cleanup bold-bezos-1',
|
|
12
|
+
];
|
|
13
|
+
static flags = {
|
|
14
|
+
...pmoBaseFlags,
|
|
15
|
+
json: Flags.boolean({
|
|
16
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
17
|
+
default: false,
|
|
18
|
+
}),
|
|
19
|
+
'no-interactive': Flags.boolean({
|
|
20
|
+
description: 'Alias for --json flag',
|
|
21
|
+
default: false,
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
getPMOOptions() {
|
|
25
|
+
return { promptIfMultiple: false };
|
|
26
|
+
}
|
|
27
|
+
async execute() {
|
|
28
|
+
const { flags } = await this.parse(Temp);
|
|
29
|
+
// Check if JSON output mode is active
|
|
30
|
+
const jsonMode = shouldOutputJson(flags);
|
|
31
|
+
// Define choices once, use for both JSON and interactive modes
|
|
32
|
+
const menuChoices = [
|
|
33
|
+
{ name: 'List temp agents', value: 'list' },
|
|
34
|
+
{ name: 'Clean up temp agents', value: 'cleanup' },
|
|
35
|
+
{ name: 'Cancel', value: 'cancel' },
|
|
36
|
+
];
|
|
37
|
+
const message = 'What would you like to do?';
|
|
38
|
+
// In JSON mode, output menu prompt
|
|
39
|
+
if (jsonMode) {
|
|
40
|
+
outputPromptAsJson(buildPromptConfig('list', 'action', message, menuChoices), createMetadata('agent temp', flags));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
this.log(colors.primary('Temporary Agents'));
|
|
44
|
+
this.log(colors.textMuted('Ephemeral agents created by "prlt work spawn".\n'));
|
|
45
|
+
const { action } = await inquirer.prompt([{
|
|
46
|
+
type: 'list',
|
|
47
|
+
name: 'action',
|
|
48
|
+
message,
|
|
49
|
+
choices: [
|
|
50
|
+
{ name: '📋 ' + menuChoices[0].name, value: menuChoices[0].value },
|
|
51
|
+
{ name: '🧹 ' + menuChoices[1].name, value: menuChoices[1].value },
|
|
52
|
+
new inquirer.Separator(),
|
|
53
|
+
{ name: '❌ ' + menuChoices[2].name, value: menuChoices[2].value },
|
|
54
|
+
]
|
|
55
|
+
}]);
|
|
56
|
+
if (action === 'cancel') {
|
|
57
|
+
this.log(colors.textMuted('Operation cancelled.'));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
switch (action) {
|
|
62
|
+
case 'list': {
|
|
63
|
+
const { default: ListCommand } = await import('./list.js');
|
|
64
|
+
const cmd = new ListCommand([], this.config);
|
|
65
|
+
await cmd.run();
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
case 'cleanup': {
|
|
69
|
+
const { default: CleanupCommand } = await import('./cleanup.js');
|
|
70
|
+
const cmd = new CleanupCommand([], this.config);
|
|
71
|
+
await cmd.run();
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
default:
|
|
75
|
+
this.error(`Unknown action: ${action}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
this.error(`Failed to execute temp ${action}: ${error instanceof Error ? error.message : String(error)}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import { getWorkspaceInfo, getAllAgentsStatus, getAgentTmuxSessions } from '../../../lib/agents/commands.js';
|
|
6
|
+
export default class List extends Command {
|
|
7
|
+
static description = 'List all temporary (ephemeral) agents and their status';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %>',
|
|
10
|
+
];
|
|
11
|
+
static flags = {};
|
|
12
|
+
async run() {
|
|
13
|
+
try {
|
|
14
|
+
// Get workspace information
|
|
15
|
+
const workspaceInfo = getWorkspaceInfo();
|
|
16
|
+
// Filter to ephemeral agents only
|
|
17
|
+
const ephemeralAgents = workspaceInfo.agents.filter(a => a.type === 'ephemeral');
|
|
18
|
+
if (ephemeralAgents.length === 0) {
|
|
19
|
+
this.log(chalk.yellow('No temporary agents found. Create them with "prlt work spawn"'));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
// Separate active and cleaned agents
|
|
23
|
+
const activeAgents = ephemeralAgents.filter(a => a.status === 'active');
|
|
24
|
+
const cleanedAgents = ephemeralAgents.filter(a => a.status === 'cleaned');
|
|
25
|
+
// Get status for all agents
|
|
26
|
+
const agentsStatus = getAllAgentsStatus(workspaceInfo);
|
|
27
|
+
// Active agents
|
|
28
|
+
if (activeAgents.length > 0) {
|
|
29
|
+
this.log(chalk.bold.cyan('\n Active Temporary Agents:\n'));
|
|
30
|
+
const activeStatus = agentsStatus.filter(a => activeAgents.some(s => s.name === a.name));
|
|
31
|
+
for (const agentStatus of activeStatus) {
|
|
32
|
+
// Check for running tmux sessions
|
|
33
|
+
const sessions = getAgentTmuxSessions(agentStatus.name);
|
|
34
|
+
const hasRunningWork = sessions.length > 0;
|
|
35
|
+
// Agent info line
|
|
36
|
+
const statusIcon = hasRunningWork ? '🟡' : (agentStatus.exists ? '🟢' : '🔴');
|
|
37
|
+
const runningLabel = hasRunningWork ? chalk.yellow(' (running)') : '';
|
|
38
|
+
const status = agentStatus.exists ? chalk.green('Active') : chalk.red('Missing');
|
|
39
|
+
this.log(`${statusIcon} ${chalk.bold(agentStatus.name)} - ${status}${runningLabel}`);
|
|
40
|
+
if (agentStatus.exists) {
|
|
41
|
+
// Show branch info
|
|
42
|
+
if (agentStatus.branch) {
|
|
43
|
+
this.log(chalk.cyan(` Branch: ${agentStatus.branch}`));
|
|
44
|
+
}
|
|
45
|
+
// Show repository status
|
|
46
|
+
if (agentStatus.repositories.length > 0) {
|
|
47
|
+
const dirtyRepos = agentStatus.repositories.filter(r => r.status === 'dirty').length;
|
|
48
|
+
const reposWithCommits = agentStatus.repositories.filter(r => r.commitsAhead > 0);
|
|
49
|
+
let repoStatusText = `${agentStatus.repositories.length} repo(s)`;
|
|
50
|
+
if (dirtyRepos > 0) {
|
|
51
|
+
repoStatusText += `, ${dirtyRepos} dirty`;
|
|
52
|
+
}
|
|
53
|
+
if (reposWithCommits.length > 0) {
|
|
54
|
+
const commitDetails = reposWithCommits.map(r => `${r.name}(+${r.commitsAhead})`).join(', ');
|
|
55
|
+
repoStatusText += `, commits ahead: ${commitDetails}`;
|
|
56
|
+
}
|
|
57
|
+
this.log(chalk.white(` Repositories: ${repoStatusText}`));
|
|
58
|
+
}
|
|
59
|
+
// Show ticket info
|
|
60
|
+
if (agentStatus.assignedTickets.length > 0) {
|
|
61
|
+
this.log(chalk.blue(` Current tickets: ${agentStatus.assignedTickets.join(', ')}`));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
const agentDir = path.join(workspaceInfo.agentsPath, agentStatus.name);
|
|
66
|
+
const dirExists = fs.existsSync(agentDir);
|
|
67
|
+
if (dirExists) {
|
|
68
|
+
this.log(chalk.red(` Invalid or broken worktrees`));
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
this.log(chalk.red(` Agent directory not found`));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
this.log(''); // Empty line between agents
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Cleaned agents (if any)
|
|
78
|
+
if (cleanedAgents.length > 0) {
|
|
79
|
+
this.log(chalk.bold.dim('\n Cleaned Temporary Agents:\n'));
|
|
80
|
+
for (const agent of cleanedAgents) {
|
|
81
|
+
const cleanedAt = agent.cleaned_at
|
|
82
|
+
? new Date(agent.cleaned_at).toLocaleString()
|
|
83
|
+
: 'unknown';
|
|
84
|
+
this.log(chalk.dim(` ${agent.name} - cleaned at ${cleanedAt}`));
|
|
85
|
+
}
|
|
86
|
+
this.log('');
|
|
87
|
+
}
|
|
88
|
+
// Summary
|
|
89
|
+
const runningCount = activeAgents.filter(a => {
|
|
90
|
+
const sessions = getAgentTmuxSessions(a.name);
|
|
91
|
+
return sessions.length > 0;
|
|
92
|
+
}).length;
|
|
93
|
+
this.log(chalk.bold(`Summary:`));
|
|
94
|
+
this.log(` Total temporary agents: ${ephemeralAgents.length}`);
|
|
95
|
+
this.log(` Active: ${activeAgents.length}`);
|
|
96
|
+
if (runningCount > 0) {
|
|
97
|
+
this.log(chalk.yellow(` Running work: ${runningCount}`));
|
|
98
|
+
}
|
|
99
|
+
this.log(chalk.dim(` Cleaned: ${cleanedAgents.length}`));
|
|
100
|
+
if (activeAgents.length > 0 && runningCount === 0) {
|
|
101
|
+
this.log(chalk.dim('\nTip: Use "prlt agent temp cleanup --temp" to clean up idle agents.'));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
this.error(error instanceof Error ? error.message : String(error));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class ThemesAddNames extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
theme: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static strict: boolean;
|
|
9
|
+
run(): Promise<void>;
|
|
10
|
+
}
|