@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,19 @@
|
|
|
1
|
+
import { PMOCommand } from '../../../lib/pmo/index.js';
|
|
2
|
+
export default class TicketLink 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
|
+
blocks: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
relates: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
duplicates: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
+
};
|
|
16
|
+
execute(): Promise<void>;
|
|
17
|
+
private addDependency;
|
|
18
|
+
private viewDependencies;
|
|
19
|
+
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import { autoExportToBoard, PMOCommand, pmoBaseFlags } from '../../../lib/pmo/index.js';
|
|
3
|
+
import { styles } from '../../../lib/styles.js';
|
|
4
|
+
import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../../lib/prompt-json.js';
|
|
5
|
+
export default class TicketLink extends PMOCommand {
|
|
6
|
+
static description = 'Manage ticket dependencies (links)';
|
|
7
|
+
static examples = [
|
|
8
|
+
'<%= config.bin %> <%= command.id %> TKT-001 # List dependencies',
|
|
9
|
+
'<%= config.bin %> <%= command.id %> TKT-001 --blocks TKT-002 # TKT-001 is blocked by TKT-002',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> TKT-001 --relates TKT-002 # TKT-001 relates to TKT-002',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> TKT-001 --duplicates TKT-002',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> TKT-001 --all # Show all (blockers + blocking)',
|
|
13
|
+
];
|
|
14
|
+
static args = {
|
|
15
|
+
id: Args.string({
|
|
16
|
+
description: 'Ticket ID',
|
|
17
|
+
required: false,
|
|
18
|
+
}),
|
|
19
|
+
};
|
|
20
|
+
static flags = {
|
|
21
|
+
...pmoBaseFlags,
|
|
22
|
+
json: Flags.boolean({
|
|
23
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
24
|
+
default: false,
|
|
25
|
+
}),
|
|
26
|
+
blocks: Flags.string({
|
|
27
|
+
char: 'b',
|
|
28
|
+
description: 'Add blocking dependency: this ticket is blocked by TARGET',
|
|
29
|
+
}),
|
|
30
|
+
relates: Flags.string({
|
|
31
|
+
char: 'r',
|
|
32
|
+
description: 'Add relates_to dependency: this ticket relates to TARGET',
|
|
33
|
+
}),
|
|
34
|
+
duplicates: Flags.string({
|
|
35
|
+
char: 'd',
|
|
36
|
+
description: 'Add duplicates dependency: this ticket duplicates TARGET',
|
|
37
|
+
}),
|
|
38
|
+
all: Flags.boolean({
|
|
39
|
+
char: 'a',
|
|
40
|
+
description: 'Show all dependencies (blockers and tickets blocked by this)',
|
|
41
|
+
default: false,
|
|
42
|
+
}),
|
|
43
|
+
};
|
|
44
|
+
async execute() {
|
|
45
|
+
const { args, flags } = await this.parse(TicketLink);
|
|
46
|
+
// Check if JSON output mode is active
|
|
47
|
+
const jsonMode = shouldOutputJson(flags);
|
|
48
|
+
const projectId = flags.project;
|
|
49
|
+
let ticketId = args.id;
|
|
50
|
+
if (!ticketId) {
|
|
51
|
+
const tickets = await this.storage.listTickets(projectId);
|
|
52
|
+
if (tickets.length === 0) {
|
|
53
|
+
if (jsonMode) {
|
|
54
|
+
outputErrorAsJson('NO_TICKETS', 'No tickets found.', createMetadata('ticket link', flags));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
this.log(styles.muted('\nNo tickets found.'));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const selected = await this.selectFromList({
|
|
61
|
+
message: 'Select ticket to manage dependencies:',
|
|
62
|
+
items: tickets,
|
|
63
|
+
getName: (t) => `${t.id} - ${t.title}`,
|
|
64
|
+
getValue: (t) => t.id,
|
|
65
|
+
getCommand: (t) => `prlt ticket link ${t.id} --json`,
|
|
66
|
+
jsonMode: jsonMode ? { flags, commandName: 'ticket link' } : null,
|
|
67
|
+
});
|
|
68
|
+
if (!selected) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
ticketId = selected;
|
|
72
|
+
}
|
|
73
|
+
const ticket = await this.storage.getTicket(ticketId);
|
|
74
|
+
if (!ticket) {
|
|
75
|
+
this.error(`Ticket not found: ${ticketId}`);
|
|
76
|
+
}
|
|
77
|
+
// If a dependency flag is provided, add the dependency directly
|
|
78
|
+
if (flags.blocks || flags.relates || flags.duplicates) {
|
|
79
|
+
const targetId = flags.blocks || flags.relates || flags.duplicates;
|
|
80
|
+
const dependencyType = flags.blocks ? 'blocks' :
|
|
81
|
+
flags.relates ? 'relates_to' : 'duplicates';
|
|
82
|
+
await this.addDependency(this.storage, this.pmoPath, ticketId, targetId, dependencyType, ticket.title);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// Interactive mode: show menu in a loop
|
|
86
|
+
let continueLoop = true;
|
|
87
|
+
while (continueLoop) {
|
|
88
|
+
const allTickets = await this.storage.listTickets(projectId);
|
|
89
|
+
const otherTickets = allTickets.filter(t => t.id !== ticketId);
|
|
90
|
+
const menuChoices = [
|
|
91
|
+
{ id: 'view', name: 'View dependencies' },
|
|
92
|
+
{ id: 'blocks', name: 'Add blocking dependency (blocked by...)' },
|
|
93
|
+
{ id: 'relates_to', name: 'Add relates_to dependency' },
|
|
94
|
+
{ id: 'duplicates', name: 'Add duplicates dependency' },
|
|
95
|
+
{ id: 'remove', name: 'Remove dependency' },
|
|
96
|
+
{ id: 'done', name: 'Done' },
|
|
97
|
+
];
|
|
98
|
+
const action = await this.selectFromList({
|
|
99
|
+
message: `Dependencies for ${ticket.id}:`,
|
|
100
|
+
items: menuChoices,
|
|
101
|
+
getName: (c) => c.name,
|
|
102
|
+
getValue: (c) => c.id,
|
|
103
|
+
getCommand: (c) => {
|
|
104
|
+
switch (c.id) {
|
|
105
|
+
case 'view': return `prlt ticket link ${ticketId} --all`;
|
|
106
|
+
case 'blocks': return `prlt ticket link block ${ticketId} --json`;
|
|
107
|
+
case 'relates_to': return `prlt ticket link relates ${ticketId} --json`;
|
|
108
|
+
case 'duplicates': return `prlt ticket link duplicates ${ticketId} --json`;
|
|
109
|
+
case 'remove': return `prlt ticket link remove ${ticketId} --json`;
|
|
110
|
+
default: return '';
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
jsonMode: jsonMode ? { flags, commandName: 'ticket link' } : null,
|
|
114
|
+
});
|
|
115
|
+
if (action === 'done' || !action) {
|
|
116
|
+
continueLoop = false;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (action === 'view') {
|
|
120
|
+
await this.viewDependencies(this.storage, ticketId, ticket, flags.all);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (action === 'remove') {
|
|
124
|
+
const dependencies = await this.storage.listTicketDependencies(ticketId);
|
|
125
|
+
if (dependencies.length === 0) {
|
|
126
|
+
this.log(styles.muted('\nNo dependencies to remove.'));
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
const depChoices = await Promise.all(dependencies.map(async (dep) => {
|
|
130
|
+
const depTicket = await this.storage.getTicket(dep.dependsOnTicketId);
|
|
131
|
+
return {
|
|
132
|
+
id: dep.dependsOnTicketId,
|
|
133
|
+
name: `${dep.dependsOnTicketId} - ${depTicket?.title || 'Unknown'} (${dep.dependencyType})`,
|
|
134
|
+
type: dep.dependencyType
|
|
135
|
+
};
|
|
136
|
+
}));
|
|
137
|
+
const selected = await this.selectFromList({
|
|
138
|
+
message: 'Select dependency to remove:',
|
|
139
|
+
items: depChoices,
|
|
140
|
+
getName: (d) => d.name,
|
|
141
|
+
getValue: (d) => d.id,
|
|
142
|
+
getCommand: (d) => `prlt ticket link remove ${ticketId} ${d.id} --type ${d.type} --json`,
|
|
143
|
+
jsonMode: jsonMode ? { flags, commandName: 'ticket link' } : null,
|
|
144
|
+
});
|
|
145
|
+
if (!selected) {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const selectedDep = depChoices.find(d => d.id === selected);
|
|
149
|
+
if (selectedDep) {
|
|
150
|
+
await this.storage.deleteTicketDependency(ticketId, selected, selectedDep.type);
|
|
151
|
+
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
152
|
+
this.log(styles.success(`\n✅ Removed dependency: ${ticketId} → ${selected}`));
|
|
153
|
+
}
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
// Add dependency
|
|
157
|
+
if (otherTickets.length === 0) {
|
|
158
|
+
this.log(styles.muted('\nNo other tickets to link to.'));
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
const targetId = await this.selectFromList({
|
|
162
|
+
message: `Select ticket that ${ticketId} ${action === 'blocks' ? 'is blocked by' : action === 'relates_to' ? 'relates to' : 'duplicates'}:`,
|
|
163
|
+
items: otherTickets,
|
|
164
|
+
getName: (t) => `${t.id} - ${t.title}`,
|
|
165
|
+
getValue: (t) => t.id,
|
|
166
|
+
getCommand: (t) => `prlt ticket link ${action === 'blocks' ? 'block' : action} ${ticketId} ${t.id} --json`,
|
|
167
|
+
jsonMode: jsonMode ? { flags, commandName: 'ticket link' } : null,
|
|
168
|
+
});
|
|
169
|
+
if (targetId) {
|
|
170
|
+
await this.addDependency(this.storage, this.pmoPath, ticketId, targetId, action, ticket.title);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async addDependency(storage, pmoPath, ticketId, targetId, dependencyType, ticketTitle) {
|
|
175
|
+
const targetTicket = await this.storage.getTicket(targetId);
|
|
176
|
+
if (!targetTicket) {
|
|
177
|
+
this.error(`Ticket not found: ${targetId}`);
|
|
178
|
+
}
|
|
179
|
+
try {
|
|
180
|
+
await this.storage.createTicketDependency(ticketId, targetId, dependencyType);
|
|
181
|
+
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
182
|
+
const typeLabel = dependencyType === 'blocks' ? 'is blocked by' :
|
|
183
|
+
dependencyType === 'relates_to' ? 'relates to' : 'duplicates';
|
|
184
|
+
this.log(styles.success(`\n✅ ${styles.emphasis(ticketId)} ${typeLabel} ${styles.emphasis(targetId)}`));
|
|
185
|
+
this.log(styles.muted(` ${ticketTitle}`));
|
|
186
|
+
this.log(styles.muted(` ${typeLabel} ${targetTicket.title}`));
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
if (error instanceof Error) {
|
|
190
|
+
if (error.message.includes('already exists')) {
|
|
191
|
+
this.error('Dependency already exists');
|
|
192
|
+
}
|
|
193
|
+
if (error.message.includes('self-dependency')) {
|
|
194
|
+
this.error('Cannot create self-dependency');
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
throw error;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
async viewDependencies(storage, ticketId, ticket, showAll) {
|
|
201
|
+
const dependencies = await this.storage.listTicketDependencies(ticketId);
|
|
202
|
+
const blockers = await this.storage.getTicketBlockers(ticketId);
|
|
203
|
+
const isBlocked = await this.storage.isTicketBlocked(ticketId);
|
|
204
|
+
this.log(`\n${styles.emphasis(ticket.id)}: ${ticket.title}`);
|
|
205
|
+
if (isBlocked) {
|
|
206
|
+
this.log(styles.warning(' Status: BLOCKED'));
|
|
207
|
+
}
|
|
208
|
+
if (blockers.length > 0) {
|
|
209
|
+
this.log(styles.muted('\n Blocked by:'));
|
|
210
|
+
for (const blocker of blockers) {
|
|
211
|
+
const status = blocker.status === 'done' ? styles.success('done') : styles.warning(blocker.status);
|
|
212
|
+
this.log(` - ${blocker.id}: ${blocker.title} (${status})`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const otherDeps = dependencies.filter(d => d.dependencyType !== 'blocks');
|
|
216
|
+
if (otherDeps.length > 0) {
|
|
217
|
+
this.log(styles.muted('\n Related:'));
|
|
218
|
+
for (const dep of otherDeps) {
|
|
219
|
+
const relatedTicket = await this.storage.getTicket(dep.dependsOnTicketId);
|
|
220
|
+
if (relatedTicket) {
|
|
221
|
+
this.log(` - ${dep.dependencyType}: ${relatedTicket.id} - ${relatedTicket.title}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (showAll) {
|
|
226
|
+
const blockedBy = await this.storage.getTicketsBlockedBy(ticketId);
|
|
227
|
+
if (blockedBy.length > 0) {
|
|
228
|
+
this.log(styles.muted('\n Blocking:'));
|
|
229
|
+
for (const blocked of blockedBy) {
|
|
230
|
+
this.log(` - ${blocked.id}: ${blocked.title} (${blocked.status})`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (dependencies.length === 0 && blockers.length === 0) {
|
|
235
|
+
this.log(styles.muted('\n No dependencies.'));
|
|
236
|
+
}
|
|
237
|
+
this.log('');
|
|
238
|
+
}
|
|
239
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PMOCommand } from '../../../lib/pmo/index.js';
|
|
2
|
+
export default class TicketLinkRelates extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
target: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
8
|
+
};
|
|
9
|
+
static flags: {
|
|
10
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
};
|
|
13
|
+
execute(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import { autoExportToBoard, PMOCommand, pmoBaseFlags } from '../../../lib/pmo/index.js';
|
|
3
|
+
import { styles } from '../../../lib/styles.js';
|
|
4
|
+
import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../../lib/prompt-json.js';
|
|
5
|
+
export default class TicketLinkRelates extends PMOCommand {
|
|
6
|
+
static description = 'Add a relates_to dependency (informational link)';
|
|
7
|
+
static examples = [
|
|
8
|
+
'<%= config.bin %> <%= command.id %> TKT-001 TKT-002 # TKT-001 relates to TKT-002',
|
|
9
|
+
'<%= config.bin %> <%= command.id %> TKT-001 # Interactive selection',
|
|
10
|
+
];
|
|
11
|
+
static args = {
|
|
12
|
+
id: Args.string({
|
|
13
|
+
description: 'Ticket ID',
|
|
14
|
+
required: true,
|
|
15
|
+
}),
|
|
16
|
+
target: Args.string({
|
|
17
|
+
description: 'Related ticket ID',
|
|
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
|
+
};
|
|
28
|
+
async execute() {
|
|
29
|
+
const { args, flags } = await this.parse(TicketLinkRelates);
|
|
30
|
+
// Check if JSON output mode is active
|
|
31
|
+
const jsonMode = shouldOutputJson(flags);
|
|
32
|
+
// Helper to handle errors in JSON mode
|
|
33
|
+
const handleError = (code, message) => {
|
|
34
|
+
if (jsonMode) {
|
|
35
|
+
outputErrorAsJson(code, message, createMetadata('ticket link relates', flags));
|
|
36
|
+
this.exit(1);
|
|
37
|
+
}
|
|
38
|
+
this.error(message);
|
|
39
|
+
};
|
|
40
|
+
const ticket = await this.storage.getTicket(args.id);
|
|
41
|
+
if (!ticket) {
|
|
42
|
+
return handleError('TICKET_NOT_FOUND', `Ticket not found: ${args.id}`);
|
|
43
|
+
}
|
|
44
|
+
let targetId = args.target;
|
|
45
|
+
if (!targetId) {
|
|
46
|
+
const projectId = flags.project;
|
|
47
|
+
const allTickets = await this.storage.listTickets(projectId);
|
|
48
|
+
const otherTickets = allTickets.filter(t => t.id !== args.id);
|
|
49
|
+
if (otherTickets.length === 0) {
|
|
50
|
+
if (jsonMode) {
|
|
51
|
+
outputErrorAsJson('NO_OTHER_TICKETS', 'No other tickets to relate to.', createMetadata('ticket link relates', flags));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
this.log(styles.muted('\nNo other tickets to relate to.'));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const selected = await this.selectFromList({
|
|
58
|
+
message: `Select ticket that ${args.id} relates to:`,
|
|
59
|
+
items: otherTickets,
|
|
60
|
+
getName: (t) => `${t.id} - ${t.title} (${t.statusName || t.status})`,
|
|
61
|
+
getValue: (t) => t.id,
|
|
62
|
+
getCommand: (t) => `prlt ticket link relates ${args.id} ${t.id} --json`,
|
|
63
|
+
jsonMode: jsonMode ? { flags, commandName: 'ticket link relates' } : null,
|
|
64
|
+
});
|
|
65
|
+
if (!selected) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
targetId = selected;
|
|
69
|
+
}
|
|
70
|
+
const targetTicket = await this.storage.getTicket(targetId);
|
|
71
|
+
if (!targetTicket) {
|
|
72
|
+
this.error(`Ticket not found: ${targetId}`);
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
await this.storage.createTicketDependency(args.id, targetId, 'relates_to');
|
|
76
|
+
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
77
|
+
this.log(styles.success(`\n✅ ${styles.emphasis(args.id)} relates to ${styles.emphasis(targetId)}`));
|
|
78
|
+
this.log(styles.muted(` ${ticket.title}`));
|
|
79
|
+
this.log(styles.muted(` relates to: ${targetTicket.title}`));
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
if (error instanceof Error) {
|
|
83
|
+
if (error.message.includes('already exists')) {
|
|
84
|
+
this.error('Dependency already exists');
|
|
85
|
+
}
|
|
86
|
+
if (error.message.includes('self-dependency')) {
|
|
87
|
+
this.error('Cannot create self-dependency');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { PMOCommand } from '../../../lib/pmo/index.js';
|
|
2
|
+
export default class TicketLinkRemove extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
target: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
8
|
+
};
|
|
9
|
+
static flags: {
|
|
10
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
type: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
};
|
|
15
|
+
execute(): Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import { autoExportToBoard, PMOCommand, pmoBaseFlags } from '../../../lib/pmo/index.js';
|
|
3
|
+
import { styles } from '../../../lib/styles.js';
|
|
4
|
+
import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../../lib/prompt-json.js';
|
|
5
|
+
export default class TicketLinkRemove extends PMOCommand {
|
|
6
|
+
static description = 'Remove a dependency from a ticket';
|
|
7
|
+
static examples = [
|
|
8
|
+
'<%= config.bin %> <%= command.id %> TKT-001 TKT-002',
|
|
9
|
+
'<%= config.bin %> <%= command.id %> TKT-001 TKT-002 --type blocks',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> TKT-001 --all',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> TKT-001 # Interactive selection',
|
|
12
|
+
];
|
|
13
|
+
static args = {
|
|
14
|
+
id: Args.string({
|
|
15
|
+
description: 'Ticket ID',
|
|
16
|
+
required: true,
|
|
17
|
+
}),
|
|
18
|
+
target: Args.string({
|
|
19
|
+
description: 'Target ticket ID to unlink',
|
|
20
|
+
required: false,
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
static flags = {
|
|
24
|
+
...pmoBaseFlags,
|
|
25
|
+
json: Flags.boolean({
|
|
26
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
27
|
+
default: false,
|
|
28
|
+
}),
|
|
29
|
+
type: Flags.string({
|
|
30
|
+
char: 't',
|
|
31
|
+
description: 'Dependency type to remove',
|
|
32
|
+
options: ['blocks', 'relates_to', 'duplicates'],
|
|
33
|
+
}),
|
|
34
|
+
all: Flags.boolean({
|
|
35
|
+
char: 'a',
|
|
36
|
+
description: 'Remove all dependencies for this ticket',
|
|
37
|
+
default: false,
|
|
38
|
+
}),
|
|
39
|
+
};
|
|
40
|
+
async execute() {
|
|
41
|
+
const { args, flags } = await this.parse(TicketLinkRemove);
|
|
42
|
+
// Check if JSON output mode is active
|
|
43
|
+
const jsonMode = shouldOutputJson(flags);
|
|
44
|
+
// Helper to handle errors in JSON mode
|
|
45
|
+
const handleError = (code, message) => {
|
|
46
|
+
if (jsonMode) {
|
|
47
|
+
outputErrorAsJson(code, message, createMetadata('ticket link remove', flags));
|
|
48
|
+
this.exit(1);
|
|
49
|
+
}
|
|
50
|
+
this.error(message);
|
|
51
|
+
};
|
|
52
|
+
const ticket = await this.storage.getTicket(args.id);
|
|
53
|
+
if (!ticket) {
|
|
54
|
+
return handleError('TICKET_NOT_FOUND', `Ticket not found: ${args.id}`);
|
|
55
|
+
}
|
|
56
|
+
const dependencies = await this.storage.listTicketDependencies(args.id);
|
|
57
|
+
if (dependencies.length === 0) {
|
|
58
|
+
if (jsonMode) {
|
|
59
|
+
outputErrorAsJson('NO_DEPENDENCIES', `Ticket ${args.id} has no dependencies.`, createMetadata('ticket link remove', flags));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
this.log(styles.muted(`\nTicket ${args.id} has no dependencies.`));
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// If --all flag, remove all dependencies
|
|
66
|
+
if (flags.all) {
|
|
67
|
+
const confirmChoices = [
|
|
68
|
+
{ id: 'no', name: 'No, cancel' },
|
|
69
|
+
{ id: 'yes', name: `Yes, remove all ${dependencies.length} dependencies` },
|
|
70
|
+
];
|
|
71
|
+
const confirmed = await this.selectFromList({
|
|
72
|
+
message: `Remove all ${dependencies.length} dependencies from ${args.id}?`,
|
|
73
|
+
items: confirmChoices,
|
|
74
|
+
getName: (c) => c.name,
|
|
75
|
+
getValue: (c) => c.id,
|
|
76
|
+
getCommand: (c) => c.id === 'yes' ? `prlt ticket link remove ${args.id} --all --force --json` : '',
|
|
77
|
+
jsonMode: jsonMode ? { flags, commandName: 'ticket link remove' } : null,
|
|
78
|
+
});
|
|
79
|
+
if (confirmed !== 'yes') {
|
|
80
|
+
this.log(styles.muted('\nCancelled.'));
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
for (const dep of dependencies) {
|
|
84
|
+
await this.storage.deleteTicketDependency(args.id, dep.dependsOnTicketId, dep.dependencyType);
|
|
85
|
+
}
|
|
86
|
+
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
87
|
+
this.log(styles.success(`\n✅ Removed ${dependencies.length} dependencies from ${args.id}`));
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
let targetId = args.target;
|
|
91
|
+
// If no target provided, prompt for selection
|
|
92
|
+
if (!targetId) {
|
|
93
|
+
const depChoices = await Promise.all(dependencies.map(async (dep) => {
|
|
94
|
+
const depTicket = await this.storage.getTicket(dep.dependsOnTicketId);
|
|
95
|
+
return {
|
|
96
|
+
id: dep.dependsOnTicketId,
|
|
97
|
+
name: `${dep.dependsOnTicketId} - ${depTicket?.title || 'Unknown'} (${dep.dependencyType})`,
|
|
98
|
+
type: dep.dependencyType,
|
|
99
|
+
};
|
|
100
|
+
}));
|
|
101
|
+
const selected = await this.selectFromList({
|
|
102
|
+
message: 'Select dependency to remove:',
|
|
103
|
+
items: depChoices,
|
|
104
|
+
getName: (d) => d.name,
|
|
105
|
+
getValue: (d) => d.id,
|
|
106
|
+
getCommand: (d) => `prlt ticket link remove ${args.id} ${d.id} --type ${d.type} --json`,
|
|
107
|
+
jsonMode: jsonMode ? { flags, commandName: 'ticket link remove' } : null,
|
|
108
|
+
});
|
|
109
|
+
if (!selected) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
targetId = selected;
|
|
113
|
+
}
|
|
114
|
+
// Find the dependency
|
|
115
|
+
const dep = dependencies.find(d => d.dependsOnTicketId === targetId);
|
|
116
|
+
if (!dep) {
|
|
117
|
+
this.error(`No dependency found from ${args.id} to ${targetId}`);
|
|
118
|
+
}
|
|
119
|
+
const dependencyType = flags.type;
|
|
120
|
+
await this.storage.deleteTicketDependency(args.id, targetId, dependencyType);
|
|
121
|
+
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
122
|
+
const depTicket = await this.storage.getTicket(targetId);
|
|
123
|
+
this.log(styles.success(`\n✅ Removed dependency: ${args.id} → ${targetId}`));
|
|
124
|
+
if (depTicket) {
|
|
125
|
+
this.log(styles.muted(` ${ticket.title} no longer linked to ${depTicket.title}`));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class TicketList extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
column: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
priority: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
category: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
search: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
format: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
'group-by': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
};
|
|
15
|
+
run(): Promise<void>;
|
|
16
|
+
private outputCrossProjectTable;
|
|
17
|
+
private outputCrossProjectTableByPriority;
|
|
18
|
+
private outputCrossProjectCompact;
|
|
19
|
+
private outputCrossProjectCompactByPriority;
|
|
20
|
+
private outputTable;
|
|
21
|
+
private outputTableByPriority;
|
|
22
|
+
private outputCompact;
|
|
23
|
+
private outputCompactByPriority;
|
|
24
|
+
}
|