@proletariat/cli 0.2.0 ā 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +512 -253
- package/bin/dev.cmd +3 -0
- package/bin/dev.js +5 -0
- package/bin/run.cmd +3 -0
- package/bin/run.js +23 -0
- package/dist/commands/action/create.d.ts +21 -0
- package/dist/commands/action/create.js +126 -0
- package/dist/commands/action/delete.d.ts +17 -0
- package/dist/commands/action/delete.js +78 -0
- package/dist/commands/action/index.d.ts +15 -0
- package/dist/commands/action/index.js +107 -0
- package/dist/commands/action/list.d.ts +14 -0
- package/dist/commands/action/list.js +89 -0
- package/dist/commands/action/run.d.ts +19 -0
- package/dist/commands/action/run.js +179 -0
- package/dist/commands/action/show.d.ts +15 -0
- package/dist/commands/action/show.js +47 -0
- package/dist/commands/action/update.d.ts +22 -0
- package/dist/commands/action/update.js +168 -0
- package/dist/commands/agent/index.d.ts +13 -0
- package/dist/commands/agent/index.js +131 -0
- package/dist/commands/agent/list.d.ts +7 -0
- package/dist/commands/agent/list.js +126 -0
- package/dist/commands/agent/login.d.ts +16 -0
- package/dist/commands/agent/login.js +146 -0
- package/dist/commands/agent/rebuild.d.ts +18 -0
- package/dist/commands/agent/rebuild.js +133 -0
- package/dist/commands/agent/restart.d.ts +17 -0
- package/dist/commands/agent/restart.js +116 -0
- package/dist/commands/agent/shell.d.ts +23 -0
- package/dist/commands/agent/shell.js +378 -0
- package/dist/commands/agent/staff/add.d.ts +15 -0
- package/dist/commands/agent/staff/add.js +281 -0
- package/dist/commands/agent/staff/index.d.ts +14 -0
- package/dist/commands/agent/staff/index.js +90 -0
- package/dist/commands/agent/staff/list.d.ts +7 -0
- package/dist/commands/agent/staff/list.js +90 -0
- package/dist/commands/agent/staff/remove.d.ts +16 -0
- package/dist/commands/agent/staff/remove.js +137 -0
- package/dist/commands/agent/status.d.ts +17 -0
- package/dist/commands/agent/status.js +139 -0
- package/dist/commands/agent/temp/cleanup.d.ts +23 -0
- package/dist/commands/agent/temp/cleanup.js +388 -0
- package/dist/commands/agent/temp/index.d.ts +14 -0
- package/dist/commands/agent/temp/index.js +82 -0
- package/dist/commands/agent/temp/list.d.ts +7 -0
- package/dist/commands/agent/temp/list.js +108 -0
- package/dist/commands/agent/themes/add-names.d.ts +10 -0
- package/dist/commands/agent/themes/add-names.js +67 -0
- package/dist/commands/agent/themes/create.d.ts +13 -0
- package/dist/commands/agent/themes/create.js +66 -0
- package/dist/commands/agent/themes/index.d.ts +9 -0
- package/dist/commands/agent/themes/index.js +194 -0
- package/dist/commands/agent/themes/list.d.ts +6 -0
- package/dist/commands/agent/themes/list.js +41 -0
- package/dist/commands/agent/themes/set.d.ts +12 -0
- package/dist/commands/agent/themes/set.js +77 -0
- package/dist/commands/agent/visit.d.ts +16 -0
- package/dist/commands/agent/visit.js +88 -0
- package/dist/commands/autocomplete/setup.d.ts +14 -0
- package/dist/commands/autocomplete/setup.js +154 -0
- package/dist/commands/board/index.d.ts +17 -0
- package/dist/commands/board/index.js +255 -0
- package/dist/commands/board/watch.d.ts +13 -0
- package/dist/commands/board/watch.js +52 -0
- package/dist/commands/branch/create.d.ts +50 -0
- package/dist/commands/branch/create.js +624 -0
- package/dist/commands/branch/index.d.ts +13 -0
- package/dist/commands/branch/index.js +50 -0
- package/dist/commands/branch/list.d.ts +17 -0
- package/dist/commands/branch/list.js +120 -0
- package/dist/commands/branch/validate.d.ts +15 -0
- package/dist/commands/branch/validate.js +73 -0
- package/dist/commands/commit.d.ts +71 -0
- package/dist/commands/commit.js +499 -0
- package/dist/commands/docker/clean.d.ts +13 -0
- package/dist/commands/docker/clean.js +224 -0
- package/dist/commands/docker/index.d.ts +19 -0
- package/dist/commands/docker/index.js +274 -0
- package/dist/commands/docker/list.d.ts +16 -0
- package/dist/commands/docker/list.js +200 -0
- package/dist/commands/docker/logs.d.ts +14 -0
- package/dist/commands/docker/logs.js +118 -0
- package/dist/commands/docker/prune.d.ts +14 -0
- package/dist/commands/docker/prune.js +211 -0
- package/dist/commands/docker/restart.d.ts +14 -0
- package/dist/commands/docker/restart.js +129 -0
- package/dist/commands/docker/shell.d.ts +14 -0
- package/dist/commands/docker/shell.js +103 -0
- package/dist/commands/docker/start.d.ts +12 -0
- package/dist/commands/docker/start.js +92 -0
- package/dist/commands/docker/status.d.ts +7 -0
- package/dist/commands/docker/status.js +40 -0
- package/dist/commands/docker/stop.d.ts +14 -0
- package/dist/commands/docker/stop.js +134 -0
- package/dist/commands/docker/sync.d.ts +15 -0
- package/dist/commands/docker/sync.js +112 -0
- package/dist/commands/epic/activate.d.ts +13 -0
- package/dist/commands/epic/activate.js +118 -0
- package/dist/commands/epic/archive.d.ts +14 -0
- package/dist/commands/epic/archive.js +132 -0
- package/dist/commands/epic/create.d.ts +15 -0
- package/dist/commands/epic/create.js +137 -0
- package/dist/commands/epic/index.d.ts +13 -0
- package/dist/commands/epic/index.js +88 -0
- package/dist/commands/epic/link/block.d.ts +14 -0
- package/dist/commands/epic/link/block.js +79 -0
- package/dist/commands/epic/link/duplicates.d.ts +14 -0
- package/dist/commands/epic/link/duplicates.js +66 -0
- package/dist/commands/epic/link/index.d.ts +19 -0
- package/dist/commands/epic/link/index.js +242 -0
- package/dist/commands/epic/link/relates.d.ts +14 -0
- package/dist/commands/epic/link/relates.js +66 -0
- package/dist/commands/epic/link/remove.d.ts +16 -0
- package/dist/commands/epic/link/remove.js +89 -0
- package/dist/commands/epic/list.d.ts +11 -0
- package/dist/commands/epic/list.js +87 -0
- package/dist/commands/epic/move.d.ts +15 -0
- package/dist/commands/epic/move.js +184 -0
- package/dist/commands/epic/progress.d.ts +16 -0
- package/dist/commands/epic/progress.js +166 -0
- package/dist/commands/epic/project.d.ts +15 -0
- package/dist/commands/epic/project.js +219 -0
- package/dist/commands/epic/reorder.d.ts +21 -0
- package/dist/commands/epic/reorder.js +160 -0
- package/dist/commands/epic/spec.d.ts +15 -0
- package/dist/commands/epic/spec.js +191 -0
- package/dist/commands/epic/ticket.d.ts +18 -0
- package/dist/commands/epic/ticket.js +291 -0
- package/dist/commands/epic/view.d.ts +13 -0
- package/dist/commands/epic/view.js +117 -0
- package/dist/commands/execution/index.d.ts +13 -0
- package/dist/commands/execution/index.js +70 -0
- package/dist/commands/execution/list.d.ts +15 -0
- package/dist/commands/execution/list.js +144 -0
- package/dist/commands/execution/logs.d.ts +18 -0
- package/dist/commands/execution/logs.js +161 -0
- package/dist/commands/execution/stop.d.ts +22 -0
- package/dist/commands/execution/stop.js +248 -0
- package/dist/commands/gh/index.d.ts +9 -0
- package/dist/commands/gh/index.js +53 -0
- package/dist/commands/gh/login.d.ts +6 -0
- package/dist/commands/gh/login.js +57 -0
- package/dist/commands/gh/status.d.ts +6 -0
- package/dist/commands/gh/status.js +48 -0
- package/dist/commands/gh/token.d.ts +6 -0
- package/dist/commands/gh/token.js +59 -0
- package/dist/commands/init.d.ts +26 -0
- package/dist/commands/init.js +200 -0
- package/dist/commands/phase/create.d.ts +22 -0
- package/dist/commands/phase/create.js +123 -0
- package/dist/commands/phase/delete.d.ts +17 -0
- package/dist/commands/phase/delete.js +73 -0
- package/dist/commands/phase/list.d.ts +12 -0
- package/dist/commands/phase/list.js +76 -0
- package/dist/commands/phase/move.d.ts +17 -0
- package/dist/commands/phase/move.js +115 -0
- package/dist/commands/phase/template/apply.d.ts +17 -0
- package/dist/commands/phase/template/apply.js +106 -0
- package/dist/commands/phase/template/create.d.ts +16 -0
- package/dist/commands/phase/template/create.js +58 -0
- package/dist/commands/phase/template/delete.d.ts +17 -0
- package/dist/commands/phase/template/delete.js +98 -0
- package/dist/commands/phase/template/index.d.ts +15 -0
- package/dist/commands/phase/template/index.js +128 -0
- package/dist/commands/phase/template/list.d.ts +16 -0
- package/dist/commands/phase/template/list.js +95 -0
- package/dist/commands/phase/template/update.d.ts +17 -0
- package/dist/commands/phase/template/update.js +89 -0
- package/dist/commands/phase/update.d.ts +23 -0
- package/dist/commands/phase/update.js +174 -0
- package/dist/commands/pmo/init.d.ts +25 -0
- package/dist/commands/pmo/init.js +341 -0
- package/dist/commands/pr/create.d.ts +17 -0
- package/dist/commands/pr/create.js +242 -0
- package/dist/commands/pr/index.d.ts +9 -0
- package/dist/commands/pr/index.js +68 -0
- package/dist/commands/pr/link.d.ts +14 -0
- package/dist/commands/pr/link.js +212 -0
- package/dist/commands/pr/status.d.ts +12 -0
- package/dist/commands/pr/status.js +161 -0
- package/dist/commands/project/archive.d.ts +17 -0
- package/dist/commands/project/archive.js +83 -0
- package/dist/commands/project/create.d.ts +22 -0
- package/dist/commands/project/create.js +143 -0
- package/dist/commands/project/delete.d.ts +17 -0
- package/dist/commands/project/delete.js +128 -0
- package/dist/commands/project/index.d.ts +13 -0
- package/dist/commands/project/index.js +64 -0
- package/dist/commands/project/list.d.ts +14 -0
- package/dist/commands/project/list.js +96 -0
- package/dist/commands/project/spec.d.ts +18 -0
- package/dist/commands/project/spec.js +216 -0
- package/dist/commands/project/unarchive.d.ts +15 -0
- package/dist/commands/project/unarchive.js +35 -0
- package/dist/commands/project/view.d.ts +16 -0
- package/dist/commands/project/view.js +94 -0
- package/dist/commands/repo/add.d.ts +21 -0
- package/dist/commands/repo/add.js +118 -0
- package/dist/commands/repo/index.d.ts +13 -0
- package/dist/commands/repo/index.js +114 -0
- package/dist/commands/repo/list.d.ts +13 -0
- package/dist/commands/repo/list.js +96 -0
- package/dist/commands/repo/remove.d.ts +23 -0
- package/dist/commands/repo/remove.js +217 -0
- package/dist/commands/repo/view.d.ts +15 -0
- package/dist/commands/repo/view.js +99 -0
- package/dist/commands/session/attach.d.ts +40 -0
- package/dist/commands/session/attach.js +307 -0
- package/dist/commands/session/index.d.ts +13 -0
- package/dist/commands/session/index.js +64 -0
- package/dist/commands/session/list.d.ts +21 -0
- package/dist/commands/session/list.js +181 -0
- package/dist/commands/spec/create.d.ts +19 -0
- package/dist/commands/spec/create.js +130 -0
- package/dist/commands/spec/index.d.ts +13 -0
- package/dist/commands/spec/index.js +68 -0
- package/dist/commands/spec/link/depends.d.ts +14 -0
- package/dist/commands/spec/link/depends.js +64 -0
- package/dist/commands/spec/link/duplicates.d.ts +14 -0
- package/dist/commands/spec/link/duplicates.js +63 -0
- package/dist/commands/spec/link/index.d.ts +19 -0
- package/dist/commands/spec/link/index.js +200 -0
- package/dist/commands/spec/link/relates.d.ts +14 -0
- package/dist/commands/spec/link/relates.js +63 -0
- package/dist/commands/spec/link/remove.d.ts +16 -0
- package/dist/commands/spec/link/remove.js +94 -0
- package/dist/commands/spec/list.d.ts +12 -0
- package/dist/commands/spec/list.js +75 -0
- package/dist/commands/spec/plan.d.ts +15 -0
- package/dist/commands/spec/plan.js +108 -0
- package/dist/commands/spec/ticket.d.ts +18 -0
- package/dist/commands/spec/ticket.js +160 -0
- package/dist/commands/spec/view.d.ts +15 -0
- package/dist/commands/spec/view.js +163 -0
- package/dist/commands/status/create.d.ts +21 -0
- package/dist/commands/status/create.js +140 -0
- package/dist/commands/status/delete.d.ts +13 -0
- package/dist/commands/status/delete.js +77 -0
- package/dist/commands/status/index.d.ts +14 -0
- package/dist/commands/status/index.js +91 -0
- package/dist/commands/status/list.d.ts +12 -0
- package/dist/commands/status/list.js +93 -0
- package/dist/commands/status/move.d.ts +14 -0
- package/dist/commands/status/move.js +120 -0
- package/dist/commands/status/update.d.ts +20 -0
- package/dist/commands/status/update.js +180 -0
- package/dist/commands/template/delete.d.ts +15 -0
- package/dist/commands/template/delete.js +142 -0
- package/dist/commands/template/index.d.ts +10 -0
- package/dist/commands/template/index.js +64 -0
- package/dist/commands/template/list.d.ts +18 -0
- package/dist/commands/template/list.js +157 -0
- package/dist/commands/template/phase/apply.d.ts +14 -0
- package/dist/commands/template/phase/apply.js +41 -0
- package/dist/commands/template/phase/create.d.ts +12 -0
- package/dist/commands/template/phase/create.js +29 -0
- package/dist/commands/template/phase/delete.d.ts +13 -0
- package/dist/commands/template/phase/delete.js +34 -0
- package/dist/commands/template/phase/index.d.ts +10 -0
- package/dist/commands/template/phase/index.js +62 -0
- package/dist/commands/template/phase/list.d.ts +11 -0
- package/dist/commands/template/phase/list.js +34 -0
- package/dist/commands/template/phase/update.d.ts +13 -0
- package/dist/commands/template/phase/update.js +35 -0
- package/dist/commands/template/ticket/apply.d.ts +17 -0
- package/dist/commands/template/ticket/apply.js +58 -0
- package/dist/commands/template/ticket/delete.d.ts +13 -0
- package/dist/commands/template/ticket/delete.js +34 -0
- package/dist/commands/template/ticket/index.d.ts +10 -0
- package/dist/commands/template/ticket/index.js +62 -0
- package/dist/commands/template/ticket/list.d.ts +11 -0
- package/dist/commands/template/ticket/list.js +34 -0
- package/dist/commands/template/ticket/save.d.ts +13 -0
- package/dist/commands/template/ticket/save.js +35 -0
- package/dist/commands/ticket/bulk.d.ts +13 -0
- package/dist/commands/ticket/bulk.js +145 -0
- package/dist/commands/ticket/complete.d.ts +16 -0
- package/dist/commands/ticket/complete.js +170 -0
- package/dist/commands/ticket/create.d.ts +22 -0
- package/dist/commands/ticket/create.js +390 -0
- package/dist/commands/ticket/delete.d.ts +16 -0
- package/dist/commands/ticket/delete.js +178 -0
- package/dist/commands/ticket/edit.d.ts +27 -0
- package/dist/commands/ticket/edit.js +322 -0
- package/dist/commands/ticket/epic.d.ts +20 -0
- package/dist/commands/ticket/epic.js +333 -0
- package/dist/commands/ticket/index.d.ts +13 -0
- package/dist/commands/ticket/index.js +103 -0
- package/dist/commands/ticket/link/block.d.ts +14 -0
- package/dist/commands/ticket/link/block.js +94 -0
- package/dist/commands/ticket/link/duplicates.d.ts +14 -0
- package/dist/commands/ticket/link/duplicates.js +93 -0
- package/dist/commands/ticket/link/index.d.ts +19 -0
- package/dist/commands/ticket/link/index.js +239 -0
- package/dist/commands/ticket/link/relates.d.ts +14 -0
- package/dist/commands/ticket/link/relates.js +93 -0
- package/dist/commands/ticket/link/remove.d.ts +16 -0
- package/dist/commands/ticket/link/remove.js +128 -0
- package/dist/commands/ticket/list.d.ts +24 -0
- package/dist/commands/ticket/list.js +431 -0
- package/dist/commands/ticket/move.d.ts +18 -0
- package/dist/commands/ticket/move.js +212 -0
- package/dist/commands/ticket/project.d.ts +18 -0
- package/dist/commands/ticket/project.js +254 -0
- package/dist/commands/ticket/reassign.d.ts +19 -0
- package/dist/commands/ticket/reassign.js +279 -0
- package/dist/commands/ticket/spec.d.ts +18 -0
- package/dist/commands/ticket/spec.js +259 -0
- package/dist/commands/ticket/status.d.ts +13 -0
- package/dist/commands/ticket/status.js +87 -0
- package/dist/commands/ticket/template/apply.d.ts +25 -0
- package/dist/commands/ticket/template/apply.js +249 -0
- package/dist/commands/ticket/template/create.d.ts +19 -0
- package/dist/commands/ticket/template/create.js +210 -0
- package/dist/commands/ticket/template/delete.d.ts +17 -0
- package/dist/commands/ticket/template/delete.js +92 -0
- package/dist/commands/ticket/template/index.d.ts +15 -0
- package/dist/commands/ticket/template/index.js +118 -0
- package/dist/commands/ticket/template/list.d.ts +16 -0
- package/dist/commands/ticket/template/list.js +110 -0
- package/dist/commands/ticket/template/save.d.ts +14 -0
- package/dist/commands/ticket/template/save.js +110 -0
- package/dist/commands/ticket/update.d.ts +18 -0
- package/dist/commands/ticket/update.js +325 -0
- package/dist/commands/ticket/view.d.ts +13 -0
- package/dist/commands/ticket/view.js +80 -0
- package/dist/commands/whoami.d.ts +9 -0
- package/dist/commands/whoami.js +103 -0
- package/dist/commands/work/complete.d.ts +13 -0
- package/dist/commands/work/complete.js +121 -0
- package/dist/commands/work/index.d.ts +13 -0
- package/dist/commands/work/index.js +70 -0
- package/dist/commands/work/ready.d.ts +24 -0
- package/dist/commands/work/ready.js +290 -0
- package/dist/commands/work/revise.d.ts +19 -0
- package/dist/commands/work/revise.js +377 -0
- package/dist/commands/work/spawn-all.d.ts +17 -0
- package/dist/commands/work/spawn-all.js +58 -0
- package/dist/commands/work/spawn.d.ts +29 -0
- package/dist/commands/work/spawn.js +728 -0
- package/dist/commands/work/start.d.ts +39 -0
- package/dist/commands/work/start.js +1393 -0
- package/dist/commands/work/watch.d.ts +31 -0
- package/dist/commands/work/watch.js +359 -0
- package/dist/commands/workflow/create.d.ts +18 -0
- package/dist/commands/workflow/create.js +119 -0
- package/dist/commands/workflow/delete.d.ts +17 -0
- package/dist/commands/workflow/delete.js +119 -0
- package/dist/commands/workflow/index.d.ts +15 -0
- package/dist/commands/workflow/index.js +75 -0
- package/dist/commands/workflow/list.d.ts +15 -0
- package/dist/commands/workflow/list.js +75 -0
- package/dist/commands/workflow/switch.d.ts +13 -0
- package/dist/commands/workflow/switch.js +117 -0
- package/dist/commands/workflow/view.d.ts +16 -0
- package/dist/commands/workflow/view.js +114 -0
- package/dist/commands/workspace/add.d.ts +12 -0
- package/dist/commands/workspace/add.js +74 -0
- package/dist/commands/workspace/list.d.ts +9 -0
- package/dist/commands/workspace/list.js +153 -0
- package/dist/commands/workspace/remove.d.ts +13 -0
- package/dist/commands/workspace/remove.js +98 -0
- package/dist/commands/workspace/use.d.ts +12 -0
- package/dist/commands/workspace/use.js +111 -0
- package/dist/hooks/init.d.ts +11 -0
- package/dist/hooks/init.js +57 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/lib/agents/commands.d.ts +189 -0
- package/dist/lib/agents/commands.js +893 -0
- package/dist/lib/agents/index.d.ts +54 -0
- package/dist/lib/agents/index.js +382 -0
- package/dist/lib/branch/index.d.ts +120 -0
- package/dist/lib/branch/index.js +334 -0
- package/dist/lib/colors.d.ts +94 -0
- package/dist/lib/colors.js +68 -0
- package/dist/lib/commands/docker-command.d.ts +21 -0
- package/dist/lib/commands/docker-command.js +27 -0
- package/dist/lib/database/index.d.ts +176 -0
- package/dist/lib/database/index.js +581 -0
- package/dist/lib/docker/resolve.d.ts +38 -0
- package/dist/lib/docker/resolve.js +175 -0
- package/dist/lib/execution/config.d.ts +150 -0
- package/dist/lib/execution/config.js +541 -0
- package/dist/lib/execution/devcontainer.d.ts +85 -0
- package/dist/lib/execution/devcontainer.js +594 -0
- package/dist/lib/execution/index.d.ts +10 -0
- package/dist/lib/execution/index.js +10 -0
- package/dist/lib/execution/runners.d.ts +53 -0
- package/dist/lib/execution/runners.js +1182 -0
- package/dist/lib/execution/spawner.d.ts +85 -0
- package/dist/lib/execution/spawner.js +548 -0
- package/dist/lib/execution/storage.d.ts +159 -0
- package/dist/lib/execution/storage.js +425 -0
- package/dist/lib/execution/types.d.ts +145 -0
- package/dist/lib/execution/types.js +157 -0
- package/dist/lib/init/index.d.ts +75 -0
- package/dist/lib/init/index.js +355 -0
- package/dist/lib/machine-config.d.ts +170 -0
- package/dist/lib/machine-config.js +386 -0
- package/dist/lib/pmo/base-command.d.ts +195 -0
- package/dist/lib/pmo/base-command.js +319 -0
- package/dist/lib/pmo/create-spec-folders.d.ts +43 -0
- package/dist/lib/pmo/create-spec-folders.js +64 -0
- package/dist/lib/pmo/epic-files.d.ts +56 -0
- package/dist/lib/pmo/epic-files.js +195 -0
- package/dist/lib/pmo/find-pmo.d.ts +14 -0
- package/dist/lib/pmo/find-pmo.js +172 -0
- package/dist/lib/pmo/index.d.ts +109 -0
- package/dist/lib/pmo/index.js +501 -0
- package/dist/lib/pmo/markdown.d.ts +31 -0
- package/dist/lib/pmo/markdown.js +245 -0
- package/dist/lib/pmo/pmo-context.d.ts +27 -0
- package/dist/lib/pmo/pmo-context.js +44 -0
- package/dist/lib/pmo/schema.d.ts +82 -0
- package/dist/lib/pmo/schema.js +531 -0
- package/dist/lib/pmo/spec-parser.d.ts +25 -0
- package/dist/lib/pmo/spec-parser.js +205 -0
- package/dist/lib/pmo/spec-types.d.ts +43 -0
- package/dist/lib/pmo/spec-types.js +7 -0
- package/dist/lib/pmo/storage/actions.d.ts +34 -0
- package/dist/lib/pmo/storage/actions.js +177 -0
- package/dist/lib/pmo/storage/base.d.ts +47 -0
- package/dist/lib/pmo/storage/base.js +858 -0
- package/dist/lib/pmo/storage/dependencies.d.ts +61 -0
- package/dist/lib/pmo/storage/dependencies.js +267 -0
- package/dist/lib/pmo/storage/epics.d.ts +46 -0
- package/dist/lib/pmo/storage/epics.js +243 -0
- package/dist/lib/pmo/storage/helpers.d.ts +33 -0
- package/dist/lib/pmo/storage/helpers.js +148 -0
- package/dist/lib/pmo/storage/index.d.ts +186 -0
- package/dist/lib/pmo/storage/index.js +689 -0
- package/dist/lib/pmo/storage/phases.d.ts +65 -0
- package/dist/lib/pmo/storage/phases.js +392 -0
- package/dist/lib/pmo/storage/projects.d.ts +79 -0
- package/dist/lib/pmo/storage/projects.js +303 -0
- package/dist/lib/pmo/storage/specs.d.ts +77 -0
- package/dist/lib/pmo/storage/specs.js +389 -0
- package/dist/lib/pmo/storage/statuses.d.ts +63 -0
- package/dist/lib/pmo/storage/statuses.js +404 -0
- package/dist/lib/pmo/storage/subtasks.d.ts +37 -0
- package/dist/lib/pmo/storage/subtasks.js +184 -0
- package/dist/lib/pmo/storage/templates.d.ts +40 -0
- package/dist/lib/pmo/storage/templates.js +210 -0
- package/dist/lib/pmo/storage/tickets.d.ts +57 -0
- package/dist/lib/pmo/storage/tickets.js +453 -0
- package/dist/lib/pmo/storage/types.d.ts +200 -0
- package/dist/lib/pmo/storage/types.js +5 -0
- package/dist/lib/pmo/storage/views.d.ts +44 -0
- package/dist/lib/pmo/storage/views.js +355 -0
- package/dist/lib/pmo/storage-sqlite.d.ts +7 -0
- package/dist/lib/pmo/storage-sqlite.js +7 -0
- package/dist/lib/pmo/sync-manager.d.ts +92 -0
- package/dist/lib/pmo/sync-manager.js +229 -0
- package/dist/lib/pmo/types.d.ts +710 -0
- package/dist/lib/pmo/types.js +108 -0
- package/dist/lib/pmo/utils.d.ts +122 -0
- package/dist/lib/pmo/utils.js +174 -0
- package/dist/lib/pmo/watcher.d.ts +43 -0
- package/dist/lib/pmo/watcher.js +208 -0
- package/dist/lib/pr/index.d.ts +150 -0
- package/dist/lib/pr/index.js +483 -0
- package/dist/lib/prompt-json.d.ts +231 -0
- package/dist/lib/prompt-json.js +213 -0
- package/dist/lib/repos/index.d.ts +81 -0
- package/dist/lib/repos/index.js +679 -0
- package/dist/lib/styles.d.ts +98 -0
- package/dist/lib/styles.js +195 -0
- package/dist/lib/themes.d.ts +128 -0
- package/dist/lib/themes.js +301 -0
- package/dist/lib/ui/BoardUI.d.ts +21 -0
- package/dist/lib/ui/BoardUI.js +85 -0
- package/dist/lib/ui/ClaimTicketUI.d.ts +17 -0
- package/dist/lib/ui/ClaimTicketUI.js +64 -0
- package/dist/lib/ui/CreateTicketUI.d.ts +13 -0
- package/dist/lib/ui/CreateTicketUI.js +101 -0
- package/dist/lib/workspace.d.ts +66 -0
- package/dist/lib/workspace.js +204 -0
- package/oclif.manifest.json +10593 -0
- package/package.json +103 -56
- package/LICENSE +0 -21
- package/dist/bin/prlt.d.ts +0 -11
- package/dist/bin/prlt.d.ts.map +0 -1
- package/dist/bin/prlt.js +0 -144
- package/dist/bin/prlt.js.map +0 -1
- package/dist/lib/config/index.d.ts +0 -14
- package/dist/lib/config/index.d.ts.map +0 -1
- package/dist/lib/config/index.js +0 -142
- package/dist/lib/config/index.js.map +0 -1
- package/dist/lib/config/upgrade.d.ts +0 -2
- package/dist/lib/config/upgrade.d.ts.map +0 -1
- package/dist/lib/config/upgrade.js +0 -248
- package/dist/lib/config/upgrade.js.map +0 -1
- package/dist/lib/themes/index.d.ts +0 -8
- package/dist/lib/themes/index.d.ts.map +0 -1
- package/dist/lib/themes/index.js +0 -80
- package/dist/lib/themes/index.js.map +0 -1
- package/dist/lib/utils/helpers.d.ts +0 -4
- package/dist/lib/utils/helpers.d.ts.map +0 -1
- package/dist/lib/utils/helpers.js +0 -39
- package/dist/lib/utils/helpers.js.map +0 -1
- package/dist/lib/utils/logger.d.ts +0 -4
- package/dist/lib/utils/logger.d.ts.map +0 -1
- package/dist/lib/utils/logger.js +0 -28
- package/dist/lib/utils/logger.js.map +0 -1
- package/dist/lib/workspace/index.d.ts +0 -13
- package/dist/lib/workspace/index.d.ts.map +0 -1
- package/dist/lib/workspace/index.js +0 -116
- package/dist/lib/workspace/index.js.map +0 -1
- package/dist/lib/worktree/index.d.ts +0 -7
- package/dist/lib/worktree/index.d.ts.map +0 -1
- package/dist/lib/worktree/index.js +0 -362
- package/dist/lib/worktree/index.js.map +0 -1
- package/dist/lib/worktree/migrate.d.ts +0 -2
- package/dist/lib/worktree/migrate.d.ts.map +0 -1
- package/dist/lib/worktree/migrate.js +0 -214
- package/dist/lib/worktree/migrate.js.map +0 -1
- package/dist/lib/worktree/repair.d.ts +0 -3
- package/dist/lib/worktree/repair.d.ts.map +0 -1
- package/dist/lib/worktree/repair.js +0 -320
- package/dist/lib/worktree/repair.js.map +0 -1
- package/dist/types/index.d.ts +0 -57
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -3
- package/dist/types/index.js.map +0 -1
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { PMOCommand, pmoBaseFlags, autoExportToBoard } 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 TicketProject extends PMOCommand {
|
|
7
|
+
static description = 'Move ticket(s) to a different project';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %> TKT-001 new-project',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> TKT-001',
|
|
11
|
+
'<%= config.bin %> <%= command.id %>',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> --bulk --target other-project',
|
|
13
|
+
];
|
|
14
|
+
static args = {
|
|
15
|
+
ticketId: Args.string({
|
|
16
|
+
description: 'Ticket ID',
|
|
17
|
+
required: false,
|
|
18
|
+
}),
|
|
19
|
+
targetProject: Args.string({
|
|
20
|
+
description: 'Target project ID',
|
|
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
|
+
'keep-epic': Flags.boolean({
|
|
31
|
+
description: 'Keep ticket assigned to its epic (if epic is in source project, will unlink)',
|
|
32
|
+
default: false,
|
|
33
|
+
}),
|
|
34
|
+
bulk: Flags.boolean({
|
|
35
|
+
char: 'b',
|
|
36
|
+
description: 'Enable bulk mode to move multiple tickets',
|
|
37
|
+
default: false,
|
|
38
|
+
}),
|
|
39
|
+
target: Flags.string({
|
|
40
|
+
char: 't',
|
|
41
|
+
description: 'Target project ID (for bulk mode)',
|
|
42
|
+
}),
|
|
43
|
+
};
|
|
44
|
+
async execute() {
|
|
45
|
+
const { args, flags } = await this.parse(TicketProject);
|
|
46
|
+
// Check if JSON output mode is active
|
|
47
|
+
const jsonMode = shouldOutputJson(flags);
|
|
48
|
+
// Bulk mode
|
|
49
|
+
if (flags.bulk) {
|
|
50
|
+
await this.executeBulk(flags);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Get source project ID
|
|
54
|
+
const sourceProjectId = await this.requireProject();
|
|
55
|
+
// Get ticket ID
|
|
56
|
+
let ticketId = args.ticketId;
|
|
57
|
+
if (!ticketId) {
|
|
58
|
+
const tickets = await this.storage.listTickets(sourceProjectId);
|
|
59
|
+
if (tickets.length === 0) {
|
|
60
|
+
if (jsonMode) {
|
|
61
|
+
outputErrorAsJson('NO_TICKETS', 'No tickets found in this project.', createMetadata('ticket project', flags));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
this.log(styles.muted('\nNo tickets found in this project.'));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const selected = await this.selectFromList({
|
|
68
|
+
message: 'Select ticket to move:',
|
|
69
|
+
items: tickets,
|
|
70
|
+
getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
|
|
71
|
+
getValue: (t) => t.id,
|
|
72
|
+
getCommand: (t) => `prlt ticket project ${t.id} --json`,
|
|
73
|
+
jsonMode: jsonMode ? { flags, commandName: 'ticket project' } : null,
|
|
74
|
+
});
|
|
75
|
+
if (!selected) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
ticketId = selected;
|
|
79
|
+
}
|
|
80
|
+
// Get ticket details
|
|
81
|
+
const ticket = await this.storage.getTicket(ticketId);
|
|
82
|
+
if (!ticket) {
|
|
83
|
+
this.error(`Ticket not found: ${ticketId}`);
|
|
84
|
+
}
|
|
85
|
+
// Get all projects
|
|
86
|
+
const projects = await this.storage.listProjects();
|
|
87
|
+
const otherProjects = projects.filter(p => p.id !== sourceProjectId);
|
|
88
|
+
if (otherProjects.length === 0) {
|
|
89
|
+
this.log(styles.muted('\nNo other projects to move to.'));
|
|
90
|
+
const actionChoices = [
|
|
91
|
+
{ id: 'create', name: 'Create a new project' },
|
|
92
|
+
{ id: 'cancel', name: 'Cancel' },
|
|
93
|
+
];
|
|
94
|
+
const action = await this.selectFromList({
|
|
95
|
+
message: 'What would you like to do?',
|
|
96
|
+
items: actionChoices,
|
|
97
|
+
getName: (a) => a.name,
|
|
98
|
+
getValue: (a) => a.id,
|
|
99
|
+
getCommand: (a) => a.id === 'create' ? 'prlt project create --json' : '',
|
|
100
|
+
jsonMode: jsonMode ? { flags, commandName: 'ticket project' } : null,
|
|
101
|
+
});
|
|
102
|
+
if (action === 'create') {
|
|
103
|
+
await this.config.runCommand('project:create', []);
|
|
104
|
+
}
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
// Get target project
|
|
108
|
+
let targetProjectId = args.targetProject;
|
|
109
|
+
if (!targetProjectId) {
|
|
110
|
+
const selected = await this.selectFromList({
|
|
111
|
+
message: 'Select target project:',
|
|
112
|
+
items: otherProjects,
|
|
113
|
+
getName: (p) => `${p.id} - ${p.name} (${p.status})`,
|
|
114
|
+
getValue: (p) => p.id,
|
|
115
|
+
getCommand: (p) => `prlt ticket project ${ticketId} ${p.id} --json`,
|
|
116
|
+
jsonMode: jsonMode ? { flags, commandName: 'ticket project' } : null,
|
|
117
|
+
});
|
|
118
|
+
if (!selected) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
targetProjectId = selected;
|
|
122
|
+
}
|
|
123
|
+
// Validate target project
|
|
124
|
+
const targetProject = projects.find(p => p.id === targetProjectId);
|
|
125
|
+
if (!targetProject) {
|
|
126
|
+
this.error(`Project not found: ${targetProjectId}`);
|
|
127
|
+
}
|
|
128
|
+
if (targetProjectId === sourceProjectId) {
|
|
129
|
+
this.log(styles.muted('\nTicket is already in this project.'));
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
// Check if ticket has an epic
|
|
133
|
+
const epicWarning = ticket.epicId && !flags['keep-epic'];
|
|
134
|
+
if (epicWarning) {
|
|
135
|
+
const epic = await this.storage.getEpic(ticket.epicId);
|
|
136
|
+
if (epic && epic.projectId !== targetProjectId) {
|
|
137
|
+
this.log(styles.warning(`\nTicket is assigned to epic "${ticket.epicId}" in source project.`));
|
|
138
|
+
const actionChoices = [
|
|
139
|
+
{ id: 'unlink', name: 'Unlink from epic (move ticket only)' },
|
|
140
|
+
{ id: 'cancel', name: 'Cancel' },
|
|
141
|
+
];
|
|
142
|
+
const action = await this.selectFromList({
|
|
143
|
+
message: 'How to handle epic assignment?',
|
|
144
|
+
items: actionChoices,
|
|
145
|
+
getName: (a) => a.name,
|
|
146
|
+
getValue: (a) => a.id,
|
|
147
|
+
getCommand: (a) => a.id === 'unlink' ? `prlt ticket project ${ticketId} ${targetProjectId} --json` : '',
|
|
148
|
+
jsonMode: jsonMode ? { flags, commandName: 'ticket project' } : null,
|
|
149
|
+
});
|
|
150
|
+
if (action === 'cancel' || !action) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
// Unlink from epic before moving
|
|
154
|
+
await this.storage.updateTicket(ticketId, { epicId: undefined });
|
|
155
|
+
this.log(styles.muted(` Unlinked from epic "${ticket.epicId}"`));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Move ticket to new project using the storage method
|
|
159
|
+
const movedTicket = await this.storage.moveTicketToProject(ticketId, targetProjectId);
|
|
160
|
+
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
161
|
+
this.log(styles.success(`\nā
Moved ticket ${styles.emphasis(ticketId)} to project ${styles.emphasis(targetProjectId)}`));
|
|
162
|
+
this.log(styles.muted(` From: ${sourceProjectId}`));
|
|
163
|
+
this.log(styles.muted(` To: ${targetProjectId} (column: ${movedTicket.statusName || 'first column'})`));
|
|
164
|
+
this.log(styles.muted(`\nView ticket: prlt ticket view ${ticketId}`));
|
|
165
|
+
}
|
|
166
|
+
async executeBulk(flags) {
|
|
167
|
+
this.log(styles.emphasis('š Bulk Move Tickets to Project\n'));
|
|
168
|
+
// Get source project ID
|
|
169
|
+
const sourceProjectId = await this.requireProject();
|
|
170
|
+
// Get all tickets in current project
|
|
171
|
+
const tickets = await this.storage.listTickets(sourceProjectId);
|
|
172
|
+
if (tickets.length === 0) {
|
|
173
|
+
this.log(styles.muted('\nNo tickets found in this project.'));
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
// Select tickets
|
|
177
|
+
const { selectedTickets } = await inquirer.prompt([{
|
|
178
|
+
type: 'checkbox',
|
|
179
|
+
name: 'selectedTickets',
|
|
180
|
+
message: 'Select tickets to move:',
|
|
181
|
+
choices: tickets.map(t => {
|
|
182
|
+
const epicLabel = t.epicId ? ` [epic: ${t.epicId}]` : '';
|
|
183
|
+
return {
|
|
184
|
+
name: `${t.id} - ${t.title} (${t.statusName})${epicLabel}`,
|
|
185
|
+
value: t.id,
|
|
186
|
+
};
|
|
187
|
+
}),
|
|
188
|
+
}]);
|
|
189
|
+
if (selectedTickets.length === 0) {
|
|
190
|
+
this.log(styles.muted('No tickets selected.'));
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
// Get target project
|
|
194
|
+
const projects = await this.storage.listProjects();
|
|
195
|
+
const otherProjects = projects.filter(p => p.id !== sourceProjectId);
|
|
196
|
+
if (otherProjects.length === 0) {
|
|
197
|
+
this.log(styles.muted('\nNo other projects to move to. Create one with: prlt project create'));
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
let targetProjectId = flags.target;
|
|
201
|
+
if (!targetProjectId) {
|
|
202
|
+
const { selected } = await inquirer.prompt([{
|
|
203
|
+
type: 'list',
|
|
204
|
+
name: 'selected',
|
|
205
|
+
message: 'Select target project:',
|
|
206
|
+
choices: otherProjects.map(p => ({
|
|
207
|
+
name: `${p.id} - ${p.name}`,
|
|
208
|
+
value: p.id,
|
|
209
|
+
})),
|
|
210
|
+
}]);
|
|
211
|
+
targetProjectId = selected;
|
|
212
|
+
}
|
|
213
|
+
// Validate target project
|
|
214
|
+
const targetProject = projects.find(p => p.id === targetProjectId);
|
|
215
|
+
if (!targetProject) {
|
|
216
|
+
this.error(`Project not found: ${targetProjectId}`);
|
|
217
|
+
}
|
|
218
|
+
// Check for epic conflicts
|
|
219
|
+
const ticketsWithEpics = selectedTickets.filter((id) => {
|
|
220
|
+
const t = tickets.find(t => t.id === id);
|
|
221
|
+
return t?.epicId;
|
|
222
|
+
});
|
|
223
|
+
if (ticketsWithEpics.length > 0) {
|
|
224
|
+
this.log(styles.warning(`\n${ticketsWithEpics.length} ticket(s) are assigned to epics.`));
|
|
225
|
+
const { action } = await inquirer.prompt([{
|
|
226
|
+
type: 'list',
|
|
227
|
+
name: 'action',
|
|
228
|
+
message: 'How to handle epic assignments?',
|
|
229
|
+
choices: [
|
|
230
|
+
{ name: 'Unlink from epics and move', value: 'unlink' },
|
|
231
|
+
{ name: 'Cancel', value: 'cancel' },
|
|
232
|
+
],
|
|
233
|
+
}]);
|
|
234
|
+
if (action === 'cancel') {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// Move each ticket using the storage method
|
|
239
|
+
let lastMovedTicket;
|
|
240
|
+
for (const ticketId of selectedTickets) {
|
|
241
|
+
const ticket = tickets.find(t => t.id === ticketId);
|
|
242
|
+
// Unlink from epic if needed
|
|
243
|
+
if (ticket?.epicId) {
|
|
244
|
+
await this.storage.updateTicket(ticketId, { epicId: undefined });
|
|
245
|
+
}
|
|
246
|
+
// Move ticket to new project
|
|
247
|
+
lastMovedTicket = await this.storage.moveTicketToProject(ticketId, targetProjectId);
|
|
248
|
+
this.log(styles.success(` Moved ${ticketId} to ${targetProjectId}`));
|
|
249
|
+
}
|
|
250
|
+
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
251
|
+
this.log(styles.success(`\nā
Moved ${selectedTickets.length} ticket(s) to project "${targetProject.name}"`));
|
|
252
|
+
this.log(styles.muted(` Target column: ${lastMovedTicket?.statusName || 'first column'}`));
|
|
253
|
+
}
|
|
254
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class TicketReassign 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
|
+
assignee: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
8
|
+
};
|
|
9
|
+
static flags: {
|
|
10
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
to: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
from: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
+
};
|
|
17
|
+
execute(): Promise<void>;
|
|
18
|
+
private executeBulk;
|
|
19
|
+
}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { PMOCommand, pmoBaseFlags, autoExportToBoard } 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 TicketReassign extends PMOCommand {
|
|
7
|
+
static description = 'Reassign ticket(s) to a different agent';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %>',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> TKT-001 alice',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> --bulk --to alice',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> --bulk --from bob --to alice',
|
|
13
|
+
'<%= config.bin %> <%= command.id %> --json # Output choices as JSON',
|
|
14
|
+
];
|
|
15
|
+
static args = {
|
|
16
|
+
ticketId: Args.string({
|
|
17
|
+
description: 'Ticket ID - prompts with dropdown if not provided',
|
|
18
|
+
required: false,
|
|
19
|
+
}),
|
|
20
|
+
assignee: Args.string({
|
|
21
|
+
description: 'Target agent name',
|
|
22
|
+
required: false,
|
|
23
|
+
}),
|
|
24
|
+
};
|
|
25
|
+
static flags = {
|
|
26
|
+
...pmoBaseFlags,
|
|
27
|
+
json: Flags.boolean({
|
|
28
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
29
|
+
default: false,
|
|
30
|
+
}),
|
|
31
|
+
to: Flags.string({
|
|
32
|
+
description: 'Target agent name (for bulk mode)',
|
|
33
|
+
}),
|
|
34
|
+
from: Flags.string({
|
|
35
|
+
description: 'Filter tickets by current assignee (bulk mode)',
|
|
36
|
+
}),
|
|
37
|
+
bulk: Flags.boolean({
|
|
38
|
+
char: 'b',
|
|
39
|
+
description: 'Enable bulk mode to reassign multiple tickets',
|
|
40
|
+
default: false,
|
|
41
|
+
}),
|
|
42
|
+
force: Flags.boolean({
|
|
43
|
+
char: 'f',
|
|
44
|
+
description: 'Skip confirmation prompt',
|
|
45
|
+
default: false,
|
|
46
|
+
}),
|
|
47
|
+
};
|
|
48
|
+
async execute() {
|
|
49
|
+
const { args, flags } = await this.parse(TicketReassign);
|
|
50
|
+
const projectId = flags.project;
|
|
51
|
+
// Check if JSON output mode is active
|
|
52
|
+
const jsonMode = shouldOutputJson(flags);
|
|
53
|
+
// Get all tickets
|
|
54
|
+
const allTickets = await this.storage.listTickets(projectId);
|
|
55
|
+
if (allTickets.length === 0) {
|
|
56
|
+
if (jsonMode) {
|
|
57
|
+
outputErrorAsJson('NO_TICKETS', 'No tickets found.', createMetadata('ticket reassign', flags));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
this.log(styles.warning('No tickets found.'));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// Get unique assignees from tickets
|
|
64
|
+
const assignees = new Set();
|
|
65
|
+
for (const ticket of allTickets) {
|
|
66
|
+
if (ticket.assignee) {
|
|
67
|
+
assignees.add(ticket.assignee);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Also get agents from workspace if available
|
|
71
|
+
const db = this.storage.db;
|
|
72
|
+
try {
|
|
73
|
+
const agents = db.prepare(`SELECT name FROM agents`).all();
|
|
74
|
+
for (const agent of agents) {
|
|
75
|
+
assignees.add(agent.name);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// agents table might not exist, ignore
|
|
80
|
+
}
|
|
81
|
+
// Bulk mode
|
|
82
|
+
if (flags.bulk) {
|
|
83
|
+
await this.executeBulk(allTickets, Array.from(assignees), flags);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
// Single ticket mode
|
|
87
|
+
let ticketId = args.ticketId;
|
|
88
|
+
if (!ticketId) {
|
|
89
|
+
const selected = await this.selectFromList({
|
|
90
|
+
message: 'Select ticket to reassign:',
|
|
91
|
+
items: allTickets,
|
|
92
|
+
getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
|
|
93
|
+
getValue: (t) => t.id,
|
|
94
|
+
getCommand: (t) => `prlt ticket reassign ${t.id} --json`,
|
|
95
|
+
jsonMode: jsonMode ? { flags, commandName: 'ticket reassign' } : null,
|
|
96
|
+
});
|
|
97
|
+
if (!selected) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
ticketId = selected;
|
|
101
|
+
}
|
|
102
|
+
// Get ticket
|
|
103
|
+
const ticket = await this.storage.getTicket(ticketId);
|
|
104
|
+
if (!ticket) {
|
|
105
|
+
this.error(`Ticket "${ticketId}" not found.`);
|
|
106
|
+
}
|
|
107
|
+
// Get target assignee
|
|
108
|
+
let targetAssignee = args.assignee || flags.to;
|
|
109
|
+
if (!targetAssignee) {
|
|
110
|
+
const { assignee } = await inquirer.prompt([{
|
|
111
|
+
type: 'list',
|
|
112
|
+
name: 'assignee',
|
|
113
|
+
message: `Reassign ${ticketId} to:`,
|
|
114
|
+
choices: [
|
|
115
|
+
{ name: 'None (unassign)', value: '__none__' },
|
|
116
|
+
...Array.from(assignees).sort().map(a => ({
|
|
117
|
+
name: a === ticket.assignee ? `${a} (current)` : a,
|
|
118
|
+
value: a,
|
|
119
|
+
})),
|
|
120
|
+
{ name: 'āā Enter custom name āā', value: '__custom__' },
|
|
121
|
+
],
|
|
122
|
+
}]);
|
|
123
|
+
if (assignee === '__custom__') {
|
|
124
|
+
const { customAssignee } = await inquirer.prompt([{
|
|
125
|
+
type: 'input',
|
|
126
|
+
name: 'customAssignee',
|
|
127
|
+
message: 'Enter agent/assignee name:',
|
|
128
|
+
validate: (input) => input.length > 0 || 'Name is required',
|
|
129
|
+
}]);
|
|
130
|
+
targetAssignee = customAssignee;
|
|
131
|
+
}
|
|
132
|
+
else if (assignee === '__none__') {
|
|
133
|
+
targetAssignee = undefined;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
targetAssignee = assignee;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Handle special values
|
|
140
|
+
if (targetAssignee === 'none' || targetAssignee === 'unassigned') {
|
|
141
|
+
targetAssignee = undefined;
|
|
142
|
+
}
|
|
143
|
+
// Check if same
|
|
144
|
+
if (targetAssignee === ticket.assignee) {
|
|
145
|
+
this.log(styles.muted(`Ticket "${ticketId}" is already assigned to "${targetAssignee || 'none'}".`));
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// Update ticket
|
|
149
|
+
await this.storage.updateTicket(ticketId, { assignee: targetAssignee || undefined });
|
|
150
|
+
// Auto-export
|
|
151
|
+
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
152
|
+
const action = targetAssignee ? `reassigned to ${targetAssignee}` : 'unassigned';
|
|
153
|
+
this.log(styles.success(`\nā
Ticket ${styles.emphasis(ticketId)} ${action}`));
|
|
154
|
+
this.log(styles.muted(` Title: ${ticket.title}`));
|
|
155
|
+
if (ticket.assignee) {
|
|
156
|
+
this.log(styles.muted(` Previous: ${ticket.assignee}`));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
async executeBulk(allTickets, assigneesList, flags) {
|
|
160
|
+
this.log(styles.emphasis('š¤ Reassign Tickets\n'));
|
|
161
|
+
// Filter tickets if --from specified
|
|
162
|
+
let filteredTickets = allTickets;
|
|
163
|
+
if (flags.from) {
|
|
164
|
+
if (flags.from === 'none' || flags.from === 'unassigned') {
|
|
165
|
+
filteredTickets = allTickets.filter(t => !t.assignee);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
filteredTickets = allTickets.filter(t => t.assignee === flags.from);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (filteredTickets.length === 0) {
|
|
172
|
+
this.log(styles.warning('No tickets found matching filter.'));
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
// Select tickets to reassign
|
|
176
|
+
const { selectedTickets } = await inquirer.prompt([{
|
|
177
|
+
type: 'checkbox',
|
|
178
|
+
name: 'selectedTickets',
|
|
179
|
+
message: 'Select tickets to reassign:',
|
|
180
|
+
choices: filteredTickets.map(t => ({
|
|
181
|
+
name: `${t.id} - ${t.title} [Assignee: ${t.assignee || '(none)'}]`,
|
|
182
|
+
value: t.id,
|
|
183
|
+
})),
|
|
184
|
+
}]);
|
|
185
|
+
if (selectedTickets.length === 0) {
|
|
186
|
+
this.log(styles.muted('No tickets selected.'));
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
// Select target assignee
|
|
190
|
+
let targetAssignee = flags.to;
|
|
191
|
+
if (targetAssignee === undefined) {
|
|
192
|
+
const { assignee } = await inquirer.prompt([{
|
|
193
|
+
type: 'list',
|
|
194
|
+
name: 'assignee',
|
|
195
|
+
message: 'Reassign to which agent?',
|
|
196
|
+
choices: [
|
|
197
|
+
{ name: 'None (unassign)', value: '__none__' },
|
|
198
|
+
...assigneesList.sort().map(a => ({
|
|
199
|
+
name: a,
|
|
200
|
+
value: a,
|
|
201
|
+
})),
|
|
202
|
+
{ name: 'āā Enter custom name āā', value: '__custom__' },
|
|
203
|
+
],
|
|
204
|
+
}]);
|
|
205
|
+
if (assignee === '__custom__') {
|
|
206
|
+
const { customAssignee } = await inquirer.prompt([{
|
|
207
|
+
type: 'input',
|
|
208
|
+
name: 'customAssignee',
|
|
209
|
+
message: 'Enter agent/assignee name:',
|
|
210
|
+
validate: (input) => input.length > 0 || 'Name is required',
|
|
211
|
+
}]);
|
|
212
|
+
targetAssignee = customAssignee;
|
|
213
|
+
}
|
|
214
|
+
else if (assignee === '__none__') {
|
|
215
|
+
targetAssignee = undefined;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
targetAssignee = assignee;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// Handle special values
|
|
222
|
+
if (targetAssignee === 'none' || targetAssignee === 'unassigned') {
|
|
223
|
+
targetAssignee = undefined;
|
|
224
|
+
}
|
|
225
|
+
// Confirmation
|
|
226
|
+
if (!flags.force) {
|
|
227
|
+
const assigneeLabel = targetAssignee || 'None (unassigning)';
|
|
228
|
+
this.log(styles.primary('\nWill reassign to:'));
|
|
229
|
+
this.log(styles.primary(` ā ${assigneeLabel}\n`));
|
|
230
|
+
this.log(styles.primary('Tickets:'));
|
|
231
|
+
for (const ticketId of selectedTickets) {
|
|
232
|
+
const ticket = filteredTickets.find(t => t.id === ticketId);
|
|
233
|
+
this.log(styles.primary(` ⢠${ticketId}: ${ticket?.title}`));
|
|
234
|
+
}
|
|
235
|
+
this.log('');
|
|
236
|
+
const { confirm } = await inquirer.prompt([{
|
|
237
|
+
type: 'list',
|
|
238
|
+
name: 'confirm',
|
|
239
|
+
message: 'Continue?',
|
|
240
|
+
choices: [
|
|
241
|
+
{ name: 'No, cancel', value: false },
|
|
242
|
+
{ name: 'Yes, reassign tickets', value: true }
|
|
243
|
+
],
|
|
244
|
+
default: 0
|
|
245
|
+
}]);
|
|
246
|
+
if (!confirm) {
|
|
247
|
+
this.log(styles.muted('Operation cancelled.'));
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
this.log('');
|
|
252
|
+
// Reassign each ticket
|
|
253
|
+
let successCount = 0;
|
|
254
|
+
let failCount = 0;
|
|
255
|
+
for (const ticketId of selectedTickets) {
|
|
256
|
+
try {
|
|
257
|
+
await this.storage.updateTicket(ticketId, { assignee: targetAssignee || undefined });
|
|
258
|
+
const action = targetAssignee ? `Reassigned to ${targetAssignee}` : 'Unassigned';
|
|
259
|
+
this.log(styles.success(`${ticketId}: ${action}`));
|
|
260
|
+
successCount++;
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
this.log(styles.error(`Failed to reassign ${ticketId}: ${error instanceof Error ? error.message : String(error)}`));
|
|
264
|
+
failCount++;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Auto-export to kanban.md
|
|
268
|
+
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
269
|
+
// Summary
|
|
270
|
+
this.log('');
|
|
271
|
+
if (successCount > 0) {
|
|
272
|
+
const action = targetAssignee ? 'Reassigned' : 'Unassigned';
|
|
273
|
+
this.log(styles.success(`${action} ${successCount} ticket(s)`));
|
|
274
|
+
}
|
|
275
|
+
if (failCount > 0) {
|
|
276
|
+
this.log(styles.error(`Failed to reassign ${failCount} ticket(s)`));
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class TicketSpec 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
|
+
specId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
8
|
+
};
|
|
9
|
+
static flags: {
|
|
10
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
unlink: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
spec: 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
|
+
}
|