@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,77 @@
|
|
|
1
|
+
import { Flags, Args } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
4
|
+
import { styles } from '../../lib/styles.js';
|
|
5
|
+
import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
|
|
6
|
+
export default class StatusDelete extends PMOCommand {
|
|
7
|
+
static description = 'Delete a workflow status';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %> my-project-blocked',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> my-project-review --force',
|
|
11
|
+
];
|
|
12
|
+
static args = {
|
|
13
|
+
id: Args.string({
|
|
14
|
+
description: 'Status ID',
|
|
15
|
+
required: true,
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
static flags = {
|
|
19
|
+
json: Flags.boolean({
|
|
20
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
21
|
+
default: false,
|
|
22
|
+
}),
|
|
23
|
+
force: Flags.boolean({
|
|
24
|
+
char: 'f',
|
|
25
|
+
description: 'Skip confirmation prompt',
|
|
26
|
+
default: false,
|
|
27
|
+
}),
|
|
28
|
+
};
|
|
29
|
+
async execute() {
|
|
30
|
+
const { args, flags } = await this.parse(StatusDelete);
|
|
31
|
+
// Check if JSON output mode is active
|
|
32
|
+
const jsonMode = shouldOutputJson(flags);
|
|
33
|
+
// Helper to handle errors in JSON mode
|
|
34
|
+
const handleError = (code, message) => {
|
|
35
|
+
if (jsonMode) {
|
|
36
|
+
outputErrorAsJson(code, message, createMetadata('status delete', flags));
|
|
37
|
+
this.exit(1);
|
|
38
|
+
}
|
|
39
|
+
this.error(message);
|
|
40
|
+
};
|
|
41
|
+
// Get existing status
|
|
42
|
+
const existing = await this.storage.getStatus(args.id);
|
|
43
|
+
if (!existing) {
|
|
44
|
+
return handleError('STATUS_NOT_FOUND', `Status not found: ${args.id}`);
|
|
45
|
+
}
|
|
46
|
+
// Confirm deletion
|
|
47
|
+
if (!flags.force) {
|
|
48
|
+
// In JSON mode, output confirmation prompt
|
|
49
|
+
if (jsonMode) {
|
|
50
|
+
outputPromptAsJson(buildPromptConfig('confirm', 'confirm', `Delete status "${existing.name}" (${existing.category})?`), createMetadata('status delete', flags));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const { confirm } = await inquirer.prompt([
|
|
54
|
+
{
|
|
55
|
+
type: 'confirm',
|
|
56
|
+
name: 'confirm',
|
|
57
|
+
message: `Delete status "${existing.name}" (${existing.category})?`,
|
|
58
|
+
default: false,
|
|
59
|
+
},
|
|
60
|
+
]);
|
|
61
|
+
if (!confirm) {
|
|
62
|
+
this.log(styles.muted('Cancelled'));
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
await this.storage.deleteStatus(args.id);
|
|
68
|
+
this.log(styles.success(`Deleted status "${existing.name}"`));
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (error instanceof Error && error.message.includes('ticket(s) are using it')) {
|
|
72
|
+
this.error(error.message + '\nMove tickets to another status before deleting.');
|
|
73
|
+
}
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class Status extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static aliases: string[];
|
|
5
|
+
static examples: string[];
|
|
6
|
+
static flags: {
|
|
7
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
};
|
|
10
|
+
protected getPMOOptions(): {
|
|
11
|
+
promptIfMultiple: boolean;
|
|
12
|
+
};
|
|
13
|
+
execute(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
4
|
+
import { shouldOutputJson, } from '../../lib/prompt-json.js';
|
|
5
|
+
export default class Status extends PMOCommand {
|
|
6
|
+
static description = 'Interactive menu for workflow status operations';
|
|
7
|
+
static aliases = ['statuses'];
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %>',
|
|
10
|
+
];
|
|
11
|
+
static flags = {
|
|
12
|
+
...pmoBaseFlags,
|
|
13
|
+
json: Flags.boolean({
|
|
14
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
15
|
+
default: false,
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
getPMOOptions() {
|
|
19
|
+
return { promptIfMultiple: false };
|
|
20
|
+
}
|
|
21
|
+
async execute() {
|
|
22
|
+
const { flags } = await this.parse(Status);
|
|
23
|
+
// Check if JSON output mode is active
|
|
24
|
+
const jsonMode = shouldOutputJson(flags);
|
|
25
|
+
// Define choices once, use for both JSON and interactive modes
|
|
26
|
+
// Each choice includes the full command for AI agents to execute
|
|
27
|
+
const menuChoices = [
|
|
28
|
+
{ id: 'list', name: 'List all statuses', command: 'prlt status list --format json' },
|
|
29
|
+
{ id: 'create', name: 'Create new status', command: 'prlt status create --json' },
|
|
30
|
+
{ id: 'update', name: 'Update status', command: 'prlt status update --json' },
|
|
31
|
+
{ id: 'move', name: 'Move status (change order)', command: 'prlt status move --json' },
|
|
32
|
+
{ id: 'delete', name: 'Delete status', command: 'prlt status delete --json' },
|
|
33
|
+
{ id: 'cancel', name: 'Cancel', command: '' },
|
|
34
|
+
];
|
|
35
|
+
const message = 'Workflow Statuses - What would you like to do?';
|
|
36
|
+
const action = await this.selectFromList({
|
|
37
|
+
message: '📊 ' + message,
|
|
38
|
+
items: menuChoices,
|
|
39
|
+
getName: (c) => c.name,
|
|
40
|
+
getValue: (c) => c.id,
|
|
41
|
+
getCommand: (c) => c.command,
|
|
42
|
+
jsonMode: jsonMode ? { flags, commandName: 'status' } : null,
|
|
43
|
+
});
|
|
44
|
+
if (action === 'cancel' || !action) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// Run the selected subcommand
|
|
48
|
+
switch (action) {
|
|
49
|
+
case 'list':
|
|
50
|
+
await this.config.runCommand('status:list', []);
|
|
51
|
+
break;
|
|
52
|
+
case 'create':
|
|
53
|
+
await this.config.runCommand('status:create', ['--interactive']);
|
|
54
|
+
break;
|
|
55
|
+
case 'update': {
|
|
56
|
+
// First list statuses, then prompt for selection
|
|
57
|
+
await this.config.runCommand('status:list', []);
|
|
58
|
+
const { statusId } = await inquirer.prompt([{
|
|
59
|
+
type: 'input',
|
|
60
|
+
name: 'statusId',
|
|
61
|
+
message: 'Status ID to update:',
|
|
62
|
+
validate: (input) => input.length > 0 || 'Status ID is required',
|
|
63
|
+
}]);
|
|
64
|
+
await this.config.runCommand('status:update', [statusId]);
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
case 'move': {
|
|
68
|
+
await this.config.runCommand('status:list', []);
|
|
69
|
+
const { statusId } = await inquirer.prompt([{
|
|
70
|
+
type: 'input',
|
|
71
|
+
name: 'statusId',
|
|
72
|
+
message: 'Status ID to move:',
|
|
73
|
+
validate: (input) => input.length > 0 || 'Status ID is required',
|
|
74
|
+
}]);
|
|
75
|
+
await this.config.runCommand('status:move', [statusId]);
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
case 'delete': {
|
|
79
|
+
await this.config.runCommand('status:list', []);
|
|
80
|
+
const { statusId } = await inquirer.prompt([{
|
|
81
|
+
type: 'input',
|
|
82
|
+
name: 'statusId',
|
|
83
|
+
message: 'Status ID to delete:',
|
|
84
|
+
validate: (input) => input.length > 0 || 'Status ID is required',
|
|
85
|
+
}]);
|
|
86
|
+
await this.config.runCommand('status:delete', [statusId]);
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class StatusList extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
category: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
};
|
|
10
|
+
execute(): Promise<void>;
|
|
11
|
+
private groupByCategory;
|
|
12
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
3
|
+
import { styles } from '../../lib/styles.js';
|
|
4
|
+
import { STATE_CATEGORY_ORDER } from '../../lib/pmo/types.js';
|
|
5
|
+
export default class StatusList extends PMOCommand {
|
|
6
|
+
static description = 'List all workflow statuses for a project';
|
|
7
|
+
static examples = [
|
|
8
|
+
'<%= config.bin %> <%= command.id %>',
|
|
9
|
+
'<%= config.bin %> <%= command.id %> --project my-project',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> --category started',
|
|
11
|
+
];
|
|
12
|
+
static flags = {
|
|
13
|
+
...pmoBaseFlags,
|
|
14
|
+
category: Flags.string({
|
|
15
|
+
char: 'c',
|
|
16
|
+
description: 'Filter by category',
|
|
17
|
+
options: ['backlog', 'unstarted', 'started', 'completed', 'canceled'],
|
|
18
|
+
}),
|
|
19
|
+
json: Flags.boolean({
|
|
20
|
+
description: 'Output as JSON',
|
|
21
|
+
default: false,
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
async execute() {
|
|
25
|
+
const { flags } = await this.parse(StatusList);
|
|
26
|
+
// This command requires project context
|
|
27
|
+
const projectId = await this.requireProject();
|
|
28
|
+
// Get the project's workflow ID
|
|
29
|
+
const project = await this.storage.getProject(projectId);
|
|
30
|
+
if (!project?.workflowId) {
|
|
31
|
+
this.error(`Project "${projectId}" has no workflow assigned.`);
|
|
32
|
+
}
|
|
33
|
+
const statuses = await this.storage.listStatuses(project.workflowId);
|
|
34
|
+
if (flags.json) {
|
|
35
|
+
this.log(JSON.stringify(statuses, null, 2));
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (statuses.length === 0) {
|
|
39
|
+
this.log(styles.muted('\nNo statuses found.'));
|
|
40
|
+
this.log(styles.muted('Apply a template: prlt template apply kanban'));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// Group by category
|
|
44
|
+
const grouped = this.groupByCategory(statuses);
|
|
45
|
+
const projectName = await this.getProjectName(projectId);
|
|
46
|
+
this.log(`\n📊 ${styles.emphasis('Workflow Statuses')} - ${projectName}`);
|
|
47
|
+
this.log('═'.repeat(60));
|
|
48
|
+
const categoryEmoji = {
|
|
49
|
+
triage: '📬',
|
|
50
|
+
backlog: '📥',
|
|
51
|
+
unstarted: '📋',
|
|
52
|
+
started: '🚀',
|
|
53
|
+
completed: '✅',
|
|
54
|
+
canceled: '🚫',
|
|
55
|
+
};
|
|
56
|
+
const categoryColors = {
|
|
57
|
+
triage: '#A78BFA', // purple
|
|
58
|
+
backlog: '#9CA3AF', // gray
|
|
59
|
+
unstarted: '#60A5FA', // blue
|
|
60
|
+
started: '#FBBF24', // yellow
|
|
61
|
+
completed: '#34D399', // green
|
|
62
|
+
canceled: '#F87171', // red
|
|
63
|
+
};
|
|
64
|
+
for (const category of STATE_CATEGORY_ORDER) {
|
|
65
|
+
if (flags.category && flags.category !== category)
|
|
66
|
+
continue;
|
|
67
|
+
const categoryStatuses = grouped.get(category);
|
|
68
|
+
if (!categoryStatuses || categoryStatuses.length === 0)
|
|
69
|
+
continue;
|
|
70
|
+
const emoji = categoryEmoji[category];
|
|
71
|
+
this.log(`\n${emoji} ${styles.emphasis(category.toUpperCase())}`);
|
|
72
|
+
this.log('─'.repeat(40));
|
|
73
|
+
for (const status of categoryStatuses) {
|
|
74
|
+
const defaultBadge = status.isDefault ? styles.muted(' (default)') : '';
|
|
75
|
+
const colorPreview = status.color ? `[${status.color}]` : '';
|
|
76
|
+
this.log(` ${status.name}${defaultBadge} ${styles.muted(colorPreview)}`);
|
|
77
|
+
if (status.description) {
|
|
78
|
+
this.log(` ${styles.muted(status.description)}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
this.log('');
|
|
83
|
+
}
|
|
84
|
+
groupByCategory(statuses) {
|
|
85
|
+
const grouped = new Map();
|
|
86
|
+
for (const status of statuses) {
|
|
87
|
+
const existing = grouped.get(status.category) || [];
|
|
88
|
+
existing.push(status);
|
|
89
|
+
grouped.set(status.category, existing);
|
|
90
|
+
}
|
|
91
|
+
return grouped;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class StatusMove extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
position: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
};
|
|
13
|
+
execute(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { Flags, Args } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
4
|
+
import { styles } from '../../lib/styles.js';
|
|
5
|
+
import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
|
|
6
|
+
export default class StatusMove extends PMOCommand {
|
|
7
|
+
static description = 'Reorder a status within its category';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %> my-project-in-review --position 0 # Move to first',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> my-project-blocked --position 2',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> # Interactive mode',
|
|
12
|
+
];
|
|
13
|
+
static args = {
|
|
14
|
+
id: Args.string({
|
|
15
|
+
description: 'Status ID - prompts with dropdown if not provided',
|
|
16
|
+
required: false,
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
static flags = {
|
|
20
|
+
...pmoBaseFlags,
|
|
21
|
+
json: Flags.boolean({
|
|
22
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
23
|
+
default: false,
|
|
24
|
+
}),
|
|
25
|
+
position: Flags.integer({
|
|
26
|
+
char: 'p',
|
|
27
|
+
description: 'New position (0-indexed) within the category',
|
|
28
|
+
required: false,
|
|
29
|
+
}),
|
|
30
|
+
};
|
|
31
|
+
async execute() {
|
|
32
|
+
const { args, flags } = await this.parse(StatusMove);
|
|
33
|
+
// This command requires project context
|
|
34
|
+
const projectId = await this.requireProject();
|
|
35
|
+
// Check if JSON output mode is active
|
|
36
|
+
const jsonMode = shouldOutputJson(flags);
|
|
37
|
+
// Helper to handle errors in JSON mode
|
|
38
|
+
const handleError = (code, message) => {
|
|
39
|
+
if (jsonMode) {
|
|
40
|
+
outputErrorAsJson(code, message, createMetadata('status move', flags));
|
|
41
|
+
this.exit(1);
|
|
42
|
+
}
|
|
43
|
+
this.error(message);
|
|
44
|
+
};
|
|
45
|
+
// Get the project's workflow ID
|
|
46
|
+
const project = await this.storage.getProject(projectId);
|
|
47
|
+
if (!project?.workflowId) {
|
|
48
|
+
return handleError('NO_WORKFLOW', `Project "${projectId}" has no workflow assigned.`);
|
|
49
|
+
}
|
|
50
|
+
// Get status ID - prompt if not provided
|
|
51
|
+
let statusId = args.id;
|
|
52
|
+
if (!statusId) {
|
|
53
|
+
const statuses = await this.storage.listStatuses(project.workflowId);
|
|
54
|
+
if (statuses.length === 0) {
|
|
55
|
+
return handleError('NO_STATUSES', 'No statuses found. Create a status first with "prlt status create".');
|
|
56
|
+
}
|
|
57
|
+
// In JSON mode, output status selection prompt
|
|
58
|
+
if (jsonMode) {
|
|
59
|
+
const statusChoices = statuses.map(s => ({
|
|
60
|
+
name: `${s.name} (${s.category}, position ${s.position})`,
|
|
61
|
+
value: s.id,
|
|
62
|
+
}));
|
|
63
|
+
outputPromptAsJson(buildPromptConfig('list', 'id', 'Select status to move:', statusChoices), createMetadata('status move', flags));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const { selectedId } = await inquirer.prompt([{
|
|
67
|
+
type: 'list',
|
|
68
|
+
name: 'selectedId',
|
|
69
|
+
message: 'Select status to move:',
|
|
70
|
+
choices: statuses.map(s => ({
|
|
71
|
+
name: `${s.name} (${s.category}, position ${s.position})`,
|
|
72
|
+
value: s.id,
|
|
73
|
+
})),
|
|
74
|
+
}]);
|
|
75
|
+
statusId = selectedId;
|
|
76
|
+
}
|
|
77
|
+
// Get existing status
|
|
78
|
+
const existing = await this.storage.getStatus(statusId);
|
|
79
|
+
if (!existing) {
|
|
80
|
+
return handleError('STATUS_NOT_FOUND', `Status not found: ${statusId}`);
|
|
81
|
+
}
|
|
82
|
+
// Get position - prompt if not provided
|
|
83
|
+
let newPosition = flags.position;
|
|
84
|
+
if (newPosition === undefined) {
|
|
85
|
+
// Get statuses in the same category to show valid positions
|
|
86
|
+
const statuses = await this.storage.listStatuses(project.workflowId);
|
|
87
|
+
const categoryStatuses = statuses.filter(s => s.category === existing.category);
|
|
88
|
+
// In JSON mode, output position selection prompt
|
|
89
|
+
if (jsonMode) {
|
|
90
|
+
const positionChoices = categoryStatuses.map((_, idx) => ({
|
|
91
|
+
name: `Position ${idx}${idx === existing.position ? ' (current)' : ''}`,
|
|
92
|
+
value: String(idx),
|
|
93
|
+
}));
|
|
94
|
+
outputPromptAsJson(buildPromptConfig('list', 'position', `New position within ${existing.category} (currently ${existing.position}):`, positionChoices), createMetadata('status move', flags));
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const { position } = await inquirer.prompt([{
|
|
98
|
+
type: 'list',
|
|
99
|
+
name: 'position',
|
|
100
|
+
message: `New position within ${existing.category} (currently ${existing.position}):`,
|
|
101
|
+
choices: categoryStatuses.map((_, idx) => ({
|
|
102
|
+
name: `Position ${idx}${idx === existing.position ? ' (current)' : ''}`,
|
|
103
|
+
value: idx,
|
|
104
|
+
})),
|
|
105
|
+
default: existing.position,
|
|
106
|
+
}]);
|
|
107
|
+
newPosition = position;
|
|
108
|
+
}
|
|
109
|
+
if (newPosition < 0) {
|
|
110
|
+
this.error('Position must be >= 0');
|
|
111
|
+
}
|
|
112
|
+
const updated = await this.storage.reorderStatus(statusId, newPosition);
|
|
113
|
+
if (existing.position === updated.position) {
|
|
114
|
+
this.log(styles.muted(`Status "${updated.name}" is already at position ${updated.position}`));
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
this.log(styles.success(`Moved "${updated.name}" from position ${existing.position} to ${updated.position}`));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class StatusUpdate extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
name: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
category: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
color: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
default: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
interactive: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
16
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
17
|
+
};
|
|
18
|
+
execute(): Promise<void>;
|
|
19
|
+
private promptChanges;
|
|
20
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { Flags, Args } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
4
|
+
import { styles } from '../../lib/styles.js';
|
|
5
|
+
import { STATE_CATEGORY_ORDER } from '../../lib/pmo/types.js';
|
|
6
|
+
import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, buildFormPromptConfig, } from '../../lib/prompt-json.js';
|
|
7
|
+
export default class StatusUpdate extends PMOCommand {
|
|
8
|
+
static description = 'Update a workflow status';
|
|
9
|
+
static examples = [
|
|
10
|
+
'<%= config.bin %> <%= command.id %> my-project-in-review --name "Code Review"',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> my-project-blocked --color "#EF4444"',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> my-project-todo --default # Set as default',
|
|
13
|
+
'<%= config.bin %> <%= command.id %> # Interactive mode',
|
|
14
|
+
];
|
|
15
|
+
static args = {
|
|
16
|
+
id: Args.string({
|
|
17
|
+
description: 'Status ID - prompts with dropdown if not provided',
|
|
18
|
+
required: false,
|
|
19
|
+
}),
|
|
20
|
+
};
|
|
21
|
+
static flags = {
|
|
22
|
+
...pmoBaseFlags,
|
|
23
|
+
json: Flags.boolean({
|
|
24
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
25
|
+
default: false,
|
|
26
|
+
}),
|
|
27
|
+
name: Flags.string({
|
|
28
|
+
char: 'n',
|
|
29
|
+
description: 'New status name',
|
|
30
|
+
}),
|
|
31
|
+
category: Flags.string({
|
|
32
|
+
char: 'c',
|
|
33
|
+
description: 'New category',
|
|
34
|
+
options: ['backlog', 'unstarted', 'started', 'completed', 'canceled'],
|
|
35
|
+
}),
|
|
36
|
+
color: Flags.string({
|
|
37
|
+
description: 'Hex color code (e.g., #FF0000)',
|
|
38
|
+
}),
|
|
39
|
+
description: Flags.string({
|
|
40
|
+
char: 'd',
|
|
41
|
+
description: 'Status description',
|
|
42
|
+
}),
|
|
43
|
+
default: Flags.boolean({
|
|
44
|
+
description: 'Set as default status for new tickets',
|
|
45
|
+
allowNo: true,
|
|
46
|
+
}),
|
|
47
|
+
interactive: Flags.boolean({
|
|
48
|
+
char: 'i',
|
|
49
|
+
description: 'Interactive mode',
|
|
50
|
+
default: false,
|
|
51
|
+
}),
|
|
52
|
+
};
|
|
53
|
+
async execute() {
|
|
54
|
+
const { args, flags } = await this.parse(StatusUpdate);
|
|
55
|
+
// This command requires project context
|
|
56
|
+
const projectId = await this.requireProject();
|
|
57
|
+
// Check if JSON output mode is active
|
|
58
|
+
const jsonMode = shouldOutputJson(flags);
|
|
59
|
+
// Helper to handle errors in JSON mode
|
|
60
|
+
const handleError = (code, message) => {
|
|
61
|
+
if (jsonMode) {
|
|
62
|
+
outputErrorAsJson(code, message, createMetadata('status update', flags));
|
|
63
|
+
this.exit(1);
|
|
64
|
+
}
|
|
65
|
+
this.error(message);
|
|
66
|
+
};
|
|
67
|
+
// Get the project's workflow ID
|
|
68
|
+
const project = await this.storage.getProject(projectId);
|
|
69
|
+
if (!project?.workflowId) {
|
|
70
|
+
return handleError('NO_WORKFLOW', `Project "${projectId}" has no workflow assigned.`);
|
|
71
|
+
}
|
|
72
|
+
// Get status ID - prompt if not provided
|
|
73
|
+
let statusId = args.id;
|
|
74
|
+
if (!statusId) {
|
|
75
|
+
const statuses = await this.storage.listStatuses(project.workflowId);
|
|
76
|
+
if (statuses.length === 0) {
|
|
77
|
+
return handleError('NO_STATUSES', 'No statuses found. Create a status first with "prlt status create".');
|
|
78
|
+
}
|
|
79
|
+
// In JSON mode, output status selection prompt
|
|
80
|
+
if (jsonMode) {
|
|
81
|
+
const statusChoices = statuses.map(s => ({
|
|
82
|
+
name: `${s.name} (${s.category})`,
|
|
83
|
+
value: s.id,
|
|
84
|
+
}));
|
|
85
|
+
outputPromptAsJson(buildPromptConfig('list', 'id', 'Select status to update:', statusChoices), createMetadata('status update', flags));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const { selectedId } = await inquirer.prompt([{
|
|
89
|
+
type: 'list',
|
|
90
|
+
name: 'selectedId',
|
|
91
|
+
message: 'Select status to update:',
|
|
92
|
+
choices: statuses.map(s => ({
|
|
93
|
+
name: `${s.name} (${s.category})`,
|
|
94
|
+
value: s.id,
|
|
95
|
+
})),
|
|
96
|
+
}]);
|
|
97
|
+
statusId = selectedId;
|
|
98
|
+
}
|
|
99
|
+
// Get existing status
|
|
100
|
+
const existing = await this.storage.getStatus(statusId);
|
|
101
|
+
if (!existing) {
|
|
102
|
+
return handleError('STATUS_NOT_FOUND', `Status not found: ${statusId}`);
|
|
103
|
+
}
|
|
104
|
+
let changes;
|
|
105
|
+
// Check if any change flags were provided
|
|
106
|
+
const hasChangeFlags = flags.name !== undefined ||
|
|
107
|
+
flags.category !== undefined ||
|
|
108
|
+
flags.color !== undefined ||
|
|
109
|
+
flags.description !== undefined ||
|
|
110
|
+
flags.default !== undefined;
|
|
111
|
+
// Auto-enter interactive mode if no change flags provided
|
|
112
|
+
if (flags.interactive || !hasChangeFlags) {
|
|
113
|
+
// Build choices once - single source of truth
|
|
114
|
+
const categoryChoices = STATE_CATEGORY_ORDER.map(cat => ({ name: cat, value: cat }));
|
|
115
|
+
// Define fields once - single source of truth for both JSON and interactive modes
|
|
116
|
+
const fields = [
|
|
117
|
+
{ type: 'input', name: 'name', message: 'Status name:', default: existing.name },
|
|
118
|
+
{ type: 'list', name: 'category', message: 'Category:', choices: categoryChoices, default: existing.category },
|
|
119
|
+
{ type: 'input', name: 'color', message: 'Color (hex, optional):', default: existing.color || '' },
|
|
120
|
+
{ type: 'input', name: 'description', message: 'Description (optional):', default: existing.description || '' },
|
|
121
|
+
{ type: 'confirm', name: 'isDefault', message: 'Set as default status for new tickets?', default: existing.isDefault || false },
|
|
122
|
+
];
|
|
123
|
+
// In JSON mode, output form prompts
|
|
124
|
+
if (jsonMode) {
|
|
125
|
+
outputPromptAsJson(buildFormPromptConfig(fields), createMetadata('status update', flags));
|
|
126
|
+
}
|
|
127
|
+
changes = await this.promptChanges(fields, existing);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
changes = {};
|
|
131
|
+
if (flags.name !== undefined)
|
|
132
|
+
changes.name = flags.name;
|
|
133
|
+
if (flags.category !== undefined)
|
|
134
|
+
changes.category = flags.category;
|
|
135
|
+
if (flags.color !== undefined)
|
|
136
|
+
changes.color = flags.color;
|
|
137
|
+
if (flags.description !== undefined)
|
|
138
|
+
changes.description = flags.description;
|
|
139
|
+
if (flags.default !== undefined)
|
|
140
|
+
changes.isDefault = flags.default;
|
|
141
|
+
}
|
|
142
|
+
const updated = await this.storage.updateStatus(statusId, changes);
|
|
143
|
+
this.log(styles.success(`\nUpdated status "${styles.emphasis(updated.name)}"`));
|
|
144
|
+
this.log(styles.muted(` ID: ${updated.id}`));
|
|
145
|
+
this.log(styles.muted(` Category: ${updated.category}`));
|
|
146
|
+
if (updated.color) {
|
|
147
|
+
this.log(styles.muted(` Color: ${updated.color}`));
|
|
148
|
+
}
|
|
149
|
+
if (updated.isDefault) {
|
|
150
|
+
this.log(styles.muted(` Default: yes`));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async promptChanges(fields, existing) {
|
|
154
|
+
// Build inquirer prompts from fields, adding validators
|
|
155
|
+
const answers = await inquirer.prompt(fields.map(field => ({
|
|
156
|
+
...field,
|
|
157
|
+
validate: field.name === 'name'
|
|
158
|
+
? ((input) => input.length > 0 || 'Name is required')
|
|
159
|
+
: field.name === 'color'
|
|
160
|
+
? ((input) => {
|
|
161
|
+
if (!input)
|
|
162
|
+
return true;
|
|
163
|
+
return /^#[0-9A-Fa-f]{6}$/.test(input) || 'Invalid hex color (e.g., #FF0000)';
|
|
164
|
+
})
|
|
165
|
+
: undefined,
|
|
166
|
+
})));
|
|
167
|
+
const changes = {};
|
|
168
|
+
if (answers.name !== existing.name)
|
|
169
|
+
changes.name = answers.name;
|
|
170
|
+
if (answers.category !== existing.category)
|
|
171
|
+
changes.category = answers.category;
|
|
172
|
+
if (answers.color !== (existing.color || ''))
|
|
173
|
+
changes.color = answers.color || undefined;
|
|
174
|
+
if (answers.description !== (existing.description || ''))
|
|
175
|
+
changes.description = answers.description || undefined;
|
|
176
|
+
if (answers.isDefault !== (existing.isDefault || false))
|
|
177
|
+
changes.isDefault = answers.isDefault;
|
|
178
|
+
return changes;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class TemplateDelete extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
type: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
};
|
|
11
|
+
protected getPMOOptions(): {
|
|
12
|
+
promptIfMultiple: boolean;
|
|
13
|
+
};
|
|
14
|
+
execute(): Promise<void>;
|
|
15
|
+
}
|