@proletariat/cli 0.2.0 → 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 +512 -253
- 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,31 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class WorkWatch extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
column: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
strategy: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
agent: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
limit: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
interval: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
once: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
mode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
'skip-permissions': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
'create-pr': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
16
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
17
|
+
};
|
|
18
|
+
private isRunning;
|
|
19
|
+
private knownTickets;
|
|
20
|
+
private columnName;
|
|
21
|
+
private projectId;
|
|
22
|
+
private environment;
|
|
23
|
+
private displayMode;
|
|
24
|
+
private executionConfig;
|
|
25
|
+
private skipPermissions;
|
|
26
|
+
private createPR;
|
|
27
|
+
protected pmoLogger(): void;
|
|
28
|
+
execute(): Promise<void>;
|
|
29
|
+
private pollForNewTickets;
|
|
30
|
+
private printSummary;
|
|
31
|
+
}
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import Database from 'better-sqlite3';
|
|
4
|
+
import inquirer from 'inquirer';
|
|
5
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
6
|
+
import { styles } from '../../lib/styles.js';
|
|
7
|
+
import { getWorkspaceInfo } from '../../lib/agents/commands.js';
|
|
8
|
+
import { ExecutionStorage } from '../../lib/execution/storage.js';
|
|
9
|
+
import { hasDevcontainerConfig } from '../../lib/execution/devcontainer.js';
|
|
10
|
+
import { spawnForColumn, getAvailableAgents, isDockerRunning, } from '../../lib/execution/spawner.js';
|
|
11
|
+
import { promptExecutionSettings } from '../../lib/execution/config.js';
|
|
12
|
+
import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
|
|
13
|
+
export default class WorkWatch extends PMOCommand {
|
|
14
|
+
static description = 'Watch a column and auto-spawn agents for new tickets';
|
|
15
|
+
static examples = [
|
|
16
|
+
'<%= config.bin %> <%= command.id %>',
|
|
17
|
+
'<%= config.bin %> <%= command.id %> --column Ready',
|
|
18
|
+
'<%= config.bin %> <%= command.id %> --column Ready --strategy round-robin',
|
|
19
|
+
'<%= config.bin %> <%= command.id %> --column Ready --interval 10',
|
|
20
|
+
'<%= config.bin %> <%= command.id %> --column Ready --once',
|
|
21
|
+
];
|
|
22
|
+
static flags = {
|
|
23
|
+
...pmoBaseFlags,
|
|
24
|
+
json: Flags.boolean({
|
|
25
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
26
|
+
default: false,
|
|
27
|
+
}),
|
|
28
|
+
column: Flags.string({
|
|
29
|
+
char: 'c',
|
|
30
|
+
description: 'Column to watch for new tickets (prompts if not provided)',
|
|
31
|
+
}),
|
|
32
|
+
strategy: Flags.string({
|
|
33
|
+
char: 's',
|
|
34
|
+
description: 'Agent selection strategy',
|
|
35
|
+
options: ['round-robin', 'least-busy', 'random'],
|
|
36
|
+
default: 'round-robin',
|
|
37
|
+
}),
|
|
38
|
+
agent: Flags.string({
|
|
39
|
+
char: 'a',
|
|
40
|
+
description: 'Use specific agent for all tickets',
|
|
41
|
+
}),
|
|
42
|
+
limit: Flags.integer({
|
|
43
|
+
char: 'l',
|
|
44
|
+
description: 'Maximum concurrent executions',
|
|
45
|
+
}),
|
|
46
|
+
interval: Flags.integer({
|
|
47
|
+
char: 'i',
|
|
48
|
+
description: 'Polling interval in seconds',
|
|
49
|
+
default: 5,
|
|
50
|
+
}),
|
|
51
|
+
once: Flags.boolean({
|
|
52
|
+
description: 'Check once and exit (no continuous watching)',
|
|
53
|
+
default: false,
|
|
54
|
+
}),
|
|
55
|
+
mode: Flags.string({
|
|
56
|
+
char: 'm',
|
|
57
|
+
description: 'Display mode for agent output',
|
|
58
|
+
options: ['terminal', 'background'],
|
|
59
|
+
}),
|
|
60
|
+
'skip-permissions': Flags.boolean({
|
|
61
|
+
description: 'Skip permission prompts (danger mode)',
|
|
62
|
+
default: false,
|
|
63
|
+
}),
|
|
64
|
+
'create-pr': Flags.boolean({
|
|
65
|
+
description: 'Create PR when work is ready',
|
|
66
|
+
default: false,
|
|
67
|
+
}),
|
|
68
|
+
};
|
|
69
|
+
isRunning = true;
|
|
70
|
+
knownTickets = new Set();
|
|
71
|
+
columnName = '';
|
|
72
|
+
projectId = '';
|
|
73
|
+
environment = 'host';
|
|
74
|
+
displayMode = 'terminal';
|
|
75
|
+
executionConfig;
|
|
76
|
+
skipPermissions = false;
|
|
77
|
+
createPR = false;
|
|
78
|
+
pmoLogger() {
|
|
79
|
+
// Silent logging during watch
|
|
80
|
+
}
|
|
81
|
+
async execute() {
|
|
82
|
+
const { flags } = await this.parse(WorkWatch);
|
|
83
|
+
// Check if JSON output mode is active
|
|
84
|
+
const jsonMode = shouldOutputJson(flags);
|
|
85
|
+
// Helper to handle errors in JSON mode
|
|
86
|
+
const handleError = (code, message) => {
|
|
87
|
+
if (jsonMode) {
|
|
88
|
+
outputErrorAsJson(code, message, createMetadata('work watch', flags));
|
|
89
|
+
this.exit(1);
|
|
90
|
+
}
|
|
91
|
+
this.error(message);
|
|
92
|
+
};
|
|
93
|
+
// Get workspace info
|
|
94
|
+
let workspaceInfo;
|
|
95
|
+
try {
|
|
96
|
+
workspaceInfo = getWorkspaceInfo();
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return handleError('NOT_IN_WORKSPACE', 'Not in a workspace. Run "prlt init" first.');
|
|
100
|
+
}
|
|
101
|
+
if (workspaceInfo.agents.length === 0) {
|
|
102
|
+
return handleError('NO_AGENTS', 'No agents found in workspace. Add agents first with "prlt agent add".');
|
|
103
|
+
}
|
|
104
|
+
// Get project
|
|
105
|
+
this.projectId = await this.requireProject();
|
|
106
|
+
// Open database for execution storage
|
|
107
|
+
const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
|
|
108
|
+
const db = new Database(dbPath);
|
|
109
|
+
const executionStorage = new ExecutionStorage(db);
|
|
110
|
+
// Handle graceful shutdown
|
|
111
|
+
const cleanup = async () => {
|
|
112
|
+
this.isRunning = false;
|
|
113
|
+
this.log('');
|
|
114
|
+
this.log(styles.muted('Stopping watch...'));
|
|
115
|
+
db.close();
|
|
116
|
+
process.exit(0);
|
|
117
|
+
};
|
|
118
|
+
process.on('SIGINT', cleanup);
|
|
119
|
+
process.on('SIGTERM', cleanup);
|
|
120
|
+
try {
|
|
121
|
+
// Get board columns for selection
|
|
122
|
+
const board = await this.storage.getBoard(this.projectId);
|
|
123
|
+
const columns = board.columns.map(col => col.name);
|
|
124
|
+
if (columns.length === 0) {
|
|
125
|
+
db.close();
|
|
126
|
+
this.error('No columns found in board. Initialize board first.');
|
|
127
|
+
}
|
|
128
|
+
// Prompt for column if not provided
|
|
129
|
+
this.columnName = flags.column || '';
|
|
130
|
+
if (!this.columnName) {
|
|
131
|
+
// In JSON mode, output column selection prompt
|
|
132
|
+
if (jsonMode) {
|
|
133
|
+
const columnChoices = columns.map(col => {
|
|
134
|
+
const ticketCount = board.columns.find(c => c.name === col)?.tickets?.length || 0;
|
|
135
|
+
return {
|
|
136
|
+
name: `${col} (${ticketCount} tickets)`,
|
|
137
|
+
value: col,
|
|
138
|
+
};
|
|
139
|
+
});
|
|
140
|
+
outputPromptAsJson(buildPromptConfig('list', 'column', 'Select column to watch for new tickets:', columnChoices), createMetadata('work watch', flags));
|
|
141
|
+
db.close();
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const { selectedColumn } = await inquirer.prompt([
|
|
145
|
+
{
|
|
146
|
+
type: 'list',
|
|
147
|
+
name: 'selectedColumn',
|
|
148
|
+
message: 'Select column to watch for new tickets:',
|
|
149
|
+
choices: columns.map(col => {
|
|
150
|
+
// Get ticket count for each column
|
|
151
|
+
const ticketCount = board.columns.find(c => c.name === col)?.tickets?.length || 0;
|
|
152
|
+
return {
|
|
153
|
+
name: `${col} (${ticketCount} tickets)`,
|
|
154
|
+
value: col,
|
|
155
|
+
};
|
|
156
|
+
}),
|
|
157
|
+
},
|
|
158
|
+
]);
|
|
159
|
+
this.columnName = selectedColumn;
|
|
160
|
+
}
|
|
161
|
+
// Check if any agent has devcontainer
|
|
162
|
+
const hasDevcontainer = workspaceInfo.agents.some(agent => {
|
|
163
|
+
const agentDir = path.join(workspaceInfo.agentsPath, agent.name);
|
|
164
|
+
return hasDevcontainerConfig(agentDir);
|
|
165
|
+
});
|
|
166
|
+
// Docker check
|
|
167
|
+
const dockerRunning = isDockerRunning();
|
|
168
|
+
if (hasDevcontainer && !dockerRunning) {
|
|
169
|
+
this.warn('Docker is not running. Agents will run on host instead of devcontainer.\n' +
|
|
170
|
+
'Start Docker Desktop for sandboxed execution.');
|
|
171
|
+
}
|
|
172
|
+
// Prompt for environment and display mode if not provided
|
|
173
|
+
this.environment = 'host';
|
|
174
|
+
this.displayMode = 'terminal';
|
|
175
|
+
if (!flags.mode) {
|
|
176
|
+
if (hasDevcontainer && dockerRunning) {
|
|
177
|
+
// Prompt for environment choice
|
|
178
|
+
const { selectedEnvironment } = await inquirer.prompt([
|
|
179
|
+
{
|
|
180
|
+
type: 'list',
|
|
181
|
+
name: 'selectedEnvironment',
|
|
182
|
+
message: 'Where should agents run?',
|
|
183
|
+
choices: [
|
|
184
|
+
{ name: '🐳 devcontainer (sandboxed, recommended)', value: 'devcontainer' },
|
|
185
|
+
{ name: '💻 host (runs directly on your machine)', value: 'host' },
|
|
186
|
+
],
|
|
187
|
+
default: 'devcontainer',
|
|
188
|
+
},
|
|
189
|
+
]);
|
|
190
|
+
this.environment = selectedEnvironment;
|
|
191
|
+
}
|
|
192
|
+
// Prompt for display mode
|
|
193
|
+
const { selectedDisplay } = await inquirer.prompt([
|
|
194
|
+
{
|
|
195
|
+
type: 'list',
|
|
196
|
+
name: 'selectedDisplay',
|
|
197
|
+
message: 'How should agent output be displayed?',
|
|
198
|
+
choices: [
|
|
199
|
+
{ name: '🖥️ New tab - Opens in new terminal tab (recommended)', value: 'terminal' },
|
|
200
|
+
{ name: '📦 Background - Runs detached, reattach with: prlt session attach', value: 'background' },
|
|
201
|
+
],
|
|
202
|
+
default: 'terminal',
|
|
203
|
+
},
|
|
204
|
+
]);
|
|
205
|
+
this.displayMode = selectedDisplay;
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
this.displayMode = flags.mode;
|
|
209
|
+
this.environment = hasDevcontainer && dockerRunning ? 'devcontainer' : 'host';
|
|
210
|
+
}
|
|
211
|
+
// Prompt for execution settings (terminal, output mode, permissions, PR creation)
|
|
212
|
+
const promptResult = await promptExecutionSettings(db, {
|
|
213
|
+
displayMode: this.displayMode,
|
|
214
|
+
environment: this.environment,
|
|
215
|
+
skipPermissions: flags['skip-permissions'] ? true : undefined,
|
|
216
|
+
createPR: flags['create-pr'] ? true : undefined,
|
|
217
|
+
log: (msg) => this.log(styles.header(msg)),
|
|
218
|
+
});
|
|
219
|
+
this.executionConfig = promptResult.executionConfig;
|
|
220
|
+
this.skipPermissions = promptResult.skipPermissions;
|
|
221
|
+
this.createPR = promptResult.createPR;
|
|
222
|
+
this.log('');
|
|
223
|
+
this.log(styles.header(`👁️ Watching column "${this.columnName}" for new tickets`));
|
|
224
|
+
this.log('');
|
|
225
|
+
this.log(styles.muted(` Strategy: ${flags.strategy}`));
|
|
226
|
+
this.log(styles.muted(` Environment: ${this.environment}`));
|
|
227
|
+
this.log(styles.muted(` Display: ${this.displayMode}`));
|
|
228
|
+
if (this.displayMode === 'terminal') {
|
|
229
|
+
this.log(styles.muted(` Terminal: ${this.executionConfig.terminal.app}`));
|
|
230
|
+
}
|
|
231
|
+
this.log(styles.muted(` Output: ${this.executionConfig.outputMode === 'interactive' ? 'streaming' : 'print'}`));
|
|
232
|
+
if (this.skipPermissions) {
|
|
233
|
+
this.log(styles.warning(` Permissions: ⚠️ danger`));
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
this.log(styles.success(` Permissions: 🔒 safe`));
|
|
237
|
+
}
|
|
238
|
+
if (this.createPR) {
|
|
239
|
+
this.log(styles.muted(` Create PR: yes`));
|
|
240
|
+
}
|
|
241
|
+
if (flags.agent) {
|
|
242
|
+
this.log(styles.muted(` Agent: ${flags.agent}`));
|
|
243
|
+
}
|
|
244
|
+
if (flags.limit) {
|
|
245
|
+
this.log(styles.muted(` Max concurrent: ${flags.limit}`));
|
|
246
|
+
}
|
|
247
|
+
this.log(styles.muted(` Interval: ${flags.interval}s`));
|
|
248
|
+
this.log('');
|
|
249
|
+
// Initial scan - record current tickets as "known"
|
|
250
|
+
const initialTickets = await this.storage.listTickets(this.projectId, { column: this.columnName });
|
|
251
|
+
for (const ticket of initialTickets) {
|
|
252
|
+
this.knownTickets.add(ticket.id);
|
|
253
|
+
}
|
|
254
|
+
this.log(styles.muted(` Found ${initialTickets.length} existing tickets in column`));
|
|
255
|
+
// If --once, just do a single spawn cycle
|
|
256
|
+
if (flags.once) {
|
|
257
|
+
this.log('');
|
|
258
|
+
const result = await spawnForColumn(this.projectId, this.columnName, this.storage, executionStorage, workspaceInfo, db, this.pmoPath, {
|
|
259
|
+
strategy: flags.strategy,
|
|
260
|
+
specificAgent: flags.agent,
|
|
261
|
+
limit: flags.limit,
|
|
262
|
+
skipPermissions: this.skipPermissions,
|
|
263
|
+
createPR: this.createPR,
|
|
264
|
+
environment: this.environment,
|
|
265
|
+
displayMode: this.displayMode,
|
|
266
|
+
executionConfig: this.executionConfig,
|
|
267
|
+
log: (msg) => this.log(styles.muted(` ${msg}`)),
|
|
268
|
+
});
|
|
269
|
+
this.printSummary(result);
|
|
270
|
+
db.close();
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
// Continuous watching
|
|
274
|
+
this.log('');
|
|
275
|
+
this.log(styles.muted('Press Ctrl+C to stop watching'));
|
|
276
|
+
this.log('');
|
|
277
|
+
while (this.isRunning) {
|
|
278
|
+
await this.pollForNewTickets(flags, executionStorage, workspaceInfo, db);
|
|
279
|
+
// Wait for interval
|
|
280
|
+
await new Promise(resolve => setTimeout(resolve, flags.interval * 1000));
|
|
281
|
+
}
|
|
282
|
+
db.close();
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
db.close();
|
|
286
|
+
throw error;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
async pollForNewTickets(flags, executionStorage, workspaceInfo, db) {
|
|
290
|
+
// Get current tickets in column
|
|
291
|
+
const currentTickets = await this.storage.listTickets(this.projectId, { column: this.columnName });
|
|
292
|
+
// Find new tickets (in current but not in known)
|
|
293
|
+
const newTickets = currentTickets.filter(t => !this.knownTickets.has(t.id));
|
|
294
|
+
if (newTickets.length === 0) {
|
|
295
|
+
// Update status line
|
|
296
|
+
const availableAgents = getAvailableAgents(workspaceInfo, executionStorage);
|
|
297
|
+
const runningExecutions = executionStorage.listExecutions({ status: 'running' });
|
|
298
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
299
|
+
// Clear line and show status
|
|
300
|
+
process.stdout.write(`\r${styles.muted(`[${timestamp}] Watching: ${currentTickets.length} tickets | ${availableAgents.length} agents available | ${runningExecutions.length} running `)}`);
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
// New tickets detected!
|
|
304
|
+
this.log('');
|
|
305
|
+
this.log(styles.success(`✨ New tickets detected: ${newTickets.length}`));
|
|
306
|
+
// Add to known set before spawning
|
|
307
|
+
for (const ticket of newTickets) {
|
|
308
|
+
this.knownTickets.add(ticket.id);
|
|
309
|
+
}
|
|
310
|
+
// Spawn agents for new tickets
|
|
311
|
+
const result = await spawnForColumn(this.projectId, this.columnName, this.storage, executionStorage, workspaceInfo, db, this.pmoPath, {
|
|
312
|
+
strategy: flags.strategy,
|
|
313
|
+
specificAgent: flags.agent,
|
|
314
|
+
limit: flags.limit,
|
|
315
|
+
skipPermissions: this.skipPermissions,
|
|
316
|
+
createPR: this.createPR,
|
|
317
|
+
environment: this.environment,
|
|
318
|
+
displayMode: this.displayMode,
|
|
319
|
+
executionConfig: this.executionConfig,
|
|
320
|
+
log: (msg) => this.log(styles.muted(` ${msg}`)),
|
|
321
|
+
});
|
|
322
|
+
// Print activity
|
|
323
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
324
|
+
for (const spawn of result.spawned) {
|
|
325
|
+
this.log(styles.success(` [${timestamp}] ${spawn.ticketId} → ${spawn.agentName} (spawned)`));
|
|
326
|
+
}
|
|
327
|
+
for (const skip of result.skipped) {
|
|
328
|
+
this.log(styles.warning(` [${timestamp}] ${skip.ticketId}: ${skip.reason}`));
|
|
329
|
+
}
|
|
330
|
+
for (const fail of result.failed) {
|
|
331
|
+
this.log(styles.error(` [${timestamp}] ${fail.ticketId}: ${fail.error}`));
|
|
332
|
+
}
|
|
333
|
+
this.log('');
|
|
334
|
+
}
|
|
335
|
+
printSummary(result) {
|
|
336
|
+
this.log('');
|
|
337
|
+
this.log(styles.header('Summary'));
|
|
338
|
+
this.log('');
|
|
339
|
+
if (result.spawned.length > 0) {
|
|
340
|
+
this.log(styles.success(` ✓ Spawned: ${result.spawned.length}`));
|
|
341
|
+
for (const spawn of result.spawned) {
|
|
342
|
+
this.log(styles.muted(` ${spawn.ticketId} → ${spawn.agentName}${spawn.executionId ? ` (${spawn.executionId})` : ''}`));
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
if (result.skipped.length > 0) {
|
|
346
|
+
this.log(styles.warning(` ⏭ Skipped: ${result.skipped.length}`));
|
|
347
|
+
for (const skip of result.skipped) {
|
|
348
|
+
this.log(styles.muted(` ${skip.ticketId}: ${skip.reason}`));
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
if (result.failed.length > 0) {
|
|
352
|
+
this.log(styles.error(` ✗ Failed: ${result.failed.length}`));
|
|
353
|
+
for (const fail of result.failed) {
|
|
354
|
+
this.log(styles.muted(` ${fail.ticketId}: ${fail.error}`));
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
this.log('');
|
|
358
|
+
}
|
|
359
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class WorkflowCreate extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
name: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
statuses: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
};
|
|
14
|
+
protected getPMOOptions(): {
|
|
15
|
+
promptIfMultiple: boolean;
|
|
16
|
+
};
|
|
17
|
+
execute(): Promise<void>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
4
|
+
import { styles } from '../../lib/styles.js';
|
|
5
|
+
import { shouldOutputJson, outputPromptAsJson, createMetadata, buildFormPromptConfig, } from '../../lib/prompt-json.js';
|
|
6
|
+
export default class WorkflowCreate extends PMOCommand {
|
|
7
|
+
static description = 'Create a new custom workflow';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %> "My Workflow"',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> "Sprint Board" --description "Agile sprint workflow"',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> "Simple" --statuses "Todo,In Progress,Done"',
|
|
12
|
+
];
|
|
13
|
+
static args = {
|
|
14
|
+
name: Args.string({
|
|
15
|
+
description: 'Workflow name',
|
|
16
|
+
required: false,
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
static flags = {
|
|
20
|
+
...pmoBaseFlags,
|
|
21
|
+
description: Flags.string({
|
|
22
|
+
char: 'd',
|
|
23
|
+
description: 'Workflow description',
|
|
24
|
+
}),
|
|
25
|
+
statuses: Flags.string({
|
|
26
|
+
char: 's',
|
|
27
|
+
description: 'Comma-separated list of status names (uses default categories)',
|
|
28
|
+
}),
|
|
29
|
+
json: Flags.boolean({
|
|
30
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
31
|
+
default: false,
|
|
32
|
+
}),
|
|
33
|
+
};
|
|
34
|
+
getPMOOptions() {
|
|
35
|
+
return { promptIfMultiple: false };
|
|
36
|
+
}
|
|
37
|
+
async execute() {
|
|
38
|
+
const { args, flags } = await this.parse(WorkflowCreate);
|
|
39
|
+
// Check if JSON output mode is active
|
|
40
|
+
const jsonMode = shouldOutputJson(flags);
|
|
41
|
+
// Get workflow name
|
|
42
|
+
let name = args.name;
|
|
43
|
+
if (!name) {
|
|
44
|
+
const fields = [
|
|
45
|
+
{ type: 'input', name: 'name', message: 'Workflow name:' },
|
|
46
|
+
{ type: 'input', name: 'description', message: 'Description (optional):', default: flags.description },
|
|
47
|
+
];
|
|
48
|
+
if (jsonMode) {
|
|
49
|
+
outputPromptAsJson(buildFormPromptConfig(fields), createMetadata('workflow create', flags));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const answers = await inquirer.prompt([
|
|
53
|
+
{
|
|
54
|
+
type: 'input',
|
|
55
|
+
name: 'name',
|
|
56
|
+
message: 'Workflow name:',
|
|
57
|
+
validate: (input) => input.length > 0 || 'Name is required',
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
type: 'input',
|
|
61
|
+
name: 'description',
|
|
62
|
+
message: 'Description (optional):',
|
|
63
|
+
},
|
|
64
|
+
]);
|
|
65
|
+
name = answers.name;
|
|
66
|
+
if (answers.description) {
|
|
67
|
+
flags.description = answers.description;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Create the workflow
|
|
71
|
+
const workflow = await this.storage.createWorkflow({
|
|
72
|
+
name: name,
|
|
73
|
+
description: flags.description,
|
|
74
|
+
});
|
|
75
|
+
// If statuses were provided, add them
|
|
76
|
+
if (flags.statuses) {
|
|
77
|
+
const statusNames = flags.statuses.split(',').map(s => s.trim()).filter(s => s);
|
|
78
|
+
const defaultCategories = ['backlog', 'unstarted', 'started', 'started', 'completed'];
|
|
79
|
+
for (let i = 0; i < statusNames.length; i++) {
|
|
80
|
+
const statusName = statusNames[i];
|
|
81
|
+
// Assign categories based on position: first = backlog, second = unstarted, middle = started, last = completed
|
|
82
|
+
let category;
|
|
83
|
+
if (i === 0) {
|
|
84
|
+
category = 'backlog';
|
|
85
|
+
}
|
|
86
|
+
else if (i === 1) {
|
|
87
|
+
category = 'unstarted';
|
|
88
|
+
}
|
|
89
|
+
else if (i === statusNames.length - 1) {
|
|
90
|
+
category = 'completed';
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
category = 'started';
|
|
94
|
+
}
|
|
95
|
+
await this.storage.createStatus(workflow.id, {
|
|
96
|
+
name: statusName,
|
|
97
|
+
category: category,
|
|
98
|
+
position: i,
|
|
99
|
+
isDefault: i === 1, // Second status (unstarted) is default
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Get the statuses for display
|
|
104
|
+
const statuses = await this.storage.listStatuses(workflow.id);
|
|
105
|
+
this.log(styles.success(`\nCreated workflow "${styles.emphasis(workflow.name)}"`));
|
|
106
|
+
this.log(styles.muted(` ID: ${workflow.id}`));
|
|
107
|
+
if (workflow.description) {
|
|
108
|
+
this.log(styles.muted(` Description: ${workflow.description}`));
|
|
109
|
+
}
|
|
110
|
+
if (statuses.length > 0) {
|
|
111
|
+
this.log(styles.muted(` Statuses: ${statuses.map(s => s.name).join(', ')}`));
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
this.log(styles.muted(' No statuses yet. Add some with: prlt status create'));
|
|
115
|
+
}
|
|
116
|
+
this.log('');
|
|
117
|
+
this.log(styles.muted(`View workflow: prlt workflow view ${workflow.id}`));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class WorkflowDelete extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
};
|
|
13
|
+
protected getPMOOptions(): {
|
|
14
|
+
promptIfMultiple: boolean;
|
|
15
|
+
};
|
|
16
|
+
execute(): Promise<void>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
4
|
+
import { styles } from '../../lib/styles.js';
|
|
5
|
+
import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
|
|
6
|
+
export default class WorkflowDelete extends PMOCommand {
|
|
7
|
+
static description = 'Delete a custom workflow';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %> my-workflow',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> my-workflow --force # Skip confirmation',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> # Interactive selection',
|
|
12
|
+
];
|
|
13
|
+
static args = {
|
|
14
|
+
id: Args.string({
|
|
15
|
+
description: 'Workflow ID to delete - prompts with dropdown if not provided',
|
|
16
|
+
required: false,
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
static flags = {
|
|
20
|
+
...pmoBaseFlags,
|
|
21
|
+
force: Flags.boolean({
|
|
22
|
+
char: 'f',
|
|
23
|
+
description: 'Skip confirmation prompt',
|
|
24
|
+
default: false,
|
|
25
|
+
}),
|
|
26
|
+
json: Flags.boolean({
|
|
27
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
28
|
+
default: false,
|
|
29
|
+
}),
|
|
30
|
+
};
|
|
31
|
+
getPMOOptions() {
|
|
32
|
+
return { promptIfMultiple: false };
|
|
33
|
+
}
|
|
34
|
+
async execute() {
|
|
35
|
+
const { args, flags } = await this.parse(WorkflowDelete);
|
|
36
|
+
// Check if JSON output mode is active
|
|
37
|
+
const jsonMode = shouldOutputJson(flags);
|
|
38
|
+
// Helper to handle errors in JSON mode
|
|
39
|
+
const handleError = (code, message) => {
|
|
40
|
+
if (jsonMode) {
|
|
41
|
+
outputErrorAsJson(code, message, createMetadata('workflow delete', flags));
|
|
42
|
+
this.exit(1);
|
|
43
|
+
}
|
|
44
|
+
this.error(message);
|
|
45
|
+
};
|
|
46
|
+
// Get workflow ID - prompt if not provided
|
|
47
|
+
let workflowId = args.id;
|
|
48
|
+
if (!workflowId) {
|
|
49
|
+
// Only show custom workflows (built-in cannot be deleted)
|
|
50
|
+
const workflows = await this.storage.listWorkflows({ isBuiltin: false });
|
|
51
|
+
if (workflows.length === 0) {
|
|
52
|
+
return handleError('NO_CUSTOM_WORKFLOWS', 'No custom workflows found to delete.');
|
|
53
|
+
}
|
|
54
|
+
// In JSON mode, output workflow selection prompt
|
|
55
|
+
if (jsonMode) {
|
|
56
|
+
const workflowChoices = workflows.map(w => ({
|
|
57
|
+
name: w.name,
|
|
58
|
+
value: w.id,
|
|
59
|
+
}));
|
|
60
|
+
outputPromptAsJson(buildPromptConfig('list', 'id', 'Select workflow to delete:', workflowChoices), createMetadata('workflow delete', flags));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const { selectedId } = await inquirer.prompt([{
|
|
64
|
+
type: 'list',
|
|
65
|
+
name: 'selectedId',
|
|
66
|
+
message: 'Select workflow to delete:',
|
|
67
|
+
choices: workflows.map(w => ({
|
|
68
|
+
name: w.name,
|
|
69
|
+
value: w.id,
|
|
70
|
+
})),
|
|
71
|
+
}]);
|
|
72
|
+
workflowId = selectedId;
|
|
73
|
+
}
|
|
74
|
+
// Get workflow details
|
|
75
|
+
const workflow = await this.storage.getWorkflow(workflowId);
|
|
76
|
+
if (!workflow) {
|
|
77
|
+
return handleError('WORKFLOW_NOT_FOUND', `Workflow not found: ${workflowId}`);
|
|
78
|
+
}
|
|
79
|
+
// Cannot delete built-in workflows
|
|
80
|
+
if (workflow.isBuiltin) {
|
|
81
|
+
return handleError('CANNOT_DELETE_BUILTIN', `Cannot delete built-in workflow: ${workflow.name}`);
|
|
82
|
+
}
|
|
83
|
+
// Check if workflow is in use by any projects
|
|
84
|
+
const projects = await this.storage.listProjects();
|
|
85
|
+
const usingProjects = projects.filter(p => p.workflowId === workflowId);
|
|
86
|
+
if (usingProjects.length > 0) {
|
|
87
|
+
const projectNames = usingProjects.map(p => p.name).join(', ');
|
|
88
|
+
return handleError('WORKFLOW_IN_USE', `Cannot delete workflow "${workflow.name}" - it is used by ${usingProjects.length} project(s): ${projectNames}`);
|
|
89
|
+
}
|
|
90
|
+
// Confirm deletion unless --force
|
|
91
|
+
if (!flags.force) {
|
|
92
|
+
const statuses = await this.storage.listStatuses(workflowId);
|
|
93
|
+
// In JSON mode, output confirmation prompt
|
|
94
|
+
if (jsonMode) {
|
|
95
|
+
outputPromptAsJson(buildPromptConfig('confirm', 'confirm', `Delete workflow "${workflow.name}" with ${statuses.length} statuses?`), createMetadata('workflow delete', flags));
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
this.log(styles.warning(`\nWorkflow "${workflow.name}" has ${statuses.length} status(es).`));
|
|
99
|
+
this.log(styles.warning('This action cannot be undone.'));
|
|
100
|
+
this.log('');
|
|
101
|
+
const { confirm } = await inquirer.prompt([{
|
|
102
|
+
type: 'list',
|
|
103
|
+
name: 'confirm',
|
|
104
|
+
message: `Delete workflow "${workflow.name}"?`,
|
|
105
|
+
choices: [
|
|
106
|
+
{ name: 'Yes', value: true },
|
|
107
|
+
{ name: 'No', value: false },
|
|
108
|
+
],
|
|
109
|
+
}]);
|
|
110
|
+
if (!confirm) {
|
|
111
|
+
this.log(styles.muted('Cancelled'));
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Delete the workflow
|
|
116
|
+
await this.storage.deleteWorkflow(workflowId);
|
|
117
|
+
this.log(styles.success(`\nDeleted workflow "${styles.emphasis(workflow.name)}"`));
|
|
118
|
+
}
|
|
119
|
+
}
|