@proletariat/cli 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +561 -251
- package/bin/dev.cmd +3 -0
- package/bin/dev.js +5 -0
- package/bin/run.cmd +3 -0
- package/bin/run.js +23 -0
- package/dist/commands/action/create.d.ts +21 -0
- package/dist/commands/action/create.js +126 -0
- package/dist/commands/action/delete.d.ts +17 -0
- package/dist/commands/action/delete.js +78 -0
- package/dist/commands/action/index.d.ts +15 -0
- package/dist/commands/action/index.js +107 -0
- package/dist/commands/action/list.d.ts +14 -0
- package/dist/commands/action/list.js +89 -0
- package/dist/commands/action/run.d.ts +19 -0
- package/dist/commands/action/run.js +179 -0
- package/dist/commands/action/show.d.ts +15 -0
- package/dist/commands/action/show.js +47 -0
- package/dist/commands/action/update.d.ts +22 -0
- package/dist/commands/action/update.js +168 -0
- package/dist/commands/agent/index.d.ts +13 -0
- package/dist/commands/agent/index.js +131 -0
- package/dist/commands/agent/list.d.ts +7 -0
- package/dist/commands/agent/list.js +126 -0
- package/dist/commands/agent/login.d.ts +16 -0
- package/dist/commands/agent/login.js +146 -0
- package/dist/commands/agent/rebuild.d.ts +18 -0
- package/dist/commands/agent/rebuild.js +133 -0
- package/dist/commands/agent/restart.d.ts +17 -0
- package/dist/commands/agent/restart.js +116 -0
- package/dist/commands/agent/shell.d.ts +23 -0
- package/dist/commands/agent/shell.js +378 -0
- package/dist/commands/agent/staff/add.d.ts +15 -0
- package/dist/commands/agent/staff/add.js +281 -0
- package/dist/commands/agent/staff/index.d.ts +14 -0
- package/dist/commands/agent/staff/index.js +90 -0
- package/dist/commands/agent/staff/list.d.ts +7 -0
- package/dist/commands/agent/staff/list.js +90 -0
- package/dist/commands/agent/staff/remove.d.ts +16 -0
- package/dist/commands/agent/staff/remove.js +137 -0
- package/dist/commands/agent/status.d.ts +17 -0
- package/dist/commands/agent/status.js +139 -0
- package/dist/commands/agent/temp/cleanup.d.ts +23 -0
- package/dist/commands/agent/temp/cleanup.js +388 -0
- package/dist/commands/agent/temp/index.d.ts +14 -0
- package/dist/commands/agent/temp/index.js +82 -0
- package/dist/commands/agent/temp/list.d.ts +7 -0
- package/dist/commands/agent/temp/list.js +108 -0
- package/dist/commands/agent/themes/add-names.d.ts +10 -0
- package/dist/commands/agent/themes/add-names.js +67 -0
- package/dist/commands/agent/themes/create.d.ts +13 -0
- package/dist/commands/agent/themes/create.js +66 -0
- package/dist/commands/agent/themes/index.d.ts +9 -0
- package/dist/commands/agent/themes/index.js +194 -0
- package/dist/commands/agent/themes/list.d.ts +6 -0
- package/dist/commands/agent/themes/list.js +41 -0
- package/dist/commands/agent/themes/set.d.ts +12 -0
- package/dist/commands/agent/themes/set.js +77 -0
- package/dist/commands/agent/visit.d.ts +16 -0
- package/dist/commands/agent/visit.js +88 -0
- package/dist/commands/autocomplete/setup.d.ts +14 -0
- package/dist/commands/autocomplete/setup.js +154 -0
- package/dist/commands/board/index.d.ts +17 -0
- package/dist/commands/board/index.js +255 -0
- package/dist/commands/board/watch.d.ts +13 -0
- package/dist/commands/board/watch.js +52 -0
- package/dist/commands/branch/create.d.ts +50 -0
- package/dist/commands/branch/create.js +624 -0
- package/dist/commands/branch/index.d.ts +13 -0
- package/dist/commands/branch/index.js +50 -0
- package/dist/commands/branch/list.d.ts +17 -0
- package/dist/commands/branch/list.js +120 -0
- package/dist/commands/branch/validate.d.ts +15 -0
- package/dist/commands/branch/validate.js +73 -0
- package/dist/commands/commit.d.ts +71 -0
- package/dist/commands/commit.js +499 -0
- package/dist/commands/docker/clean.d.ts +13 -0
- package/dist/commands/docker/clean.js +224 -0
- package/dist/commands/docker/index.d.ts +19 -0
- package/dist/commands/docker/index.js +274 -0
- package/dist/commands/docker/list.d.ts +16 -0
- package/dist/commands/docker/list.js +200 -0
- package/dist/commands/docker/logs.d.ts +14 -0
- package/dist/commands/docker/logs.js +118 -0
- package/dist/commands/docker/prune.d.ts +14 -0
- package/dist/commands/docker/prune.js +211 -0
- package/dist/commands/docker/restart.d.ts +14 -0
- package/dist/commands/docker/restart.js +129 -0
- package/dist/commands/docker/shell.d.ts +14 -0
- package/dist/commands/docker/shell.js +103 -0
- package/dist/commands/docker/start.d.ts +12 -0
- package/dist/commands/docker/start.js +92 -0
- package/dist/commands/docker/status.d.ts +7 -0
- package/dist/commands/docker/status.js +40 -0
- package/dist/commands/docker/stop.d.ts +14 -0
- package/dist/commands/docker/stop.js +134 -0
- package/dist/commands/docker/sync.d.ts +15 -0
- package/dist/commands/docker/sync.js +112 -0
- package/dist/commands/epic/activate.d.ts +13 -0
- package/dist/commands/epic/activate.js +118 -0
- package/dist/commands/epic/archive.d.ts +14 -0
- package/dist/commands/epic/archive.js +132 -0
- package/dist/commands/epic/create.d.ts +15 -0
- package/dist/commands/epic/create.js +137 -0
- package/dist/commands/epic/index.d.ts +13 -0
- package/dist/commands/epic/index.js +88 -0
- package/dist/commands/epic/link/block.d.ts +14 -0
- package/dist/commands/epic/link/block.js +79 -0
- package/dist/commands/epic/link/duplicates.d.ts +14 -0
- package/dist/commands/epic/link/duplicates.js +66 -0
- package/dist/commands/epic/link/index.d.ts +19 -0
- package/dist/commands/epic/link/index.js +242 -0
- package/dist/commands/epic/link/relates.d.ts +14 -0
- package/dist/commands/epic/link/relates.js +66 -0
- package/dist/commands/epic/link/remove.d.ts +16 -0
- package/dist/commands/epic/link/remove.js +89 -0
- package/dist/commands/epic/list.d.ts +11 -0
- package/dist/commands/epic/list.js +87 -0
- package/dist/commands/epic/move.d.ts +15 -0
- package/dist/commands/epic/move.js +184 -0
- package/dist/commands/epic/progress.d.ts +16 -0
- package/dist/commands/epic/progress.js +166 -0
- package/dist/commands/epic/project.d.ts +15 -0
- package/dist/commands/epic/project.js +219 -0
- package/dist/commands/epic/reorder.d.ts +21 -0
- package/dist/commands/epic/reorder.js +160 -0
- package/dist/commands/epic/spec.d.ts +15 -0
- package/dist/commands/epic/spec.js +191 -0
- package/dist/commands/epic/ticket.d.ts +18 -0
- package/dist/commands/epic/ticket.js +291 -0
- package/dist/commands/epic/view.d.ts +13 -0
- package/dist/commands/epic/view.js +117 -0
- package/dist/commands/execution/index.d.ts +13 -0
- package/dist/commands/execution/index.js +70 -0
- package/dist/commands/execution/list.d.ts +15 -0
- package/dist/commands/execution/list.js +144 -0
- package/dist/commands/execution/logs.d.ts +18 -0
- package/dist/commands/execution/logs.js +161 -0
- package/dist/commands/execution/stop.d.ts +22 -0
- package/dist/commands/execution/stop.js +248 -0
- package/dist/commands/gh/index.d.ts +9 -0
- package/dist/commands/gh/index.js +53 -0
- package/dist/commands/gh/login.d.ts +6 -0
- package/dist/commands/gh/login.js +57 -0
- package/dist/commands/gh/status.d.ts +6 -0
- package/dist/commands/gh/status.js +48 -0
- package/dist/commands/gh/token.d.ts +6 -0
- package/dist/commands/gh/token.js +59 -0
- package/dist/commands/init.d.ts +26 -0
- package/dist/commands/init.js +200 -0
- package/dist/commands/phase/create.d.ts +22 -0
- package/dist/commands/phase/create.js +123 -0
- package/dist/commands/phase/delete.d.ts +17 -0
- package/dist/commands/phase/delete.js +73 -0
- package/dist/commands/phase/list.d.ts +12 -0
- package/dist/commands/phase/list.js +76 -0
- package/dist/commands/phase/move.d.ts +17 -0
- package/dist/commands/phase/move.js +115 -0
- package/dist/commands/phase/template/apply.d.ts +17 -0
- package/dist/commands/phase/template/apply.js +106 -0
- package/dist/commands/phase/template/create.d.ts +16 -0
- package/dist/commands/phase/template/create.js +58 -0
- package/dist/commands/phase/template/delete.d.ts +17 -0
- package/dist/commands/phase/template/delete.js +98 -0
- package/dist/commands/phase/template/index.d.ts +15 -0
- package/dist/commands/phase/template/index.js +128 -0
- package/dist/commands/phase/template/list.d.ts +16 -0
- package/dist/commands/phase/template/list.js +95 -0
- package/dist/commands/phase/template/update.d.ts +17 -0
- package/dist/commands/phase/template/update.js +89 -0
- package/dist/commands/phase/update.d.ts +23 -0
- package/dist/commands/phase/update.js +174 -0
- package/dist/commands/pmo/init.d.ts +25 -0
- package/dist/commands/pmo/init.js +341 -0
- package/dist/commands/pr/create.d.ts +17 -0
- package/dist/commands/pr/create.js +242 -0
- package/dist/commands/pr/index.d.ts +9 -0
- package/dist/commands/pr/index.js +68 -0
- package/dist/commands/pr/link.d.ts +14 -0
- package/dist/commands/pr/link.js +212 -0
- package/dist/commands/pr/status.d.ts +12 -0
- package/dist/commands/pr/status.js +161 -0
- package/dist/commands/project/archive.d.ts +17 -0
- package/dist/commands/project/archive.js +83 -0
- package/dist/commands/project/create.d.ts +22 -0
- package/dist/commands/project/create.js +143 -0
- package/dist/commands/project/delete.d.ts +17 -0
- package/dist/commands/project/delete.js +128 -0
- package/dist/commands/project/index.d.ts +13 -0
- package/dist/commands/project/index.js +64 -0
- package/dist/commands/project/list.d.ts +14 -0
- package/dist/commands/project/list.js +96 -0
- package/dist/commands/project/spec.d.ts +18 -0
- package/dist/commands/project/spec.js +216 -0
- package/dist/commands/project/unarchive.d.ts +15 -0
- package/dist/commands/project/unarchive.js +35 -0
- package/dist/commands/project/view.d.ts +16 -0
- package/dist/commands/project/view.js +94 -0
- package/dist/commands/repo/add.d.ts +21 -0
- package/dist/commands/repo/add.js +118 -0
- package/dist/commands/repo/index.d.ts +13 -0
- package/dist/commands/repo/index.js +114 -0
- package/dist/commands/repo/list.d.ts +13 -0
- package/dist/commands/repo/list.js +96 -0
- package/dist/commands/repo/remove.d.ts +23 -0
- package/dist/commands/repo/remove.js +217 -0
- package/dist/commands/repo/view.d.ts +15 -0
- package/dist/commands/repo/view.js +99 -0
- package/dist/commands/session/attach.d.ts +40 -0
- package/dist/commands/session/attach.js +307 -0
- package/dist/commands/session/index.d.ts +13 -0
- package/dist/commands/session/index.js +64 -0
- package/dist/commands/session/list.d.ts +21 -0
- package/dist/commands/session/list.js +181 -0
- package/dist/commands/spec/create.d.ts +19 -0
- package/dist/commands/spec/create.js +130 -0
- package/dist/commands/spec/index.d.ts +13 -0
- package/dist/commands/spec/index.js +68 -0
- package/dist/commands/spec/link/depends.d.ts +14 -0
- package/dist/commands/spec/link/depends.js +64 -0
- package/dist/commands/spec/link/duplicates.d.ts +14 -0
- package/dist/commands/spec/link/duplicates.js +63 -0
- package/dist/commands/spec/link/index.d.ts +19 -0
- package/dist/commands/spec/link/index.js +200 -0
- package/dist/commands/spec/link/relates.d.ts +14 -0
- package/dist/commands/spec/link/relates.js +63 -0
- package/dist/commands/spec/link/remove.d.ts +16 -0
- package/dist/commands/spec/link/remove.js +94 -0
- package/dist/commands/spec/list.d.ts +12 -0
- package/dist/commands/spec/list.js +75 -0
- package/dist/commands/spec/plan.d.ts +15 -0
- package/dist/commands/spec/plan.js +108 -0
- package/dist/commands/spec/ticket.d.ts +18 -0
- package/dist/commands/spec/ticket.js +160 -0
- package/dist/commands/spec/view.d.ts +15 -0
- package/dist/commands/spec/view.js +163 -0
- package/dist/commands/status/create.d.ts +21 -0
- package/dist/commands/status/create.js +140 -0
- package/dist/commands/status/delete.d.ts +13 -0
- package/dist/commands/status/delete.js +77 -0
- package/dist/commands/status/index.d.ts +14 -0
- package/dist/commands/status/index.js +91 -0
- package/dist/commands/status/list.d.ts +12 -0
- package/dist/commands/status/list.js +93 -0
- package/dist/commands/status/move.d.ts +14 -0
- package/dist/commands/status/move.js +120 -0
- package/dist/commands/status/update.d.ts +20 -0
- package/dist/commands/status/update.js +180 -0
- package/dist/commands/template/delete.d.ts +15 -0
- package/dist/commands/template/delete.js +142 -0
- package/dist/commands/template/index.d.ts +10 -0
- package/dist/commands/template/index.js +64 -0
- package/dist/commands/template/list.d.ts +18 -0
- package/dist/commands/template/list.js +157 -0
- package/dist/commands/template/phase/apply.d.ts +14 -0
- package/dist/commands/template/phase/apply.js +41 -0
- package/dist/commands/template/phase/create.d.ts +12 -0
- package/dist/commands/template/phase/create.js +29 -0
- package/dist/commands/template/phase/delete.d.ts +13 -0
- package/dist/commands/template/phase/delete.js +34 -0
- package/dist/commands/template/phase/index.d.ts +10 -0
- package/dist/commands/template/phase/index.js +62 -0
- package/dist/commands/template/phase/list.d.ts +11 -0
- package/dist/commands/template/phase/list.js +34 -0
- package/dist/commands/template/phase/update.d.ts +13 -0
- package/dist/commands/template/phase/update.js +35 -0
- package/dist/commands/template/ticket/apply.d.ts +17 -0
- package/dist/commands/template/ticket/apply.js +58 -0
- package/dist/commands/template/ticket/delete.d.ts +13 -0
- package/dist/commands/template/ticket/delete.js +34 -0
- package/dist/commands/template/ticket/index.d.ts +10 -0
- package/dist/commands/template/ticket/index.js +62 -0
- package/dist/commands/template/ticket/list.d.ts +11 -0
- package/dist/commands/template/ticket/list.js +34 -0
- package/dist/commands/template/ticket/save.d.ts +13 -0
- package/dist/commands/template/ticket/save.js +35 -0
- package/dist/commands/ticket/bulk.d.ts +13 -0
- package/dist/commands/ticket/bulk.js +145 -0
- package/dist/commands/ticket/complete.d.ts +16 -0
- package/dist/commands/ticket/complete.js +170 -0
- package/dist/commands/ticket/create.d.ts +22 -0
- package/dist/commands/ticket/create.js +390 -0
- package/dist/commands/ticket/delete.d.ts +16 -0
- package/dist/commands/ticket/delete.js +178 -0
- package/dist/commands/ticket/edit.d.ts +27 -0
- package/dist/commands/ticket/edit.js +322 -0
- package/dist/commands/ticket/epic.d.ts +20 -0
- package/dist/commands/ticket/epic.js +333 -0
- package/dist/commands/ticket/index.d.ts +13 -0
- package/dist/commands/ticket/index.js +103 -0
- package/dist/commands/ticket/link/block.d.ts +14 -0
- package/dist/commands/ticket/link/block.js +94 -0
- package/dist/commands/ticket/link/duplicates.d.ts +14 -0
- package/dist/commands/ticket/link/duplicates.js +93 -0
- package/dist/commands/ticket/link/index.d.ts +19 -0
- package/dist/commands/ticket/link/index.js +239 -0
- package/dist/commands/ticket/link/relates.d.ts +14 -0
- package/dist/commands/ticket/link/relates.js +93 -0
- package/dist/commands/ticket/link/remove.d.ts +16 -0
- package/dist/commands/ticket/link/remove.js +128 -0
- package/dist/commands/ticket/list.d.ts +24 -0
- package/dist/commands/ticket/list.js +431 -0
- package/dist/commands/ticket/move.d.ts +18 -0
- package/dist/commands/ticket/move.js +212 -0
- package/dist/commands/ticket/project.d.ts +18 -0
- package/dist/commands/ticket/project.js +254 -0
- package/dist/commands/ticket/reassign.d.ts +19 -0
- package/dist/commands/ticket/reassign.js +279 -0
- package/dist/commands/ticket/spec.d.ts +18 -0
- package/dist/commands/ticket/spec.js +259 -0
- package/dist/commands/ticket/status.d.ts +13 -0
- package/dist/commands/ticket/status.js +87 -0
- package/dist/commands/ticket/template/apply.d.ts +25 -0
- package/dist/commands/ticket/template/apply.js +249 -0
- package/dist/commands/ticket/template/create.d.ts +19 -0
- package/dist/commands/ticket/template/create.js +210 -0
- package/dist/commands/ticket/template/delete.d.ts +17 -0
- package/dist/commands/ticket/template/delete.js +92 -0
- package/dist/commands/ticket/template/index.d.ts +15 -0
- package/dist/commands/ticket/template/index.js +118 -0
- package/dist/commands/ticket/template/list.d.ts +16 -0
- package/dist/commands/ticket/template/list.js +110 -0
- package/dist/commands/ticket/template/save.d.ts +14 -0
- package/dist/commands/ticket/template/save.js +110 -0
- package/dist/commands/ticket/update.d.ts +18 -0
- package/dist/commands/ticket/update.js +325 -0
- package/dist/commands/ticket/view.d.ts +13 -0
- package/dist/commands/ticket/view.js +80 -0
- package/dist/commands/whoami.d.ts +9 -0
- package/dist/commands/whoami.js +103 -0
- package/dist/commands/work/complete.d.ts +13 -0
- package/dist/commands/work/complete.js +121 -0
- package/dist/commands/work/index.d.ts +13 -0
- package/dist/commands/work/index.js +70 -0
- package/dist/commands/work/ready.d.ts +24 -0
- package/dist/commands/work/ready.js +290 -0
- package/dist/commands/work/revise.d.ts +19 -0
- package/dist/commands/work/revise.js +377 -0
- package/dist/commands/work/spawn-all.d.ts +17 -0
- package/dist/commands/work/spawn-all.js +58 -0
- package/dist/commands/work/spawn.d.ts +29 -0
- package/dist/commands/work/spawn.js +728 -0
- package/dist/commands/work/start.d.ts +39 -0
- package/dist/commands/work/start.js +1393 -0
- package/dist/commands/work/watch.d.ts +31 -0
- package/dist/commands/work/watch.js +359 -0
- package/dist/commands/workflow/create.d.ts +18 -0
- package/dist/commands/workflow/create.js +119 -0
- package/dist/commands/workflow/delete.d.ts +17 -0
- package/dist/commands/workflow/delete.js +119 -0
- package/dist/commands/workflow/index.d.ts +15 -0
- package/dist/commands/workflow/index.js +75 -0
- package/dist/commands/workflow/list.d.ts +15 -0
- package/dist/commands/workflow/list.js +75 -0
- package/dist/commands/workflow/switch.d.ts +13 -0
- package/dist/commands/workflow/switch.js +117 -0
- package/dist/commands/workflow/view.d.ts +16 -0
- package/dist/commands/workflow/view.js +114 -0
- package/dist/commands/workspace/add.d.ts +12 -0
- package/dist/commands/workspace/add.js +74 -0
- package/dist/commands/workspace/list.d.ts +9 -0
- package/dist/commands/workspace/list.js +153 -0
- package/dist/commands/workspace/remove.d.ts +13 -0
- package/dist/commands/workspace/remove.js +98 -0
- package/dist/commands/workspace/use.d.ts +12 -0
- package/dist/commands/workspace/use.js +111 -0
- package/dist/hooks/init.d.ts +11 -0
- package/dist/hooks/init.js +57 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/lib/agents/commands.d.ts +189 -0
- package/dist/lib/agents/commands.js +893 -0
- package/dist/lib/agents/index.d.ts +54 -0
- package/dist/lib/agents/index.js +382 -0
- package/dist/lib/branch/index.d.ts +120 -0
- package/dist/lib/branch/index.js +334 -0
- package/dist/lib/colors.d.ts +94 -0
- package/dist/lib/colors.js +68 -0
- package/dist/lib/commands/docker-command.d.ts +21 -0
- package/dist/lib/commands/docker-command.js +27 -0
- package/dist/lib/database/index.d.ts +176 -0
- package/dist/lib/database/index.js +581 -0
- package/dist/lib/docker/resolve.d.ts +38 -0
- package/dist/lib/docker/resolve.js +175 -0
- package/dist/lib/execution/config.d.ts +150 -0
- package/dist/lib/execution/config.js +541 -0
- package/dist/lib/execution/devcontainer.d.ts +85 -0
- package/dist/lib/execution/devcontainer.js +594 -0
- package/dist/lib/execution/index.d.ts +10 -0
- package/dist/lib/execution/index.js +10 -0
- package/dist/lib/execution/runners.d.ts +53 -0
- package/dist/lib/execution/runners.js +1182 -0
- package/dist/lib/execution/spawner.d.ts +85 -0
- package/dist/lib/execution/spawner.js +548 -0
- package/dist/lib/execution/storage.d.ts +159 -0
- package/dist/lib/execution/storage.js +425 -0
- package/dist/lib/execution/types.d.ts +145 -0
- package/dist/lib/execution/types.js +157 -0
- package/dist/lib/init/index.d.ts +75 -0
- package/dist/lib/init/index.js +355 -0
- package/dist/lib/machine-config.d.ts +170 -0
- package/dist/lib/machine-config.js +386 -0
- package/dist/lib/pmo/base-command.d.ts +195 -0
- package/dist/lib/pmo/base-command.js +319 -0
- package/dist/lib/pmo/create-spec-folders.d.ts +43 -0
- package/dist/lib/pmo/create-spec-folders.js +64 -0
- package/dist/lib/pmo/epic-files.d.ts +56 -0
- package/dist/lib/pmo/epic-files.js +195 -0
- package/dist/lib/pmo/find-pmo.d.ts +14 -0
- package/dist/lib/pmo/find-pmo.js +172 -0
- package/dist/lib/pmo/index.d.ts +109 -0
- package/dist/lib/pmo/index.js +501 -0
- package/dist/lib/pmo/markdown.d.ts +31 -0
- package/dist/lib/pmo/markdown.js +245 -0
- package/dist/lib/pmo/pmo-context.d.ts +27 -0
- package/dist/lib/pmo/pmo-context.js +44 -0
- package/dist/lib/pmo/schema.d.ts +82 -0
- package/dist/lib/pmo/schema.js +531 -0
- package/dist/lib/pmo/spec-parser.d.ts +25 -0
- package/dist/lib/pmo/spec-parser.js +205 -0
- package/dist/lib/pmo/spec-types.d.ts +43 -0
- package/dist/lib/pmo/spec-types.js +7 -0
- package/dist/lib/pmo/storage/actions.d.ts +34 -0
- package/dist/lib/pmo/storage/actions.js +177 -0
- package/dist/lib/pmo/storage/base.d.ts +47 -0
- package/dist/lib/pmo/storage/base.js +858 -0
- package/dist/lib/pmo/storage/dependencies.d.ts +61 -0
- package/dist/lib/pmo/storage/dependencies.js +267 -0
- package/dist/lib/pmo/storage/epics.d.ts +46 -0
- package/dist/lib/pmo/storage/epics.js +243 -0
- package/dist/lib/pmo/storage/helpers.d.ts +33 -0
- package/dist/lib/pmo/storage/helpers.js +148 -0
- package/dist/lib/pmo/storage/index.d.ts +186 -0
- package/dist/lib/pmo/storage/index.js +689 -0
- package/dist/lib/pmo/storage/phases.d.ts +65 -0
- package/dist/lib/pmo/storage/phases.js +392 -0
- package/dist/lib/pmo/storage/projects.d.ts +79 -0
- package/dist/lib/pmo/storage/projects.js +303 -0
- package/dist/lib/pmo/storage/specs.d.ts +77 -0
- package/dist/lib/pmo/storage/specs.js +389 -0
- package/dist/lib/pmo/storage/statuses.d.ts +63 -0
- package/dist/lib/pmo/storage/statuses.js +404 -0
- package/dist/lib/pmo/storage/subtasks.d.ts +37 -0
- package/dist/lib/pmo/storage/subtasks.js +184 -0
- package/dist/lib/pmo/storage/templates.d.ts +40 -0
- package/dist/lib/pmo/storage/templates.js +210 -0
- package/dist/lib/pmo/storage/tickets.d.ts +57 -0
- package/dist/lib/pmo/storage/tickets.js +453 -0
- package/dist/lib/pmo/storage/types.d.ts +200 -0
- package/dist/lib/pmo/storage/types.js +5 -0
- package/dist/lib/pmo/storage/views.d.ts +44 -0
- package/dist/lib/pmo/storage/views.js +355 -0
- package/dist/lib/pmo/storage-sqlite.d.ts +7 -0
- package/dist/lib/pmo/storage-sqlite.js +7 -0
- package/dist/lib/pmo/sync-manager.d.ts +92 -0
- package/dist/lib/pmo/sync-manager.js +229 -0
- package/dist/lib/pmo/types.d.ts +710 -0
- package/dist/lib/pmo/types.js +108 -0
- package/dist/lib/pmo/utils.d.ts +122 -0
- package/dist/lib/pmo/utils.js +174 -0
- package/dist/lib/pmo/watcher.d.ts +43 -0
- package/dist/lib/pmo/watcher.js +208 -0
- package/dist/lib/pr/index.d.ts +150 -0
- package/dist/lib/pr/index.js +483 -0
- package/dist/lib/prompt-json.d.ts +231 -0
- package/dist/lib/prompt-json.js +213 -0
- package/dist/lib/repos/index.d.ts +81 -0
- package/dist/lib/repos/index.js +679 -0
- package/dist/lib/styles.d.ts +98 -0
- package/dist/lib/styles.js +195 -0
- package/dist/lib/themes.d.ts +128 -0
- package/dist/lib/themes.js +301 -0
- package/dist/lib/ui/BoardUI.d.ts +21 -0
- package/dist/lib/ui/BoardUI.js +85 -0
- package/dist/lib/ui/ClaimTicketUI.d.ts +17 -0
- package/dist/lib/ui/ClaimTicketUI.js +64 -0
- package/dist/lib/ui/CreateTicketUI.d.ts +13 -0
- package/dist/lib/ui/CreateTicketUI.js +101 -0
- package/dist/lib/workspace.d.ts +66 -0
- package/dist/lib/workspace.js +204 -0
- package/oclif.manifest.json +10593 -0
- package/package.json +103 -56
- package/LICENSE +0 -21
- package/dist/bin/prlt.d.ts +0 -11
- package/dist/bin/prlt.d.ts.map +0 -1
- package/dist/bin/prlt.js +0 -144
- package/dist/bin/prlt.js.map +0 -1
- package/dist/lib/config/index.d.ts +0 -14
- package/dist/lib/config/index.d.ts.map +0 -1
- package/dist/lib/config/index.js +0 -142
- package/dist/lib/config/index.js.map +0 -1
- package/dist/lib/config/upgrade.d.ts +0 -2
- package/dist/lib/config/upgrade.d.ts.map +0 -1
- package/dist/lib/config/upgrade.js +0 -248
- package/dist/lib/config/upgrade.js.map +0 -1
- package/dist/lib/themes/index.d.ts +0 -8
- package/dist/lib/themes/index.d.ts.map +0 -1
- package/dist/lib/themes/index.js +0 -80
- package/dist/lib/themes/index.js.map +0 -1
- package/dist/lib/utils/helpers.d.ts +0 -4
- package/dist/lib/utils/helpers.d.ts.map +0 -1
- package/dist/lib/utils/helpers.js +0 -39
- package/dist/lib/utils/helpers.js.map +0 -1
- package/dist/lib/utils/logger.d.ts +0 -4
- package/dist/lib/utils/logger.d.ts.map +0 -1
- package/dist/lib/utils/logger.js +0 -28
- package/dist/lib/utils/logger.js.map +0 -1
- package/dist/lib/workspace/index.d.ts +0 -13
- package/dist/lib/workspace/index.d.ts.map +0 -1
- package/dist/lib/workspace/index.js +0 -116
- package/dist/lib/workspace/index.js.map +0 -1
- package/dist/lib/worktree/index.d.ts +0 -7
- package/dist/lib/worktree/index.d.ts.map +0 -1
- package/dist/lib/worktree/index.js +0 -362
- package/dist/lib/worktree/index.js.map +0 -1
- package/dist/lib/worktree/migrate.d.ts +0 -2
- package/dist/lib/worktree/migrate.d.ts.map +0 -1
- package/dist/lib/worktree/migrate.js +0 -214
- package/dist/lib/worktree/migrate.js.map +0 -1
- package/dist/lib/worktree/repair.d.ts +0 -3
- package/dist/lib/worktree/repair.d.ts.map +0 -1
- package/dist/lib/worktree/repair.js +0 -320
- package/dist/lib/worktree/repair.js.map +0 -1
- package/dist/types/index.d.ts +0 -57
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -3
- package/dist/types/index.js.map +0 -1
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { autoExportToBoard, PMOCommand, pmoBaseFlags, } from '../../lib/pmo/index.js';
|
|
4
|
+
import { styles } from '../../lib/styles.js';
|
|
5
|
+
import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
6
|
+
export default class TicketComplete extends PMOCommand {
|
|
7
|
+
static description = 'Mark ticket(s) as complete (move to Done column)';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %>',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> TICK-001',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> --bulk',
|
|
12
|
+
];
|
|
13
|
+
static args = {
|
|
14
|
+
ticketId: Args.string({
|
|
15
|
+
description: 'Ticket 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
|
+
bulk: Flags.boolean({
|
|
26
|
+
char: 'b',
|
|
27
|
+
description: 'Enable bulk mode to complete multiple tickets',
|
|
28
|
+
default: false,
|
|
29
|
+
}),
|
|
30
|
+
force: Flags.boolean({
|
|
31
|
+
char: 'f',
|
|
32
|
+
description: 'Skip confirmation prompt (bulk mode only)',
|
|
33
|
+
default: false,
|
|
34
|
+
}),
|
|
35
|
+
};
|
|
36
|
+
async execute() {
|
|
37
|
+
const { args, flags } = await this.parse(TicketComplete);
|
|
38
|
+
const projectId = flags.project;
|
|
39
|
+
// Check if JSON output mode is active
|
|
40
|
+
const jsonMode = shouldOutputJson(flags);
|
|
41
|
+
// Helper to handle errors in JSON mode
|
|
42
|
+
const handleError = (code, message) => {
|
|
43
|
+
if (jsonMode) {
|
|
44
|
+
outputErrorAsJson(code, message, createMetadata('ticket complete', flags));
|
|
45
|
+
this.exit(1);
|
|
46
|
+
}
|
|
47
|
+
this.error(message);
|
|
48
|
+
};
|
|
49
|
+
// Get all incomplete tickets
|
|
50
|
+
const allTickets = await this.storage.listTickets(projectId);
|
|
51
|
+
const incompleteTickets = allTickets.filter(t => t.statusName && !t.statusName.toLowerCase().includes('done'));
|
|
52
|
+
if (incompleteTickets.length === 0) {
|
|
53
|
+
if (jsonMode) {
|
|
54
|
+
outputErrorAsJson('NO_INCOMPLETE_TICKETS', 'No incomplete tickets found. All tickets are done!', createMetadata('ticket complete', flags));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
this.log(styles.info('No incomplete tickets found. All tickets are done!'));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// Get board for columns (use the first incomplete ticket's project)
|
|
61
|
+
const board = await this.storage.getBoard(incompleteTickets[0].projectId);
|
|
62
|
+
// Find the "Done" column (case-insensitive)
|
|
63
|
+
const doneColumn = board.columns.find(col => col.name.toLowerCase().includes('done'));
|
|
64
|
+
if (!doneColumn) {
|
|
65
|
+
return handleError('NO_DONE_COLUMN', 'No "Done" column found in board configuration.');
|
|
66
|
+
}
|
|
67
|
+
// Bulk mode
|
|
68
|
+
if (flags.bulk) {
|
|
69
|
+
await this.executeBulk(incompleteTickets, doneColumn.name, flags.force);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Single ticket mode
|
|
73
|
+
let ticketId = args.ticketId;
|
|
74
|
+
if (!ticketId) {
|
|
75
|
+
const selected = await this.selectFromList({
|
|
76
|
+
message: 'Select ticket to mark complete:',
|
|
77
|
+
items: incompleteTickets,
|
|
78
|
+
getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
|
|
79
|
+
getValue: (t) => t.id,
|
|
80
|
+
getCommand: (t) => `prlt ticket complete ${t.id} --json`,
|
|
81
|
+
jsonMode: jsonMode ? { flags, commandName: 'ticket complete' } : null,
|
|
82
|
+
});
|
|
83
|
+
if (!selected) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
ticketId = selected;
|
|
87
|
+
}
|
|
88
|
+
// Get ticket
|
|
89
|
+
const ticket = await this.storage.getTicket(ticketId);
|
|
90
|
+
if (!ticket) {
|
|
91
|
+
this.error(`Ticket "${ticketId}" not found.`);
|
|
92
|
+
}
|
|
93
|
+
// Move to Done column
|
|
94
|
+
await this.storage.moveTicket(ticket.projectId, ticketId, doneColumn.name);
|
|
95
|
+
// Auto-export to board.md if configured
|
|
96
|
+
await autoExportToBoard(this.pmoPath, this.storage);
|
|
97
|
+
this.log(styles.success(`✅ Completed ${ticketId}`));
|
|
98
|
+
this.log(styles.muted(` Title: ${ticket.title}`));
|
|
99
|
+
this.log(styles.muted(` Moved to: ${doneColumn.name}`));
|
|
100
|
+
}
|
|
101
|
+
async executeBulk(incompleteTickets, doneColumnName, force) {
|
|
102
|
+
this.log(styles.emphasis('✅ Complete Multiple Tickets\n'));
|
|
103
|
+
// Select tickets to complete
|
|
104
|
+
const { selectedTickets } = await inquirer.prompt([{
|
|
105
|
+
type: 'checkbox',
|
|
106
|
+
name: 'selectedTickets',
|
|
107
|
+
message: 'Select tickets to mark as COMPLETE:',
|
|
108
|
+
choices: incompleteTickets.map(t => ({
|
|
109
|
+
name: `${t.id} - ${t.title} (${t.statusName})`,
|
|
110
|
+
value: t.id,
|
|
111
|
+
})),
|
|
112
|
+
}]);
|
|
113
|
+
if (selectedTickets.length === 0) {
|
|
114
|
+
this.log(styles.muted('No tickets selected.'));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// Confirmation
|
|
118
|
+
if (!force) {
|
|
119
|
+
this.log(styles.primary('\nWill mark as complete:'));
|
|
120
|
+
for (const ticketId of selectedTickets) {
|
|
121
|
+
const ticket = incompleteTickets.find(t => t.id === ticketId);
|
|
122
|
+
this.log(styles.primary(` • ${ticketId}: ${ticket?.title}`));
|
|
123
|
+
}
|
|
124
|
+
this.log(styles.primary(` → Move to: ${doneColumnName}\n`));
|
|
125
|
+
const { confirm } = await inquirer.prompt([{
|
|
126
|
+
type: 'list',
|
|
127
|
+
name: 'confirm',
|
|
128
|
+
message: 'Continue?',
|
|
129
|
+
choices: [
|
|
130
|
+
{ name: 'No, cancel', value: false },
|
|
131
|
+
{ name: 'Yes, complete tickets', value: true }
|
|
132
|
+
],
|
|
133
|
+
default: 1
|
|
134
|
+
}]);
|
|
135
|
+
if (!confirm) {
|
|
136
|
+
this.log(styles.muted('Operation cancelled.'));
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
this.log('');
|
|
141
|
+
// Complete each ticket
|
|
142
|
+
let successCount = 0;
|
|
143
|
+
let failCount = 0;
|
|
144
|
+
for (const ticketId of selectedTickets) {
|
|
145
|
+
try {
|
|
146
|
+
const ticket = incompleteTickets.find(t => t.id === ticketId);
|
|
147
|
+
if (!ticket) {
|
|
148
|
+
throw new Error('Ticket not found in incomplete tickets list');
|
|
149
|
+
}
|
|
150
|
+
await this.storage.moveTicket(ticket.projectId, ticketId, doneColumnName);
|
|
151
|
+
this.log(styles.success(`Completed ${ticketId}`));
|
|
152
|
+
successCount++;
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
this.log(styles.error(`Failed to complete ${ticketId}: ${error instanceof Error ? error.message : String(error)}`));
|
|
156
|
+
failCount++;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Auto-export to kanban.md
|
|
160
|
+
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
161
|
+
// Summary
|
|
162
|
+
this.log('');
|
|
163
|
+
if (successCount > 0) {
|
|
164
|
+
this.log(styles.success(`Completed ${successCount} ticket(s)`));
|
|
165
|
+
}
|
|
166
|
+
if (failCount > 0) {
|
|
167
|
+
this.log(styles.error(`Failed to complete ${failCount} ticket(s)`));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class TicketCreate extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
title: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
column: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
priority: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
category: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
id: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
interactive: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
epic: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
+
template: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
+
labels: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
17
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
18
|
+
};
|
|
19
|
+
execute(): Promise<void>;
|
|
20
|
+
private promptTicketData;
|
|
21
|
+
private promptStructuredDescription;
|
|
22
|
+
}
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { autoExportToBoard, PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
4
|
+
import { styles } from '../../lib/styles.js';
|
|
5
|
+
import { updateEpicTicketsSection } from '../../lib/pmo/epic-files.js';
|
|
6
|
+
import { PRIORITIES, PRIORITY_LABELS } from '../../lib/pmo/types.js';
|
|
7
|
+
import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
|
|
8
|
+
export default class TicketCreate extends PMOCommand {
|
|
9
|
+
static description = 'Create a new ticket on the PMO board';
|
|
10
|
+
static examples = [
|
|
11
|
+
'<%= config.bin %> <%= command.id %>',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> --title "Fix login bug" --column Backlog',
|
|
13
|
+
'<%= config.bin %> <%= command.id %> -t "Add feature" -c "In Progress" -p HIGH',
|
|
14
|
+
'<%= config.bin %> <%= command.id %> --project mobile-app -t "New feature"',
|
|
15
|
+
'<%= config.bin %> <%= command.id %> --epic EPIC-001 -t "Implement auth flow"',
|
|
16
|
+
'<%= config.bin %> <%= command.id %> --json # Output column choices as JSON',
|
|
17
|
+
];
|
|
18
|
+
static flags = {
|
|
19
|
+
...pmoBaseFlags,
|
|
20
|
+
json: Flags.boolean({
|
|
21
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
22
|
+
default: false,
|
|
23
|
+
}),
|
|
24
|
+
title: Flags.string({
|
|
25
|
+
char: 't',
|
|
26
|
+
description: 'Ticket title',
|
|
27
|
+
}),
|
|
28
|
+
column: Flags.string({
|
|
29
|
+
char: 'c',
|
|
30
|
+
description: 'Column to place the ticket in',
|
|
31
|
+
}),
|
|
32
|
+
priority: Flags.string({
|
|
33
|
+
char: 'p',
|
|
34
|
+
description: 'Ticket priority',
|
|
35
|
+
options: [...PRIORITIES],
|
|
36
|
+
}),
|
|
37
|
+
category: Flags.string({
|
|
38
|
+
description: 'Ticket category (e.g., bug, feature, refactor)',
|
|
39
|
+
}),
|
|
40
|
+
description: Flags.string({
|
|
41
|
+
char: 'd',
|
|
42
|
+
description: 'Ticket description',
|
|
43
|
+
}),
|
|
44
|
+
id: Flags.string({
|
|
45
|
+
description: 'Custom ticket ID (auto-generated if not provided)',
|
|
46
|
+
}),
|
|
47
|
+
interactive: Flags.boolean({
|
|
48
|
+
char: 'i',
|
|
49
|
+
description: 'Interactive mode',
|
|
50
|
+
default: false,
|
|
51
|
+
}),
|
|
52
|
+
epic: Flags.string({
|
|
53
|
+
char: 'e',
|
|
54
|
+
description: 'Link ticket to an epic (e.g., EPIC-001)',
|
|
55
|
+
}),
|
|
56
|
+
template: Flags.string({
|
|
57
|
+
char: 'T',
|
|
58
|
+
description: 'Create from a template (e.g., bug-report, feature-request)',
|
|
59
|
+
}),
|
|
60
|
+
labels: Flags.string({
|
|
61
|
+
char: 'l',
|
|
62
|
+
description: 'Labels (comma-separated)',
|
|
63
|
+
}),
|
|
64
|
+
};
|
|
65
|
+
async execute() {
|
|
66
|
+
const { flags } = await this.parse(TicketCreate);
|
|
67
|
+
// Get project and board info (pass JSON mode config for AI agents)
|
|
68
|
+
const projectId = await this.requireProject({
|
|
69
|
+
jsonMode: {
|
|
70
|
+
flags,
|
|
71
|
+
commandName: 'ticket create',
|
|
72
|
+
baseCommand: 'prlt ticket create',
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
const board = await this.storage.getBoard(projectId);
|
|
76
|
+
const columns = board.columns.map(c => c.name);
|
|
77
|
+
const projectName = await this.getProjectName(projectId);
|
|
78
|
+
// Check if JSON output mode is active
|
|
79
|
+
const jsonMode = shouldOutputJson(flags);
|
|
80
|
+
// Helper to handle errors in JSON mode
|
|
81
|
+
const handleError = (code, message) => {
|
|
82
|
+
if (jsonMode) {
|
|
83
|
+
outputErrorAsJson(code, message, createMetadata('ticket create', flags));
|
|
84
|
+
this.exit(1);
|
|
85
|
+
}
|
|
86
|
+
this.error(message);
|
|
87
|
+
};
|
|
88
|
+
// In JSON mode without required data, output column selection prompt
|
|
89
|
+
if (jsonMode && !flags.title && !flags.column) {
|
|
90
|
+
// Build base command with project if specified
|
|
91
|
+
const baseCmd = flags.project
|
|
92
|
+
? `prlt ticket create -P ${flags.project}`
|
|
93
|
+
: 'prlt ticket create';
|
|
94
|
+
const columnChoices = columns.map(c => ({
|
|
95
|
+
name: c,
|
|
96
|
+
value: c,
|
|
97
|
+
command: `${baseCmd} --column "${c}" --json`,
|
|
98
|
+
}));
|
|
99
|
+
outputPromptAsJson(buildPromptConfig('list', 'column', 'Select column to place the ticket in:', columnChoices), createMetadata('ticket create', flags));
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
// Validate epic if provided
|
|
103
|
+
if (flags.epic) {
|
|
104
|
+
const epic = await this.storage.getEpic(flags.epic);
|
|
105
|
+
if (!epic) {
|
|
106
|
+
return handleError('EPIC_NOT_FOUND', `Epic not found: ${flags.epic}. Use 'prlt epic list' to see available epics.`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Load template if specified
|
|
110
|
+
let template = null;
|
|
111
|
+
if (flags.template) {
|
|
112
|
+
template = await this.storage.getTicketTemplate(flags.template);
|
|
113
|
+
if (!template) {
|
|
114
|
+
this.error(`Template not found: ${flags.template}. Run 'prlt ticket template list' to see available templates.`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Parse labels from flag
|
|
118
|
+
const labelsFromFlag = flags.labels
|
|
119
|
+
? flags.labels.split(',').map(l => l.trim()).filter(l => l)
|
|
120
|
+
: undefined;
|
|
121
|
+
// Get ticket data (interactive or from flags)
|
|
122
|
+
let ticketData;
|
|
123
|
+
// In JSON mode with column but no title, output required fields info
|
|
124
|
+
if (jsonMode && flags.column && !flags.title) {
|
|
125
|
+
const baseCmd = flags.project
|
|
126
|
+
? `prlt ticket create -P ${flags.project} --column "${flags.column}"`
|
|
127
|
+
: `prlt ticket create --column "${flags.column}"`;
|
|
128
|
+
outputPromptAsJson({
|
|
129
|
+
type: 'input',
|
|
130
|
+
name: 'title',
|
|
131
|
+
message: 'Enter ticket title:',
|
|
132
|
+
context: {
|
|
133
|
+
hint: `Provide title with: ${baseCmd} --title "Your title here"`,
|
|
134
|
+
requiredFields: ['--title'],
|
|
135
|
+
optionalFields: ['--priority', '--category', '--description', '--epic', '--labels'],
|
|
136
|
+
example: `${baseCmd} --title "Fix login bug" --priority P1 --category bug`,
|
|
137
|
+
},
|
|
138
|
+
}, createMetadata('ticket create', flags));
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (flags.interactive || !flags.title) {
|
|
142
|
+
ticketData = await this.promptTicketData(flags, this.storage, template, columns);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
if (!flags.title && !template?.titlePattern) {
|
|
146
|
+
this.error('Title is required. Use --title or -t flag, or use --interactive mode.');
|
|
147
|
+
}
|
|
148
|
+
ticketData = {
|
|
149
|
+
title: flags.title || template?.titlePattern || '',
|
|
150
|
+
statusName: flags.column || columns[0],
|
|
151
|
+
priority: flags.priority || template?.defaultPriority,
|
|
152
|
+
category: flags.category || template?.defaultCategory,
|
|
153
|
+
description: flags.description || template?.descriptionTemplate,
|
|
154
|
+
id: flags.id,
|
|
155
|
+
epicId: flags.epic,
|
|
156
|
+
labels: labelsFromFlag || template?.defaultLabels,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
// Validate status/column
|
|
160
|
+
if (!columns.includes(ticketData.statusName)) {
|
|
161
|
+
this.error(`Invalid column "${ticketData.statusName}". Available columns: ${columns.join(', ')}`);
|
|
162
|
+
}
|
|
163
|
+
const ticket = await this.storage.createTicket(projectId, {
|
|
164
|
+
id: ticketData.id,
|
|
165
|
+
title: ticketData.title,
|
|
166
|
+
statusName: ticketData.statusName,
|
|
167
|
+
priority: ticketData.priority,
|
|
168
|
+
category: ticketData.category,
|
|
169
|
+
description: ticketData.description,
|
|
170
|
+
epicId: ticketData.epicId,
|
|
171
|
+
labels: ticketData.labels,
|
|
172
|
+
});
|
|
173
|
+
// Add subtasks from template if applicable
|
|
174
|
+
if (template && template.suggestedSubtasks.length > 0) {
|
|
175
|
+
for (const subtask of template.suggestedSubtasks) {
|
|
176
|
+
await this.storage.addSubtask(ticket.id, subtask.title);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Auto-export to board.md after write
|
|
180
|
+
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
181
|
+
// If linked to an epic, update the epic's markdown file with ticket list
|
|
182
|
+
if (ticketData.epicId) {
|
|
183
|
+
const epic = await this.storage.getEpic(ticketData.epicId);
|
|
184
|
+
if (epic) {
|
|
185
|
+
const epicTickets = await this.storage.getTicketsForEpic(projectId, ticketData.epicId);
|
|
186
|
+
const ticketInfos = epicTickets.map(t => ({
|
|
187
|
+
id: t.id,
|
|
188
|
+
title: t.title,
|
|
189
|
+
status: t.statusName || 'Unknown',
|
|
190
|
+
priority: t.priority,
|
|
191
|
+
}));
|
|
192
|
+
updateEpicTicketsSection(this.pmoPath, ticketData.epicId, epic.status, ticketInfos, projectId);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
this.log(styles.success(`\n✅ Created ticket ${styles.emphasis(ticket.id)} in project ${styles.emphasis(projectName)}`));
|
|
196
|
+
if (template) {
|
|
197
|
+
this.log(styles.muted(` Template: ${template.name}`));
|
|
198
|
+
}
|
|
199
|
+
this.log(styles.muted(` Title: ${ticket.title}`));
|
|
200
|
+
this.log(styles.muted(` Status: ${ticket.statusName}`));
|
|
201
|
+
if (ticket.priority) {
|
|
202
|
+
this.log(styles.muted(` Priority: ${ticket.priority}`));
|
|
203
|
+
}
|
|
204
|
+
if (ticket.category) {
|
|
205
|
+
this.log(styles.muted(` Category: ${ticket.category}`));
|
|
206
|
+
}
|
|
207
|
+
if (ticketData.epicId) {
|
|
208
|
+
this.log(styles.muted(` Epic: ${ticketData.epicId}`));
|
|
209
|
+
}
|
|
210
|
+
if (ticketData.labels && ticketData.labels.length > 0) {
|
|
211
|
+
this.log(styles.muted(` Labels: ${ticketData.labels.join(', ')}`));
|
|
212
|
+
}
|
|
213
|
+
if (template && template.suggestedSubtasks.length > 0) {
|
|
214
|
+
this.log(styles.muted(` Subtasks: ${template.suggestedSubtasks.length} created`));
|
|
215
|
+
}
|
|
216
|
+
this.log(styles.muted(`\n View board: prlt board`));
|
|
217
|
+
this.log(styles.muted(` List tickets: prlt ticket list`));
|
|
218
|
+
}
|
|
219
|
+
async promptTicketData(flags, storage, existingTemplate, columns) {
|
|
220
|
+
// If no template was specified via flag, offer to select one
|
|
221
|
+
let template = existingTemplate;
|
|
222
|
+
if (!template && !flags.template) {
|
|
223
|
+
const templates = await storage.listTicketTemplates();
|
|
224
|
+
if (templates.length > 0) {
|
|
225
|
+
const { selectedTemplate } = await inquirer.prompt([
|
|
226
|
+
{
|
|
227
|
+
type: 'list',
|
|
228
|
+
name: 'selectedTemplate',
|
|
229
|
+
message: 'Start from a template?',
|
|
230
|
+
choices: [
|
|
231
|
+
{ name: 'No template (blank ticket)', value: '' },
|
|
232
|
+
new inquirer.Separator('── Templates ──'),
|
|
233
|
+
...templates.map(t => ({
|
|
234
|
+
name: `${t.name}${t.isBuiltin ? '' : ' [custom]'} - ${t.description || ''}`,
|
|
235
|
+
value: t.id,
|
|
236
|
+
})),
|
|
237
|
+
],
|
|
238
|
+
},
|
|
239
|
+
]);
|
|
240
|
+
if (selectedTemplate) {
|
|
241
|
+
template = templates.find(t => t.id === selectedTemplate) || null;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
const answers = await inquirer.prompt([
|
|
246
|
+
{
|
|
247
|
+
type: 'input',
|
|
248
|
+
name: 'title',
|
|
249
|
+
message: 'Ticket title:',
|
|
250
|
+
default: flags.title || template?.titlePattern,
|
|
251
|
+
validate: (input) => input.length > 0 || 'Title is required',
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
type: 'list',
|
|
255
|
+
name: 'column',
|
|
256
|
+
message: 'Column:',
|
|
257
|
+
choices: columns,
|
|
258
|
+
default: flags.column || columns[0],
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
type: 'list',
|
|
262
|
+
name: 'priority',
|
|
263
|
+
message: 'Priority:',
|
|
264
|
+
choices: [
|
|
265
|
+
{ name: 'None', value: undefined },
|
|
266
|
+
...PRIORITIES.map(p => ({ name: PRIORITY_LABELS[p], value: p })),
|
|
267
|
+
],
|
|
268
|
+
default: flags.priority || template?.defaultPriority,
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
type: 'list',
|
|
272
|
+
name: 'categoryChoice',
|
|
273
|
+
message: 'Category:',
|
|
274
|
+
choices: [
|
|
275
|
+
{ name: 'Skip (none)', value: '' },
|
|
276
|
+
new inquirer.Separator('── Conventional Commits ──'),
|
|
277
|
+
{ name: 'feature - New feature or capability', value: 'feature' },
|
|
278
|
+
{ name: 'bug - Bug fix', value: 'bug' },
|
|
279
|
+
{ name: 'refactor - Code refactoring', value: 'refactor' },
|
|
280
|
+
{ name: 'docs - Documentation', value: 'docs' },
|
|
281
|
+
{ name: 'test - Test additions/fixes', value: 'test' },
|
|
282
|
+
{ name: 'chore - Maintenance tasks', value: 'chore' },
|
|
283
|
+
{ name: 'performance - Performance improvements', value: 'performance' },
|
|
284
|
+
{ name: 'ci - CI/CD changes', value: 'ci' },
|
|
285
|
+
{ name: 'build - Build system changes', value: 'build' },
|
|
286
|
+
new inquirer.Separator('── Extended Types ──'),
|
|
287
|
+
{ name: 'security - Security fixes', value: 'security' },
|
|
288
|
+
{ name: 'database - Database migrations', value: 'database' },
|
|
289
|
+
{ name: 'release - Release preparation', value: 'release' },
|
|
290
|
+
new inquirer.Separator('── 5Tool Founder ──'),
|
|
291
|
+
{ name: 'ship - Shipping and deployment', value: 'ship' },
|
|
292
|
+
{ name: 'growth - Growth and marketing', value: 'growth' },
|
|
293
|
+
{ name: 'support - Customer experience', value: 'support' },
|
|
294
|
+
{ name: 'strategy - Strategy and planning', value: 'strategy' },
|
|
295
|
+
{ name: 'ops - Business operations', value: 'ops' },
|
|
296
|
+
new inquirer.Separator('───────────────────'),
|
|
297
|
+
{ name: 'Custom...', value: '__custom__' },
|
|
298
|
+
],
|
|
299
|
+
default: flags.category || template?.defaultCategory || '',
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
type: 'input',
|
|
303
|
+
name: 'customCategory',
|
|
304
|
+
message: 'Enter custom category:',
|
|
305
|
+
when: (answers) => answers.categoryChoice === '__custom__',
|
|
306
|
+
validate: (input) => input.length > 0 || 'Category is required when choosing custom',
|
|
307
|
+
},
|
|
308
|
+
]);
|
|
309
|
+
// Resolve category from choice or custom input
|
|
310
|
+
const category = answers.categoryChoice === '__custom__'
|
|
311
|
+
? answers.customCategory
|
|
312
|
+
: answers.categoryChoice || undefined;
|
|
313
|
+
// Prompt for structured description (use template description if available)
|
|
314
|
+
const description = await this.promptStructuredDescription(flags.description || template?.descriptionTemplate);
|
|
315
|
+
// Parse labels from flag or use template defaults
|
|
316
|
+
const labels = flags.labels
|
|
317
|
+
? flags.labels.split(',').map(l => l.trim()).filter(l => l)
|
|
318
|
+
: template?.defaultLabels;
|
|
319
|
+
return {
|
|
320
|
+
title: answers.title,
|
|
321
|
+
statusName: answers.column,
|
|
322
|
+
priority: answers.priority || undefined,
|
|
323
|
+
category,
|
|
324
|
+
description: description || undefined,
|
|
325
|
+
id: flags.id,
|
|
326
|
+
epicId: flags.epic,
|
|
327
|
+
labels,
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
async promptStructuredDescription(existingDescription) {
|
|
331
|
+
// If description already provided via flag, use it
|
|
332
|
+
if (existingDescription) {
|
|
333
|
+
return existingDescription;
|
|
334
|
+
}
|
|
335
|
+
this.log(styles.muted('\n─── Ticket Description (for agent execution) ───'));
|
|
336
|
+
const descAnswers = await inquirer.prompt([
|
|
337
|
+
{
|
|
338
|
+
type: 'input',
|
|
339
|
+
name: 'what',
|
|
340
|
+
message: 'What is the concrete outcome? (one sentence):',
|
|
341
|
+
validate: (input) => input.length > 0 || 'Outcome is required - what does success look like?',
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
type: 'input',
|
|
345
|
+
name: 'doneWhen',
|
|
346
|
+
message: 'Done when (acceptance criteria):',
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
type: 'input',
|
|
350
|
+
name: 'context',
|
|
351
|
+
message: 'Context (files, patterns, hints - optional):',
|
|
352
|
+
default: '',
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
type: 'input',
|
|
356
|
+
name: 'notInScope',
|
|
357
|
+
message: 'Not in scope (explicit exclusions - optional):',
|
|
358
|
+
default: '',
|
|
359
|
+
},
|
|
360
|
+
]);
|
|
361
|
+
// Build structured description
|
|
362
|
+
const parts = [];
|
|
363
|
+
parts.push(`## What\n${descAnswers.what}`);
|
|
364
|
+
if (descAnswers.doneWhen.trim()) {
|
|
365
|
+
// Ensure each line in doneWhen starts with - [ ] if it doesn't already
|
|
366
|
+
const criteria = descAnswers.doneWhen
|
|
367
|
+
.split('\n')
|
|
368
|
+
.map(line => line.trim())
|
|
369
|
+
.filter(line => line.length > 0)
|
|
370
|
+
.map(line => {
|
|
371
|
+
if (line.startsWith('- [ ]') || line.startsWith('- [x]')) {
|
|
372
|
+
return line;
|
|
373
|
+
}
|
|
374
|
+
if (line.startsWith('-')) {
|
|
375
|
+
return `- [ ]${line.slice(1)}`;
|
|
376
|
+
}
|
|
377
|
+
return `- [ ] ${line}`;
|
|
378
|
+
})
|
|
379
|
+
.join('\n');
|
|
380
|
+
parts.push(`## Done when\n${criteria}`);
|
|
381
|
+
}
|
|
382
|
+
if (descAnswers.context.trim()) {
|
|
383
|
+
parts.push(`## Context\n${descAnswers.context}`);
|
|
384
|
+
}
|
|
385
|
+
if (descAnswers.notInScope.trim()) {
|
|
386
|
+
parts.push(`## Not in scope\n${descAnswers.notInScope}`);
|
|
387
|
+
}
|
|
388
|
+
return parts.join('\n\n');
|
|
389
|
+
}
|
|
390
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class TicketDelete extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
ticketId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
};
|
|
14
|
+
execute(): Promise<void>;
|
|
15
|
+
private executeBulk;
|
|
16
|
+
}
|