@proletariat/cli 0.1.4 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +510 -255
- package/bin/dev.cmd +3 -0
- package/bin/dev.js +5 -0
- package/bin/run.cmd +3 -0
- package/bin/run.js +23 -0
- package/dist/commands/action/create.d.ts +21 -0
- package/dist/commands/action/create.js +126 -0
- package/dist/commands/action/delete.d.ts +17 -0
- package/dist/commands/action/delete.js +78 -0
- package/dist/commands/action/index.d.ts +15 -0
- package/dist/commands/action/index.js +107 -0
- package/dist/commands/action/list.d.ts +14 -0
- package/dist/commands/action/list.js +89 -0
- package/dist/commands/action/run.d.ts +19 -0
- package/dist/commands/action/run.js +179 -0
- package/dist/commands/action/show.d.ts +15 -0
- package/dist/commands/action/show.js +47 -0
- package/dist/commands/action/update.d.ts +22 -0
- package/dist/commands/action/update.js +168 -0
- package/dist/commands/agent/index.d.ts +13 -0
- package/dist/commands/agent/index.js +131 -0
- package/dist/commands/agent/list.d.ts +7 -0
- package/dist/commands/agent/list.js +126 -0
- package/dist/commands/agent/login.d.ts +16 -0
- package/dist/commands/agent/login.js +146 -0
- package/dist/commands/agent/rebuild.d.ts +18 -0
- package/dist/commands/agent/rebuild.js +133 -0
- package/dist/commands/agent/restart.d.ts +17 -0
- package/dist/commands/agent/restart.js +116 -0
- package/dist/commands/agent/shell.d.ts +23 -0
- package/dist/commands/agent/shell.js +378 -0
- package/dist/commands/agent/staff/add.d.ts +15 -0
- package/dist/commands/agent/staff/add.js +281 -0
- package/dist/commands/agent/staff/index.d.ts +14 -0
- package/dist/commands/agent/staff/index.js +90 -0
- package/dist/commands/agent/staff/list.d.ts +7 -0
- package/dist/commands/agent/staff/list.js +90 -0
- package/dist/commands/agent/staff/remove.d.ts +16 -0
- package/dist/commands/agent/staff/remove.js +137 -0
- package/dist/commands/agent/status.d.ts +17 -0
- package/dist/commands/agent/status.js +139 -0
- package/dist/commands/agent/temp/cleanup.d.ts +23 -0
- package/dist/commands/agent/temp/cleanup.js +388 -0
- package/dist/commands/agent/temp/index.d.ts +14 -0
- package/dist/commands/agent/temp/index.js +82 -0
- package/dist/commands/agent/temp/list.d.ts +7 -0
- package/dist/commands/agent/temp/list.js +108 -0
- package/dist/commands/agent/themes/add-names.d.ts +10 -0
- package/dist/commands/agent/themes/add-names.js +67 -0
- package/dist/commands/agent/themes/create.d.ts +13 -0
- package/dist/commands/agent/themes/create.js +66 -0
- package/dist/commands/agent/themes/index.d.ts +9 -0
- package/dist/commands/agent/themes/index.js +194 -0
- package/dist/commands/agent/themes/list.d.ts +6 -0
- package/dist/commands/agent/themes/list.js +41 -0
- package/dist/commands/agent/themes/set.d.ts +12 -0
- package/dist/commands/agent/themes/set.js +77 -0
- package/dist/commands/agent/visit.d.ts +16 -0
- package/dist/commands/agent/visit.js +88 -0
- package/dist/commands/autocomplete/setup.d.ts +14 -0
- package/dist/commands/autocomplete/setup.js +154 -0
- package/dist/commands/board/index.d.ts +17 -0
- package/dist/commands/board/index.js +255 -0
- package/dist/commands/board/watch.d.ts +13 -0
- package/dist/commands/board/watch.js +52 -0
- package/dist/commands/branch/create.d.ts +50 -0
- package/dist/commands/branch/create.js +624 -0
- package/dist/commands/branch/index.d.ts +13 -0
- package/dist/commands/branch/index.js +50 -0
- package/dist/commands/branch/list.d.ts +17 -0
- package/dist/commands/branch/list.js +120 -0
- package/dist/commands/branch/validate.d.ts +15 -0
- package/dist/commands/branch/validate.js +73 -0
- package/dist/commands/commit.d.ts +71 -0
- package/dist/commands/commit.js +499 -0
- package/dist/commands/docker/clean.d.ts +13 -0
- package/dist/commands/docker/clean.js +224 -0
- package/dist/commands/docker/index.d.ts +19 -0
- package/dist/commands/docker/index.js +274 -0
- package/dist/commands/docker/list.d.ts +16 -0
- package/dist/commands/docker/list.js +200 -0
- package/dist/commands/docker/logs.d.ts +14 -0
- package/dist/commands/docker/logs.js +118 -0
- package/dist/commands/docker/prune.d.ts +14 -0
- package/dist/commands/docker/prune.js +211 -0
- package/dist/commands/docker/restart.d.ts +14 -0
- package/dist/commands/docker/restart.js +129 -0
- package/dist/commands/docker/shell.d.ts +14 -0
- package/dist/commands/docker/shell.js +103 -0
- package/dist/commands/docker/start.d.ts +12 -0
- package/dist/commands/docker/start.js +92 -0
- package/dist/commands/docker/status.d.ts +7 -0
- package/dist/commands/docker/status.js +40 -0
- package/dist/commands/docker/stop.d.ts +14 -0
- package/dist/commands/docker/stop.js +134 -0
- package/dist/commands/docker/sync.d.ts +15 -0
- package/dist/commands/docker/sync.js +112 -0
- package/dist/commands/epic/activate.d.ts +13 -0
- package/dist/commands/epic/activate.js +118 -0
- package/dist/commands/epic/archive.d.ts +14 -0
- package/dist/commands/epic/archive.js +132 -0
- package/dist/commands/epic/create.d.ts +15 -0
- package/dist/commands/epic/create.js +137 -0
- package/dist/commands/epic/index.d.ts +13 -0
- package/dist/commands/epic/index.js +88 -0
- package/dist/commands/epic/link/block.d.ts +14 -0
- package/dist/commands/epic/link/block.js +79 -0
- package/dist/commands/epic/link/duplicates.d.ts +14 -0
- package/dist/commands/epic/link/duplicates.js +66 -0
- package/dist/commands/epic/link/index.d.ts +19 -0
- package/dist/commands/epic/link/index.js +242 -0
- package/dist/commands/epic/link/relates.d.ts +14 -0
- package/dist/commands/epic/link/relates.js +66 -0
- package/dist/commands/epic/link/remove.d.ts +16 -0
- package/dist/commands/epic/link/remove.js +89 -0
- package/dist/commands/epic/list.d.ts +11 -0
- package/dist/commands/epic/list.js +87 -0
- package/dist/commands/epic/move.d.ts +15 -0
- package/dist/commands/epic/move.js +184 -0
- package/dist/commands/epic/progress.d.ts +16 -0
- package/dist/commands/epic/progress.js +166 -0
- package/dist/commands/epic/project.d.ts +15 -0
- package/dist/commands/epic/project.js +219 -0
- package/dist/commands/epic/reorder.d.ts +21 -0
- package/dist/commands/epic/reorder.js +160 -0
- package/dist/commands/epic/spec.d.ts +15 -0
- package/dist/commands/epic/spec.js +191 -0
- package/dist/commands/epic/ticket.d.ts +18 -0
- package/dist/commands/epic/ticket.js +291 -0
- package/dist/commands/epic/view.d.ts +13 -0
- package/dist/commands/epic/view.js +117 -0
- package/dist/commands/execution/index.d.ts +13 -0
- package/dist/commands/execution/index.js +70 -0
- package/dist/commands/execution/list.d.ts +15 -0
- package/dist/commands/execution/list.js +144 -0
- package/dist/commands/execution/logs.d.ts +18 -0
- package/dist/commands/execution/logs.js +161 -0
- package/dist/commands/execution/stop.d.ts +22 -0
- package/dist/commands/execution/stop.js +248 -0
- package/dist/commands/gh/index.d.ts +9 -0
- package/dist/commands/gh/index.js +53 -0
- package/dist/commands/gh/login.d.ts +6 -0
- package/dist/commands/gh/login.js +57 -0
- package/dist/commands/gh/status.d.ts +6 -0
- package/dist/commands/gh/status.js +48 -0
- package/dist/commands/gh/token.d.ts +6 -0
- package/dist/commands/gh/token.js +59 -0
- package/dist/commands/init.d.ts +26 -0
- package/dist/commands/init.js +200 -0
- package/dist/commands/phase/create.d.ts +22 -0
- package/dist/commands/phase/create.js +123 -0
- package/dist/commands/phase/delete.d.ts +17 -0
- package/dist/commands/phase/delete.js +73 -0
- package/dist/commands/phase/list.d.ts +12 -0
- package/dist/commands/phase/list.js +76 -0
- package/dist/commands/phase/move.d.ts +17 -0
- package/dist/commands/phase/move.js +115 -0
- package/dist/commands/phase/template/apply.d.ts +17 -0
- package/dist/commands/phase/template/apply.js +106 -0
- package/dist/commands/phase/template/create.d.ts +16 -0
- package/dist/commands/phase/template/create.js +58 -0
- package/dist/commands/phase/template/delete.d.ts +17 -0
- package/dist/commands/phase/template/delete.js +98 -0
- package/dist/commands/phase/template/index.d.ts +15 -0
- package/dist/commands/phase/template/index.js +128 -0
- package/dist/commands/phase/template/list.d.ts +16 -0
- package/dist/commands/phase/template/list.js +95 -0
- package/dist/commands/phase/template/update.d.ts +17 -0
- package/dist/commands/phase/template/update.js +89 -0
- package/dist/commands/phase/update.d.ts +23 -0
- package/dist/commands/phase/update.js +174 -0
- package/dist/commands/pmo/init.d.ts +25 -0
- package/dist/commands/pmo/init.js +341 -0
- package/dist/commands/pr/create.d.ts +17 -0
- package/dist/commands/pr/create.js +242 -0
- package/dist/commands/pr/index.d.ts +9 -0
- package/dist/commands/pr/index.js +68 -0
- package/dist/commands/pr/link.d.ts +14 -0
- package/dist/commands/pr/link.js +212 -0
- package/dist/commands/pr/status.d.ts +12 -0
- package/dist/commands/pr/status.js +161 -0
- package/dist/commands/project/archive.d.ts +17 -0
- package/dist/commands/project/archive.js +83 -0
- package/dist/commands/project/create.d.ts +22 -0
- package/dist/commands/project/create.js +143 -0
- package/dist/commands/project/delete.d.ts +17 -0
- package/dist/commands/project/delete.js +128 -0
- package/dist/commands/project/index.d.ts +13 -0
- package/dist/commands/project/index.js +64 -0
- package/dist/commands/project/list.d.ts +14 -0
- package/dist/commands/project/list.js +96 -0
- package/dist/commands/project/spec.d.ts +18 -0
- package/dist/commands/project/spec.js +216 -0
- package/dist/commands/project/unarchive.d.ts +15 -0
- package/dist/commands/project/unarchive.js +35 -0
- package/dist/commands/project/view.d.ts +16 -0
- package/dist/commands/project/view.js +94 -0
- package/dist/commands/repo/add.d.ts +21 -0
- package/dist/commands/repo/add.js +118 -0
- package/dist/commands/repo/index.d.ts +13 -0
- package/dist/commands/repo/index.js +114 -0
- package/dist/commands/repo/list.d.ts +13 -0
- package/dist/commands/repo/list.js +96 -0
- package/dist/commands/repo/remove.d.ts +23 -0
- package/dist/commands/repo/remove.js +217 -0
- package/dist/commands/repo/view.d.ts +15 -0
- package/dist/commands/repo/view.js +99 -0
- package/dist/commands/session/attach.d.ts +40 -0
- package/dist/commands/session/attach.js +307 -0
- package/dist/commands/session/index.d.ts +13 -0
- package/dist/commands/session/index.js +64 -0
- package/dist/commands/session/list.d.ts +21 -0
- package/dist/commands/session/list.js +181 -0
- package/dist/commands/spec/create.d.ts +19 -0
- package/dist/commands/spec/create.js +130 -0
- package/dist/commands/spec/index.d.ts +13 -0
- package/dist/commands/spec/index.js +68 -0
- package/dist/commands/spec/link/depends.d.ts +14 -0
- package/dist/commands/spec/link/depends.js +64 -0
- package/dist/commands/spec/link/duplicates.d.ts +14 -0
- package/dist/commands/spec/link/duplicates.js +63 -0
- package/dist/commands/spec/link/index.d.ts +19 -0
- package/dist/commands/spec/link/index.js +200 -0
- package/dist/commands/spec/link/relates.d.ts +14 -0
- package/dist/commands/spec/link/relates.js +63 -0
- package/dist/commands/spec/link/remove.d.ts +16 -0
- package/dist/commands/spec/link/remove.js +94 -0
- package/dist/commands/spec/list.d.ts +12 -0
- package/dist/commands/spec/list.js +75 -0
- package/dist/commands/spec/plan.d.ts +15 -0
- package/dist/commands/spec/plan.js +108 -0
- package/dist/commands/spec/ticket.d.ts +18 -0
- package/dist/commands/spec/ticket.js +160 -0
- package/dist/commands/spec/view.d.ts +15 -0
- package/dist/commands/spec/view.js +163 -0
- package/dist/commands/status/create.d.ts +21 -0
- package/dist/commands/status/create.js +140 -0
- package/dist/commands/status/delete.d.ts +13 -0
- package/dist/commands/status/delete.js +77 -0
- package/dist/commands/status/index.d.ts +14 -0
- package/dist/commands/status/index.js +91 -0
- package/dist/commands/status/list.d.ts +12 -0
- package/dist/commands/status/list.js +93 -0
- package/dist/commands/status/move.d.ts +14 -0
- package/dist/commands/status/move.js +120 -0
- package/dist/commands/status/update.d.ts +20 -0
- package/dist/commands/status/update.js +180 -0
- package/dist/commands/template/delete.d.ts +15 -0
- package/dist/commands/template/delete.js +142 -0
- package/dist/commands/template/index.d.ts +10 -0
- package/dist/commands/template/index.js +64 -0
- package/dist/commands/template/list.d.ts +18 -0
- package/dist/commands/template/list.js +157 -0
- package/dist/commands/template/phase/apply.d.ts +14 -0
- package/dist/commands/template/phase/apply.js +41 -0
- package/dist/commands/template/phase/create.d.ts +12 -0
- package/dist/commands/template/phase/create.js +29 -0
- package/dist/commands/template/phase/delete.d.ts +13 -0
- package/dist/commands/template/phase/delete.js +34 -0
- package/dist/commands/template/phase/index.d.ts +10 -0
- package/dist/commands/template/phase/index.js +62 -0
- package/dist/commands/template/phase/list.d.ts +11 -0
- package/dist/commands/template/phase/list.js +34 -0
- package/dist/commands/template/phase/update.d.ts +13 -0
- package/dist/commands/template/phase/update.js +35 -0
- package/dist/commands/template/ticket/apply.d.ts +17 -0
- package/dist/commands/template/ticket/apply.js +58 -0
- package/dist/commands/template/ticket/delete.d.ts +13 -0
- package/dist/commands/template/ticket/delete.js +34 -0
- package/dist/commands/template/ticket/index.d.ts +10 -0
- package/dist/commands/template/ticket/index.js +62 -0
- package/dist/commands/template/ticket/list.d.ts +11 -0
- package/dist/commands/template/ticket/list.js +34 -0
- package/dist/commands/template/ticket/save.d.ts +13 -0
- package/dist/commands/template/ticket/save.js +35 -0
- package/dist/commands/ticket/bulk.d.ts +13 -0
- package/dist/commands/ticket/bulk.js +145 -0
- package/dist/commands/ticket/complete.d.ts +16 -0
- package/dist/commands/ticket/complete.js +170 -0
- package/dist/commands/ticket/create.d.ts +22 -0
- package/dist/commands/ticket/create.js +390 -0
- package/dist/commands/ticket/delete.d.ts +16 -0
- package/dist/commands/ticket/delete.js +178 -0
- package/dist/commands/ticket/edit.d.ts +27 -0
- package/dist/commands/ticket/edit.js +322 -0
- package/dist/commands/ticket/epic.d.ts +20 -0
- package/dist/commands/ticket/epic.js +333 -0
- package/dist/commands/ticket/index.d.ts +13 -0
- package/dist/commands/ticket/index.js +103 -0
- package/dist/commands/ticket/link/block.d.ts +14 -0
- package/dist/commands/ticket/link/block.js +94 -0
- package/dist/commands/ticket/link/duplicates.d.ts +14 -0
- package/dist/commands/ticket/link/duplicates.js +93 -0
- package/dist/commands/ticket/link/index.d.ts +19 -0
- package/dist/commands/ticket/link/index.js +239 -0
- package/dist/commands/ticket/link/relates.d.ts +14 -0
- package/dist/commands/ticket/link/relates.js +93 -0
- package/dist/commands/ticket/link/remove.d.ts +16 -0
- package/dist/commands/ticket/link/remove.js +128 -0
- package/dist/commands/ticket/list.d.ts +24 -0
- package/dist/commands/ticket/list.js +431 -0
- package/dist/commands/ticket/move.d.ts +18 -0
- package/dist/commands/ticket/move.js +212 -0
- package/dist/commands/ticket/project.d.ts +18 -0
- package/dist/commands/ticket/project.js +254 -0
- package/dist/commands/ticket/reassign.d.ts +19 -0
- package/dist/commands/ticket/reassign.js +279 -0
- package/dist/commands/ticket/spec.d.ts +18 -0
- package/dist/commands/ticket/spec.js +259 -0
- package/dist/commands/ticket/status.d.ts +13 -0
- package/dist/commands/ticket/status.js +87 -0
- package/dist/commands/ticket/template/apply.d.ts +25 -0
- package/dist/commands/ticket/template/apply.js +249 -0
- package/dist/commands/ticket/template/create.d.ts +19 -0
- package/dist/commands/ticket/template/create.js +210 -0
- package/dist/commands/ticket/template/delete.d.ts +17 -0
- package/dist/commands/ticket/template/delete.js +92 -0
- package/dist/commands/ticket/template/index.d.ts +15 -0
- package/dist/commands/ticket/template/index.js +118 -0
- package/dist/commands/ticket/template/list.d.ts +16 -0
- package/dist/commands/ticket/template/list.js +110 -0
- package/dist/commands/ticket/template/save.d.ts +14 -0
- package/dist/commands/ticket/template/save.js +110 -0
- package/dist/commands/ticket/update.d.ts +18 -0
- package/dist/commands/ticket/update.js +325 -0
- package/dist/commands/ticket/view.d.ts +13 -0
- package/dist/commands/ticket/view.js +80 -0
- package/dist/commands/whoami.d.ts +9 -0
- package/dist/commands/whoami.js +103 -0
- package/dist/commands/work/complete.d.ts +13 -0
- package/dist/commands/work/complete.js +121 -0
- package/dist/commands/work/index.d.ts +13 -0
- package/dist/commands/work/index.js +70 -0
- package/dist/commands/work/ready.d.ts +24 -0
- package/dist/commands/work/ready.js +290 -0
- package/dist/commands/work/revise.d.ts +19 -0
- package/dist/commands/work/revise.js +377 -0
- package/dist/commands/work/spawn-all.d.ts +17 -0
- package/dist/commands/work/spawn-all.js +58 -0
- package/dist/commands/work/spawn.d.ts +29 -0
- package/dist/commands/work/spawn.js +728 -0
- package/dist/commands/work/start.d.ts +39 -0
- package/dist/commands/work/start.js +1393 -0
- package/dist/commands/work/watch.d.ts +31 -0
- package/dist/commands/work/watch.js +359 -0
- package/dist/commands/workflow/create.d.ts +18 -0
- package/dist/commands/workflow/create.js +119 -0
- package/dist/commands/workflow/delete.d.ts +17 -0
- package/dist/commands/workflow/delete.js +119 -0
- package/dist/commands/workflow/index.d.ts +15 -0
- package/dist/commands/workflow/index.js +75 -0
- package/dist/commands/workflow/list.d.ts +15 -0
- package/dist/commands/workflow/list.js +75 -0
- package/dist/commands/workflow/switch.d.ts +13 -0
- package/dist/commands/workflow/switch.js +117 -0
- package/dist/commands/workflow/view.d.ts +16 -0
- package/dist/commands/workflow/view.js +114 -0
- package/dist/commands/workspace/add.d.ts +12 -0
- package/dist/commands/workspace/add.js +74 -0
- package/dist/commands/workspace/list.d.ts +9 -0
- package/dist/commands/workspace/list.js +153 -0
- package/dist/commands/workspace/remove.d.ts +13 -0
- package/dist/commands/workspace/remove.js +98 -0
- package/dist/commands/workspace/use.d.ts +12 -0
- package/dist/commands/workspace/use.js +111 -0
- package/dist/hooks/init.d.ts +11 -0
- package/dist/hooks/init.js +57 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/lib/agents/commands.d.ts +189 -0
- package/dist/lib/agents/commands.js +893 -0
- package/dist/lib/agents/index.d.ts +54 -0
- package/dist/lib/agents/index.js +382 -0
- package/dist/lib/branch/index.d.ts +120 -0
- package/dist/lib/branch/index.js +334 -0
- package/dist/lib/colors.d.ts +94 -0
- package/dist/lib/colors.js +68 -0
- package/dist/lib/commands/docker-command.d.ts +21 -0
- package/dist/lib/commands/docker-command.js +27 -0
- package/dist/lib/database/index.d.ts +176 -0
- package/dist/lib/database/index.js +581 -0
- package/dist/lib/docker/resolve.d.ts +38 -0
- package/dist/lib/docker/resolve.js +175 -0
- package/dist/lib/execution/config.d.ts +150 -0
- package/dist/lib/execution/config.js +541 -0
- package/dist/lib/execution/devcontainer.d.ts +85 -0
- package/dist/lib/execution/devcontainer.js +594 -0
- package/dist/lib/execution/index.d.ts +10 -0
- package/dist/lib/execution/index.js +10 -0
- package/dist/lib/execution/runners.d.ts +53 -0
- package/dist/lib/execution/runners.js +1182 -0
- package/dist/lib/execution/spawner.d.ts +85 -0
- package/dist/lib/execution/spawner.js +548 -0
- package/dist/lib/execution/storage.d.ts +159 -0
- package/dist/lib/execution/storage.js +425 -0
- package/dist/lib/execution/types.d.ts +145 -0
- package/dist/lib/execution/types.js +157 -0
- package/dist/lib/init/index.d.ts +75 -0
- package/dist/lib/init/index.js +355 -0
- package/dist/lib/machine-config.d.ts +170 -0
- package/dist/lib/machine-config.js +386 -0
- package/dist/lib/pmo/base-command.d.ts +195 -0
- package/dist/lib/pmo/base-command.js +319 -0
- package/dist/lib/pmo/create-spec-folders.d.ts +43 -0
- package/dist/lib/pmo/create-spec-folders.js +64 -0
- package/dist/lib/pmo/epic-files.d.ts +56 -0
- package/dist/lib/pmo/epic-files.js +195 -0
- package/dist/lib/pmo/find-pmo.d.ts +14 -0
- package/dist/lib/pmo/find-pmo.js +172 -0
- package/dist/lib/pmo/index.d.ts +109 -0
- package/dist/lib/pmo/index.js +501 -0
- package/dist/lib/pmo/markdown.d.ts +31 -0
- package/dist/lib/pmo/markdown.js +245 -0
- package/dist/lib/pmo/pmo-context.d.ts +27 -0
- package/dist/lib/pmo/pmo-context.js +44 -0
- package/dist/lib/pmo/schema.d.ts +82 -0
- package/dist/lib/pmo/schema.js +531 -0
- package/dist/lib/pmo/spec-parser.d.ts +25 -0
- package/dist/lib/pmo/spec-parser.js +205 -0
- package/dist/lib/pmo/spec-types.d.ts +43 -0
- package/dist/lib/pmo/spec-types.js +7 -0
- package/dist/lib/pmo/storage/actions.d.ts +34 -0
- package/dist/lib/pmo/storage/actions.js +177 -0
- package/dist/lib/pmo/storage/base.d.ts +47 -0
- package/dist/lib/pmo/storage/base.js +858 -0
- package/dist/lib/pmo/storage/dependencies.d.ts +61 -0
- package/dist/lib/pmo/storage/dependencies.js +267 -0
- package/dist/lib/pmo/storage/epics.d.ts +46 -0
- package/dist/lib/pmo/storage/epics.js +243 -0
- package/dist/lib/pmo/storage/helpers.d.ts +33 -0
- package/dist/lib/pmo/storage/helpers.js +148 -0
- package/dist/lib/pmo/storage/index.d.ts +186 -0
- package/dist/lib/pmo/storage/index.js +689 -0
- package/dist/lib/pmo/storage/phases.d.ts +65 -0
- package/dist/lib/pmo/storage/phases.js +392 -0
- package/dist/lib/pmo/storage/projects.d.ts +79 -0
- package/dist/lib/pmo/storage/projects.js +303 -0
- package/dist/lib/pmo/storage/specs.d.ts +77 -0
- package/dist/lib/pmo/storage/specs.js +389 -0
- package/dist/lib/pmo/storage/statuses.d.ts +63 -0
- package/dist/lib/pmo/storage/statuses.js +404 -0
- package/dist/lib/pmo/storage/subtasks.d.ts +37 -0
- package/dist/lib/pmo/storage/subtasks.js +184 -0
- package/dist/lib/pmo/storage/templates.d.ts +40 -0
- package/dist/lib/pmo/storage/templates.js +210 -0
- package/dist/lib/pmo/storage/tickets.d.ts +57 -0
- package/dist/lib/pmo/storage/tickets.js +453 -0
- package/dist/lib/pmo/storage/types.d.ts +200 -0
- package/dist/lib/pmo/storage/types.js +5 -0
- package/dist/lib/pmo/storage/views.d.ts +44 -0
- package/dist/lib/pmo/storage/views.js +355 -0
- package/dist/lib/pmo/storage-sqlite.d.ts +7 -0
- package/dist/lib/pmo/storage-sqlite.js +7 -0
- package/dist/lib/pmo/sync-manager.d.ts +92 -0
- package/dist/lib/pmo/sync-manager.js +229 -0
- package/dist/lib/pmo/types.d.ts +710 -0
- package/dist/lib/pmo/types.js +108 -0
- package/dist/lib/pmo/utils.d.ts +122 -0
- package/dist/lib/pmo/utils.js +174 -0
- package/dist/lib/pmo/watcher.d.ts +43 -0
- package/dist/lib/pmo/watcher.js +208 -0
- package/dist/lib/pr/index.d.ts +150 -0
- package/dist/lib/pr/index.js +483 -0
- package/dist/lib/prompt-json.d.ts +231 -0
- package/dist/lib/prompt-json.js +213 -0
- package/dist/lib/repos/index.d.ts +81 -0
- package/dist/lib/repos/index.js +679 -0
- package/dist/lib/styles.d.ts +98 -0
- package/dist/lib/styles.js +195 -0
- package/dist/lib/themes.d.ts +128 -0
- package/dist/lib/themes.js +301 -0
- package/dist/lib/ui/BoardUI.d.ts +21 -0
- package/dist/lib/ui/BoardUI.js +85 -0
- package/dist/lib/ui/ClaimTicketUI.d.ts +17 -0
- package/dist/lib/ui/ClaimTicketUI.js +64 -0
- package/dist/lib/ui/CreateTicketUI.d.ts +13 -0
- package/dist/lib/ui/CreateTicketUI.js +101 -0
- package/dist/lib/workspace.d.ts +66 -0
- package/dist/lib/workspace.js +204 -0
- package/oclif.manifest.json +10593 -0
- package/package.json +104 -52
- package/LICENSE +0 -21
- package/dist/bin/prlt.d.ts +0 -11
- package/dist/bin/prlt.d.ts.map +0 -1
- package/dist/bin/prlt.js +0 -144
- package/dist/bin/prlt.js.map +0 -1
- package/dist/lib/config/index.d.ts +0 -14
- package/dist/lib/config/index.d.ts.map +0 -1
- package/dist/lib/config/index.js +0 -139
- package/dist/lib/config/index.js.map +0 -1
- package/dist/lib/config/upgrade.d.ts +0 -2
- package/dist/lib/config/upgrade.d.ts.map +0 -1
- package/dist/lib/config/upgrade.js +0 -173
- package/dist/lib/config/upgrade.js.map +0 -1
- package/dist/lib/themes/index.d.ts +0 -8
- package/dist/lib/themes/index.d.ts.map +0 -1
- package/dist/lib/themes/index.js +0 -80
- package/dist/lib/themes/index.js.map +0 -1
- package/dist/lib/utils/helpers.d.ts +0 -4
- package/dist/lib/utils/helpers.d.ts.map +0 -1
- package/dist/lib/utils/helpers.js +0 -39
- package/dist/lib/utils/helpers.js.map +0 -1
- package/dist/lib/utils/logger.d.ts +0 -4
- package/dist/lib/utils/logger.d.ts.map +0 -1
- package/dist/lib/utils/logger.js +0 -28
- package/dist/lib/utils/logger.js.map +0 -1
- package/dist/lib/workspace/index.d.ts +0 -13
- package/dist/lib/workspace/index.d.ts.map +0 -1
- package/dist/lib/workspace/index.js +0 -116
- package/dist/lib/workspace/index.js.map +0 -1
- package/dist/lib/worktree/index.d.ts +0 -7
- package/dist/lib/worktree/index.d.ts.map +0 -1
- package/dist/lib/worktree/index.js +0 -362
- package/dist/lib/worktree/index.js.map +0 -1
- package/dist/lib/worktree/migrate.d.ts +0 -2
- package/dist/lib/worktree/migrate.d.ts.map +0 -1
- package/dist/lib/worktree/migrate.js +0 -212
- package/dist/lib/worktree/migrate.js.map +0 -1
- package/dist/lib/worktree/repair.d.ts +0 -3
- package/dist/lib/worktree/repair.d.ts.map +0 -1
- package/dist/lib/worktree/repair.js +0 -140
- package/dist/lib/worktree/repair.js.map +0 -1
- package/dist/types/index.d.ts +0 -57
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -3
- package/dist/types/index.js.map +0 -1
|
@@ -0,0 +1,594 @@
|
|
|
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 * as fs from 'node:fs';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import { DEFAULT_EXECUTION_CONFIG } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Generate default devcontainer.json content
|
|
12
|
+
*
|
|
13
|
+
* Uses a custom Dockerfile with firewall for network sandboxing.
|
|
14
|
+
* Mounts the entire agent workspace directory so all contents (repos, prompt files, etc.)
|
|
15
|
+
* are accessible inside the container at /workspace.
|
|
16
|
+
*/
|
|
17
|
+
export function generateDevcontainerJson(options, config) {
|
|
18
|
+
const cfg = config || DEFAULT_EXECUTION_CONFIG;
|
|
19
|
+
const devcontainerJson = {
|
|
20
|
+
name: `Agent: ${options.agentName}`,
|
|
21
|
+
build: {
|
|
22
|
+
dockerfile: 'Dockerfile',
|
|
23
|
+
args: {
|
|
24
|
+
TZ: options.timezone || 'America/Los_Angeles',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
customizations: {
|
|
28
|
+
vscode: {
|
|
29
|
+
extensions: [
|
|
30
|
+
'anthropic.claude-code',
|
|
31
|
+
'dbaeumer.vscode-eslint',
|
|
32
|
+
'esbenp.prettier-vscode',
|
|
33
|
+
],
|
|
34
|
+
settings: {
|
|
35
|
+
'editor.formatOnSave': true,
|
|
36
|
+
'editor.defaultFormatter': 'esbenp.prettier-vscode',
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
capAdd: ['NET_ADMIN', 'NET_RAW'],
|
|
41
|
+
runArgs: [
|
|
42
|
+
`--memory=${options.memory || cfg.devcontainer.memory}`,
|
|
43
|
+
`--cpus=${options.cpus || cfg.devcontainer.cpus}`,
|
|
44
|
+
],
|
|
45
|
+
remoteUser: 'node',
|
|
46
|
+
mounts: [
|
|
47
|
+
'source=${localWorkspaceFolder},target=/workspace,type=bind',
|
|
48
|
+
'source=claude-bash-history,target=/commandhistory,type=volume',
|
|
49
|
+
'source=claude-credentials,target=/home/node/.claude,type=volume',
|
|
50
|
+
// NOTE: ~/.claude.json is COPIED (not mounted) to /workspace/.claude.json
|
|
51
|
+
// to avoid corruption from concurrent writes by multiple containers
|
|
52
|
+
'source=${localEnv:PRLT_HQ_PATH}/.proletariat,target=/hq/.proletariat,type=bind',
|
|
53
|
+
// PMO path can be anywhere (e.g., /hq/pmo or /hq/repos/myrepo/pmo)
|
|
54
|
+
// Use PRLT_PMO_PATH env var to mount the actual location to /hq/pmo
|
|
55
|
+
'source=${localEnv:PRLT_PMO_PATH},target=/hq/pmo,type=bind',
|
|
56
|
+
// Mount each repo's directory so git worktrees can resolve their parent
|
|
57
|
+
// Worktree .git files reference paths like /Users/.../repos/{repoName}/.git/worktrees/name
|
|
58
|
+
// These mounts make those paths accessible inside the container at /hq/repos/{repoName}
|
|
59
|
+
...(options.repoWorktrees || []).map(repoName => `source=\${localEnv:PRLT_HQ_PATH}/repos/${repoName},target=/hq/repos/${repoName},type=bind`),
|
|
60
|
+
],
|
|
61
|
+
containerEnv: {
|
|
62
|
+
DEVCONTAINER: 'true',
|
|
63
|
+
ANTHROPIC_API_KEY: '${localEnv:ANTHROPIC_API_KEY}',
|
|
64
|
+
// GH_TOKEN enables gh CLI in container (for PR creation, etc.)
|
|
65
|
+
GH_TOKEN: '${localEnv:GH_TOKEN}',
|
|
66
|
+
GITHUB_TOKEN: '${localEnv:GITHUB_TOKEN}',
|
|
67
|
+
PRLT_HQ_PATH: '/hq',
|
|
68
|
+
// /hq/.proletariat/bin contains prlt wrapper with ESM loader for native modules
|
|
69
|
+
PATH: '/hq/.proletariat/bin:/home/node/.npm-global/bin:/usr/local/bin:/usr/bin:/bin',
|
|
70
|
+
},
|
|
71
|
+
workspaceFolder: '/workspace',
|
|
72
|
+
postStartCommand: 'sudo /usr/local/bin/init-firewall.sh && /usr/local/bin/setup-prlt.sh',
|
|
73
|
+
waitFor: 'postStartCommand',
|
|
74
|
+
};
|
|
75
|
+
return devcontainerJson;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Generate Dockerfile content for the devcontainer.
|
|
79
|
+
* Uses architecture auto-detection for cross-platform compatibility.
|
|
80
|
+
*/
|
|
81
|
+
export function generateDockerfile(options) {
|
|
82
|
+
const timezone = options.timezone || 'America/Los_Angeles';
|
|
83
|
+
return `FROM node:20
|
|
84
|
+
|
|
85
|
+
# Ensure we run as root for apt-get and system setup
|
|
86
|
+
USER root
|
|
87
|
+
|
|
88
|
+
ARG TZ=${timezone}
|
|
89
|
+
ENV TZ=\${TZ}
|
|
90
|
+
ENV DEVCONTAINER=true
|
|
91
|
+
|
|
92
|
+
# Install system dependencies
|
|
93
|
+
RUN apt-get update && apt-get install -y \\
|
|
94
|
+
less git git-lfs procps sudo fzf zsh man-db unzip gnupg2 gh tmux \\
|
|
95
|
+
iptables ipset iproute2 dnsutils jq nano vim \\
|
|
96
|
+
&& rm -rf /var/lib/apt/lists/* \\
|
|
97
|
+
&& git lfs install
|
|
98
|
+
|
|
99
|
+
# Create workspace and claude directories
|
|
100
|
+
RUN mkdir -p /workspace /home/node/.claude \\
|
|
101
|
+
&& chown -R node:node /workspace /home/node/.claude
|
|
102
|
+
|
|
103
|
+
# Set up persistent bash history
|
|
104
|
+
RUN mkdir -p /commandhistory \\
|
|
105
|
+
&& touch /commandhistory/.bash_history \\
|
|
106
|
+
&& chown -R node:node /commandhistory
|
|
107
|
+
|
|
108
|
+
# Install git-delta for better diffs (architecture-aware)
|
|
109
|
+
RUN ARCH=$(dpkg --print-architecture) && \\
|
|
110
|
+
curl -L "https://github.com/dandavison/delta/releases/download/0.18.2/git-delta_0.18.2_\${ARCH}.deb" -o /tmp/delta.deb && \\
|
|
111
|
+
dpkg -i /tmp/delta.deb && \\
|
|
112
|
+
rm /tmp/delta.deb
|
|
113
|
+
|
|
114
|
+
# Install zsh with oh-my-zsh
|
|
115
|
+
RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended \\
|
|
116
|
+
&& chsh -s /bin/zsh node
|
|
117
|
+
|
|
118
|
+
# Configure npm global directory
|
|
119
|
+
RUN mkdir -p /home/node/.npm-global/bin /home/node/.npm-global/lib \\
|
|
120
|
+
&& chown -R node:node /home/node/.npm-global
|
|
121
|
+
ENV NPM_CONFIG_PREFIX=/home/node/.npm-global
|
|
122
|
+
ENV PATH=/home/node/.npm-global/bin:\$PATH
|
|
123
|
+
|
|
124
|
+
# Install pnpm
|
|
125
|
+
RUN npm install -g pnpm
|
|
126
|
+
|
|
127
|
+
# Install Claude Code as node user so files are owned correctly
|
|
128
|
+
USER node
|
|
129
|
+
RUN npm install -g @anthropic-ai/claude-code
|
|
130
|
+
USER root
|
|
131
|
+
|
|
132
|
+
# Install prlt CLI from GitHub Packages
|
|
133
|
+
# Requires GITHUB_TOKEN build arg with read:packages scope
|
|
134
|
+
ARG GITHUB_TOKEN
|
|
135
|
+
RUN if [ -n "\${GITHUB_TOKEN}" ]; then \\
|
|
136
|
+
echo "//npm.pkg.github.com/:_authToken=\${GITHUB_TOKEN}" >> /home/node/.npmrc && \\
|
|
137
|
+
echo "@chrismcdermut:registry=https://npm.pkg.github.com" >> /home/node/.npmrc && \\
|
|
138
|
+
npm install -g @chrismcdermut/prlt && \\
|
|
139
|
+
rm /home/node/.npmrc; \\
|
|
140
|
+
else \\
|
|
141
|
+
echo "GITHUB_TOKEN not provided, prlt will be mounted from host"; \\
|
|
142
|
+
fi
|
|
143
|
+
|
|
144
|
+
# Copy and set up scripts
|
|
145
|
+
COPY init-firewall.sh /usr/local/bin/init-firewall.sh
|
|
146
|
+
COPY setup-prlt.sh /usr/local/bin/setup-prlt.sh
|
|
147
|
+
RUN chmod +x /usr/local/bin/init-firewall.sh /usr/local/bin/setup-prlt.sh
|
|
148
|
+
|
|
149
|
+
# Allow node user to run firewall script without password
|
|
150
|
+
RUN echo "node ALL=(ALL) NOPASSWD: /usr/local/bin/init-firewall.sh" >> /etc/sudoers
|
|
151
|
+
|
|
152
|
+
# Set default editor
|
|
153
|
+
ENV EDITOR=nano
|
|
154
|
+
|
|
155
|
+
# Configure shell history
|
|
156
|
+
ENV HISTFILE=/commandhistory/.bash_history
|
|
157
|
+
|
|
158
|
+
USER node
|
|
159
|
+
WORKDIR /workspace
|
|
160
|
+
`;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Generate firewall initialization script.
|
|
164
|
+
* Whitelists only necessary domains for Claude Code operation.
|
|
165
|
+
*/
|
|
166
|
+
export function generateFirewallScript() {
|
|
167
|
+
return `#!/bin/bash
|
|
168
|
+
set -e
|
|
169
|
+
|
|
170
|
+
echo "Initializing firewall..."
|
|
171
|
+
|
|
172
|
+
# Preserve Docker's DNS rules before flushing
|
|
173
|
+
DOCKER_DNS_RULES=$(iptables-save | grep -E "DOCKER|docker" || true)
|
|
174
|
+
|
|
175
|
+
# Flush existing rules
|
|
176
|
+
iptables -F
|
|
177
|
+
iptables -X
|
|
178
|
+
iptables -t nat -F
|
|
179
|
+
iptables -t nat -X
|
|
180
|
+
|
|
181
|
+
# Restore Docker DNS rules
|
|
182
|
+
if [ -n "$DOCKER_DNS_RULES" ]; then
|
|
183
|
+
echo "$DOCKER_DNS_RULES" | iptables-restore -n
|
|
184
|
+
fi
|
|
185
|
+
|
|
186
|
+
# Create ipset for allowed domains (use hash:net to support CIDR ranges)
|
|
187
|
+
ipset create allowed-domains hash:net -exist
|
|
188
|
+
|
|
189
|
+
# Allow localhost
|
|
190
|
+
iptables -A INPUT -i lo -j ACCEPT
|
|
191
|
+
iptables -A OUTPUT -o lo -j ACCEPT
|
|
192
|
+
|
|
193
|
+
# Allow established connections
|
|
194
|
+
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
|
|
195
|
+
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
|
|
196
|
+
|
|
197
|
+
# Allow DNS
|
|
198
|
+
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
|
|
199
|
+
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
|
|
200
|
+
|
|
201
|
+
# Get host network and allow it (needed for Docker networking)
|
|
202
|
+
HOST_NETWORK=$(ip route | grep default | awk '{print $3}' | head -1)
|
|
203
|
+
if [ -n "$HOST_NETWORK" ]; then
|
|
204
|
+
HOST_SUBNET=$(echo $HOST_NETWORK | sed 's/\\.[0-9]*$/.0\\/24/')
|
|
205
|
+
iptables -A OUTPUT -d $HOST_SUBNET -j ACCEPT
|
|
206
|
+
fi
|
|
207
|
+
|
|
208
|
+
# Function to resolve and add domain IPs
|
|
209
|
+
add_domain() {
|
|
210
|
+
local domain=$1
|
|
211
|
+
echo "Adding $domain..."
|
|
212
|
+
for ip in $(dig +short $domain A 2>/dev/null || true); do
|
|
213
|
+
if [[ $ip =~ ^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+$ ]]; then
|
|
214
|
+
ipset add allowed-domains $ip -exist
|
|
215
|
+
fi
|
|
216
|
+
done
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
# Add hardcoded GitHub IP ranges (from https://api.github.com/meta)
|
|
220
|
+
# These are stable and published by GitHub
|
|
221
|
+
echo "Adding GitHub IP ranges..."
|
|
222
|
+
# GitHub git operations
|
|
223
|
+
ipset add allowed-domains 192.30.252.0/22 -exist 2>/dev/null || true
|
|
224
|
+
ipset add allowed-domains 185.199.108.0/22 -exist 2>/dev/null || true
|
|
225
|
+
ipset add allowed-domains 140.82.112.0/20 -exist 2>/dev/null || true
|
|
226
|
+
ipset add allowed-domains 143.55.64.0/20 -exist 2>/dev/null || true
|
|
227
|
+
# GitHub API
|
|
228
|
+
ipset add allowed-domains 20.201.28.151/32 -exist 2>/dev/null || true
|
|
229
|
+
ipset add allowed-domains 20.205.243.166/32 -exist 2>/dev/null || true
|
|
230
|
+
ipset add allowed-domains 20.87.245.0/24 -exist 2>/dev/null || true
|
|
231
|
+
ipset add allowed-domains 20.248.137.48/32 -exist 2>/dev/null || true
|
|
232
|
+
ipset add allowed-domains 20.207.73.82/32 -exist 2>/dev/null || true
|
|
233
|
+
ipset add allowed-domains 20.27.177.113/32 -exist 2>/dev/null || true
|
|
234
|
+
ipset add allowed-domains 20.200.245.247/32 -exist 2>/dev/null || true
|
|
235
|
+
ipset add allowed-domains 20.233.54.53/32 -exist 2>/dev/null || true
|
|
236
|
+
ipset add allowed-domains 4.208.26.197/32 -exist 2>/dev/null || true
|
|
237
|
+
# GitHub web/packages
|
|
238
|
+
ipset add allowed-domains 20.26.156.215/32 -exist 2>/dev/null || true
|
|
239
|
+
|
|
240
|
+
# Also resolve github.com domains dynamically (in case IPs change)
|
|
241
|
+
add_domain "github.com"
|
|
242
|
+
add_domain "api.github.com"
|
|
243
|
+
add_domain "codeload.github.com"
|
|
244
|
+
add_domain "objects.githubusercontent.com"
|
|
245
|
+
add_domain "raw.githubusercontent.com"
|
|
246
|
+
add_domain "npm.pkg.github.com"
|
|
247
|
+
|
|
248
|
+
# Add other allowed domains
|
|
249
|
+
add_domain "api.anthropic.com"
|
|
250
|
+
add_domain "console.anthropic.com"
|
|
251
|
+
add_domain "statsigapi.net"
|
|
252
|
+
add_domain "sentry.io"
|
|
253
|
+
add_domain "registry.npmjs.org"
|
|
254
|
+
add_domain "npmjs.com"
|
|
255
|
+
add_domain "nodejs.org"
|
|
256
|
+
add_domain "update.code.visualstudio.com"
|
|
257
|
+
add_domain "vscode.download.prss.microsoft.com"
|
|
258
|
+
|
|
259
|
+
# Allow traffic to whitelisted IPs
|
|
260
|
+
iptables -A OUTPUT -m set --match-set allowed-domains dst -j ACCEPT
|
|
261
|
+
|
|
262
|
+
# Set default policies
|
|
263
|
+
iptables -P INPUT DROP
|
|
264
|
+
iptables -P FORWARD DROP
|
|
265
|
+
iptables -P OUTPUT DROP
|
|
266
|
+
|
|
267
|
+
# Allow SSH (in case needed for debugging)
|
|
268
|
+
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
|
|
269
|
+
|
|
270
|
+
echo "Firewall initialized."
|
|
271
|
+
|
|
272
|
+
# Verify firewall is working
|
|
273
|
+
echo "Testing firewall..."
|
|
274
|
+
if curl -s --max-time 3 https://example.com >/dev/null 2>&1; then
|
|
275
|
+
echo "WARNING: example.com is reachable (should be blocked)"
|
|
276
|
+
else
|
|
277
|
+
echo "✓ example.com blocked as expected"
|
|
278
|
+
fi
|
|
279
|
+
|
|
280
|
+
if curl -s --max-time 5 https://api.anthropic.com >/dev/null 2>&1; then
|
|
281
|
+
echo "✓ api.anthropic.com reachable"
|
|
282
|
+
else
|
|
283
|
+
echo "Note: api.anthropic.com not reachable (may need auth)"
|
|
284
|
+
fi
|
|
285
|
+
|
|
286
|
+
if curl -s --max-time 5 https://github.com >/dev/null 2>&1; then
|
|
287
|
+
echo "✓ github.com reachable"
|
|
288
|
+
else
|
|
289
|
+
echo "WARNING: github.com not reachable"
|
|
290
|
+
fi
|
|
291
|
+
|
|
292
|
+
echo "Firewall setup complete."
|
|
293
|
+
`;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Generate prlt setup script.
|
|
297
|
+
* Rebuilds better-sqlite3 if prlt is mounted from host (not installed via npm).
|
|
298
|
+
*/
|
|
299
|
+
export function generatePrltSetupScript() {
|
|
300
|
+
// Note: Using single quotes in heredoc marker ('GITWRAPPER') prevents bash variable expansion
|
|
301
|
+
// but TypeScript still sees ${} as template literals, so we escape them with backslash
|
|
302
|
+
return `#!/bin/bash
|
|
303
|
+
# Setup prlt CLI - rebuild native modules if using mounted version
|
|
304
|
+
|
|
305
|
+
# Configure git wrapper to handle worktree path translation
|
|
306
|
+
# Worktree .git files contain host paths like: gitdir: /Users/.../repos/{repoName}/.git/worktrees/name
|
|
307
|
+
# Inside container, the parent repos are mounted at /hq/repos/{repoName}
|
|
308
|
+
#
|
|
309
|
+
# We create a git wrapper that translates paths on-the-fly using GIT_DIR
|
|
310
|
+
# This avoids modifying the .git file which is bind-mounted from the host
|
|
311
|
+
#
|
|
312
|
+
setup_git_wrapper() {
|
|
313
|
+
# Create git wrapper script in user's bin directory (already in PATH before /usr/bin)
|
|
314
|
+
mkdir -p /home/node/.npm-global/bin
|
|
315
|
+
cat > /home/node/.npm-global/bin/git << 'GITWRAPPER'
|
|
316
|
+
#!/bin/bash
|
|
317
|
+
# Git wrapper that handles worktree path translation for containers
|
|
318
|
+
# Translates host paths in .git files to container paths
|
|
319
|
+
|
|
320
|
+
# Find the .git file/dir by walking up the directory tree
|
|
321
|
+
find_git_file() {
|
|
322
|
+
local dir="$PWD"
|
|
323
|
+
while [ "$dir" != "/" ]; do
|
|
324
|
+
if [ -f "$dir/.git" ]; then
|
|
325
|
+
echo "$dir/.git"
|
|
326
|
+
return 0
|
|
327
|
+
elif [ -d "$dir/.git" ]; then
|
|
328
|
+
# Regular git repo, not a worktree - no translation needed
|
|
329
|
+
return 1
|
|
330
|
+
fi
|
|
331
|
+
dir="$(dirname "$dir")"
|
|
332
|
+
done
|
|
333
|
+
return 1
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
# Check if we need to translate the path
|
|
337
|
+
GIT_FILE="$(find_git_file)"
|
|
338
|
+
if [ -n "$GIT_FILE" ]; then
|
|
339
|
+
# Read the gitdir path from the .git file
|
|
340
|
+
# Format is: gitdir: /path/to/repos/{repoName}/.git/worktrees/name
|
|
341
|
+
HOST_PATH="$(sed -n 's/^gitdir: *//p' "$GIT_FILE")"
|
|
342
|
+
|
|
343
|
+
# Check if it's a host path that needs translation
|
|
344
|
+
case "$HOST_PATH" in
|
|
345
|
+
/Users/*|/home/*)
|
|
346
|
+
WORKTREE_NAME="$(basename "$HOST_PATH")"
|
|
347
|
+
# Extract repo name from host path: .../repos/{repoName}/.git/worktrees/...
|
|
348
|
+
# Remove .git/worktrees/name suffix, then get basename
|
|
349
|
+
REPO_PATH="$(echo "$HOST_PATH" | sed 's|/.git/worktrees/.*||')"
|
|
350
|
+
REPO_NAME="$(basename "$REPO_PATH")"
|
|
351
|
+
CONTAINER_PATH="/hq/repos/$REPO_NAME/.git/worktrees/$WORKTREE_NAME"
|
|
352
|
+
if [ -d "$CONTAINER_PATH" ]; then
|
|
353
|
+
export GIT_DIR="$CONTAINER_PATH"
|
|
354
|
+
export GIT_WORK_TREE="$(dirname "$GIT_FILE")"
|
|
355
|
+
fi
|
|
356
|
+
;;
|
|
357
|
+
esac
|
|
358
|
+
fi
|
|
359
|
+
|
|
360
|
+
# Run the real git command
|
|
361
|
+
exec /usr/bin/git "$@"
|
|
362
|
+
GITWRAPPER
|
|
363
|
+
|
|
364
|
+
chmod +x /home/node/.npm-global/bin/git
|
|
365
|
+
echo "Git wrapper installed for worktree path translation"
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
# Set up git wrapper for worktree path translation
|
|
369
|
+
setup_git_wrapper
|
|
370
|
+
|
|
371
|
+
# Copy Claude credentials from workspace to home (each container gets its own copy)
|
|
372
|
+
if [ -f "/workspace/.claude.json" ]; then
|
|
373
|
+
cp /workspace/.claude.json /home/node/.claude.json
|
|
374
|
+
echo "Claude credentials copied"
|
|
375
|
+
fi
|
|
376
|
+
|
|
377
|
+
# Configure git to use GitHub token for authentication
|
|
378
|
+
# Check for token in environment or get from gh CLI
|
|
379
|
+
TOKEN=""
|
|
380
|
+
if [ -n "$GITHUB_TOKEN" ]; then
|
|
381
|
+
TOKEN="$GITHUB_TOKEN"
|
|
382
|
+
echo "Using GITHUB_TOKEN from environment"
|
|
383
|
+
elif [ -n "$GH_TOKEN" ]; then
|
|
384
|
+
TOKEN="$GH_TOKEN"
|
|
385
|
+
echo "Using GH_TOKEN from environment"
|
|
386
|
+
elif command -v gh &> /dev/null && gh auth status &>/dev/null; then
|
|
387
|
+
TOKEN=$(gh auth token 2>/dev/null)
|
|
388
|
+
if [ -n "$TOKEN" ]; then
|
|
389
|
+
echo "Using token from gh CLI"
|
|
390
|
+
export GH_TOKEN="$TOKEN"
|
|
391
|
+
fi
|
|
392
|
+
fi
|
|
393
|
+
|
|
394
|
+
if [ -n "$TOKEN" ]; then
|
|
395
|
+
# Store token in a file for the credential helper (avoids env var issues)
|
|
396
|
+
echo "$TOKEN" > /home/node/.github-token
|
|
397
|
+
chmod 600 /home/node/.github-token
|
|
398
|
+
|
|
399
|
+
# Configure git credential helper to read token from file
|
|
400
|
+
git config --global credential.helper "!f() { echo \\"username=x-access-token\\"; echo \\"password=\\$(cat /home/node/.github-token)\\"; }; f"
|
|
401
|
+
|
|
402
|
+
# Convert SSH URLs to HTTPS (SCP style: git@github.com:user/repo.git)
|
|
403
|
+
git config --global url."https://github.com/".insteadOf "git@github.com:"
|
|
404
|
+
|
|
405
|
+
# Configure gh CLI to use the token
|
|
406
|
+
echo "$TOKEN" | gh auth login --with-token 2>/dev/null && echo "gh CLI authenticated" || echo "gh CLI auth (optional)"
|
|
407
|
+
|
|
408
|
+
echo "Git configured for GitHub push via HTTPS"
|
|
409
|
+
else
|
|
410
|
+
echo "Warning: No GitHub token found, push to GitHub will require manual auth"
|
|
411
|
+
fi
|
|
412
|
+
|
|
413
|
+
# Check if prlt is already installed globally (via npm from GitHub Packages)
|
|
414
|
+
if command -v prlt &> /dev/null; then
|
|
415
|
+
PRLT_PATH=$(which prlt)
|
|
416
|
+
if [[ "$PRLT_PATH" == "/home/node/.npm-global/bin/prlt" ]]; then
|
|
417
|
+
echo "prlt installed via npm, no setup needed"
|
|
418
|
+
exit 0
|
|
419
|
+
fi
|
|
420
|
+
fi
|
|
421
|
+
|
|
422
|
+
# Check if mounted prlt exists at /opt/prlt
|
|
423
|
+
if [ -d "/opt/prlt/apps/cli" ]; then
|
|
424
|
+
echo "Setting up mounted prlt..."
|
|
425
|
+
|
|
426
|
+
PRLT_LOCAL="/home/node/.prlt-local"
|
|
427
|
+
|
|
428
|
+
# Only rebuild if not already done
|
|
429
|
+
if [ ! -f "$PRLT_LOCAL/.setup-complete" ]; then
|
|
430
|
+
echo "Rebuilding native modules for container architecture..."
|
|
431
|
+
mkdir -p "$PRLT_LOCAL"
|
|
432
|
+
|
|
433
|
+
# Install only better-sqlite3 with correct architecture
|
|
434
|
+
cd "$PRLT_LOCAL"
|
|
435
|
+
npm init -y > /dev/null 2>&1
|
|
436
|
+
npm install better-sqlite3@11.6.0 --build-from-source 2>&1 || {
|
|
437
|
+
echo "Warning: better-sqlite3 rebuild failed"
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
touch "$PRLT_LOCAL/.setup-complete"
|
|
441
|
+
echo "Native module rebuild complete"
|
|
442
|
+
else
|
|
443
|
+
echo "prlt native modules already set up"
|
|
444
|
+
fi
|
|
445
|
+
|
|
446
|
+
# Create ESM loader to redirect better-sqlite3 to rebuilt version
|
|
447
|
+
LOADER="/home/node/.prlt-local/loader.mjs"
|
|
448
|
+
cat > "$LOADER" << 'LOADER_EOF'
|
|
449
|
+
export async function resolve(specifier, context, nextResolve) {
|
|
450
|
+
if (specifier === "better-sqlite3") {
|
|
451
|
+
return {
|
|
452
|
+
shortCircuit: true,
|
|
453
|
+
url: "file:///home/node/.prlt-local/node_modules/better-sqlite3/lib/index.js"
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
return nextResolve(specifier, context);
|
|
457
|
+
}
|
|
458
|
+
LOADER_EOF
|
|
459
|
+
|
|
460
|
+
# Create wrapper script that uses ESM loader for native module resolution
|
|
461
|
+
WRAPPER="/home/node/.npm-global/bin/prlt"
|
|
462
|
+
mkdir -p /home/node/.npm-global/bin
|
|
463
|
+
cat > "$WRAPPER" << 'WRAPPER_EOF'
|
|
464
|
+
#!/bin/bash
|
|
465
|
+
NODE_NO_WARNINGS=1 exec node --experimental-loader /home/node/.prlt-local/loader.mjs /opt/prlt/apps/cli/bin/run.js "$@"
|
|
466
|
+
WRAPPER_EOF
|
|
467
|
+
chmod +x "$WRAPPER"
|
|
468
|
+
echo "prlt wrapper ready at $WRAPPER"
|
|
469
|
+
else
|
|
470
|
+
echo "No mounted prlt found, skipping setup"
|
|
471
|
+
fi
|
|
472
|
+
|
|
473
|
+
# Install workspace dependencies if package.json exists
|
|
474
|
+
install_workspace_deps() {
|
|
475
|
+
local workspace_dir="$1"
|
|
476
|
+
if [ -f "$workspace_dir/package.json" ]; then
|
|
477
|
+
echo "Installing dependencies in $workspace_dir..."
|
|
478
|
+
cd "$workspace_dir"
|
|
479
|
+
if [ -f "pnpm-lock.yaml" ]; then
|
|
480
|
+
pnpm install 2>&1 || npm install 2>&1
|
|
481
|
+
elif [ -f "package-lock.json" ]; then
|
|
482
|
+
npm ci 2>&1 || npm install 2>&1
|
|
483
|
+
else
|
|
484
|
+
npm install 2>&1
|
|
485
|
+
fi
|
|
486
|
+
fi
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
# Check workspace repos for package.json and install deps
|
|
490
|
+
for repo_dir in /workspace/*/; do
|
|
491
|
+
if [ -d "$repo_dir" ] && [ -f "$repo_dir/package.json" ]; then
|
|
492
|
+
install_workspace_deps "$repo_dir"
|
|
493
|
+
# Also check for monorepo structure (apps/cli for prlt)
|
|
494
|
+
if [ -f "$repo_dir/apps/cli/package.json" ]; then
|
|
495
|
+
install_workspace_deps "$repo_dir/apps/cli"
|
|
496
|
+
fi
|
|
497
|
+
fi
|
|
498
|
+
done
|
|
499
|
+
|
|
500
|
+
echo "Workspace setup complete"
|
|
501
|
+
`;
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* Create .devcontainer/ directory structure for an agent
|
|
505
|
+
* Writes devcontainer.json, Dockerfile, and init-firewall.sh
|
|
506
|
+
*/
|
|
507
|
+
export function createDevcontainerConfig(options, config) {
|
|
508
|
+
const devcontainerDir = path.join(options.agentDir, '.devcontainer');
|
|
509
|
+
// Create .devcontainer directory
|
|
510
|
+
fs.mkdirSync(devcontainerDir, { recursive: true });
|
|
511
|
+
// Generate and write devcontainer.json
|
|
512
|
+
const devcontainerJson = generateDevcontainerJson(options, config);
|
|
513
|
+
const devcontainerJsonPath = path.join(devcontainerDir, 'devcontainer.json');
|
|
514
|
+
fs.writeFileSync(devcontainerJsonPath, JSON.stringify(devcontainerJson, null, 2) + '\n');
|
|
515
|
+
// Generate and write Dockerfile
|
|
516
|
+
const dockerfile = generateDockerfile(options);
|
|
517
|
+
const dockerfilePath = path.join(devcontainerDir, 'Dockerfile');
|
|
518
|
+
fs.writeFileSync(dockerfilePath, dockerfile);
|
|
519
|
+
// Generate and write firewall script
|
|
520
|
+
const firewallScript = generateFirewallScript();
|
|
521
|
+
const firewallScriptPath = path.join(devcontainerDir, 'init-firewall.sh');
|
|
522
|
+
fs.writeFileSync(firewallScriptPath, firewallScript, { mode: 0o755 });
|
|
523
|
+
// Generate and write prlt setup script
|
|
524
|
+
const setupScript = generatePrltSetupScript();
|
|
525
|
+
const setupScriptPath = path.join(devcontainerDir, 'setup-prlt.sh');
|
|
526
|
+
fs.writeFileSync(setupScriptPath, setupScript, { mode: 0o755 });
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Check if agent has devcontainer configuration
|
|
530
|
+
*/
|
|
531
|
+
export function hasDevcontainerConfig(agentDir) {
|
|
532
|
+
const devcontainerJsonPath = path.join(agentDir, '.devcontainer', 'devcontainer.json');
|
|
533
|
+
return fs.existsSync(devcontainerJsonPath);
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Read existing devcontainer.json
|
|
537
|
+
*/
|
|
538
|
+
export function readDevcontainerJson(agentDir) {
|
|
539
|
+
const devcontainerJsonPath = path.join(agentDir, '.devcontainer', 'devcontainer.json');
|
|
540
|
+
if (!fs.existsSync(devcontainerJsonPath)) {
|
|
541
|
+
return null;
|
|
542
|
+
}
|
|
543
|
+
try {
|
|
544
|
+
const content = fs.readFileSync(devcontainerJsonPath, 'utf-8');
|
|
545
|
+
return JSON.parse(content);
|
|
546
|
+
}
|
|
547
|
+
catch {
|
|
548
|
+
return null;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Update devcontainer.json with new mounts (e.g., when new repo worktrees are added)
|
|
553
|
+
*
|
|
554
|
+
* Note: With the simplified mount strategy (entire agent workspace), this is mainly
|
|
555
|
+
* for backwards compatibility or if someone wants to customize mounts.
|
|
556
|
+
*/
|
|
557
|
+
export function updateDevcontainerMounts(agentDir, _repoWorktrees) {
|
|
558
|
+
const devcontainerJson = readDevcontainerJson(agentDir);
|
|
559
|
+
if (!devcontainerJson) {
|
|
560
|
+
return;
|
|
561
|
+
}
|
|
562
|
+
// Use single mount for entire workspace - includes all repos and temp files
|
|
563
|
+
// NOTE: ~/.claude.json is COPIED (not mounted) to /workspace/.claude.json
|
|
564
|
+
// to avoid corruption from concurrent writes by multiple containers
|
|
565
|
+
devcontainerJson.mounts = [
|
|
566
|
+
'source=${localWorkspaceFolder},target=/workspace,type=bind',
|
|
567
|
+
'source=claude-bash-history,target=/commandhistory,type=volume',
|
|
568
|
+
'source=claude-credentials,target=/home/node/.claude,type=volume',
|
|
569
|
+
];
|
|
570
|
+
// Write back
|
|
571
|
+
const devcontainerJsonPath = path.join(agentDir, '.devcontainer', 'devcontainer.json');
|
|
572
|
+
fs.writeFileSync(devcontainerJsonPath, JSON.stringify(devcontainerJson, null, 2) + '\n');
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* Get list of repo directories inside the agent workspace.
|
|
576
|
+
* With the full workspace mount, this returns all non-hidden subdirectories
|
|
577
|
+
* (excluding .devcontainer).
|
|
578
|
+
*/
|
|
579
|
+
export function getMountedRepos(agentDir) {
|
|
580
|
+
try {
|
|
581
|
+
const entries = fs.readdirSync(agentDir, { withFileTypes: true });
|
|
582
|
+
return entries
|
|
583
|
+
.filter((entry) => {
|
|
584
|
+
// Include directories that are not hidden and not .devcontainer
|
|
585
|
+
return entry.isDirectory() &&
|
|
586
|
+
!entry.name.startsWith('.') &&
|
|
587
|
+
entry.name !== '.devcontainer';
|
|
588
|
+
})
|
|
589
|
+
.map((entry) => entry.name);
|
|
590
|
+
}
|
|
591
|
+
catch {
|
|
592
|
+
return [];
|
|
593
|
+
}
|
|
594
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution Runners
|
|
3
|
+
*
|
|
4
|
+
* Implementations for each execution environment (devcontainer, host, docker, vm).
|
|
5
|
+
*/
|
|
6
|
+
import { ExecutionEnvironment, DisplayMode, SessionManager, ExecutorType, ExecutionContext, ExecutionConfig } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Build a unified name for tmux sessions, window names, and tab titles.
|
|
9
|
+
* Format: "{ticketId}-{action}-{agentName}"
|
|
10
|
+
* Example: "TKT-347-implement-altman"
|
|
11
|
+
*/
|
|
12
|
+
export declare function buildSessionName(context: ExecutionContext): string;
|
|
13
|
+
export interface RunnerResult {
|
|
14
|
+
success: boolean;
|
|
15
|
+
pid?: string;
|
|
16
|
+
containerId?: string;
|
|
17
|
+
sessionId?: string;
|
|
18
|
+
logPath?: string;
|
|
19
|
+
error?: string;
|
|
20
|
+
}
|
|
21
|
+
export type Runner = (context: ExecutionContext, executor: ExecutorType, config: ExecutionConfig) => Promise<RunnerResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Run command on the host machine with tmux session for persistence.
|
|
24
|
+
* Supports multiple terminal emulators on macOS.
|
|
25
|
+
*
|
|
26
|
+
* Architecture (same as devcontainer):
|
|
27
|
+
* - Always creates a host tmux session for session persistence
|
|
28
|
+
* - displayMode controls whether to open a terminal tab attached to the session
|
|
29
|
+
* - User can reattach with `prlt session attach` if tab is closed
|
|
30
|
+
*/
|
|
31
|
+
export declare function runHost(context: ExecutionContext, executor: ExecutorType, config: ExecutionConfig, displayMode?: DisplayMode): Promise<RunnerResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Check if Docker daemon is running.
|
|
34
|
+
* Returns true if Docker is available and responsive.
|
|
35
|
+
* Uses retry logic to handle slow Docker Desktop startup.
|
|
36
|
+
*/
|
|
37
|
+
export declare function isDockerRunning(): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Run command inside a devcontainer.
|
|
40
|
+
* Uses the devcontainer CLI to start/exec in a VS Code devcontainer.
|
|
41
|
+
* Provides filesystem isolation - agent can only access mounted worktrees.
|
|
42
|
+
*
|
|
43
|
+
* @param displayMode - How to display output (terminal, foreground, background, tmux)
|
|
44
|
+
* @param sessionManager - How to manage the session inside the container (tmux, direct)
|
|
45
|
+
*/
|
|
46
|
+
export declare function runDevcontainer(context: ExecutionContext, executor: ExecutorType, config: ExecutionConfig, displayMode?: DisplayMode, sessionManager?: SessionManager): Promise<RunnerResult>;
|
|
47
|
+
export declare function runDocker(context: ExecutionContext, executor: ExecutorType, config: ExecutionConfig): Promise<RunnerResult>;
|
|
48
|
+
export declare function runVm(context: ExecutionContext, executor: ExecutorType, config: ExecutionConfig, host?: string): Promise<RunnerResult>;
|
|
49
|
+
export declare function runExecution(environment: ExecutionEnvironment, context: ExecutionContext, executor: ExecutorType, config?: ExecutionConfig, options?: {
|
|
50
|
+
host?: string;
|
|
51
|
+
displayMode?: DisplayMode;
|
|
52
|
+
sessionManager?: SessionManager;
|
|
53
|
+
}): Promise<RunnerResult>;
|