@proletariat/cli 0.1.4 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +510 -255
- 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 +104 -52
- 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 -139
- 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 -173
- 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 -212
- 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 -140
- 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,386 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import { isValidHQ } from './workspace.js';
|
|
5
|
+
const CONFIG_VERSION = '1.0.0';
|
|
6
|
+
/**
|
|
7
|
+
* Get the path to the machine-level config directory (~/.proletariat/).
|
|
8
|
+
*/
|
|
9
|
+
export function getMachineConfigDir() {
|
|
10
|
+
return path.join(os.homedir(), '.proletariat');
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Get the path to the machine-level config file (~/.proletariat/config.json).
|
|
14
|
+
*/
|
|
15
|
+
export function getMachineConfigPath() {
|
|
16
|
+
return path.join(getMachineConfigDir(), 'config.json');
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Ensure the machine config directory exists.
|
|
20
|
+
* Creates ~/.proletariat/ if it doesn't exist.
|
|
21
|
+
*/
|
|
22
|
+
export function ensureMachineConfigDir() {
|
|
23
|
+
const configDir = getMachineConfigDir();
|
|
24
|
+
if (!fs.existsSync(configDir)) {
|
|
25
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Normalize a workspace path for consistent storage.
|
|
30
|
+
* - Resolves symlinks
|
|
31
|
+
* - Makes path absolute
|
|
32
|
+
* - Removes trailing slashes
|
|
33
|
+
*/
|
|
34
|
+
export function normalizePath(inputPath) {
|
|
35
|
+
// Expand ~ to home directory
|
|
36
|
+
let resolved = inputPath.startsWith('~')
|
|
37
|
+
? path.join(os.homedir(), inputPath.slice(1))
|
|
38
|
+
: inputPath;
|
|
39
|
+
// Make absolute
|
|
40
|
+
resolved = path.resolve(resolved);
|
|
41
|
+
// Resolve symlinks if the path exists
|
|
42
|
+
if (fs.existsSync(resolved)) {
|
|
43
|
+
try {
|
|
44
|
+
resolved = fs.realpathSync(resolved);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// If realpath fails, use the resolved path
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Remove trailing slash (unless it's the root)
|
|
51
|
+
if (resolved.length > 1 && resolved.endsWith(path.sep)) {
|
|
52
|
+
resolved = resolved.slice(0, -1);
|
|
53
|
+
}
|
|
54
|
+
return resolved;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get the default (empty) machine config structure.
|
|
58
|
+
*/
|
|
59
|
+
function getDefaultConfig() {
|
|
60
|
+
return {
|
|
61
|
+
type: 'machine',
|
|
62
|
+
version: CONFIG_VERSION,
|
|
63
|
+
organizations: [],
|
|
64
|
+
headquarters: [],
|
|
65
|
+
activeHeadquarters: null,
|
|
66
|
+
activeOrganization: null,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Read the machine config file.
|
|
71
|
+
* Returns a default empty config if file doesn't exist or is invalid.
|
|
72
|
+
* Handles migration from old 'workspaces' format to new 'headquarters' format.
|
|
73
|
+
*/
|
|
74
|
+
export function readMachineConfig() {
|
|
75
|
+
const configPath = getMachineConfigPath();
|
|
76
|
+
if (!fs.existsSync(configPath)) {
|
|
77
|
+
return getDefaultConfig();
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
81
|
+
const config = JSON.parse(content);
|
|
82
|
+
// Validate basic structure - check for either old or new format
|
|
83
|
+
const hasOldFormat = Array.isArray(config.workspaces);
|
|
84
|
+
const hasNewFormat = Array.isArray(config.headquarters);
|
|
85
|
+
if (!config.version || (!hasOldFormat && !hasNewFormat)) {
|
|
86
|
+
return getDefaultConfig();
|
|
87
|
+
}
|
|
88
|
+
// Migrate from old format if needed
|
|
89
|
+
const headquarters = hasNewFormat
|
|
90
|
+
? config.headquarters
|
|
91
|
+
: (config.workspaces || []);
|
|
92
|
+
const activeHeadquarters = config.activeHeadquarters ?? config.activeWorkspace ?? null;
|
|
93
|
+
return {
|
|
94
|
+
type: 'machine',
|
|
95
|
+
version: config.version,
|
|
96
|
+
organizations: config.organizations || [],
|
|
97
|
+
headquarters,
|
|
98
|
+
activeHeadquarters,
|
|
99
|
+
activeOrganization: config.activeOrganization ?? null,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return getDefaultConfig();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Write the machine config file atomically.
|
|
108
|
+
* Uses write-to-temp-then-rename pattern for safety.
|
|
109
|
+
*/
|
|
110
|
+
export function writeMachineConfig(config) {
|
|
111
|
+
ensureMachineConfigDir();
|
|
112
|
+
const configPath = getMachineConfigPath();
|
|
113
|
+
const tempPath = `${configPath}.tmp.${process.pid}`;
|
|
114
|
+
try {
|
|
115
|
+
// Write to temp file
|
|
116
|
+
fs.writeFileSync(tempPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
117
|
+
// Atomic rename
|
|
118
|
+
fs.renameSync(tempPath, configPath);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
// Clean up temp file if rename failed
|
|
122
|
+
try {
|
|
123
|
+
if (fs.existsSync(tempPath)) {
|
|
124
|
+
fs.unlinkSync(tempPath);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Ignore cleanup errors
|
|
129
|
+
}
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Register a headquarters in the machine config.
|
|
135
|
+
*
|
|
136
|
+
* @param hqPath Absolute path to the headquarters (will be normalized)
|
|
137
|
+
* @param name Optional HQ name (defaults to directory basename)
|
|
138
|
+
* @param setActive If true, set as active HQ when no active HQ exists
|
|
139
|
+
* @param orgName Optional organization name to associate this HQ with
|
|
140
|
+
* @returns The registered headquarters entry
|
|
141
|
+
*/
|
|
142
|
+
export function registerHeadquarters(hqPath, name, setActive = true, orgName) {
|
|
143
|
+
const normalizedPath = normalizePath(hqPath);
|
|
144
|
+
const hqName = name || path.basename(normalizedPath);
|
|
145
|
+
const config = readMachineConfig();
|
|
146
|
+
// Check if already registered
|
|
147
|
+
const existingIndex = config.headquarters.findIndex((hq) => normalizePath(hq.path) === normalizedPath);
|
|
148
|
+
const entry = {
|
|
149
|
+
name: hqName,
|
|
150
|
+
path: normalizedPath,
|
|
151
|
+
registeredAt: new Date().toISOString(),
|
|
152
|
+
orgName,
|
|
153
|
+
};
|
|
154
|
+
if (existingIndex >= 0) {
|
|
155
|
+
// Update existing entry
|
|
156
|
+
config.headquarters[existingIndex] = entry;
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
// Add new entry
|
|
160
|
+
config.headquarters.push(entry);
|
|
161
|
+
}
|
|
162
|
+
// Set as active if requested and no active HQ exists
|
|
163
|
+
if (setActive && !config.activeHeadquarters) {
|
|
164
|
+
config.activeHeadquarters = normalizedPath;
|
|
165
|
+
}
|
|
166
|
+
writeMachineConfig(config);
|
|
167
|
+
return entry;
|
|
168
|
+
}
|
|
169
|
+
/** @deprecated Use registerHeadquarters instead */
|
|
170
|
+
export const registerWorkspace = registerHeadquarters;
|
|
171
|
+
/**
|
|
172
|
+
* Unregister a headquarters from the machine config.
|
|
173
|
+
*
|
|
174
|
+
* @param pathOrName HQ path or name to unregister
|
|
175
|
+
* @returns true if HQ was found and removed, false otherwise
|
|
176
|
+
*/
|
|
177
|
+
export function unregisterHeadquarters(pathOrName) {
|
|
178
|
+
const config = readMachineConfig();
|
|
179
|
+
const normalizedInput = normalizePath(pathOrName);
|
|
180
|
+
const initialLength = config.headquarters.length;
|
|
181
|
+
// Try to match by path first, then by name
|
|
182
|
+
config.headquarters = config.headquarters.filter((hq) => {
|
|
183
|
+
const normalizedHqPath = normalizePath(hq.path);
|
|
184
|
+
return normalizedHqPath !== normalizedInput && hq.name !== pathOrName;
|
|
185
|
+
});
|
|
186
|
+
const removed = config.headquarters.length < initialLength;
|
|
187
|
+
if (removed) {
|
|
188
|
+
// Clear active HQ if it was the removed one
|
|
189
|
+
if (config.activeHeadquarters) {
|
|
190
|
+
const normalizedActive = normalizePath(config.activeHeadquarters);
|
|
191
|
+
const stillExists = config.headquarters.some((hq) => normalizePath(hq.path) === normalizedActive);
|
|
192
|
+
if (!stillExists) {
|
|
193
|
+
config.activeHeadquarters = null;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
writeMachineConfig(config);
|
|
197
|
+
}
|
|
198
|
+
return removed;
|
|
199
|
+
}
|
|
200
|
+
/** @deprecated Use unregisterHeadquarters instead */
|
|
201
|
+
export const unregisterWorkspace = unregisterHeadquarters;
|
|
202
|
+
/**
|
|
203
|
+
* Get all registered headquarters.
|
|
204
|
+
*/
|
|
205
|
+
export function getRegisteredHeadquarters() {
|
|
206
|
+
const config = readMachineConfig();
|
|
207
|
+
return config.headquarters;
|
|
208
|
+
}
|
|
209
|
+
/** @deprecated Use getRegisteredHeadquarters instead */
|
|
210
|
+
export const getRegisteredWorkspaces = getRegisteredHeadquarters;
|
|
211
|
+
/**
|
|
212
|
+
* Get the active headquarters path.
|
|
213
|
+
* Returns null if no active HQ is set.
|
|
214
|
+
*/
|
|
215
|
+
export function getActiveHeadquarters() {
|
|
216
|
+
const config = readMachineConfig();
|
|
217
|
+
return config.activeHeadquarters;
|
|
218
|
+
}
|
|
219
|
+
/** @deprecated Use getActiveHeadquarters instead */
|
|
220
|
+
export const getActiveWorkspace = getActiveHeadquarters;
|
|
221
|
+
/**
|
|
222
|
+
* Set the active headquarters.
|
|
223
|
+
*
|
|
224
|
+
* @param pathOrName HQ path or name
|
|
225
|
+
* @returns The path of the HQ that was set as active
|
|
226
|
+
* @throws Error if HQ not found or not valid
|
|
227
|
+
*/
|
|
228
|
+
export function setActiveHeadquarters(pathOrName) {
|
|
229
|
+
const config = readMachineConfig();
|
|
230
|
+
const normalizedInput = normalizePath(pathOrName);
|
|
231
|
+
// Find HQ by path or name
|
|
232
|
+
let hq = config.headquarters.find((h) => normalizePath(h.path) === normalizedInput);
|
|
233
|
+
if (!hq) {
|
|
234
|
+
// Try matching by name
|
|
235
|
+
const matches = config.headquarters.filter((h) => h.name === pathOrName);
|
|
236
|
+
if (matches.length === 0) {
|
|
237
|
+
throw new Error(`Headquarters not found: ${pathOrName}`);
|
|
238
|
+
}
|
|
239
|
+
if (matches.length > 1) {
|
|
240
|
+
throw new Error(`Multiple headquarters found with name "${pathOrName}". Please use the full path instead.`);
|
|
241
|
+
}
|
|
242
|
+
hq = matches[0];
|
|
243
|
+
}
|
|
244
|
+
// Validate HQ still exists on filesystem
|
|
245
|
+
if (!fs.existsSync(hq.path)) {
|
|
246
|
+
throw new Error(`Headquarters path no longer exists: ${hq.path}`);
|
|
247
|
+
}
|
|
248
|
+
// Validate it's still a valid HQ
|
|
249
|
+
if (!isValidHQ(hq.path)) {
|
|
250
|
+
throw new Error(`Path is no longer a valid headquarters: ${hq.path}`);
|
|
251
|
+
}
|
|
252
|
+
config.activeHeadquarters = hq.path;
|
|
253
|
+
writeMachineConfig(config);
|
|
254
|
+
return hq.path;
|
|
255
|
+
}
|
|
256
|
+
/** @deprecated Use setActiveHeadquarters instead */
|
|
257
|
+
export const setActiveWorkspace = setActiveHeadquarters;
|
|
258
|
+
/**
|
|
259
|
+
* Find headquarters by name.
|
|
260
|
+
* Returns array of matches (may be multiple if names are not unique).
|
|
261
|
+
*/
|
|
262
|
+
export function findHeadquartersByName(name) {
|
|
263
|
+
const config = readMachineConfig();
|
|
264
|
+
return config.headquarters.filter((hq) => hq.name.toLowerCase() === name.toLowerCase());
|
|
265
|
+
}
|
|
266
|
+
/** @deprecated Use findHeadquartersByName instead */
|
|
267
|
+
export const findWorkspacesByName = findHeadquartersByName;
|
|
268
|
+
/**
|
|
269
|
+
* Find headquarters by path.
|
|
270
|
+
*/
|
|
271
|
+
export function findHeadquartersByPath(hqPath) {
|
|
272
|
+
const config = readMachineConfig();
|
|
273
|
+
const normalized = normalizePath(hqPath);
|
|
274
|
+
return (config.headquarters.find((hq) => normalizePath(hq.path) === normalized) || null);
|
|
275
|
+
}
|
|
276
|
+
/** @deprecated Use findHeadquartersByPath instead */
|
|
277
|
+
export const findWorkspaceByPath = findHeadquartersByPath;
|
|
278
|
+
/**
|
|
279
|
+
* Check if a headquarters path is registered.
|
|
280
|
+
*/
|
|
281
|
+
export function isHeadquartersRegistered(hqPath) {
|
|
282
|
+
return findHeadquartersByPath(hqPath) !== null;
|
|
283
|
+
}
|
|
284
|
+
/** @deprecated Use isHeadquartersRegistered instead */
|
|
285
|
+
export const isWorkspaceRegistered = isHeadquartersRegistered;
|
|
286
|
+
/**
|
|
287
|
+
* Get headquarters name from path (for existing HQ).
|
|
288
|
+
* Reads the HQ config to get the name, or falls back to directory basename.
|
|
289
|
+
*/
|
|
290
|
+
export function getHeadquartersNameFromPath(hqPath) {
|
|
291
|
+
const configPath = path.join(hqPath, '.proletariat', 'config.json');
|
|
292
|
+
if (fs.existsSync(configPath)) {
|
|
293
|
+
try {
|
|
294
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
295
|
+
if (config.name) {
|
|
296
|
+
return config.name;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
// Fall through to basename
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return path.basename(hqPath);
|
|
304
|
+
}
|
|
305
|
+
/** @deprecated Use getHeadquartersNameFromPath instead */
|
|
306
|
+
export const getWorkspaceNameFromPath = getHeadquartersNameFromPath;
|
|
307
|
+
/**
|
|
308
|
+
* Check if there are duplicate headquarters names in the registry.
|
|
309
|
+
*/
|
|
310
|
+
export function hasDuplicateNames() {
|
|
311
|
+
const config = readMachineConfig();
|
|
312
|
+
const nameMap = new Map();
|
|
313
|
+
for (const hq of config.headquarters) {
|
|
314
|
+
const existing = nameMap.get(hq.name) || [];
|
|
315
|
+
existing.push(hq.path);
|
|
316
|
+
nameMap.set(hq.name, existing);
|
|
317
|
+
}
|
|
318
|
+
const duplicates = [];
|
|
319
|
+
for (const [name, paths] of nameMap) {
|
|
320
|
+
if (paths.length > 1) {
|
|
321
|
+
duplicates.push({ name, paths });
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return duplicates;
|
|
325
|
+
}
|
|
326
|
+
// =============================================================================
|
|
327
|
+
// Organization Management
|
|
328
|
+
// =============================================================================
|
|
329
|
+
/**
|
|
330
|
+
* Get all organizations.
|
|
331
|
+
*/
|
|
332
|
+
export function getOrganizations() {
|
|
333
|
+
const config = readMachineConfig();
|
|
334
|
+
return config.organizations;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Get the active organization name.
|
|
338
|
+
*/
|
|
339
|
+
export function getActiveOrganization() {
|
|
340
|
+
const config = readMachineConfig();
|
|
341
|
+
return config.activeOrganization;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Create a new organization.
|
|
345
|
+
*/
|
|
346
|
+
export function createOrganization(name) {
|
|
347
|
+
const config = readMachineConfig();
|
|
348
|
+
// Check if organization already exists
|
|
349
|
+
const existing = config.organizations.find((o) => o.name.toLowerCase() === name.toLowerCase());
|
|
350
|
+
if (existing) {
|
|
351
|
+
return existing;
|
|
352
|
+
}
|
|
353
|
+
const org = {
|
|
354
|
+
name,
|
|
355
|
+
createdAt: new Date().toISOString(),
|
|
356
|
+
};
|
|
357
|
+
config.organizations.push(org);
|
|
358
|
+
// Set as active if it's the first organization
|
|
359
|
+
if (!config.activeOrganization) {
|
|
360
|
+
config.activeOrganization = name;
|
|
361
|
+
}
|
|
362
|
+
writeMachineConfig(config);
|
|
363
|
+
return org;
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Set the active organization.
|
|
367
|
+
*/
|
|
368
|
+
export function setActiveOrganization(name) {
|
|
369
|
+
const config = readMachineConfig();
|
|
370
|
+
// Find organization (case-insensitive)
|
|
371
|
+
const org = config.organizations.find((o) => o.name.toLowerCase() === name.toLowerCase());
|
|
372
|
+
if (!org) {
|
|
373
|
+
throw new Error(`Organization not found: ${name}`);
|
|
374
|
+
}
|
|
375
|
+
config.activeOrganization = org.name;
|
|
376
|
+
writeMachineConfig(config);
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Get headquarters belonging to a specific organization.
|
|
380
|
+
*/
|
|
381
|
+
export function getOrganizationHeadquarters(orgName) {
|
|
382
|
+
const config = readMachineConfig();
|
|
383
|
+
return config.headquarters.filter((hq) => hq.orgName?.toLowerCase() === orgName.toLowerCase());
|
|
384
|
+
}
|
|
385
|
+
/** @deprecated Use getOrganizationHeadquarters instead */
|
|
386
|
+
export const getOrganizationWorkspaces = getOrganizationHeadquarters;
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
import { type PMOContext } from './pmo-context.js';
|
|
3
|
+
import { type JsonFlags } from '../prompt-json.js';
|
|
4
|
+
/**
|
|
5
|
+
* Base flags shared by all PMO commands
|
|
6
|
+
* Include these in your command's flags by spreading: ...PMOCommand.baseFlags
|
|
7
|
+
*/
|
|
8
|
+
export declare const pmoBaseFlags: {
|
|
9
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Base command class for PMO commands
|
|
13
|
+
*
|
|
14
|
+
* Provides automatic PMO context initialization and cleanup:
|
|
15
|
+
* - Initializes storage before run() executes
|
|
16
|
+
* - Ensures storage.close() is called even if errors occur
|
|
17
|
+
* - Provides common PMO flags (--project)
|
|
18
|
+
*
|
|
19
|
+
* Storage is project-agnostic - projectId is passed explicitly to operations.
|
|
20
|
+
*
|
|
21
|
+
* Usage:
|
|
22
|
+
* ```typescript
|
|
23
|
+
* import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/base-command.js';
|
|
24
|
+
*
|
|
25
|
+
* export default class MyCommand extends PMOCommand {
|
|
26
|
+
* static flags = {
|
|
27
|
+
* ...pmoBaseFlags,
|
|
28
|
+
* // additional flags...
|
|
29
|
+
* };
|
|
30
|
+
*
|
|
31
|
+
* async execute(): Promise<void> {
|
|
32
|
+
* // For project-agnostic operations (e.g., get ticket by ID):
|
|
33
|
+
* const ticket = await this.storage.getTicketById('TKT-123');
|
|
34
|
+
*
|
|
35
|
+
* // For project-scoped operations, get projectId first:
|
|
36
|
+
* const projectId = await this.requireProject();
|
|
37
|
+
* const board = await this.storage.getBoard(projectId);
|
|
38
|
+
*
|
|
39
|
+
* // Or derive from an entity:
|
|
40
|
+
* const projectId = ticket.projectId;
|
|
41
|
+
* await this.storage.moveTicket(projectId, ticket.id, 'Done');
|
|
42
|
+
* }
|
|
43
|
+
* }
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare abstract class PMOCommand extends Command {
|
|
47
|
+
/**
|
|
48
|
+
* PMO context with storage, pmoPath, etc.
|
|
49
|
+
* Available after init() runs (before execute())
|
|
50
|
+
*/
|
|
51
|
+
protected pmoContext: PMOContext;
|
|
52
|
+
/**
|
|
53
|
+
* Flag to track if context was successfully initialized
|
|
54
|
+
*/
|
|
55
|
+
private contextInitialized;
|
|
56
|
+
/**
|
|
57
|
+
* Cached project ID from -P flag
|
|
58
|
+
*/
|
|
59
|
+
private projectFlag?;
|
|
60
|
+
/**
|
|
61
|
+
* Logger function for PMO context
|
|
62
|
+
* Can be overridden to customize logging behavior
|
|
63
|
+
*/
|
|
64
|
+
protected pmoLogger(msg: string): void;
|
|
65
|
+
/**
|
|
66
|
+
* oclif init hook - runs before the command executes
|
|
67
|
+
* Initializes PMO context with storage access
|
|
68
|
+
*/
|
|
69
|
+
init(): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Require a project to be selected.
|
|
72
|
+
* Returns projectId that should be passed to storage operations.
|
|
73
|
+
*
|
|
74
|
+
* Priority:
|
|
75
|
+
* 1. If -P flag was provided, uses that
|
|
76
|
+
* 2. If only one project exists, uses that
|
|
77
|
+
* 3. If multiple projects exist, prompts user to select one (or outputs JSON if jsonMode)
|
|
78
|
+
*
|
|
79
|
+
* @param options.filterEmptyProjects - Only show projects with tickets
|
|
80
|
+
* @param options.jsonMode - JSON mode configuration for AI agents
|
|
81
|
+
* @returns The selected project ID - pass this to storage operations
|
|
82
|
+
*/
|
|
83
|
+
protected requireProject(options?: {
|
|
84
|
+
filterEmptyProjects?: boolean;
|
|
85
|
+
jsonMode?: {
|
|
86
|
+
flags: JsonFlags & Record<string, unknown>;
|
|
87
|
+
commandName: string;
|
|
88
|
+
baseCommand: string;
|
|
89
|
+
};
|
|
90
|
+
}): Promise<string>;
|
|
91
|
+
/**
|
|
92
|
+
* Get project name by ID
|
|
93
|
+
*/
|
|
94
|
+
protected getProjectName(projectId: string): Promise<string>;
|
|
95
|
+
/**
|
|
96
|
+
* Select from a list of items with JSON mode support for AI agents.
|
|
97
|
+
*
|
|
98
|
+
* In JSON mode: outputs choices as JSON with command field and exits
|
|
99
|
+
* In interactive mode: shows prompt and returns selected value
|
|
100
|
+
*
|
|
101
|
+
* @param options Configuration for the selection
|
|
102
|
+
* @returns The selected value (only in interactive mode)
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```typescript
|
|
106
|
+
* const ticketId = await this.selectFromList({
|
|
107
|
+
* message: 'Select ticket:',
|
|
108
|
+
* items: tickets,
|
|
109
|
+
* getName: (t) => `${t.id}: ${t.title}`,
|
|
110
|
+
* getValue: (t) => t.id,
|
|
111
|
+
* getCommand: (t) => `prlt ticket view ${t.id} --json`,
|
|
112
|
+
* jsonMode: { flags, commandName: 'ticket view' },
|
|
113
|
+
* });
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
protected selectFromList<T>(options: {
|
|
117
|
+
/** Prompt message shown to user */
|
|
118
|
+
message: string;
|
|
119
|
+
/** Items to select from */
|
|
120
|
+
items: T[];
|
|
121
|
+
/** Extract display name from item */
|
|
122
|
+
getName: (item: T) => string;
|
|
123
|
+
/** Extract value from item */
|
|
124
|
+
getValue: (item: T) => string;
|
|
125
|
+
/** Build command string for item (should include --json) */
|
|
126
|
+
getCommand: (item: T) => string;
|
|
127
|
+
/** JSON mode config - if provided and flags indicate JSON mode, outputs JSON */
|
|
128
|
+
jsonMode?: {
|
|
129
|
+
flags: JsonFlags & Record<string, unknown>;
|
|
130
|
+
commandName: string;
|
|
131
|
+
} | null;
|
|
132
|
+
/** Optional: include a Cancel option */
|
|
133
|
+
allowCancel?: boolean;
|
|
134
|
+
/** Optional: custom cancel value (default: null returned) */
|
|
135
|
+
cancelValue?: string;
|
|
136
|
+
}): Promise<string | null>;
|
|
137
|
+
/**
|
|
138
|
+
* Prompt for input with JSON mode support for AI agents.
|
|
139
|
+
*
|
|
140
|
+
* In JSON mode: outputs field info as JSON and exits
|
|
141
|
+
* In interactive mode: shows prompt and returns input value
|
|
142
|
+
*
|
|
143
|
+
* @param options Configuration for the input
|
|
144
|
+
* @returns The input value (only in interactive mode)
|
|
145
|
+
*/
|
|
146
|
+
protected promptForInput(options: {
|
|
147
|
+
/** Prompt message shown to user */
|
|
148
|
+
message: string;
|
|
149
|
+
/** Field name for the prompt */
|
|
150
|
+
fieldName: string;
|
|
151
|
+
/** Default value */
|
|
152
|
+
defaultValue?: string;
|
|
153
|
+
/** Validation function */
|
|
154
|
+
validate?: (input: string) => boolean | string;
|
|
155
|
+
/** JSON mode config */
|
|
156
|
+
jsonMode?: {
|
|
157
|
+
flags: JsonFlags & Record<string, unknown>;
|
|
158
|
+
commandName: string;
|
|
159
|
+
/** Hint for how to provide this value */
|
|
160
|
+
commandHint: string;
|
|
161
|
+
/** Example command */
|
|
162
|
+
example?: string;
|
|
163
|
+
} | null;
|
|
164
|
+
}): Promise<string>;
|
|
165
|
+
/**
|
|
166
|
+
* Override run() to delegate to execute() and ensure cleanup
|
|
167
|
+
* Subclasses should implement execute() instead of run()
|
|
168
|
+
*/
|
|
169
|
+
run(): Promise<void>;
|
|
170
|
+
/**
|
|
171
|
+
* Main command logic - implement this instead of run()
|
|
172
|
+
* PMO context is available via this.pmoContext
|
|
173
|
+
*/
|
|
174
|
+
protected abstract execute(): Promise<void>;
|
|
175
|
+
/**
|
|
176
|
+
* Cleanup handler - ensures storage is closed
|
|
177
|
+
* Called automatically after execute() completes or throws
|
|
178
|
+
*/
|
|
179
|
+
protected cleanup(): Promise<void>;
|
|
180
|
+
/**
|
|
181
|
+
* oclif catch hook - called when an error occurs
|
|
182
|
+
* Ensures cleanup even on errors
|
|
183
|
+
*/
|
|
184
|
+
catch(error: Error & {
|
|
185
|
+
exitCode?: number;
|
|
186
|
+
}): Promise<void>;
|
|
187
|
+
/**
|
|
188
|
+
* oclif finally hook - called after run() completes
|
|
189
|
+
*/
|
|
190
|
+
finally(_: Error | undefined): Promise<void>;
|
|
191
|
+
/** Storage instance */
|
|
192
|
+
protected get storage(): import("./storage-sqlite.js").SQLiteStorage;
|
|
193
|
+
/** PMO directory path */
|
|
194
|
+
protected get pmoPath(): string;
|
|
195
|
+
}
|