@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,378 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as fs from 'node:fs';
|
|
4
|
+
import { execSync, spawn } from 'node:child_process';
|
|
5
|
+
import inquirer from 'inquirer';
|
|
6
|
+
import Database from 'better-sqlite3';
|
|
7
|
+
import { colors } from '../../lib/colors.js';
|
|
8
|
+
import { getWorkspaceInfo } from '../../lib/agents/commands.js';
|
|
9
|
+
import { hasDevcontainerConfig } from '../../lib/execution/devcontainer.js';
|
|
10
|
+
import { getTerminalApp } from '../../lib/execution/config.js';
|
|
11
|
+
import { isDockerRunning } from '../../lib/execution/runners.js';
|
|
12
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
13
|
+
import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
|
|
14
|
+
export default class Shell extends PMOCommand {
|
|
15
|
+
static description = 'Open an interactive shell in an agent workspace';
|
|
16
|
+
static examples = [
|
|
17
|
+
'<%= config.bin %> <%= command.id %> altman',
|
|
18
|
+
'<%= config.bin %> <%= command.id %>',
|
|
19
|
+
];
|
|
20
|
+
static args = {
|
|
21
|
+
name: Args.string({
|
|
22
|
+
description: 'Agent name to open shell in',
|
|
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
|
+
};
|
|
33
|
+
getPMOOptions() {
|
|
34
|
+
return { promptIfMultiple: false };
|
|
35
|
+
}
|
|
36
|
+
async execute() {
|
|
37
|
+
const { args, flags } = await this.parse(Shell);
|
|
38
|
+
// Check if JSON output mode is active
|
|
39
|
+
const jsonMode = shouldOutputJson(flags);
|
|
40
|
+
// Helper to handle errors in JSON mode
|
|
41
|
+
const handleError = (code, message) => {
|
|
42
|
+
if (jsonMode) {
|
|
43
|
+
outputErrorAsJson(code, message, createMetadata('agent shell', flags));
|
|
44
|
+
this.exit(1);
|
|
45
|
+
}
|
|
46
|
+
this.error(message);
|
|
47
|
+
};
|
|
48
|
+
// Get workspace information
|
|
49
|
+
const workspaceInfo = getWorkspaceInfo();
|
|
50
|
+
if (workspaceInfo.agents.length === 0) {
|
|
51
|
+
if (jsonMode) {
|
|
52
|
+
outputErrorAsJson('NO_AGENTS', 'No agents found. Add agents with "prlt agent add"', createMetadata('agent shell', flags));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
this.log(colors.warning('No agents found. Add agents with "prlt agent add"'));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
let agentName = args.name;
|
|
59
|
+
// Interactive mode if no agent specified
|
|
60
|
+
if (!agentName) {
|
|
61
|
+
// Build choices once, use for both JSON and interactive modes
|
|
62
|
+
const agentChoices = workspaceInfo.agents.map((agent) => ({ name: agent.name, value: agent.name }));
|
|
63
|
+
const selectMessage = 'Select agent to open shell in:';
|
|
64
|
+
// In JSON mode, output agent selection prompt and exit
|
|
65
|
+
if (jsonMode) {
|
|
66
|
+
outputPromptAsJson(buildPromptConfig('list', 'name', selectMessage, agentChoices), createMetadata('agent shell', flags));
|
|
67
|
+
}
|
|
68
|
+
const { selected } = await inquirer.prompt([
|
|
69
|
+
{
|
|
70
|
+
type: 'list',
|
|
71
|
+
name: 'selected',
|
|
72
|
+
message: selectMessage,
|
|
73
|
+
choices: agentChoices
|
|
74
|
+
}
|
|
75
|
+
]);
|
|
76
|
+
agentName = selected;
|
|
77
|
+
}
|
|
78
|
+
// Validate agent exists
|
|
79
|
+
const agent = workspaceInfo.agents.find(a => a.name === agentName);
|
|
80
|
+
if (!agent) {
|
|
81
|
+
return handleError('AGENT_NOT_FOUND', `Agent "${agentName}" not found. Available agents: ${workspaceInfo.agents.map(a => a.name).join(', ')}`);
|
|
82
|
+
}
|
|
83
|
+
const agentDir = path.join(workspaceInfo.agentsPath, agentName);
|
|
84
|
+
// Check if agent has devcontainer
|
|
85
|
+
const hasDevcontainer = hasDevcontainerConfig(agentDir);
|
|
86
|
+
// In JSON mode with agent name provided, output config choices prompt and exit
|
|
87
|
+
if (jsonMode) {
|
|
88
|
+
const configChoices = [
|
|
89
|
+
{ name: 'terminal - safe - devcontainer', value: 'terminal-safe-devcontainer' },
|
|
90
|
+
{ name: 'terminal - safe - host', value: 'terminal-safe-host' },
|
|
91
|
+
{ name: 'terminal - danger - devcontainer', value: 'terminal-danger-devcontainer' },
|
|
92
|
+
{ name: 'terminal - danger - host', value: 'terminal-danger-host' },
|
|
93
|
+
{ name: 'foreground - safe - devcontainer', value: 'foreground-safe-devcontainer' },
|
|
94
|
+
{ name: 'foreground - safe - host', value: 'foreground-safe-host' },
|
|
95
|
+
{ name: 'foreground - danger - devcontainer', value: 'foreground-danger-devcontainer' },
|
|
96
|
+
{ name: 'foreground - danger - host', value: 'foreground-danger-host' },
|
|
97
|
+
];
|
|
98
|
+
outputPromptAsJson({
|
|
99
|
+
...buildPromptConfig('list', 'config', 'Select shell configuration (displayMode-permissionMode-environment):', hasDevcontainer ? configChoices : configChoices.filter(c => c.value.endsWith('-host'))),
|
|
100
|
+
context: { agentName, hasDevcontainer },
|
|
101
|
+
}, createMetadata('agent shell', flags));
|
|
102
|
+
}
|
|
103
|
+
// Prompt for environment
|
|
104
|
+
let environment = 'host';
|
|
105
|
+
if (hasDevcontainer) {
|
|
106
|
+
const { selectedEnvironment } = await inquirer.prompt([
|
|
107
|
+
{
|
|
108
|
+
type: 'list',
|
|
109
|
+
name: 'selectedEnvironment',
|
|
110
|
+
message: 'Where should the shell run?',
|
|
111
|
+
choices: [
|
|
112
|
+
{ name: '🐳 devcontainer (recommended)', value: 'devcontainer' },
|
|
113
|
+
{ name: '💻 host (agent worktree on your machine)', value: 'host' },
|
|
114
|
+
],
|
|
115
|
+
default: 'devcontainer',
|
|
116
|
+
},
|
|
117
|
+
]);
|
|
118
|
+
environment = selectedEnvironment;
|
|
119
|
+
}
|
|
120
|
+
// Prompt for display mode and permission mode
|
|
121
|
+
const { displayMode, permissionMode } = await inquirer.prompt([
|
|
122
|
+
{
|
|
123
|
+
type: 'list',
|
|
124
|
+
name: 'displayMode',
|
|
125
|
+
message: 'How should the shell be opened?',
|
|
126
|
+
choices: [
|
|
127
|
+
{ name: 'terminal - New terminal window', value: 'terminal' },
|
|
128
|
+
{ name: 'foreground - Run in current terminal', value: 'foreground' },
|
|
129
|
+
],
|
|
130
|
+
default: 'terminal',
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
type: 'list',
|
|
134
|
+
name: 'permissionMode',
|
|
135
|
+
message: 'Permission mode for Claude Code:',
|
|
136
|
+
choices: [
|
|
137
|
+
{ name: '🔒 safe - Requires approval for dangerous operations', value: 'safe' },
|
|
138
|
+
{ name: '⚠️ danger - Skip permission checks', value: 'danger' },
|
|
139
|
+
],
|
|
140
|
+
default: 'safe',
|
|
141
|
+
},
|
|
142
|
+
]);
|
|
143
|
+
this.log('');
|
|
144
|
+
this.log(colors.primary(`🐚 Opening shell for agent: ${agentName}`));
|
|
145
|
+
this.log('');
|
|
146
|
+
const dangerMode = permissionMode === 'danger';
|
|
147
|
+
if (environment === 'devcontainer') {
|
|
148
|
+
await this.openDevcontainerShell(workspaceInfo.path, agentDir, agentName, displayMode, dangerMode);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
await this.openHostShell(workspaceInfo.path, agentDir, agentName, displayMode, dangerMode);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async openDevcontainerShell(hqPath, agentDir, agentName, displayMode, dangerMode) {
|
|
155
|
+
// Check Docker is running
|
|
156
|
+
if (!isDockerRunning()) {
|
|
157
|
+
this.error('Docker is not running. Please start Docker Desktop and try again.');
|
|
158
|
+
}
|
|
159
|
+
// Start or ensure container is running
|
|
160
|
+
try {
|
|
161
|
+
execSync(`devcontainer up --workspace-folder "${agentDir}"`, {
|
|
162
|
+
stdio: 'pipe',
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
this.error(`Failed to start devcontainer: ${error instanceof Error ? error.message : error}`);
|
|
167
|
+
}
|
|
168
|
+
// Get container ID
|
|
169
|
+
let containerId = null;
|
|
170
|
+
try {
|
|
171
|
+
containerId = execSync(`docker ps -q --filter "label=devcontainer.local_folder=${agentDir}"`, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// Ignore
|
|
175
|
+
}
|
|
176
|
+
if (!containerId) {
|
|
177
|
+
this.error('Failed to find running container.');
|
|
178
|
+
}
|
|
179
|
+
this.log(colors.success(`✓ Container running: ${containerId}`));
|
|
180
|
+
this.log('');
|
|
181
|
+
// The command to run inside the container
|
|
182
|
+
const claudeArgs = dangerMode ? ['exec', '-it', '-w', '/workspace', containerId, 'claude', '--dangerously-skip-permissions'] : ['exec', '-it', '-w', '/workspace', containerId, 'claude'];
|
|
183
|
+
if (displayMode === 'foreground') {
|
|
184
|
+
// Run Claude directly in current terminal
|
|
185
|
+
this.log(colors.text('Starting Claude Code in devcontainer...'));
|
|
186
|
+
this.log('');
|
|
187
|
+
const child = spawn('docker', claudeArgs, {
|
|
188
|
+
stdio: 'inherit'
|
|
189
|
+
});
|
|
190
|
+
await new Promise((resolve, reject) => {
|
|
191
|
+
child.on('close', (code) => {
|
|
192
|
+
if (code === 0) {
|
|
193
|
+
resolve();
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
reject(new Error(`Claude exited with code ${code}`));
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
child.on('error', reject);
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
// Open in new terminal window using the same method as work start
|
|
204
|
+
const dbPath = path.join(hqPath, '.proletariat', 'workspace.db');
|
|
205
|
+
const db = new Database(dbPath);
|
|
206
|
+
try {
|
|
207
|
+
const terminalApp = await getTerminalApp(db);
|
|
208
|
+
// Create script file (same pattern as runDevcontainerInTerminal)
|
|
209
|
+
const baseDir = path.join(hqPath, '.proletariat', 'scripts');
|
|
210
|
+
fs.mkdirSync(baseDir, { recursive: true });
|
|
211
|
+
const scriptPath = path.join(baseDir, `shell-${agentName}-${Date.now()}.sh`);
|
|
212
|
+
// Launch claude inside the container
|
|
213
|
+
const claudeCmd = dangerMode
|
|
214
|
+
? `docker exec -it -w /workspace ${containerId} claude --dangerously-skip-permissions`
|
|
215
|
+
: `docker exec -it -w /workspace ${containerId} claude`;
|
|
216
|
+
const scriptContent = `#!/bin/bash
|
|
217
|
+
# Shell for agent ${agentName}
|
|
218
|
+
|
|
219
|
+
echo "======================================"
|
|
220
|
+
echo "Agent Shell: ${agentName} (devcontainer)"
|
|
221
|
+
echo "======================================"
|
|
222
|
+
echo ""
|
|
223
|
+
|
|
224
|
+
# Run Claude Code
|
|
225
|
+
${claudeCmd}
|
|
226
|
+
|
|
227
|
+
# Clean up script file
|
|
228
|
+
rm -f "${scriptPath}"
|
|
229
|
+
|
|
230
|
+
# Keep shell open after Claude exits
|
|
231
|
+
exec bash
|
|
232
|
+
`;
|
|
233
|
+
fs.writeFileSync(scriptPath, scriptContent, { mode: 0o755 });
|
|
234
|
+
await this.runInTerminal(terminalApp, scriptPath);
|
|
235
|
+
this.log(colors.success('✓ Opened new terminal window'));
|
|
236
|
+
this.log(colors.textSecondary('An interactive shell is now available in the devcontainer.'));
|
|
237
|
+
}
|
|
238
|
+
finally {
|
|
239
|
+
db.close();
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
async openHostShell(hqPath, agentDir, agentName, displayMode, dangerMode) {
|
|
244
|
+
if (displayMode === 'foreground') {
|
|
245
|
+
this.log(colors.text(`Starting Claude Code in ${agentDir}...`));
|
|
246
|
+
this.log('');
|
|
247
|
+
const claudeArgs = dangerMode ? ['--dangerously-skip-permissions'] : [];
|
|
248
|
+
const child = spawn('claude', claudeArgs, {
|
|
249
|
+
stdio: 'inherit',
|
|
250
|
+
cwd: agentDir,
|
|
251
|
+
});
|
|
252
|
+
await new Promise((resolve, reject) => {
|
|
253
|
+
child.on('close', (code) => {
|
|
254
|
+
if (code === 0) {
|
|
255
|
+
resolve();
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
reject(new Error(`Claude exited with code ${code}`));
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
child.on('error', reject);
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
// Open in new terminal window
|
|
266
|
+
const dbPath = path.join(hqPath, '.proletariat', 'workspace.db');
|
|
267
|
+
const db = new Database(dbPath);
|
|
268
|
+
try {
|
|
269
|
+
const terminalApp = await getTerminalApp(db);
|
|
270
|
+
// Create script file
|
|
271
|
+
const baseDir = path.join(hqPath, '.proletariat', 'scripts');
|
|
272
|
+
fs.mkdirSync(baseDir, { recursive: true });
|
|
273
|
+
const scriptPath = path.join(baseDir, `shell-${agentName}-${Date.now()}.sh`);
|
|
274
|
+
const claudeCmd = dangerMode ? 'claude --dangerously-skip-permissions' : 'claude';
|
|
275
|
+
const scriptContent = `#!/bin/bash
|
|
276
|
+
# Shell for agent ${agentName}
|
|
277
|
+
|
|
278
|
+
echo "======================================"
|
|
279
|
+
echo "Agent Shell: ${agentName} (host)"
|
|
280
|
+
echo "======================================"
|
|
281
|
+
echo ""
|
|
282
|
+
|
|
283
|
+
cd "${agentDir}"
|
|
284
|
+
|
|
285
|
+
# Run Claude Code
|
|
286
|
+
${claudeCmd}
|
|
287
|
+
|
|
288
|
+
# Clean up script file
|
|
289
|
+
rm -f "${scriptPath}"
|
|
290
|
+
|
|
291
|
+
# Keep shell open after Claude exits
|
|
292
|
+
exec bash
|
|
293
|
+
`;
|
|
294
|
+
fs.writeFileSync(scriptPath, scriptContent, { mode: 0o755 });
|
|
295
|
+
await this.runInTerminal(terminalApp, scriptPath);
|
|
296
|
+
this.log(colors.success('✓ Opened new terminal window'));
|
|
297
|
+
this.log(colors.textSecondary(`Directory: ${agentDir}`));
|
|
298
|
+
}
|
|
299
|
+
finally {
|
|
300
|
+
db.close();
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Run a script in a new terminal window using the same method as work start.
|
|
306
|
+
* Uses osascript with proper iTerm/Terminal handling.
|
|
307
|
+
*/
|
|
308
|
+
async runInTerminal(terminalApp, scriptPath) {
|
|
309
|
+
switch (terminalApp) {
|
|
310
|
+
case 'iTerm':
|
|
311
|
+
// Same pattern as runDevcontainerInTerminal in runners.ts
|
|
312
|
+
execSync(`osascript -e '
|
|
313
|
+
tell application "iTerm"
|
|
314
|
+
activate
|
|
315
|
+
tell current window
|
|
316
|
+
set newTab to (create tab with default profile)
|
|
317
|
+
tell current session of newTab
|
|
318
|
+
write text "${scriptPath}"
|
|
319
|
+
end tell
|
|
320
|
+
end tell
|
|
321
|
+
end tell
|
|
322
|
+
'`);
|
|
323
|
+
break;
|
|
324
|
+
case 'Ghostty':
|
|
325
|
+
execSync(`osascript -e '
|
|
326
|
+
tell application "Ghostty"
|
|
327
|
+
activate
|
|
328
|
+
end tell
|
|
329
|
+
tell application "System Events"
|
|
330
|
+
tell process "Ghostty"
|
|
331
|
+
keystroke "t" using command down
|
|
332
|
+
delay 0.3
|
|
333
|
+
keystroke "source ${scriptPath}"
|
|
334
|
+
keystroke return
|
|
335
|
+
end tell
|
|
336
|
+
end tell
|
|
337
|
+
'`);
|
|
338
|
+
break;
|
|
339
|
+
case 'WezTerm':
|
|
340
|
+
execSync(`wezterm cli spawn --new-window -- bash -c 'source ${scriptPath}'`);
|
|
341
|
+
break;
|
|
342
|
+
case 'Kitty':
|
|
343
|
+
execSync(`kitty @ launch --type=tab -- bash -c 'source ${scriptPath}'`);
|
|
344
|
+
break;
|
|
345
|
+
case 'Alacritty':
|
|
346
|
+
execSync(`osascript -e '
|
|
347
|
+
tell application "Alacritty"
|
|
348
|
+
activate
|
|
349
|
+
end tell
|
|
350
|
+
tell application "System Events"
|
|
351
|
+
tell process "Alacritty"
|
|
352
|
+
keystroke "n" using command down
|
|
353
|
+
delay 0.3
|
|
354
|
+
keystroke "source ${scriptPath}"
|
|
355
|
+
keystroke return
|
|
356
|
+
end tell
|
|
357
|
+
end tell
|
|
358
|
+
'`);
|
|
359
|
+
break;
|
|
360
|
+
case 'Terminal':
|
|
361
|
+
default:
|
|
362
|
+
// Same pattern as runDevcontainerInTerminal in runners.ts
|
|
363
|
+
execSync(`osascript -e '
|
|
364
|
+
tell application "Terminal"
|
|
365
|
+
activate
|
|
366
|
+
tell application "System Events"
|
|
367
|
+
tell process "Terminal"
|
|
368
|
+
keystroke "t" using command down
|
|
369
|
+
end tell
|
|
370
|
+
end tell
|
|
371
|
+
delay 0.3
|
|
372
|
+
do script "source ${scriptPath}" in front window
|
|
373
|
+
end tell
|
|
374
|
+
'`);
|
|
375
|
+
break;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class Add extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
names: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
'no-container': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
theme: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
};
|
|
13
|
+
static strict: boolean;
|
|
14
|
+
run(): Promise<void>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { Command, Args, Flags } from '@oclif/core';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import inquirer from 'inquirer';
|
|
4
|
+
import { getWorkspaceInfo, validateAgentNames, addAgentsToWorkspace } from '../../../lib/agents/commands.js';
|
|
5
|
+
import { ensureBuiltinThemes, BUILTIN_THEMES, isValidAgentName, normalizeAgentName } from '../../../lib/themes.js';
|
|
6
|
+
import { getTheme, getThemes, getAvailableThemeNames, markThemeNameUsed, getActiveTheme } from '../../../lib/database/index.js';
|
|
7
|
+
import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../../lib/prompt-json.js';
|
|
8
|
+
export default class Add extends Command {
|
|
9
|
+
static description = 'Add new agents to the workspace';
|
|
10
|
+
static examples = [
|
|
11
|
+
'<%= config.bin %> <%= command.id %> zeus',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> agent-1 agent-2',
|
|
13
|
+
'<%= config.bin %> <%= command.id %> --theme billionaires',
|
|
14
|
+
'<%= config.bin %> <%= command.id %> my-agent --no-container',
|
|
15
|
+
];
|
|
16
|
+
static args = {
|
|
17
|
+
names: Args.string({
|
|
18
|
+
description: 'Agent names to add (space-separated)',
|
|
19
|
+
required: false,
|
|
20
|
+
}),
|
|
21
|
+
};
|
|
22
|
+
static flags = {
|
|
23
|
+
'no-container': Flags.boolean({
|
|
24
|
+
description: 'Skip devcontainer setup (not recommended for autonomous agents)',
|
|
25
|
+
default: false,
|
|
26
|
+
}),
|
|
27
|
+
theme: Flags.string({
|
|
28
|
+
char: 't',
|
|
29
|
+
description: 'Pick agent name(s) from a theme (billionaires, toyotas, companies, or custom)',
|
|
30
|
+
}),
|
|
31
|
+
json: Flags.boolean({
|
|
32
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
33
|
+
default: false,
|
|
34
|
+
}),
|
|
35
|
+
};
|
|
36
|
+
static strict = false; // Allow multiple agent names
|
|
37
|
+
async run() {
|
|
38
|
+
const { argv, flags } = await this.parse(Add);
|
|
39
|
+
// Check if JSON output mode is active
|
|
40
|
+
const jsonMode = shouldOutputJson(flags);
|
|
41
|
+
try {
|
|
42
|
+
// Get workspace information
|
|
43
|
+
const workspaceInfo = getWorkspaceInfo();
|
|
44
|
+
let agentNames = argv;
|
|
45
|
+
let themeId;
|
|
46
|
+
// Theme mode: pick from a specific theme
|
|
47
|
+
if (flags.theme) {
|
|
48
|
+
// Ensure built-in themes are seeded
|
|
49
|
+
ensureBuiltinThemes(workspaceInfo.path);
|
|
50
|
+
// Validate theme exists
|
|
51
|
+
const theme = getTheme(workspaceInfo.path, flags.theme);
|
|
52
|
+
if (!theme) {
|
|
53
|
+
const available = BUILTIN_THEMES.map(t => t.name).join(', ');
|
|
54
|
+
if (jsonMode) {
|
|
55
|
+
outputErrorAsJson('THEME_NOT_FOUND', `Theme "${flags.theme}" not found. Available: ${available}`, createMetadata('agent add', flags));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
this.error(`Theme "${flags.theme}" not found. Available: ${available}`);
|
|
59
|
+
}
|
|
60
|
+
themeId = theme.id;
|
|
61
|
+
// Get available names from theme
|
|
62
|
+
const availableNames = getAvailableThemeNames(workspaceInfo.path, themeId);
|
|
63
|
+
if (availableNames.length === 0) {
|
|
64
|
+
if (jsonMode) {
|
|
65
|
+
outputErrorAsJson('NO_AVAILABLE_NAMES', `No available names in theme "${theme.display_name}". All names are in use.`, createMetadata('agent add', flags));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
this.error(`No available names in theme "${theme.display_name}". All names are in use.`);
|
|
69
|
+
}
|
|
70
|
+
// Build choices once, use for both JSON and interactive modes
|
|
71
|
+
const nameChoices = availableNames.map(name => ({ name, value: name }));
|
|
72
|
+
const selectMessage = `Select agent names from ${theme.display_name}:`;
|
|
73
|
+
// In JSON mode, output theme names selection prompt
|
|
74
|
+
if (jsonMode) {
|
|
75
|
+
outputPromptAsJson(buildPromptConfig('checkbox', 'names', selectMessage, nameChoices), createMetadata('agent add', flags));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Interactive selection from theme
|
|
79
|
+
const { selected } = await inquirer.prompt([{
|
|
80
|
+
type: 'checkbox',
|
|
81
|
+
name: 'selected',
|
|
82
|
+
message: selectMessage,
|
|
83
|
+
choices: nameChoices,
|
|
84
|
+
validate: (input) => input.length > 0 || 'Please select at least one name'
|
|
85
|
+
}]);
|
|
86
|
+
agentNames = selected;
|
|
87
|
+
// Mark selected names as used
|
|
88
|
+
for (const name of agentNames) {
|
|
89
|
+
markThemeNameUsed(workspaceInfo.path, themeId, name);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Interactive mode: show names from workspace's active theme
|
|
93
|
+
else if (agentNames.length === 0) {
|
|
94
|
+
// Ensure built-in themes are seeded
|
|
95
|
+
ensureBuiltinThemes(workspaceInfo.path);
|
|
96
|
+
// Check if workspace has an active theme
|
|
97
|
+
const activeTheme = getActiveTheme(workspaceInfo.path);
|
|
98
|
+
if (activeTheme) {
|
|
99
|
+
// Workspace has a theme - show names from it directly
|
|
100
|
+
themeId = activeTheme.id;
|
|
101
|
+
const availableNames = getAvailableThemeNames(workspaceInfo.path, activeTheme.id);
|
|
102
|
+
if (availableNames.length === 0) {
|
|
103
|
+
if (jsonMode) {
|
|
104
|
+
outputErrorAsJson('NO_AVAILABLE_NAMES', `No available names in ${activeTheme.display_name}. All names are in use.`, createMetadata('agent add', flags));
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
this.log(chalk.yellow(`No available names in ${activeTheme.display_name}. All names are in use.`));
|
|
108
|
+
this.log(chalk.blue('Use --theme to pick from a different theme, or enter names directly.'));
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
// Build choices once, use for both JSON and interactive modes
|
|
112
|
+
const nameChoices = [
|
|
113
|
+
...availableNames.map(name => ({ name, value: name })),
|
|
114
|
+
{ name: 'Enter custom name(s)...', value: '__custom__' },
|
|
115
|
+
];
|
|
116
|
+
const selectMessage = `Select agents from ${activeTheme.display_name}:`;
|
|
117
|
+
// In JSON mode, output agent names selection prompt
|
|
118
|
+
if (jsonMode) {
|
|
119
|
+
outputPromptAsJson(buildPromptConfig('checkbox', 'names', selectMessage, nameChoices), createMetadata('agent add', flags));
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
// Add separator before custom option for interactive mode
|
|
123
|
+
const choices = [
|
|
124
|
+
...nameChoices.slice(0, -1),
|
|
125
|
+
new inquirer.Separator(),
|
|
126
|
+
{ name: chalk.blue(nameChoices[nameChoices.length - 1].name), value: nameChoices[nameChoices.length - 1].value }
|
|
127
|
+
];
|
|
128
|
+
const { selected } = await inquirer.prompt([{
|
|
129
|
+
type: 'checkbox',
|
|
130
|
+
name: 'selected',
|
|
131
|
+
message: selectMessage,
|
|
132
|
+
choices,
|
|
133
|
+
pageSize: 20,
|
|
134
|
+
validate: (input) => input.length > 0 || 'Please select at least one name'
|
|
135
|
+
}]);
|
|
136
|
+
// Check if custom was selected
|
|
137
|
+
const hasCustom = selected.includes('__custom__');
|
|
138
|
+
const themedSelections = selected.filter((s) => s !== '__custom__');
|
|
139
|
+
if (hasCustom) {
|
|
140
|
+
const { customNames } = await inquirer.prompt([{
|
|
141
|
+
type: 'input',
|
|
142
|
+
name: 'customNames',
|
|
143
|
+
message: 'Enter custom agent names (space-separated):',
|
|
144
|
+
validate: (input) => {
|
|
145
|
+
if (!input.trim())
|
|
146
|
+
return 'Please enter at least one name';
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
}]);
|
|
150
|
+
const rawNames = customNames.trim().split(/\s+/);
|
|
151
|
+
const normalizedCustom = rawNames.map((n) => normalizeAgentName(n)).filter((n) => n && isValidAgentName(n));
|
|
152
|
+
agentNames.push(...normalizedCustom);
|
|
153
|
+
}
|
|
154
|
+
if (themedSelections.length > 0) {
|
|
155
|
+
agentNames.push(...themedSelections);
|
|
156
|
+
// Mark themed names as used
|
|
157
|
+
for (const name of themedSelections) {
|
|
158
|
+
markThemeNameUsed(workspaceInfo.path, activeTheme.id, name);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
// No active theme - prompt to pick one or enter custom names
|
|
164
|
+
const themes = getThemes(workspaceInfo.path);
|
|
165
|
+
const themesWithNames = themes.map(t => ({
|
|
166
|
+
theme: t,
|
|
167
|
+
availableCount: getAvailableThemeNames(workspaceInfo.path, t.id).length
|
|
168
|
+
})).filter(t => t.availableCount > 0);
|
|
169
|
+
// Build choices once, use for both JSON and interactive modes
|
|
170
|
+
const themeChoices = [
|
|
171
|
+
...themesWithNames.map(({ theme, availableCount }) => ({
|
|
172
|
+
name: `${theme.display_name} (${availableCount} available)`,
|
|
173
|
+
value: theme.id
|
|
174
|
+
})),
|
|
175
|
+
{ name: 'Enter custom name(s)', value: '__custom__' },
|
|
176
|
+
];
|
|
177
|
+
const selectMessage = 'No theme set. Select a theme or enter custom names:';
|
|
178
|
+
// In JSON mode, output theme selection prompt
|
|
179
|
+
if (jsonMode) {
|
|
180
|
+
outputPromptAsJson(buildPromptConfig('list', 'theme', selectMessage, themeChoices), createMetadata('agent add', flags));
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
// Add separator and styling for interactive mode
|
|
184
|
+
const interactiveChoices = [
|
|
185
|
+
...themeChoices.slice(0, -1).map(c => ({
|
|
186
|
+
name: c.name.replace(/\((\d+) available\)/, chalk.dim(`($1 available)`)),
|
|
187
|
+
value: c.value
|
|
188
|
+
})),
|
|
189
|
+
new inquirer.Separator(),
|
|
190
|
+
{ name: chalk.blue(themeChoices[themeChoices.length - 1].name), value: themeChoices[themeChoices.length - 1].value }
|
|
191
|
+
];
|
|
192
|
+
const { selectedTheme } = await inquirer.prompt([{
|
|
193
|
+
type: 'list',
|
|
194
|
+
name: 'selectedTheme',
|
|
195
|
+
message: selectMessage,
|
|
196
|
+
choices: interactiveChoices
|
|
197
|
+
}]);
|
|
198
|
+
if (selectedTheme === '__custom__') {
|
|
199
|
+
const { customNames } = await inquirer.prompt([{
|
|
200
|
+
type: 'input',
|
|
201
|
+
name: 'customNames',
|
|
202
|
+
message: 'Enter custom agent names (space-separated):',
|
|
203
|
+
validate: (input) => {
|
|
204
|
+
if (!input.trim())
|
|
205
|
+
return 'Please enter at least one name';
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
208
|
+
}]);
|
|
209
|
+
const rawNames = customNames.trim().split(/\s+/);
|
|
210
|
+
const normalizedCustom = rawNames.map((n) => ({
|
|
211
|
+
original: n,
|
|
212
|
+
normalized: normalizeAgentName(n)
|
|
213
|
+
})).filter((x) => x.normalized && isValidAgentName(x.normalized));
|
|
214
|
+
const changed = normalizedCustom.filter((x) => x.original !== x.normalized);
|
|
215
|
+
if (changed.length > 0) {
|
|
216
|
+
this.log(chalk.blue('Normalized names:'));
|
|
217
|
+
for (const { original, normalized } of changed) {
|
|
218
|
+
this.log(chalk.dim(` ${original} → ${normalized}`));
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
agentNames = normalizedCustom.map((x) => x.normalized);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
themeId = selectedTheme;
|
|
225
|
+
const theme = getTheme(workspaceInfo.path, selectedTheme);
|
|
226
|
+
const availableNames = getAvailableThemeNames(workspaceInfo.path, selectedTheme);
|
|
227
|
+
const { selected } = await inquirer.prompt([{
|
|
228
|
+
type: 'checkbox',
|
|
229
|
+
name: 'selected',
|
|
230
|
+
message: `Select agents from ${theme?.display_name}:`,
|
|
231
|
+
choices: availableNames.map(name => ({ name, value: name })),
|
|
232
|
+
pageSize: 20,
|
|
233
|
+
validate: (input) => input.length > 0 || 'Please select at least one name'
|
|
234
|
+
}]);
|
|
235
|
+
agentNames = selected;
|
|
236
|
+
for (const name of agentNames) {
|
|
237
|
+
markThemeNameUsed(workspaceInfo.path, selectedTheme, name);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (agentNames.length === 0) {
|
|
242
|
+
this.log(chalk.yellow('No agents specified.'));
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// Validate agent names (skip for theme mode - already validated)
|
|
247
|
+
if (!flags.theme) {
|
|
248
|
+
const { valid, invalid } = validateAgentNames(agentNames);
|
|
249
|
+
if (invalid.length > 0) {
|
|
250
|
+
this.log(chalk.red(`Invalid agent names: ${invalid.join(', ')}`));
|
|
251
|
+
this.log(chalk.yellow('Agent names must be lowercase alphanumeric with optional hyphens/underscores.'));
|
|
252
|
+
if (valid.length === 0) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
this.log(chalk.blue(`Proceeding with valid agents: ${valid.join(', ')}`));
|
|
256
|
+
}
|
|
257
|
+
agentNames = valid;
|
|
258
|
+
}
|
|
259
|
+
// Add agents to workspace
|
|
260
|
+
const addedAgents = await addAgentsToWorkspace(workspaceInfo, agentNames, {
|
|
261
|
+
skipDevcontainer: flags['no-container'],
|
|
262
|
+
themeId,
|
|
263
|
+
});
|
|
264
|
+
if (addedAgents.length === 0) {
|
|
265
|
+
this.log(chalk.yellow('No new agents to add. All specified agents already exist.'));
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
this.log(chalk.green(`\n Successfully added ${addedAgents.length} agent(s): ${addedAgents.join(', ')}`));
|
|
269
|
+
if (themeId) {
|
|
270
|
+
const theme = getTheme(workspaceInfo.path, themeId);
|
|
271
|
+
this.log(chalk.blue(` From theme: ${theme?.display_name || themeId}`));
|
|
272
|
+
}
|
|
273
|
+
if (!flags['no-container']) {
|
|
274
|
+
this.log(chalk.blue(' Devcontainer config created for sandboxed execution'));
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
this.error(error instanceof Error ? error.message : String(error));
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|