@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,13 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class Session 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 inquirer from 'inquirer';
|
|
3
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
4
|
+
import { shouldOutputJson, outputPromptAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
|
|
5
|
+
export default class Session extends PMOCommand {
|
|
6
|
+
static description = 'Manage agent tmux sessions (list, attach, detach)';
|
|
7
|
+
static examples = [
|
|
8
|
+
'<%= config.bin %> <%= command.id %>',
|
|
9
|
+
'<%= config.bin %> <%= command.id %> list',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> attach TKT-347-implement',
|
|
11
|
+
];
|
|
12
|
+
static flags = {
|
|
13
|
+
...pmoBaseFlags,
|
|
14
|
+
json: Flags.boolean({
|
|
15
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
16
|
+
default: false,
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
getPMOOptions() {
|
|
20
|
+
return { promptIfMultiple: false };
|
|
21
|
+
}
|
|
22
|
+
async execute() {
|
|
23
|
+
const { flags } = await this.parse(Session);
|
|
24
|
+
// Check if JSON output mode is active
|
|
25
|
+
const jsonMode = shouldOutputJson(flags);
|
|
26
|
+
// Define choices
|
|
27
|
+
const menuChoices = [
|
|
28
|
+
{ name: 'List active sessions', value: 'list' },
|
|
29
|
+
{ name: 'Attach to a session', value: 'attach' },
|
|
30
|
+
{ name: 'Cancel', value: 'cancel' },
|
|
31
|
+
];
|
|
32
|
+
const message = 'Session Management - What would you like to do?';
|
|
33
|
+
// In JSON mode, output menu prompt
|
|
34
|
+
if (jsonMode) {
|
|
35
|
+
outputPromptAsJson(buildPromptConfig('list', 'action', message, menuChoices), createMetadata('session', flags));
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const { action } = await inquirer.prompt([
|
|
39
|
+
{
|
|
40
|
+
type: 'list',
|
|
41
|
+
name: 'action',
|
|
42
|
+
message: 'š„ļø ' + message,
|
|
43
|
+
choices: [
|
|
44
|
+
{ name: 'š ' + menuChoices[0].name, value: menuChoices[0].value },
|
|
45
|
+
{ name: 'š ' + menuChoices[1].name, value: menuChoices[1].value },
|
|
46
|
+
new inquirer.Separator(),
|
|
47
|
+
{ name: 'ā ' + menuChoices[2].name, value: menuChoices[2].value },
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
]);
|
|
51
|
+
if (action === 'cancel') {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Run the selected subcommand
|
|
55
|
+
switch (action) {
|
|
56
|
+
case 'list':
|
|
57
|
+
await this.config.runCommand('session:list', []);
|
|
58
|
+
break;
|
|
59
|
+
case 'attach':
|
|
60
|
+
await this.config.runCommand('session:attach', []);
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class SessionList extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
all: 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
|
+
/**
|
|
14
|
+
* Get list of host tmux session names
|
|
15
|
+
*/
|
|
16
|
+
private getHostTmuxSessionNames;
|
|
17
|
+
/**
|
|
18
|
+
* Get map of containerId -> tmux session names
|
|
19
|
+
*/
|
|
20
|
+
private getContainerTmuxSessionMap;
|
|
21
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import { execSync } from 'node:child_process';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import Database from 'better-sqlite3';
|
|
5
|
+
import { styles } from '../../lib/styles.js';
|
|
6
|
+
import { getWorkspaceInfo } from '../../lib/agents/commands.js';
|
|
7
|
+
import { ExecutionStorage } from '../../lib/execution/index.js';
|
|
8
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
9
|
+
export default class SessionList extends PMOCommand {
|
|
10
|
+
static description = 'List active tmux sessions (host and container)';
|
|
11
|
+
static examples = [
|
|
12
|
+
'<%= config.bin %> <%= command.id %>',
|
|
13
|
+
'<%= config.bin %> <%= command.id %> --all',
|
|
14
|
+
];
|
|
15
|
+
static flags = {
|
|
16
|
+
...pmoBaseFlags,
|
|
17
|
+
all: Flags.boolean({
|
|
18
|
+
char: 'a',
|
|
19
|
+
description: 'Show all sessions including stale DB records',
|
|
20
|
+
default: false,
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
getPMOOptions() {
|
|
24
|
+
return { promptIfMultiple: false };
|
|
25
|
+
}
|
|
26
|
+
async execute() {
|
|
27
|
+
const { flags } = await this.parse(SessionList);
|
|
28
|
+
// Get workspace info for execution records
|
|
29
|
+
let executionStorage = null;
|
|
30
|
+
let db = null;
|
|
31
|
+
try {
|
|
32
|
+
const workspaceInfo = getWorkspaceInfo();
|
|
33
|
+
const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
|
|
34
|
+
db = new Database(dbPath);
|
|
35
|
+
executionStorage = new ExecutionStorage(db);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
this.log('');
|
|
39
|
+
this.log(styles.muted('Not in a workspace. Run from a proletariat HQ directory.'));
|
|
40
|
+
this.log('');
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
// DB-driven approach: Start with executions, verify tmux sessions exist
|
|
45
|
+
const runningExecutions = executionStorage.listExecutions({ status: 'running' }) || [];
|
|
46
|
+
const startingExecutions = executionStorage.listExecutions({ status: 'starting' }) || [];
|
|
47
|
+
const activeExecutions = [...runningExecutions, ...startingExecutions];
|
|
48
|
+
// Get list of actual tmux sessions for verification
|
|
49
|
+
const hostTmuxSessions = this.getHostTmuxSessionNames();
|
|
50
|
+
const containerTmuxSessions = this.getContainerTmuxSessionMap();
|
|
51
|
+
// Build verified session list from DB records
|
|
52
|
+
const sessions = [];
|
|
53
|
+
for (const exec of activeExecutions) {
|
|
54
|
+
if (!exec.sessionId)
|
|
55
|
+
continue; // Skip executions without sessionId
|
|
56
|
+
const isContainer = exec.environment === 'devcontainer';
|
|
57
|
+
let exists = false;
|
|
58
|
+
let containerId;
|
|
59
|
+
if (isContainer && exec.containerId) {
|
|
60
|
+
// Check if session exists in container
|
|
61
|
+
const containerSessions = containerTmuxSessions.get(exec.containerId);
|
|
62
|
+
exists = containerSessions?.includes(exec.sessionId) ?? false;
|
|
63
|
+
containerId = exec.containerId;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
// Check if session exists on host
|
|
67
|
+
exists = hostTmuxSessions.includes(exec.sessionId);
|
|
68
|
+
}
|
|
69
|
+
// Only include if session exists, unless --all flag
|
|
70
|
+
if (exists || flags.all) {
|
|
71
|
+
sessions.push({
|
|
72
|
+
sessionId: exec.sessionId,
|
|
73
|
+
ticketId: exec.ticketId,
|
|
74
|
+
agentName: exec.agentName,
|
|
75
|
+
status: exists ? exec.status : 'stale',
|
|
76
|
+
environment: isContainer ? 'container' : 'host',
|
|
77
|
+
containerId,
|
|
78
|
+
exists,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (sessions.length > 0) {
|
|
83
|
+
this.log('');
|
|
84
|
+
this.log(styles.header('š„ļø Active Sessions'));
|
|
85
|
+
this.log('ā'.repeat(90));
|
|
86
|
+
this.log(styles.muted(' ' +
|
|
87
|
+
padEnd('Session', 28) +
|
|
88
|
+
padEnd('Ticket', 12) +
|
|
89
|
+
padEnd('Agent', 14) +
|
|
90
|
+
padEnd('Type', 15) +
|
|
91
|
+
'Status'));
|
|
92
|
+
this.log(' ' + 'ā'.repeat(80));
|
|
93
|
+
for (const session of sessions) {
|
|
94
|
+
const typeIcon = session.environment === 'container' ? 'š³ container' : 'š» host';
|
|
95
|
+
const statusColor = session.status === 'running' ? styles.success :
|
|
96
|
+
session.status === 'starting' ? styles.warning :
|
|
97
|
+
session.status === 'stale' ? styles.error : styles.muted;
|
|
98
|
+
this.log(' ' +
|
|
99
|
+
padEnd(session.sessionId, 28) +
|
|
100
|
+
padEnd(session.ticketId, 12) +
|
|
101
|
+
padEnd(session.agentName, 14) +
|
|
102
|
+
padEnd(typeIcon, 15) +
|
|
103
|
+
statusColor(session.status));
|
|
104
|
+
}
|
|
105
|
+
this.log('');
|
|
106
|
+
this.log('ā'.repeat(90));
|
|
107
|
+
// Show attach command example
|
|
108
|
+
const firstSession = sessions.find(s => s.exists);
|
|
109
|
+
if (firstSession) {
|
|
110
|
+
this.log(styles.muted('\nCommands:'));
|
|
111
|
+
this.log(styles.muted(` prlt session attach ${firstSession.sessionId} Attach to session`));
|
|
112
|
+
this.log('');
|
|
113
|
+
}
|
|
114
|
+
// Show stale sessions warning
|
|
115
|
+
const staleSessions = sessions.filter(s => !s.exists);
|
|
116
|
+
if (staleSessions.length > 0) {
|
|
117
|
+
this.log(styles.warning(`\nā ļø ${staleSessions.length} stale session(s) in DB without tmux process.`));
|
|
118
|
+
this.log(styles.muted(' Run `prlt work stop <work-id>` to clean up.'));
|
|
119
|
+
this.log('');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
this.log('');
|
|
124
|
+
this.log(styles.muted('No active sessions found.'));
|
|
125
|
+
this.log('');
|
|
126
|
+
this.log(styles.muted('Start work with: prlt work start <ticket-id>'));
|
|
127
|
+
this.log('');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
db?.close();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get list of host tmux session names
|
|
136
|
+
*/
|
|
137
|
+
getHostTmuxSessionNames() {
|
|
138
|
+
try {
|
|
139
|
+
execSync('which tmux', { stdio: 'pipe' });
|
|
140
|
+
const output = execSync('tmux list-sessions -F "#{session_name}"', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
141
|
+
if (!output)
|
|
142
|
+
return [];
|
|
143
|
+
return output.split('\n');
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return [];
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get map of containerId -> tmux session names
|
|
151
|
+
*/
|
|
152
|
+
getContainerTmuxSessionMap() {
|
|
153
|
+
const sessionMap = new Map();
|
|
154
|
+
try {
|
|
155
|
+
const containersOutput = execSync('docker ps --filter "label=devcontainer.local_folder" --format "{{.ID}}"', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
156
|
+
if (!containersOutput)
|
|
157
|
+
return sessionMap;
|
|
158
|
+
for (const containerId of containersOutput.split('\n')) {
|
|
159
|
+
try {
|
|
160
|
+
const tmuxOutput = execSync(`docker exec ${containerId} tmux list-sessions -F "#{session_name}" 2>/dev/null`, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
161
|
+
if (tmuxOutput) {
|
|
162
|
+
sessionMap.set(containerId, tmuxOutput.split('\n'));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// Container has no tmux sessions
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// Docker not available
|
|
172
|
+
}
|
|
173
|
+
return sessionMap;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// =============================================================================
|
|
177
|
+
// Helper Functions
|
|
178
|
+
// =============================================================================
|
|
179
|
+
function padEnd(str, length) {
|
|
180
|
+
return str.padEnd(length);
|
|
181
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class SpecCreate extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
title: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
title: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
status: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
type: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
problem: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
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
|
+
execute(): Promise<void>;
|
|
18
|
+
private promptSpecData;
|
|
19
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
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 { slugify } from '../../lib/pmo/utils.js';
|
|
6
|
+
import { shouldOutputJson, outputPromptAsJson, createMetadata, buildFormPromptConfig, } from '../../lib/prompt-json.js';
|
|
7
|
+
export default class SpecCreate extends PMOCommand {
|
|
8
|
+
static description = 'Create a new spec';
|
|
9
|
+
static examples = [
|
|
10
|
+
'<%= config.bin %> <%= command.id %> "User Authentication"',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> --title "API Design" --type product',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> -i # Interactive mode',
|
|
13
|
+
];
|
|
14
|
+
static args = {
|
|
15
|
+
title: Args.string({
|
|
16
|
+
description: 'Spec title',
|
|
17
|
+
required: false,
|
|
18
|
+
}),
|
|
19
|
+
};
|
|
20
|
+
static flags = {
|
|
21
|
+
...pmoBaseFlags,
|
|
22
|
+
title: Flags.string({
|
|
23
|
+
char: 't',
|
|
24
|
+
description: 'Spec title',
|
|
25
|
+
}),
|
|
26
|
+
status: Flags.string({
|
|
27
|
+
char: 's',
|
|
28
|
+
description: 'Spec status',
|
|
29
|
+
options: ['draft', 'active', 'implemented'],
|
|
30
|
+
default: 'draft',
|
|
31
|
+
}),
|
|
32
|
+
type: Flags.string({
|
|
33
|
+
description: 'Spec type',
|
|
34
|
+
options: ['product', 'platform', 'infra', 'integration'],
|
|
35
|
+
}),
|
|
36
|
+
problem: Flags.string({
|
|
37
|
+
description: 'Problem statement',
|
|
38
|
+
}),
|
|
39
|
+
interactive: Flags.boolean({
|
|
40
|
+
char: 'i',
|
|
41
|
+
description: 'Interactive mode',
|
|
42
|
+
default: false,
|
|
43
|
+
}),
|
|
44
|
+
json: Flags.boolean({
|
|
45
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
46
|
+
default: false,
|
|
47
|
+
}),
|
|
48
|
+
};
|
|
49
|
+
async execute() {
|
|
50
|
+
const { args, flags } = await this.parse(SpecCreate);
|
|
51
|
+
// Check if JSON output mode is active
|
|
52
|
+
const jsonMode = shouldOutputJson(flags);
|
|
53
|
+
// Get spec data
|
|
54
|
+
let specData;
|
|
55
|
+
if (flags.interactive || (!args.title && !flags.title)) {
|
|
56
|
+
// Build choices once - single source of truth
|
|
57
|
+
const typeChoices = [
|
|
58
|
+
{ name: 'Product (user-facing feature)', value: 'product' },
|
|
59
|
+
{ name: 'Platform (internal tooling)', value: 'platform' },
|
|
60
|
+
{ name: 'Infra (technical infrastructure)', value: 'infra' },
|
|
61
|
+
{ name: 'Integration (external service)', value: 'integration' },
|
|
62
|
+
{ name: 'None', value: '' },
|
|
63
|
+
];
|
|
64
|
+
const statusChoices = [
|
|
65
|
+
{ name: 'Draft (planning)', value: 'draft' },
|
|
66
|
+
{ name: 'Active (in progress)', value: 'active' },
|
|
67
|
+
{ name: 'Implemented (complete)', value: 'implemented' },
|
|
68
|
+
];
|
|
69
|
+
// Define fields once - single source of truth for both JSON and interactive modes
|
|
70
|
+
const fields = [
|
|
71
|
+
{ type: 'input', name: 'title', message: 'Spec title:', default: flags.title },
|
|
72
|
+
{ type: 'list', name: 'type', message: 'Spec type:', choices: typeChoices, default: flags.type },
|
|
73
|
+
{ type: 'list', name: 'status', message: 'Status:', choices: statusChoices, default: flags.status || 'draft' },
|
|
74
|
+
{ type: 'input', name: 'problem', message: 'Problem statement (optional):', default: flags.problem },
|
|
75
|
+
];
|
|
76
|
+
// In JSON mode, output form prompts
|
|
77
|
+
if (jsonMode) {
|
|
78
|
+
outputPromptAsJson(buildFormPromptConfig(fields), createMetadata('spec create', flags));
|
|
79
|
+
}
|
|
80
|
+
specData = await this.promptSpecData(fields);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
specData = {
|
|
84
|
+
title: args.title || flags.title || 'Untitled Spec',
|
|
85
|
+
status: flags.status || 'draft',
|
|
86
|
+
type: flags.type,
|
|
87
|
+
problem: flags.problem,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// Generate ID from title
|
|
91
|
+
const specId = slugify(specData.title);
|
|
92
|
+
// Create spec in database
|
|
93
|
+
const spec = await this.storage.createSpec({
|
|
94
|
+
id: specId,
|
|
95
|
+
title: specData.title,
|
|
96
|
+
status: specData.status,
|
|
97
|
+
type: specData.type,
|
|
98
|
+
problem: specData.problem,
|
|
99
|
+
});
|
|
100
|
+
this.log(styles.success(`\nā
Created spec "${styles.emphasis(spec.title)}"`));
|
|
101
|
+
this.log(styles.muted(` ID: ${spec.id}`));
|
|
102
|
+
this.log(styles.muted(` Status: ${spec.status}`));
|
|
103
|
+
if (spec.type)
|
|
104
|
+
this.log(styles.muted(` Type: ${spec.type}`));
|
|
105
|
+
this.log(styles.muted(`\nNext steps:`));
|
|
106
|
+
this.log(styles.muted(` 1. prlt spec view ${spec.id}`));
|
|
107
|
+
this.log(styles.muted(` 2. prlt spec edit ${spec.id} (to add details)`));
|
|
108
|
+
this.log(styles.muted(` 3. prlt spec plan ${spec.id} (to generate tickets)`));
|
|
109
|
+
}
|
|
110
|
+
async promptSpecData(fields) {
|
|
111
|
+
// Build inquirer prompts from fields, adding validators
|
|
112
|
+
const answers = await inquirer.prompt(fields.map(field => ({
|
|
113
|
+
...field,
|
|
114
|
+
// Convert empty string value to undefined for 'type' field
|
|
115
|
+
choices: field.name === 'type' && field.choices
|
|
116
|
+
? field.choices.map(c => ({ ...c, value: c.value || undefined }))
|
|
117
|
+
: field.choices,
|
|
118
|
+
// Add validator for required title field
|
|
119
|
+
validate: field.name === 'title'
|
|
120
|
+
? ((input) => input.length > 0 || 'Title is required')
|
|
121
|
+
: undefined,
|
|
122
|
+
})));
|
|
123
|
+
return {
|
|
124
|
+
title: answers.title,
|
|
125
|
+
status: answers.status,
|
|
126
|
+
type: answers.type,
|
|
127
|
+
problem: answers.problem || undefined,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class Spec 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,68 @@
|
|
|
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 Spec extends PMOCommand {
|
|
5
|
+
static description = 'Interactive menu for spec 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(Spec);
|
|
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 spec', command: 'prlt spec create --json' },
|
|
27
|
+
{ id: 'list', name: 'List all specs', command: 'prlt spec list --format json' },
|
|
28
|
+
{ id: 'view', name: 'View spec', command: 'prlt spec view --json' },
|
|
29
|
+
{ id: 'generate', name: 'Generate tickets from spec', command: 'prlt spec plan --json' },
|
|
30
|
+
{ id: 'ticket', name: 'Assign ticket to spec', command: 'prlt spec ticket --json' },
|
|
31
|
+
{ id: 'link', name: 'Manage dependencies', command: 'prlt spec link --json' },
|
|
32
|
+
{ id: 'cancel', name: 'Cancel', command: '' },
|
|
33
|
+
];
|
|
34
|
+
const message = 'Spec Operations - What would you like to do?';
|
|
35
|
+
const action = await this.selectFromList({
|
|
36
|
+
message: 'š ' + message,
|
|
37
|
+
items: menuChoices,
|
|
38
|
+
getName: (c) => c.name,
|
|
39
|
+
getValue: (c) => c.id,
|
|
40
|
+
getCommand: (c) => c.command,
|
|
41
|
+
jsonMode: jsonMode ? { flags, commandName: 'spec' } : null,
|
|
42
|
+
});
|
|
43
|
+
if (action === 'cancel' || !action) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// Run the selected subcommand
|
|
47
|
+
switch (action) {
|
|
48
|
+
case 'create':
|
|
49
|
+
await this.config.runCommand('spec:create', []);
|
|
50
|
+
break;
|
|
51
|
+
case 'list':
|
|
52
|
+
await this.config.runCommand('spec:list', []);
|
|
53
|
+
break;
|
|
54
|
+
case 'view':
|
|
55
|
+
await this.config.runCommand('spec:view', []);
|
|
56
|
+
break;
|
|
57
|
+
case 'generate':
|
|
58
|
+
await this.config.runCommand('spec:generate-tickets', []);
|
|
59
|
+
break;
|
|
60
|
+
case 'ticket':
|
|
61
|
+
await this.config.runCommand('spec:ticket', []);
|
|
62
|
+
break;
|
|
63
|
+
case 'link':
|
|
64
|
+
await this.config.runCommand('spec:link', []);
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PMOCommand } from '../../../lib/pmo/index.js';
|
|
2
|
+
export default class SpecLinkDepends extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
target: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
8
|
+
};
|
|
9
|
+
static flags: {
|
|
10
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
};
|
|
13
|
+
execute(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
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 SpecLinkDepends extends PMOCommand {
|
|
7
|
+
static description = 'Add a depends_on dependency (spec requires another to be completed first)';
|
|
8
|
+
static examples = ['<%= config.bin %> <%= command.id %> my-feature other-spec'];
|
|
9
|
+
static args = {
|
|
10
|
+
id: Args.string({ description: 'Spec ID that depends on another', required: true }),
|
|
11
|
+
target: Args.string({ description: 'Spec ID that this spec depends on', required: false }),
|
|
12
|
+
};
|
|
13
|
+
static flags = {
|
|
14
|
+
...pmoBaseFlags,
|
|
15
|
+
json: Flags.boolean({
|
|
16
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
17
|
+
default: false,
|
|
18
|
+
}),
|
|
19
|
+
};
|
|
20
|
+
async execute() {
|
|
21
|
+
const { args, flags } = await this.parse(SpecLinkDepends);
|
|
22
|
+
// Check if JSON output mode is active
|
|
23
|
+
const jsonMode = shouldOutputJson(flags);
|
|
24
|
+
// Helper to handle errors in JSON mode
|
|
25
|
+
const handleError = (code, message) => {
|
|
26
|
+
if (jsonMode) {
|
|
27
|
+
outputErrorAsJson(code, message, createMetadata('spec link depends', flags));
|
|
28
|
+
this.exit(1);
|
|
29
|
+
}
|
|
30
|
+
this.error(message);
|
|
31
|
+
};
|
|
32
|
+
const spec = await this.storage.getSpec(args.id);
|
|
33
|
+
if (!spec)
|
|
34
|
+
return handleError('SPEC_NOT_FOUND', `Spec not found: ${args.id}`);
|
|
35
|
+
let targetId = args.target;
|
|
36
|
+
if (!targetId) {
|
|
37
|
+
const allSpecs = await this.storage.listSpecs();
|
|
38
|
+
const otherSpecs = allSpecs.filter(s => s.id !== args.id);
|
|
39
|
+
if (otherSpecs.length === 0) {
|
|
40
|
+
if (jsonMode) {
|
|
41
|
+
outputErrorAsJson('NO_OTHER_SPECS', 'No other specs.', createMetadata('spec link depends', flags));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
this.log(styles.muted('\nNo other specs.'));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// In JSON mode, output spec selection prompt
|
|
48
|
+
if (jsonMode) {
|
|
49
|
+
const specChoices = otherSpecs.map(s => ({ name: `${s.id} - ${s.title}`, value: s.id }));
|
|
50
|
+
outputPromptAsJson(buildPromptConfig('list', 'target', `Select spec that ${args.id} depends on:`, specChoices), createMetadata('spec link depends', flags));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const { selected } = await inquirer.prompt([{ type: 'list', name: 'selected', message: `Select spec that ${args.id} depends on:`,
|
|
54
|
+
choices: otherSpecs.map(s => ({ name: `${s.id} - ${s.title}`, value: s.id })) }]);
|
|
55
|
+
targetId = selected;
|
|
56
|
+
}
|
|
57
|
+
const targetSpec = await this.storage.getSpec(targetId);
|
|
58
|
+
if (!targetSpec)
|
|
59
|
+
this.error(`Spec not found: ${targetId}`);
|
|
60
|
+
await this.storage.createSpecDependency(args.id, targetId, 'depends_on');
|
|
61
|
+
this.log(styles.success(`\nā
${styles.emphasis(args.id)} depends on ${styles.emphasis(targetId)}`));
|
|
62
|
+
this.log(styles.muted(` ${spec.title} depends on: ${targetSpec.title}`));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PMOCommand } from '../../../lib/pmo/index.js';
|
|
2
|
+
export default class SpecLinkDuplicates 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
|
+
original: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
8
|
+
};
|
|
9
|
+
static flags: {
|
|
10
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
};
|
|
13
|
+
execute(): Promise<void>;
|
|
14
|
+
}
|