@proletariat/cli 0.2.0 ā 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +561 -251
- package/bin/dev.cmd +3 -0
- package/bin/dev.js +5 -0
- package/bin/run.cmd +3 -0
- package/bin/run.js +23 -0
- package/dist/commands/action/create.d.ts +21 -0
- package/dist/commands/action/create.js +126 -0
- package/dist/commands/action/delete.d.ts +17 -0
- package/dist/commands/action/delete.js +78 -0
- package/dist/commands/action/index.d.ts +15 -0
- package/dist/commands/action/index.js +107 -0
- package/dist/commands/action/list.d.ts +14 -0
- package/dist/commands/action/list.js +89 -0
- package/dist/commands/action/run.d.ts +19 -0
- package/dist/commands/action/run.js +179 -0
- package/dist/commands/action/show.d.ts +15 -0
- package/dist/commands/action/show.js +47 -0
- package/dist/commands/action/update.d.ts +22 -0
- package/dist/commands/action/update.js +168 -0
- package/dist/commands/agent/index.d.ts +13 -0
- package/dist/commands/agent/index.js +131 -0
- package/dist/commands/agent/list.d.ts +7 -0
- package/dist/commands/agent/list.js +126 -0
- package/dist/commands/agent/login.d.ts +16 -0
- package/dist/commands/agent/login.js +146 -0
- package/dist/commands/agent/rebuild.d.ts +18 -0
- package/dist/commands/agent/rebuild.js +133 -0
- package/dist/commands/agent/restart.d.ts +17 -0
- package/dist/commands/agent/restart.js +116 -0
- package/dist/commands/agent/shell.d.ts +23 -0
- package/dist/commands/agent/shell.js +378 -0
- package/dist/commands/agent/staff/add.d.ts +15 -0
- package/dist/commands/agent/staff/add.js +281 -0
- package/dist/commands/agent/staff/index.d.ts +14 -0
- package/dist/commands/agent/staff/index.js +90 -0
- package/dist/commands/agent/staff/list.d.ts +7 -0
- package/dist/commands/agent/staff/list.js +90 -0
- package/dist/commands/agent/staff/remove.d.ts +16 -0
- package/dist/commands/agent/staff/remove.js +137 -0
- package/dist/commands/agent/status.d.ts +17 -0
- package/dist/commands/agent/status.js +139 -0
- package/dist/commands/agent/temp/cleanup.d.ts +23 -0
- package/dist/commands/agent/temp/cleanup.js +388 -0
- package/dist/commands/agent/temp/index.d.ts +14 -0
- package/dist/commands/agent/temp/index.js +82 -0
- package/dist/commands/agent/temp/list.d.ts +7 -0
- package/dist/commands/agent/temp/list.js +108 -0
- package/dist/commands/agent/themes/add-names.d.ts +10 -0
- package/dist/commands/agent/themes/add-names.js +67 -0
- package/dist/commands/agent/themes/create.d.ts +13 -0
- package/dist/commands/agent/themes/create.js +66 -0
- package/dist/commands/agent/themes/index.d.ts +9 -0
- package/dist/commands/agent/themes/index.js +194 -0
- package/dist/commands/agent/themes/list.d.ts +6 -0
- package/dist/commands/agent/themes/list.js +41 -0
- package/dist/commands/agent/themes/set.d.ts +12 -0
- package/dist/commands/agent/themes/set.js +77 -0
- package/dist/commands/agent/visit.d.ts +16 -0
- package/dist/commands/agent/visit.js +88 -0
- package/dist/commands/autocomplete/setup.d.ts +14 -0
- package/dist/commands/autocomplete/setup.js +154 -0
- package/dist/commands/board/index.d.ts +17 -0
- package/dist/commands/board/index.js +255 -0
- package/dist/commands/board/watch.d.ts +13 -0
- package/dist/commands/board/watch.js +52 -0
- package/dist/commands/branch/create.d.ts +50 -0
- package/dist/commands/branch/create.js +624 -0
- package/dist/commands/branch/index.d.ts +13 -0
- package/dist/commands/branch/index.js +50 -0
- package/dist/commands/branch/list.d.ts +17 -0
- package/dist/commands/branch/list.js +120 -0
- package/dist/commands/branch/validate.d.ts +15 -0
- package/dist/commands/branch/validate.js +73 -0
- package/dist/commands/commit.d.ts +71 -0
- package/dist/commands/commit.js +499 -0
- package/dist/commands/docker/clean.d.ts +13 -0
- package/dist/commands/docker/clean.js +224 -0
- package/dist/commands/docker/index.d.ts +19 -0
- package/dist/commands/docker/index.js +274 -0
- package/dist/commands/docker/list.d.ts +16 -0
- package/dist/commands/docker/list.js +200 -0
- package/dist/commands/docker/logs.d.ts +14 -0
- package/dist/commands/docker/logs.js +118 -0
- package/dist/commands/docker/prune.d.ts +14 -0
- package/dist/commands/docker/prune.js +211 -0
- package/dist/commands/docker/restart.d.ts +14 -0
- package/dist/commands/docker/restart.js +129 -0
- package/dist/commands/docker/shell.d.ts +14 -0
- package/dist/commands/docker/shell.js +103 -0
- package/dist/commands/docker/start.d.ts +12 -0
- package/dist/commands/docker/start.js +92 -0
- package/dist/commands/docker/status.d.ts +7 -0
- package/dist/commands/docker/status.js +40 -0
- package/dist/commands/docker/stop.d.ts +14 -0
- package/dist/commands/docker/stop.js +134 -0
- package/dist/commands/docker/sync.d.ts +15 -0
- package/dist/commands/docker/sync.js +112 -0
- package/dist/commands/epic/activate.d.ts +13 -0
- package/dist/commands/epic/activate.js +118 -0
- package/dist/commands/epic/archive.d.ts +14 -0
- package/dist/commands/epic/archive.js +132 -0
- package/dist/commands/epic/create.d.ts +15 -0
- package/dist/commands/epic/create.js +137 -0
- package/dist/commands/epic/index.d.ts +13 -0
- package/dist/commands/epic/index.js +88 -0
- package/dist/commands/epic/link/block.d.ts +14 -0
- package/dist/commands/epic/link/block.js +79 -0
- package/dist/commands/epic/link/duplicates.d.ts +14 -0
- package/dist/commands/epic/link/duplicates.js +66 -0
- package/dist/commands/epic/link/index.d.ts +19 -0
- package/dist/commands/epic/link/index.js +242 -0
- package/dist/commands/epic/link/relates.d.ts +14 -0
- package/dist/commands/epic/link/relates.js +66 -0
- package/dist/commands/epic/link/remove.d.ts +16 -0
- package/dist/commands/epic/link/remove.js +89 -0
- package/dist/commands/epic/list.d.ts +11 -0
- package/dist/commands/epic/list.js +87 -0
- package/dist/commands/epic/move.d.ts +15 -0
- package/dist/commands/epic/move.js +184 -0
- package/dist/commands/epic/progress.d.ts +16 -0
- package/dist/commands/epic/progress.js +166 -0
- package/dist/commands/epic/project.d.ts +15 -0
- package/dist/commands/epic/project.js +219 -0
- package/dist/commands/epic/reorder.d.ts +21 -0
- package/dist/commands/epic/reorder.js +160 -0
- package/dist/commands/epic/spec.d.ts +15 -0
- package/dist/commands/epic/spec.js +191 -0
- package/dist/commands/epic/ticket.d.ts +18 -0
- package/dist/commands/epic/ticket.js +291 -0
- package/dist/commands/epic/view.d.ts +13 -0
- package/dist/commands/epic/view.js +117 -0
- package/dist/commands/execution/index.d.ts +13 -0
- package/dist/commands/execution/index.js +70 -0
- package/dist/commands/execution/list.d.ts +15 -0
- package/dist/commands/execution/list.js +144 -0
- package/dist/commands/execution/logs.d.ts +18 -0
- package/dist/commands/execution/logs.js +161 -0
- package/dist/commands/execution/stop.d.ts +22 -0
- package/dist/commands/execution/stop.js +248 -0
- package/dist/commands/gh/index.d.ts +9 -0
- package/dist/commands/gh/index.js +53 -0
- package/dist/commands/gh/login.d.ts +6 -0
- package/dist/commands/gh/login.js +57 -0
- package/dist/commands/gh/status.d.ts +6 -0
- package/dist/commands/gh/status.js +48 -0
- package/dist/commands/gh/token.d.ts +6 -0
- package/dist/commands/gh/token.js +59 -0
- package/dist/commands/init.d.ts +26 -0
- package/dist/commands/init.js +200 -0
- package/dist/commands/phase/create.d.ts +22 -0
- package/dist/commands/phase/create.js +123 -0
- package/dist/commands/phase/delete.d.ts +17 -0
- package/dist/commands/phase/delete.js +73 -0
- package/dist/commands/phase/list.d.ts +12 -0
- package/dist/commands/phase/list.js +76 -0
- package/dist/commands/phase/move.d.ts +17 -0
- package/dist/commands/phase/move.js +115 -0
- package/dist/commands/phase/template/apply.d.ts +17 -0
- package/dist/commands/phase/template/apply.js +106 -0
- package/dist/commands/phase/template/create.d.ts +16 -0
- package/dist/commands/phase/template/create.js +58 -0
- package/dist/commands/phase/template/delete.d.ts +17 -0
- package/dist/commands/phase/template/delete.js +98 -0
- package/dist/commands/phase/template/index.d.ts +15 -0
- package/dist/commands/phase/template/index.js +128 -0
- package/dist/commands/phase/template/list.d.ts +16 -0
- package/dist/commands/phase/template/list.js +95 -0
- package/dist/commands/phase/template/update.d.ts +17 -0
- package/dist/commands/phase/template/update.js +89 -0
- package/dist/commands/phase/update.d.ts +23 -0
- package/dist/commands/phase/update.js +174 -0
- package/dist/commands/pmo/init.d.ts +25 -0
- package/dist/commands/pmo/init.js +341 -0
- package/dist/commands/pr/create.d.ts +17 -0
- package/dist/commands/pr/create.js +242 -0
- package/dist/commands/pr/index.d.ts +9 -0
- package/dist/commands/pr/index.js +68 -0
- package/dist/commands/pr/link.d.ts +14 -0
- package/dist/commands/pr/link.js +212 -0
- package/dist/commands/pr/status.d.ts +12 -0
- package/dist/commands/pr/status.js +161 -0
- package/dist/commands/project/archive.d.ts +17 -0
- package/dist/commands/project/archive.js +83 -0
- package/dist/commands/project/create.d.ts +22 -0
- package/dist/commands/project/create.js +143 -0
- package/dist/commands/project/delete.d.ts +17 -0
- package/dist/commands/project/delete.js +128 -0
- package/dist/commands/project/index.d.ts +13 -0
- package/dist/commands/project/index.js +64 -0
- package/dist/commands/project/list.d.ts +14 -0
- package/dist/commands/project/list.js +96 -0
- package/dist/commands/project/spec.d.ts +18 -0
- package/dist/commands/project/spec.js +216 -0
- package/dist/commands/project/unarchive.d.ts +15 -0
- package/dist/commands/project/unarchive.js +35 -0
- package/dist/commands/project/view.d.ts +16 -0
- package/dist/commands/project/view.js +94 -0
- package/dist/commands/repo/add.d.ts +21 -0
- package/dist/commands/repo/add.js +118 -0
- package/dist/commands/repo/index.d.ts +13 -0
- package/dist/commands/repo/index.js +114 -0
- package/dist/commands/repo/list.d.ts +13 -0
- package/dist/commands/repo/list.js +96 -0
- package/dist/commands/repo/remove.d.ts +23 -0
- package/dist/commands/repo/remove.js +217 -0
- package/dist/commands/repo/view.d.ts +15 -0
- package/dist/commands/repo/view.js +99 -0
- package/dist/commands/session/attach.d.ts +40 -0
- package/dist/commands/session/attach.js +307 -0
- package/dist/commands/session/index.d.ts +13 -0
- package/dist/commands/session/index.js +64 -0
- package/dist/commands/session/list.d.ts +21 -0
- package/dist/commands/session/list.js +181 -0
- package/dist/commands/spec/create.d.ts +19 -0
- package/dist/commands/spec/create.js +130 -0
- package/dist/commands/spec/index.d.ts +13 -0
- package/dist/commands/spec/index.js +68 -0
- package/dist/commands/spec/link/depends.d.ts +14 -0
- package/dist/commands/spec/link/depends.js +64 -0
- package/dist/commands/spec/link/duplicates.d.ts +14 -0
- package/dist/commands/spec/link/duplicates.js +63 -0
- package/dist/commands/spec/link/index.d.ts +19 -0
- package/dist/commands/spec/link/index.js +200 -0
- package/dist/commands/spec/link/relates.d.ts +14 -0
- package/dist/commands/spec/link/relates.js +63 -0
- package/dist/commands/spec/link/remove.d.ts +16 -0
- package/dist/commands/spec/link/remove.js +94 -0
- package/dist/commands/spec/list.d.ts +12 -0
- package/dist/commands/spec/list.js +75 -0
- package/dist/commands/spec/plan.d.ts +15 -0
- package/dist/commands/spec/plan.js +108 -0
- package/dist/commands/spec/ticket.d.ts +18 -0
- package/dist/commands/spec/ticket.js +160 -0
- package/dist/commands/spec/view.d.ts +15 -0
- package/dist/commands/spec/view.js +163 -0
- package/dist/commands/status/create.d.ts +21 -0
- package/dist/commands/status/create.js +140 -0
- package/dist/commands/status/delete.d.ts +13 -0
- package/dist/commands/status/delete.js +77 -0
- package/dist/commands/status/index.d.ts +14 -0
- package/dist/commands/status/index.js +91 -0
- package/dist/commands/status/list.d.ts +12 -0
- package/dist/commands/status/list.js +93 -0
- package/dist/commands/status/move.d.ts +14 -0
- package/dist/commands/status/move.js +120 -0
- package/dist/commands/status/update.d.ts +20 -0
- package/dist/commands/status/update.js +180 -0
- package/dist/commands/template/delete.d.ts +15 -0
- package/dist/commands/template/delete.js +142 -0
- package/dist/commands/template/index.d.ts +10 -0
- package/dist/commands/template/index.js +64 -0
- package/dist/commands/template/list.d.ts +18 -0
- package/dist/commands/template/list.js +157 -0
- package/dist/commands/template/phase/apply.d.ts +14 -0
- package/dist/commands/template/phase/apply.js +41 -0
- package/dist/commands/template/phase/create.d.ts +12 -0
- package/dist/commands/template/phase/create.js +29 -0
- package/dist/commands/template/phase/delete.d.ts +13 -0
- package/dist/commands/template/phase/delete.js +34 -0
- package/dist/commands/template/phase/index.d.ts +10 -0
- package/dist/commands/template/phase/index.js +62 -0
- package/dist/commands/template/phase/list.d.ts +11 -0
- package/dist/commands/template/phase/list.js +34 -0
- package/dist/commands/template/phase/update.d.ts +13 -0
- package/dist/commands/template/phase/update.js +35 -0
- package/dist/commands/template/ticket/apply.d.ts +17 -0
- package/dist/commands/template/ticket/apply.js +58 -0
- package/dist/commands/template/ticket/delete.d.ts +13 -0
- package/dist/commands/template/ticket/delete.js +34 -0
- package/dist/commands/template/ticket/index.d.ts +10 -0
- package/dist/commands/template/ticket/index.js +62 -0
- package/dist/commands/template/ticket/list.d.ts +11 -0
- package/dist/commands/template/ticket/list.js +34 -0
- package/dist/commands/template/ticket/save.d.ts +13 -0
- package/dist/commands/template/ticket/save.js +35 -0
- package/dist/commands/ticket/bulk.d.ts +13 -0
- package/dist/commands/ticket/bulk.js +145 -0
- package/dist/commands/ticket/complete.d.ts +16 -0
- package/dist/commands/ticket/complete.js +170 -0
- package/dist/commands/ticket/create.d.ts +22 -0
- package/dist/commands/ticket/create.js +390 -0
- package/dist/commands/ticket/delete.d.ts +16 -0
- package/dist/commands/ticket/delete.js +178 -0
- package/dist/commands/ticket/edit.d.ts +27 -0
- package/dist/commands/ticket/edit.js +322 -0
- package/dist/commands/ticket/epic.d.ts +20 -0
- package/dist/commands/ticket/epic.js +333 -0
- package/dist/commands/ticket/index.d.ts +13 -0
- package/dist/commands/ticket/index.js +103 -0
- package/dist/commands/ticket/link/block.d.ts +14 -0
- package/dist/commands/ticket/link/block.js +94 -0
- package/dist/commands/ticket/link/duplicates.d.ts +14 -0
- package/dist/commands/ticket/link/duplicates.js +93 -0
- package/dist/commands/ticket/link/index.d.ts +19 -0
- package/dist/commands/ticket/link/index.js +239 -0
- package/dist/commands/ticket/link/relates.d.ts +14 -0
- package/dist/commands/ticket/link/relates.js +93 -0
- package/dist/commands/ticket/link/remove.d.ts +16 -0
- package/dist/commands/ticket/link/remove.js +128 -0
- package/dist/commands/ticket/list.d.ts +24 -0
- package/dist/commands/ticket/list.js +431 -0
- package/dist/commands/ticket/move.d.ts +18 -0
- package/dist/commands/ticket/move.js +212 -0
- package/dist/commands/ticket/project.d.ts +18 -0
- package/dist/commands/ticket/project.js +254 -0
- package/dist/commands/ticket/reassign.d.ts +19 -0
- package/dist/commands/ticket/reassign.js +279 -0
- package/dist/commands/ticket/spec.d.ts +18 -0
- package/dist/commands/ticket/spec.js +259 -0
- package/dist/commands/ticket/status.d.ts +13 -0
- package/dist/commands/ticket/status.js +87 -0
- package/dist/commands/ticket/template/apply.d.ts +25 -0
- package/dist/commands/ticket/template/apply.js +249 -0
- package/dist/commands/ticket/template/create.d.ts +19 -0
- package/dist/commands/ticket/template/create.js +210 -0
- package/dist/commands/ticket/template/delete.d.ts +17 -0
- package/dist/commands/ticket/template/delete.js +92 -0
- package/dist/commands/ticket/template/index.d.ts +15 -0
- package/dist/commands/ticket/template/index.js +118 -0
- package/dist/commands/ticket/template/list.d.ts +16 -0
- package/dist/commands/ticket/template/list.js +110 -0
- package/dist/commands/ticket/template/save.d.ts +14 -0
- package/dist/commands/ticket/template/save.js +110 -0
- package/dist/commands/ticket/update.d.ts +18 -0
- package/dist/commands/ticket/update.js +325 -0
- package/dist/commands/ticket/view.d.ts +13 -0
- package/dist/commands/ticket/view.js +80 -0
- package/dist/commands/whoami.d.ts +9 -0
- package/dist/commands/whoami.js +103 -0
- package/dist/commands/work/complete.d.ts +13 -0
- package/dist/commands/work/complete.js +121 -0
- package/dist/commands/work/index.d.ts +13 -0
- package/dist/commands/work/index.js +70 -0
- package/dist/commands/work/ready.d.ts +24 -0
- package/dist/commands/work/ready.js +290 -0
- package/dist/commands/work/revise.d.ts +19 -0
- package/dist/commands/work/revise.js +377 -0
- package/dist/commands/work/spawn-all.d.ts +17 -0
- package/dist/commands/work/spawn-all.js +58 -0
- package/dist/commands/work/spawn.d.ts +29 -0
- package/dist/commands/work/spawn.js +728 -0
- package/dist/commands/work/start.d.ts +39 -0
- package/dist/commands/work/start.js +1393 -0
- package/dist/commands/work/watch.d.ts +31 -0
- package/dist/commands/work/watch.js +359 -0
- package/dist/commands/workflow/create.d.ts +18 -0
- package/dist/commands/workflow/create.js +119 -0
- package/dist/commands/workflow/delete.d.ts +17 -0
- package/dist/commands/workflow/delete.js +119 -0
- package/dist/commands/workflow/index.d.ts +15 -0
- package/dist/commands/workflow/index.js +75 -0
- package/dist/commands/workflow/list.d.ts +15 -0
- package/dist/commands/workflow/list.js +75 -0
- package/dist/commands/workflow/switch.d.ts +13 -0
- package/dist/commands/workflow/switch.js +117 -0
- package/dist/commands/workflow/view.d.ts +16 -0
- package/dist/commands/workflow/view.js +114 -0
- package/dist/commands/workspace/add.d.ts +12 -0
- package/dist/commands/workspace/add.js +74 -0
- package/dist/commands/workspace/list.d.ts +9 -0
- package/dist/commands/workspace/list.js +153 -0
- package/dist/commands/workspace/remove.d.ts +13 -0
- package/dist/commands/workspace/remove.js +98 -0
- package/dist/commands/workspace/use.d.ts +12 -0
- package/dist/commands/workspace/use.js +111 -0
- package/dist/hooks/init.d.ts +11 -0
- package/dist/hooks/init.js +57 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/lib/agents/commands.d.ts +189 -0
- package/dist/lib/agents/commands.js +893 -0
- package/dist/lib/agents/index.d.ts +54 -0
- package/dist/lib/agents/index.js +382 -0
- package/dist/lib/branch/index.d.ts +120 -0
- package/dist/lib/branch/index.js +334 -0
- package/dist/lib/colors.d.ts +94 -0
- package/dist/lib/colors.js +68 -0
- package/dist/lib/commands/docker-command.d.ts +21 -0
- package/dist/lib/commands/docker-command.js +27 -0
- package/dist/lib/database/index.d.ts +176 -0
- package/dist/lib/database/index.js +581 -0
- package/dist/lib/docker/resolve.d.ts +38 -0
- package/dist/lib/docker/resolve.js +175 -0
- package/dist/lib/execution/config.d.ts +150 -0
- package/dist/lib/execution/config.js +541 -0
- package/dist/lib/execution/devcontainer.d.ts +85 -0
- package/dist/lib/execution/devcontainer.js +594 -0
- package/dist/lib/execution/index.d.ts +10 -0
- package/dist/lib/execution/index.js +10 -0
- package/dist/lib/execution/runners.d.ts +53 -0
- package/dist/lib/execution/runners.js +1182 -0
- package/dist/lib/execution/spawner.d.ts +85 -0
- package/dist/lib/execution/spawner.js +548 -0
- package/dist/lib/execution/storage.d.ts +159 -0
- package/dist/lib/execution/storage.js +425 -0
- package/dist/lib/execution/types.d.ts +145 -0
- package/dist/lib/execution/types.js +157 -0
- package/dist/lib/init/index.d.ts +75 -0
- package/dist/lib/init/index.js +355 -0
- package/dist/lib/machine-config.d.ts +170 -0
- package/dist/lib/machine-config.js +386 -0
- package/dist/lib/pmo/base-command.d.ts +195 -0
- package/dist/lib/pmo/base-command.js +319 -0
- package/dist/lib/pmo/create-spec-folders.d.ts +43 -0
- package/dist/lib/pmo/create-spec-folders.js +64 -0
- package/dist/lib/pmo/epic-files.d.ts +56 -0
- package/dist/lib/pmo/epic-files.js +195 -0
- package/dist/lib/pmo/find-pmo.d.ts +14 -0
- package/dist/lib/pmo/find-pmo.js +172 -0
- package/dist/lib/pmo/index.d.ts +109 -0
- package/dist/lib/pmo/index.js +501 -0
- package/dist/lib/pmo/markdown.d.ts +31 -0
- package/dist/lib/pmo/markdown.js +245 -0
- package/dist/lib/pmo/pmo-context.d.ts +27 -0
- package/dist/lib/pmo/pmo-context.js +44 -0
- package/dist/lib/pmo/schema.d.ts +82 -0
- package/dist/lib/pmo/schema.js +531 -0
- package/dist/lib/pmo/spec-parser.d.ts +25 -0
- package/dist/lib/pmo/spec-parser.js +205 -0
- package/dist/lib/pmo/spec-types.d.ts +43 -0
- package/dist/lib/pmo/spec-types.js +7 -0
- package/dist/lib/pmo/storage/actions.d.ts +34 -0
- package/dist/lib/pmo/storage/actions.js +177 -0
- package/dist/lib/pmo/storage/base.d.ts +47 -0
- package/dist/lib/pmo/storage/base.js +858 -0
- package/dist/lib/pmo/storage/dependencies.d.ts +61 -0
- package/dist/lib/pmo/storage/dependencies.js +267 -0
- package/dist/lib/pmo/storage/epics.d.ts +46 -0
- package/dist/lib/pmo/storage/epics.js +243 -0
- package/dist/lib/pmo/storage/helpers.d.ts +33 -0
- package/dist/lib/pmo/storage/helpers.js +148 -0
- package/dist/lib/pmo/storage/index.d.ts +186 -0
- package/dist/lib/pmo/storage/index.js +689 -0
- package/dist/lib/pmo/storage/phases.d.ts +65 -0
- package/dist/lib/pmo/storage/phases.js +392 -0
- package/dist/lib/pmo/storage/projects.d.ts +79 -0
- package/dist/lib/pmo/storage/projects.js +303 -0
- package/dist/lib/pmo/storage/specs.d.ts +77 -0
- package/dist/lib/pmo/storage/specs.js +389 -0
- package/dist/lib/pmo/storage/statuses.d.ts +63 -0
- package/dist/lib/pmo/storage/statuses.js +404 -0
- package/dist/lib/pmo/storage/subtasks.d.ts +37 -0
- package/dist/lib/pmo/storage/subtasks.js +184 -0
- package/dist/lib/pmo/storage/templates.d.ts +40 -0
- package/dist/lib/pmo/storage/templates.js +210 -0
- package/dist/lib/pmo/storage/tickets.d.ts +57 -0
- package/dist/lib/pmo/storage/tickets.js +453 -0
- package/dist/lib/pmo/storage/types.d.ts +200 -0
- package/dist/lib/pmo/storage/types.js +5 -0
- package/dist/lib/pmo/storage/views.d.ts +44 -0
- package/dist/lib/pmo/storage/views.js +355 -0
- package/dist/lib/pmo/storage-sqlite.d.ts +7 -0
- package/dist/lib/pmo/storage-sqlite.js +7 -0
- package/dist/lib/pmo/sync-manager.d.ts +92 -0
- package/dist/lib/pmo/sync-manager.js +229 -0
- package/dist/lib/pmo/types.d.ts +710 -0
- package/dist/lib/pmo/types.js +108 -0
- package/dist/lib/pmo/utils.d.ts +122 -0
- package/dist/lib/pmo/utils.js +174 -0
- package/dist/lib/pmo/watcher.d.ts +43 -0
- package/dist/lib/pmo/watcher.js +208 -0
- package/dist/lib/pr/index.d.ts +150 -0
- package/dist/lib/pr/index.js +483 -0
- package/dist/lib/prompt-json.d.ts +231 -0
- package/dist/lib/prompt-json.js +213 -0
- package/dist/lib/repos/index.d.ts +81 -0
- package/dist/lib/repos/index.js +679 -0
- package/dist/lib/styles.d.ts +98 -0
- package/dist/lib/styles.js +195 -0
- package/dist/lib/themes.d.ts +128 -0
- package/dist/lib/themes.js +301 -0
- package/dist/lib/ui/BoardUI.d.ts +21 -0
- package/dist/lib/ui/BoardUI.js +85 -0
- package/dist/lib/ui/ClaimTicketUI.d.ts +17 -0
- package/dist/lib/ui/ClaimTicketUI.js +64 -0
- package/dist/lib/ui/CreateTicketUI.d.ts +13 -0
- package/dist/lib/ui/CreateTicketUI.js +101 -0
- package/dist/lib/workspace.d.ts +66 -0
- package/dist/lib/workspace.js +204 -0
- package/oclif.manifest.json +10593 -0
- package/package.json +103 -56
- package/LICENSE +0 -21
- package/dist/bin/prlt.d.ts +0 -11
- package/dist/bin/prlt.d.ts.map +0 -1
- package/dist/bin/prlt.js +0 -144
- package/dist/bin/prlt.js.map +0 -1
- package/dist/lib/config/index.d.ts +0 -14
- package/dist/lib/config/index.d.ts.map +0 -1
- package/dist/lib/config/index.js +0 -142
- package/dist/lib/config/index.js.map +0 -1
- package/dist/lib/config/upgrade.d.ts +0 -2
- package/dist/lib/config/upgrade.d.ts.map +0 -1
- package/dist/lib/config/upgrade.js +0 -248
- package/dist/lib/config/upgrade.js.map +0 -1
- package/dist/lib/themes/index.d.ts +0 -8
- package/dist/lib/themes/index.d.ts.map +0 -1
- package/dist/lib/themes/index.js +0 -80
- package/dist/lib/themes/index.js.map +0 -1
- package/dist/lib/utils/helpers.d.ts +0 -4
- package/dist/lib/utils/helpers.d.ts.map +0 -1
- package/dist/lib/utils/helpers.js +0 -39
- package/dist/lib/utils/helpers.js.map +0 -1
- package/dist/lib/utils/logger.d.ts +0 -4
- package/dist/lib/utils/logger.d.ts.map +0 -1
- package/dist/lib/utils/logger.js +0 -28
- package/dist/lib/utils/logger.js.map +0 -1
- package/dist/lib/workspace/index.d.ts +0 -13
- package/dist/lib/workspace/index.d.ts.map +0 -1
- package/dist/lib/workspace/index.js +0 -116
- package/dist/lib/workspace/index.js.map +0 -1
- package/dist/lib/worktree/index.d.ts +0 -7
- package/dist/lib/worktree/index.d.ts.map +0 -1
- package/dist/lib/worktree/index.js +0 -362
- package/dist/lib/worktree/index.js.map +0 -1
- package/dist/lib/worktree/migrate.d.ts +0 -2
- package/dist/lib/worktree/migrate.d.ts.map +0 -1
- package/dist/lib/worktree/migrate.js +0 -214
- package/dist/lib/worktree/migrate.js.map +0 -1
- package/dist/lib/worktree/repair.d.ts +0 -3
- package/dist/lib/worktree/repair.d.ts.map +0 -1
- package/dist/lib/worktree/repair.js +0 -320
- package/dist/lib/worktree/repair.js.map +0 -1
- package/dist/types/index.d.ts +0 -57
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -3
- package/dist/types/index.js.map +0 -1
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
import { execSync } from 'node:child_process';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { styles } from '../../lib/styles.js';
|
|
5
|
+
import { isGHInstalled, isGHAuthenticated, isGHTokenInEnv } from '../../lib/pr/index.js';
|
|
6
|
+
export default class GHToken extends Command {
|
|
7
|
+
static description = 'Show GH_TOKEN setup for devcontainer PR creation';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %>',
|
|
10
|
+
];
|
|
11
|
+
async run() {
|
|
12
|
+
// Check if gh is installed
|
|
13
|
+
if (!isGHInstalled()) {
|
|
14
|
+
this.log(chalk.red(' ā gh CLI not installed'));
|
|
15
|
+
this.log(styles.muted(''));
|
|
16
|
+
this.log(styles.muted(' Install first:'));
|
|
17
|
+
this.log(chalk.cyan(' brew install gh'));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
// Check if gh is authenticated
|
|
21
|
+
if (!isGHAuthenticated()) {
|
|
22
|
+
this.log(chalk.yellow(' ā gh CLI not authenticated'));
|
|
23
|
+
this.log(styles.muted(''));
|
|
24
|
+
this.log(styles.muted(' Authenticate first:'));
|
|
25
|
+
this.log(chalk.cyan(' prlt gh login'));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
// Check if already set
|
|
29
|
+
if (isGHTokenInEnv()) {
|
|
30
|
+
this.log(chalk.green(' ā GH_TOKEN is already set in your environment'));
|
|
31
|
+
this.log(styles.muted(''));
|
|
32
|
+
this.log(styles.muted(' PR creation will work in devcontainers.'));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// Detect shell
|
|
36
|
+
const shell = process.env.SHELL || '/bin/zsh';
|
|
37
|
+
const rcFile = shell.includes('zsh') ? '~/.zshrc' : shell.includes('bash') ? '~/.bashrc' : '~/.profile';
|
|
38
|
+
this.log(chalk.yellow(' ā GH_TOKEN not set'));
|
|
39
|
+
this.log(styles.muted(''));
|
|
40
|
+
this.log(styles.muted(' To enable PR creation from devcontainers, add this to your shell profile:'));
|
|
41
|
+
this.log(styles.muted(''));
|
|
42
|
+
this.log(chalk.cyan(` echo 'export GH_TOKEN=$(gh auth token 2>/dev/null)' >> ${rcFile}`));
|
|
43
|
+
this.log(styles.muted(''));
|
|
44
|
+
this.log(styles.muted(' Then restart your terminal or run:'));
|
|
45
|
+
this.log(chalk.cyan(` source ${rcFile}`));
|
|
46
|
+
this.log(styles.muted(''));
|
|
47
|
+
// Show current token (masked) for verification
|
|
48
|
+
try {
|
|
49
|
+
const token = execSync('gh auth token', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
50
|
+
if (token) {
|
|
51
|
+
const masked = token.substring(0, 4) + '...' + token.substring(token.length - 4);
|
|
52
|
+
this.log(styles.muted(` Your current gh token: ${masked}`));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Ignore - token retrieval might fail
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class Init extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
name: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
path: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
agents: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
repos: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
pmo: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
};
|
|
13
|
+
run(): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Human mode: interactive prompts with colored output
|
|
16
|
+
*/
|
|
17
|
+
private runHumanMode;
|
|
18
|
+
/**
|
|
19
|
+
* Agent mode: use flags, output JSON
|
|
20
|
+
*/
|
|
21
|
+
private runAgentMode;
|
|
22
|
+
/**
|
|
23
|
+
* Output JSON to stdout
|
|
24
|
+
*/
|
|
25
|
+
private outputJson;
|
|
26
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import { promptForHQName, promptForHQLocation, initializeHQ, showNextSteps, validateHQLocation } from '../lib/init/index.js';
|
|
6
|
+
import { promptForAgentsWithTheme } from '../lib/agents/index.js';
|
|
7
|
+
import { promptForRepositories } from '../lib/repos/index.js';
|
|
8
|
+
import { promptForPMOSetup } from '../lib/pmo/index.js';
|
|
9
|
+
export default class Init extends Command {
|
|
10
|
+
static description = 'Initialize an HQ (headquarters) for managing repositories, agents, and projects';
|
|
11
|
+
static examples = [
|
|
12
|
+
// Human mode (interactive)
|
|
13
|
+
'<%= config.bin %> <%= command.id %>',
|
|
14
|
+
// Agent mode (JSON)
|
|
15
|
+
'<%= config.bin %> <%= command.id %> --json --name myproject',
|
|
16
|
+
'<%= config.bin %> <%= command.id %> --json --name myproject --path /path/to/hq --agents agent1,agent2 --pmo',
|
|
17
|
+
];
|
|
18
|
+
static flags = {
|
|
19
|
+
json: Flags.boolean({
|
|
20
|
+
description: 'Agent mode: use flags instead of prompts, output JSON',
|
|
21
|
+
default: false,
|
|
22
|
+
}),
|
|
23
|
+
name: Flags.string({
|
|
24
|
+
description: 'HQ name (required in --json mode)',
|
|
25
|
+
char: 'n',
|
|
26
|
+
}),
|
|
27
|
+
path: Flags.string({
|
|
28
|
+
description: 'HQ path (defaults to ./{name}-hq)',
|
|
29
|
+
char: 'p',
|
|
30
|
+
}),
|
|
31
|
+
agents: Flags.string({
|
|
32
|
+
description: 'Comma-separated list of agent names',
|
|
33
|
+
char: 'a',
|
|
34
|
+
}),
|
|
35
|
+
repos: Flags.string({
|
|
36
|
+
description: 'Comma-separated list of repository paths to clone/move',
|
|
37
|
+
char: 'r',
|
|
38
|
+
}),
|
|
39
|
+
pmo: Flags.boolean({
|
|
40
|
+
description: 'Include PMO (Project Management Office)',
|
|
41
|
+
default: true,
|
|
42
|
+
allowNo: true,
|
|
43
|
+
}),
|
|
44
|
+
};
|
|
45
|
+
async run() {
|
|
46
|
+
const { flags } = await this.parse(Init);
|
|
47
|
+
if (flags.json) {
|
|
48
|
+
await this.runAgentMode(flags);
|
|
49
|
+
}
|
|
50
|
+
else if (!process.stdin.isTTY) {
|
|
51
|
+
// Non-interactive environment (likely an AI agent)
|
|
52
|
+
// Output guidance as JSON
|
|
53
|
+
this.outputJson({
|
|
54
|
+
success: false,
|
|
55
|
+
error: 'Interactive mode requires a TTY. Use --json flag for agent mode.',
|
|
56
|
+
hint: 'Run: prlt init --json --name <hq-name> [--path <path>] [--agents a1,a2] [--no-pmo]',
|
|
57
|
+
flags: {
|
|
58
|
+
'--json': 'Enable agent mode with JSON output',
|
|
59
|
+
'--name, -n': 'HQ name (required)',
|
|
60
|
+
'--path, -p': 'HQ path (defaults to ./{name}-hq)',
|
|
61
|
+
'--agents, -a': 'Comma-separated agent names',
|
|
62
|
+
'--repos, -r': 'Comma-separated repo paths',
|
|
63
|
+
'--pmo/--no-pmo': 'Include PMO (default: true)',
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
this.exit(1);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
await this.runHumanMode();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Human mode: interactive prompts with colored output
|
|
74
|
+
*/
|
|
75
|
+
async runHumanMode() {
|
|
76
|
+
console.log(chalk.blue('š Welcome to Proletariat...\n'));
|
|
77
|
+
console.log(chalk.blue('š¢ Setting up your headquarters...\n'));
|
|
78
|
+
// Step 1: Get HQ name
|
|
79
|
+
const hqName = await promptForHQName();
|
|
80
|
+
// Step 2: Determine location (always adds -hq suffix)
|
|
81
|
+
const hqPath = await promptForHQLocation(hqName);
|
|
82
|
+
// Step 3: Add agents (with theme options)
|
|
83
|
+
const agentResult = await promptForAgentsWithTheme();
|
|
84
|
+
// Step 4: Add repositories
|
|
85
|
+
const repos = await promptForRepositories(process.cwd(), []);
|
|
86
|
+
// Step 5: PMO setup (uses shared prompt from lib/pmo)
|
|
87
|
+
const pmoSetup = await promptForPMOSetup(hqPath, hqName);
|
|
88
|
+
// Create the options object
|
|
89
|
+
const options = {
|
|
90
|
+
workspaceType: 'hq',
|
|
91
|
+
hqName,
|
|
92
|
+
hqPath,
|
|
93
|
+
selectedAgents: agentResult.agents,
|
|
94
|
+
repos,
|
|
95
|
+
pmoSetup,
|
|
96
|
+
themeId: agentResult.themeId,
|
|
97
|
+
customTheme: agentResult.customTheme,
|
|
98
|
+
};
|
|
99
|
+
// Initialize the HQ
|
|
100
|
+
await initializeHQ(options);
|
|
101
|
+
// Show next steps
|
|
102
|
+
await showNextSteps(options);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Agent mode: use flags, output JSON
|
|
106
|
+
*/
|
|
107
|
+
async runAgentMode(flags) {
|
|
108
|
+
// Validate required fields
|
|
109
|
+
if (!flags.name) {
|
|
110
|
+
this.outputJson({
|
|
111
|
+
success: false,
|
|
112
|
+
error: 'Missing required flag: --name',
|
|
113
|
+
});
|
|
114
|
+
this.exit(1);
|
|
115
|
+
}
|
|
116
|
+
const hqName = flags.name;
|
|
117
|
+
const hqPath = flags.path || path.resolve(`./${hqName}-hq`);
|
|
118
|
+
// Validate HQ path is not inside a git repo
|
|
119
|
+
if (!validateHQLocation(hqPath)) {
|
|
120
|
+
this.outputJson({
|
|
121
|
+
success: false,
|
|
122
|
+
error: 'Cannot create HQ inside a git repository',
|
|
123
|
+
path: hqPath,
|
|
124
|
+
});
|
|
125
|
+
this.exit(1);
|
|
126
|
+
}
|
|
127
|
+
// Check if directory already exists
|
|
128
|
+
if (fs.existsSync(hqPath)) {
|
|
129
|
+
this.outputJson({
|
|
130
|
+
success: false,
|
|
131
|
+
error: 'Directory already exists',
|
|
132
|
+
path: hqPath,
|
|
133
|
+
});
|
|
134
|
+
this.exit(1);
|
|
135
|
+
}
|
|
136
|
+
// Parse agents
|
|
137
|
+
const selectedAgents = flags.agents
|
|
138
|
+
? flags.agents.split(',').map(a => a.trim()).filter(Boolean)
|
|
139
|
+
: [];
|
|
140
|
+
// Parse repos
|
|
141
|
+
const repos = flags.repos
|
|
142
|
+
? flags.repos.split(',').map(r => ({
|
|
143
|
+
path: r.trim(),
|
|
144
|
+
action: 'clone',
|
|
145
|
+
})).filter(r => r.path)
|
|
146
|
+
: [];
|
|
147
|
+
// Create options
|
|
148
|
+
const options = {
|
|
149
|
+
workspaceType: 'hq',
|
|
150
|
+
hqName,
|
|
151
|
+
hqPath,
|
|
152
|
+
selectedAgents,
|
|
153
|
+
repos,
|
|
154
|
+
quiet: true, // Suppress console output in JSON mode
|
|
155
|
+
pmoSetup: {
|
|
156
|
+
includePMO: flags.pmo,
|
|
157
|
+
location: 'separate',
|
|
158
|
+
boardTemplate: 'default',
|
|
159
|
+
boardName: `${hqName}-kanban`,
|
|
160
|
+
columns: ['Backlog', 'In Progress', 'Review', 'Done'],
|
|
161
|
+
storageType: 'sqlite',
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
try {
|
|
165
|
+
// Suppress console output in JSON mode
|
|
166
|
+
const originalLog = console.log;
|
|
167
|
+
console.log = () => { };
|
|
168
|
+
// Initialize the HQ
|
|
169
|
+
await initializeHQ(options);
|
|
170
|
+
// Restore console.log
|
|
171
|
+
console.log = originalLog;
|
|
172
|
+
// Output success JSON
|
|
173
|
+
this.outputJson({
|
|
174
|
+
success: true,
|
|
175
|
+
hq: {
|
|
176
|
+
name: hqName,
|
|
177
|
+
path: hqPath,
|
|
178
|
+
agents: selectedAgents,
|
|
179
|
+
repos: repos.map(r => r.path),
|
|
180
|
+
pmo: flags.pmo,
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
// Restore console.log on error
|
|
186
|
+
console.log = console.log;
|
|
187
|
+
this.outputJson({
|
|
188
|
+
success: false,
|
|
189
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
190
|
+
});
|
|
191
|
+
this.exit(1);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Output JSON to stdout
|
|
196
|
+
*/
|
|
197
|
+
outputJson(data) {
|
|
198
|
+
console.log(JSON.stringify(data, null, 2));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class PhaseCreate extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
name: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
category: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
color: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
default: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
interactive: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
+
};
|
|
17
|
+
protected getPMOOptions(): {
|
|
18
|
+
promptIfMultiple: boolean;
|
|
19
|
+
};
|
|
20
|
+
execute(): Promise<void>;
|
|
21
|
+
private promptPhaseData;
|
|
22
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { Flags, Args } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
4
|
+
import { styles } from '../../lib/styles.js';
|
|
5
|
+
import { STATE_CATEGORY_ORDER } from '../../lib/pmo/types.js';
|
|
6
|
+
import { shouldOutputJson, outputPromptAsJson, createMetadata, buildFormPromptConfig, } from '../../lib/prompt-json.js';
|
|
7
|
+
export default class PhaseCreate extends PMOCommand {
|
|
8
|
+
static description = 'Create a new project lifecycle phase';
|
|
9
|
+
static examples = [
|
|
10
|
+
'<%= config.bin %> <%= command.id %> "On Hold" --category unstarted',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> "In Review" --category started --color "#FFA500"',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> -i # Interactive mode',
|
|
13
|
+
];
|
|
14
|
+
static args = {
|
|
15
|
+
name: Args.string({
|
|
16
|
+
description: 'Phase name',
|
|
17
|
+
required: false,
|
|
18
|
+
}),
|
|
19
|
+
};
|
|
20
|
+
static flags = {
|
|
21
|
+
...pmoBaseFlags,
|
|
22
|
+
category: Flags.string({
|
|
23
|
+
char: 'c',
|
|
24
|
+
description: 'State category',
|
|
25
|
+
options: ['backlog', 'unstarted', 'started', 'completed', 'canceled'],
|
|
26
|
+
}),
|
|
27
|
+
color: Flags.string({
|
|
28
|
+
description: 'Hex color (e.g., "#FF5733")',
|
|
29
|
+
}),
|
|
30
|
+
description: Flags.string({
|
|
31
|
+
char: 'd',
|
|
32
|
+
description: 'Phase description',
|
|
33
|
+
}),
|
|
34
|
+
default: Flags.boolean({
|
|
35
|
+
description: 'Set as default phase for new projects',
|
|
36
|
+
default: false,
|
|
37
|
+
}),
|
|
38
|
+
interactive: Flags.boolean({
|
|
39
|
+
char: 'i',
|
|
40
|
+
description: 'Interactive mode',
|
|
41
|
+
default: false,
|
|
42
|
+
}),
|
|
43
|
+
json: Flags.boolean({
|
|
44
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
45
|
+
default: false,
|
|
46
|
+
}),
|
|
47
|
+
};
|
|
48
|
+
getPMOOptions() {
|
|
49
|
+
return { promptIfMultiple: false };
|
|
50
|
+
}
|
|
51
|
+
async execute() {
|
|
52
|
+
const { args, flags } = await this.parse(PhaseCreate);
|
|
53
|
+
{
|
|
54
|
+
let phaseData;
|
|
55
|
+
// Auto-enter interactive mode if any required value is missing
|
|
56
|
+
if (flags.interactive || !args.name || !flags.category) {
|
|
57
|
+
// Check if JSON output mode is active
|
|
58
|
+
const jsonMode = shouldOutputJson(flags);
|
|
59
|
+
// In JSON mode, output form prompt
|
|
60
|
+
// Define labels once - single source of truth
|
|
61
|
+
const categoryLabels = {
|
|
62
|
+
triage: 'Triage - Inbox, needs review',
|
|
63
|
+
backlog: 'Backlog - Not yet scheduled for work',
|
|
64
|
+
unstarted: 'Unstarted - Scheduled but work hasn\'t begun',
|
|
65
|
+
started: 'Started - Work is actively in progress',
|
|
66
|
+
completed: 'Completed - Work finished successfully',
|
|
67
|
+
canceled: 'Canceled - Work won\'t be done',
|
|
68
|
+
};
|
|
69
|
+
const categoryChoices = STATE_CATEGORY_ORDER.map(cat => ({ name: categoryLabels[cat], value: cat }));
|
|
70
|
+
// Define fields once - single source of truth for both JSON and interactive modes
|
|
71
|
+
const fields = [
|
|
72
|
+
{ type: 'input', name: 'name', message: 'Phase name:', default: args.name },
|
|
73
|
+
{ type: 'list', name: 'category', message: 'Category:', choices: categoryChoices, default: flags.category },
|
|
74
|
+
{ type: 'input', name: 'color', message: 'Color (hex, optional):', default: flags.color },
|
|
75
|
+
{ type: 'input', name: 'description', message: 'Description (optional):', default: flags.description },
|
|
76
|
+
{ type: 'confirm', name: 'isDefault', message: 'Set as default for new projects?', default: flags.default || false },
|
|
77
|
+
];
|
|
78
|
+
if (jsonMode) {
|
|
79
|
+
outputPromptAsJson(buildFormPromptConfig(fields), createMetadata('phase create', flags));
|
|
80
|
+
}
|
|
81
|
+
phaseData = await this.promptPhaseData(fields);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
phaseData = {
|
|
85
|
+
name: args.name,
|
|
86
|
+
category: flags.category,
|
|
87
|
+
color: flags.color,
|
|
88
|
+
description: flags.description,
|
|
89
|
+
isDefault: flags.default,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const phase = await this.storage.createPhase(phaseData);
|
|
93
|
+
this.log(styles.success(`\nCreated phase "${styles.emphasis(phase.name)}"`));
|
|
94
|
+
this.log(styles.muted(` ID: ${phase.id}`));
|
|
95
|
+
this.log(styles.muted(` Category: ${phase.category}`));
|
|
96
|
+
if (phase.color) {
|
|
97
|
+
this.log(styles.muted(` Color: ${phase.color}`));
|
|
98
|
+
}
|
|
99
|
+
if (phase.description) {
|
|
100
|
+
this.log(styles.muted(` Description: ${phase.description}`));
|
|
101
|
+
}
|
|
102
|
+
if (phase.isDefault) {
|
|
103
|
+
this.log(styles.muted(` Default: Yes`));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async promptPhaseData(fields) {
|
|
108
|
+
// Build inquirer prompts from fields, adding validators
|
|
109
|
+
const answers = await inquirer.prompt(fields.map(field => ({
|
|
110
|
+
...field,
|
|
111
|
+
validate: field.name === 'name'
|
|
112
|
+
? ((input) => input.length > 0 || 'Name is required')
|
|
113
|
+
: undefined,
|
|
114
|
+
})));
|
|
115
|
+
return {
|
|
116
|
+
name: answers.name,
|
|
117
|
+
category: answers.category,
|
|
118
|
+
color: answers.color || undefined,
|
|
119
|
+
description: answers.description || undefined,
|
|
120
|
+
isDefault: answers.isDefault,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class PhaseDelete 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
|
+
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,73 @@
|
|
|
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 PhaseDelete extends PMOCommand {
|
|
7
|
+
static description = 'Delete a project lifecycle phase';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %> on-hold',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> on-hold --force',
|
|
11
|
+
];
|
|
12
|
+
static args = {
|
|
13
|
+
id: Args.string({
|
|
14
|
+
description: 'Phase ID',
|
|
15
|
+
required: true,
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
static flags = {
|
|
19
|
+
...pmoBaseFlags,
|
|
20
|
+
force: Flags.boolean({
|
|
21
|
+
char: 'f',
|
|
22
|
+
description: 'Skip confirmation',
|
|
23
|
+
default: false,
|
|
24
|
+
}),
|
|
25
|
+
json: Flags.boolean({
|
|
26
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
27
|
+
default: false,
|
|
28
|
+
}),
|
|
29
|
+
};
|
|
30
|
+
getPMOOptions() {
|
|
31
|
+
return { promptIfMultiple: false };
|
|
32
|
+
}
|
|
33
|
+
async execute() {
|
|
34
|
+
const { args, flags } = await this.parse(PhaseDelete);
|
|
35
|
+
// Check if JSON output mode is active
|
|
36
|
+
const jsonMode = shouldOutputJson(flags);
|
|
37
|
+
// Helper to handle errors in JSON mode
|
|
38
|
+
const handleError = (code, message) => {
|
|
39
|
+
if (jsonMode) {
|
|
40
|
+
outputErrorAsJson(code, message, createMetadata('phase delete', flags));
|
|
41
|
+
this.exit(1);
|
|
42
|
+
}
|
|
43
|
+
this.error(message);
|
|
44
|
+
};
|
|
45
|
+
const phase = await this.storage.getPhase(args.id);
|
|
46
|
+
if (!phase) {
|
|
47
|
+
return handleError('PHASE_NOT_FOUND', `Phase "${args.id}" not found.`);
|
|
48
|
+
}
|
|
49
|
+
if (!flags.force) {
|
|
50
|
+
// In JSON mode, output confirmation prompt
|
|
51
|
+
if (jsonMode) {
|
|
52
|
+
const confirmChoices = [
|
|
53
|
+
{ name: 'No', value: 'false' },
|
|
54
|
+
{ name: 'Yes', value: 'true' },
|
|
55
|
+
];
|
|
56
|
+
outputPromptAsJson(buildPromptConfig('list', 'confirmed', `Delete phase "${phase.name}"?`, confirmChoices), createMetadata('phase delete', flags));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const { confirm } = await inquirer.prompt([{
|
|
60
|
+
type: 'confirm',
|
|
61
|
+
name: 'confirm',
|
|
62
|
+
message: `Delete phase "${phase.name}"?`,
|
|
63
|
+
default: false,
|
|
64
|
+
}]);
|
|
65
|
+
if (!confirm) {
|
|
66
|
+
this.log(styles.muted('Cancelled.'));
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
await this.storage.deletePhase(args.id);
|
|
71
|
+
this.log(styles.success(`\nDeleted phase "${phase.name}"`));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class PhaseList extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
category: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
};
|
|
10
|
+
execute(): Promise<void>;
|
|
11
|
+
private groupByCategory;
|
|
12
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
3
|
+
import { styles } from '../../lib/styles.js';
|
|
4
|
+
import { STATE_CATEGORY_ORDER } from '../../lib/pmo/types.js';
|
|
5
|
+
export default class PhaseList extends PMOCommand {
|
|
6
|
+
static description = 'List all project lifecycle phases';
|
|
7
|
+
static examples = [
|
|
8
|
+
'<%= config.bin %> <%= command.id %>',
|
|
9
|
+
'<%= config.bin %> <%= command.id %> --category started',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> --json',
|
|
11
|
+
];
|
|
12
|
+
static flags = {
|
|
13
|
+
...pmoBaseFlags,
|
|
14
|
+
category: Flags.string({
|
|
15
|
+
char: 'c',
|
|
16
|
+
description: 'Filter by category',
|
|
17
|
+
options: ['backlog', 'unstarted', 'started', 'completed', 'canceled'],
|
|
18
|
+
}),
|
|
19
|
+
json: Flags.boolean({
|
|
20
|
+
description: 'Output as JSON',
|
|
21
|
+
default: false,
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
async execute() {
|
|
25
|
+
const { flags } = await this.parse(PhaseList);
|
|
26
|
+
const phases = await this.storage.listPhases(flags.category ? { category: flags.category } : undefined);
|
|
27
|
+
if (flags.json) {
|
|
28
|
+
this.log(JSON.stringify(phases, null, 2));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (phases.length === 0) {
|
|
32
|
+
this.log(styles.muted('\nNo phases found.'));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// Group by category
|
|
36
|
+
const grouped = this.groupByCategory(phases);
|
|
37
|
+
this.log(`\nš ${styles.emphasis('Project Lifecycle Phases')}`);
|
|
38
|
+
this.log('ā'.repeat(60));
|
|
39
|
+
const categoryEmoji = {
|
|
40
|
+
triage: 'š¬',
|
|
41
|
+
backlog: 'š„',
|
|
42
|
+
unstarted: 'š',
|
|
43
|
+
started: 'š',
|
|
44
|
+
completed: 'ā
',
|
|
45
|
+
canceled: 'š«',
|
|
46
|
+
};
|
|
47
|
+
for (const category of STATE_CATEGORY_ORDER) {
|
|
48
|
+
if (flags.category && flags.category !== category)
|
|
49
|
+
continue;
|
|
50
|
+
const categoryPhases = grouped.get(category);
|
|
51
|
+
if (!categoryPhases || categoryPhases.length === 0)
|
|
52
|
+
continue;
|
|
53
|
+
const emoji = categoryEmoji[category];
|
|
54
|
+
this.log(`\n${emoji} ${styles.emphasis(category.toUpperCase())}`);
|
|
55
|
+
this.log('ā'.repeat(40));
|
|
56
|
+
for (const phase of categoryPhases) {
|
|
57
|
+
const defaultBadge = phase.isDefault ? styles.muted(' (default)') : '';
|
|
58
|
+
const colorPreview = phase.color ? `[${phase.color}]` : '';
|
|
59
|
+
this.log(` ${phase.name}${defaultBadge} ${styles.muted(colorPreview)}`);
|
|
60
|
+
if (phase.description) {
|
|
61
|
+
this.log(` ${styles.muted(phase.description)}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
this.log('');
|
|
66
|
+
}
|
|
67
|
+
groupByCategory(phases) {
|
|
68
|
+
const grouped = new Map();
|
|
69
|
+
for (const phase of phases) {
|
|
70
|
+
const existing = grouped.get(phase.category) || [];
|
|
71
|
+
existing.push(phase);
|
|
72
|
+
grouped.set(phase.category, existing);
|
|
73
|
+
}
|
|
74
|
+
return grouped;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class PhaseMove 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
|
+
position: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
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
|
+
}
|