@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,121 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import Database from 'better-sqlite3';
|
|
4
|
+
import { PMOCommand, pmoBaseFlags, autoExportToBoard } from '../../lib/pmo/index.js';
|
|
5
|
+
import { getWorkColumnSetting, findColumnByName } from '../../lib/pmo/utils.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 { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
10
|
+
export default class WorkComplete extends PMOCommand {
|
|
11
|
+
static description = 'Mark work as complete (moves ticket to Done column)';
|
|
12
|
+
static examples = [
|
|
13
|
+
'<%= config.bin %> <%= command.id %>',
|
|
14
|
+
'<%= config.bin %> <%= command.id %> TKT-001',
|
|
15
|
+
];
|
|
16
|
+
static args = {
|
|
17
|
+
ticketId: Args.string({
|
|
18
|
+
description: 'Ticket ID - prompts with dropdown if not provided',
|
|
19
|
+
required: false,
|
|
20
|
+
}),
|
|
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
|
+
};
|
|
29
|
+
async execute() {
|
|
30
|
+
const { args, flags } = await this.parse(WorkComplete);
|
|
31
|
+
const projectId = flags.project;
|
|
32
|
+
// Check if JSON output mode is active
|
|
33
|
+
const jsonMode = shouldOutputJson(flags);
|
|
34
|
+
// Helper to handle errors in JSON mode
|
|
35
|
+
const handleError = (code, message) => {
|
|
36
|
+
if (jsonMode) {
|
|
37
|
+
outputErrorAsJson(code, message, createMetadata('work complete', flags));
|
|
38
|
+
this.exit(1);
|
|
39
|
+
}
|
|
40
|
+
this.error(message);
|
|
41
|
+
};
|
|
42
|
+
// Get workspace info for execution storage
|
|
43
|
+
let workspaceInfo;
|
|
44
|
+
try {
|
|
45
|
+
workspaceInfo = getWorkspaceInfo();
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return handleError('NOT_IN_WORKSPACE', 'Not in a workspace. Run "prlt init" first.');
|
|
49
|
+
}
|
|
50
|
+
// Open database for execution storage
|
|
51
|
+
const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
|
|
52
|
+
const db = new Database(dbPath);
|
|
53
|
+
const executionStorage = new ExecutionStorage(db);
|
|
54
|
+
try {
|
|
55
|
+
// Get ticketId - prompt if not provided
|
|
56
|
+
let ticketId = args.ticketId;
|
|
57
|
+
if (!ticketId) {
|
|
58
|
+
// Get all tickets that could be completed (in progress / started), optionally filtered by project
|
|
59
|
+
const allTickets = await this.storage.listTickets(projectId);
|
|
60
|
+
const completableTickets = allTickets.filter(t => t.statusCategory === 'started' || (t.statusName && t.statusName.toLowerCase().includes('progress')));
|
|
61
|
+
if (completableTickets.length === 0) {
|
|
62
|
+
db.close();
|
|
63
|
+
if (jsonMode) {
|
|
64
|
+
outputErrorAsJson('NO_COMPLETABLE_WORK', 'No in-progress work found.', createMetadata('work complete', flags));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
this.log(styles.info('No in-progress work found.'));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const selected = await this.selectFromList({
|
|
71
|
+
message: 'Select work to mark as complete:',
|
|
72
|
+
items: completableTickets,
|
|
73
|
+
getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
|
|
74
|
+
getValue: (t) => t.id,
|
|
75
|
+
getCommand: (t) => `prlt work complete ${t.id} --json`,
|
|
76
|
+
jsonMode: jsonMode ? { flags, commandName: 'work complete' } : null,
|
|
77
|
+
});
|
|
78
|
+
if (!selected) {
|
|
79
|
+
db.close();
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
ticketId = selected;
|
|
83
|
+
}
|
|
84
|
+
// Get ticket
|
|
85
|
+
const ticket = await this.storage.getTicket(ticketId);
|
|
86
|
+
if (!ticket) {
|
|
87
|
+
db.close();
|
|
88
|
+
this.error(`Ticket "${ticketId}" not found.`);
|
|
89
|
+
}
|
|
90
|
+
// Get configured column name (from pmo_settings or default)
|
|
91
|
+
const targetColumnName = getWorkColumnSetting(db, 'done');
|
|
92
|
+
const board = await this.storage.getBoard(ticket.projectId);
|
|
93
|
+
const columnNames = board.columns.map(col => col.name);
|
|
94
|
+
const doneColumn = findColumnByName(columnNames, targetColumnName);
|
|
95
|
+
if (!doneColumn) {
|
|
96
|
+
db.close();
|
|
97
|
+
this.error(`No "${targetColumnName}" column found in board configuration. Configure with: prlt config set column_done <column-name>`);
|
|
98
|
+
}
|
|
99
|
+
const previousColumn = ticket.statusName;
|
|
100
|
+
// Move to Done column (moveTicket also updates status_id)
|
|
101
|
+
await this.storage.moveTicket(ticket.projectId, ticketId, doneColumn);
|
|
102
|
+
// Auto-export to board.md if configured
|
|
103
|
+
await autoExportToBoard(this.pmoPath, this.storage);
|
|
104
|
+
// Mark any running executions for this ticket as completed
|
|
105
|
+
const runningExecution = executionStorage.getRunningExecution(ticketId);
|
|
106
|
+
if (runningExecution) {
|
|
107
|
+
executionStorage.updateStatus(runningExecution.id, 'completed');
|
|
108
|
+
this.log(styles.muted(` Execution ${runningExecution.id} marked as completed`));
|
|
109
|
+
}
|
|
110
|
+
db.close();
|
|
111
|
+
this.log(styles.success(`Work complete: ${ticketId}`));
|
|
112
|
+
this.log(styles.muted(` Title: ${ticket.title}`));
|
|
113
|
+
this.log(styles.muted(` From: ${previousColumn}`));
|
|
114
|
+
this.log(styles.muted(` To: ${doneColumn}`));
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
db.close();
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class Work extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
};
|
|
9
|
+
protected getPMOOptions(): {
|
|
10
|
+
promptIfMultiple: boolean;
|
|
11
|
+
};
|
|
12
|
+
execute(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
3
|
+
import { shouldOutputJson, } from '../../lib/prompt-json.js';
|
|
4
|
+
export default class Work extends PMOCommand {
|
|
5
|
+
static description = 'Interactive menu for work operations (ownership, assignment, execution)';
|
|
6
|
+
static examples = [
|
|
7
|
+
'<%= config.bin %> <%= command.id %>',
|
|
8
|
+
];
|
|
9
|
+
static flags = {
|
|
10
|
+
...pmoBaseFlags,
|
|
11
|
+
json: Flags.boolean({
|
|
12
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
13
|
+
default: false,
|
|
14
|
+
}),
|
|
15
|
+
};
|
|
16
|
+
getPMOOptions() {
|
|
17
|
+
// Prompt for project selection so we can pass it to subcommands
|
|
18
|
+
return { promptIfMultiple: true };
|
|
19
|
+
}
|
|
20
|
+
async execute() {
|
|
21
|
+
const { flags } = await this.parse(Work);
|
|
22
|
+
// This command requires project context - get it once and reuse
|
|
23
|
+
const projectId = await this.requireProject();
|
|
24
|
+
// Check if JSON output mode is active
|
|
25
|
+
const jsonMode = shouldOutputJson(flags);
|
|
26
|
+
// Define choices once, use for both JSON and interactive modes
|
|
27
|
+
// Execution actions first (most common), then ownership
|
|
28
|
+
// Each choice includes the full command for AI agents to execute
|
|
29
|
+
const menuChoices = [
|
|
30
|
+
{ id: 'start', name: 'Start work (launch single agent)', command: `prlt work start -P ${projectId} --json` },
|
|
31
|
+
{ id: 'spawn', name: 'Spawn work (batch by column)', command: `prlt work spawn -P ${projectId} --json` },
|
|
32
|
+
{ id: 'watch', name: 'Watch column (auto-spawn)', command: `prlt work watch -P ${projectId} --json` },
|
|
33
|
+
{ id: 'ready', name: 'Mark work ready for review', command: `prlt work ready -P ${projectId} --json` },
|
|
34
|
+
{ id: 'complete', name: 'Mark work complete', command: `prlt work complete -P ${projectId} --json` },
|
|
35
|
+
{ id: 'cancel', name: 'Cancel', command: '' },
|
|
36
|
+
];
|
|
37
|
+
const message = 'Work Operations - What would you like to do?';
|
|
38
|
+
const action = await this.selectFromList({
|
|
39
|
+
message: '🔨 ' + message,
|
|
40
|
+
items: menuChoices,
|
|
41
|
+
getName: (c) => c.name,
|
|
42
|
+
getValue: (c) => c.id,
|
|
43
|
+
getCommand: (c) => c.command,
|
|
44
|
+
jsonMode: jsonMode ? { flags, commandName: 'work' } : null,
|
|
45
|
+
});
|
|
46
|
+
if (action === 'cancel' || !action) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// Run the selected subcommand
|
|
50
|
+
// Pass --project to avoid re-prompting for project selection
|
|
51
|
+
const projectArgs = ['--project', projectId];
|
|
52
|
+
switch (action) {
|
|
53
|
+
case 'start':
|
|
54
|
+
await this.config.runCommand('work:start', projectArgs);
|
|
55
|
+
break;
|
|
56
|
+
case 'spawn':
|
|
57
|
+
await this.config.runCommand('work:spawn', projectArgs);
|
|
58
|
+
break;
|
|
59
|
+
case 'watch':
|
|
60
|
+
await this.config.runCommand('work:watch', projectArgs);
|
|
61
|
+
break;
|
|
62
|
+
case 'ready':
|
|
63
|
+
await this.config.runCommand('work:ready', projectArgs);
|
|
64
|
+
break;
|
|
65
|
+
case 'complete':
|
|
66
|
+
await this.config.runCommand('work:complete', projectArgs);
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class WorkReady extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
ticketId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
pr: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
draft: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
'no-pr': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
};
|
|
15
|
+
execute(): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Check if we should offer PR creation (gh is available, on a feature branch, etc.)
|
|
18
|
+
*/
|
|
19
|
+
private shouldOfferPRCreation;
|
|
20
|
+
/**
|
|
21
|
+
* Handle PR creation for the ticket.
|
|
22
|
+
*/
|
|
23
|
+
private handlePRCreation;
|
|
24
|
+
}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as fs from 'node:fs';
|
|
4
|
+
import Database from 'better-sqlite3';
|
|
5
|
+
import inquirer from 'inquirer';
|
|
6
|
+
import { PMOCommand, pmoBaseFlags, autoExportToBoard } from '../../lib/pmo/index.js';
|
|
7
|
+
import { getWorkColumnSetting, findColumnByName } from '../../lib/pmo/utils.js';
|
|
8
|
+
import { styles } from '../../lib/styles.js';
|
|
9
|
+
import { getWorkspaceInfo } from '../../lib/agents/commands.js';
|
|
10
|
+
import { ExecutionStorage } from '../../lib/execution/storage.js';
|
|
11
|
+
import { isGHInstalled, isGHAuthenticated, getCurrentBranch, getDefaultBaseBranch, hasBranchBeenPushed, pushBranch, hasUnpushedCommits, getCommitLog, createPR, getPRForBranch, generatePRTitle, generatePRBody, } from '../../lib/pr/index.js';
|
|
12
|
+
import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
13
|
+
export default class WorkReady extends PMOCommand {
|
|
14
|
+
static description = 'Mark work as ready for review (moves ticket to In Review column)';
|
|
15
|
+
static examples = [
|
|
16
|
+
'<%= config.bin %> <%= command.id %>',
|
|
17
|
+
'<%= config.bin %> <%= command.id %> TKT-001',
|
|
18
|
+
'<%= config.bin %> <%= command.id %> --pr',
|
|
19
|
+
'<%= config.bin %> <%= command.id %> TKT-001 --pr --draft',
|
|
20
|
+
'<%= config.bin %> <%= command.id %> --json # Output choices as JSON',
|
|
21
|
+
];
|
|
22
|
+
static args = {
|
|
23
|
+
ticketId: Args.string({
|
|
24
|
+
description: 'Ticket ID - prompts with dropdown if not provided',
|
|
25
|
+
required: false,
|
|
26
|
+
}),
|
|
27
|
+
};
|
|
28
|
+
static flags = {
|
|
29
|
+
...pmoBaseFlags,
|
|
30
|
+
json: Flags.boolean({
|
|
31
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
32
|
+
default: false,
|
|
33
|
+
}),
|
|
34
|
+
pr: Flags.boolean({
|
|
35
|
+
description: 'Create a pull request for this work',
|
|
36
|
+
default: false,
|
|
37
|
+
}),
|
|
38
|
+
draft: Flags.boolean({
|
|
39
|
+
description: 'Create PR as draft (only with --pr)',
|
|
40
|
+
default: false,
|
|
41
|
+
}),
|
|
42
|
+
'no-pr': Flags.boolean({
|
|
43
|
+
description: 'Skip PR creation prompt',
|
|
44
|
+
default: false,
|
|
45
|
+
}),
|
|
46
|
+
};
|
|
47
|
+
async execute() {
|
|
48
|
+
const { args, flags } = await this.parse(WorkReady);
|
|
49
|
+
const projectId = flags.project;
|
|
50
|
+
// Check if JSON output mode is active
|
|
51
|
+
const jsonMode = shouldOutputJson(flags);
|
|
52
|
+
// Helper to handle errors in JSON mode
|
|
53
|
+
const handleError = (code, message) => {
|
|
54
|
+
if (jsonMode) {
|
|
55
|
+
outputErrorAsJson(code, message, createMetadata('work ready', flags));
|
|
56
|
+
this.exit(1);
|
|
57
|
+
}
|
|
58
|
+
this.error(message);
|
|
59
|
+
};
|
|
60
|
+
// Get workspace info for execution storage
|
|
61
|
+
let workspaceInfo;
|
|
62
|
+
try {
|
|
63
|
+
workspaceInfo = getWorkspaceInfo();
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return handleError('NOT_IN_WORKSPACE', 'Not in a workspace. Run "prlt init" first.');
|
|
67
|
+
}
|
|
68
|
+
// Open database for execution storage
|
|
69
|
+
const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
|
|
70
|
+
const db = new Database(dbPath);
|
|
71
|
+
const executionStorage = new ExecutionStorage(db);
|
|
72
|
+
try {
|
|
73
|
+
// Get ticketId - prompt if not provided
|
|
74
|
+
let ticketId = args.ticketId;
|
|
75
|
+
if (!ticketId) {
|
|
76
|
+
// Get all in-progress (started) tickets for selection, optionally filtered by project
|
|
77
|
+
const allTickets = await this.storage.listTickets(projectId);
|
|
78
|
+
const inProgressTickets = allTickets.filter(t => t.statusCategory === 'started' || (t.statusName && t.statusName.toLowerCase().includes('progress')));
|
|
79
|
+
if (inProgressTickets.length === 0) {
|
|
80
|
+
db.close();
|
|
81
|
+
if (jsonMode) {
|
|
82
|
+
outputErrorAsJson('NO_IN_PROGRESS_WORK', 'No in-progress work found.', createMetadata('work ready', flags));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.log(styles.info('No in-progress work found.'));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const selected = await this.selectFromList({
|
|
89
|
+
message: 'Select work to mark as ready for review:',
|
|
90
|
+
items: inProgressTickets,
|
|
91
|
+
getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
|
|
92
|
+
getValue: (t) => t.id,
|
|
93
|
+
getCommand: (t) => `prlt work ready ${t.id} --json`,
|
|
94
|
+
jsonMode: jsonMode ? { flags, commandName: 'work ready' } : null,
|
|
95
|
+
});
|
|
96
|
+
if (!selected) {
|
|
97
|
+
db.close();
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
ticketId = selected;
|
|
101
|
+
}
|
|
102
|
+
// Get ticket
|
|
103
|
+
const ticket = await this.storage.getTicket(ticketId);
|
|
104
|
+
if (!ticket) {
|
|
105
|
+
db.close();
|
|
106
|
+
this.error(`Ticket "${ticketId}" not found.`);
|
|
107
|
+
}
|
|
108
|
+
// Get configured column name (from pmo_settings or default)
|
|
109
|
+
// In Linear-style workflow, "ready" moves ticket to Done (review is implicit via PR)
|
|
110
|
+
const targetColumnName = getWorkColumnSetting(db, 'done');
|
|
111
|
+
const board = await this.storage.getBoard(ticket.projectId);
|
|
112
|
+
const columnNames = board.columns.map(col => col.name);
|
|
113
|
+
const doneColumn = findColumnByName(columnNames, targetColumnName);
|
|
114
|
+
if (!doneColumn) {
|
|
115
|
+
db.close();
|
|
116
|
+
this.error(`No "${targetColumnName}" column found in board configuration. Configure with: prlt config set column_done <column-name>`);
|
|
117
|
+
}
|
|
118
|
+
const previousColumn = ticket.statusName;
|
|
119
|
+
// Move to Done column (moveTicket also updates status_id)
|
|
120
|
+
await this.storage.moveTicket(ticket.projectId, ticketId, doneColumn);
|
|
121
|
+
// Auto-export to board.md if configured
|
|
122
|
+
await autoExportToBoard(this.pmoPath, this.storage);
|
|
123
|
+
// Mark any running executions for this ticket as completed
|
|
124
|
+
const runningExecution = executionStorage.getRunningExecution(ticketId);
|
|
125
|
+
if (runningExecution) {
|
|
126
|
+
executionStorage.updateStatus(runningExecution.id, 'completed');
|
|
127
|
+
this.log(styles.muted(` Execution ${runningExecution.id} marked as completed`));
|
|
128
|
+
}
|
|
129
|
+
// Handle PR creation
|
|
130
|
+
let prUrl;
|
|
131
|
+
const shouldCreatePR = flags.pr || (!flags['no-pr'] && await this.shouldOfferPRCreation());
|
|
132
|
+
if (shouldCreatePR) {
|
|
133
|
+
// Get branch and worktree path from the execution record
|
|
134
|
+
const branch = runningExecution?.branch;
|
|
135
|
+
const agentName = runningExecution?.agentName;
|
|
136
|
+
let worktreePath;
|
|
137
|
+
if (agentName) {
|
|
138
|
+
// Get agent's worktree path
|
|
139
|
+
if (process.env.DEVCONTAINER === 'true') {
|
|
140
|
+
// In devcontainer, look for repo directories inside /workspace
|
|
141
|
+
const entries = fs.readdirSync('/workspace', { withFileTypes: true });
|
|
142
|
+
const repoDirs = entries.filter((e) => e.isDirectory() && !e.name.startsWith('.') && e.name !== 'node_modules');
|
|
143
|
+
if (repoDirs.length > 0) {
|
|
144
|
+
// Use the first repo directory (typically proletariat-{agentName})
|
|
145
|
+
worktreePath = path.join('/workspace', repoDirs[0].name);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
const agentsPath = path.join(workspaceInfo.path, 'agents', 'staff');
|
|
150
|
+
const agentDir = path.join(agentsPath, agentName);
|
|
151
|
+
// Look for repo directories inside agent dir
|
|
152
|
+
const entries = fs.readdirSync(agentDir, { withFileTypes: true });
|
|
153
|
+
const repoDirs = entries.filter((e) => e.isDirectory() && !e.name.startsWith('.') && e.name !== 'node_modules');
|
|
154
|
+
if (repoDirs.length > 0) {
|
|
155
|
+
// Use the first repo directory (typically the main worktree)
|
|
156
|
+
worktreePath = path.join(agentDir, repoDirs[0].name);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
prUrl = await this.handlePRCreation(ticket, flags.draft, branch, worktreePath);
|
|
161
|
+
if (prUrl) {
|
|
162
|
+
// Store PR URL in ticket metadata
|
|
163
|
+
await this.storage.updateTicket(ticketId, {
|
|
164
|
+
metadata: {
|
|
165
|
+
...ticket.metadata,
|
|
166
|
+
pr_url: prUrl,
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
db.close();
|
|
172
|
+
this.log(styles.success(`Work ready: ${ticketId}`));
|
|
173
|
+
this.log(styles.muted(` Title: ${ticket.title}`));
|
|
174
|
+
this.log(styles.muted(` From: ${previousColumn}`));
|
|
175
|
+
this.log(styles.muted(` To: ${doneColumn}`));
|
|
176
|
+
if (prUrl) {
|
|
177
|
+
this.log(styles.muted(` PR: ${prUrl}`));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
db.close();
|
|
182
|
+
throw error;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Check if we should offer PR creation (gh is available, on a feature branch, etc.)
|
|
187
|
+
*/
|
|
188
|
+
async shouldOfferPRCreation() {
|
|
189
|
+
// Check if gh CLI is available
|
|
190
|
+
if (!isGHInstalled() || !isGHAuthenticated()) {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
// Check if we're on a feature branch (not main/master)
|
|
194
|
+
const currentBranch = getCurrentBranch();
|
|
195
|
+
if (!currentBranch) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
const baseBranch = getDefaultBaseBranch();
|
|
199
|
+
if (currentBranch === baseBranch) {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
// Check if PR already exists
|
|
203
|
+
const existingPR = getPRForBranch(currentBranch);
|
|
204
|
+
if (existingPR) {
|
|
205
|
+
this.log(styles.muted(` PR already exists: ${existingPR.url}`));
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
// Prompt user
|
|
209
|
+
const { createPR: wantPR } = await inquirer.prompt([{
|
|
210
|
+
type: 'list',
|
|
211
|
+
name: 'createPR',
|
|
212
|
+
message: 'Create a pull request for this work?',
|
|
213
|
+
choices: [
|
|
214
|
+
{ name: 'Yes', value: true },
|
|
215
|
+
{ name: 'No', value: false },
|
|
216
|
+
],
|
|
217
|
+
default: true,
|
|
218
|
+
}]);
|
|
219
|
+
return wantPR;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Handle PR creation for the ticket.
|
|
223
|
+
*/
|
|
224
|
+
async handlePRCreation(ticket, draft, branchFromExecution, worktreePath) {
|
|
225
|
+
// Use branch from execution record if available, otherwise try to detect
|
|
226
|
+
const currentBranch = branchFromExecution || getCurrentBranch();
|
|
227
|
+
if (!currentBranch) {
|
|
228
|
+
this.log(styles.warning('Could not determine current branch. Skipping PR creation.'));
|
|
229
|
+
return undefined;
|
|
230
|
+
}
|
|
231
|
+
// If we have a worktree path, cd to it for git operations
|
|
232
|
+
const originalCwd = process.cwd();
|
|
233
|
+
if (worktreePath) {
|
|
234
|
+
try {
|
|
235
|
+
process.chdir(worktreePath);
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
this.log(styles.warning(`Could not access worktree at ${worktreePath}. Skipping PR creation.`));
|
|
239
|
+
return undefined;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
try {
|
|
243
|
+
const baseBranch = getDefaultBaseBranch();
|
|
244
|
+
// Push branch if needed
|
|
245
|
+
if (!hasBranchBeenPushed(currentBranch)) {
|
|
246
|
+
this.log(styles.muted(` Pushing branch to origin...`));
|
|
247
|
+
if (!pushBranch(currentBranch)) {
|
|
248
|
+
this.log(styles.warning('Failed to push branch. Skipping PR creation.'));
|
|
249
|
+
return undefined;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
else if (hasUnpushedCommits(currentBranch)) {
|
|
253
|
+
this.log(styles.muted(` Pushing unpushed commits...`));
|
|
254
|
+
if (!pushBranch(currentBranch)) {
|
|
255
|
+
this.log(styles.warning('Failed to push commits. Skipping PR creation.'));
|
|
256
|
+
return undefined;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// Generate PR content
|
|
260
|
+
const prTitle = generatePRTitle(ticket.id, ticket.title);
|
|
261
|
+
const commits = getCommitLog(baseBranch);
|
|
262
|
+
const prBody = generatePRBody({
|
|
263
|
+
ticketId: ticket.id,
|
|
264
|
+
ticketTitle: ticket.title,
|
|
265
|
+
ticketDescription: ticket.description,
|
|
266
|
+
commits: commits.slice(0, 10),
|
|
267
|
+
});
|
|
268
|
+
// Create PR
|
|
269
|
+
this.log(styles.muted(` Creating pull request...`));
|
|
270
|
+
const result = createPR({
|
|
271
|
+
title: prTitle,
|
|
272
|
+
body: prBody,
|
|
273
|
+
base: baseBranch,
|
|
274
|
+
draft,
|
|
275
|
+
});
|
|
276
|
+
if (!result.success) {
|
|
277
|
+
this.log(styles.warning(`Failed to create PR: ${result.error}`));
|
|
278
|
+
return undefined;
|
|
279
|
+
}
|
|
280
|
+
this.log(styles.success(` PR #${result.number} created`));
|
|
281
|
+
return result.url;
|
|
282
|
+
}
|
|
283
|
+
finally {
|
|
284
|
+
// Restore original cwd
|
|
285
|
+
if (worktreePath) {
|
|
286
|
+
process.chdir(originalCwd);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class WorkRevise extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
ticketId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
mode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
executor: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
'run-on-host': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
session: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
+
};
|
|
17
|
+
execute(): Promise<void>;
|
|
18
|
+
private getCurrentBranch;
|
|
19
|
+
}
|