@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,541 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution Configuration Storage
|
|
3
|
+
*
|
|
4
|
+
* Stores user preferences for execution settings in the workspace SQLite database.
|
|
5
|
+
* Uses the workspace_settings table (not pmo_settings - execution is workspace-level).
|
|
6
|
+
*/
|
|
7
|
+
import inquirer from 'inquirer';
|
|
8
|
+
import { DEFAULT_EXECUTION_CONFIG } from './types.js';
|
|
9
|
+
import { isGHInstalled, isGHAuthenticated } from '../pr/index.js';
|
|
10
|
+
import { execSync } from 'child_process';
|
|
11
|
+
const SETTINGS_TABLE = 'workspace_settings';
|
|
12
|
+
// Config keys stored in workspace_settings table
|
|
13
|
+
const CONFIG_KEYS = {
|
|
14
|
+
terminalApp: 'execution.terminal.app',
|
|
15
|
+
shell: 'execution.shell',
|
|
16
|
+
defaultMode: 'execution.default_mode',
|
|
17
|
+
defaultExecutor: 'execution.default_executor',
|
|
18
|
+
autoExecute: 'execution.auto_execute',
|
|
19
|
+
tmuxSession: 'execution.tmux.session',
|
|
20
|
+
tmuxLayout: 'execution.tmux.layout',
|
|
21
|
+
tmuxControlMode: 'execution.tmux.control_mode',
|
|
22
|
+
dockerImage: 'execution.docker.image',
|
|
23
|
+
dockerNetwork: 'execution.docker.network',
|
|
24
|
+
dockerMemory: 'execution.docker.memory',
|
|
25
|
+
dockerCpus: 'execution.docker.cpus',
|
|
26
|
+
vmDefaultHost: 'execution.vm.default_host',
|
|
27
|
+
vmUser: 'execution.vm.user',
|
|
28
|
+
vmKeyPath: 'execution.vm.key_path',
|
|
29
|
+
vmSyncMethod: 'execution.vm.sync_method',
|
|
30
|
+
coderName: 'coder.name',
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Get a setting value from the database
|
|
34
|
+
*/
|
|
35
|
+
function getSetting(db, key) {
|
|
36
|
+
const row = db
|
|
37
|
+
.prepare(`SELECT value FROM ${SETTINGS_TABLE} WHERE key = ?`)
|
|
38
|
+
.get(key);
|
|
39
|
+
return row?.value ?? null;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Set a setting value in the database
|
|
43
|
+
*/
|
|
44
|
+
function setSetting(db, key, value) {
|
|
45
|
+
db.prepare(`
|
|
46
|
+
INSERT INTO ${SETTINGS_TABLE} (key, value)
|
|
47
|
+
VALUES (?, ?)
|
|
48
|
+
ON CONFLICT(key) DO UPDATE SET value = excluded.value
|
|
49
|
+
`).run(key, value);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Load execution config from database, merging with defaults
|
|
53
|
+
*/
|
|
54
|
+
export function loadExecutionConfig(db) {
|
|
55
|
+
const config = { ...DEFAULT_EXECUTION_CONFIG };
|
|
56
|
+
// Load terminal app
|
|
57
|
+
const terminalApp = getSetting(db, CONFIG_KEYS.terminalApp);
|
|
58
|
+
if (terminalApp) {
|
|
59
|
+
config.terminal = { app: terminalApp };
|
|
60
|
+
}
|
|
61
|
+
// Load shell
|
|
62
|
+
const shell = getSetting(db, CONFIG_KEYS.shell);
|
|
63
|
+
if (shell) {
|
|
64
|
+
config.shell = shell;
|
|
65
|
+
}
|
|
66
|
+
// Load default environment
|
|
67
|
+
const defaultEnvironment = getSetting(db, CONFIG_KEYS.defaultMode);
|
|
68
|
+
if (defaultEnvironment) {
|
|
69
|
+
config.defaultEnvironment = defaultEnvironment;
|
|
70
|
+
}
|
|
71
|
+
// Load default executor
|
|
72
|
+
const defaultExecutor = getSetting(db, CONFIG_KEYS.defaultExecutor);
|
|
73
|
+
if (defaultExecutor) {
|
|
74
|
+
config.defaultExecutor = defaultExecutor;
|
|
75
|
+
}
|
|
76
|
+
// Load auto execute
|
|
77
|
+
const autoExecute = getSetting(db, CONFIG_KEYS.autoExecute);
|
|
78
|
+
if (autoExecute !== null) {
|
|
79
|
+
config.autoExecute = autoExecute === 'true';
|
|
80
|
+
}
|
|
81
|
+
// Load tmux settings
|
|
82
|
+
const tmuxSession = getSetting(db, CONFIG_KEYS.tmuxSession);
|
|
83
|
+
if (tmuxSession) {
|
|
84
|
+
config.tmux = { ...config.tmux, session: tmuxSession };
|
|
85
|
+
}
|
|
86
|
+
const tmuxLayout = getSetting(db, CONFIG_KEYS.tmuxLayout);
|
|
87
|
+
if (tmuxLayout) {
|
|
88
|
+
config.tmux = { ...config.tmux, layout: tmuxLayout };
|
|
89
|
+
}
|
|
90
|
+
const tmuxControlMode = getSetting(db, CONFIG_KEYS.tmuxControlMode);
|
|
91
|
+
if (tmuxControlMode !== null) {
|
|
92
|
+
config.tmux = { ...config.tmux, controlMode: tmuxControlMode === 'true' };
|
|
93
|
+
}
|
|
94
|
+
// Load docker settings
|
|
95
|
+
const dockerImage = getSetting(db, CONFIG_KEYS.dockerImage);
|
|
96
|
+
if (dockerImage) {
|
|
97
|
+
config.docker = { ...config.docker, image: dockerImage };
|
|
98
|
+
}
|
|
99
|
+
const dockerNetwork = getSetting(db, CONFIG_KEYS.dockerNetwork);
|
|
100
|
+
if (dockerNetwork) {
|
|
101
|
+
config.docker = { ...config.docker, network: dockerNetwork };
|
|
102
|
+
}
|
|
103
|
+
const dockerMemory = getSetting(db, CONFIG_KEYS.dockerMemory);
|
|
104
|
+
if (dockerMemory) {
|
|
105
|
+
config.docker = { ...config.docker, memory: dockerMemory };
|
|
106
|
+
}
|
|
107
|
+
const dockerCpus = getSetting(db, CONFIG_KEYS.dockerCpus);
|
|
108
|
+
if (dockerCpus) {
|
|
109
|
+
config.docker = { ...config.docker, cpus: parseInt(dockerCpus, 10) };
|
|
110
|
+
}
|
|
111
|
+
// Load VM settings
|
|
112
|
+
const vmDefaultHost = getSetting(db, CONFIG_KEYS.vmDefaultHost);
|
|
113
|
+
if (vmDefaultHost) {
|
|
114
|
+
config.vm = { ...config.vm, defaultHost: vmDefaultHost };
|
|
115
|
+
}
|
|
116
|
+
const vmUser = getSetting(db, CONFIG_KEYS.vmUser);
|
|
117
|
+
if (vmUser) {
|
|
118
|
+
config.vm = { ...config.vm, user: vmUser };
|
|
119
|
+
}
|
|
120
|
+
const vmKeyPath = getSetting(db, CONFIG_KEYS.vmKeyPath);
|
|
121
|
+
if (vmKeyPath) {
|
|
122
|
+
config.vm = { ...config.vm, keyPath: vmKeyPath };
|
|
123
|
+
}
|
|
124
|
+
const vmSyncMethod = getSetting(db, CONFIG_KEYS.vmSyncMethod);
|
|
125
|
+
if (vmSyncMethod) {
|
|
126
|
+
config.vm = { ...config.vm, syncMethod: vmSyncMethod };
|
|
127
|
+
}
|
|
128
|
+
return config;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Save a single execution config setting to database
|
|
132
|
+
*/
|
|
133
|
+
export function saveExecutionSetting(db, key, value) {
|
|
134
|
+
setSetting(db, CONFIG_KEYS[key], value);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Save terminal app preference
|
|
138
|
+
*/
|
|
139
|
+
export function saveTerminalApp(db, app) {
|
|
140
|
+
setSetting(db, CONFIG_KEYS.terminalApp, app);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Save shell preference
|
|
144
|
+
*/
|
|
145
|
+
export function saveShell(db, shell) {
|
|
146
|
+
setSetting(db, CONFIG_KEYS.shell, shell);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Save tmux control mode preference.
|
|
150
|
+
* When enabled and using iTerm, tmux -CC is used for native tab integration.
|
|
151
|
+
*/
|
|
152
|
+
export function saveTmuxControlMode(db, enabled) {
|
|
153
|
+
setSetting(db, CONFIG_KEYS.tmuxControlMode, enabled.toString());
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Check if terminal app preference has been set
|
|
157
|
+
*/
|
|
158
|
+
export function hasTerminalPreference(db) {
|
|
159
|
+
return getSetting(db, CONFIG_KEYS.terminalApp) !== null;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Check if shell preference has been set
|
|
163
|
+
*/
|
|
164
|
+
export function hasShellPreference(db) {
|
|
165
|
+
return getSetting(db, CONFIG_KEYS.shell) !== null;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Auto-detect terminal app from environment.
|
|
169
|
+
* Uses TERM_PROGRAM env var set by most terminal emulators.
|
|
170
|
+
*/
|
|
171
|
+
export function detectTerminalApp() {
|
|
172
|
+
const termProgram = process.env.TERM_PROGRAM?.toLowerCase() || '';
|
|
173
|
+
// Map TERM_PROGRAM values to our TerminalApp type
|
|
174
|
+
if (termProgram === 'iterm.app')
|
|
175
|
+
return 'iTerm';
|
|
176
|
+
if (termProgram === 'apple_terminal')
|
|
177
|
+
return 'Terminal';
|
|
178
|
+
if (termProgram === 'alacritty')
|
|
179
|
+
return 'Alacritty';
|
|
180
|
+
if (termProgram === 'wezterm')
|
|
181
|
+
return 'WezTerm';
|
|
182
|
+
if (termProgram === 'ghostty')
|
|
183
|
+
return 'Ghostty';
|
|
184
|
+
if (termProgram === 'kitty')
|
|
185
|
+
return 'Kitty';
|
|
186
|
+
if (termProgram === 'warp')
|
|
187
|
+
return 'Warp';
|
|
188
|
+
// Also check TERMINAL_EMULATOR for some apps
|
|
189
|
+
const termEmulator = process.env.TERMINAL_EMULATOR?.toLowerCase() || '';
|
|
190
|
+
if (termEmulator.includes('jetbrains'))
|
|
191
|
+
return 'tmux'; // IDE terminal, fall back to tmux
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Auto-detect shell from environment.
|
|
196
|
+
* Uses SHELL env var.
|
|
197
|
+
*/
|
|
198
|
+
export function detectShell() {
|
|
199
|
+
const shellPath = process.env.SHELL || '';
|
|
200
|
+
const shellName = shellPath.split('/').pop()?.toLowerCase() || '';
|
|
201
|
+
if (shellName === 'zsh')
|
|
202
|
+
return 'zsh';
|
|
203
|
+
if (shellName === 'bash')
|
|
204
|
+
return 'bash';
|
|
205
|
+
if (shellName === 'fish')
|
|
206
|
+
return 'fish';
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Prompt user for terminal app preference (first-time setup)
|
|
211
|
+
*/
|
|
212
|
+
export async function promptTerminalPreference(db) {
|
|
213
|
+
const { terminalApp } = await inquirer.prompt([
|
|
214
|
+
{
|
|
215
|
+
type: 'list',
|
|
216
|
+
name: 'terminalApp',
|
|
217
|
+
message: 'Which terminal app would you like to use for agent execution?',
|
|
218
|
+
choices: [
|
|
219
|
+
{ name: 'iTerm', value: 'iTerm' },
|
|
220
|
+
{ name: 'Terminal.app (macOS default)', value: 'Terminal' },
|
|
221
|
+
{ name: 'Alacritty', value: 'Alacritty' },
|
|
222
|
+
{ name: 'Ghostty', value: 'Ghostty' },
|
|
223
|
+
{ name: 'Kitty', value: 'Kitty' },
|
|
224
|
+
{ name: 'tmux', value: 'tmux' },
|
|
225
|
+
{ name: 'Warp', value: 'Warp' },
|
|
226
|
+
{ name: 'WezTerm', value: 'WezTerm' },
|
|
227
|
+
],
|
|
228
|
+
default: 'iTerm',
|
|
229
|
+
},
|
|
230
|
+
]);
|
|
231
|
+
// Save preference to database
|
|
232
|
+
saveTerminalApp(db, terminalApp);
|
|
233
|
+
// If iTerm selected, prompt for control mode preference
|
|
234
|
+
if (terminalApp === 'iTerm') {
|
|
235
|
+
await promptTmuxControlModePreference(db);
|
|
236
|
+
}
|
|
237
|
+
return terminalApp;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Prompt user for tmux control mode preference (iTerm only).
|
|
241
|
+
* When enabled, tmux -CC is used for native iTerm tab/window integration.
|
|
242
|
+
*/
|
|
243
|
+
export async function promptTmuxControlModePreference(db) {
|
|
244
|
+
const { useControlMode } = await inquirer.prompt([
|
|
245
|
+
{
|
|
246
|
+
type: 'list',
|
|
247
|
+
name: 'useControlMode',
|
|
248
|
+
message: 'iTerm tmux integration mode:',
|
|
249
|
+
choices: [
|
|
250
|
+
{
|
|
251
|
+
name: 'Native tabs (tmux -CC) - iTerm handles windows/scrollback natively (Recommended)',
|
|
252
|
+
value: true,
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
name: 'Standard tmux - Traditional tmux interface inside iTerm',
|
|
256
|
+
value: false,
|
|
257
|
+
},
|
|
258
|
+
],
|
|
259
|
+
default: true,
|
|
260
|
+
},
|
|
261
|
+
]);
|
|
262
|
+
// Save preference to database
|
|
263
|
+
saveTmuxControlMode(db, useControlMode);
|
|
264
|
+
return useControlMode;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Get terminal app, auto-detecting or prompting if not set
|
|
268
|
+
*/
|
|
269
|
+
export async function getTerminalApp(db) {
|
|
270
|
+
const config = loadExecutionConfig(db);
|
|
271
|
+
// If already set, return it
|
|
272
|
+
if (hasTerminalPreference(db)) {
|
|
273
|
+
return config.terminal.app;
|
|
274
|
+
}
|
|
275
|
+
// Try auto-detection first
|
|
276
|
+
const detected = detectTerminalApp();
|
|
277
|
+
if (detected) {
|
|
278
|
+
saveTerminalApp(db, detected);
|
|
279
|
+
// If iTerm detected, also enable control mode by default (best experience)
|
|
280
|
+
if (detected === 'iTerm') {
|
|
281
|
+
saveTmuxControlMode(db, true);
|
|
282
|
+
}
|
|
283
|
+
return detected;
|
|
284
|
+
}
|
|
285
|
+
// Fall back to prompting user
|
|
286
|
+
return promptTerminalPreference(db);
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Prompt user for shell preference (first-time setup)
|
|
290
|
+
*/
|
|
291
|
+
export async function promptShellPreference(db) {
|
|
292
|
+
const { shell } = await inquirer.prompt([
|
|
293
|
+
{
|
|
294
|
+
type: 'list',
|
|
295
|
+
name: 'shell',
|
|
296
|
+
message: 'Which shell do you use?',
|
|
297
|
+
choices: [
|
|
298
|
+
{ name: 'zsh (macOS default)', value: 'zsh' },
|
|
299
|
+
{ name: 'bash', value: 'bash' },
|
|
300
|
+
{ name: 'fish', value: 'fish' },
|
|
301
|
+
],
|
|
302
|
+
default: 'zsh',
|
|
303
|
+
},
|
|
304
|
+
]);
|
|
305
|
+
// Save preference to database
|
|
306
|
+
saveShell(db, shell);
|
|
307
|
+
return shell;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Get shell, auto-detecting or prompting if not set
|
|
311
|
+
*/
|
|
312
|
+
export async function getShell(db) {
|
|
313
|
+
const config = loadExecutionConfig(db);
|
|
314
|
+
// If already set, return it
|
|
315
|
+
if (hasShellPreference(db)) {
|
|
316
|
+
return config.shell;
|
|
317
|
+
}
|
|
318
|
+
// Try auto-detection first
|
|
319
|
+
const detected = detectShell();
|
|
320
|
+
if (detected) {
|
|
321
|
+
saveShell(db, detected);
|
|
322
|
+
return detected;
|
|
323
|
+
}
|
|
324
|
+
// Fall back to prompting user
|
|
325
|
+
return promptShellPreference(db);
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Prompt for all execution settings in a consistent way.
|
|
329
|
+
* Used by work start, work spawn, and work watch commands.
|
|
330
|
+
*/
|
|
331
|
+
export async function promptExecutionSettings(db, options) {
|
|
332
|
+
const { displayMode, environment, log = () => { } } = options;
|
|
333
|
+
// Load execution config from database
|
|
334
|
+
const executionConfig = loadExecutionConfig(db);
|
|
335
|
+
// If terminal display mode, ensure terminal and shell preferences are set (prompts on first use)
|
|
336
|
+
const needsTerminalConfig = displayMode === 'terminal';
|
|
337
|
+
if (needsTerminalConfig) {
|
|
338
|
+
const needsTerminal = !hasTerminalPreference(db);
|
|
339
|
+
const needsShell = !hasShellPreference(db);
|
|
340
|
+
// First-time setup header
|
|
341
|
+
if ((needsTerminal || needsShell) && !options.reconfigure) {
|
|
342
|
+
log('First-time execution setup');
|
|
343
|
+
log('');
|
|
344
|
+
}
|
|
345
|
+
let terminalApp;
|
|
346
|
+
let shell;
|
|
347
|
+
if (options.reconfigure) {
|
|
348
|
+
terminalApp = await promptTerminalPreference(db);
|
|
349
|
+
shell = await promptShellPreference(db);
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
terminalApp = await getTerminalApp(db);
|
|
353
|
+
shell = await getShell(db);
|
|
354
|
+
}
|
|
355
|
+
executionConfig.terminal.app = terminalApp;
|
|
356
|
+
executionConfig.shell = shell;
|
|
357
|
+
}
|
|
358
|
+
// Prompt for output mode (interactive vs print)
|
|
359
|
+
// Only show this for terminal mode where streaming makes sense (not background)
|
|
360
|
+
let outputMode = options.outputMode ?? DEFAULT_EXECUTION_CONFIG.outputMode;
|
|
361
|
+
const streamingDisplayModes = ['terminal'];
|
|
362
|
+
if (options.outputMode === undefined && streamingDisplayModes.includes(displayMode)) {
|
|
363
|
+
const { selectedOutputMode } = await inquirer.prompt([
|
|
364
|
+
{
|
|
365
|
+
type: 'list',
|
|
366
|
+
name: 'selectedOutputMode',
|
|
367
|
+
message: 'How should Claude display output?',
|
|
368
|
+
choices: [
|
|
369
|
+
{ name: 'interactive - Watch Claude work in real-time (streaming UI)', value: 'interactive' },
|
|
370
|
+
{ name: 'print - Show final result only (better for logs)', value: 'print' },
|
|
371
|
+
],
|
|
372
|
+
default: 'interactive',
|
|
373
|
+
},
|
|
374
|
+
]);
|
|
375
|
+
outputMode = selectedOutputMode;
|
|
376
|
+
}
|
|
377
|
+
executionConfig.outputMode = outputMode;
|
|
378
|
+
// Prompt for permissions mode (unless flag override is provided)
|
|
379
|
+
let skipPermissions = options.skipPermissions ?? false;
|
|
380
|
+
if (options.skipPermissions === undefined) {
|
|
381
|
+
const containerNote = (environment === 'devcontainer' || environment === 'docker')
|
|
382
|
+
? ' (container provides additional isolation)'
|
|
383
|
+
: '';
|
|
384
|
+
const { permissionMode } = await inquirer.prompt([
|
|
385
|
+
{
|
|
386
|
+
type: 'list',
|
|
387
|
+
name: 'permissionMode',
|
|
388
|
+
message: `Permission mode for Claude Code${containerNote}:`,
|
|
389
|
+
choices: [
|
|
390
|
+
{ name: '🔒 safe - Requires approval for dangerous operations (recommended)', value: 'safe' },
|
|
391
|
+
{ name: '⚠️ danger - Skip permission checks (--dangerously-skip-permissions)', value: 'danger' },
|
|
392
|
+
],
|
|
393
|
+
default: 'safe',
|
|
394
|
+
},
|
|
395
|
+
]);
|
|
396
|
+
skipPermissions = permissionMode === 'danger';
|
|
397
|
+
}
|
|
398
|
+
// Prompt for PR creation when work is complete (unless flag override is provided)
|
|
399
|
+
let createPR = options.createPR ?? false;
|
|
400
|
+
if (options.createPR === undefined) {
|
|
401
|
+
const ghAvailable = isGHInstalled() && isGHAuthenticated();
|
|
402
|
+
if (ghAvailable) {
|
|
403
|
+
const { prChoice } = await inquirer.prompt([
|
|
404
|
+
{
|
|
405
|
+
type: 'list',
|
|
406
|
+
name: 'prChoice',
|
|
407
|
+
message: 'Create a pull request when work is ready?',
|
|
408
|
+
choices: [
|
|
409
|
+
{ name: '✓ Yes - Create PR when running `prlt work ready`', value: 'yes' },
|
|
410
|
+
{ name: '✗ No - Just move ticket to review (can create PR later)', value: 'no' },
|
|
411
|
+
],
|
|
412
|
+
default: 'yes',
|
|
413
|
+
},
|
|
414
|
+
]);
|
|
415
|
+
createPR = prChoice === 'yes';
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return {
|
|
419
|
+
executionConfig,
|
|
420
|
+
skipPermissions,
|
|
421
|
+
createPR,
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
// =============================================================================
|
|
425
|
+
// Coder Name Configuration
|
|
426
|
+
// =============================================================================
|
|
427
|
+
/**
|
|
428
|
+
* Get GitHub username via gh CLI.
|
|
429
|
+
* Returns null if gh is not installed or not authenticated.
|
|
430
|
+
*/
|
|
431
|
+
export function getGitHubUsername() {
|
|
432
|
+
try {
|
|
433
|
+
const username = execSync('gh api user --jq .login', {
|
|
434
|
+
encoding: 'utf-8',
|
|
435
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
436
|
+
}).trim();
|
|
437
|
+
return username || null;
|
|
438
|
+
}
|
|
439
|
+
catch {
|
|
440
|
+
return null;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Get git config user.name as default coder name.
|
|
445
|
+
* Returns null if git user.name is not configured.
|
|
446
|
+
*/
|
|
447
|
+
export function getGitUserName() {
|
|
448
|
+
try {
|
|
449
|
+
const userName = execSync('git config user.name', {
|
|
450
|
+
encoding: 'utf-8',
|
|
451
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
452
|
+
}).trim();
|
|
453
|
+
return userName || null;
|
|
454
|
+
}
|
|
455
|
+
catch {
|
|
456
|
+
return null;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Get the configured coder name from the database.
|
|
461
|
+
* Returns null if not configured.
|
|
462
|
+
*/
|
|
463
|
+
export function getCoderName(db) {
|
|
464
|
+
return getSetting(db, CONFIG_KEYS.coderName);
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Save coder name preference to database.
|
|
468
|
+
*/
|
|
469
|
+
export function saveCoderName(db, name) {
|
|
470
|
+
setSetting(db, CONFIG_KEYS.coderName, name);
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Check if coder name has been configured.
|
|
474
|
+
*/
|
|
475
|
+
export function hasCoderName(db) {
|
|
476
|
+
return getSetting(db, CONFIG_KEYS.coderName) !== null;
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Prompt user for coder name preference (first-time setup).
|
|
480
|
+
* Uses git config user.name as default if available.
|
|
481
|
+
*/
|
|
482
|
+
export async function promptCoderName(db) {
|
|
483
|
+
const gitUserName = getGitUserName();
|
|
484
|
+
const defaultName = gitUserName
|
|
485
|
+
? gitUserName.toLowerCase().replace(/[^a-z0-9]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '')
|
|
486
|
+
: '';
|
|
487
|
+
const { coderName } = await inquirer.prompt([
|
|
488
|
+
{
|
|
489
|
+
type: 'input',
|
|
490
|
+
name: 'coderName',
|
|
491
|
+
message: 'Enter your coder name (used in branch names):',
|
|
492
|
+
default: defaultName || undefined,
|
|
493
|
+
validate: (input) => {
|
|
494
|
+
if (!input.trim()) {
|
|
495
|
+
return 'Coder name is required';
|
|
496
|
+
}
|
|
497
|
+
// Validate it's kebab-case compatible
|
|
498
|
+
const normalized = input.toLowerCase().replace(/[^a-z0-9-]/g, '');
|
|
499
|
+
if (normalized !== input) {
|
|
500
|
+
return 'Coder name must be lowercase letters, numbers, and hyphens only';
|
|
501
|
+
}
|
|
502
|
+
return true;
|
|
503
|
+
},
|
|
504
|
+
},
|
|
505
|
+
]);
|
|
506
|
+
// Save preference to database
|
|
507
|
+
saveCoderName(db, coderName);
|
|
508
|
+
return coderName;
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Get coder name, auto-detecting from GitHub if not set.
|
|
512
|
+
* Priority: saved setting > GitHub username > git user.name > prompt
|
|
513
|
+
*/
|
|
514
|
+
export async function getOrPromptCoderName(db) {
|
|
515
|
+
// If already set, return it
|
|
516
|
+
const existing = getCoderName(db);
|
|
517
|
+
if (existing) {
|
|
518
|
+
return existing;
|
|
519
|
+
}
|
|
520
|
+
// Try GitHub username first (most reliable for branch naming)
|
|
521
|
+
const ghUsername = getGitHubUsername();
|
|
522
|
+
if (ghUsername) {
|
|
523
|
+
saveCoderName(db, ghUsername);
|
|
524
|
+
return ghUsername;
|
|
525
|
+
}
|
|
526
|
+
// Fall back to git user.name (normalized to kebab-case)
|
|
527
|
+
const gitUserName = getGitUserName();
|
|
528
|
+
if (gitUserName) {
|
|
529
|
+
const normalized = gitUserName
|
|
530
|
+
.toLowerCase()
|
|
531
|
+
.replace(/[^a-z0-9]/g, '-')
|
|
532
|
+
.replace(/-+/g, '-')
|
|
533
|
+
.replace(/^-|-$/g, '');
|
|
534
|
+
if (normalized) {
|
|
535
|
+
saveCoderName(db, normalized);
|
|
536
|
+
return normalized;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
// Last resort - prompt user
|
|
540
|
+
return promptCoderName(db);
|
|
541
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Devcontainer Template Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates .devcontainer/ configuration for agent sandboxed execution.
|
|
5
|
+
* Uses a custom Dockerfile with network firewall for security sandboxing.
|
|
6
|
+
*/
|
|
7
|
+
import { ExecutionConfig } from './types.js';
|
|
8
|
+
export interface DevcontainerOptions {
|
|
9
|
+
agentName: string;
|
|
10
|
+
agentDir: string;
|
|
11
|
+
repoWorktrees?: string[];
|
|
12
|
+
memory?: string;
|
|
13
|
+
cpus?: number;
|
|
14
|
+
timezone?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface DevcontainerJson {
|
|
17
|
+
name: string;
|
|
18
|
+
build: {
|
|
19
|
+
dockerfile: string;
|
|
20
|
+
args?: Record<string, string>;
|
|
21
|
+
};
|
|
22
|
+
customizations: {
|
|
23
|
+
vscode: {
|
|
24
|
+
extensions: string[];
|
|
25
|
+
settings?: Record<string, unknown>;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
capAdd: string[];
|
|
29
|
+
runArgs: string[];
|
|
30
|
+
remoteUser: string;
|
|
31
|
+
mounts: string[];
|
|
32
|
+
containerEnv?: Record<string, string>;
|
|
33
|
+
workspaceFolder: string;
|
|
34
|
+
postStartCommand: string;
|
|
35
|
+
waitFor: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Generate default devcontainer.json content
|
|
39
|
+
*
|
|
40
|
+
* Uses a custom Dockerfile with firewall for network sandboxing.
|
|
41
|
+
* Mounts the entire agent workspace directory so all contents (repos, prompt files, etc.)
|
|
42
|
+
* are accessible inside the container at /workspace.
|
|
43
|
+
*/
|
|
44
|
+
export declare function generateDevcontainerJson(options: DevcontainerOptions, config?: ExecutionConfig): DevcontainerJson;
|
|
45
|
+
/**
|
|
46
|
+
* Generate Dockerfile content for the devcontainer.
|
|
47
|
+
* Uses architecture auto-detection for cross-platform compatibility.
|
|
48
|
+
*/
|
|
49
|
+
export declare function generateDockerfile(options: DevcontainerOptions): string;
|
|
50
|
+
/**
|
|
51
|
+
* Generate firewall initialization script.
|
|
52
|
+
* Whitelists only necessary domains for Claude Code operation.
|
|
53
|
+
*/
|
|
54
|
+
export declare function generateFirewallScript(): string;
|
|
55
|
+
/**
|
|
56
|
+
* Generate prlt setup script.
|
|
57
|
+
* Rebuilds better-sqlite3 if prlt is mounted from host (not installed via npm).
|
|
58
|
+
*/
|
|
59
|
+
export declare function generatePrltSetupScript(): string;
|
|
60
|
+
/**
|
|
61
|
+
* Create .devcontainer/ directory structure for an agent
|
|
62
|
+
* Writes devcontainer.json, Dockerfile, and init-firewall.sh
|
|
63
|
+
*/
|
|
64
|
+
export declare function createDevcontainerConfig(options: DevcontainerOptions, config?: ExecutionConfig): void;
|
|
65
|
+
/**
|
|
66
|
+
* Check if agent has devcontainer configuration
|
|
67
|
+
*/
|
|
68
|
+
export declare function hasDevcontainerConfig(agentDir: string): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Read existing devcontainer.json
|
|
71
|
+
*/
|
|
72
|
+
export declare function readDevcontainerJson(agentDir: string): DevcontainerJson | null;
|
|
73
|
+
/**
|
|
74
|
+
* Update devcontainer.json with new mounts (e.g., when new repo worktrees are added)
|
|
75
|
+
*
|
|
76
|
+
* Note: With the simplified mount strategy (entire agent workspace), this is mainly
|
|
77
|
+
* for backwards compatibility or if someone wants to customize mounts.
|
|
78
|
+
*/
|
|
79
|
+
export declare function updateDevcontainerMounts(agentDir: string, _repoWorktrees: string[]): void;
|
|
80
|
+
/**
|
|
81
|
+
* Get list of repo directories inside the agent workspace.
|
|
82
|
+
* With the full workspace mount, this returns all non-hidden subdirectories
|
|
83
|
+
* (excluding .devcontainer).
|
|
84
|
+
*/
|
|
85
|
+
export declare function getMountedRepos(agentDir: string): string[];
|