@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,154 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import * as os from 'node:os';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
export default class AutocompleteSetup extends Command {
|
|
7
|
+
static description = 'Auto-detect shell and set up autocomplete';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %>',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> --install',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> --shell zsh',
|
|
12
|
+
];
|
|
13
|
+
static flags = {
|
|
14
|
+
install: Flags.boolean({
|
|
15
|
+
char: 'i',
|
|
16
|
+
description: 'Automatically install to shell config file',
|
|
17
|
+
default: false,
|
|
18
|
+
}),
|
|
19
|
+
shell: Flags.string({
|
|
20
|
+
char: 's',
|
|
21
|
+
description: 'Override shell detection (zsh, bash, powershell)',
|
|
22
|
+
options: ['zsh', 'bash', 'powershell'],
|
|
23
|
+
}),
|
|
24
|
+
};
|
|
25
|
+
async run() {
|
|
26
|
+
const { flags } = await this.parse(AutocompleteSetup);
|
|
27
|
+
const shell = flags.shell || this.detectShell();
|
|
28
|
+
if (shell === 'unknown') {
|
|
29
|
+
this.log(chalk.yellow('Could not detect shell type.'));
|
|
30
|
+
this.log(chalk.dim('Use --shell to specify: prlt autocomplete setup --shell zsh'));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
this.log(chalk.cyan(`Detected shell: ${shell}`));
|
|
34
|
+
this.log('');
|
|
35
|
+
const { configFile, snippet } = this.getShellConfig(shell);
|
|
36
|
+
if (flags.install) {
|
|
37
|
+
await this.installAutocomplete(shell, configFile, snippet);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
this.showInstructions(shell, configFile, snippet);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
detectShell() {
|
|
44
|
+
// Check for PowerShell first (works on all platforms)
|
|
45
|
+
if (process.env.PSModulePath) {
|
|
46
|
+
return 'powershell';
|
|
47
|
+
}
|
|
48
|
+
// Check $SHELL environment variable (Unix/macOS)
|
|
49
|
+
const shellEnv = process.env.SHELL || '';
|
|
50
|
+
if (shellEnv.includes('zsh')) {
|
|
51
|
+
return 'zsh';
|
|
52
|
+
}
|
|
53
|
+
if (shellEnv.includes('bash')) {
|
|
54
|
+
return 'bash';
|
|
55
|
+
}
|
|
56
|
+
// Check $0 or parent process on Windows
|
|
57
|
+
if (process.platform === 'win32') {
|
|
58
|
+
const comspec = process.env.COMSPEC || '';
|
|
59
|
+
if (comspec.toLowerCase().includes('powershell')) {
|
|
60
|
+
return 'powershell';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Default based on platform
|
|
64
|
+
if (process.platform === 'darwin') {
|
|
65
|
+
return 'zsh'; // macOS default since Catalina
|
|
66
|
+
}
|
|
67
|
+
return 'unknown';
|
|
68
|
+
}
|
|
69
|
+
getShellConfig(shell) {
|
|
70
|
+
const home = os.homedir();
|
|
71
|
+
switch (shell) {
|
|
72
|
+
case 'zsh':
|
|
73
|
+
return {
|
|
74
|
+
configFile: path.join(home, '.zshrc'),
|
|
75
|
+
snippet: 'eval "$(prlt autocomplete:script zsh)"',
|
|
76
|
+
};
|
|
77
|
+
case 'bash':
|
|
78
|
+
// Use .bashrc on Linux, .bash_profile on macOS
|
|
79
|
+
const bashConfig = process.platform === 'darwin'
|
|
80
|
+
? path.join(home, '.bash_profile')
|
|
81
|
+
: path.join(home, '.bashrc');
|
|
82
|
+
return {
|
|
83
|
+
configFile: bashConfig,
|
|
84
|
+
snippet: 'eval "$(prlt autocomplete:script bash)"',
|
|
85
|
+
};
|
|
86
|
+
case 'powershell':
|
|
87
|
+
// PowerShell profile location varies
|
|
88
|
+
const psProfile = process.env.PROFILE ||
|
|
89
|
+
path.join(home, 'Documents', 'PowerShell', 'Microsoft.PowerShell_profile.ps1');
|
|
90
|
+
return {
|
|
91
|
+
configFile: psProfile,
|
|
92
|
+
snippet: 'prlt autocomplete:script powershell | Out-String | Invoke-Expression',
|
|
93
|
+
};
|
|
94
|
+
default:
|
|
95
|
+
return { configFile: '', snippet: '' };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
showInstructions(shell, configFile, snippet) {
|
|
99
|
+
this.log(chalk.bold('To enable autocomplete, add this to your shell config:'));
|
|
100
|
+
this.log('');
|
|
101
|
+
this.log(chalk.dim(` # File: ${configFile}`));
|
|
102
|
+
this.log(chalk.green(` ${snippet}`));
|
|
103
|
+
this.log('');
|
|
104
|
+
this.log(chalk.dim('Then restart your shell or run:'));
|
|
105
|
+
if (shell === 'powershell') {
|
|
106
|
+
this.log(chalk.cyan(` . $PROFILE`));
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
this.log(chalk.cyan(` source ${configFile}`));
|
|
110
|
+
}
|
|
111
|
+
this.log('');
|
|
112
|
+
this.log(chalk.dim('Or run with --install to add automatically:'));
|
|
113
|
+
this.log(chalk.cyan(' prlt autocomplete setup --install'));
|
|
114
|
+
}
|
|
115
|
+
async installAutocomplete(shell, configFile, snippet) {
|
|
116
|
+
// Check if config file exists
|
|
117
|
+
const configExists = fs.existsSync(configFile);
|
|
118
|
+
if (configExists) {
|
|
119
|
+
// Check if already installed
|
|
120
|
+
const content = fs.readFileSync(configFile, 'utf-8');
|
|
121
|
+
if (content.includes('prlt autocomplete')) {
|
|
122
|
+
this.log(chalk.yellow('Autocomplete already configured in ' + configFile));
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Create directory if needed (for PowerShell profile)
|
|
127
|
+
const configDir = path.dirname(configFile);
|
|
128
|
+
if (!fs.existsSync(configDir)) {
|
|
129
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
130
|
+
}
|
|
131
|
+
// Append to config file
|
|
132
|
+
const addition = `\n# Proletariat CLI autocomplete\n${snippet}\n`;
|
|
133
|
+
fs.appendFileSync(configFile, addition);
|
|
134
|
+
this.log(chalk.green(`✅ Autocomplete installed to ${configFile}`));
|
|
135
|
+
this.log('');
|
|
136
|
+
this.log(chalk.dim('Restart your shell or run:'));
|
|
137
|
+
if (shell === 'powershell') {
|
|
138
|
+
this.log(chalk.cyan(` . $PROFILE`));
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
this.log(chalk.cyan(` source ${configFile}`));
|
|
142
|
+
}
|
|
143
|
+
// Also refresh the autocomplete cache
|
|
144
|
+
this.log('');
|
|
145
|
+
this.log(chalk.dim('Refreshing autocomplete cache...'));
|
|
146
|
+
try {
|
|
147
|
+
await this.config.runCommand('autocomplete', [shell, '--refresh-cache']);
|
|
148
|
+
this.log(chalk.green('✅ Autocomplete cache refreshed'));
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
this.log(chalk.dim('Run "prlt autocomplete --refresh-cache" to update completions'));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class Board 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
|
+
execute(): Promise<void>;
|
|
10
|
+
private viewBoard;
|
|
11
|
+
private outputTicketCompact;
|
|
12
|
+
private outputTicketFull;
|
|
13
|
+
private showMarkdown;
|
|
14
|
+
private exportMarkdown;
|
|
15
|
+
private syncFromMarkdown;
|
|
16
|
+
private openInObsidian;
|
|
17
|
+
}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import { execSync } from 'node:child_process';
|
|
3
|
+
import { Flags } from '@oclif/core';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import inquirer from 'inquirer';
|
|
6
|
+
import { parseBoard, findAddedTickets, findRemovedTickets, findModifiedTickets, getBoardPath, PMOCommand, pmoBaseFlags, } from '../../lib/pmo/index.js';
|
|
7
|
+
import { styles, formatPriority, formatCategory, getColumnStyle, getColumnEmoji, divider, } from '../../lib/styles.js';
|
|
8
|
+
import { shouldOutputJson, outputPromptAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
|
|
9
|
+
export default class Board extends PMOCommand {
|
|
10
|
+
static description = 'Interactive menu for board operations';
|
|
11
|
+
static examples = [
|
|
12
|
+
'<%= config.bin %> <%= command.id %>',
|
|
13
|
+
];
|
|
14
|
+
static flags = {
|
|
15
|
+
...pmoBaseFlags,
|
|
16
|
+
json: Flags.boolean({
|
|
17
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
18
|
+
default: false,
|
|
19
|
+
}),
|
|
20
|
+
};
|
|
21
|
+
async execute() {
|
|
22
|
+
const { flags } = await this.parse(Board);
|
|
23
|
+
// Board operations require project context
|
|
24
|
+
const projectId = await this.requireProject();
|
|
25
|
+
// Check if JSON output mode is active
|
|
26
|
+
const jsonMode = shouldOutputJson(flags);
|
|
27
|
+
// Define choices once, use for both JSON and interactive modes
|
|
28
|
+
const menuChoices = [
|
|
29
|
+
{ name: 'View board in terminal', value: 'view' },
|
|
30
|
+
{ name: 'Open board in Obsidian', value: 'open' },
|
|
31
|
+
{ name: 'Show as markdown', value: 'markdown' },
|
|
32
|
+
{ name: 'Export board', value: 'export' },
|
|
33
|
+
{ name: 'Sync board', value: 'sync' },
|
|
34
|
+
{ name: 'Watch for changes', value: 'watch' },
|
|
35
|
+
{ name: 'Cancel', value: 'cancel' },
|
|
36
|
+
];
|
|
37
|
+
const projectName = await this.getProjectName(projectId);
|
|
38
|
+
const message = `Board Operations - ${projectName} - What would you like to do?`;
|
|
39
|
+
// In JSON mode, output menu prompt
|
|
40
|
+
if (jsonMode) {
|
|
41
|
+
outputPromptAsJson(buildPromptConfig('list', 'action', message, menuChoices), createMetadata('board', flags));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// Show interactive menu (with separator before Cancel)
|
|
45
|
+
const { action } = await inquirer.prompt([{
|
|
46
|
+
type: 'list',
|
|
47
|
+
name: 'action',
|
|
48
|
+
message: '📋 ' + message,
|
|
49
|
+
choices: [
|
|
50
|
+
...menuChoices.slice(0, -1),
|
|
51
|
+
new inquirer.Separator(),
|
|
52
|
+
menuChoices[menuChoices.length - 1],
|
|
53
|
+
],
|
|
54
|
+
}]);
|
|
55
|
+
if (action === 'cancel') {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
switch (action) {
|
|
59
|
+
case 'view':
|
|
60
|
+
await this.viewBoard(projectId, { all: false, compact: false });
|
|
61
|
+
break;
|
|
62
|
+
case 'open':
|
|
63
|
+
this.openInObsidian();
|
|
64
|
+
break;
|
|
65
|
+
case 'markdown':
|
|
66
|
+
await this.showMarkdown(projectId);
|
|
67
|
+
break;
|
|
68
|
+
case 'export':
|
|
69
|
+
await this.exportMarkdown(projectId);
|
|
70
|
+
break;
|
|
71
|
+
case 'sync':
|
|
72
|
+
await this.syncFromMarkdown(projectId, { force: false, 'dry-run': false });
|
|
73
|
+
break;
|
|
74
|
+
case 'watch':
|
|
75
|
+
this.log(styles.info('To watch for changes, run: prlt board watch'));
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async viewBoard(projectId, flags) {
|
|
80
|
+
const board = await this.storage.getBoard(projectId);
|
|
81
|
+
// Header
|
|
82
|
+
this.log(styles.title(`\n${board.name}`));
|
|
83
|
+
this.log(styles.muted(`Storage: SQLite`));
|
|
84
|
+
this.log(styles.muted('═'.repeat(60)));
|
|
85
|
+
// Display ALL columns (always show empty ones too)
|
|
86
|
+
for (const column of board.columns) {
|
|
87
|
+
const headerColor = getColumnStyle(column.name);
|
|
88
|
+
const emoji = getColumnEmoji(column.name);
|
|
89
|
+
this.log(headerColor(`\n${emoji} ${column.name} (${column.tickets.length})`));
|
|
90
|
+
this.log(divider(50));
|
|
91
|
+
if (column.tickets.length === 0) {
|
|
92
|
+
this.log(styles.muted(' (empty)'));
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
// Sort tickets by position
|
|
96
|
+
const sortedTickets = [...column.tickets].sort((a, b) => (a.position || 0) - (b.position || 0));
|
|
97
|
+
for (const ticket of sortedTickets) {
|
|
98
|
+
if (flags.compact) {
|
|
99
|
+
this.outputTicketCompact(ticket);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
this.outputTicketFull(ticket);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Summary
|
|
107
|
+
const totalTickets = board.columns.reduce((sum, col) => sum + col.tickets.length, 0);
|
|
108
|
+
this.log(styles.muted('\n' + '═'.repeat(60)));
|
|
109
|
+
this.log(styles.emphasis(`Total: ${totalTickets} ticket${totalTickets === 1 ? '' : 's'}`));
|
|
110
|
+
// Per-column summary (only non-empty)
|
|
111
|
+
const summary = board.columns
|
|
112
|
+
.filter(col => col.tickets.length > 0)
|
|
113
|
+
.map(col => `${col.name}: ${col.tickets.length}`)
|
|
114
|
+
.join(' | ');
|
|
115
|
+
if (summary) {
|
|
116
|
+
this.log(styles.primary(summary));
|
|
117
|
+
}
|
|
118
|
+
this.log(styles.muted('\nCommands:'));
|
|
119
|
+
this.log(styles.primary(' prlt ticket create ') + styles.muted('Create a new ticket'));
|
|
120
|
+
this.log(styles.primary(' prlt ticket list ') + styles.muted('List all tickets'));
|
|
121
|
+
this.log(styles.primary(' prlt ticket move <id> ') + styles.muted('Move a ticket'));
|
|
122
|
+
}
|
|
123
|
+
outputTicketCompact(ticket) {
|
|
124
|
+
const priority = formatPriority(ticket.priority);
|
|
125
|
+
this.log(` ${styles.code(ticket.id)}: ${ticket.title} ${priority}`);
|
|
126
|
+
}
|
|
127
|
+
outputTicketFull(ticket) {
|
|
128
|
+
const priority = formatPriority(ticket.priority);
|
|
129
|
+
const category = formatCategory(ticket.category);
|
|
130
|
+
this.log(` ${styles.code(ticket.id)} ${ticket.title} ${priority} ${category}`);
|
|
131
|
+
if (ticket.description) {
|
|
132
|
+
const shortDesc = ticket.description.split('\n')[0].substring(0, 55);
|
|
133
|
+
this.log(styles.muted(` ${shortDesc}${ticket.description.length > 55 ? '...' : ''}`));
|
|
134
|
+
}
|
|
135
|
+
if (ticket.subtasks.length > 0) {
|
|
136
|
+
const done = ticket.subtasks.filter(s => s.done).length;
|
|
137
|
+
const total = ticket.subtasks.length;
|
|
138
|
+
const progress = Math.round((done / total) * 100);
|
|
139
|
+
this.log(styles.muted(` Subtasks: ${done}/${total} (${progress}%)`));
|
|
140
|
+
}
|
|
141
|
+
if (ticket.specId) {
|
|
142
|
+
this.log(styles.muted(` Spec: ${ticket.specId}`));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async showMarkdown(projectId) {
|
|
146
|
+
const markdown = await this.storage.getBoardMarkdown(projectId);
|
|
147
|
+
this.log(markdown);
|
|
148
|
+
}
|
|
149
|
+
async exportMarkdown(projectId) {
|
|
150
|
+
const markdown = await this.storage.getBoardMarkdown(projectId);
|
|
151
|
+
const boardPath = getBoardPath(this.pmoPath, projectId);
|
|
152
|
+
fs.writeFileSync(boardPath, markdown);
|
|
153
|
+
this.log(chalk.green(`✅ Exported board to ${boardPath}`));
|
|
154
|
+
}
|
|
155
|
+
async syncFromMarkdown(projectId, flags) {
|
|
156
|
+
const boardPath = getBoardPath(this.pmoPath, projectId);
|
|
157
|
+
if (!fs.existsSync(boardPath)) {
|
|
158
|
+
this.error('board.md not found. Run "prlt board export" first to create it.');
|
|
159
|
+
}
|
|
160
|
+
// Parse markdown file
|
|
161
|
+
const markdown = fs.readFileSync(boardPath, 'utf-8');
|
|
162
|
+
const markdownBoard = parseBoard(markdown);
|
|
163
|
+
const sqliteBoard = await this.storage.getBoard(projectId);
|
|
164
|
+
// Find differences
|
|
165
|
+
const added = findAddedTickets(sqliteBoard, markdownBoard);
|
|
166
|
+
const removed = findRemovedTickets(sqliteBoard, markdownBoard);
|
|
167
|
+
const modified = findModifiedTickets(sqliteBoard, markdownBoard);
|
|
168
|
+
// Check if anything changed
|
|
169
|
+
if (added.length === 0 && removed.length === 0 && modified.length === 0) {
|
|
170
|
+
this.log(chalk.green('✅ Database is already in sync with board.md'));
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
// Display changes
|
|
174
|
+
this.log(chalk.bold.cyan(`\n📊 Changes detected in board.md (to sync to database):\n`));
|
|
175
|
+
if (added.length > 0) {
|
|
176
|
+
this.log(chalk.green.bold(` + ${added.length} ticket(s) to add:`));
|
|
177
|
+
for (const ticket of added) {
|
|
178
|
+
this.log(chalk.green(` + ${ticket.id}: ${ticket.title} (${ticket.statusName})`));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (removed.length > 0) {
|
|
182
|
+
this.log(chalk.red.bold(` - ${removed.length} ticket(s) to remove:`));
|
|
183
|
+
for (const ticket of removed) {
|
|
184
|
+
this.log(chalk.red(` - ${ticket.id}: ${ticket.title}`));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (modified.length > 0) {
|
|
188
|
+
this.log(chalk.yellow.bold(` ~ ${modified.length} ticket(s) to update:`));
|
|
189
|
+
for (const { old: oldTicket, new: newTicket } of modified) {
|
|
190
|
+
this.log(chalk.yellow(` ~ ${newTicket.id}: ${newTicket.title}`));
|
|
191
|
+
if (oldTicket.statusName !== newTicket.statusName) {
|
|
192
|
+
this.log(styles.muted(` status: ${oldTicket.statusName} → ${newTicket.statusName}`));
|
|
193
|
+
}
|
|
194
|
+
if (oldTicket.priority !== newTicket.priority) {
|
|
195
|
+
this.log(styles.muted(` priority: ${oldTicket.priority || '(none)'} → ${newTicket.priority || '(none)'}`));
|
|
196
|
+
}
|
|
197
|
+
if (oldTicket.title !== newTicket.title) {
|
|
198
|
+
this.log(styles.muted(` title: ${oldTicket.title} → ${newTicket.title}`));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
this.log('');
|
|
203
|
+
// Dry run - just show changes
|
|
204
|
+
if (flags['dry-run']) {
|
|
205
|
+
this.log(styles.muted('Dry run - no changes applied.'));
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
// Confirm before applying
|
|
209
|
+
if (!flags.force) {
|
|
210
|
+
const { confirm } = await inquirer.prompt([{
|
|
211
|
+
type: 'list',
|
|
212
|
+
name: 'confirm',
|
|
213
|
+
message: 'Apply these changes to the database?',
|
|
214
|
+
choices: [
|
|
215
|
+
{ name: 'Yes, apply changes', value: true },
|
|
216
|
+
{ name: 'No, cancel', value: false },
|
|
217
|
+
],
|
|
218
|
+
default: 0,
|
|
219
|
+
}]);
|
|
220
|
+
if (!confirm) {
|
|
221
|
+
this.log(chalk.yellow('Sync cancelled.'));
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
this.log(chalk.blue('\nSyncing from board.md...'));
|
|
226
|
+
// Rebuild database from markdown (cleaner than incremental updates)
|
|
227
|
+
this.storage.rebuildFromBoard(markdownBoard);
|
|
228
|
+
// Update cache metadata with file mtime
|
|
229
|
+
const stats = fs.statSync(boardPath);
|
|
230
|
+
this.storage.setCacheMetadata({
|
|
231
|
+
boardMtime: stats.mtimeMs,
|
|
232
|
+
cacheBuiltAt: Date.now(),
|
|
233
|
+
});
|
|
234
|
+
this.log(chalk.green('\n✅ Database synced from board.md!'));
|
|
235
|
+
}
|
|
236
|
+
openInObsidian() {
|
|
237
|
+
const platform = process.platform;
|
|
238
|
+
try {
|
|
239
|
+
if (platform === 'darwin') {
|
|
240
|
+
execSync(`open "obsidian://open?path=${encodeURIComponent(this.pmoPath)}"`);
|
|
241
|
+
}
|
|
242
|
+
else if (platform === 'linux') {
|
|
243
|
+
execSync(`xdg-open "obsidian://open?path=${encodeURIComponent(this.pmoPath)}"`);
|
|
244
|
+
}
|
|
245
|
+
else if (platform === 'win32') {
|
|
246
|
+
execSync(`start "" "obsidian://open?path=${encodeURIComponent(this.pmoPath)}"`);
|
|
247
|
+
}
|
|
248
|
+
this.log(styles.success('✅ Opened PMO in Obsidian'));
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
this.log(styles.warning('Could not open Obsidian. Make sure it is installed.'));
|
|
252
|
+
this.log(styles.muted(`PMO location: ${this.pmoPath}`));
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class BoardWatch extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
debounce: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
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,52 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { PMOCommand, pmoBaseFlags, runWatcherForeground } from '../../lib/pmo/index.js';
|
|
6
|
+
import { styles } from '../../lib/styles.js';
|
|
7
|
+
export default class BoardWatch extends PMOCommand {
|
|
8
|
+
static description = 'Watch board.md for changes and auto-sync to SQLite';
|
|
9
|
+
static examples = [
|
|
10
|
+
'<%= config.bin %> <%= command.id %>',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> --debounce 1000',
|
|
12
|
+
];
|
|
13
|
+
static flags = {
|
|
14
|
+
...pmoBaseFlags,
|
|
15
|
+
debounce: Flags.integer({
|
|
16
|
+
char: 'd',
|
|
17
|
+
description: 'Debounce delay in milliseconds',
|
|
18
|
+
default: 500,
|
|
19
|
+
}),
|
|
20
|
+
};
|
|
21
|
+
getPMOOptions() {
|
|
22
|
+
return { promptIfMultiple: false };
|
|
23
|
+
}
|
|
24
|
+
async execute() {
|
|
25
|
+
const { flags } = await this.parse(BoardWatch);
|
|
26
|
+
// Load PMO config
|
|
27
|
+
const configPath = path.join(this.pmoPath, 'config.json');
|
|
28
|
+
if (!fs.existsSync(configPath)) {
|
|
29
|
+
this.error('PMO config not found. Run "prlt pmo init" first.');
|
|
30
|
+
}
|
|
31
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
32
|
+
// Header
|
|
33
|
+
this.log(styles.title('\n🔄 Board Watcher'));
|
|
34
|
+
this.log(styles.muted(`Storage: ${config.storage} | Debounce: ${flags.debounce}ms`));
|
|
35
|
+
this.log(styles.muted(`Path: ${this.pmoPath}`));
|
|
36
|
+
this.log(styles.muted('Press Ctrl+C to stop\n'));
|
|
37
|
+
// Run watcher (blocks until SIGINT/SIGTERM)
|
|
38
|
+
await runWatcherForeground(this.pmoPath, config.storage, {
|
|
39
|
+
debounceMs: flags.debounce,
|
|
40
|
+
logger: (msg) => {
|
|
41
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
42
|
+
this.log(styles.muted(`[${timestamp}]`) + ' ' + msg);
|
|
43
|
+
},
|
|
44
|
+
onSync: () => {
|
|
45
|
+
// Already logged by logger
|
|
46
|
+
},
|
|
47
|
+
onError: (error) => {
|
|
48
|
+
this.log(chalk.red(`Error: ${error.message}`));
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class BranchCreate extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
name: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
ticket: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
type: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
owner: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
'empty-commit': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
'no-switch': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
'from-origin': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
16
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
17
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
18
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
19
|
+
};
|
|
20
|
+
protected getPMOOptions(): {
|
|
21
|
+
promptIfMultiple: boolean;
|
|
22
|
+
};
|
|
23
|
+
execute(): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Get the default owner name.
|
|
26
|
+
* Priority: workspace config > GitHub username > git user.name
|
|
27
|
+
*/
|
|
28
|
+
private getDefaultOwnerName;
|
|
29
|
+
/**
|
|
30
|
+
* Create branch from ticket ID with defaults (non-interactive).
|
|
31
|
+
*/
|
|
32
|
+
private createFromTicketId;
|
|
33
|
+
private runWizard;
|
|
34
|
+
/**
|
|
35
|
+
* Quick wizard - just select ticket, auto-generate with defaults.
|
|
36
|
+
*/
|
|
37
|
+
private runTicketQuickWizard;
|
|
38
|
+
/**
|
|
39
|
+
* Wizard flow for creating branch from a ticket.
|
|
40
|
+
*/
|
|
41
|
+
private runTicketWizard;
|
|
42
|
+
/**
|
|
43
|
+
* Wizard flow for creating a custom branch (no ticket).
|
|
44
|
+
*/
|
|
45
|
+
private runCustomWizard;
|
|
46
|
+
/**
|
|
47
|
+
* Prompt user to select a branch from local or remote branches.
|
|
48
|
+
*/
|
|
49
|
+
private promptForBranch;
|
|
50
|
+
}
|