@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,110 @@
|
|
|
1
|
+
import { Flags, Args } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { PMOCommand, pmoBaseFlags } from '../../../lib/pmo/index.js';
|
|
4
|
+
import { styles } from '../../../lib/styles.js';
|
|
5
|
+
export default class TicketTemplateSave extends PMOCommand {
|
|
6
|
+
static description = 'Create a template from an existing ticket';
|
|
7
|
+
static examples = [
|
|
8
|
+
'<%= config.bin %> <%= command.id %> TKT-001 "Bug Report Template"',
|
|
9
|
+
'<%= config.bin %> <%= command.id %> TKT-042 "Feature Request" --description "Standard feature request template"',
|
|
10
|
+
];
|
|
11
|
+
static args = {
|
|
12
|
+
ticket: Args.string({
|
|
13
|
+
description: 'Ticket ID to create template from',
|
|
14
|
+
required: false,
|
|
15
|
+
}),
|
|
16
|
+
name: Args.string({
|
|
17
|
+
description: 'Template name',
|
|
18
|
+
required: false,
|
|
19
|
+
}),
|
|
20
|
+
};
|
|
21
|
+
static flags = {
|
|
22
|
+
...pmoBaseFlags,
|
|
23
|
+
description: Flags.string({
|
|
24
|
+
char: 'd',
|
|
25
|
+
description: 'Template description',
|
|
26
|
+
}),
|
|
27
|
+
};
|
|
28
|
+
async execute() {
|
|
29
|
+
const { args, flags } = await this.parse(TicketTemplateSave);
|
|
30
|
+
// Get ticket ID - prompt with picker if not provided
|
|
31
|
+
let ticketId = args.ticket;
|
|
32
|
+
if (!ticketId) {
|
|
33
|
+
const projectId = await this.requireProject();
|
|
34
|
+
const tickets = await this.storage.listTickets(projectId);
|
|
35
|
+
if (tickets.length === 0) {
|
|
36
|
+
this.error('No tickets found in this project.\nCreate a ticket first: prlt ticket create');
|
|
37
|
+
}
|
|
38
|
+
const { selectedTicket } = await inquirer.prompt([{
|
|
39
|
+
type: 'list',
|
|
40
|
+
name: 'selectedTicket',
|
|
41
|
+
message: 'Select a ticket to save as template:',
|
|
42
|
+
choices: tickets.slice(0, 20).map(t => ({
|
|
43
|
+
name: `${t.id} - ${t.title}`,
|
|
44
|
+
value: t.id,
|
|
45
|
+
})),
|
|
46
|
+
}]);
|
|
47
|
+
ticketId = selectedTicket;
|
|
48
|
+
}
|
|
49
|
+
// Verify ticket exists
|
|
50
|
+
const ticket = await this.storage.getTicket(ticketId);
|
|
51
|
+
if (!ticket) {
|
|
52
|
+
this.error(`Ticket not found: ${ticketId}\nRun 'prlt ticket list' to see available tickets.`);
|
|
53
|
+
}
|
|
54
|
+
// Get template name - prompt if not provided
|
|
55
|
+
let templateName = args.name;
|
|
56
|
+
if (!templateName) {
|
|
57
|
+
const { name } = await inquirer.prompt([{
|
|
58
|
+
type: 'input',
|
|
59
|
+
name: 'name',
|
|
60
|
+
message: 'Template name:',
|
|
61
|
+
default: ticket.category || ticket.title.split(' ')[0],
|
|
62
|
+
validate: (input) => input.length > 0 || 'Name is required',
|
|
63
|
+
}]);
|
|
64
|
+
templateName = name;
|
|
65
|
+
}
|
|
66
|
+
// Get description if not provided
|
|
67
|
+
let description = flags.description;
|
|
68
|
+
if (description === undefined) {
|
|
69
|
+
const { desc } = await inquirer.prompt([{
|
|
70
|
+
type: 'input',
|
|
71
|
+
name: 'desc',
|
|
72
|
+
message: 'Description (optional):',
|
|
73
|
+
}]);
|
|
74
|
+
description = desc || undefined;
|
|
75
|
+
}
|
|
76
|
+
// Create template from ticket
|
|
77
|
+
const template = await this.storage.createTicketTemplateFromTicket(ticketId, templateName, description);
|
|
78
|
+
this.log(styles.success(`\nCreated template "${styles.emphasis(template.name)}" from ticket ${ticketId}`));
|
|
79
|
+
this.log(styles.muted(` ID: ${template.id}`));
|
|
80
|
+
if (template.description) {
|
|
81
|
+
this.log(styles.muted(` Description: ${template.description}`));
|
|
82
|
+
}
|
|
83
|
+
if (template.titlePattern) {
|
|
84
|
+
this.log(styles.muted(` Title pattern: ${template.titlePattern}`));
|
|
85
|
+
}
|
|
86
|
+
if (template.defaultPriority) {
|
|
87
|
+
this.log(styles.muted(` Default priority: ${template.defaultPriority}`));
|
|
88
|
+
}
|
|
89
|
+
if (template.defaultCategory) {
|
|
90
|
+
this.log(styles.muted(` Default category: ${template.defaultCategory}`));
|
|
91
|
+
}
|
|
92
|
+
if (template.defaultStatusId) {
|
|
93
|
+
this.log(styles.muted(` Default status: ${template.defaultStatusId}`));
|
|
94
|
+
}
|
|
95
|
+
if (template.defaultAssignee) {
|
|
96
|
+
this.log(styles.muted(` Default assignee: ${template.defaultAssignee}`));
|
|
97
|
+
}
|
|
98
|
+
if (template.defaultOwner) {
|
|
99
|
+
this.log(styles.muted(` Default owner: ${template.defaultOwner}`));
|
|
100
|
+
}
|
|
101
|
+
if (template.defaultLabels && template.defaultLabels.length > 0) {
|
|
102
|
+
this.log(styles.muted(` Default labels: ${template.defaultLabels.join(', ')}`));
|
|
103
|
+
}
|
|
104
|
+
if (template.suggestedSubtasks.length > 0) {
|
|
105
|
+
this.log(styles.muted(` Subtasks: ${template.suggestedSubtasks.length}`));
|
|
106
|
+
}
|
|
107
|
+
this.log('');
|
|
108
|
+
this.log(styles.muted(`Create ticket from template: prlt ticket template apply ${template.id}`));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class TicketUpdate 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
|
+
priority: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
category: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
+
};
|
|
16
|
+
execute(): Promise<void>;
|
|
17
|
+
private executeBulk;
|
|
18
|
+
}
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { PMOCommand, pmoBaseFlags, autoExportToBoard } from '../../lib/pmo/index.js';
|
|
4
|
+
import { PRIORITIES, PRIORITY_LABELS } from '../../lib/pmo/types.js';
|
|
5
|
+
import { styles } from '../../lib/styles.js';
|
|
6
|
+
import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
7
|
+
export default class TicketUpdate extends PMOCommand {
|
|
8
|
+
static description = 'Update priority/category for ticket(s)';
|
|
9
|
+
static examples = [
|
|
10
|
+
'<%= config.bin %> <%= command.id %> TKT-001 --priority HIGH',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> TKT-001 --category bug',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> --bulk',
|
|
13
|
+
'<%= config.bin %> <%= command.id %> --bulk --priority HIGH',
|
|
14
|
+
'<%= config.bin %> <%= command.id %> --json # Output choices as JSON',
|
|
15
|
+
];
|
|
16
|
+
static args = {
|
|
17
|
+
ticketId: Args.string({
|
|
18
|
+
description: 'Ticket ID - prompts with dropdown if not provided',
|
|
19
|
+
required: false,
|
|
20
|
+
}),
|
|
21
|
+
};
|
|
22
|
+
static flags = {
|
|
23
|
+
...pmoBaseFlags,
|
|
24
|
+
json: Flags.boolean({
|
|
25
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
26
|
+
default: false,
|
|
27
|
+
}),
|
|
28
|
+
priority: Flags.string({
|
|
29
|
+
char: 'p',
|
|
30
|
+
description: 'Set priority (P0, P1, P2, P3)',
|
|
31
|
+
options: [...PRIORITIES],
|
|
32
|
+
}),
|
|
33
|
+
category: Flags.string({
|
|
34
|
+
char: 'c',
|
|
35
|
+
description: 'Set category (e.g., feature, bug, refactor)',
|
|
36
|
+
}),
|
|
37
|
+
bulk: Flags.boolean({
|
|
38
|
+
char: 'b',
|
|
39
|
+
description: 'Enable bulk mode to update multiple tickets',
|
|
40
|
+
default: false,
|
|
41
|
+
}),
|
|
42
|
+
force: Flags.boolean({
|
|
43
|
+
char: 'f',
|
|
44
|
+
description: 'Skip confirmation prompt',
|
|
45
|
+
default: false,
|
|
46
|
+
}),
|
|
47
|
+
};
|
|
48
|
+
async execute() {
|
|
49
|
+
const { args, flags } = await this.parse(TicketUpdate);
|
|
50
|
+
const projectId = flags.project;
|
|
51
|
+
// Check if JSON output mode is active
|
|
52
|
+
const jsonMode = shouldOutputJson(flags);
|
|
53
|
+
// Get all tickets
|
|
54
|
+
const allTickets = await this.storage.listTickets(projectId);
|
|
55
|
+
if (allTickets.length === 0) {
|
|
56
|
+
if (jsonMode) {
|
|
57
|
+
outputErrorAsJson('NO_TICKETS', 'No tickets found.', createMetadata('ticket update', flags));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
this.log(styles.warning('No tickets found.'));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// Bulk mode
|
|
64
|
+
if (flags.bulk) {
|
|
65
|
+
await this.executeBulk(allTickets, flags);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// Single ticket mode
|
|
69
|
+
let ticketId = args.ticketId;
|
|
70
|
+
if (!ticketId) {
|
|
71
|
+
const selected = await this.selectFromList({
|
|
72
|
+
message: 'Select ticket to update:',
|
|
73
|
+
items: allTickets,
|
|
74
|
+
getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
|
|
75
|
+
getValue: (t) => t.id,
|
|
76
|
+
getCommand: (t) => `prlt ticket update ${t.id} --json`,
|
|
77
|
+
jsonMode: jsonMode ? { flags, commandName: 'ticket update' } : null,
|
|
78
|
+
});
|
|
79
|
+
if (!selected) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
ticketId = selected;
|
|
83
|
+
}
|
|
84
|
+
// Get ticket
|
|
85
|
+
const ticket = await this.storage.getTicket(ticketId);
|
|
86
|
+
if (!ticket) {
|
|
87
|
+
this.error(`Ticket "${ticketId}" not found.`);
|
|
88
|
+
}
|
|
89
|
+
// Determine what to update
|
|
90
|
+
let updatePriority = flags.priority;
|
|
91
|
+
let updateCategory = flags.category;
|
|
92
|
+
if (!updatePriority && !updateCategory) {
|
|
93
|
+
// Ask what to update
|
|
94
|
+
const { updateType } = await inquirer.prompt([{
|
|
95
|
+
type: 'list',
|
|
96
|
+
name: 'updateType',
|
|
97
|
+
message: 'What would you like to update?',
|
|
98
|
+
choices: [
|
|
99
|
+
{ name: 'Priority', value: 'priority' },
|
|
100
|
+
{ name: 'Category', value: 'category' },
|
|
101
|
+
{ name: 'Both', value: 'both' },
|
|
102
|
+
],
|
|
103
|
+
}]);
|
|
104
|
+
if (updateType === 'priority' || updateType === 'both') {
|
|
105
|
+
const { priority } = await inquirer.prompt([{
|
|
106
|
+
type: 'list',
|
|
107
|
+
name: 'priority',
|
|
108
|
+
message: 'Set priority to:',
|
|
109
|
+
choices: [
|
|
110
|
+
{ name: `(Keep existing: ${ticket.priority || 'none'})`, value: null },
|
|
111
|
+
...PRIORITIES.map(p => ({ name: PRIORITY_LABELS[p], value: p })),
|
|
112
|
+
{ name: 'None (clear priority)', value: '' },
|
|
113
|
+
],
|
|
114
|
+
}]);
|
|
115
|
+
if (priority !== null) {
|
|
116
|
+
updatePriority = priority;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (updateType === 'category' || updateType === 'both') {
|
|
120
|
+
const { categoryChoice } = await inquirer.prompt([{
|
|
121
|
+
type: 'list',
|
|
122
|
+
name: 'categoryChoice',
|
|
123
|
+
message: 'Set category to:',
|
|
124
|
+
choices: [
|
|
125
|
+
{ name: `(Keep existing: ${ticket.category || 'none'})`, value: null },
|
|
126
|
+
{ name: 'feature', value: 'feature' },
|
|
127
|
+
{ name: 'bug', value: 'bug' },
|
|
128
|
+
{ name: 'refactor', value: 'refactor' },
|
|
129
|
+
{ name: 'docs', value: 'docs' },
|
|
130
|
+
{ name: 'test', value: 'test' },
|
|
131
|
+
{ name: 'chore', value: 'chore' },
|
|
132
|
+
{ name: 'None (clear category)', value: '' },
|
|
133
|
+
{ name: 'Custom...', value: '__custom__' },
|
|
134
|
+
],
|
|
135
|
+
}]);
|
|
136
|
+
if (categoryChoice === '__custom__') {
|
|
137
|
+
const { customCategory } = await inquirer.prompt([{
|
|
138
|
+
type: 'input',
|
|
139
|
+
name: 'customCategory',
|
|
140
|
+
message: 'Enter custom category:',
|
|
141
|
+
validate: (input) => input.length > 0 || 'Category is required',
|
|
142
|
+
}]);
|
|
143
|
+
updateCategory = customCategory;
|
|
144
|
+
}
|
|
145
|
+
else if (categoryChoice !== null) {
|
|
146
|
+
updateCategory = categoryChoice;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Check if anything to update
|
|
151
|
+
if (updatePriority === undefined && updateCategory === undefined) {
|
|
152
|
+
this.log(styles.muted('Nothing to update.'));
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// Build changes
|
|
156
|
+
const changes = {};
|
|
157
|
+
if (updatePriority !== undefined) {
|
|
158
|
+
changes.priority = updatePriority || undefined;
|
|
159
|
+
}
|
|
160
|
+
if (updateCategory !== undefined) {
|
|
161
|
+
changes.category = updateCategory || undefined;
|
|
162
|
+
}
|
|
163
|
+
// Update ticket
|
|
164
|
+
await this.storage.updateTicket(ticketId, changes);
|
|
165
|
+
// Auto-export
|
|
166
|
+
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
167
|
+
const updates = [];
|
|
168
|
+
if (updatePriority !== undefined)
|
|
169
|
+
updates.push(`Priority: ${updatePriority || 'none'}`);
|
|
170
|
+
if (updateCategory !== undefined)
|
|
171
|
+
updates.push(`Category: ${updateCategory || 'none'}`);
|
|
172
|
+
this.log(styles.success(`\n✅ Updated ticket ${styles.emphasis(ticketId)}`));
|
|
173
|
+
this.log(styles.muted(` ${updates.join(', ')}`));
|
|
174
|
+
}
|
|
175
|
+
async executeBulk(allTickets, flags) {
|
|
176
|
+
this.log(styles.emphasis('✏️ Update Multiple Tickets\n'));
|
|
177
|
+
// Select tickets to update
|
|
178
|
+
const { selectedTickets } = await inquirer.prompt([{
|
|
179
|
+
type: 'checkbox',
|
|
180
|
+
name: 'selectedTickets',
|
|
181
|
+
message: 'Select tickets to update:',
|
|
182
|
+
choices: allTickets.map(t => ({
|
|
183
|
+
name: `${t.id} - ${t.title} [P:${t.priority || 'none'} C:${t.category || 'none'}]`,
|
|
184
|
+
value: t.id,
|
|
185
|
+
})),
|
|
186
|
+
}]);
|
|
187
|
+
if (selectedTickets.length === 0) {
|
|
188
|
+
this.log(styles.muted('No tickets selected.'));
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
// Determine what to update
|
|
192
|
+
let updatePriority = flags.priority;
|
|
193
|
+
let updateCategory = flags.category;
|
|
194
|
+
if (!updatePriority && !updateCategory) {
|
|
195
|
+
// Ask what to update
|
|
196
|
+
const { updateType } = await inquirer.prompt([{
|
|
197
|
+
type: 'list',
|
|
198
|
+
name: 'updateType',
|
|
199
|
+
message: 'What would you like to update?',
|
|
200
|
+
choices: [
|
|
201
|
+
{ name: 'Priority', value: 'priority' },
|
|
202
|
+
{ name: 'Category', value: 'category' },
|
|
203
|
+
{ name: 'Both', value: 'both' },
|
|
204
|
+
],
|
|
205
|
+
}]);
|
|
206
|
+
if (updateType === 'priority' || updateType === 'both') {
|
|
207
|
+
const { priority } = await inquirer.prompt([{
|
|
208
|
+
type: 'list',
|
|
209
|
+
name: 'priority',
|
|
210
|
+
message: 'Set priority to:',
|
|
211
|
+
choices: [
|
|
212
|
+
{ name: '(Keep existing)', value: null },
|
|
213
|
+
...PRIORITIES.map(p => ({ name: PRIORITY_LABELS[p], value: p })),
|
|
214
|
+
{ name: 'None (clear priority)', value: '' },
|
|
215
|
+
],
|
|
216
|
+
}]);
|
|
217
|
+
if (priority !== null) {
|
|
218
|
+
updatePriority = priority;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (updateType === 'category' || updateType === 'both') {
|
|
222
|
+
const { categoryChoice } = await inquirer.prompt([{
|
|
223
|
+
type: 'list',
|
|
224
|
+
name: 'categoryChoice',
|
|
225
|
+
message: 'Set category to:',
|
|
226
|
+
choices: [
|
|
227
|
+
{ name: '(Keep existing)', value: null },
|
|
228
|
+
{ name: 'feature', value: 'feature' },
|
|
229
|
+
{ name: 'bug', value: 'bug' },
|
|
230
|
+
{ name: 'refactor', value: 'refactor' },
|
|
231
|
+
{ name: 'docs', value: 'docs' },
|
|
232
|
+
{ name: 'test', value: 'test' },
|
|
233
|
+
{ name: 'chore', value: 'chore' },
|
|
234
|
+
{ name: 'None (clear category)', value: '' },
|
|
235
|
+
{ name: 'Custom...', value: '__custom__' },
|
|
236
|
+
],
|
|
237
|
+
}]);
|
|
238
|
+
if (categoryChoice === '__custom__') {
|
|
239
|
+
const { customCategory } = await inquirer.prompt([{
|
|
240
|
+
type: 'input',
|
|
241
|
+
name: 'customCategory',
|
|
242
|
+
message: 'Enter custom category:',
|
|
243
|
+
validate: (input) => input.length > 0 || 'Category is required',
|
|
244
|
+
}]);
|
|
245
|
+
updateCategory = customCategory;
|
|
246
|
+
}
|
|
247
|
+
else if (categoryChoice !== null) {
|
|
248
|
+
updateCategory = categoryChoice;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// Check if anything to update
|
|
253
|
+
if (updatePriority === undefined && updateCategory === undefined) {
|
|
254
|
+
this.log(styles.muted('Nothing to update.'));
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
// Confirmation
|
|
258
|
+
if (!flags.force) {
|
|
259
|
+
this.log(styles.primary('\nWill update:'));
|
|
260
|
+
if (updatePriority !== undefined) {
|
|
261
|
+
this.log(styles.primary(` Priority → ${updatePriority || '(clear)'}`));
|
|
262
|
+
}
|
|
263
|
+
if (updateCategory !== undefined) {
|
|
264
|
+
this.log(styles.primary(` Category → ${updateCategory || '(clear)'}`));
|
|
265
|
+
}
|
|
266
|
+
this.log(styles.primary('\nTickets:'));
|
|
267
|
+
for (const ticketId of selectedTickets) {
|
|
268
|
+
const ticket = allTickets.find(t => t.id === ticketId);
|
|
269
|
+
this.log(styles.primary(` • ${ticketId}: ${ticket?.title}`));
|
|
270
|
+
}
|
|
271
|
+
this.log('');
|
|
272
|
+
const { confirm } = await inquirer.prompt([{
|
|
273
|
+
type: 'list',
|
|
274
|
+
name: 'confirm',
|
|
275
|
+
message: 'Continue?',
|
|
276
|
+
choices: [
|
|
277
|
+
{ name: 'No, cancel', value: false },
|
|
278
|
+
{ name: 'Yes, update tickets', value: true }
|
|
279
|
+
],
|
|
280
|
+
default: 0
|
|
281
|
+
}]);
|
|
282
|
+
if (!confirm) {
|
|
283
|
+
this.log(styles.muted('Operation cancelled.'));
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
this.log('');
|
|
288
|
+
// Update each ticket
|
|
289
|
+
let successCount = 0;
|
|
290
|
+
let failCount = 0;
|
|
291
|
+
for (const ticketId of selectedTickets) {
|
|
292
|
+
try {
|
|
293
|
+
const changes = {};
|
|
294
|
+
if (updatePriority !== undefined) {
|
|
295
|
+
changes.priority = updatePriority || undefined;
|
|
296
|
+
}
|
|
297
|
+
if (updateCategory !== undefined) {
|
|
298
|
+
changes.category = updateCategory || undefined;
|
|
299
|
+
}
|
|
300
|
+
await this.storage.updateTicket(ticketId, changes);
|
|
301
|
+
const updates = [];
|
|
302
|
+
if (updatePriority !== undefined)
|
|
303
|
+
updates.push(`P:${updatePriority || 'none'}`);
|
|
304
|
+
if (updateCategory !== undefined)
|
|
305
|
+
updates.push(`C:${updateCategory || 'none'}`);
|
|
306
|
+
this.log(styles.success(`${ticketId}: ${updates.join(', ')}`));
|
|
307
|
+
successCount++;
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
this.log(styles.error(`Failed to update ${ticketId}: ${error instanceof Error ? error.message : String(error)}`));
|
|
311
|
+
failCount++;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// Auto-export to kanban.md
|
|
315
|
+
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
316
|
+
// Summary
|
|
317
|
+
this.log('');
|
|
318
|
+
if (successCount > 0) {
|
|
319
|
+
this.log(styles.success(`Updated ${successCount} ticket(s)`));
|
|
320
|
+
}
|
|
321
|
+
if (failCount > 0) {
|
|
322
|
+
this.log(styles.error(`Failed to update ${failCount} ticket(s)`));
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class TicketView extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
};
|
|
9
|
+
static args: {
|
|
10
|
+
ticketId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
11
|
+
};
|
|
12
|
+
execute(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import { 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 TicketView extends PMOCommand {
|
|
6
|
+
static description = 'View detailed ticket information';
|
|
7
|
+
static examples = [
|
|
8
|
+
'<%= config.bin %> <%= command.id %> TICK-001',
|
|
9
|
+
'<%= config.bin %> <%= command.id %> # Interactive mode',
|
|
10
|
+
];
|
|
11
|
+
static flags = {
|
|
12
|
+
...pmoBaseFlags,
|
|
13
|
+
json: Flags.boolean({
|
|
14
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
15
|
+
default: false,
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
static args = {
|
|
19
|
+
ticketId: Args.string({
|
|
20
|
+
description: 'Ticket ID to view - prompts with dropdown if not provided',
|
|
21
|
+
required: false,
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
async execute() {
|
|
25
|
+
const { args, flags } = await this.parse(TicketView);
|
|
26
|
+
const projectId = flags.project;
|
|
27
|
+
// Check if JSON output mode is active
|
|
28
|
+
const jsonMode = shouldOutputJson(flags);
|
|
29
|
+
// Helper to handle errors in JSON mode
|
|
30
|
+
const handleError = (code, message) => {
|
|
31
|
+
if (jsonMode) {
|
|
32
|
+
outputErrorAsJson(code, message, createMetadata('ticket view', flags));
|
|
33
|
+
this.exit(1);
|
|
34
|
+
}
|
|
35
|
+
this.error(message);
|
|
36
|
+
};
|
|
37
|
+
// Get ticketId - prompt if not provided
|
|
38
|
+
let ticketId = args.ticketId;
|
|
39
|
+
if (!ticketId) {
|
|
40
|
+
// Get all tickets for selection
|
|
41
|
+
const allTickets = await this.storage.listTickets(projectId);
|
|
42
|
+
if (allTickets.length === 0) {
|
|
43
|
+
return handleError('NO_TICKETS', 'No tickets found. Create a ticket first with "prlt ticket create".');
|
|
44
|
+
}
|
|
45
|
+
// Use helper for ticket selection (handles JSON mode automatically)
|
|
46
|
+
const selected = await this.selectFromList({
|
|
47
|
+
message: 'Select ticket to view:',
|
|
48
|
+
items: allTickets,
|
|
49
|
+
getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
|
|
50
|
+
getValue: (t) => t.id,
|
|
51
|
+
getCommand: (t) => `prlt ticket view ${t.id} --json`,
|
|
52
|
+
jsonMode: jsonMode ? { flags, commandName: 'ticket view' } : null,
|
|
53
|
+
});
|
|
54
|
+
if (!selected) {
|
|
55
|
+
return; // Cancelled or JSON mode (already exited)
|
|
56
|
+
}
|
|
57
|
+
ticketId = selected;
|
|
58
|
+
}
|
|
59
|
+
// Get ticket
|
|
60
|
+
const ticket = await this.storage.getTicket(ticketId);
|
|
61
|
+
if (!ticket) {
|
|
62
|
+
this.error(`Ticket "${ticketId}" not found.`);
|
|
63
|
+
}
|
|
64
|
+
const board = await this.storage.getBoard(ticket.projectId);
|
|
65
|
+
// Display ticket details
|
|
66
|
+
this.log(`\n${styles.header('📄 Ticket')} ${styles.emphasis(ticket.id)}\n`);
|
|
67
|
+
this.log(`${styles.header('Title:')} ${ticket.title}`);
|
|
68
|
+
this.log(`${styles.header('Project:')} ${board.name}`);
|
|
69
|
+
this.log(`${styles.header('Status:')} ${ticket.statusName}`);
|
|
70
|
+
this.log(`${styles.header('Priority:')} ${ticket.priority || 'none'}`);
|
|
71
|
+
this.log(`${styles.header('Category:')} ${ticket.category || 'none'}`);
|
|
72
|
+
this.log(`${styles.header('Created:')} ${ticket.createdAt ? new Date(ticket.createdAt).toLocaleString() : 'unknown'}`);
|
|
73
|
+
this.log(`${styles.header('Updated:')} ${ticket.updatedAt ? new Date(ticket.updatedAt).toLocaleString() : 'unknown'}`);
|
|
74
|
+
if (ticket.description) {
|
|
75
|
+
this.log(`\n${styles.header('Description:')}`);
|
|
76
|
+
this.log(` ${ticket.description.split('\n').join('\n ')}`);
|
|
77
|
+
}
|
|
78
|
+
this.log('');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { execSync } from 'node:child_process';
|
|
4
|
+
import { colors } from '../lib/colors.js';
|
|
5
|
+
export default class Whoami extends Command {
|
|
6
|
+
static description = 'Show current agent/environment context';
|
|
7
|
+
static examples = [
|
|
8
|
+
'<%= config.bin %> <%= command.id %>',
|
|
9
|
+
];
|
|
10
|
+
async run() {
|
|
11
|
+
const isDevcontainer = process.env.DEVCONTAINER === 'true';
|
|
12
|
+
const agentName = this.detectAgentName();
|
|
13
|
+
const repoName = this.detectRepoName();
|
|
14
|
+
const branch = this.getCurrentBranch();
|
|
15
|
+
const hqPath = process.env.PRLT_HQ_PATH;
|
|
16
|
+
this.log('');
|
|
17
|
+
this.log(colors.primary('🔍 Proletariat Context'));
|
|
18
|
+
this.log('');
|
|
19
|
+
// Agent info
|
|
20
|
+
if (agentName) {
|
|
21
|
+
this.log(` Agent: ${colors.primary(agentName)}`);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
this.log(` Agent: ${colors.textMuted('(not detected)')}`);
|
|
25
|
+
}
|
|
26
|
+
// Repository info
|
|
27
|
+
if (repoName) {
|
|
28
|
+
this.log(` Repository: ${colors.text(repoName)}`);
|
|
29
|
+
}
|
|
30
|
+
// Branch info
|
|
31
|
+
if (branch) {
|
|
32
|
+
this.log(` Branch: ${colors.text(branch)}`);
|
|
33
|
+
}
|
|
34
|
+
// Environment
|
|
35
|
+
this.log('');
|
|
36
|
+
this.log(` Environment: ${isDevcontainer ? colors.primary('devcontainer') : colors.text('host')}`);
|
|
37
|
+
this.log(` Working dir: ${colors.textMuted(process.cwd())}`);
|
|
38
|
+
if (hqPath) {
|
|
39
|
+
this.log(` HQ path: ${colors.textMuted(hqPath)}`);
|
|
40
|
+
}
|
|
41
|
+
// Show PMO path if available
|
|
42
|
+
const pmoPath = process.env.PRLT_PMO_PATH;
|
|
43
|
+
if (pmoPath) {
|
|
44
|
+
this.log(` PMO path: ${colors.textMuted(pmoPath)}`);
|
|
45
|
+
}
|
|
46
|
+
this.log('');
|
|
47
|
+
}
|
|
48
|
+
detectAgentName() {
|
|
49
|
+
// Check environment variable first (set in devcontainer)
|
|
50
|
+
if (process.env.PRLT_AGENT_NAME) {
|
|
51
|
+
return process.env.PRLT_AGENT_NAME;
|
|
52
|
+
}
|
|
53
|
+
// Try to detect from directory structure
|
|
54
|
+
// Pattern: /workspace/proletariat-{agentName} or agents/staff/{agentName}
|
|
55
|
+
const cwd = process.cwd();
|
|
56
|
+
// Devcontainer pattern: /workspace/proletariat-{agent}
|
|
57
|
+
const workspaceMatch = cwd.match(/\/workspace\/[^/]+-(\w+)/);
|
|
58
|
+
if (workspaceMatch) {
|
|
59
|
+
return workspaceMatch[1];
|
|
60
|
+
}
|
|
61
|
+
// Host pattern: agents/staff/{agent}
|
|
62
|
+
const staffMatch = cwd.match(/agents\/staff\/(\w+)/);
|
|
63
|
+
if (staffMatch) {
|
|
64
|
+
return staffMatch[1];
|
|
65
|
+
}
|
|
66
|
+
// Try git branch pattern: agent-{name}
|
|
67
|
+
try {
|
|
68
|
+
const branch = execSync('git branch --show-current', { encoding: 'utf-8', stdio: 'pipe' }).trim();
|
|
69
|
+
const agentBranchMatch = branch.match(/^agent-(\w+)$/);
|
|
70
|
+
if (agentBranchMatch) {
|
|
71
|
+
return agentBranchMatch[1];
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Ignore git errors
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
detectRepoName() {
|
|
80
|
+
// Try to get repo name from directory or git remote
|
|
81
|
+
try {
|
|
82
|
+
const remote = execSync('git remote get-url origin', { encoding: 'utf-8', stdio: 'pipe' }).trim();
|
|
83
|
+
const match = remote.match(/\/([^/]+?)(?:\.git)?$/);
|
|
84
|
+
if (match) {
|
|
85
|
+
return match[1];
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Ignore git errors
|
|
90
|
+
}
|
|
91
|
+
// Fallback to directory name
|
|
92
|
+
const cwd = process.cwd();
|
|
93
|
+
return path.basename(cwd);
|
|
94
|
+
}
|
|
95
|
+
getCurrentBranch() {
|
|
96
|
+
try {
|
|
97
|
+
return execSync('git branch --show-current', { encoding: 'utf-8', stdio: 'pipe' }).trim();
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class WorkComplete 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
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
};
|
|
12
|
+
execute(): Promise<void>;
|
|
13
|
+
}
|