@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,18 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class ExecutionLogs extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
follow: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
tail: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
};
|
|
14
|
+
protected getPMOOptions(): {
|
|
15
|
+
promptIfMultiple: boolean;
|
|
16
|
+
};
|
|
17
|
+
execute(): Promise<void>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { spawn } from 'node:child_process';
|
|
5
|
+
import inquirer from 'inquirer';
|
|
6
|
+
import Database from 'better-sqlite3';
|
|
7
|
+
import { styles } from '../../lib/styles.js';
|
|
8
|
+
import { getWorkspaceInfo } from '../../lib/agents/commands.js';
|
|
9
|
+
import { ExecutionStorage } from '../../lib/execution/storage.js';
|
|
10
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
11
|
+
import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
|
|
12
|
+
export default class ExecutionLogs extends PMOCommand {
|
|
13
|
+
static description = 'View execution logs';
|
|
14
|
+
static examples = [
|
|
15
|
+
'<%= config.bin %> <%= command.id %> WORK-001',
|
|
16
|
+
'<%= config.bin %> <%= command.id %> WORK-001 --follow',
|
|
17
|
+
'<%= config.bin %> <%= command.id %> WORK-001 --tail 50',
|
|
18
|
+
'<%= config.bin %> <%= command.id %> # Interactive mode',
|
|
19
|
+
];
|
|
20
|
+
static args = {
|
|
21
|
+
id: Args.string({
|
|
22
|
+
description: 'Execution ID - prompts if not provided',
|
|
23
|
+
required: false,
|
|
24
|
+
}),
|
|
25
|
+
};
|
|
26
|
+
static flags = {
|
|
27
|
+
...pmoBaseFlags,
|
|
28
|
+
follow: Flags.boolean({
|
|
29
|
+
char: 'f',
|
|
30
|
+
description: 'Stream logs in real-time',
|
|
31
|
+
default: false,
|
|
32
|
+
}),
|
|
33
|
+
tail: Flags.integer({
|
|
34
|
+
char: 'n',
|
|
35
|
+
description: 'Show last n lines',
|
|
36
|
+
}),
|
|
37
|
+
json: Flags.boolean({
|
|
38
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
39
|
+
default: false,
|
|
40
|
+
}),
|
|
41
|
+
};
|
|
42
|
+
getPMOOptions() {
|
|
43
|
+
return { promptIfMultiple: false };
|
|
44
|
+
}
|
|
45
|
+
async execute() {
|
|
46
|
+
const { args, flags } = await this.parse(ExecutionLogs);
|
|
47
|
+
// Get workspace info
|
|
48
|
+
let workspaceInfo;
|
|
49
|
+
try {
|
|
50
|
+
workspaceInfo = getWorkspaceInfo();
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
this.error('Not in a workspace. Run "prlt init" first.');
|
|
54
|
+
}
|
|
55
|
+
// Open database
|
|
56
|
+
const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
|
|
57
|
+
const db = new Database(dbPath);
|
|
58
|
+
const executionStorage = new ExecutionStorage(db);
|
|
59
|
+
try {
|
|
60
|
+
// Get execution ID - prompt if not provided
|
|
61
|
+
let execId = args.id;
|
|
62
|
+
if (!execId) {
|
|
63
|
+
const executions = executionStorage.listExecutions({ limit: 20 });
|
|
64
|
+
// Check if JSON output mode is active
|
|
65
|
+
const jsonMode = shouldOutputJson(flags);
|
|
66
|
+
if (executions.length === 0) {
|
|
67
|
+
if (jsonMode) {
|
|
68
|
+
outputErrorAsJson('NO_EXECUTIONS', 'No executions found.', createMetadata('execution logs', flags));
|
|
69
|
+
db.close();
|
|
70
|
+
this.exit(1);
|
|
71
|
+
}
|
|
72
|
+
this.error('No executions found.');
|
|
73
|
+
}
|
|
74
|
+
// In JSON mode, output execution selection prompt
|
|
75
|
+
if (jsonMode) {
|
|
76
|
+
const execChoices = executions.map((e) => ({
|
|
77
|
+
name: `${e.id} - ${e.ticketId} (${e.agentName}, ${e.status})`,
|
|
78
|
+
value: e.id,
|
|
79
|
+
}));
|
|
80
|
+
outputPromptAsJson(buildPromptConfig('list', 'executionId', 'Select execution to view logs:', execChoices), createMetadata('execution logs', flags));
|
|
81
|
+
db.close();
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const { selectedId } = await inquirer.prompt([
|
|
85
|
+
{
|
|
86
|
+
type: 'list',
|
|
87
|
+
name: 'selectedId',
|
|
88
|
+
message: 'Select execution to view logs:',
|
|
89
|
+
choices: executions.map((e) => ({
|
|
90
|
+
name: `${e.id} - ${e.ticketId} (${e.agentName}, ${e.status})`,
|
|
91
|
+
value: e.id,
|
|
92
|
+
})),
|
|
93
|
+
},
|
|
94
|
+
]);
|
|
95
|
+
execId = selectedId;
|
|
96
|
+
}
|
|
97
|
+
// Get execution
|
|
98
|
+
const execution = executionStorage.getExecution(execId);
|
|
99
|
+
if (!execution) {
|
|
100
|
+
this.error(`Execution "${execId}" not found.`);
|
|
101
|
+
}
|
|
102
|
+
// Check for log file
|
|
103
|
+
if (!execution.logPath) {
|
|
104
|
+
this.log(styles.muted(`\nNo log file for execution ${execId}`));
|
|
105
|
+
this.log(styles.muted(`Environment: ${execution.environment}`));
|
|
106
|
+
if (execution.sessionId) {
|
|
107
|
+
this.log('');
|
|
108
|
+
this.log(styles.muted('View in tmux:'));
|
|
109
|
+
this.log(styles.muted(` tmux attach -t ${execution.sessionId}`));
|
|
110
|
+
}
|
|
111
|
+
else if (execution.environment === 'docker' && execution.containerId) {
|
|
112
|
+
this.log('');
|
|
113
|
+
this.log(styles.muted('View docker logs:'));
|
|
114
|
+
this.log(styles.muted(` docker logs -f ${execution.containerId}`));
|
|
115
|
+
}
|
|
116
|
+
this.log('');
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
// Check if log file exists
|
|
120
|
+
if (!fs.existsSync(execution.logPath)) {
|
|
121
|
+
this.error(`Log file not found: ${execution.logPath}`);
|
|
122
|
+
}
|
|
123
|
+
// Display logs
|
|
124
|
+
this.log('');
|
|
125
|
+
this.log(styles.header(`📜 Logs for ${execution.id} (${execution.ticketId})`));
|
|
126
|
+
this.log(styles.muted(` Log file: ${execution.logPath}`));
|
|
127
|
+
this.log('');
|
|
128
|
+
if (flags.follow) {
|
|
129
|
+
// Stream logs with tail -f
|
|
130
|
+
const tailProcess = spawn('tail', ['-f', execution.logPath], {
|
|
131
|
+
stdio: 'inherit',
|
|
132
|
+
});
|
|
133
|
+
// Handle Ctrl+C
|
|
134
|
+
process.on('SIGINT', () => {
|
|
135
|
+
tailProcess.kill();
|
|
136
|
+
process.exit(0);
|
|
137
|
+
});
|
|
138
|
+
await new Promise((resolve) => {
|
|
139
|
+
tailProcess.on('close', resolve);
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
else if (flags.tail) {
|
|
143
|
+
// Show last n lines
|
|
144
|
+
const tailProcess = spawn('tail', ['-n', flags.tail.toString(), execution.logPath], {
|
|
145
|
+
stdio: 'inherit',
|
|
146
|
+
});
|
|
147
|
+
await new Promise((resolve) => {
|
|
148
|
+
tailProcess.on('close', resolve);
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
// Show entire file
|
|
153
|
+
const content = fs.readFileSync(execution.logPath, 'utf-8');
|
|
154
|
+
this.log(content);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
db.close();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class ExecutionStop extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
agent: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
};
|
|
15
|
+
protected getPMOOptions(): {
|
|
16
|
+
promptIfMultiple: boolean;
|
|
17
|
+
};
|
|
18
|
+
execute(): Promise<void>;
|
|
19
|
+
private bulkStop;
|
|
20
|
+
private singleStop;
|
|
21
|
+
private stopExecution;
|
|
22
|
+
}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { execSync } from 'node:child_process';
|
|
4
|
+
import inquirer from 'inquirer';
|
|
5
|
+
import Database from 'better-sqlite3';
|
|
6
|
+
import { styles } from '../../lib/styles.js';
|
|
7
|
+
import { getWorkspaceInfo } from '../../lib/agents/commands.js';
|
|
8
|
+
import { ExecutionStorage } from '../../lib/execution/storage.js';
|
|
9
|
+
import { isDockerRunning } from '../../lib/execution/runners.js';
|
|
10
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
11
|
+
import { shouldOutputJson, outputPromptAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
|
|
12
|
+
export default class ExecutionStop extends PMOCommand {
|
|
13
|
+
static description = 'Stop running execution(s)';
|
|
14
|
+
static examples = [
|
|
15
|
+
'<%= config.bin %> <%= command.id %> WORK-001',
|
|
16
|
+
'<%= config.bin %> <%= command.id %> WORK-001 --force',
|
|
17
|
+
'<%= config.bin %> <%= command.id %> # Interactive mode',
|
|
18
|
+
'<%= config.bin %> <%= command.id %> --all',
|
|
19
|
+
'<%= config.bin %> <%= command.id %> --all --force',
|
|
20
|
+
'<%= config.bin %> <%= command.id %> --agent altman',
|
|
21
|
+
];
|
|
22
|
+
static args = {
|
|
23
|
+
id: Args.string({
|
|
24
|
+
description: 'Execution ID - prompts if not provided (ignored if --all or --agent used)',
|
|
25
|
+
required: false,
|
|
26
|
+
}),
|
|
27
|
+
};
|
|
28
|
+
static flags = {
|
|
29
|
+
...pmoBaseFlags,
|
|
30
|
+
force: Flags.boolean({
|
|
31
|
+
char: 'f',
|
|
32
|
+
description: 'Force kill (SIGKILL instead of SIGTERM)',
|
|
33
|
+
default: false,
|
|
34
|
+
}),
|
|
35
|
+
all: Flags.boolean({
|
|
36
|
+
description: 'Stop all running executions',
|
|
37
|
+
default: false,
|
|
38
|
+
}),
|
|
39
|
+
agent: Flags.string({
|
|
40
|
+
char: 'a',
|
|
41
|
+
description: 'Stop all executions for a specific agent',
|
|
42
|
+
}),
|
|
43
|
+
json: Flags.boolean({
|
|
44
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
45
|
+
default: false,
|
|
46
|
+
}),
|
|
47
|
+
};
|
|
48
|
+
getPMOOptions() {
|
|
49
|
+
return { promptIfMultiple: false };
|
|
50
|
+
}
|
|
51
|
+
async execute() {
|
|
52
|
+
const { args, flags } = await this.parse(ExecutionStop);
|
|
53
|
+
// Get workspace info
|
|
54
|
+
let workspaceInfo;
|
|
55
|
+
try {
|
|
56
|
+
workspaceInfo = getWorkspaceInfo();
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
this.error('Not in a workspace. Run "prlt init" first.');
|
|
60
|
+
}
|
|
61
|
+
// Open database
|
|
62
|
+
const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
|
|
63
|
+
const db = new Database(dbPath);
|
|
64
|
+
const executionStorage = new ExecutionStorage(db);
|
|
65
|
+
try {
|
|
66
|
+
// Determine if bulk stop or single stop
|
|
67
|
+
if (flags.all || flags.agent) {
|
|
68
|
+
await this.bulkStop(executionStorage, flags);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
await this.singleStop(executionStorage, args.id, flags);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
db.close();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async bulkStop(executionStorage, flags) {
|
|
79
|
+
// Get running executions
|
|
80
|
+
const runningExecutions = executionStorage.listExecutions({
|
|
81
|
+
status: 'running',
|
|
82
|
+
agentName: flags.agent,
|
|
83
|
+
limit: 100,
|
|
84
|
+
});
|
|
85
|
+
const startingExecutions = executionStorage.listExecutions({
|
|
86
|
+
status: 'starting',
|
|
87
|
+
agentName: flags.agent,
|
|
88
|
+
limit: 100,
|
|
89
|
+
});
|
|
90
|
+
const activeExecutions = [...runningExecutions, ...startingExecutions];
|
|
91
|
+
if (activeExecutions.length === 0) {
|
|
92
|
+
const scope = flags.agent ? ` for agent "${flags.agent}"` : '';
|
|
93
|
+
this.log(styles.muted(`\nNo running executions found${scope}.\n`));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
this.log('');
|
|
97
|
+
this.log(styles.header(`Stopping ${activeExecutions.length} execution(s)...`));
|
|
98
|
+
this.log('');
|
|
99
|
+
let stopped = 0;
|
|
100
|
+
let failed = 0;
|
|
101
|
+
for (const execution of activeExecutions) {
|
|
102
|
+
try {
|
|
103
|
+
const success = await this.stopExecution(execution, flags.force || false);
|
|
104
|
+
if (success) {
|
|
105
|
+
executionStorage.updateStatus(execution.id, 'stopped');
|
|
106
|
+
this.log(styles.success(` ✓ ${execution.id} (${execution.agentName} → ${execution.ticketId})`));
|
|
107
|
+
stopped++;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
this.log(styles.error(` ✗ ${execution.id}: ${error instanceof Error ? error.message : error}`));
|
|
112
|
+
failed++;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
this.log('');
|
|
116
|
+
this.log(styles.header('Summary'));
|
|
117
|
+
this.log(styles.success(` Stopped: ${stopped}`));
|
|
118
|
+
if (failed > 0) {
|
|
119
|
+
this.log(styles.error(` Failed: ${failed}`));
|
|
120
|
+
}
|
|
121
|
+
this.log('');
|
|
122
|
+
}
|
|
123
|
+
async singleStop(executionStorage, execId, flags) {
|
|
124
|
+
// Get execution ID - prompt if not provided
|
|
125
|
+
let id = execId;
|
|
126
|
+
if (!id) {
|
|
127
|
+
const runningExecutions = executionStorage.listExecutions({
|
|
128
|
+
status: 'running',
|
|
129
|
+
limit: 50,
|
|
130
|
+
});
|
|
131
|
+
// Also include 'starting' status
|
|
132
|
+
const startingExecutions = executionStorage.listExecutions({
|
|
133
|
+
status: 'starting',
|
|
134
|
+
limit: 50,
|
|
135
|
+
});
|
|
136
|
+
const activeExecutions = [...runningExecutions, ...startingExecutions];
|
|
137
|
+
if (activeExecutions.length === 0) {
|
|
138
|
+
this.log(styles.muted('\nNo running executions found.\n'));
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
// Check if JSON output mode is active
|
|
142
|
+
const jsonMode = shouldOutputJson(flags);
|
|
143
|
+
// In JSON mode, output execution selection prompt
|
|
144
|
+
if (jsonMode) {
|
|
145
|
+
const execChoices = activeExecutions.map((e) => ({
|
|
146
|
+
name: `${e.id} - ${e.ticketId} (${e.agentName}, ${e.environment})`,
|
|
147
|
+
value: e.id,
|
|
148
|
+
}));
|
|
149
|
+
outputPromptAsJson(buildPromptConfig('list', 'executionId', 'Select execution to stop:', execChoices), createMetadata('execution stop', flags));
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const { selectedId } = await inquirer.prompt([
|
|
153
|
+
{
|
|
154
|
+
type: 'list',
|
|
155
|
+
name: 'selectedId',
|
|
156
|
+
message: 'Select execution to stop:',
|
|
157
|
+
choices: activeExecutions.map((e) => ({
|
|
158
|
+
name: `${e.id} - ${e.ticketId} (${e.agentName}, ${e.environment})`,
|
|
159
|
+
value: e.id,
|
|
160
|
+
})),
|
|
161
|
+
},
|
|
162
|
+
]);
|
|
163
|
+
id = selectedId;
|
|
164
|
+
}
|
|
165
|
+
// Get execution
|
|
166
|
+
const execution = executionStorage.getExecution(id);
|
|
167
|
+
if (!execution) {
|
|
168
|
+
this.error(`Execution "${id}" not found.`);
|
|
169
|
+
}
|
|
170
|
+
// Check if already stopped
|
|
171
|
+
if (!['starting', 'running'].includes(execution.status)) {
|
|
172
|
+
this.log(styles.muted(`\nExecution ${id} is not running (status: ${execution.status}).\n`));
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
// Stop the execution
|
|
176
|
+
this.log('');
|
|
177
|
+
this.log(styles.muted(`Stopping ${execution.id}...`));
|
|
178
|
+
const stopped = await this.stopExecution(execution, flags.force || false);
|
|
179
|
+
if (stopped) {
|
|
180
|
+
// Update execution status
|
|
181
|
+
executionStorage.updateStatus(execution.id, 'stopped');
|
|
182
|
+
this.log('');
|
|
183
|
+
this.log(styles.success(`✓ Stopped execution ${execution.id}`));
|
|
184
|
+
this.log(styles.muted(` Ticket: ${execution.ticketId}`));
|
|
185
|
+
this.log(styles.muted(` Agent: ${execution.agentName}`));
|
|
186
|
+
this.log('');
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async stopExecution(execution, force) {
|
|
190
|
+
try {
|
|
191
|
+
// First try to kill any tmux session (all environments use tmux for session management)
|
|
192
|
+
if (execution.sessionId) {
|
|
193
|
+
try {
|
|
194
|
+
// Try to kill the tmux session
|
|
195
|
+
if (execution.environment === 'devcontainer' && execution.containerId) {
|
|
196
|
+
// Kill tmux session inside container
|
|
197
|
+
execSync(`docker exec ${execution.containerId} tmux kill-session -t "${execution.sessionId}"`, { stdio: 'pipe' });
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
// Kill host tmux session
|
|
201
|
+
execSync(`tmux kill-session -t "${execution.sessionId}"`, { stdio: 'pipe' });
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// Session may not exist
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// Handle environment-specific cleanup
|
|
209
|
+
switch (execution.environment) {
|
|
210
|
+
case 'host':
|
|
211
|
+
// Kill process if we have a PID
|
|
212
|
+
if (execution.pid) {
|
|
213
|
+
const signal = force ? 'SIGKILL' : 'SIGTERM';
|
|
214
|
+
try {
|
|
215
|
+
process.kill(parseInt(execution.pid), signal);
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// Process may have already exited
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return true;
|
|
222
|
+
case 'docker':
|
|
223
|
+
case 'devcontainer':
|
|
224
|
+
if (execution.containerId) {
|
|
225
|
+
if (!isDockerRunning()) {
|
|
226
|
+
this.warn('Docker is not running. Cannot stop container.');
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
229
|
+
// Note: We don't stop the container itself, just the tmux session inside
|
|
230
|
+
// The container can be reused for future work
|
|
231
|
+
}
|
|
232
|
+
return true;
|
|
233
|
+
case 'vm':
|
|
234
|
+
if (execution.host && execution.sessionId) {
|
|
235
|
+
this.warn(`Cannot automatically stop VM execution. SSH to ${execution.host} and stop manually.`);
|
|
236
|
+
}
|
|
237
|
+
return true;
|
|
238
|
+
default:
|
|
239
|
+
this.warn(`Unknown environment: ${execution.environment}`);
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
this.warn(`Error stopping execution: ${error instanceof Error ? error.message : error}`);
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { shouldOutputJson, outputPromptAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
|
|
4
|
+
export default class GH extends Command {
|
|
5
|
+
static description = 'GitHub CLI setup and status for PR workflow';
|
|
6
|
+
static examples = [
|
|
7
|
+
'<%= config.bin %> <%= command.id %>',
|
|
8
|
+
'<%= config.bin %> <%= command.id %> status',
|
|
9
|
+
'<%= config.bin %> <%= command.id %> login',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> token',
|
|
11
|
+
];
|
|
12
|
+
static flags = {
|
|
13
|
+
json: Flags.boolean({
|
|
14
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
15
|
+
default: false,
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
async run() {
|
|
19
|
+
const { flags } = await this.parse(GH);
|
|
20
|
+
// Check if JSON output mode is active
|
|
21
|
+
const jsonMode = shouldOutputJson(flags);
|
|
22
|
+
// Define choices once, use for both JSON and interactive modes
|
|
23
|
+
const menuChoices = [
|
|
24
|
+
{ name: 'Check status', value: 'status' },
|
|
25
|
+
{ name: 'Login to GitHub', value: 'login' },
|
|
26
|
+
{ name: 'Show GH_TOKEN setup', value: 'token' },
|
|
27
|
+
];
|
|
28
|
+
const message = 'GitHub CLI Setup';
|
|
29
|
+
// In JSON mode, output menu prompt
|
|
30
|
+
if (jsonMode) {
|
|
31
|
+
outputPromptAsJson(buildPromptConfig('list', 'action', message, menuChoices), createMetadata('gh', flags));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// Interactive menu when no subcommand provided
|
|
35
|
+
const { action } = await inquirer.prompt([{
|
|
36
|
+
type: 'list',
|
|
37
|
+
name: 'action',
|
|
38
|
+
message,
|
|
39
|
+
choices: menuChoices,
|
|
40
|
+
}]);
|
|
41
|
+
switch (action) {
|
|
42
|
+
case 'status':
|
|
43
|
+
await this.config.runCommand('gh status');
|
|
44
|
+
break;
|
|
45
|
+
case 'login':
|
|
46
|
+
await this.config.runCommand('gh login');
|
|
47
|
+
break;
|
|
48
|
+
case 'token':
|
|
49
|
+
await this.config.runCommand('gh token');
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { styles } from '../../lib/styles.js';
|
|
5
|
+
import { isGHInstalled, isGHAuthenticated, getGHUsername } from '../../lib/pr/index.js';
|
|
6
|
+
export default class GHLogin extends Command {
|
|
7
|
+
static description = 'Login to GitHub CLI for PR workflow';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %>',
|
|
10
|
+
];
|
|
11
|
+
async run() {
|
|
12
|
+
// Check if gh is installed
|
|
13
|
+
if (!isGHInstalled()) {
|
|
14
|
+
this.log(chalk.red(' ✗ gh CLI not installed'));
|
|
15
|
+
this.log(styles.muted(''));
|
|
16
|
+
this.log(styles.muted(' Install with Homebrew:'));
|
|
17
|
+
this.log(chalk.cyan(' brew install gh'));
|
|
18
|
+
this.log(styles.muted(''));
|
|
19
|
+
this.log(styles.muted(' Or see: https://cli.github.com/'));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
// Check if already authenticated
|
|
23
|
+
if (isGHAuthenticated()) {
|
|
24
|
+
const username = getGHUsername();
|
|
25
|
+
this.log(chalk.green(`Already authenticated${username ? ` as ${chalk.bold(username)}` : ''}`));
|
|
26
|
+
this.log(styles.muted(''));
|
|
27
|
+
this.log(styles.muted('To re-authenticate or switch accounts, run directly:'));
|
|
28
|
+
this.log(chalk.cyan(' gh auth login'));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
this.log(styles.muted('Starting GitHub authentication...\n'));
|
|
32
|
+
// Run gh auth login interactively
|
|
33
|
+
const child = spawn('gh', ['auth', 'login'], {
|
|
34
|
+
stdio: 'inherit',
|
|
35
|
+
shell: true,
|
|
36
|
+
});
|
|
37
|
+
await new Promise((resolve, reject) => {
|
|
38
|
+
child.on('close', (code) => {
|
|
39
|
+
if (code === 0) {
|
|
40
|
+
this.log(chalk.green('\n✓ Successfully authenticated!'));
|
|
41
|
+
this.log(styles.muted(''));
|
|
42
|
+
this.log(styles.muted('Next, set up GH_TOKEN for devcontainers:'));
|
|
43
|
+
this.log(chalk.cyan(' prlt gh token'));
|
|
44
|
+
resolve();
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
this.log(chalk.yellow('\nAuthentication cancelled or failed.'));
|
|
48
|
+
resolve();
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
child.on('error', (err) => {
|
|
52
|
+
this.log(chalk.red(`\nFailed to run gh auth login: ${err.message}`));
|
|
53
|
+
reject(err);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { styles } from '../../lib/styles.js';
|
|
4
|
+
import { isGHInstalled, isGHAuthenticated, getGHUsername, isGHTokenInEnv } from '../../lib/pr/index.js';
|
|
5
|
+
export default class GHStatus extends Command {
|
|
6
|
+
static description = 'Check GitHub CLI status for PR workflow';
|
|
7
|
+
static examples = [
|
|
8
|
+
'<%= config.bin %> <%= command.id %>',
|
|
9
|
+
];
|
|
10
|
+
async run() {
|
|
11
|
+
this.log(styles.muted('Checking GitHub CLI status...\n'));
|
|
12
|
+
// Check if gh is installed
|
|
13
|
+
if (!isGHInstalled()) {
|
|
14
|
+
this.log(chalk.red(' ✗ gh CLI not installed'));
|
|
15
|
+
this.log(styles.muted(''));
|
|
16
|
+
this.log(styles.muted(' Install with Homebrew:'));
|
|
17
|
+
this.log(chalk.cyan(' brew install gh'));
|
|
18
|
+
this.log(styles.muted(''));
|
|
19
|
+
this.log(styles.muted(' Or see: https://cli.github.com/'));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
this.log(chalk.green(' ✓ gh CLI installed'));
|
|
23
|
+
// Check if gh is authenticated
|
|
24
|
+
if (!isGHAuthenticated()) {
|
|
25
|
+
this.log(chalk.yellow(' ⚠ gh CLI not authenticated'));
|
|
26
|
+
this.log(styles.muted(''));
|
|
27
|
+
this.log(styles.muted(' Run to authenticate:'));
|
|
28
|
+
this.log(chalk.cyan(' prlt gh login'));
|
|
29
|
+
this.log(styles.muted(''));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const username = getGHUsername();
|
|
33
|
+
this.log(chalk.green(` ✓ Authenticated${username ? ` as ${chalk.bold(username)}` : ''}`));
|
|
34
|
+
// Check if GH_TOKEN is available for devcontainers
|
|
35
|
+
if (isGHTokenInEnv()) {
|
|
36
|
+
this.log(chalk.green(' ✓ GH_TOKEN available for devcontainers'));
|
|
37
|
+
this.log(styles.muted(''));
|
|
38
|
+
this.log(chalk.green('All set! PR creation will work in both host and devcontainers.'));
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
this.log(chalk.yellow(' ⚠ GH_TOKEN not set'));
|
|
42
|
+
this.log(styles.muted(''));
|
|
43
|
+
this.log(styles.muted(' PR creation works on host, but not in devcontainers.'));
|
|
44
|
+
this.log(styles.muted(' Run to see setup instructions:'));
|
|
45
|
+
this.log(chalk.cyan(' prlt gh token'));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|