@proletariat/cli 0.1.4 → 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 +510 -255
- 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 +104 -52
- 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 -139
- 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 -173
- 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 -212
- 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 -140
- 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,126 @@
|
|
|
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 agents and their current 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 active agents only
|
|
17
|
+
const activeAgents = workspaceInfo.agents.filter(a => a.status === 'active');
|
|
18
|
+
if (activeAgents.length === 0) {
|
|
19
|
+
this.log(chalk.yellow('No active agents found.'));
|
|
20
|
+
this.log(chalk.dim('Use "prlt agent staff add" or "prlt work spawn" to create agents.'));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
// Get status for all active agents
|
|
24
|
+
const agentsStatus = getAllAgentsStatus(workspaceInfo);
|
|
25
|
+
// Separate by type
|
|
26
|
+
const staffAgents = activeAgents.filter(a => a.type === 'persistent');
|
|
27
|
+
const tempAgents = activeAgents.filter(a => a.type === 'ephemeral');
|
|
28
|
+
// Staff agents section
|
|
29
|
+
if (staffAgents.length > 0) {
|
|
30
|
+
this.log(chalk.bold.cyan('\n Staff Agents:\n'));
|
|
31
|
+
const staffStatus = agentsStatus.filter(a => staffAgents.some(s => s.name === a.name));
|
|
32
|
+
for (const agentStatus of staffStatus) {
|
|
33
|
+
const statusIcon = agentStatus.exists ? '🟢' : '🔴';
|
|
34
|
+
const status = agentStatus.exists ? chalk.green('Active') : chalk.red('Missing');
|
|
35
|
+
this.log(`${statusIcon} ${chalk.bold(agentStatus.name)} ${chalk.dim('[staff]')} - ${status}`);
|
|
36
|
+
if (agentStatus.exists) {
|
|
37
|
+
if (agentStatus.branch) {
|
|
38
|
+
this.log(chalk.cyan(` Branch: ${agentStatus.branch}`));
|
|
39
|
+
}
|
|
40
|
+
if (agentStatus.repositories.length > 0) {
|
|
41
|
+
const dirtyRepos = agentStatus.repositories.filter(r => r.status === 'dirty').length;
|
|
42
|
+
const reposWithCommits = agentStatus.repositories.filter(r => r.commitsAhead > 0);
|
|
43
|
+
let repoStatusText = `${agentStatus.repositories.length} repo(s)`;
|
|
44
|
+
if (dirtyRepos > 0) {
|
|
45
|
+
repoStatusText += `, ${dirtyRepos} dirty`;
|
|
46
|
+
}
|
|
47
|
+
if (reposWithCommits.length > 0) {
|
|
48
|
+
const commitDetails = reposWithCommits.map(r => `${r.name}(+${r.commitsAhead})`).join(', ');
|
|
49
|
+
repoStatusText += `, commits ahead: ${commitDetails}`;
|
|
50
|
+
}
|
|
51
|
+
this.log(chalk.white(` Repositories: ${repoStatusText}`));
|
|
52
|
+
}
|
|
53
|
+
if (agentStatus.assignedTickets.length > 0) {
|
|
54
|
+
this.log(chalk.blue(` Current tickets: ${agentStatus.assignedTickets.join(', ')}`));
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
this.log(chalk.white(' No active tickets'));
|
|
58
|
+
}
|
|
59
|
+
if (agentStatus.completedTickets.length > 0) {
|
|
60
|
+
this.log(chalk.white(` Completed: ${agentStatus.completedTickets.length} ticket(s)`));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
const agentDir = path.join(workspaceInfo.agentsPath, agentStatus.name);
|
|
65
|
+
const dirExists = fs.existsSync(agentDir);
|
|
66
|
+
if (dirExists) {
|
|
67
|
+
this.log(chalk.red(` Invalid or broken worktrees`));
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
this.log(chalk.red(` Agent directory not found`));
|
|
71
|
+
}
|
|
72
|
+
this.log(chalk.white(' Run "prlt agent staff add" to recreate'));
|
|
73
|
+
}
|
|
74
|
+
this.log('');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Temp agents section
|
|
78
|
+
if (tempAgents.length > 0) {
|
|
79
|
+
this.log(chalk.bold.yellow('\n Temporary Agents:\n'));
|
|
80
|
+
const tempStatus = agentsStatus.filter(a => tempAgents.some(s => s.name === a.name));
|
|
81
|
+
for (const agentStatus of tempStatus) {
|
|
82
|
+
const sessions = getAgentTmuxSessions(agentStatus.name);
|
|
83
|
+
const hasRunningWork = sessions.length > 0;
|
|
84
|
+
const statusIcon = hasRunningWork ? '🟡' : (agentStatus.exists ? '🟢' : '🔴');
|
|
85
|
+
const runningLabel = hasRunningWork ? chalk.yellow(' (running)') : '';
|
|
86
|
+
const status = agentStatus.exists ? chalk.green('Active') : chalk.red('Missing');
|
|
87
|
+
this.log(`${statusIcon} ${chalk.bold(agentStatus.name)} ${chalk.dim('[temp]')} - ${status}${runningLabel}`);
|
|
88
|
+
if (agentStatus.exists) {
|
|
89
|
+
if (agentStatus.branch) {
|
|
90
|
+
this.log(chalk.cyan(` Branch: ${agentStatus.branch}`));
|
|
91
|
+
}
|
|
92
|
+
if (agentStatus.assignedTickets.length > 0) {
|
|
93
|
+
this.log(chalk.blue(` Current tickets: ${agentStatus.assignedTickets.join(', ')}`));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
this.log(chalk.red(` Agent directory not found`));
|
|
98
|
+
}
|
|
99
|
+
this.log('');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Summary
|
|
103
|
+
const activeStaffCount = agentsStatus.filter(a => staffAgents.some(s => s.name === a.name) && a.exists).length;
|
|
104
|
+
const activeTempCount = agentsStatus.filter(a => tempAgents.some(s => s.name === a.name) && a.exists).length;
|
|
105
|
+
const runningTempCount = tempAgents.filter(a => {
|
|
106
|
+
const sessions = getAgentTmuxSessions(a.name);
|
|
107
|
+
return sessions.length > 0;
|
|
108
|
+
}).length;
|
|
109
|
+
const totalAssignedTickets = agentsStatus.reduce((sum, a) => sum + a.assignedTickets.length, 0);
|
|
110
|
+
this.log(chalk.bold(`Summary:`));
|
|
111
|
+
this.log(` Staff agents: ${staffAgents.length} (${activeStaffCount} active)`);
|
|
112
|
+
this.log(` Temp agents: ${tempAgents.length} (${activeTempCount} active${runningTempCount > 0 ? `, ${runningTempCount} running` : ''})`);
|
|
113
|
+
if (workspaceInfo.hasPMO) {
|
|
114
|
+
this.log(` Tickets assigned: ${totalAssignedTickets}`);
|
|
115
|
+
}
|
|
116
|
+
// Show cleaned agents count if any
|
|
117
|
+
const cleanedAgents = workspaceInfo.agents.filter(a => a.status === 'cleaned');
|
|
118
|
+
if (cleanedAgents.length > 0) {
|
|
119
|
+
this.log(chalk.dim(` Cleaned (historical): ${cleanedAgents.length}`));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
this.error(error instanceof Error ? error.message : String(error));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class Login extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
name: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
};
|
|
12
|
+
protected getPMOOptions(): {
|
|
13
|
+
promptIfMultiple: boolean;
|
|
14
|
+
};
|
|
15
|
+
execute(): Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as fs from 'node:fs';
|
|
4
|
+
import { execSync } from 'node:child_process';
|
|
5
|
+
import inquirer from 'inquirer';
|
|
6
|
+
import { colors } from '../../lib/colors.js';
|
|
7
|
+
import { getWorkspaceInfo } from '../../lib/agents/commands.js';
|
|
8
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
9
|
+
import { isDockerRunning } from '../../lib/execution/runners.js';
|
|
10
|
+
import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
|
|
11
|
+
export default class Login extends PMOCommand {
|
|
12
|
+
static description = 'Authenticate Claude Code inside an agent container (one-time setup)';
|
|
13
|
+
static examples = [
|
|
14
|
+
'<%= config.bin %> <%= command.id %> damodei',
|
|
15
|
+
'<%= config.bin %> <%= command.id %>',
|
|
16
|
+
];
|
|
17
|
+
static args = {
|
|
18
|
+
name: Args.string({
|
|
19
|
+
description: 'Agent name to authenticate',
|
|
20
|
+
required: false,
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
static flags = {
|
|
24
|
+
...pmoBaseFlags,
|
|
25
|
+
json: Flags.boolean({
|
|
26
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
27
|
+
default: false,
|
|
28
|
+
}),
|
|
29
|
+
};
|
|
30
|
+
getPMOOptions() {
|
|
31
|
+
return { promptIfMultiple: false };
|
|
32
|
+
}
|
|
33
|
+
async execute() {
|
|
34
|
+
const { args, flags } = await this.parse(Login);
|
|
35
|
+
// Check if JSON output mode is active
|
|
36
|
+
const jsonMode = shouldOutputJson(flags);
|
|
37
|
+
// Helper to handle errors in JSON mode
|
|
38
|
+
const handleError = (code, message) => {
|
|
39
|
+
if (jsonMode) {
|
|
40
|
+
outputErrorAsJson(code, message, createMetadata('agent login', flags));
|
|
41
|
+
this.exit(1);
|
|
42
|
+
}
|
|
43
|
+
this.error(message);
|
|
44
|
+
};
|
|
45
|
+
// Check Docker is running
|
|
46
|
+
if (!isDockerRunning()) {
|
|
47
|
+
return handleError('DOCKER_NOT_RUNNING', 'Docker is not running. Please start Docker Desktop and try again.');
|
|
48
|
+
}
|
|
49
|
+
// Get workspace information
|
|
50
|
+
const workspaceInfo = getWorkspaceInfo();
|
|
51
|
+
if (workspaceInfo.agents.length === 0) {
|
|
52
|
+
if (jsonMode) {
|
|
53
|
+
outputErrorAsJson('NO_AGENTS', 'No agents found. Add agents with "prlt agent add"', createMetadata('agent login', flags));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this.log(colors.warning('No agents found. Add agents with "prlt agent add"'));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
let agentName = args.name;
|
|
60
|
+
// Interactive mode if no agent specified
|
|
61
|
+
if (!agentName) {
|
|
62
|
+
// In JSON mode, output agent selection prompt
|
|
63
|
+
if (jsonMode) {
|
|
64
|
+
const agentChoices = workspaceInfo.agents.map((agent) => ({ name: agent.name, value: agent.name }));
|
|
65
|
+
outputPromptAsJson(buildPromptConfig('list', 'name', 'Select agent to authenticate:', agentChoices), createMetadata('agent login', flags));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const { selected } = await inquirer.prompt([
|
|
69
|
+
{
|
|
70
|
+
type: 'list',
|
|
71
|
+
name: 'selected',
|
|
72
|
+
message: 'Select agent to authenticate:',
|
|
73
|
+
choices: workspaceInfo.agents.map(agent => ({
|
|
74
|
+
name: agent.name,
|
|
75
|
+
value: agent.name
|
|
76
|
+
}))
|
|
77
|
+
}
|
|
78
|
+
]);
|
|
79
|
+
agentName = selected;
|
|
80
|
+
}
|
|
81
|
+
// Validate agent exists
|
|
82
|
+
const agent = workspaceInfo.agents.find(a => a.name === agentName);
|
|
83
|
+
if (!agent) {
|
|
84
|
+
this.error(`Agent "${agentName}" not found. Available agents: ${workspaceInfo.agents.map(a => a.name).join(', ')}`);
|
|
85
|
+
}
|
|
86
|
+
const agentDir = path.join(workspaceInfo.agentsPath, agentName);
|
|
87
|
+
// Check if devcontainer exists
|
|
88
|
+
const devcontainerPath = path.join(agentDir, '.devcontainer');
|
|
89
|
+
try {
|
|
90
|
+
execSync(`test -d "${devcontainerPath}"`, { stdio: 'ignore' });
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
this.error(`Agent "${agentName}" does not have a devcontainer configuration. Run "prlt agent add ${agentName}" to initialize.`);
|
|
94
|
+
}
|
|
95
|
+
// Get container ID
|
|
96
|
+
this.log(colors.primary(`🔐 Authenticating agent: ${agentName}`));
|
|
97
|
+
this.log('');
|
|
98
|
+
let containerId;
|
|
99
|
+
try {
|
|
100
|
+
containerId = execSync(`docker ps --filter "label=devcontainer.local_folder=${agentDir}" --format "{{.ID}}"`, { encoding: 'utf-8' }).trim();
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
this.error('Failed to find running container. Make sure the agent container is running.');
|
|
104
|
+
}
|
|
105
|
+
if (!containerId) {
|
|
106
|
+
this.log(colors.warning('Container is not running. Starting it now...'));
|
|
107
|
+
this.log('');
|
|
108
|
+
try {
|
|
109
|
+
execSync(`devcontainer up --workspace-folder "${agentDir}"`, {
|
|
110
|
+
stdio: 'inherit',
|
|
111
|
+
cwd: agentDir
|
|
112
|
+
});
|
|
113
|
+
// Get container ID again
|
|
114
|
+
containerId = execSync(`docker ps --filter "label=devcontainer.local_folder=${agentDir}" --format "{{.ID}}"`, { encoding: 'utf-8' }).trim();
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
this.error('Failed to start container.');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Create a helper script to launch interactive session
|
|
121
|
+
this.log(colors.success(`✓ Container running: ${containerId}`));
|
|
122
|
+
this.log('');
|
|
123
|
+
// Generate script that opens interactive Claude and prompts for /login
|
|
124
|
+
const scriptPath = `/tmp/prlt-agent-login-${containerId}.sh`;
|
|
125
|
+
const scriptContent = `#!/bin/bash
|
|
126
|
+
echo "======================================"
|
|
127
|
+
echo "Claude Code Authentication"
|
|
128
|
+
echo "======================================"
|
|
129
|
+
echo ""
|
|
130
|
+
echo "Type: /login"
|
|
131
|
+
echo "Then follow the browser prompts to authenticate with your Claude subscription."
|
|
132
|
+
echo ""
|
|
133
|
+
echo "Your credentials will be saved and persist across container rebuilds."
|
|
134
|
+
echo ""
|
|
135
|
+
docker exec -it ${containerId} claude
|
|
136
|
+
`;
|
|
137
|
+
fs.writeFileSync(scriptPath, scriptContent, { mode: 0o755 });
|
|
138
|
+
this.log(colors.text('Opening interactive Claude session...'));
|
|
139
|
+
this.log('');
|
|
140
|
+
// Execute the script directly with a new shell
|
|
141
|
+
execSync(`open -a Terminal ${scriptPath}`, { stdio: 'inherit' });
|
|
142
|
+
this.log(colors.success('✓ Opened new terminal window'));
|
|
143
|
+
this.log(colors.textSecondary('Complete the /login flow in the new terminal window.'));
|
|
144
|
+
this.log(colors.textSecondary('Your credentials will be saved automatically.'));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class AgentRebuild extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
name: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
'no-cache': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
};
|
|
13
|
+
protected getPMOOptions(): {
|
|
14
|
+
promptIfMultiple: boolean;
|
|
15
|
+
};
|
|
16
|
+
execute(): Promise<void>;
|
|
17
|
+
private getAvailableAgents;
|
|
18
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import { exec } from 'node:child_process';
|
|
3
|
+
import { promisify } from 'node:util';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import * as fs from 'node:fs';
|
|
6
|
+
import { colors } from '../../lib/colors.js';
|
|
7
|
+
import { getWorkspaceInfo } from '../../lib/agents/commands.js';
|
|
8
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
9
|
+
import { isDockerRunning } from '../../lib/execution/runners.js';
|
|
10
|
+
import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
11
|
+
const execAsync = promisify(exec);
|
|
12
|
+
export default class AgentRebuild extends PMOCommand {
|
|
13
|
+
static description = 'Rebuild a specific agent devcontainer image';
|
|
14
|
+
static examples = [
|
|
15
|
+
'<%= config.bin %> <%= command.id %> altman',
|
|
16
|
+
'<%= config.bin %> <%= command.id %> altman --no-cache',
|
|
17
|
+
'<%= config.bin %> <%= command.id %> # Interactive selection',
|
|
18
|
+
'<%= config.bin %> <%= command.id %> --json # JSON mode for AI agents',
|
|
19
|
+
];
|
|
20
|
+
static args = {
|
|
21
|
+
name: Args.string({
|
|
22
|
+
description: 'Agent name to rebuild',
|
|
23
|
+
required: false,
|
|
24
|
+
}),
|
|
25
|
+
};
|
|
26
|
+
static flags = {
|
|
27
|
+
...pmoBaseFlags,
|
|
28
|
+
json: Flags.boolean({
|
|
29
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
30
|
+
default: false,
|
|
31
|
+
}),
|
|
32
|
+
'no-cache': Flags.boolean({
|
|
33
|
+
description: 'Build without using cache',
|
|
34
|
+
default: false,
|
|
35
|
+
}),
|
|
36
|
+
};
|
|
37
|
+
getPMOOptions() {
|
|
38
|
+
return { promptIfMultiple: false };
|
|
39
|
+
}
|
|
40
|
+
async execute() {
|
|
41
|
+
const { args, flags } = await this.parse(AgentRebuild);
|
|
42
|
+
// Check if JSON output mode is active
|
|
43
|
+
const jsonMode = shouldOutputJson(flags);
|
|
44
|
+
// Check Docker is running
|
|
45
|
+
if (!isDockerRunning()) {
|
|
46
|
+
if (jsonMode) {
|
|
47
|
+
outputErrorAsJson('DOCKER_NOT_RUNNING', 'Docker is not running. Please start Docker Desktop and try again.', createMetadata('agent rebuild', flags));
|
|
48
|
+
this.exit(1);
|
|
49
|
+
}
|
|
50
|
+
this.error('Docker is not running. Please start Docker Desktop and try again.');
|
|
51
|
+
}
|
|
52
|
+
let agentName = args.name;
|
|
53
|
+
// If no agent name provided, prompt for selection
|
|
54
|
+
if (!agentName) {
|
|
55
|
+
const agents = this.getAvailableAgents();
|
|
56
|
+
if (agents.length === 0) {
|
|
57
|
+
if (jsonMode) {
|
|
58
|
+
outputErrorAsJson('NO_AGENTS', 'No agents found.', createMetadata('agent rebuild', flags));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.log(colors.warning('No agents found.'));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const selected = await this.selectFromList({
|
|
65
|
+
message: 'Select agent to rebuild:',
|
|
66
|
+
items: agents,
|
|
67
|
+
getName: (a) => a.name,
|
|
68
|
+
getValue: (a) => a.name,
|
|
69
|
+
getCommand: (a) => `prlt agent rebuild ${a.name} --json`,
|
|
70
|
+
jsonMode: jsonMode ? { flags, commandName: 'agent rebuild' } : null,
|
|
71
|
+
});
|
|
72
|
+
if (!selected) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
agentName = selected;
|
|
76
|
+
}
|
|
77
|
+
// Get workspace info
|
|
78
|
+
const workspaceInfo = getWorkspaceInfo();
|
|
79
|
+
if (!workspaceInfo) {
|
|
80
|
+
this.error('Not in a proletariat workspace. Run `prlt init` first.');
|
|
81
|
+
}
|
|
82
|
+
this.log(colors.primary(`🔨 Rebuilding agent: ${agentName}\n`));
|
|
83
|
+
const agentsPath = path.join(workspaceInfo.path, 'agents', 'staff');
|
|
84
|
+
const agentDir = path.join(agentsPath, agentName);
|
|
85
|
+
try {
|
|
86
|
+
this.log(colors.textSecondary(' Building devcontainer...'));
|
|
87
|
+
const buildCommand = [
|
|
88
|
+
'devcontainer',
|
|
89
|
+
'build',
|
|
90
|
+
'--workspace-folder',
|
|
91
|
+
agentDir,
|
|
92
|
+
];
|
|
93
|
+
if (flags['no-cache']) {
|
|
94
|
+
buildCommand.push('--no-cache');
|
|
95
|
+
}
|
|
96
|
+
const { stderr } = await execAsync(buildCommand.join(' '));
|
|
97
|
+
if (stderr && !stderr.includes('WARNING')) {
|
|
98
|
+
this.log(colors.textMuted(` ${stderr.trim()}`));
|
|
99
|
+
}
|
|
100
|
+
this.log('');
|
|
101
|
+
this.log(colors.success(`✓ Agent ${agentName} rebuild complete`));
|
|
102
|
+
this.log(colors.textMuted('Use `prlt agent restart` to apply changes to running container'));
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
this.error(`Failed to rebuild agent ${agentName}: ${error instanceof Error ? error.message : String(error)}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
getAvailableAgents() {
|
|
109
|
+
const workspaceInfo = getWorkspaceInfo();
|
|
110
|
+
if (!workspaceInfo) {
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
const agents = [];
|
|
114
|
+
const agentsPath = path.join(workspaceInfo.path, 'agents');
|
|
115
|
+
// Check staff agents
|
|
116
|
+
const staffPath = path.join(agentsPath, 'staff');
|
|
117
|
+
if (fs.existsSync(staffPath)) {
|
|
118
|
+
const staffAgents = fs.readdirSync(staffPath, { withFileTypes: true })
|
|
119
|
+
.filter(d => d.isDirectory() && !d.name.startsWith('.'))
|
|
120
|
+
.map(d => ({ name: d.name, type: 'staff' }));
|
|
121
|
+
agents.push(...staffAgents);
|
|
122
|
+
}
|
|
123
|
+
// Check temp agents
|
|
124
|
+
const tempPath = path.join(agentsPath, 'temp');
|
|
125
|
+
if (fs.existsSync(tempPath)) {
|
|
126
|
+
const tempAgents = fs.readdirSync(tempPath, { withFileTypes: true })
|
|
127
|
+
.filter(d => d.isDirectory() && !d.name.startsWith('.'))
|
|
128
|
+
.map(d => ({ name: d.name, type: 'temp' }));
|
|
129
|
+
agents.push(...tempAgents);
|
|
130
|
+
}
|
|
131
|
+
return agents;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class AgentRestart extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
name: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
};
|
|
12
|
+
protected getPMOOptions(): {
|
|
13
|
+
promptIfMultiple: boolean;
|
|
14
|
+
};
|
|
15
|
+
execute(): Promise<void>;
|
|
16
|
+
private getAvailableAgents;
|
|
17
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import { exec } from 'node:child_process';
|
|
3
|
+
import { promisify } from 'node:util';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import * as fs from 'node:fs';
|
|
6
|
+
import { colors } from '../../lib/colors.js';
|
|
7
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
8
|
+
import { isDockerRunning } from '../../lib/execution/runners.js';
|
|
9
|
+
import { getWorkspaceInfo } from '../../lib/agents/commands.js';
|
|
10
|
+
import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
11
|
+
const execAsync = promisify(exec);
|
|
12
|
+
export default class AgentRestart extends PMOCommand {
|
|
13
|
+
static description = 'Restart a specific agent devcontainer';
|
|
14
|
+
static examples = [
|
|
15
|
+
'<%= config.bin %> <%= command.id %> altman',
|
|
16
|
+
'<%= config.bin %> <%= command.id %> # Interactive selection',
|
|
17
|
+
'<%= config.bin %> <%= command.id %> --json # JSON mode for AI agents',
|
|
18
|
+
];
|
|
19
|
+
static args = {
|
|
20
|
+
name: Args.string({
|
|
21
|
+
description: 'Agent name to restart',
|
|
22
|
+
required: false,
|
|
23
|
+
}),
|
|
24
|
+
};
|
|
25
|
+
static flags = {
|
|
26
|
+
...pmoBaseFlags,
|
|
27
|
+
json: Flags.boolean({
|
|
28
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
29
|
+
default: false,
|
|
30
|
+
}),
|
|
31
|
+
};
|
|
32
|
+
getPMOOptions() {
|
|
33
|
+
return { promptIfMultiple: false };
|
|
34
|
+
}
|
|
35
|
+
async execute() {
|
|
36
|
+
const { args, flags } = await this.parse(AgentRestart);
|
|
37
|
+
// Check if JSON output mode is active
|
|
38
|
+
const jsonMode = shouldOutputJson(flags);
|
|
39
|
+
// Check Docker is running
|
|
40
|
+
if (!isDockerRunning()) {
|
|
41
|
+
if (jsonMode) {
|
|
42
|
+
outputErrorAsJson('DOCKER_NOT_RUNNING', 'Docker is not running. Please start Docker Desktop and try again.', createMetadata('agent restart', flags));
|
|
43
|
+
this.exit(1);
|
|
44
|
+
}
|
|
45
|
+
this.error('Docker is not running. Please start Docker Desktop and try again.');
|
|
46
|
+
}
|
|
47
|
+
let agentName = args.name;
|
|
48
|
+
// If no agent name provided, prompt for selection
|
|
49
|
+
if (!agentName) {
|
|
50
|
+
const agents = this.getAvailableAgents();
|
|
51
|
+
if (agents.length === 0) {
|
|
52
|
+
if (jsonMode) {
|
|
53
|
+
outputErrorAsJson('NO_AGENTS', 'No agents found.', createMetadata('agent restart', flags));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this.log(colors.warning('No agents found.'));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const selected = await this.selectFromList({
|
|
60
|
+
message: 'Select agent to restart:',
|
|
61
|
+
items: agents,
|
|
62
|
+
getName: (a) => a.name,
|
|
63
|
+
getValue: (a) => a.name,
|
|
64
|
+
getCommand: (a) => `prlt agent restart ${a.name} --json`,
|
|
65
|
+
jsonMode: jsonMode ? { flags, commandName: 'agent restart' } : null,
|
|
66
|
+
});
|
|
67
|
+
if (!selected) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
agentName = selected;
|
|
71
|
+
}
|
|
72
|
+
this.log(colors.primary(`🔄 Restarting agent: ${agentName}\n`));
|
|
73
|
+
// Find container by agent name
|
|
74
|
+
const { stdout: containers } = await execAsync(`docker ps -a --format "{{.Names}}" | grep -i "${agentName}" || true`);
|
|
75
|
+
const containerNames = containers.trim().split('\n').filter(Boolean);
|
|
76
|
+
if (containerNames.length === 0) {
|
|
77
|
+
this.log(colors.warning(`No container found for agent: ${agentName}`));
|
|
78
|
+
this.log(colors.textMuted('The container will be created on next `prlt work start`'));
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
for (const containerName of containerNames) {
|
|
82
|
+
this.log(colors.textSecondary(` Stopping container: ${containerName}...`));
|
|
83
|
+
await execAsync(`docker stop ${containerName}`);
|
|
84
|
+
this.log(colors.textSecondary(` Removing container: ${containerName}...`));
|
|
85
|
+
await execAsync(`docker rm ${containerName}`);
|
|
86
|
+
}
|
|
87
|
+
this.log('');
|
|
88
|
+
this.log(colors.success(`✓ Agent ${agentName} container restarted`));
|
|
89
|
+
this.log(colors.textMuted('Container will rebuild with updated configuration on next `prlt work start`'));
|
|
90
|
+
}
|
|
91
|
+
getAvailableAgents() {
|
|
92
|
+
const workspaceInfo = getWorkspaceInfo();
|
|
93
|
+
if (!workspaceInfo) {
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
const agents = [];
|
|
97
|
+
const agentsPath = path.join(workspaceInfo.path, 'agents');
|
|
98
|
+
// Check staff agents
|
|
99
|
+
const staffPath = path.join(agentsPath, 'staff');
|
|
100
|
+
if (fs.existsSync(staffPath)) {
|
|
101
|
+
const staffAgents = fs.readdirSync(staffPath, { withFileTypes: true })
|
|
102
|
+
.filter(d => d.isDirectory() && !d.name.startsWith('.'))
|
|
103
|
+
.map(d => ({ name: d.name, type: 'staff' }));
|
|
104
|
+
agents.push(...staffAgents);
|
|
105
|
+
}
|
|
106
|
+
// Check temp agents
|
|
107
|
+
const tempPath = path.join(agentsPath, 'temp');
|
|
108
|
+
if (fs.existsSync(tempPath)) {
|
|
109
|
+
const tempAgents = fs.readdirSync(tempPath, { withFileTypes: true })
|
|
110
|
+
.filter(d => d.isDirectory() && !d.name.startsWith('.'))
|
|
111
|
+
.map(d => ({ name: d.name, type: 'temp' }));
|
|
112
|
+
agents.push(...tempAgents);
|
|
113
|
+
}
|
|
114
|
+
return agents;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class Shell extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
name: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
};
|
|
12
|
+
protected getPMOOptions(): {
|
|
13
|
+
promptIfMultiple: boolean;
|
|
14
|
+
};
|
|
15
|
+
execute(): Promise<void>;
|
|
16
|
+
private openDevcontainerShell;
|
|
17
|
+
private openHostShell;
|
|
18
|
+
/**
|
|
19
|
+
* Run a script in a new terminal window using the same method as work start.
|
|
20
|
+
* Uses osascript with proper iTerm/Terminal handling.
|
|
21
|
+
*/
|
|
22
|
+
private runInTerminal;
|
|
23
|
+
}
|