@proletariat/cli 0.1.4 ā 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +510 -255
- package/bin/dev.cmd +3 -0
- package/bin/dev.js +5 -0
- package/bin/run.cmd +3 -0
- package/bin/run.js +23 -0
- package/dist/commands/action/create.d.ts +21 -0
- package/dist/commands/action/create.js +126 -0
- package/dist/commands/action/delete.d.ts +17 -0
- package/dist/commands/action/delete.js +78 -0
- package/dist/commands/action/index.d.ts +15 -0
- package/dist/commands/action/index.js +107 -0
- package/dist/commands/action/list.d.ts +14 -0
- package/dist/commands/action/list.js +89 -0
- package/dist/commands/action/run.d.ts +19 -0
- package/dist/commands/action/run.js +179 -0
- package/dist/commands/action/show.d.ts +15 -0
- package/dist/commands/action/show.js +47 -0
- package/dist/commands/action/update.d.ts +22 -0
- package/dist/commands/action/update.js +168 -0
- package/dist/commands/agent/index.d.ts +13 -0
- package/dist/commands/agent/index.js +131 -0
- package/dist/commands/agent/list.d.ts +7 -0
- package/dist/commands/agent/list.js +126 -0
- package/dist/commands/agent/login.d.ts +16 -0
- package/dist/commands/agent/login.js +146 -0
- package/dist/commands/agent/rebuild.d.ts +18 -0
- package/dist/commands/agent/rebuild.js +133 -0
- package/dist/commands/agent/restart.d.ts +17 -0
- package/dist/commands/agent/restart.js +116 -0
- package/dist/commands/agent/shell.d.ts +23 -0
- package/dist/commands/agent/shell.js +378 -0
- package/dist/commands/agent/staff/add.d.ts +15 -0
- package/dist/commands/agent/staff/add.js +281 -0
- package/dist/commands/agent/staff/index.d.ts +14 -0
- package/dist/commands/agent/staff/index.js +90 -0
- package/dist/commands/agent/staff/list.d.ts +7 -0
- package/dist/commands/agent/staff/list.js +90 -0
- package/dist/commands/agent/staff/remove.d.ts +16 -0
- package/dist/commands/agent/staff/remove.js +137 -0
- package/dist/commands/agent/status.d.ts +17 -0
- package/dist/commands/agent/status.js +139 -0
- package/dist/commands/agent/temp/cleanup.d.ts +23 -0
- package/dist/commands/agent/temp/cleanup.js +388 -0
- package/dist/commands/agent/temp/index.d.ts +14 -0
- package/dist/commands/agent/temp/index.js +82 -0
- package/dist/commands/agent/temp/list.d.ts +7 -0
- package/dist/commands/agent/temp/list.js +108 -0
- package/dist/commands/agent/themes/add-names.d.ts +10 -0
- package/dist/commands/agent/themes/add-names.js +67 -0
- package/dist/commands/agent/themes/create.d.ts +13 -0
- package/dist/commands/agent/themes/create.js +66 -0
- package/dist/commands/agent/themes/index.d.ts +9 -0
- package/dist/commands/agent/themes/index.js +194 -0
- package/dist/commands/agent/themes/list.d.ts +6 -0
- package/dist/commands/agent/themes/list.js +41 -0
- package/dist/commands/agent/themes/set.d.ts +12 -0
- package/dist/commands/agent/themes/set.js +77 -0
- package/dist/commands/agent/visit.d.ts +16 -0
- package/dist/commands/agent/visit.js +88 -0
- package/dist/commands/autocomplete/setup.d.ts +14 -0
- package/dist/commands/autocomplete/setup.js +154 -0
- package/dist/commands/board/index.d.ts +17 -0
- package/dist/commands/board/index.js +255 -0
- package/dist/commands/board/watch.d.ts +13 -0
- package/dist/commands/board/watch.js +52 -0
- package/dist/commands/branch/create.d.ts +50 -0
- package/dist/commands/branch/create.js +624 -0
- package/dist/commands/branch/index.d.ts +13 -0
- package/dist/commands/branch/index.js +50 -0
- package/dist/commands/branch/list.d.ts +17 -0
- package/dist/commands/branch/list.js +120 -0
- package/dist/commands/branch/validate.d.ts +15 -0
- package/dist/commands/branch/validate.js +73 -0
- package/dist/commands/commit.d.ts +71 -0
- package/dist/commands/commit.js +499 -0
- package/dist/commands/docker/clean.d.ts +13 -0
- package/dist/commands/docker/clean.js +224 -0
- package/dist/commands/docker/index.d.ts +19 -0
- package/dist/commands/docker/index.js +274 -0
- package/dist/commands/docker/list.d.ts +16 -0
- package/dist/commands/docker/list.js +200 -0
- package/dist/commands/docker/logs.d.ts +14 -0
- package/dist/commands/docker/logs.js +118 -0
- package/dist/commands/docker/prune.d.ts +14 -0
- package/dist/commands/docker/prune.js +211 -0
- package/dist/commands/docker/restart.d.ts +14 -0
- package/dist/commands/docker/restart.js +129 -0
- package/dist/commands/docker/shell.d.ts +14 -0
- package/dist/commands/docker/shell.js +103 -0
- package/dist/commands/docker/start.d.ts +12 -0
- package/dist/commands/docker/start.js +92 -0
- package/dist/commands/docker/status.d.ts +7 -0
- package/dist/commands/docker/status.js +40 -0
- package/dist/commands/docker/stop.d.ts +14 -0
- package/dist/commands/docker/stop.js +134 -0
- package/dist/commands/docker/sync.d.ts +15 -0
- package/dist/commands/docker/sync.js +112 -0
- package/dist/commands/epic/activate.d.ts +13 -0
- package/dist/commands/epic/activate.js +118 -0
- package/dist/commands/epic/archive.d.ts +14 -0
- package/dist/commands/epic/archive.js +132 -0
- package/dist/commands/epic/create.d.ts +15 -0
- package/dist/commands/epic/create.js +137 -0
- package/dist/commands/epic/index.d.ts +13 -0
- package/dist/commands/epic/index.js +88 -0
- package/dist/commands/epic/link/block.d.ts +14 -0
- package/dist/commands/epic/link/block.js +79 -0
- package/dist/commands/epic/link/duplicates.d.ts +14 -0
- package/dist/commands/epic/link/duplicates.js +66 -0
- package/dist/commands/epic/link/index.d.ts +19 -0
- package/dist/commands/epic/link/index.js +242 -0
- package/dist/commands/epic/link/relates.d.ts +14 -0
- package/dist/commands/epic/link/relates.js +66 -0
- package/dist/commands/epic/link/remove.d.ts +16 -0
- package/dist/commands/epic/link/remove.js +89 -0
- package/dist/commands/epic/list.d.ts +11 -0
- package/dist/commands/epic/list.js +87 -0
- package/dist/commands/epic/move.d.ts +15 -0
- package/dist/commands/epic/move.js +184 -0
- package/dist/commands/epic/progress.d.ts +16 -0
- package/dist/commands/epic/progress.js +166 -0
- package/dist/commands/epic/project.d.ts +15 -0
- package/dist/commands/epic/project.js +219 -0
- package/dist/commands/epic/reorder.d.ts +21 -0
- package/dist/commands/epic/reorder.js +160 -0
- package/dist/commands/epic/spec.d.ts +15 -0
- package/dist/commands/epic/spec.js +191 -0
- package/dist/commands/epic/ticket.d.ts +18 -0
- package/dist/commands/epic/ticket.js +291 -0
- package/dist/commands/epic/view.d.ts +13 -0
- package/dist/commands/epic/view.js +117 -0
- package/dist/commands/execution/index.d.ts +13 -0
- package/dist/commands/execution/index.js +70 -0
- package/dist/commands/execution/list.d.ts +15 -0
- package/dist/commands/execution/list.js +144 -0
- package/dist/commands/execution/logs.d.ts +18 -0
- package/dist/commands/execution/logs.js +161 -0
- package/dist/commands/execution/stop.d.ts +22 -0
- package/dist/commands/execution/stop.js +248 -0
- package/dist/commands/gh/index.d.ts +9 -0
- package/dist/commands/gh/index.js +53 -0
- package/dist/commands/gh/login.d.ts +6 -0
- package/dist/commands/gh/login.js +57 -0
- package/dist/commands/gh/status.d.ts +6 -0
- package/dist/commands/gh/status.js +48 -0
- package/dist/commands/gh/token.d.ts +6 -0
- package/dist/commands/gh/token.js +59 -0
- package/dist/commands/init.d.ts +26 -0
- package/dist/commands/init.js +200 -0
- package/dist/commands/phase/create.d.ts +22 -0
- package/dist/commands/phase/create.js +123 -0
- package/dist/commands/phase/delete.d.ts +17 -0
- package/dist/commands/phase/delete.js +73 -0
- package/dist/commands/phase/list.d.ts +12 -0
- package/dist/commands/phase/list.js +76 -0
- package/dist/commands/phase/move.d.ts +17 -0
- package/dist/commands/phase/move.js +115 -0
- package/dist/commands/phase/template/apply.d.ts +17 -0
- package/dist/commands/phase/template/apply.js +106 -0
- package/dist/commands/phase/template/create.d.ts +16 -0
- package/dist/commands/phase/template/create.js +58 -0
- package/dist/commands/phase/template/delete.d.ts +17 -0
- package/dist/commands/phase/template/delete.js +98 -0
- package/dist/commands/phase/template/index.d.ts +15 -0
- package/dist/commands/phase/template/index.js +128 -0
- package/dist/commands/phase/template/list.d.ts +16 -0
- package/dist/commands/phase/template/list.js +95 -0
- package/dist/commands/phase/template/update.d.ts +17 -0
- package/dist/commands/phase/template/update.js +89 -0
- package/dist/commands/phase/update.d.ts +23 -0
- package/dist/commands/phase/update.js +174 -0
- package/dist/commands/pmo/init.d.ts +25 -0
- package/dist/commands/pmo/init.js +341 -0
- package/dist/commands/pr/create.d.ts +17 -0
- package/dist/commands/pr/create.js +242 -0
- package/dist/commands/pr/index.d.ts +9 -0
- package/dist/commands/pr/index.js +68 -0
- package/dist/commands/pr/link.d.ts +14 -0
- package/dist/commands/pr/link.js +212 -0
- package/dist/commands/pr/status.d.ts +12 -0
- package/dist/commands/pr/status.js +161 -0
- package/dist/commands/project/archive.d.ts +17 -0
- package/dist/commands/project/archive.js +83 -0
- package/dist/commands/project/create.d.ts +22 -0
- package/dist/commands/project/create.js +143 -0
- package/dist/commands/project/delete.d.ts +17 -0
- package/dist/commands/project/delete.js +128 -0
- package/dist/commands/project/index.d.ts +13 -0
- package/dist/commands/project/index.js +64 -0
- package/dist/commands/project/list.d.ts +14 -0
- package/dist/commands/project/list.js +96 -0
- package/dist/commands/project/spec.d.ts +18 -0
- package/dist/commands/project/spec.js +216 -0
- package/dist/commands/project/unarchive.d.ts +15 -0
- package/dist/commands/project/unarchive.js +35 -0
- package/dist/commands/project/view.d.ts +16 -0
- package/dist/commands/project/view.js +94 -0
- package/dist/commands/repo/add.d.ts +21 -0
- package/dist/commands/repo/add.js +118 -0
- package/dist/commands/repo/index.d.ts +13 -0
- package/dist/commands/repo/index.js +114 -0
- package/dist/commands/repo/list.d.ts +13 -0
- package/dist/commands/repo/list.js +96 -0
- package/dist/commands/repo/remove.d.ts +23 -0
- package/dist/commands/repo/remove.js +217 -0
- package/dist/commands/repo/view.d.ts +15 -0
- package/dist/commands/repo/view.js +99 -0
- package/dist/commands/session/attach.d.ts +40 -0
- package/dist/commands/session/attach.js +307 -0
- package/dist/commands/session/index.d.ts +13 -0
- package/dist/commands/session/index.js +64 -0
- package/dist/commands/session/list.d.ts +21 -0
- package/dist/commands/session/list.js +181 -0
- package/dist/commands/spec/create.d.ts +19 -0
- package/dist/commands/spec/create.js +130 -0
- package/dist/commands/spec/index.d.ts +13 -0
- package/dist/commands/spec/index.js +68 -0
- package/dist/commands/spec/link/depends.d.ts +14 -0
- package/dist/commands/spec/link/depends.js +64 -0
- package/dist/commands/spec/link/duplicates.d.ts +14 -0
- package/dist/commands/spec/link/duplicates.js +63 -0
- package/dist/commands/spec/link/index.d.ts +19 -0
- package/dist/commands/spec/link/index.js +200 -0
- package/dist/commands/spec/link/relates.d.ts +14 -0
- package/dist/commands/spec/link/relates.js +63 -0
- package/dist/commands/spec/link/remove.d.ts +16 -0
- package/dist/commands/spec/link/remove.js +94 -0
- package/dist/commands/spec/list.d.ts +12 -0
- package/dist/commands/spec/list.js +75 -0
- package/dist/commands/spec/plan.d.ts +15 -0
- package/dist/commands/spec/plan.js +108 -0
- package/dist/commands/spec/ticket.d.ts +18 -0
- package/dist/commands/spec/ticket.js +160 -0
- package/dist/commands/spec/view.d.ts +15 -0
- package/dist/commands/spec/view.js +163 -0
- package/dist/commands/status/create.d.ts +21 -0
- package/dist/commands/status/create.js +140 -0
- package/dist/commands/status/delete.d.ts +13 -0
- package/dist/commands/status/delete.js +77 -0
- package/dist/commands/status/index.d.ts +14 -0
- package/dist/commands/status/index.js +91 -0
- package/dist/commands/status/list.d.ts +12 -0
- package/dist/commands/status/list.js +93 -0
- package/dist/commands/status/move.d.ts +14 -0
- package/dist/commands/status/move.js +120 -0
- package/dist/commands/status/update.d.ts +20 -0
- package/dist/commands/status/update.js +180 -0
- package/dist/commands/template/delete.d.ts +15 -0
- package/dist/commands/template/delete.js +142 -0
- package/dist/commands/template/index.d.ts +10 -0
- package/dist/commands/template/index.js +64 -0
- package/dist/commands/template/list.d.ts +18 -0
- package/dist/commands/template/list.js +157 -0
- package/dist/commands/template/phase/apply.d.ts +14 -0
- package/dist/commands/template/phase/apply.js +41 -0
- package/dist/commands/template/phase/create.d.ts +12 -0
- package/dist/commands/template/phase/create.js +29 -0
- package/dist/commands/template/phase/delete.d.ts +13 -0
- package/dist/commands/template/phase/delete.js +34 -0
- package/dist/commands/template/phase/index.d.ts +10 -0
- package/dist/commands/template/phase/index.js +62 -0
- package/dist/commands/template/phase/list.d.ts +11 -0
- package/dist/commands/template/phase/list.js +34 -0
- package/dist/commands/template/phase/update.d.ts +13 -0
- package/dist/commands/template/phase/update.js +35 -0
- package/dist/commands/template/ticket/apply.d.ts +17 -0
- package/dist/commands/template/ticket/apply.js +58 -0
- package/dist/commands/template/ticket/delete.d.ts +13 -0
- package/dist/commands/template/ticket/delete.js +34 -0
- package/dist/commands/template/ticket/index.d.ts +10 -0
- package/dist/commands/template/ticket/index.js +62 -0
- package/dist/commands/template/ticket/list.d.ts +11 -0
- package/dist/commands/template/ticket/list.js +34 -0
- package/dist/commands/template/ticket/save.d.ts +13 -0
- package/dist/commands/template/ticket/save.js +35 -0
- package/dist/commands/ticket/bulk.d.ts +13 -0
- package/dist/commands/ticket/bulk.js +145 -0
- package/dist/commands/ticket/complete.d.ts +16 -0
- package/dist/commands/ticket/complete.js +170 -0
- package/dist/commands/ticket/create.d.ts +22 -0
- package/dist/commands/ticket/create.js +390 -0
- package/dist/commands/ticket/delete.d.ts +16 -0
- package/dist/commands/ticket/delete.js +178 -0
- package/dist/commands/ticket/edit.d.ts +27 -0
- package/dist/commands/ticket/edit.js +322 -0
- package/dist/commands/ticket/epic.d.ts +20 -0
- package/dist/commands/ticket/epic.js +333 -0
- package/dist/commands/ticket/index.d.ts +13 -0
- package/dist/commands/ticket/index.js +103 -0
- package/dist/commands/ticket/link/block.d.ts +14 -0
- package/dist/commands/ticket/link/block.js +94 -0
- package/dist/commands/ticket/link/duplicates.d.ts +14 -0
- package/dist/commands/ticket/link/duplicates.js +93 -0
- package/dist/commands/ticket/link/index.d.ts +19 -0
- package/dist/commands/ticket/link/index.js +239 -0
- package/dist/commands/ticket/link/relates.d.ts +14 -0
- package/dist/commands/ticket/link/relates.js +93 -0
- package/dist/commands/ticket/link/remove.d.ts +16 -0
- package/dist/commands/ticket/link/remove.js +128 -0
- package/dist/commands/ticket/list.d.ts +24 -0
- package/dist/commands/ticket/list.js +431 -0
- package/dist/commands/ticket/move.d.ts +18 -0
- package/dist/commands/ticket/move.js +212 -0
- package/dist/commands/ticket/project.d.ts +18 -0
- package/dist/commands/ticket/project.js +254 -0
- package/dist/commands/ticket/reassign.d.ts +19 -0
- package/dist/commands/ticket/reassign.js +279 -0
- package/dist/commands/ticket/spec.d.ts +18 -0
- package/dist/commands/ticket/spec.js +259 -0
- package/dist/commands/ticket/status.d.ts +13 -0
- package/dist/commands/ticket/status.js +87 -0
- package/dist/commands/ticket/template/apply.d.ts +25 -0
- package/dist/commands/ticket/template/apply.js +249 -0
- package/dist/commands/ticket/template/create.d.ts +19 -0
- package/dist/commands/ticket/template/create.js +210 -0
- package/dist/commands/ticket/template/delete.d.ts +17 -0
- package/dist/commands/ticket/template/delete.js +92 -0
- package/dist/commands/ticket/template/index.d.ts +15 -0
- package/dist/commands/ticket/template/index.js +118 -0
- package/dist/commands/ticket/template/list.d.ts +16 -0
- package/dist/commands/ticket/template/list.js +110 -0
- package/dist/commands/ticket/template/save.d.ts +14 -0
- package/dist/commands/ticket/template/save.js +110 -0
- package/dist/commands/ticket/update.d.ts +18 -0
- package/dist/commands/ticket/update.js +325 -0
- package/dist/commands/ticket/view.d.ts +13 -0
- package/dist/commands/ticket/view.js +80 -0
- package/dist/commands/whoami.d.ts +9 -0
- package/dist/commands/whoami.js +103 -0
- package/dist/commands/work/complete.d.ts +13 -0
- package/dist/commands/work/complete.js +121 -0
- package/dist/commands/work/index.d.ts +13 -0
- package/dist/commands/work/index.js +70 -0
- package/dist/commands/work/ready.d.ts +24 -0
- package/dist/commands/work/ready.js +290 -0
- package/dist/commands/work/revise.d.ts +19 -0
- package/dist/commands/work/revise.js +377 -0
- package/dist/commands/work/spawn-all.d.ts +17 -0
- package/dist/commands/work/spawn-all.js +58 -0
- package/dist/commands/work/spawn.d.ts +29 -0
- package/dist/commands/work/spawn.js +728 -0
- package/dist/commands/work/start.d.ts +39 -0
- package/dist/commands/work/start.js +1393 -0
- package/dist/commands/work/watch.d.ts +31 -0
- package/dist/commands/work/watch.js +359 -0
- package/dist/commands/workflow/create.d.ts +18 -0
- package/dist/commands/workflow/create.js +119 -0
- package/dist/commands/workflow/delete.d.ts +17 -0
- package/dist/commands/workflow/delete.js +119 -0
- package/dist/commands/workflow/index.d.ts +15 -0
- package/dist/commands/workflow/index.js +75 -0
- package/dist/commands/workflow/list.d.ts +15 -0
- package/dist/commands/workflow/list.js +75 -0
- package/dist/commands/workflow/switch.d.ts +13 -0
- package/dist/commands/workflow/switch.js +117 -0
- package/dist/commands/workflow/view.d.ts +16 -0
- package/dist/commands/workflow/view.js +114 -0
- package/dist/commands/workspace/add.d.ts +12 -0
- package/dist/commands/workspace/add.js +74 -0
- package/dist/commands/workspace/list.d.ts +9 -0
- package/dist/commands/workspace/list.js +153 -0
- package/dist/commands/workspace/remove.d.ts +13 -0
- package/dist/commands/workspace/remove.js +98 -0
- package/dist/commands/workspace/use.d.ts +12 -0
- package/dist/commands/workspace/use.js +111 -0
- package/dist/hooks/init.d.ts +11 -0
- package/dist/hooks/init.js +57 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/lib/agents/commands.d.ts +189 -0
- package/dist/lib/agents/commands.js +893 -0
- package/dist/lib/agents/index.d.ts +54 -0
- package/dist/lib/agents/index.js +382 -0
- package/dist/lib/branch/index.d.ts +120 -0
- package/dist/lib/branch/index.js +334 -0
- package/dist/lib/colors.d.ts +94 -0
- package/dist/lib/colors.js +68 -0
- package/dist/lib/commands/docker-command.d.ts +21 -0
- package/dist/lib/commands/docker-command.js +27 -0
- package/dist/lib/database/index.d.ts +176 -0
- package/dist/lib/database/index.js +581 -0
- package/dist/lib/docker/resolve.d.ts +38 -0
- package/dist/lib/docker/resolve.js +175 -0
- package/dist/lib/execution/config.d.ts +150 -0
- package/dist/lib/execution/config.js +541 -0
- package/dist/lib/execution/devcontainer.d.ts +85 -0
- package/dist/lib/execution/devcontainer.js +594 -0
- package/dist/lib/execution/index.d.ts +10 -0
- package/dist/lib/execution/index.js +10 -0
- package/dist/lib/execution/runners.d.ts +53 -0
- package/dist/lib/execution/runners.js +1182 -0
- package/dist/lib/execution/spawner.d.ts +85 -0
- package/dist/lib/execution/spawner.js +548 -0
- package/dist/lib/execution/storage.d.ts +159 -0
- package/dist/lib/execution/storage.js +425 -0
- package/dist/lib/execution/types.d.ts +145 -0
- package/dist/lib/execution/types.js +157 -0
- package/dist/lib/init/index.d.ts +75 -0
- package/dist/lib/init/index.js +355 -0
- package/dist/lib/machine-config.d.ts +170 -0
- package/dist/lib/machine-config.js +386 -0
- package/dist/lib/pmo/base-command.d.ts +195 -0
- package/dist/lib/pmo/base-command.js +319 -0
- package/dist/lib/pmo/create-spec-folders.d.ts +43 -0
- package/dist/lib/pmo/create-spec-folders.js +64 -0
- package/dist/lib/pmo/epic-files.d.ts +56 -0
- package/dist/lib/pmo/epic-files.js +195 -0
- package/dist/lib/pmo/find-pmo.d.ts +14 -0
- package/dist/lib/pmo/find-pmo.js +172 -0
- package/dist/lib/pmo/index.d.ts +109 -0
- package/dist/lib/pmo/index.js +501 -0
- package/dist/lib/pmo/markdown.d.ts +31 -0
- package/dist/lib/pmo/markdown.js +245 -0
- package/dist/lib/pmo/pmo-context.d.ts +27 -0
- package/dist/lib/pmo/pmo-context.js +44 -0
- package/dist/lib/pmo/schema.d.ts +82 -0
- package/dist/lib/pmo/schema.js +531 -0
- package/dist/lib/pmo/spec-parser.d.ts +25 -0
- package/dist/lib/pmo/spec-parser.js +205 -0
- package/dist/lib/pmo/spec-types.d.ts +43 -0
- package/dist/lib/pmo/spec-types.js +7 -0
- package/dist/lib/pmo/storage/actions.d.ts +34 -0
- package/dist/lib/pmo/storage/actions.js +177 -0
- package/dist/lib/pmo/storage/base.d.ts +47 -0
- package/dist/lib/pmo/storage/base.js +858 -0
- package/dist/lib/pmo/storage/dependencies.d.ts +61 -0
- package/dist/lib/pmo/storage/dependencies.js +267 -0
- package/dist/lib/pmo/storage/epics.d.ts +46 -0
- package/dist/lib/pmo/storage/epics.js +243 -0
- package/dist/lib/pmo/storage/helpers.d.ts +33 -0
- package/dist/lib/pmo/storage/helpers.js +148 -0
- package/dist/lib/pmo/storage/index.d.ts +186 -0
- package/dist/lib/pmo/storage/index.js +689 -0
- package/dist/lib/pmo/storage/phases.d.ts +65 -0
- package/dist/lib/pmo/storage/phases.js +392 -0
- package/dist/lib/pmo/storage/projects.d.ts +79 -0
- package/dist/lib/pmo/storage/projects.js +303 -0
- package/dist/lib/pmo/storage/specs.d.ts +77 -0
- package/dist/lib/pmo/storage/specs.js +389 -0
- package/dist/lib/pmo/storage/statuses.d.ts +63 -0
- package/dist/lib/pmo/storage/statuses.js +404 -0
- package/dist/lib/pmo/storage/subtasks.d.ts +37 -0
- package/dist/lib/pmo/storage/subtasks.js +184 -0
- package/dist/lib/pmo/storage/templates.d.ts +40 -0
- package/dist/lib/pmo/storage/templates.js +210 -0
- package/dist/lib/pmo/storage/tickets.d.ts +57 -0
- package/dist/lib/pmo/storage/tickets.js +453 -0
- package/dist/lib/pmo/storage/types.d.ts +200 -0
- package/dist/lib/pmo/storage/types.js +5 -0
- package/dist/lib/pmo/storage/views.d.ts +44 -0
- package/dist/lib/pmo/storage/views.js +355 -0
- package/dist/lib/pmo/storage-sqlite.d.ts +7 -0
- package/dist/lib/pmo/storage-sqlite.js +7 -0
- package/dist/lib/pmo/sync-manager.d.ts +92 -0
- package/dist/lib/pmo/sync-manager.js +229 -0
- package/dist/lib/pmo/types.d.ts +710 -0
- package/dist/lib/pmo/types.js +108 -0
- package/dist/lib/pmo/utils.d.ts +122 -0
- package/dist/lib/pmo/utils.js +174 -0
- package/dist/lib/pmo/watcher.d.ts +43 -0
- package/dist/lib/pmo/watcher.js +208 -0
- package/dist/lib/pr/index.d.ts +150 -0
- package/dist/lib/pr/index.js +483 -0
- package/dist/lib/prompt-json.d.ts +231 -0
- package/dist/lib/prompt-json.js +213 -0
- package/dist/lib/repos/index.d.ts +81 -0
- package/dist/lib/repos/index.js +679 -0
- package/dist/lib/styles.d.ts +98 -0
- package/dist/lib/styles.js +195 -0
- package/dist/lib/themes.d.ts +128 -0
- package/dist/lib/themes.js +301 -0
- package/dist/lib/ui/BoardUI.d.ts +21 -0
- package/dist/lib/ui/BoardUI.js +85 -0
- package/dist/lib/ui/ClaimTicketUI.d.ts +17 -0
- package/dist/lib/ui/ClaimTicketUI.js +64 -0
- package/dist/lib/ui/CreateTicketUI.d.ts +13 -0
- package/dist/lib/ui/CreateTicketUI.js +101 -0
- package/dist/lib/workspace.d.ts +66 -0
- package/dist/lib/workspace.js +204 -0
- package/oclif.manifest.json +10593 -0
- package/package.json +104 -52
- package/LICENSE +0 -21
- package/dist/bin/prlt.d.ts +0 -11
- package/dist/bin/prlt.d.ts.map +0 -1
- package/dist/bin/prlt.js +0 -144
- package/dist/bin/prlt.js.map +0 -1
- package/dist/lib/config/index.d.ts +0 -14
- package/dist/lib/config/index.d.ts.map +0 -1
- package/dist/lib/config/index.js +0 -139
- package/dist/lib/config/index.js.map +0 -1
- package/dist/lib/config/upgrade.d.ts +0 -2
- package/dist/lib/config/upgrade.d.ts.map +0 -1
- package/dist/lib/config/upgrade.js +0 -173
- package/dist/lib/config/upgrade.js.map +0 -1
- package/dist/lib/themes/index.d.ts +0 -8
- package/dist/lib/themes/index.d.ts.map +0 -1
- package/dist/lib/themes/index.js +0 -80
- package/dist/lib/themes/index.js.map +0 -1
- package/dist/lib/utils/helpers.d.ts +0 -4
- package/dist/lib/utils/helpers.d.ts.map +0 -1
- package/dist/lib/utils/helpers.js +0 -39
- package/dist/lib/utils/helpers.js.map +0 -1
- package/dist/lib/utils/logger.d.ts +0 -4
- package/dist/lib/utils/logger.d.ts.map +0 -1
- package/dist/lib/utils/logger.js +0 -28
- package/dist/lib/utils/logger.js.map +0 -1
- package/dist/lib/workspace/index.d.ts +0 -13
- package/dist/lib/workspace/index.d.ts.map +0 -1
- package/dist/lib/workspace/index.js +0 -116
- package/dist/lib/workspace/index.js.map +0 -1
- package/dist/lib/worktree/index.d.ts +0 -7
- package/dist/lib/worktree/index.d.ts.map +0 -1
- package/dist/lib/worktree/index.js +0 -362
- package/dist/lib/worktree/index.js.map +0 -1
- package/dist/lib/worktree/migrate.d.ts +0 -2
- package/dist/lib/worktree/migrate.d.ts.map +0 -1
- package/dist/lib/worktree/migrate.js +0 -212
- package/dist/lib/worktree/migrate.js.map +0 -1
- package/dist/lib/worktree/repair.d.ts +0 -3
- package/dist/lib/worktree/repair.d.ts.map +0 -1
- package/dist/lib/worktree/repair.js +0 -140
- package/dist/lib/worktree/repair.js.map +0 -1
- package/dist/types/index.d.ts +0 -57
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -3
- package/dist/types/index.js.map +0 -1
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import { pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
3
|
+
import { PRIORITIES } from '../../lib/pmo/types.js';
|
|
4
|
+
import { getPMOContext } from '../../lib/pmo/pmo-context.js';
|
|
5
|
+
import { styles, formatPriority, formatCategory, getColumnStyle, getColumnEmoji, divider, getPriorityStyle, } from '../../lib/styles.js';
|
|
6
|
+
// Priority order for grouping: P0, P1, P2, P3, None
|
|
7
|
+
const PRIORITY_ORDER = ['P0', 'P1', 'P2', 'P3', 'None'];
|
|
8
|
+
export default class TicketList extends Command {
|
|
9
|
+
static description = 'List tickets from the PMO board';
|
|
10
|
+
static examples = [
|
|
11
|
+
'<%= config.bin %> <%= command.id %>',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> --column Backlog',
|
|
13
|
+
'<%= config.bin %> <%= command.id %> --priority URGENT',
|
|
14
|
+
'<%= config.bin %> <%= command.id %> --category bug',
|
|
15
|
+
'<%= config.bin %> <%= command.id %> --search "login"',
|
|
16
|
+
'<%= config.bin %> <%= command.id %> --project mobile-app',
|
|
17
|
+
'<%= config.bin %> <%= command.id %> --all',
|
|
18
|
+
'<%= config.bin %> <%= command.id %> --all --group-by priority',
|
|
19
|
+
'<%= config.bin %> <%= command.id %> -g priority',
|
|
20
|
+
];
|
|
21
|
+
static flags = {
|
|
22
|
+
...pmoBaseFlags,
|
|
23
|
+
column: Flags.string({
|
|
24
|
+
char: 'c',
|
|
25
|
+
description: 'Filter by column',
|
|
26
|
+
}),
|
|
27
|
+
priority: Flags.string({
|
|
28
|
+
char: 'p',
|
|
29
|
+
description: 'Filter by priority',
|
|
30
|
+
options: [...PRIORITIES],
|
|
31
|
+
}),
|
|
32
|
+
category: Flags.string({
|
|
33
|
+
description: 'Filter by category',
|
|
34
|
+
}),
|
|
35
|
+
search: Flags.string({
|
|
36
|
+
char: 's',
|
|
37
|
+
description: 'Search in title and description',
|
|
38
|
+
}),
|
|
39
|
+
format: Flags.string({
|
|
40
|
+
char: 'f',
|
|
41
|
+
description: 'Output format',
|
|
42
|
+
options: ['table', 'compact', 'json'],
|
|
43
|
+
default: 'table',
|
|
44
|
+
}),
|
|
45
|
+
all: Flags.boolean({
|
|
46
|
+
char: 'a',
|
|
47
|
+
description: 'Show tickets across all projects',
|
|
48
|
+
default: false,
|
|
49
|
+
}),
|
|
50
|
+
'group-by': Flags.string({
|
|
51
|
+
char: 'g',
|
|
52
|
+
description: 'Group tickets by field',
|
|
53
|
+
options: ['status', 'priority'],
|
|
54
|
+
default: 'status',
|
|
55
|
+
}),
|
|
56
|
+
};
|
|
57
|
+
async run() {
|
|
58
|
+
const { flags } = await this.parse(TicketList);
|
|
59
|
+
// When --all is set, we don't need to select a specific project
|
|
60
|
+
// Otherwise, use the normal project selection flow
|
|
61
|
+
let pmoContext;
|
|
62
|
+
// Get PMO context - no project selection needed
|
|
63
|
+
pmoContext = await getPMOContext({
|
|
64
|
+
logger: (msg) => this.log(styles.muted(msg)),
|
|
65
|
+
});
|
|
66
|
+
try {
|
|
67
|
+
// Build filter
|
|
68
|
+
const filter = {};
|
|
69
|
+
if (flags.all) {
|
|
70
|
+
filter.allProjects = true;
|
|
71
|
+
}
|
|
72
|
+
else if (flags.project) {
|
|
73
|
+
filter.projectId = flags.project;
|
|
74
|
+
}
|
|
75
|
+
if (flags.column) {
|
|
76
|
+
filter.column = flags.column;
|
|
77
|
+
}
|
|
78
|
+
if (flags.priority) {
|
|
79
|
+
filter.priority = flags.priority;
|
|
80
|
+
}
|
|
81
|
+
if (flags.category) {
|
|
82
|
+
filter.category = flags.category;
|
|
83
|
+
}
|
|
84
|
+
if (flags.search) {
|
|
85
|
+
filter.search = flags.search;
|
|
86
|
+
}
|
|
87
|
+
// Determine projectId for the query
|
|
88
|
+
const projectId = flags.all ? undefined : (filter.projectId || undefined);
|
|
89
|
+
const tickets = await pmoContext.storage.listTickets(projectId, filter);
|
|
90
|
+
if (tickets.length === 0) {
|
|
91
|
+
this.log(styles.warning('No tickets found.'));
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const groupBy = flags['group-by'];
|
|
95
|
+
// Output based on format
|
|
96
|
+
if (flags.all) {
|
|
97
|
+
// Cross-project view
|
|
98
|
+
switch (flags.format) {
|
|
99
|
+
case 'json':
|
|
100
|
+
this.log(JSON.stringify(tickets, null, 2));
|
|
101
|
+
break;
|
|
102
|
+
case 'compact':
|
|
103
|
+
this.outputCrossProjectCompact(tickets, groupBy);
|
|
104
|
+
break;
|
|
105
|
+
default:
|
|
106
|
+
this.outputCrossProjectTable(tickets, groupBy);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// Single project view - get projectId from first ticket or use flag
|
|
111
|
+
const actualProjectId = projectId || tickets[0]?.projectId;
|
|
112
|
+
if (!actualProjectId) {
|
|
113
|
+
this.log(styles.warning('No project found.'));
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const board = await pmoContext.storage.getBoard(actualProjectId);
|
|
117
|
+
const columns = board.columns.map(col => col.name);
|
|
118
|
+
switch (flags.format) {
|
|
119
|
+
case 'json':
|
|
120
|
+
this.log(JSON.stringify(tickets, null, 2));
|
|
121
|
+
break;
|
|
122
|
+
case 'compact':
|
|
123
|
+
this.outputCompact(tickets, columns, groupBy);
|
|
124
|
+
break;
|
|
125
|
+
default:
|
|
126
|
+
this.outputTable(tickets, columns, groupBy);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
await pmoContext.storage.close();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
outputCrossProjectTable(tickets, groupBy) {
|
|
135
|
+
if (groupBy === 'priority') {
|
|
136
|
+
this.outputCrossProjectTableByPriority(tickets);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
// Group tickets by project, then by column
|
|
140
|
+
const byProject = {};
|
|
141
|
+
for (const ticket of tickets) {
|
|
142
|
+
const projectName = ticket.projectName || ticket.projectId || 'Unknown';
|
|
143
|
+
if (!byProject[projectName]) {
|
|
144
|
+
byProject[projectName] = [];
|
|
145
|
+
}
|
|
146
|
+
byProject[projectName].push(ticket);
|
|
147
|
+
}
|
|
148
|
+
const projectNames = Object.keys(byProject).sort();
|
|
149
|
+
for (const projectName of projectNames) {
|
|
150
|
+
const projectTickets = byProject[projectName];
|
|
151
|
+
// Project header
|
|
152
|
+
this.log(styles.emphasis(`\n${projectName}`));
|
|
153
|
+
this.log(divider(60));
|
|
154
|
+
// Group by column within project
|
|
155
|
+
const byColumn = {};
|
|
156
|
+
for (const ticket of projectTickets) {
|
|
157
|
+
const col = ticket.statusName || 'Unknown';
|
|
158
|
+
if (!byColumn[col]) {
|
|
159
|
+
byColumn[col] = [];
|
|
160
|
+
}
|
|
161
|
+
byColumn[col].push(ticket);
|
|
162
|
+
}
|
|
163
|
+
const columns = Object.keys(byColumn).sort();
|
|
164
|
+
for (const col of columns) {
|
|
165
|
+
const colTickets = byColumn[col];
|
|
166
|
+
const headerColor = getColumnStyle(col);
|
|
167
|
+
this.log(headerColor(` ${getColumnEmoji(col)} ${col} (${colTickets.length})`));
|
|
168
|
+
colTickets.sort((a, b) => (a.position || 0) - (b.position || 0));
|
|
169
|
+
for (const ticket of colTickets) {
|
|
170
|
+
const priorityBadge = formatPriority(ticket.priority);
|
|
171
|
+
const categoryBadge = formatCategory(ticket.category);
|
|
172
|
+
this.log(` ${styles.code(ticket.id)} ${ticket.title} ${priorityBadge} ${categoryBadge}`);
|
|
173
|
+
if (ticket.description) {
|
|
174
|
+
const shortDesc = ticket.description.split('\n')[0].substring(0, 55);
|
|
175
|
+
this.log(styles.muted(` ${shortDesc}${ticket.description.length > 55 ? '...' : ''}`));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Summary
|
|
181
|
+
this.log('\n' + divider(60));
|
|
182
|
+
this.log(styles.emphasis(`Total: ${tickets.length} ticket${tickets.length === 1 ? '' : 's'} across ${projectNames.length} project${projectNames.length === 1 ? '' : 's'}`));
|
|
183
|
+
}
|
|
184
|
+
outputCrossProjectTableByPriority(tickets) {
|
|
185
|
+
// Group tickets by priority
|
|
186
|
+
const byPriority = {};
|
|
187
|
+
for (const priority of PRIORITY_ORDER) {
|
|
188
|
+
byPriority[priority] = [];
|
|
189
|
+
}
|
|
190
|
+
for (const ticket of tickets) {
|
|
191
|
+
const priority = ticket.priority || 'None';
|
|
192
|
+
if (!byPriority[priority]) {
|
|
193
|
+
byPriority[priority] = [];
|
|
194
|
+
}
|
|
195
|
+
byPriority[priority].push(ticket);
|
|
196
|
+
}
|
|
197
|
+
for (const priority of PRIORITY_ORDER) {
|
|
198
|
+
const priorityTickets = byPriority[priority];
|
|
199
|
+
// Priority header
|
|
200
|
+
const headerColor = getPriorityStyle(priority);
|
|
201
|
+
this.log(headerColor(`\n${priority} (${priorityTickets.length})`));
|
|
202
|
+
this.log(divider(60));
|
|
203
|
+
if (priorityTickets.length === 0) {
|
|
204
|
+
this.log(styles.muted(' (empty)'));
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
// Sort by position within priority
|
|
208
|
+
priorityTickets.sort((a, b) => (a.position || 0) - (b.position || 0));
|
|
209
|
+
for (const ticket of priorityTickets) {
|
|
210
|
+
const statusBadge = ticket.statusName ? styles.muted(`[${ticket.statusName}]`) : '';
|
|
211
|
+
const categoryBadge = formatCategory(ticket.category);
|
|
212
|
+
const projectBadge = ticket.projectName ? styles.info(`[${ticket.projectName}]`) : '';
|
|
213
|
+
this.log(` ${styles.code(ticket.id)} ${ticket.title} ${statusBadge} ${categoryBadge} ${projectBadge}`);
|
|
214
|
+
if (ticket.description) {
|
|
215
|
+
const shortDesc = ticket.description.split('\n')[0].substring(0, 55);
|
|
216
|
+
this.log(styles.muted(` ${shortDesc}${ticket.description.length > 55 ? '...' : ''}`));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Summary
|
|
221
|
+
this.log('\n' + divider(60));
|
|
222
|
+
this.log(styles.emphasis(`Total: ${tickets.length} ticket${tickets.length === 1 ? '' : 's'}`));
|
|
223
|
+
}
|
|
224
|
+
outputCrossProjectCompact(tickets, groupBy) {
|
|
225
|
+
if (groupBy === 'priority') {
|
|
226
|
+
this.outputCrossProjectCompactByPriority(tickets);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
// Group tickets by project
|
|
230
|
+
const byProject = {};
|
|
231
|
+
for (const ticket of tickets) {
|
|
232
|
+
const projectName = ticket.projectName || ticket.projectId || 'Unknown';
|
|
233
|
+
if (!byProject[projectName]) {
|
|
234
|
+
byProject[projectName] = [];
|
|
235
|
+
}
|
|
236
|
+
byProject[projectName].push(ticket);
|
|
237
|
+
}
|
|
238
|
+
const projectNames = Object.keys(byProject).sort();
|
|
239
|
+
for (const projectName of projectNames) {
|
|
240
|
+
const projectTickets = byProject[projectName];
|
|
241
|
+
this.log(styles.emphasis(`${projectName} (${projectTickets.length}):`));
|
|
242
|
+
projectTickets.sort((a, b) => (a.position || 0) - (b.position || 0));
|
|
243
|
+
for (const ticket of projectTickets) {
|
|
244
|
+
const priority = formatPriority(ticket.priority);
|
|
245
|
+
const status = ticket.statusName ? styles.muted(`[${ticket.statusName}]`) : '';
|
|
246
|
+
this.log(` ${styles.code(ticket.id)}: ${ticket.title} ${priority} ${status}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
outputCrossProjectCompactByPriority(tickets) {
|
|
251
|
+
// Group tickets by priority
|
|
252
|
+
const byPriority = {};
|
|
253
|
+
for (const priority of PRIORITY_ORDER) {
|
|
254
|
+
byPriority[priority] = [];
|
|
255
|
+
}
|
|
256
|
+
for (const ticket of tickets) {
|
|
257
|
+
const priority = ticket.priority || 'None';
|
|
258
|
+
if (!byPriority[priority]) {
|
|
259
|
+
byPriority[priority] = [];
|
|
260
|
+
}
|
|
261
|
+
byPriority[priority].push(ticket);
|
|
262
|
+
}
|
|
263
|
+
for (const priority of PRIORITY_ORDER) {
|
|
264
|
+
const priorityTickets = byPriority[priority];
|
|
265
|
+
if (priorityTickets.length === 0)
|
|
266
|
+
continue;
|
|
267
|
+
const headerColor = getPriorityStyle(priority);
|
|
268
|
+
this.log(headerColor(`${priority} (${priorityTickets.length}):`));
|
|
269
|
+
priorityTickets.sort((a, b) => (a.position || 0) - (b.position || 0));
|
|
270
|
+
for (const ticket of priorityTickets) {
|
|
271
|
+
const status = ticket.statusName ? styles.muted(`[${ticket.statusName}]`) : '';
|
|
272
|
+
const project = ticket.projectName ? styles.info(`[${ticket.projectName}]`) : '';
|
|
273
|
+
this.log(` ${styles.code(ticket.id)}: ${ticket.title} ${status} ${project}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
outputTable(tickets, columns, groupBy) {
|
|
278
|
+
if (groupBy === 'priority') {
|
|
279
|
+
this.outputTableByPriority(tickets);
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
// Group tickets by column
|
|
283
|
+
const byColumn = {};
|
|
284
|
+
for (const col of columns) {
|
|
285
|
+
byColumn[col] = [];
|
|
286
|
+
}
|
|
287
|
+
for (const ticket of tickets) {
|
|
288
|
+
const col = ticket.statusName || 'Unknown';
|
|
289
|
+
if (!byColumn[col]) {
|
|
290
|
+
byColumn[col] = [];
|
|
291
|
+
}
|
|
292
|
+
byColumn[col].push(ticket);
|
|
293
|
+
}
|
|
294
|
+
// Display ALL columns
|
|
295
|
+
for (const col of columns) {
|
|
296
|
+
const colTickets = byColumn[col];
|
|
297
|
+
// Column header with color
|
|
298
|
+
const headerColor = getColumnStyle(col);
|
|
299
|
+
this.log(headerColor(`\n${getColumnEmoji(col)} ${col} (${colTickets.length})`));
|
|
300
|
+
this.log(divider(50));
|
|
301
|
+
if (colTickets.length === 0) {
|
|
302
|
+
this.log(styles.muted(' (empty)'));
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
// Sort by position
|
|
306
|
+
colTickets.sort((a, b) => (a.position || 0) - (b.position || 0));
|
|
307
|
+
for (const ticket of colTickets) {
|
|
308
|
+
const priorityBadge = formatPriority(ticket.priority);
|
|
309
|
+
const categoryBadge = formatCategory(ticket.category);
|
|
310
|
+
this.log(` ${styles.code(ticket.id)} ${ticket.title} ${priorityBadge} ${categoryBadge}`);
|
|
311
|
+
if (ticket.description) {
|
|
312
|
+
const shortDesc = ticket.description.split('\n')[0].substring(0, 60);
|
|
313
|
+
this.log(styles.muted(` ${shortDesc}${ticket.description.length > 60 ? '...' : ''}`));
|
|
314
|
+
}
|
|
315
|
+
if (ticket.subtasks.length > 0) {
|
|
316
|
+
const done = ticket.subtasks.filter(s => s.done).length;
|
|
317
|
+
this.log(styles.muted(` Subtasks: ${done}/${ticket.subtasks.length}`));
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// Summary
|
|
322
|
+
this.log('\n' + divider(50));
|
|
323
|
+
this.log(styles.emphasis(`Total: ${tickets.length} ticket${tickets.length === 1 ? '' : 's'}`));
|
|
324
|
+
}
|
|
325
|
+
outputTableByPriority(tickets) {
|
|
326
|
+
// Group tickets by priority
|
|
327
|
+
const byPriority = {};
|
|
328
|
+
for (const priority of PRIORITY_ORDER) {
|
|
329
|
+
byPriority[priority] = [];
|
|
330
|
+
}
|
|
331
|
+
for (const ticket of tickets) {
|
|
332
|
+
const priority = ticket.priority || 'None';
|
|
333
|
+
if (!byPriority[priority]) {
|
|
334
|
+
byPriority[priority] = [];
|
|
335
|
+
}
|
|
336
|
+
byPriority[priority].push(ticket);
|
|
337
|
+
}
|
|
338
|
+
// Display ALL priority groups
|
|
339
|
+
for (const priority of PRIORITY_ORDER) {
|
|
340
|
+
const priorityTickets = byPriority[priority];
|
|
341
|
+
// Priority header with color
|
|
342
|
+
const headerColor = getPriorityStyle(priority);
|
|
343
|
+
this.log(headerColor(`\n${priority} (${priorityTickets.length})`));
|
|
344
|
+
this.log(divider(50));
|
|
345
|
+
if (priorityTickets.length === 0) {
|
|
346
|
+
this.log(styles.muted(' (empty)'));
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
// Sort by position
|
|
350
|
+
priorityTickets.sort((a, b) => (a.position || 0) - (b.position || 0));
|
|
351
|
+
for (const ticket of priorityTickets) {
|
|
352
|
+
const statusBadge = ticket.statusName ? styles.muted(`[${ticket.statusName}]`) : '';
|
|
353
|
+
const categoryBadge = formatCategory(ticket.category);
|
|
354
|
+
this.log(` ${styles.code(ticket.id)} ${ticket.title} ${statusBadge} ${categoryBadge}`);
|
|
355
|
+
if (ticket.description) {
|
|
356
|
+
const shortDesc = ticket.description.split('\n')[0].substring(0, 60);
|
|
357
|
+
this.log(styles.muted(` ${shortDesc}${ticket.description.length > 60 ? '...' : ''}`));
|
|
358
|
+
}
|
|
359
|
+
if (ticket.subtasks.length > 0) {
|
|
360
|
+
const done = ticket.subtasks.filter(s => s.done).length;
|
|
361
|
+
this.log(styles.muted(` Subtasks: ${done}/${ticket.subtasks.length}`));
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
// Summary
|
|
366
|
+
this.log('\n' + divider(50));
|
|
367
|
+
this.log(styles.emphasis(`Total: ${tickets.length} ticket${tickets.length === 1 ? '' : 's'}`));
|
|
368
|
+
}
|
|
369
|
+
outputCompact(tickets, columns, groupBy) {
|
|
370
|
+
if (groupBy === 'priority') {
|
|
371
|
+
this.outputCompactByPriority(tickets);
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
// Group by column
|
|
375
|
+
const byColumn = {};
|
|
376
|
+
for (const col of columns) {
|
|
377
|
+
byColumn[col] = [];
|
|
378
|
+
}
|
|
379
|
+
for (const ticket of tickets) {
|
|
380
|
+
const col = ticket.statusName || 'Unknown';
|
|
381
|
+
if (!byColumn[col]) {
|
|
382
|
+
byColumn[col] = [];
|
|
383
|
+
}
|
|
384
|
+
byColumn[col].push(ticket);
|
|
385
|
+
}
|
|
386
|
+
for (const col of columns) {
|
|
387
|
+
const colTickets = byColumn[col];
|
|
388
|
+
// Show all columns
|
|
389
|
+
const headerColor = getColumnStyle(col);
|
|
390
|
+
this.log(headerColor(`${getColumnEmoji(col)} ${col} (${colTickets.length}):`));
|
|
391
|
+
if (colTickets.length === 0) {
|
|
392
|
+
this.log(styles.muted(' (empty)'));
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
colTickets.sort((a, b) => (a.position || 0) - (b.position || 0));
|
|
396
|
+
for (const ticket of colTickets) {
|
|
397
|
+
const priority = formatPriority(ticket.priority);
|
|
398
|
+
this.log(` ${styles.code(ticket.id)}: ${ticket.title} ${priority}`);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
outputCompactByPriority(tickets) {
|
|
403
|
+
// Group by priority
|
|
404
|
+
const byPriority = {};
|
|
405
|
+
for (const priority of PRIORITY_ORDER) {
|
|
406
|
+
byPriority[priority] = [];
|
|
407
|
+
}
|
|
408
|
+
for (const ticket of tickets) {
|
|
409
|
+
const priority = ticket.priority || 'None';
|
|
410
|
+
if (!byPriority[priority]) {
|
|
411
|
+
byPriority[priority] = [];
|
|
412
|
+
}
|
|
413
|
+
byPriority[priority].push(ticket);
|
|
414
|
+
}
|
|
415
|
+
for (const priority of PRIORITY_ORDER) {
|
|
416
|
+
const priorityTickets = byPriority[priority];
|
|
417
|
+
// Show all priority groups
|
|
418
|
+
const headerColor = getPriorityStyle(priority);
|
|
419
|
+
this.log(headerColor(`${priority} (${priorityTickets.length}):`));
|
|
420
|
+
if (priorityTickets.length === 0) {
|
|
421
|
+
this.log(styles.muted(' (empty)'));
|
|
422
|
+
continue;
|
|
423
|
+
}
|
|
424
|
+
priorityTickets.sort((a, b) => (a.position || 0) - (b.position || 0));
|
|
425
|
+
for (const ticket of priorityTickets) {
|
|
426
|
+
const status = ticket.statusName ? styles.muted(`[${ticket.statusName}]`) : '';
|
|
427
|
+
this.log(` ${styles.code(ticket.id)}: ${ticket.title} ${status}`);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class TicketMove 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
|
+
column: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
8
|
+
};
|
|
9
|
+
static flags: {
|
|
10
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
position: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
+
};
|
|
16
|
+
execute(): Promise<void>;
|
|
17
|
+
private executeBulk;
|
|
18
|
+
}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { autoExportToBoard, PMOCommand, pmoBaseFlags, } from '../../lib/pmo/index.js';
|
|
4
|
+
import { styles } from '../../lib/styles.js';
|
|
5
|
+
import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
6
|
+
export default class TicketMove extends PMOCommand {
|
|
7
|
+
static description = 'Move ticket(s) to a different column';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %> my-ticket "In Progress"',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> implement-auth Done',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> fix-bug "In Review" --position 0',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> --bulk',
|
|
13
|
+
];
|
|
14
|
+
static args = {
|
|
15
|
+
ticketId: Args.string({
|
|
16
|
+
description: 'Ticket ID - prompts with dropdown if not provided',
|
|
17
|
+
required: false,
|
|
18
|
+
}),
|
|
19
|
+
column: Args.string({
|
|
20
|
+
description: 'Target column - prompts with dropdown if not provided',
|
|
21
|
+
required: false,
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
static flags = {
|
|
25
|
+
...pmoBaseFlags,
|
|
26
|
+
json: Flags.boolean({
|
|
27
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
28
|
+
default: false,
|
|
29
|
+
}),
|
|
30
|
+
position: Flags.integer({
|
|
31
|
+
description: 'Position within the column (0 = top)',
|
|
32
|
+
}),
|
|
33
|
+
bulk: Flags.boolean({
|
|
34
|
+
char: 'b',
|
|
35
|
+
description: 'Enable bulk mode to move multiple tickets',
|
|
36
|
+
default: false,
|
|
37
|
+
}),
|
|
38
|
+
force: Flags.boolean({
|
|
39
|
+
char: 'f',
|
|
40
|
+
description: 'Skip confirmation prompt (bulk mode only)',
|
|
41
|
+
default: false,
|
|
42
|
+
}),
|
|
43
|
+
};
|
|
44
|
+
async execute() {
|
|
45
|
+
const { args, flags } = await this.parse(TicketMove);
|
|
46
|
+
// Check if JSON output mode is active
|
|
47
|
+
const jsonMode = shouldOutputJson(flags);
|
|
48
|
+
// Helper to handle errors in JSON mode
|
|
49
|
+
const handleError = (code, message) => {
|
|
50
|
+
if (jsonMode) {
|
|
51
|
+
outputErrorAsJson(code, message, createMetadata('ticket move', flags));
|
|
52
|
+
this.exit(1);
|
|
53
|
+
}
|
|
54
|
+
this.error(message);
|
|
55
|
+
};
|
|
56
|
+
// This command requires project context - get projectId (with JSON mode support)
|
|
57
|
+
const projectId = await this.requireProject({
|
|
58
|
+
jsonMode: {
|
|
59
|
+
flags,
|
|
60
|
+
commandName: 'ticket move',
|
|
61
|
+
baseCommand: 'prlt ticket move',
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
// Get all tickets
|
|
65
|
+
const allTickets = await this.storage.listTickets(projectId);
|
|
66
|
+
if (allTickets.length === 0) {
|
|
67
|
+
return handleError('NO_TICKETS', 'No tickets found. Create a ticket first with "prlt ticket create".');
|
|
68
|
+
}
|
|
69
|
+
// Bulk mode
|
|
70
|
+
if (flags.bulk) {
|
|
71
|
+
await this.executeBulk(allTickets, flags.force, projectId);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// Single ticket mode
|
|
75
|
+
let ticketId = args.ticketId;
|
|
76
|
+
if (!ticketId) {
|
|
77
|
+
// Use helper for ticket selection (handles JSON mode automatically)
|
|
78
|
+
const selected = await this.selectFromList({
|
|
79
|
+
message: 'Select ticket to move:',
|
|
80
|
+
items: allTickets,
|
|
81
|
+
getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
|
|
82
|
+
getValue: (t) => t.id,
|
|
83
|
+
getCommand: (t) => `prlt ticket move ${t.id} --json`,
|
|
84
|
+
jsonMode: jsonMode ? { flags, commandName: 'ticket move' } : null,
|
|
85
|
+
});
|
|
86
|
+
if (!selected) {
|
|
87
|
+
return; // Cancelled or JSON mode (already exited)
|
|
88
|
+
}
|
|
89
|
+
ticketId = selected;
|
|
90
|
+
}
|
|
91
|
+
// Get ticket
|
|
92
|
+
const ticket = await this.storage.getTicket(ticketId);
|
|
93
|
+
if (!ticket) {
|
|
94
|
+
this.error(`Ticket "${ticketId}" not found.`);
|
|
95
|
+
}
|
|
96
|
+
// Get target column - prompt if not provided
|
|
97
|
+
let targetColumn = args.column;
|
|
98
|
+
if (!targetColumn) {
|
|
99
|
+
// Get columns from the database (not config.json) to ensure accuracy
|
|
100
|
+
const project = await this.storage.getProjectBoard(projectId);
|
|
101
|
+
if (!project) {
|
|
102
|
+
this.error('Project not found.');
|
|
103
|
+
}
|
|
104
|
+
// Use helper for column selection (handles JSON mode automatically)
|
|
105
|
+
const selected = await this.selectFromList({
|
|
106
|
+
message: 'Move to column:',
|
|
107
|
+
items: project.columns,
|
|
108
|
+
getName: (col) => col.name === ticket.statusName ? `${col.name} (current)` : col.name,
|
|
109
|
+
getValue: (col) => col.name,
|
|
110
|
+
getCommand: (col) => `prlt ticket move ${ticketId} "${col.name}" --json`,
|
|
111
|
+
jsonMode: jsonMode ? { flags, commandName: 'ticket move' } : null,
|
|
112
|
+
});
|
|
113
|
+
if (!selected) {
|
|
114
|
+
return; // Cancelled or JSON mode (already exited)
|
|
115
|
+
}
|
|
116
|
+
targetColumn = selected;
|
|
117
|
+
}
|
|
118
|
+
// Column validation happens in storage.moveTicket()
|
|
119
|
+
// Check if actually moving
|
|
120
|
+
if (targetColumn === ticket.statusName && flags.position === undefined) {
|
|
121
|
+
this.log(styles.warning(`Ticket "${ticketId}" is already in "${targetColumn}".`));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
// Move ticket (targetColumn is guaranteed to be string after validation above)
|
|
125
|
+
const moved = await this.storage.moveTicket(projectId, ticketId, targetColumn, flags.position);
|
|
126
|
+
// Auto-export to board.md after write
|
|
127
|
+
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
128
|
+
this.log(styles.success(`\nā
Moved ticket ${styles.emphasis(moved.id)}`));
|
|
129
|
+
if (targetColumn !== ticket.statusName) {
|
|
130
|
+
this.log(styles.muted(` From: ${ticket.statusName}`));
|
|
131
|
+
this.log(styles.muted(` To: ${moved.statusName}`));
|
|
132
|
+
}
|
|
133
|
+
if (flags.position !== undefined) {
|
|
134
|
+
this.log(styles.muted(` Position: ${flags.position}`));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async executeBulk(allTickets, force, projectId) {
|
|
138
|
+
this.log(styles.emphasis('š¦ Move Multiple Tickets\n'));
|
|
139
|
+
// Get columns
|
|
140
|
+
const board = await this.storage.getBoard(projectId);
|
|
141
|
+
const columns = board.columns.map(col => col.name);
|
|
142
|
+
// Select tickets to move
|
|
143
|
+
const { selectedTickets } = await inquirer.prompt([{
|
|
144
|
+
type: 'checkbox',
|
|
145
|
+
name: 'selectedTickets',
|
|
146
|
+
message: 'Select tickets to move:',
|
|
147
|
+
choices: allTickets.map(t => ({
|
|
148
|
+
name: `${t.id} - ${t.title} (${t.statusName})`,
|
|
149
|
+
value: t.id,
|
|
150
|
+
})),
|
|
151
|
+
}]);
|
|
152
|
+
if (selectedTickets.length === 0) {
|
|
153
|
+
this.log(styles.muted('No tickets selected.'));
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
// Select target column
|
|
157
|
+
const { targetColumn } = await inquirer.prompt([{
|
|
158
|
+
type: 'list',
|
|
159
|
+
name: 'targetColumn',
|
|
160
|
+
message: 'Move selected tickets to:',
|
|
161
|
+
choices: columns,
|
|
162
|
+
}]);
|
|
163
|
+
// Confirmation
|
|
164
|
+
if (!force) {
|
|
165
|
+
this.log(styles.warning('\nThis will move:'));
|
|
166
|
+
for (const ticketId of selectedTickets) {
|
|
167
|
+
const ticket = allTickets.find(t => t.id === ticketId);
|
|
168
|
+
this.log(styles.primary(` ⢠${ticketId}: ${ticket?.title}`));
|
|
169
|
+
}
|
|
170
|
+
this.log(styles.primary(` ā to column: ${targetColumn}\n`));
|
|
171
|
+
const { confirm } = await inquirer.prompt([{
|
|
172
|
+
type: 'list',
|
|
173
|
+
name: 'confirm',
|
|
174
|
+
message: 'Continue?',
|
|
175
|
+
choices: [
|
|
176
|
+
{ name: 'No, cancel', value: false },
|
|
177
|
+
{ name: 'Yes, move tickets', value: true }
|
|
178
|
+
],
|
|
179
|
+
default: 0
|
|
180
|
+
}]);
|
|
181
|
+
if (!confirm) {
|
|
182
|
+
this.log(styles.muted('Move cancelled.'));
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
this.log('');
|
|
187
|
+
// Move each ticket
|
|
188
|
+
let successCount = 0;
|
|
189
|
+
let failCount = 0;
|
|
190
|
+
for (const ticketId of selectedTickets) {
|
|
191
|
+
try {
|
|
192
|
+
await this.storage.moveTicket(projectId, ticketId, targetColumn);
|
|
193
|
+
this.log(styles.success(`Moved ${ticketId} to ${targetColumn}`));
|
|
194
|
+
successCount++;
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
this.log(styles.error(`Failed to move ${ticketId}: ${error instanceof Error ? error.message : String(error)}`));
|
|
198
|
+
failCount++;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// Auto-export to kanban.md
|
|
202
|
+
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
203
|
+
// Summary
|
|
204
|
+
this.log('');
|
|
205
|
+
if (successCount > 0) {
|
|
206
|
+
this.log(styles.success(`Moved ${successCount} ticket(s)`));
|
|
207
|
+
}
|
|
208
|
+
if (failCount > 0) {
|
|
209
|
+
this.log(styles.error(`Failed to move ${failCount} ticket(s)`));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class TicketProject 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
|
+
targetProject: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
8
|
+
};
|
|
9
|
+
static flags: {
|
|
10
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
'keep-epic': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
target: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
+
};
|
|
16
|
+
execute(): Promise<void>;
|
|
17
|
+
private executeBulk;
|
|
18
|
+
}
|