@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,17 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class ProjectDelete 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
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
};
|
|
13
|
+
protected getPMOOptions(): {
|
|
14
|
+
promptIfMultiple: boolean;
|
|
15
|
+
};
|
|
16
|
+
execute(): Promise<void>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import inquirer from 'inquirer';
|
|
5
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
6
|
+
import { styles } from '../../lib/styles.js';
|
|
7
|
+
import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
|
|
8
|
+
export default class ProjectDelete extends PMOCommand {
|
|
9
|
+
static description = 'Delete a project from the PMO';
|
|
10
|
+
static examples = [
|
|
11
|
+
'<%= config.bin %> <%= command.id %> my-project',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> my-project --force',
|
|
13
|
+
];
|
|
14
|
+
static args = {
|
|
15
|
+
id: Args.string({
|
|
16
|
+
description: 'Project ID to delete - prompts with dropdown if not provided',
|
|
17
|
+
required: false,
|
|
18
|
+
}),
|
|
19
|
+
};
|
|
20
|
+
static flags = {
|
|
21
|
+
...pmoBaseFlags,
|
|
22
|
+
force: Flags.boolean({
|
|
23
|
+
char: 'f',
|
|
24
|
+
description: 'Skip confirmation prompt',
|
|
25
|
+
default: false,
|
|
26
|
+
}),
|
|
27
|
+
json: Flags.boolean({
|
|
28
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
29
|
+
default: false,
|
|
30
|
+
}),
|
|
31
|
+
};
|
|
32
|
+
getPMOOptions() {
|
|
33
|
+
return { promptIfMultiple: false };
|
|
34
|
+
}
|
|
35
|
+
async execute() {
|
|
36
|
+
const { args, flags } = await this.parse(ProjectDelete);
|
|
37
|
+
// Check if JSON output mode is active
|
|
38
|
+
const jsonMode = shouldOutputJson(flags);
|
|
39
|
+
// Helper to handle errors in JSON mode
|
|
40
|
+
const handleError = (code, message) => {
|
|
41
|
+
if (jsonMode) {
|
|
42
|
+
outputErrorAsJson(code, message, createMetadata('project delete', flags));
|
|
43
|
+
this.exit(1);
|
|
44
|
+
}
|
|
45
|
+
this.error(message);
|
|
46
|
+
};
|
|
47
|
+
// Get project ID - prompt if not provided
|
|
48
|
+
let projectId = args.id;
|
|
49
|
+
if (!projectId) {
|
|
50
|
+
const projects = await this.storage.listProjects();
|
|
51
|
+
if (projects.length === 0) {
|
|
52
|
+
return handleError('NO_PROJECTS', 'No projects found.');
|
|
53
|
+
}
|
|
54
|
+
const deletableProjects = projects.filter(p => p.id !== 'default');
|
|
55
|
+
if (deletableProjects.length === 0) {
|
|
56
|
+
return handleError('NO_DELETABLE_PROJECTS', 'No deletable projects found. Cannot delete the default project.');
|
|
57
|
+
}
|
|
58
|
+
// In JSON mode, output project selection prompt
|
|
59
|
+
if (jsonMode) {
|
|
60
|
+
const projectChoices = deletableProjects.map(p => ({ name: `${p.id} - ${p.name}`, value: p.id }));
|
|
61
|
+
outputPromptAsJson(buildPromptConfig('list', 'id', 'Select project to delete:', projectChoices), createMetadata('project delete', flags));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const { selectedProjectId } = await inquirer.prompt([{
|
|
65
|
+
type: 'list',
|
|
66
|
+
name: 'selectedProjectId',
|
|
67
|
+
message: 'Select project to delete:',
|
|
68
|
+
choices: deletableProjects.map(p => ({
|
|
69
|
+
name: `${p.id} - ${p.name}`,
|
|
70
|
+
value: p.id,
|
|
71
|
+
})),
|
|
72
|
+
}]);
|
|
73
|
+
projectId = selectedProjectId;
|
|
74
|
+
}
|
|
75
|
+
if (projectId === 'default') {
|
|
76
|
+
return handleError('CANNOT_DELETE_DEFAULT', 'Cannot delete the default project.');
|
|
77
|
+
}
|
|
78
|
+
// Check if project exists
|
|
79
|
+
const project = await this.storage.getProject(projectId);
|
|
80
|
+
if (!project) {
|
|
81
|
+
return handleError('PROJECT_NOT_FOUND', `Project "${projectId}" not found.`);
|
|
82
|
+
}
|
|
83
|
+
// Get ticket count
|
|
84
|
+
const tickets = await this.storage.listTickets(projectId);
|
|
85
|
+
const ticketCount = tickets.length;
|
|
86
|
+
// Confirm deletion
|
|
87
|
+
if (!flags.force) {
|
|
88
|
+
const message = ticketCount > 0
|
|
89
|
+
? `Delete project "${project.name}" and its ${ticketCount} ticket(s)?`
|
|
90
|
+
: `Delete project "${project.name}"?`;
|
|
91
|
+
// In JSON mode, output confirmation prompt
|
|
92
|
+
if (jsonMode) {
|
|
93
|
+
const confirmChoices = [
|
|
94
|
+
{ name: 'No, cancel', value: 'false' },
|
|
95
|
+
{ name: 'Yes, delete', value: 'true' },
|
|
96
|
+
];
|
|
97
|
+
outputPromptAsJson(buildPromptConfig('list', 'confirmed', message, confirmChoices), createMetadata('project delete', flags));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const { confirm } = await inquirer.prompt([{
|
|
101
|
+
type: 'list',
|
|
102
|
+
name: 'confirm',
|
|
103
|
+
message,
|
|
104
|
+
choices: [
|
|
105
|
+
{ name: 'No, cancel', value: false },
|
|
106
|
+
{ name: 'Yes, delete', value: true },
|
|
107
|
+
],
|
|
108
|
+
default: 0,
|
|
109
|
+
}]);
|
|
110
|
+
if (!confirm) {
|
|
111
|
+
this.log(styles.muted('Cancelled.'));
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Delete project from database
|
|
116
|
+
await this.storage.deleteProject(projectId);
|
|
117
|
+
// Delete entire project folder: pmo/projects/{projectId}/
|
|
118
|
+
// This includes board.md and specs/ directory
|
|
119
|
+
const projectPath = path.join(this.pmoPath, 'projects', projectId);
|
|
120
|
+
if (fs.existsSync(projectPath)) {
|
|
121
|
+
fs.rmSync(projectPath, { recursive: true, force: true });
|
|
122
|
+
}
|
|
123
|
+
this.log(styles.success(`Deleted project "${project.name}"`));
|
|
124
|
+
if (ticketCount > 0) {
|
|
125
|
+
this.log(styles.muted(` (${ticketCount} ticket(s) removed)`));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class Project 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
|
+
protected getPMOOptions(): {
|
|
10
|
+
promptIfMultiple: boolean;
|
|
11
|
+
};
|
|
12
|
+
execute(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
3
|
+
import { shouldOutputJson, } from '../../lib/prompt-json.js';
|
|
4
|
+
export default class Project extends PMOCommand {
|
|
5
|
+
static description = 'Interactive menu for project operations';
|
|
6
|
+
static examples = [
|
|
7
|
+
'<%= config.bin %> <%= command.id %>',
|
|
8
|
+
];
|
|
9
|
+
static flags = {
|
|
10
|
+
...pmoBaseFlags,
|
|
11
|
+
json: Flags.boolean({
|
|
12
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
13
|
+
default: false,
|
|
14
|
+
}),
|
|
15
|
+
};
|
|
16
|
+
getPMOOptions() {
|
|
17
|
+
return { promptIfMultiple: false };
|
|
18
|
+
}
|
|
19
|
+
async execute() {
|
|
20
|
+
const { flags } = await this.parse(Project);
|
|
21
|
+
// Check if JSON output mode is active
|
|
22
|
+
const jsonMode = shouldOutputJson(flags);
|
|
23
|
+
// Define choices once, use for both JSON and interactive modes
|
|
24
|
+
// Each choice includes the full command for AI agents to execute
|
|
25
|
+
const menuChoices = [
|
|
26
|
+
{ id: 'create', name: 'Create new project', command: 'prlt project create --json' },
|
|
27
|
+
{ id: 'list', name: 'List all projects', command: 'prlt project list --format json' },
|
|
28
|
+
{ id: 'view', name: 'View project board', command: 'prlt project view --json' },
|
|
29
|
+
{ id: 'spec', name: 'Manage project specs', command: 'prlt project spec --json' },
|
|
30
|
+
{ id: 'delete', name: 'Delete project', command: 'prlt project delete --json' },
|
|
31
|
+
{ id: 'cancel', name: 'Cancel', command: '' },
|
|
32
|
+
];
|
|
33
|
+
const message = 'Project Operations - What would you like to do?';
|
|
34
|
+
const action = await this.selectFromList({
|
|
35
|
+
message,
|
|
36
|
+
items: menuChoices,
|
|
37
|
+
getName: (c) => c.name,
|
|
38
|
+
getValue: (c) => c.id,
|
|
39
|
+
getCommand: (c) => c.command,
|
|
40
|
+
jsonMode: jsonMode ? { flags, commandName: 'project' } : null,
|
|
41
|
+
});
|
|
42
|
+
if (action === 'cancel' || !action) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// Run the selected subcommand
|
|
46
|
+
switch (action) {
|
|
47
|
+
case 'create':
|
|
48
|
+
await this.config.runCommand('project:create', []);
|
|
49
|
+
break;
|
|
50
|
+
case 'list':
|
|
51
|
+
await this.config.runCommand('project:list', []);
|
|
52
|
+
break;
|
|
53
|
+
case 'view':
|
|
54
|
+
await this.config.runCommand('project:view', []);
|
|
55
|
+
break;
|
|
56
|
+
case 'spec':
|
|
57
|
+
await this.config.runCommand('project:spec', []);
|
|
58
|
+
break;
|
|
59
|
+
case 'delete':
|
|
60
|
+
await this.config.runCommand('project:delete', []);
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class ProjectList extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
archived: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
};
|
|
10
|
+
protected getPMOOptions(): {
|
|
11
|
+
promptIfMultiple: boolean;
|
|
12
|
+
};
|
|
13
|
+
execute(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
3
|
+
import { styles } from '../../lib/styles.js';
|
|
4
|
+
export default class ProjectList extends PMOCommand {
|
|
5
|
+
static description = 'List all projects in the PMO';
|
|
6
|
+
static examples = [
|
|
7
|
+
'<%= config.bin %> <%= command.id %>',
|
|
8
|
+
'<%= config.bin %> <%= command.id %> --archived',
|
|
9
|
+
'<%= config.bin %> <%= command.id %> --all',
|
|
10
|
+
];
|
|
11
|
+
static flags = {
|
|
12
|
+
...pmoBaseFlags,
|
|
13
|
+
archived: Flags.boolean({
|
|
14
|
+
char: 'a',
|
|
15
|
+
description: 'Show only archived projects',
|
|
16
|
+
default: false,
|
|
17
|
+
}),
|
|
18
|
+
all: Flags.boolean({
|
|
19
|
+
description: 'Show all projects (including archived)',
|
|
20
|
+
default: false,
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
getPMOOptions() {
|
|
24
|
+
return { promptIfMultiple: false };
|
|
25
|
+
}
|
|
26
|
+
async execute() {
|
|
27
|
+
const { flags } = await this.parse(ProjectList);
|
|
28
|
+
// Determine filter based on flags
|
|
29
|
+
let isArchived;
|
|
30
|
+
if (flags.archived) {
|
|
31
|
+
isArchived = true;
|
|
32
|
+
}
|
|
33
|
+
else if (!flags.all) {
|
|
34
|
+
isArchived = false; // Default: show only non-archived
|
|
35
|
+
}
|
|
36
|
+
// If --all, isArchived is undefined (show both)
|
|
37
|
+
const projects = await this.storage.listProjects({ isArchived });
|
|
38
|
+
// Get phases for display
|
|
39
|
+
const phases = await this.storage.listPhases();
|
|
40
|
+
const phaseMap = new Map(phases.map(p => [p.id, p]));
|
|
41
|
+
if (projects.length === 0) {
|
|
42
|
+
if (flags.archived) {
|
|
43
|
+
this.log(styles.muted('No archived projects found.'));
|
|
44
|
+
}
|
|
45
|
+
else if (flags.all) {
|
|
46
|
+
this.log(styles.muted('No projects found. Create one with: prlt project create'));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
this.log(styles.muted('No active projects found. Create one with: prlt project create'));
|
|
50
|
+
// Check if there are archived projects
|
|
51
|
+
const archivedProjects = await this.storage.listProjects({ isArchived: true });
|
|
52
|
+
if (archivedProjects.length > 0) {
|
|
53
|
+
this.log(styles.muted(`(${archivedProjects.length} archived project${archivedProjects.length > 1 ? 's' : ''} hidden. Use --archived to view)`));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const title = flags.archived ? 'Archived Projects' : flags.all ? 'All Projects' : 'Projects';
|
|
59
|
+
this.log(styles.title(`\n${title}\n`));
|
|
60
|
+
// Get ticket counts using listProjectSummaries
|
|
61
|
+
const summaries = await this.storage.listProjectSummaries();
|
|
62
|
+
const ticketCountMap = new Map(summaries.map(s => [s.id, s.ticketCount]));
|
|
63
|
+
for (const project of projects) {
|
|
64
|
+
const isDefault = project.id === 'default';
|
|
65
|
+
const markers = [];
|
|
66
|
+
if (isDefault)
|
|
67
|
+
markers.push(styles.success('default'));
|
|
68
|
+
if (project.isArchived)
|
|
69
|
+
markers.push(styles.muted('archived'));
|
|
70
|
+
const markerStr = markers.length > 0 ? ` (${markers.join(', ')})` : '';
|
|
71
|
+
this.log(` ${styles.emphasis(project.name)}${markerStr}`);
|
|
72
|
+
this.log(styles.muted(` ID: ${project.id}`));
|
|
73
|
+
// Show ticket count
|
|
74
|
+
const ticketCount = ticketCountMap.get(project.id) ?? 0;
|
|
75
|
+
this.log(styles.muted(` Tickets: ${ticketCount}`));
|
|
76
|
+
// Show phase if set
|
|
77
|
+
if (project.phaseId) {
|
|
78
|
+
const phase = phaseMap.get(project.phaseId);
|
|
79
|
+
if (phase) {
|
|
80
|
+
this.log(styles.muted(` Phase: ${phase.name}`));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (project.description) {
|
|
84
|
+
this.log(styles.muted(` ${project.description}`));
|
|
85
|
+
}
|
|
86
|
+
this.log('');
|
|
87
|
+
}
|
|
88
|
+
// Show hint about archived projects when viewing active
|
|
89
|
+
if (!flags.archived && !flags.all) {
|
|
90
|
+
const archivedProjects = await this.storage.listProjects({ isArchived: true });
|
|
91
|
+
if (archivedProjects.length > 0) {
|
|
92
|
+
this.log(styles.muted(`(${archivedProjects.length} archived project${archivedProjects.length > 1 ? 's' : ''} hidden. Use --archived to view)`));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class ProjectSpec extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
projectId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
add: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
remove: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
};
|
|
14
|
+
protected getPMOOptions(): {
|
|
15
|
+
promptIfMultiple: boolean;
|
|
16
|
+
};
|
|
17
|
+
execute(): Promise<void>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
4
|
+
import { styles } from '../../lib/styles.js';
|
|
5
|
+
import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
|
|
6
|
+
export default class ProjectSpec extends PMOCommand {
|
|
7
|
+
static description = 'Manage specs associated with a project (many-to-many)';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %> my-project',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> my-project --add SPEC-001',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> my-project --remove SPEC-001',
|
|
12
|
+
'<%= config.bin %> <%= command.id %>',
|
|
13
|
+
];
|
|
14
|
+
static args = {
|
|
15
|
+
projectId: Args.string({
|
|
16
|
+
description: 'Project ID',
|
|
17
|
+
required: false,
|
|
18
|
+
}),
|
|
19
|
+
};
|
|
20
|
+
static flags = {
|
|
21
|
+
...pmoBaseFlags,
|
|
22
|
+
add: Flags.string({
|
|
23
|
+
char: 'a',
|
|
24
|
+
description: 'Add a spec to this project',
|
|
25
|
+
}),
|
|
26
|
+
remove: Flags.string({
|
|
27
|
+
char: 'r',
|
|
28
|
+
description: 'Remove a spec from this project',
|
|
29
|
+
}),
|
|
30
|
+
json: Flags.boolean({
|
|
31
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
32
|
+
default: false,
|
|
33
|
+
}),
|
|
34
|
+
};
|
|
35
|
+
getPMOOptions() {
|
|
36
|
+
return { promptIfMultiple: false };
|
|
37
|
+
}
|
|
38
|
+
async execute() {
|
|
39
|
+
const { args, flags } = await this.parse(ProjectSpec);
|
|
40
|
+
// Check if JSON output mode is active
|
|
41
|
+
const jsonMode = shouldOutputJson(flags);
|
|
42
|
+
// Helper to handle errors in JSON mode
|
|
43
|
+
const handleError = (code, message) => {
|
|
44
|
+
if (jsonMode) {
|
|
45
|
+
outputErrorAsJson(code, message, createMetadata('project spec', flags));
|
|
46
|
+
this.exit(1);
|
|
47
|
+
}
|
|
48
|
+
this.error(message);
|
|
49
|
+
};
|
|
50
|
+
// Get all projects
|
|
51
|
+
const projects = await this.storage.listProjects();
|
|
52
|
+
if (projects.length === 0) {
|
|
53
|
+
if (jsonMode) {
|
|
54
|
+
outputErrorAsJson('NO_PROJECTS', 'No projects found. Create one with: prlt project create', createMetadata('project spec', flags));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
this.log(styles.muted('\nNo projects found. Create one with: prlt project create'));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
let projectId = args.projectId;
|
|
61
|
+
// If no project ID provided, prompt for selection
|
|
62
|
+
if (!projectId) {
|
|
63
|
+
// In JSON mode, output project selection prompt
|
|
64
|
+
if (jsonMode) {
|
|
65
|
+
const projectChoices = projects.map(p => ({ name: `${p.id} - ${p.name} (${p.status})`, value: p.id }));
|
|
66
|
+
outputPromptAsJson(buildPromptConfig('list', 'projectId', 'Select project:', projectChoices), createMetadata('project spec', flags));
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const { selected } = await inquirer.prompt([{
|
|
70
|
+
type: 'list',
|
|
71
|
+
name: 'selected',
|
|
72
|
+
message: 'Select project:',
|
|
73
|
+
choices: projects.map(p => ({
|
|
74
|
+
name: `${p.id} - ${p.name} (${p.status})`,
|
|
75
|
+
value: p.id,
|
|
76
|
+
})),
|
|
77
|
+
}]);
|
|
78
|
+
projectId = selected;
|
|
79
|
+
}
|
|
80
|
+
// Validate project exists
|
|
81
|
+
const project = projects.find(p => p.id === projectId);
|
|
82
|
+
if (!project) {
|
|
83
|
+
return handleError('PROJECT_NOT_FOUND', `Project not found: ${projectId}`);
|
|
84
|
+
}
|
|
85
|
+
// Get specs currently associated with this project
|
|
86
|
+
const projectSpecs = await this.storage.getSpecsForProject(projectId);
|
|
87
|
+
const projectSpecIds = new Set(projectSpecs.map(s => s.id));
|
|
88
|
+
// Handle add flag
|
|
89
|
+
if (flags.add) {
|
|
90
|
+
const spec = await this.storage.getSpec(flags.add);
|
|
91
|
+
if (!spec) {
|
|
92
|
+
this.error(`Spec not found: ${flags.add}`);
|
|
93
|
+
}
|
|
94
|
+
if (projectSpecIds.has(flags.add)) {
|
|
95
|
+
this.log(styles.muted(`\nSpec "${flags.add}" is already associated with project "${projectId}".`));
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
await this.storage.linkProjectToSpec(projectId, flags.add);
|
|
99
|
+
this.log(styles.success(`\nAdded spec ${styles.emphasis(flags.add)} to project ${styles.emphasis(projectId)}`));
|
|
100
|
+
this.log(styles.muted(` Spec: ${spec.title}`));
|
|
101
|
+
}
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// Handle remove flag
|
|
105
|
+
if (flags.remove) {
|
|
106
|
+
if (!projectSpecIds.has(flags.remove)) {
|
|
107
|
+
this.log(styles.muted(`\nSpec "${flags.remove}" is not associated with project "${projectId}".`));
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
await this.storage.unlinkProjectFromSpec(projectId, flags.remove);
|
|
111
|
+
this.log(styles.success(`\nRemoved spec ${styles.emphasis(flags.remove)} from project ${styles.emphasis(projectId)}`));
|
|
112
|
+
}
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
// Interactive mode: show menu
|
|
116
|
+
// In JSON mode, output the menu prompt (no loop - AI will call back)
|
|
117
|
+
if (jsonMode) {
|
|
118
|
+
const currentSpecs = await this.storage.getSpecsForProject(projectId);
|
|
119
|
+
const menuChoices = [
|
|
120
|
+
{ name: 'Add spec to project', value: 'add' },
|
|
121
|
+
{ name: 'Remove spec from project', value: 'remove' },
|
|
122
|
+
{ name: 'Done', value: 'done' },
|
|
123
|
+
];
|
|
124
|
+
outputPromptAsJson({
|
|
125
|
+
...buildPromptConfig('list', 'action', `Manage specs for ${projectId}:`, menuChoices),
|
|
126
|
+
context: {
|
|
127
|
+
projectId,
|
|
128
|
+
currentSpecs: currentSpecs.map(s => ({ id: s.id, title: s.title, status: s.status })),
|
|
129
|
+
},
|
|
130
|
+
}, createMetadata('project spec', flags));
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
let continueLoop = true;
|
|
134
|
+
while (continueLoop) {
|
|
135
|
+
// Refresh project specs each iteration
|
|
136
|
+
const currentSpecs = await this.storage.getSpecsForProject(projectId);
|
|
137
|
+
const currentSpecIds = new Set(currentSpecs.map(s => s.id));
|
|
138
|
+
this.log(styles.title(`\nSpecs for project "${project.name}" (${projectId})`));
|
|
139
|
+
if (currentSpecs.length === 0) {
|
|
140
|
+
this.log(styles.muted(' No specs associated with this project.'));
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
for (const spec of currentSpecs) {
|
|
144
|
+
this.log(` ${styles.code(spec.id)} - ${spec.title} (${spec.status})`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const { action } = await inquirer.prompt([{
|
|
148
|
+
type: 'list',
|
|
149
|
+
name: 'action',
|
|
150
|
+
message: `Manage specs for ${projectId}:`,
|
|
151
|
+
choices: [
|
|
152
|
+
{ name: 'Add spec to project', value: 'add' },
|
|
153
|
+
{ name: 'Remove spec from project', value: 'remove' },
|
|
154
|
+
new inquirer.Separator(),
|
|
155
|
+
{ name: 'Done', value: 'done' },
|
|
156
|
+
],
|
|
157
|
+
}]);
|
|
158
|
+
if (action === 'done') {
|
|
159
|
+
continueLoop = false;
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
if (action === 'add') {
|
|
163
|
+
// Get all specs not already associated
|
|
164
|
+
const allSpecs = await this.storage.listSpecs();
|
|
165
|
+
const availableSpecs = allSpecs.filter(s => !currentSpecIds.has(s.id));
|
|
166
|
+
if (availableSpecs.length === 0) {
|
|
167
|
+
this.log(styles.muted('\n All specs are already associated with this project.'));
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
const { selected } = await inquirer.prompt([{
|
|
171
|
+
type: 'checkbox',
|
|
172
|
+
name: 'selected',
|
|
173
|
+
message: 'Select specs to add:',
|
|
174
|
+
choices: availableSpecs.map(s => ({
|
|
175
|
+
name: `${s.id} - ${s.title} (${s.status})`,
|
|
176
|
+
value: s.id,
|
|
177
|
+
})),
|
|
178
|
+
}]);
|
|
179
|
+
if (selected.length === 0) {
|
|
180
|
+
this.log(styles.muted(' No specs selected.'));
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
for (const specId of selected) {
|
|
184
|
+
await this.storage.linkProjectToSpec(projectId, specId);
|
|
185
|
+
this.log(styles.success(` Added ${specId}`));
|
|
186
|
+
}
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
if (action === 'remove') {
|
|
190
|
+
if (currentSpecs.length === 0) {
|
|
191
|
+
this.log(styles.muted('\n No specs to remove.'));
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const { selected } = await inquirer.prompt([{
|
|
195
|
+
type: 'checkbox',
|
|
196
|
+
name: 'selected',
|
|
197
|
+
message: 'Select specs to remove:',
|
|
198
|
+
choices: currentSpecs.map(s => ({
|
|
199
|
+
name: `${s.id} - ${s.title} (${s.status})`,
|
|
200
|
+
value: s.id,
|
|
201
|
+
})),
|
|
202
|
+
}]);
|
|
203
|
+
if (selected.length === 0) {
|
|
204
|
+
this.log(styles.muted(' No specs selected.'));
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
for (const specId of selected) {
|
|
208
|
+
await this.storage.unlinkProjectFromSpec(projectId, specId);
|
|
209
|
+
this.log(styles.success(` Removed ${specId}`));
|
|
210
|
+
}
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
this.log(styles.muted(`\nView project: prlt project view ${projectId}`));
|
|
215
|
+
}
|
|
216
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class ProjectUnarchive 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
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
};
|
|
11
|
+
protected getPMOOptions(): {
|
|
12
|
+
promptIfMultiple: boolean;
|
|
13
|
+
};
|
|
14
|
+
execute(): Promise<void>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Args } from '@oclif/core';
|
|
2
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
3
|
+
import { styles } from '../../lib/styles.js';
|
|
4
|
+
export default class ProjectUnarchive extends PMOCommand {
|
|
5
|
+
static description = 'Unarchive a project (restore to default views)';
|
|
6
|
+
static examples = [
|
|
7
|
+
'<%= config.bin %> <%= command.id %> old-project',
|
|
8
|
+
];
|
|
9
|
+
static args = {
|
|
10
|
+
id: Args.string({
|
|
11
|
+
description: 'Project ID',
|
|
12
|
+
required: true,
|
|
13
|
+
}),
|
|
14
|
+
};
|
|
15
|
+
static flags = {
|
|
16
|
+
...pmoBaseFlags,
|
|
17
|
+
};
|
|
18
|
+
getPMOOptions() {
|
|
19
|
+
return { promptIfMultiple: false };
|
|
20
|
+
}
|
|
21
|
+
async execute() {
|
|
22
|
+
const { args } = await this.parse(ProjectUnarchive);
|
|
23
|
+
const project = await this.storage.getProject(args.id);
|
|
24
|
+
if (!project) {
|
|
25
|
+
this.error(`Project "${args.id}" not found.`);
|
|
26
|
+
}
|
|
27
|
+
if (!project.isArchived) {
|
|
28
|
+
this.log(styles.muted(`Project "${project.name}" is not archived.`));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
await this.storage.unarchiveProject(args.id);
|
|
32
|
+
this.log(styles.success(`\nUnarchived project "${project.name}"`));
|
|
33
|
+
this.log(styles.muted('View project: prlt project view ' + args.id));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class ProjectView 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
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
};
|
|
12
|
+
protected getPMOOptions(): {
|
|
13
|
+
promptIfMultiple: boolean;
|
|
14
|
+
};
|
|
15
|
+
execute(): Promise<void>;
|
|
16
|
+
}
|