@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,153 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { findAllHQs, findHQRootWithSource, isValidHQ } from '../../lib/workspace.js';
|
|
4
|
+
import { getRegisteredWorkspaces, getActiveWorkspace, } from '../../lib/machine-config.js';
|
|
5
|
+
import * as fs from 'node:fs';
|
|
6
|
+
import * as path from 'node:path';
|
|
7
|
+
export default class WorkspaceList extends Command {
|
|
8
|
+
static description = 'List all registered and discovered HQ workspaces';
|
|
9
|
+
static examples = [
|
|
10
|
+
'<%= config.bin %> <%= command.id %>',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> --json',
|
|
12
|
+
];
|
|
13
|
+
static flags = {
|
|
14
|
+
json: Flags.boolean({
|
|
15
|
+
description: 'Output as JSON for machine-readable format',
|
|
16
|
+
default: false,
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
async run() {
|
|
20
|
+
const { flags } = await this.parse(WorkspaceList);
|
|
21
|
+
const cwd = process.cwd();
|
|
22
|
+
// Get registered workspaces from machine config
|
|
23
|
+
const registeredWorkspaces = getRegisteredWorkspaces();
|
|
24
|
+
const activeWorkspacePath = getActiveWorkspace();
|
|
25
|
+
// Also find any workspaces in directory tree (for backward compatibility)
|
|
26
|
+
const discoveredHQs = findAllHQs(cwd);
|
|
27
|
+
// Get the current active workspace (from findHQRootWithSource)
|
|
28
|
+
const currentWorkspace = findHQRootWithSource(cwd);
|
|
29
|
+
// Build unified workspace list
|
|
30
|
+
const workspaces = [];
|
|
31
|
+
const seenPaths = new Set();
|
|
32
|
+
// Add registered workspaces first
|
|
33
|
+
for (const workspace of registeredWorkspaces) {
|
|
34
|
+
const exists = fs.existsSync(workspace.path);
|
|
35
|
+
const isActive = activeWorkspacePath === workspace.path ||
|
|
36
|
+
currentWorkspace?.path === workspace.path;
|
|
37
|
+
let hasPMO = false;
|
|
38
|
+
if (exists) {
|
|
39
|
+
const dbPath = path.join(workspace.path, '.proletariat', 'workspace.db');
|
|
40
|
+
hasPMO = fs.existsSync(dbPath);
|
|
41
|
+
}
|
|
42
|
+
workspaces.push({
|
|
43
|
+
name: workspace.name,
|
|
44
|
+
path: workspace.path,
|
|
45
|
+
isActive,
|
|
46
|
+
exists,
|
|
47
|
+
hasPMO,
|
|
48
|
+
registeredAt: workspace.registeredAt,
|
|
49
|
+
source: 'registry',
|
|
50
|
+
});
|
|
51
|
+
seenPaths.add(workspace.path);
|
|
52
|
+
}
|
|
53
|
+
// Add discovered workspaces that aren't in the registry
|
|
54
|
+
for (const hqPath of discoveredHQs) {
|
|
55
|
+
if (seenPaths.has(hqPath))
|
|
56
|
+
continue;
|
|
57
|
+
// Get workspace info
|
|
58
|
+
const configPath = path.join(hqPath, '.proletariat', 'config.json');
|
|
59
|
+
let workspaceName = path.basename(hqPath);
|
|
60
|
+
if (fs.existsSync(configPath)) {
|
|
61
|
+
try {
|
|
62
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
63
|
+
workspaceName = config.name || workspaceName;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Use defaults
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Check if it has PMO
|
|
70
|
+
const dbPath = path.join(hqPath, '.proletariat', 'workspace.db');
|
|
71
|
+
const hasPMO = fs.existsSync(dbPath);
|
|
72
|
+
const isActive = currentWorkspace?.path === hqPath;
|
|
73
|
+
workspaces.push({
|
|
74
|
+
name: workspaceName,
|
|
75
|
+
path: hqPath,
|
|
76
|
+
isActive,
|
|
77
|
+
exists: true,
|
|
78
|
+
hasPMO,
|
|
79
|
+
source: 'discovered',
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// JSON output
|
|
83
|
+
if (flags.json) {
|
|
84
|
+
const output = {
|
|
85
|
+
workspaces: workspaces.map((w) => ({
|
|
86
|
+
name: w.name,
|
|
87
|
+
path: w.path,
|
|
88
|
+
active: w.isActive,
|
|
89
|
+
exists: w.exists,
|
|
90
|
+
hasPMO: w.hasPMO,
|
|
91
|
+
registeredAt: w.registeredAt,
|
|
92
|
+
source: w.source,
|
|
93
|
+
})),
|
|
94
|
+
activeWorkspace: activeWorkspacePath,
|
|
95
|
+
envOverride: process.env.PRLT_HQ_PATH || null,
|
|
96
|
+
};
|
|
97
|
+
this.log(JSON.stringify(output, null, 2));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// Human-readable output
|
|
101
|
+
if (workspaces.length === 0) {
|
|
102
|
+
this.log(chalk.yellow('No workspaces found.'));
|
|
103
|
+
this.log(chalk.gray('Run "prlt init" to create a new workspace.'));
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
this.log(chalk.blue('\nRegistered workspaces:\n'));
|
|
107
|
+
for (const workspace of workspaces) {
|
|
108
|
+
const activeMarker = workspace.isActive ? chalk.green(' (active)') : '';
|
|
109
|
+
const envMarker = workspace.isActive && currentWorkspace?.source === 'env'
|
|
110
|
+
? chalk.cyan(' [via PRLT_HQ_PATH]')
|
|
111
|
+
: '';
|
|
112
|
+
const pmoMarker = workspace.hasPMO
|
|
113
|
+
? chalk.gray(' [has PMO]')
|
|
114
|
+
: chalk.gray(' [no PMO]');
|
|
115
|
+
const unregisteredMarker = workspace.source === 'discovered'
|
|
116
|
+
? chalk.yellow(' [not registered]')
|
|
117
|
+
: '';
|
|
118
|
+
if (!workspace.exists) {
|
|
119
|
+
// Warning for stale registration
|
|
120
|
+
this.log(` ${chalk.red('⚠')} ${chalk.strikethrough(chalk.white(workspace.name))}${activeMarker}`);
|
|
121
|
+
this.log(chalk.red(` Path no longer exists: ${workspace.path}`));
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
this.log(` ${chalk.white(workspace.name)}${activeMarker}${envMarker}${pmoMarker}${unregisteredMarker}`);
|
|
125
|
+
this.log(chalk.gray(` Path: ${workspace.path}`));
|
|
126
|
+
}
|
|
127
|
+
this.log('');
|
|
128
|
+
}
|
|
129
|
+
// Show warning for unregistered workspaces
|
|
130
|
+
const unregistered = workspaces.filter((w) => w.source === 'discovered');
|
|
131
|
+
if (unregistered.length > 0) {
|
|
132
|
+
this.log(chalk.yellow('Some workspaces are not registered.'));
|
|
133
|
+
this.log(chalk.gray('Run "prlt workspace add <path>" to register them.'));
|
|
134
|
+
this.log('');
|
|
135
|
+
}
|
|
136
|
+
// Show helpful hints if multiple workspaces found
|
|
137
|
+
const registeredCount = workspaces.filter((w) => w.source === 'registry').length;
|
|
138
|
+
if (registeredCount > 1) {
|
|
139
|
+
this.log(chalk.gray('To switch workspaces, run:'));
|
|
140
|
+
this.log(chalk.cyan(' prlt workspace use <name|path>'));
|
|
141
|
+
this.log('');
|
|
142
|
+
}
|
|
143
|
+
// Show PRLT_HQ_PATH if set
|
|
144
|
+
if (process.env.PRLT_HQ_PATH) {
|
|
145
|
+
this.log(chalk.blue('Current PRLT_HQ_PATH:'));
|
|
146
|
+
this.log(chalk.cyan(` ${process.env.PRLT_HQ_PATH}`));
|
|
147
|
+
if (!isValidHQ(process.env.PRLT_HQ_PATH)) {
|
|
148
|
+
this.log(chalk.red(' (Warning: This path is not a valid HQ workspace)'));
|
|
149
|
+
}
|
|
150
|
+
this.log('');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class WorkspaceRemove extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
nameOrPath: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
};
|
|
11
|
+
run(): Promise<void>;
|
|
12
|
+
private resolveWorkspacePath;
|
|
13
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { Command, Args, Flags } from '@oclif/core';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import inquirer from 'inquirer';
|
|
4
|
+
import { findWorkspacesByName, findWorkspaceByPath, unregisterWorkspace, normalizePath, getActiveWorkspace, } from '../../lib/machine-config.js';
|
|
5
|
+
import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
|
|
6
|
+
export default class WorkspaceRemove extends Command {
|
|
7
|
+
static description = 'Unregister a workspace from the machine config (does NOT delete files)';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %> my-workspace',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> /path/to/workspace',
|
|
11
|
+
];
|
|
12
|
+
static args = {
|
|
13
|
+
nameOrPath: Args.string({
|
|
14
|
+
description: 'Workspace name or path to unregister',
|
|
15
|
+
required: true,
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
static flags = {
|
|
19
|
+
json: Flags.boolean({
|
|
20
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
21
|
+
default: false,
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
async run() {
|
|
25
|
+
const { args, flags } = await this.parse(WorkspaceRemove);
|
|
26
|
+
// Check if JSON output mode is active
|
|
27
|
+
const jsonMode = shouldOutputJson(flags);
|
|
28
|
+
// Helper to handle errors in JSON mode
|
|
29
|
+
const handleError = (code, message) => {
|
|
30
|
+
if (jsonMode) {
|
|
31
|
+
outputErrorAsJson(code, message, createMetadata('workspace remove', flags));
|
|
32
|
+
this.exit(1);
|
|
33
|
+
}
|
|
34
|
+
this.error(message);
|
|
35
|
+
};
|
|
36
|
+
const input = args.nameOrPath;
|
|
37
|
+
// Resolve workspace path
|
|
38
|
+
const workspacePath = await this.resolveWorkspacePath(input, jsonMode, flags);
|
|
39
|
+
// Check if this is the active workspace
|
|
40
|
+
const activeWorkspace = getActiveWorkspace();
|
|
41
|
+
const wasActive = activeWorkspace === workspacePath;
|
|
42
|
+
// Unregister the workspace
|
|
43
|
+
const removed = unregisterWorkspace(workspacePath);
|
|
44
|
+
if (removed) {
|
|
45
|
+
this.log(chalk.green(`Unregistered workspace: ${workspacePath}`));
|
|
46
|
+
this.log(chalk.gray('Note: Files were NOT deleted, only removed from registry.'));
|
|
47
|
+
if (wasActive) {
|
|
48
|
+
this.log(chalk.yellow('This was the active workspace. Active workspace has been cleared.'));
|
|
49
|
+
this.log(chalk.gray('Run "prlt workspace use <name>" to set a new active workspace.'));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
this.error(`Failed to unregister workspace: ${workspacePath}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async resolveWorkspacePath(input, jsonMode = false, flags = {}) {
|
|
57
|
+
// First, try to find by path
|
|
58
|
+
const normalizedPath = normalizePath(input);
|
|
59
|
+
const byPath = findWorkspaceByPath(normalizedPath);
|
|
60
|
+
if (byPath) {
|
|
61
|
+
return byPath.path;
|
|
62
|
+
}
|
|
63
|
+
// Try to find by name
|
|
64
|
+
const matches = findWorkspacesByName(input);
|
|
65
|
+
if (matches.length === 0) {
|
|
66
|
+
if (jsonMode) {
|
|
67
|
+
outputErrorAsJson('WORKSPACE_NOT_FOUND', `Workspace not found: ${input}`, createMetadata('workspace remove', flags));
|
|
68
|
+
this.exit(1);
|
|
69
|
+
}
|
|
70
|
+
this.error(`Workspace not found: ${input}`);
|
|
71
|
+
}
|
|
72
|
+
if (matches.length === 1) {
|
|
73
|
+
return matches[0].path;
|
|
74
|
+
}
|
|
75
|
+
// Build choices once, use for both JSON and interactive modes
|
|
76
|
+
const workspaceChoices = matches.map((w) => ({
|
|
77
|
+
name: `${w.name} - ${w.path}`,
|
|
78
|
+
value: w.path,
|
|
79
|
+
}));
|
|
80
|
+
const message = `Multiple workspaces found with name "${input}". Which workspace do you want to remove?`;
|
|
81
|
+
// In JSON mode, output workspace selection prompt
|
|
82
|
+
if (jsonMode) {
|
|
83
|
+
outputPromptAsJson(buildPromptConfig('list', 'workspacePath', message, workspaceChoices), createMetadata('workspace remove', flags));
|
|
84
|
+
this.exit(0);
|
|
85
|
+
}
|
|
86
|
+
// Multiple workspaces with same name - prompt user to choose
|
|
87
|
+
this.log(chalk.yellow(`Multiple workspaces found with name "${input}":`));
|
|
88
|
+
const { selected } = await inquirer.prompt([
|
|
89
|
+
{
|
|
90
|
+
type: 'list',
|
|
91
|
+
name: 'selected',
|
|
92
|
+
message: 'Which workspace do you want to remove?',
|
|
93
|
+
choices: workspaceChoices,
|
|
94
|
+
},
|
|
95
|
+
]);
|
|
96
|
+
return selected;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class WorkspaceUse extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
nameOrPath: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
};
|
|
11
|
+
run(): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { Command, Args, Flags } from '@oclif/core';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import inquirer from 'inquirer';
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import { isValidHQ } from '../../lib/workspace.js';
|
|
6
|
+
import { findWorkspacesByName, findWorkspaceByPath, setActiveWorkspace, normalizePath, getRegisteredWorkspaces, } from '../../lib/machine-config.js';
|
|
7
|
+
import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
|
|
8
|
+
export default class WorkspaceUse extends Command {
|
|
9
|
+
static description = 'Set the active workspace';
|
|
10
|
+
static examples = [
|
|
11
|
+
'<%= config.bin %> <%= command.id %> my-workspace',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> /path/to/workspace',
|
|
13
|
+
];
|
|
14
|
+
static args = {
|
|
15
|
+
nameOrPath: Args.string({
|
|
16
|
+
description: 'Workspace name or path',
|
|
17
|
+
required: true,
|
|
18
|
+
}),
|
|
19
|
+
};
|
|
20
|
+
static flags = {
|
|
21
|
+
json: Flags.boolean({
|
|
22
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
23
|
+
default: false,
|
|
24
|
+
}),
|
|
25
|
+
};
|
|
26
|
+
async run() {
|
|
27
|
+
const { args, flags } = await this.parse(WorkspaceUse);
|
|
28
|
+
// Check if JSON output mode is active
|
|
29
|
+
const jsonMode = shouldOutputJson(flags);
|
|
30
|
+
// Helper to handle errors in JSON mode
|
|
31
|
+
const handleError = (code, message) => {
|
|
32
|
+
if (jsonMode) {
|
|
33
|
+
outputErrorAsJson(code, message, createMetadata('workspace use', flags));
|
|
34
|
+
this.exit(1);
|
|
35
|
+
}
|
|
36
|
+
this.error(message);
|
|
37
|
+
};
|
|
38
|
+
const input = args.nameOrPath;
|
|
39
|
+
// First, try to find by path
|
|
40
|
+
const normalizedPath = normalizePath(input);
|
|
41
|
+
let workspace = findWorkspaceByPath(normalizedPath);
|
|
42
|
+
if (!workspace) {
|
|
43
|
+
// Try to find by name
|
|
44
|
+
const matches = findWorkspacesByName(input);
|
|
45
|
+
if (matches.length === 0) {
|
|
46
|
+
// Check if input is a valid path that exists but isn't registered
|
|
47
|
+
if (fs.existsSync(normalizedPath) && isValidHQ(normalizedPath)) {
|
|
48
|
+
this.log(chalk.yellow(`Workspace at "${normalizedPath}" exists but is not registered.`));
|
|
49
|
+
this.log(chalk.gray('Run "prlt workspace add" to register it first, or specify a registered workspace.'));
|
|
50
|
+
this.log('');
|
|
51
|
+
this.log(chalk.gray('Registered workspaces:'));
|
|
52
|
+
const registered = getRegisteredWorkspaces();
|
|
53
|
+
if (registered.length === 0) {
|
|
54
|
+
this.log(chalk.gray(' (none)'));
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
for (const w of registered) {
|
|
58
|
+
this.log(chalk.gray(` - ${w.name} (${w.path})`));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
this.error('Workspace not registered');
|
|
62
|
+
}
|
|
63
|
+
this.error(`Workspace not found: ${input}`);
|
|
64
|
+
}
|
|
65
|
+
if (matches.length > 1) {
|
|
66
|
+
// Build choices once, use for both JSON and interactive modes
|
|
67
|
+
const workspaceChoices = matches.map((w) => ({
|
|
68
|
+
name: `${w.name} - ${w.path}`,
|
|
69
|
+
value: w.path,
|
|
70
|
+
}));
|
|
71
|
+
const message = `Multiple workspaces found with name "${input}". Which workspace do you want to use?`;
|
|
72
|
+
// In JSON mode, output workspace selection prompt
|
|
73
|
+
if (jsonMode) {
|
|
74
|
+
outputPromptAsJson(buildPromptConfig('list', 'workspacePath', message, workspaceChoices), createMetadata('workspace use', flags));
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
// Multiple workspaces with same name - prompt user to choose
|
|
78
|
+
this.log(chalk.yellow(`Multiple workspaces found with name "${input}":`));
|
|
79
|
+
const { selected } = await inquirer.prompt([
|
|
80
|
+
{
|
|
81
|
+
type: 'list',
|
|
82
|
+
name: 'selected',
|
|
83
|
+
message: 'Which workspace do you want to use?',
|
|
84
|
+
choices: workspaceChoices,
|
|
85
|
+
},
|
|
86
|
+
]);
|
|
87
|
+
workspace = matches.find((w) => w.path === selected);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
workspace = matches[0];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Validate workspace still exists on filesystem
|
|
94
|
+
if (!fs.existsSync(workspace.path)) {
|
|
95
|
+
this.error(`Workspace path no longer exists: ${workspace.path}`);
|
|
96
|
+
}
|
|
97
|
+
// Validate it's still a valid HQ
|
|
98
|
+
if (!isValidHQ(workspace.path)) {
|
|
99
|
+
this.error(`Path is no longer a valid workspace: ${workspace.path}`);
|
|
100
|
+
}
|
|
101
|
+
// Set as active workspace
|
|
102
|
+
try {
|
|
103
|
+
setActiveWorkspace(workspace.path);
|
|
104
|
+
this.log(chalk.green(`Active workspace set to: ${workspace.name}`));
|
|
105
|
+
this.log(chalk.gray(` Path: ${workspace.path}`));
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
this.error(`Failed to set active workspace: ${error.message}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Hook } from '@oclif/core';
|
|
2
|
+
/**
|
|
3
|
+
* Init hook - runs before every command
|
|
4
|
+
*
|
|
5
|
+
* Detects first-time users and redirects them to the init flow.
|
|
6
|
+
* A user is considered "first-time" if:
|
|
7
|
+
* - No workspaces are registered in machine config (~/.proletariat/config.json)
|
|
8
|
+
* - AND they're not currently inside a valid HQ directory
|
|
9
|
+
*/
|
|
10
|
+
declare const hook: Hook<'init'>;
|
|
11
|
+
export default hook;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { readMachineConfig } from '../lib/machine-config.js';
|
|
2
|
+
import { findHQRoot } from '../lib/workspace.js';
|
|
3
|
+
/**
|
|
4
|
+
* Init hook - runs before every command
|
|
5
|
+
*
|
|
6
|
+
* Detects first-time users and redirects them to the init flow.
|
|
7
|
+
* A user is considered "first-time" if:
|
|
8
|
+
* - No workspaces are registered in machine config (~/.proletariat/config.json)
|
|
9
|
+
* - AND they're not currently inside a valid HQ directory
|
|
10
|
+
*/
|
|
11
|
+
const hook = async function ({ id, config }) {
|
|
12
|
+
// Skip for init command to avoid infinite loop
|
|
13
|
+
if (id === 'init') {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
// Skip for help-related commands/flags
|
|
17
|
+
// When user runs just `prlt` with no args, id is undefined
|
|
18
|
+
if (!id || id === 'help') {
|
|
19
|
+
// Check if this is first-time user running bare `prlt`
|
|
20
|
+
if (!id && isFirstTimeUser()) {
|
|
21
|
+
// Run init command
|
|
22
|
+
const { run } = await import('@oclif/core');
|
|
23
|
+
await run(['init'], config);
|
|
24
|
+
// Exit after init completes to prevent showing help
|
|
25
|
+
process.exit(0);
|
|
26
|
+
}
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// For all other commands, check if first-time user
|
|
30
|
+
if (isFirstTimeUser()) {
|
|
31
|
+
const chalk = await import('chalk');
|
|
32
|
+
console.log(chalk.default.yellow('\n⚠️ No workspace found. Let\'s set one up first.\n'));
|
|
33
|
+
// Run init command
|
|
34
|
+
const { run } = await import('@oclif/core');
|
|
35
|
+
await run(['init'], config);
|
|
36
|
+
// Exit after init - user should re-run their original command
|
|
37
|
+
console.log(chalk.default.blue(`\n✅ Setup complete! You can now run: prlt ${id}\n`));
|
|
38
|
+
process.exit(0);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Check if this is a first-time user (no headquarters configured)
|
|
43
|
+
*/
|
|
44
|
+
function isFirstTimeUser() {
|
|
45
|
+
// Check if user is currently inside a valid HQ directory
|
|
46
|
+
const currentHQ = findHQRoot();
|
|
47
|
+
if (currentHQ) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
// Check if any headquarters are registered in machine config
|
|
51
|
+
const machineConfig = readMachineConfig();
|
|
52
|
+
if (machineConfig.headquarters.length > 0) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
export default hook;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { run } from '@oclif/core';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { run } from '@oclif/core';
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { Agent, Repository } from '../database/index.js';
|
|
2
|
+
export interface AgentStatus {
|
|
3
|
+
name: string;
|
|
4
|
+
exists: boolean;
|
|
5
|
+
branch?: string;
|
|
6
|
+
assignedTickets: string[];
|
|
7
|
+
completedTickets: string[];
|
|
8
|
+
repositories: {
|
|
9
|
+
name: string;
|
|
10
|
+
status: string;
|
|
11
|
+
commitsAhead: number;
|
|
12
|
+
}[];
|
|
13
|
+
}
|
|
14
|
+
export interface WorkspaceInfo {
|
|
15
|
+
path: string;
|
|
16
|
+
type: 'hq' | 'workspace';
|
|
17
|
+
workspaceName: string;
|
|
18
|
+
hasPMO: boolean;
|
|
19
|
+
agents: Agent[];
|
|
20
|
+
repositories: Repository[];
|
|
21
|
+
agentsPath: string;
|
|
22
|
+
/** Active theme ID (if any) */
|
|
23
|
+
activeThemeId: string | null;
|
|
24
|
+
/** Directory name for persistent agents (e.g., 'staff', 'garage', 'portfolio') */
|
|
25
|
+
persistentAgentsDir: string;
|
|
26
|
+
/** Directory name for ephemeral agents (e.g., 'temp', 'pit', 'incubator') */
|
|
27
|
+
ephemeralAgentsDir: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Find workspace root and return workspace information.
|
|
31
|
+
*
|
|
32
|
+
* Search priority:
|
|
33
|
+
* 1. PRLT_HQ_PATH environment variable (ONLY when DEVCONTAINER=true - for devcontainer mounts)
|
|
34
|
+
* 2. Current directory tree for HQ with workspace.db
|
|
35
|
+
*
|
|
36
|
+
* NOTE: PRLT_HQ_PATH is ignored on host machines to support multiple agents
|
|
37
|
+
* working in different workspaces simultaneously.
|
|
38
|
+
*/
|
|
39
|
+
export declare function getWorkspaceInfo(): WorkspaceInfo;
|
|
40
|
+
/**
|
|
41
|
+
* Validate agent name
|
|
42
|
+
*/
|
|
43
|
+
export { isValidAgentName } from '../themes.js';
|
|
44
|
+
/**
|
|
45
|
+
* Get suggested agent names (not yet added to workspace)
|
|
46
|
+
*/
|
|
47
|
+
export declare function getAvailableAgentSuggestions(workspaceInfo: WorkspaceInfo): string[];
|
|
48
|
+
/**
|
|
49
|
+
* Interactive agent selection - prompts user for agent names
|
|
50
|
+
*/
|
|
51
|
+
export declare function selectAgentsInteractively(workspaceInfo: WorkspaceInfo, message?: string): Promise<string[]>;
|
|
52
|
+
/**
|
|
53
|
+
* Interactive selection from existing agents
|
|
54
|
+
*/
|
|
55
|
+
export declare function selectExistingAgentsInteractively(workspaceInfo: WorkspaceInfo, message?: string): Promise<string[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Get detailed status for a specific agent
|
|
58
|
+
*/
|
|
59
|
+
export declare function getAgentStatus(workspaceInfo: WorkspaceInfo, agentName: string): AgentStatus;
|
|
60
|
+
/**
|
|
61
|
+
* Get status for all agents
|
|
62
|
+
*/
|
|
63
|
+
export declare function getAllAgentsStatus(workspaceInfo: WorkspaceInfo): AgentStatus[];
|
|
64
|
+
/**
|
|
65
|
+
* Validate agent names (must be valid format)
|
|
66
|
+
*/
|
|
67
|
+
export declare function validateAgentNames(agentNames: string[]): {
|
|
68
|
+
valid: string[];
|
|
69
|
+
invalid: string[];
|
|
70
|
+
};
|
|
71
|
+
export interface AddAgentOptions {
|
|
72
|
+
skipDevcontainer?: boolean;
|
|
73
|
+
themeId?: string;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Create agent worktrees and update database
|
|
77
|
+
*/
|
|
78
|
+
export declare function addAgentsToWorkspace(workspaceInfo: WorkspaceInfo, agentNames: string[], options?: AddAgentOptions): Promise<string[]>;
|
|
79
|
+
/**
|
|
80
|
+
* Remove agents and clean up worktrees
|
|
81
|
+
*/
|
|
82
|
+
export declare function removeAgentsFromWorkspace(workspaceInfo: WorkspaceInfo, agentNames: string[]): Promise<{
|
|
83
|
+
removed: string[];
|
|
84
|
+
failed: string[];
|
|
85
|
+
}>;
|
|
86
|
+
export interface EphemeralAgentOptions {
|
|
87
|
+
themeId?: string;
|
|
88
|
+
skipDevcontainer?: boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Optional logger for conflict messages (e.g., when a tmux session or directory already exists)
|
|
91
|
+
*/
|
|
92
|
+
log?: (message: string) => void;
|
|
93
|
+
}
|
|
94
|
+
export interface EphemeralAgentResult {
|
|
95
|
+
name: string;
|
|
96
|
+
baseName: string;
|
|
97
|
+
worktreePath: string;
|
|
98
|
+
agent: Agent;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Create an ephemeral agent on-demand for a spawn operation.
|
|
102
|
+
* Creates worktree in agents/temp/{name}/
|
|
103
|
+
*/
|
|
104
|
+
export declare function createEphemeralAgent(workspaceInfo: WorkspaceInfo, options?: EphemeralAgentOptions): Promise<EphemeralAgentResult>;
|
|
105
|
+
/**
|
|
106
|
+
* Check if a tmux session exists for a given name
|
|
107
|
+
*/
|
|
108
|
+
export declare function tmuxSessionExists(sessionName: string): boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Get list of active tmux sessions that match our pattern
|
|
111
|
+
* Pattern: {ticketId}-{action}-{agent}
|
|
112
|
+
*/
|
|
113
|
+
export declare function getActiveTmuxSessions(): Array<{
|
|
114
|
+
name: string;
|
|
115
|
+
ticketId: string;
|
|
116
|
+
agent: string;
|
|
117
|
+
}>;
|
|
118
|
+
/**
|
|
119
|
+
* Check if there's an active tmux session for a specific ticket
|
|
120
|
+
*/
|
|
121
|
+
export declare function getTicketTmuxSession(ticketId: string): {
|
|
122
|
+
sessionName: string;
|
|
123
|
+
agent: string;
|
|
124
|
+
} | null;
|
|
125
|
+
/**
|
|
126
|
+
* Kill a tmux session by name
|
|
127
|
+
*/
|
|
128
|
+
export declare function killTmuxSession(sessionName: string): boolean;
|
|
129
|
+
export interface CleanupOptions {
|
|
130
|
+
/** Logger for status messages */
|
|
131
|
+
log?: (message: string) => void;
|
|
132
|
+
/** If true, only show what would be cleaned without doing it */
|
|
133
|
+
dryRun?: boolean;
|
|
134
|
+
/** If true, skip git safety checks and force cleanup */
|
|
135
|
+
force?: boolean;
|
|
136
|
+
/** If true, push unpushed commits before cleanup */
|
|
137
|
+
pushFirst?: boolean;
|
|
138
|
+
}
|
|
139
|
+
export interface WorktreeGitStatus {
|
|
140
|
+
worktreePath: string;
|
|
141
|
+
repoName: string;
|
|
142
|
+
branch: string;
|
|
143
|
+
hasUncommittedChanges: boolean;
|
|
144
|
+
uncommittedFiles: string[];
|
|
145
|
+
hasUnpushedCommits: boolean;
|
|
146
|
+
unpushedCount: number;
|
|
147
|
+
}
|
|
148
|
+
export interface AgentGitStatus {
|
|
149
|
+
agentName: string;
|
|
150
|
+
worktrees: WorktreeGitStatus[];
|
|
151
|
+
hasUnsavedWork: boolean;
|
|
152
|
+
}
|
|
153
|
+
export interface CleanupResult {
|
|
154
|
+
agent: string;
|
|
155
|
+
success: boolean;
|
|
156
|
+
tmuxSessionsKilled: string[];
|
|
157
|
+
containersRemoved: string[];
|
|
158
|
+
directoriesRemoved: string[];
|
|
159
|
+
errors: string[];
|
|
160
|
+
/** Git status if cleanup was blocked due to unsaved work */
|
|
161
|
+
gitStatus?: AgentGitStatus;
|
|
162
|
+
/** Whether cleanup was blocked due to unsaved work */
|
|
163
|
+
blockedByGit?: boolean;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get tmux sessions associated with an agent
|
|
167
|
+
*/
|
|
168
|
+
export declare function getAgentTmuxSessions(agentName: string): string[];
|
|
169
|
+
/**
|
|
170
|
+
* Check git status for all worktrees in an agent directory.
|
|
171
|
+
* Returns info about uncommitted changes and unpushed commits.
|
|
172
|
+
*/
|
|
173
|
+
export declare function getAgentGitStatus(workspaceInfo: WorkspaceInfo, agentName: string): AgentGitStatus;
|
|
174
|
+
/**
|
|
175
|
+
* Commit and push all work in an agent's worktrees.
|
|
176
|
+
* - Stages all uncommitted changes (git add -A)
|
|
177
|
+
* - Commits with a WIP message if there are staged changes
|
|
178
|
+
* - Pushes all commits to remote
|
|
179
|
+
* Returns true if all operations succeeded.
|
|
180
|
+
*/
|
|
181
|
+
export declare function pushAgentWork(workspaceInfo: WorkspaceInfo, agentName: string, log?: (message: string) => void): boolean;
|
|
182
|
+
/**
|
|
183
|
+
* Clean up a single agent - removes resources but keeps DB record (marked as cleaned)
|
|
184
|
+
*/
|
|
185
|
+
export declare function cleanupAgent(workspaceInfo: WorkspaceInfo, agentName: string, options?: CleanupOptions): Promise<CleanupResult>;
|
|
186
|
+
/**
|
|
187
|
+
* Get agents that can be cleaned up (active ephemeral agents with no running work)
|
|
188
|
+
*/
|
|
189
|
+
export declare function getCleanableAgents(workspaceInfo: WorkspaceInfo, checkRunning?: boolean): Agent[];
|