@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,689 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Storage Implementation for PMO
|
|
3
|
+
*
|
|
4
|
+
* This is the main facade that delegates to domain-specific storage modules.
|
|
5
|
+
* Uses the unified workspace.db database with pmo_ prefixed tables.
|
|
6
|
+
*/
|
|
7
|
+
import Database from 'better-sqlite3';
|
|
8
|
+
import { PMO_TABLES, PMO_SCHEMA_SQL, validateTicketSchema } from '../schema.js';
|
|
9
|
+
import { runMigrations, seedBuiltinWorkflows, seedBuiltinPhases, seedBuiltinPhaseTemplates, seedBuiltinActions, seedBuiltinTicketTemplates, updateBoardTimestamp, } from './base.js';
|
|
10
|
+
import { ProjectStorage } from './projects.js';
|
|
11
|
+
import { TicketStorage } from './tickets.js';
|
|
12
|
+
import { SubtaskStorage, AcceptanceCriteriaStorage } from './subtasks.js';
|
|
13
|
+
import { SpecStorage } from './specs.js';
|
|
14
|
+
import { EpicStorage } from './epics.js';
|
|
15
|
+
import { DependencyStorage } from './dependencies.js';
|
|
16
|
+
import { StatusStorage } from './statuses.js';
|
|
17
|
+
import { TemplateStorage } from './templates.js';
|
|
18
|
+
import { PhaseStorage } from './phases.js';
|
|
19
|
+
import { ActionStorage } from './actions.js';
|
|
20
|
+
import { ViewStorage } from './views.js';
|
|
21
|
+
const T = PMO_TABLES;
|
|
22
|
+
export class SQLiteStorage {
|
|
23
|
+
type = 'sqlite';
|
|
24
|
+
db;
|
|
25
|
+
dbPath;
|
|
26
|
+
// Domain-specific storage modules
|
|
27
|
+
projectStorage;
|
|
28
|
+
ticketStorage;
|
|
29
|
+
subtaskStorage;
|
|
30
|
+
acceptanceCriteriaStorage;
|
|
31
|
+
specStorage;
|
|
32
|
+
epicStorage;
|
|
33
|
+
dependencyStorage;
|
|
34
|
+
statusStorage;
|
|
35
|
+
templateStorage;
|
|
36
|
+
phaseStorage;
|
|
37
|
+
actionStorage;
|
|
38
|
+
viewStorage;
|
|
39
|
+
constructor(dbPath) {
|
|
40
|
+
this.dbPath = dbPath;
|
|
41
|
+
// Open database (creates if doesn't exist)
|
|
42
|
+
this.db = new Database(dbPath);
|
|
43
|
+
this.db.pragma('foreign_keys = ON');
|
|
44
|
+
// Create the storage context shared by all modules
|
|
45
|
+
// Note: projectId is passed explicitly to operations, not stored in context
|
|
46
|
+
const ctx = {
|
|
47
|
+
db: this.db,
|
|
48
|
+
updateBoardTimestamp: (projectId) => updateBoardTimestamp(this.db, projectId),
|
|
49
|
+
};
|
|
50
|
+
// Initialize domain-specific storage modules
|
|
51
|
+
this.projectStorage = new ProjectStorage(ctx);
|
|
52
|
+
this.ticketStorage = new TicketStorage(ctx);
|
|
53
|
+
this.subtaskStorage = new SubtaskStorage(ctx);
|
|
54
|
+
this.acceptanceCriteriaStorage = new AcceptanceCriteriaStorage(ctx);
|
|
55
|
+
this.specStorage = new SpecStorage(ctx);
|
|
56
|
+
this.epicStorage = new EpicStorage(ctx);
|
|
57
|
+
this.dependencyStorage = new DependencyStorage(ctx);
|
|
58
|
+
this.statusStorage = new StatusStorage(ctx);
|
|
59
|
+
this.templateStorage = new TemplateStorage(ctx);
|
|
60
|
+
this.phaseStorage = new PhaseStorage(ctx);
|
|
61
|
+
this.actionStorage = new ActionStorage(ctx);
|
|
62
|
+
this.viewStorage = new ViewStorage(ctx);
|
|
63
|
+
// Ensure PMO tables exist
|
|
64
|
+
this.ensurePMOTables();
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get the underlying database connection.
|
|
68
|
+
*/
|
|
69
|
+
getDatabase() {
|
|
70
|
+
return this.db;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Ensure PMO tables exist in the database.
|
|
74
|
+
*/
|
|
75
|
+
ensurePMOTables() {
|
|
76
|
+
// Run migrations FIRST for existing databases
|
|
77
|
+
runMigrations(this.db);
|
|
78
|
+
// Create tables and indexes using shared schema
|
|
79
|
+
this.db.exec(PMO_SCHEMA_SQL);
|
|
80
|
+
// Seed built-in data (workflows are the source of truth for status configurations)
|
|
81
|
+
seedBuiltinWorkflows(this.db);
|
|
82
|
+
seedBuiltinPhases(this.db);
|
|
83
|
+
seedBuiltinPhaseTemplates(this.db);
|
|
84
|
+
seedBuiltinActions(this.db);
|
|
85
|
+
seedBuiltinTicketTemplates(this.db);
|
|
86
|
+
// Validate schema
|
|
87
|
+
validateTicketSchema(this.db);
|
|
88
|
+
}
|
|
89
|
+
// ===========================================================================
|
|
90
|
+
// Board Operations
|
|
91
|
+
// ===========================================================================
|
|
92
|
+
async init(projectId, config) {
|
|
93
|
+
return this.projectStorage.init(projectId, config);
|
|
94
|
+
}
|
|
95
|
+
async getBoard(projectId) {
|
|
96
|
+
return this.projectStorage.getBoard(projectId);
|
|
97
|
+
}
|
|
98
|
+
async getBoardMarkdown(projectId) {
|
|
99
|
+
return this.projectStorage.getBoardMarkdown(projectId);
|
|
100
|
+
}
|
|
101
|
+
// ===========================================================================
|
|
102
|
+
// Column Operations (columns are now workflow statuses)
|
|
103
|
+
// ===========================================================================
|
|
104
|
+
getColumnNames(projectId) {
|
|
105
|
+
// Get project's workflow
|
|
106
|
+
const project = this.db.prepare(`
|
|
107
|
+
SELECT workflow_id FROM ${T.projects} WHERE id = ?
|
|
108
|
+
`).get(projectId);
|
|
109
|
+
const workflowId = project?.workflow_id || 'default';
|
|
110
|
+
const rows = this.db.prepare(`
|
|
111
|
+
SELECT name FROM ${T.workflow_statuses}
|
|
112
|
+
WHERE workflow_id = ?
|
|
113
|
+
ORDER BY position
|
|
114
|
+
`).all(workflowId);
|
|
115
|
+
return rows.map((r) => r.name);
|
|
116
|
+
}
|
|
117
|
+
async createColumn(projectId, name, position) {
|
|
118
|
+
// Get project's workflow
|
|
119
|
+
const project = this.db.prepare(`
|
|
120
|
+
SELECT workflow_id FROM ${T.projects} WHERE id = ?
|
|
121
|
+
`).get(projectId);
|
|
122
|
+
const workflowId = project?.workflow_id || 'default';
|
|
123
|
+
// Create a status in the workflow
|
|
124
|
+
const status = await this.statusStorage.createStatus(workflowId, {
|
|
125
|
+
name,
|
|
126
|
+
category: 'unstarted', // Default category for manually created columns
|
|
127
|
+
position,
|
|
128
|
+
});
|
|
129
|
+
return {
|
|
130
|
+
id: status.id,
|
|
131
|
+
name: status.name,
|
|
132
|
+
position: status.position,
|
|
133
|
+
tickets: [],
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
async renameColumn(projectId, id, name) {
|
|
137
|
+
const status = await this.statusStorage.updateStatus(id, { name });
|
|
138
|
+
return {
|
|
139
|
+
id: status.id,
|
|
140
|
+
name: status.name,
|
|
141
|
+
position: status.position,
|
|
142
|
+
tickets: [],
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
async moveColumn(projectId, id, position) {
|
|
146
|
+
const status = await this.statusStorage.reorderStatus(id, position);
|
|
147
|
+
return {
|
|
148
|
+
id: status.id,
|
|
149
|
+
name: status.name,
|
|
150
|
+
position: status.position,
|
|
151
|
+
tickets: [],
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
async deleteColumn(projectId, id, _cascade) {
|
|
155
|
+
return this.statusStorage.deleteStatus(id);
|
|
156
|
+
}
|
|
157
|
+
// ===========================================================================
|
|
158
|
+
// Ticket Operations
|
|
159
|
+
// ===========================================================================
|
|
160
|
+
async createTicket(projectId, ticket) {
|
|
161
|
+
return this.ticketStorage.createTicket(projectId, ticket);
|
|
162
|
+
}
|
|
163
|
+
async getTicket(id) {
|
|
164
|
+
return this.ticketStorage.getTicket(id);
|
|
165
|
+
}
|
|
166
|
+
async getTicketById(id) {
|
|
167
|
+
return this.ticketStorage.getTicketById(id);
|
|
168
|
+
}
|
|
169
|
+
async updateTicket(id, changes) {
|
|
170
|
+
return this.ticketStorage.updateTicket(id, changes);
|
|
171
|
+
}
|
|
172
|
+
async moveTicket(projectId, id, column, position) {
|
|
173
|
+
return this.ticketStorage.moveTicket(projectId, id, column, position);
|
|
174
|
+
}
|
|
175
|
+
async moveTicketToProject(ticketId, newProjectId) {
|
|
176
|
+
return this.ticketStorage.moveTicketToProject(ticketId, newProjectId);
|
|
177
|
+
}
|
|
178
|
+
async deleteTicket(id) {
|
|
179
|
+
return this.ticketStorage.deleteTicket(id);
|
|
180
|
+
}
|
|
181
|
+
async listTickets(projectId, filter) {
|
|
182
|
+
return this.ticketStorage.listTickets(projectId, filter);
|
|
183
|
+
}
|
|
184
|
+
// ===========================================================================
|
|
185
|
+
// Subtask Operations
|
|
186
|
+
// ===========================================================================
|
|
187
|
+
async addSubtask(ticketId, title) {
|
|
188
|
+
return this.subtaskStorage.addSubtask(ticketId, title);
|
|
189
|
+
}
|
|
190
|
+
async toggleSubtask(ticketId, subtaskId) {
|
|
191
|
+
return this.subtaskStorage.toggleSubtask(ticketId, subtaskId);
|
|
192
|
+
}
|
|
193
|
+
async removeSubtask(ticketId, subtaskId) {
|
|
194
|
+
return this.subtaskStorage.removeSubtask(ticketId, subtaskId);
|
|
195
|
+
}
|
|
196
|
+
// ===========================================================================
|
|
197
|
+
// Acceptance Criteria Operations
|
|
198
|
+
// ===========================================================================
|
|
199
|
+
async addAcceptanceCriterion(ticketId, criterion) {
|
|
200
|
+
return this.acceptanceCriteriaStorage.addAcceptanceCriterion(ticketId, criterion);
|
|
201
|
+
}
|
|
202
|
+
async removeAcceptanceCriterion(ticketId, criterionId) {
|
|
203
|
+
return this.acceptanceCriteriaStorage.removeAcceptanceCriterion(ticketId, criterionId);
|
|
204
|
+
}
|
|
205
|
+
async clearAcceptanceCriteria(ticketId) {
|
|
206
|
+
return this.acceptanceCriteriaStorage.clearAcceptanceCriteria(ticketId);
|
|
207
|
+
}
|
|
208
|
+
// ===========================================================================
|
|
209
|
+
// Spec Operations
|
|
210
|
+
// ===========================================================================
|
|
211
|
+
async createSpec(spec) {
|
|
212
|
+
return this.specStorage.createSpec(spec);
|
|
213
|
+
}
|
|
214
|
+
async getSpec(id) {
|
|
215
|
+
return this.specStorage.getSpec(id);
|
|
216
|
+
}
|
|
217
|
+
async listSpecs(filter) {
|
|
218
|
+
return this.specStorage.listSpecs(filter);
|
|
219
|
+
}
|
|
220
|
+
async updateSpec(id, changes) {
|
|
221
|
+
return this.specStorage.updateSpec(id, changes);
|
|
222
|
+
}
|
|
223
|
+
async deleteSpec(id) {
|
|
224
|
+
return this.specStorage.deleteSpec(id);
|
|
225
|
+
}
|
|
226
|
+
async linkTicketToSpec(ticketId, specId) {
|
|
227
|
+
return this.specStorage.linkTicketToSpec(ticketId, specId);
|
|
228
|
+
}
|
|
229
|
+
async unlinkTicketFromSpec(ticketId, specId) {
|
|
230
|
+
return this.specStorage.unlinkTicketFromSpec(ticketId, specId);
|
|
231
|
+
}
|
|
232
|
+
async getTicketsForSpec(projectId, specId) {
|
|
233
|
+
return this.specStorage.getTicketsForSpec(projectId, specId);
|
|
234
|
+
}
|
|
235
|
+
async getSpecsForTicket(ticketId) {
|
|
236
|
+
return this.specStorage.getSpecsForTicket(ticketId);
|
|
237
|
+
}
|
|
238
|
+
async addSpecDependency(specId, dependsOnId) {
|
|
239
|
+
return this.specStorage.addSpecDependency(specId, dependsOnId);
|
|
240
|
+
}
|
|
241
|
+
async removeSpecDependency(specId, dependsOnId) {
|
|
242
|
+
return this.specStorage.removeSpecDependency(specId, dependsOnId);
|
|
243
|
+
}
|
|
244
|
+
async getSpecDependencies(specId) {
|
|
245
|
+
return this.specStorage.getSpecDependencies(specId);
|
|
246
|
+
}
|
|
247
|
+
async getSpecDependents(specId) {
|
|
248
|
+
return this.specStorage.getSpecDependents(specId);
|
|
249
|
+
}
|
|
250
|
+
async linkProjectToSpec(projectId, specId) {
|
|
251
|
+
return this.specStorage.linkProjectToSpec(projectId, specId);
|
|
252
|
+
}
|
|
253
|
+
async unlinkProjectFromSpec(projectId, specId) {
|
|
254
|
+
return this.specStorage.unlinkProjectFromSpec(projectId, specId);
|
|
255
|
+
}
|
|
256
|
+
async getSpecsForProject(projectId) {
|
|
257
|
+
return this.specStorage.getSpecsForProject(projectId);
|
|
258
|
+
}
|
|
259
|
+
async getProjectsForSpec(specId) {
|
|
260
|
+
return this.specStorage.getProjectsForSpec(specId);
|
|
261
|
+
}
|
|
262
|
+
// ===========================================================================
|
|
263
|
+
// Epic Operations
|
|
264
|
+
// ===========================================================================
|
|
265
|
+
async createEpic(projectId, epic) {
|
|
266
|
+
return this.epicStorage.createEpic(projectId, epic);
|
|
267
|
+
}
|
|
268
|
+
async getEpic(id) {
|
|
269
|
+
return this.epicStorage.getEpic(id);
|
|
270
|
+
}
|
|
271
|
+
async listEpics(projectId, filter) {
|
|
272
|
+
return this.epicStorage.listEpics(projectId, filter);
|
|
273
|
+
}
|
|
274
|
+
async reorderEpic(projectId, epicId, newPosition) {
|
|
275
|
+
return this.epicStorage.reorderEpic(projectId, epicId, newPosition);
|
|
276
|
+
}
|
|
277
|
+
async updateEpic(id, changes) {
|
|
278
|
+
return this.epicStorage.updateEpic(id, changes);
|
|
279
|
+
}
|
|
280
|
+
async deleteEpic(id) {
|
|
281
|
+
return this.epicStorage.deleteEpic(id);
|
|
282
|
+
}
|
|
283
|
+
async getTicketsForEpic(projectId, epicId) {
|
|
284
|
+
return this.epicStorage.getTicketsForEpic(projectId, epicId);
|
|
285
|
+
}
|
|
286
|
+
async linkTicketToEpic(ticketId, epicId) {
|
|
287
|
+
return this.epicStorage.linkTicketToEpic(ticketId, epicId);
|
|
288
|
+
}
|
|
289
|
+
async unlinkTicketFromEpic(ticketId) {
|
|
290
|
+
return this.epicStorage.unlinkTicketFromEpic(ticketId);
|
|
291
|
+
}
|
|
292
|
+
// ===========================================================================
|
|
293
|
+
// Dependency Operations
|
|
294
|
+
// ===========================================================================
|
|
295
|
+
async createTicketDependency(ticketId, dependsOnId, type) {
|
|
296
|
+
return this.dependencyStorage.createTicketDependency(ticketId, dependsOnId, type);
|
|
297
|
+
}
|
|
298
|
+
async deleteTicketDependency(ticketId, dependsOnId, type) {
|
|
299
|
+
return this.dependencyStorage.deleteTicketDependency(ticketId, dependsOnId, type);
|
|
300
|
+
}
|
|
301
|
+
async listTicketDependencies(ticketId) {
|
|
302
|
+
return this.dependencyStorage.listTicketDependencies(ticketId);
|
|
303
|
+
}
|
|
304
|
+
async getTicketBlockers(ticketId) {
|
|
305
|
+
return this.dependencyStorage.getTicketBlockers(ticketId);
|
|
306
|
+
}
|
|
307
|
+
async getTicketsBlockedBy(ticketId) {
|
|
308
|
+
return this.dependencyStorage.getTicketsBlockedBy(ticketId);
|
|
309
|
+
}
|
|
310
|
+
async isTicketBlocked(ticketId) {
|
|
311
|
+
return this.dependencyStorage.isTicketBlocked(ticketId);
|
|
312
|
+
}
|
|
313
|
+
async createSpecDependency(specId, dependsOnId, type) {
|
|
314
|
+
return this.dependencyStorage.createSpecDependency(specId, dependsOnId, type);
|
|
315
|
+
}
|
|
316
|
+
async deleteSpecDependency(specId, dependsOnId, type) {
|
|
317
|
+
return this.dependencyStorage.deleteSpecDependency(specId, dependsOnId, type);
|
|
318
|
+
}
|
|
319
|
+
async listSpecDependencies(specId) {
|
|
320
|
+
return this.dependencyStorage.listSpecDependencies(specId);
|
|
321
|
+
}
|
|
322
|
+
async createEpicDependency(epicId, dependsOnId, type) {
|
|
323
|
+
return this.dependencyStorage.createEpicDependency(epicId, dependsOnId, type);
|
|
324
|
+
}
|
|
325
|
+
async deleteEpicDependency(epicId, dependsOnId, type) {
|
|
326
|
+
return this.dependencyStorage.deleteEpicDependency(epicId, dependsOnId, type);
|
|
327
|
+
}
|
|
328
|
+
async listEpicDependencies(epicId) {
|
|
329
|
+
return this.dependencyStorage.listEpicDependencies(epicId);
|
|
330
|
+
}
|
|
331
|
+
async isEpicBlocked(epicId) {
|
|
332
|
+
return this.dependencyStorage.isEpicBlocked(epicId);
|
|
333
|
+
}
|
|
334
|
+
// ===========================================================================
|
|
335
|
+
// Workflow Operations
|
|
336
|
+
// ===========================================================================
|
|
337
|
+
async listWorkflows(filter) {
|
|
338
|
+
return this.statusStorage.listWorkflows(filter);
|
|
339
|
+
}
|
|
340
|
+
async getWorkflow(id) {
|
|
341
|
+
return this.statusStorage.getWorkflow(id);
|
|
342
|
+
}
|
|
343
|
+
async createWorkflow(workflow) {
|
|
344
|
+
return this.statusStorage.createWorkflow(workflow);
|
|
345
|
+
}
|
|
346
|
+
async updateWorkflow(id, changes) {
|
|
347
|
+
return this.statusStorage.updateWorkflow(id, changes);
|
|
348
|
+
}
|
|
349
|
+
async deleteWorkflow(id) {
|
|
350
|
+
return this.statusStorage.deleteWorkflow(id);
|
|
351
|
+
}
|
|
352
|
+
async getProjectWorkflow(projectId) {
|
|
353
|
+
return this.statusStorage.getProjectWorkflow(projectId);
|
|
354
|
+
}
|
|
355
|
+
// ===========================================================================
|
|
356
|
+
// Workflow Status Operations
|
|
357
|
+
// ===========================================================================
|
|
358
|
+
async listStatuses(workflowId) {
|
|
359
|
+
return this.statusStorage.listStatuses(workflowId);
|
|
360
|
+
}
|
|
361
|
+
async getStatus(id) {
|
|
362
|
+
return this.statusStorage.getStatus(id);
|
|
363
|
+
}
|
|
364
|
+
async createStatus(workflowId, status) {
|
|
365
|
+
return this.statusStorage.createStatus(workflowId, status);
|
|
366
|
+
}
|
|
367
|
+
async updateStatus(id, changes) {
|
|
368
|
+
return this.statusStorage.updateStatus(id, changes);
|
|
369
|
+
}
|
|
370
|
+
async deleteStatus(id) {
|
|
371
|
+
return this.statusStorage.deleteStatus(id);
|
|
372
|
+
}
|
|
373
|
+
async reorderStatus(id, newPosition) {
|
|
374
|
+
return this.statusStorage.reorderStatus(id, newPosition);
|
|
375
|
+
}
|
|
376
|
+
async getDefaultStatus(workflowId) {
|
|
377
|
+
return this.statusStorage.getDefaultStatus(workflowId);
|
|
378
|
+
}
|
|
379
|
+
// ===========================================================================
|
|
380
|
+
// Ticket Template Operations
|
|
381
|
+
// ===========================================================================
|
|
382
|
+
// Note: Workflow templates have been removed. Use workflow commands directly
|
|
383
|
+
// (prlt workflow list, prlt workflow create, prlt workflow switch)
|
|
384
|
+
async listTicketTemplates(filter) {
|
|
385
|
+
return this.templateStorage.listTicketTemplates(filter);
|
|
386
|
+
}
|
|
387
|
+
async getTicketTemplate(id) {
|
|
388
|
+
return this.templateStorage.getTicketTemplate(id);
|
|
389
|
+
}
|
|
390
|
+
async createTicketTemplate(template) {
|
|
391
|
+
return this.templateStorage.createTicketTemplate(template);
|
|
392
|
+
}
|
|
393
|
+
async createTicketTemplateFromTicket(ticketId, name, description) {
|
|
394
|
+
return this.templateStorage.createTicketTemplateFromTicket(ticketId, name, description);
|
|
395
|
+
}
|
|
396
|
+
async updateTicketTemplate(id, changes) {
|
|
397
|
+
return this.templateStorage.updateTicketTemplate(id, changes);
|
|
398
|
+
}
|
|
399
|
+
async deleteTicketTemplate(id) {
|
|
400
|
+
return this.templateStorage.deleteTicketTemplate(id);
|
|
401
|
+
}
|
|
402
|
+
// ===========================================================================
|
|
403
|
+
// Phase Operations
|
|
404
|
+
// ===========================================================================
|
|
405
|
+
async listPhases(filter) {
|
|
406
|
+
return this.phaseStorage.listPhases(filter);
|
|
407
|
+
}
|
|
408
|
+
async getPhase(id) {
|
|
409
|
+
return this.phaseStorage.getPhase(id);
|
|
410
|
+
}
|
|
411
|
+
async createPhase(phase) {
|
|
412
|
+
return this.phaseStorage.createPhase(phase);
|
|
413
|
+
}
|
|
414
|
+
async updatePhase(id, changes) {
|
|
415
|
+
return this.phaseStorage.updatePhase(id, changes);
|
|
416
|
+
}
|
|
417
|
+
async deletePhase(id) {
|
|
418
|
+
return this.phaseStorage.deletePhase(id);
|
|
419
|
+
}
|
|
420
|
+
async reorderPhase(id, newPosition) {
|
|
421
|
+
return this.phaseStorage.reorderPhase(id, newPosition);
|
|
422
|
+
}
|
|
423
|
+
async getDefaultPhase() {
|
|
424
|
+
return this.phaseStorage.getDefaultPhase();
|
|
425
|
+
}
|
|
426
|
+
// ===========================================================================
|
|
427
|
+
// Phase Template Operations
|
|
428
|
+
// ===========================================================================
|
|
429
|
+
async listPhaseTemplates(filter) {
|
|
430
|
+
return this.phaseStorage.listPhaseTemplates(filter);
|
|
431
|
+
}
|
|
432
|
+
async getPhaseTemplate(id) {
|
|
433
|
+
return this.phaseStorage.getPhaseTemplate(id);
|
|
434
|
+
}
|
|
435
|
+
async applyPhaseTemplate(templateId) {
|
|
436
|
+
return this.phaseStorage.applyPhaseTemplate(templateId);
|
|
437
|
+
}
|
|
438
|
+
async savePhaseTemplate(name, description) {
|
|
439
|
+
return this.phaseStorage.savePhaseTemplate(name, description);
|
|
440
|
+
}
|
|
441
|
+
async updatePhaseTemplate(id, changes) {
|
|
442
|
+
return this.phaseStorage.updatePhaseTemplate(id, changes);
|
|
443
|
+
}
|
|
444
|
+
async deletePhaseTemplate(id) {
|
|
445
|
+
return this.phaseStorage.deletePhaseTemplate(id);
|
|
446
|
+
}
|
|
447
|
+
// ===========================================================================
|
|
448
|
+
// Action Operations
|
|
449
|
+
// ===========================================================================
|
|
450
|
+
async listActions(filter) {
|
|
451
|
+
return this.actionStorage.listActions(filter);
|
|
452
|
+
}
|
|
453
|
+
async getAction(id) {
|
|
454
|
+
return this.actionStorage.getAction(id);
|
|
455
|
+
}
|
|
456
|
+
async createAction(action) {
|
|
457
|
+
return this.actionStorage.createAction(action);
|
|
458
|
+
}
|
|
459
|
+
async updateAction(id, changes) {
|
|
460
|
+
return this.actionStorage.updateAction(id, changes);
|
|
461
|
+
}
|
|
462
|
+
async deleteAction(id) {
|
|
463
|
+
return this.actionStorage.deleteAction(id);
|
|
464
|
+
}
|
|
465
|
+
async getSuggestedAction(category) {
|
|
466
|
+
return this.actionStorage.getSuggestedAction(category);
|
|
467
|
+
}
|
|
468
|
+
// ===========================================================================
|
|
469
|
+
// Project Operations
|
|
470
|
+
// ===========================================================================
|
|
471
|
+
async createProject(project) {
|
|
472
|
+
return this.projectStorage.createProject(project);
|
|
473
|
+
}
|
|
474
|
+
async getProjectBoard(projectId) {
|
|
475
|
+
return this.projectStorage.getProjectBoard(projectId);
|
|
476
|
+
}
|
|
477
|
+
async listProjectSummaries() {
|
|
478
|
+
return this.projectStorage.listProjectSummaries();
|
|
479
|
+
}
|
|
480
|
+
async deleteProject(projectId) {
|
|
481
|
+
return this.projectStorage.deleteProject(projectId);
|
|
482
|
+
}
|
|
483
|
+
async getProject(id) {
|
|
484
|
+
return this.projectStorage.getProject(id);
|
|
485
|
+
}
|
|
486
|
+
async updateProject(id, changes) {
|
|
487
|
+
return this.projectStorage.updateProject(id, changes);
|
|
488
|
+
}
|
|
489
|
+
async listProjects(filter) {
|
|
490
|
+
return this.projectStorage.listProjects(filter);
|
|
491
|
+
}
|
|
492
|
+
async archiveProject(id) {
|
|
493
|
+
return this.projectStorage.archiveProject(id);
|
|
494
|
+
}
|
|
495
|
+
async unarchiveProject(id) {
|
|
496
|
+
return this.projectStorage.unarchiveProject(id);
|
|
497
|
+
}
|
|
498
|
+
// ===========================================================================
|
|
499
|
+
// Board View Operations
|
|
500
|
+
// ===========================================================================
|
|
501
|
+
async listBoardViews(filter) {
|
|
502
|
+
return this.viewStorage.listBoardViews(filter);
|
|
503
|
+
}
|
|
504
|
+
async getBoardView(id) {
|
|
505
|
+
return this.viewStorage.getBoardView(id);
|
|
506
|
+
}
|
|
507
|
+
async createBoardView(view) {
|
|
508
|
+
return this.viewStorage.createBoardView(view);
|
|
509
|
+
}
|
|
510
|
+
async updateBoardView(id, changes) {
|
|
511
|
+
return this.viewStorage.updateBoardView(id, changes);
|
|
512
|
+
}
|
|
513
|
+
async deleteBoardView(id) {
|
|
514
|
+
return this.viewStorage.deleteBoardView(id);
|
|
515
|
+
}
|
|
516
|
+
async getDefaultBoardView(projectId) {
|
|
517
|
+
return this.viewStorage.getDefaultBoardView(projectId);
|
|
518
|
+
}
|
|
519
|
+
async getBoardWithView(projectId, viewId, filters) {
|
|
520
|
+
return this.viewStorage.getBoardWithView(projectId, viewId, filters);
|
|
521
|
+
}
|
|
522
|
+
// ===========================================================================
|
|
523
|
+
// Sync Operations (no-op for pure SQLite)
|
|
524
|
+
// ===========================================================================
|
|
525
|
+
async pull() {
|
|
526
|
+
return { success: true, changes: 0 };
|
|
527
|
+
}
|
|
528
|
+
async push() {
|
|
529
|
+
return { success: true, changes: 0 };
|
|
530
|
+
}
|
|
531
|
+
async status() {
|
|
532
|
+
return { ahead: 0, behind: 0, conflicts: false };
|
|
533
|
+
}
|
|
534
|
+
// ===========================================================================
|
|
535
|
+
// Rebuild Operations (for git storage sync)
|
|
536
|
+
// ===========================================================================
|
|
537
|
+
rebuildFromBoard(board) {
|
|
538
|
+
const projectId = board.id;
|
|
539
|
+
const T = PMO_TABLES;
|
|
540
|
+
// Clear existing tickets for current project
|
|
541
|
+
this.db.prepare(`DELETE FROM ${T.tickets} WHERE project_id = ?`).run(projectId);
|
|
542
|
+
const now = Date.now();
|
|
543
|
+
const nowIso = new Date(now).toISOString();
|
|
544
|
+
// Get or create project and its workflow
|
|
545
|
+
const existingProject = this.db.prepare(`
|
|
546
|
+
SELECT name, workflow_id FROM ${T.projects} WHERE id = ?
|
|
547
|
+
`).get(projectId);
|
|
548
|
+
const projectName = (board.name === 'Board' && existingProject?.name) ? existingProject.name : board.name;
|
|
549
|
+
let workflowId = existingProject?.workflow_id;
|
|
550
|
+
// If no workflow, create a project-specific one
|
|
551
|
+
if (!workflowId) {
|
|
552
|
+
workflowId = `workflow-${projectId}`;
|
|
553
|
+
this.db.prepare(`
|
|
554
|
+
INSERT OR IGNORE INTO ${T.workflows} (id, name, description, is_builtin, created_at, updated_at)
|
|
555
|
+
VALUES (?, ?, ?, 0, ?, ?)
|
|
556
|
+
`).run(workflowId, `${projectName} Workflow`, `Workflow for ${projectName}`, nowIso, nowIso);
|
|
557
|
+
}
|
|
558
|
+
// Update or insert project with workflow
|
|
559
|
+
this.db.prepare(`
|
|
560
|
+
INSERT OR REPLACE INTO ${T.projects} (id, name, workflow_id, updated_at)
|
|
561
|
+
VALUES (?, ?, ?, ?)
|
|
562
|
+
`).run(projectId, projectName, workflowId, now);
|
|
563
|
+
// Create a map of column name to status id
|
|
564
|
+
const statusMap = new Map();
|
|
565
|
+
// Clear existing statuses for this workflow (only if not builtin)
|
|
566
|
+
const workflow = this.db.prepare(`SELECT is_builtin FROM ${T.workflows} WHERE id = ?`).get(workflowId);
|
|
567
|
+
if (workflow && !workflow.is_builtin) {
|
|
568
|
+
this.db.prepare(`DELETE FROM ${T.workflow_statuses} WHERE workflow_id = ?`).run(workflowId);
|
|
569
|
+
}
|
|
570
|
+
// Create statuses from board columns (if workflow is not builtin)
|
|
571
|
+
if (!workflow?.is_builtin) {
|
|
572
|
+
const insertStatus = this.db.prepare(`
|
|
573
|
+
INSERT OR REPLACE INTO ${T.workflow_statuses} (id, workflow_id, name, category, position, is_default, created_at)
|
|
574
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
575
|
+
`);
|
|
576
|
+
for (const column of board.columns) {
|
|
577
|
+
const statusId = `${workflowId}-${column.id}`;
|
|
578
|
+
// Infer category from column name or position
|
|
579
|
+
const category = this.inferCategoryFromColumnName(column.name, column.position, board.columns.length);
|
|
580
|
+
const isDefault = column.position === 0 ? 1 : 0;
|
|
581
|
+
insertStatus.run(statusId, workflowId, column.name, category, column.position, isDefault, nowIso);
|
|
582
|
+
statusMap.set(column.name, statusId);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
else {
|
|
586
|
+
// For builtin workflows, map column names to existing statuses
|
|
587
|
+
const statuses = this.db.prepare(`
|
|
588
|
+
SELECT id, name FROM ${T.workflow_statuses} WHERE workflow_id = ? ORDER BY position
|
|
589
|
+
`).all(workflowId);
|
|
590
|
+
for (const status of statuses) {
|
|
591
|
+
statusMap.set(status.name, status.id);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
// Insert tickets
|
|
595
|
+
const insertTicket = this.db.prepare(`
|
|
596
|
+
INSERT INTO ${T.tickets} (
|
|
597
|
+
id, project_id, title, description, priority, category,
|
|
598
|
+
status_id, owner, assignee, spec_id,
|
|
599
|
+
created_at, updated_at, last_synced_from_spec, last_synced_from_board
|
|
600
|
+
)
|
|
601
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
602
|
+
`);
|
|
603
|
+
const insertSubtask = this.db.prepare(`
|
|
604
|
+
INSERT INTO ${T.subtasks} (id, ticket_id, title, done, position)
|
|
605
|
+
VALUES (?, ?, ?, ?, ?)
|
|
606
|
+
`);
|
|
607
|
+
const insertMeta = this.db.prepare(`
|
|
608
|
+
INSERT INTO ${T.ticket_metadata} (ticket_id, key, value)
|
|
609
|
+
VALUES (?, ?, ?)
|
|
610
|
+
`);
|
|
611
|
+
for (const column of board.columns) {
|
|
612
|
+
const statusId = statusMap.get(column.name);
|
|
613
|
+
for (const ticket of column.tickets) {
|
|
614
|
+
// Insert ticket data with status_id
|
|
615
|
+
insertTicket.run(ticket.id, projectId, ticket.title, ticket.description || null, ticket.priority || null, ticket.category || null, statusId || null, ticket.owner || null, ticket.assignee || null, ticket.specId || null, ticket.createdAt.toISOString(), ticket.updatedAt.toISOString(), ticket.lastSyncedFromSpec || null, ticket.lastSyncedFromBoard || null);
|
|
616
|
+
// Subtasks
|
|
617
|
+
ticket.subtasks.forEach((st, idx) => {
|
|
618
|
+
insertSubtask.run(st.id, ticket.id, st.title, st.done ? 1 : 0, idx);
|
|
619
|
+
});
|
|
620
|
+
// Metadata
|
|
621
|
+
for (const [key, value] of Object.entries(ticket.metadata)) {
|
|
622
|
+
insertMeta.run(ticket.id, key, value);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* Infer a status category from column name or position.
|
|
629
|
+
*/
|
|
630
|
+
inferCategoryFromColumnName(name, position, totalColumns) {
|
|
631
|
+
const lowerName = name.toLowerCase();
|
|
632
|
+
// Match common column names to categories
|
|
633
|
+
if (lowerName.includes('backlog') || lowerName.includes('icebox'))
|
|
634
|
+
return 'backlog';
|
|
635
|
+
if (lowerName.includes('ready') || lowerName.includes('todo') || lowerName.includes('to do'))
|
|
636
|
+
return 'unstarted';
|
|
637
|
+
if (lowerName.includes('progress') || lowerName.includes('doing') || lowerName.includes('review'))
|
|
638
|
+
return 'started';
|
|
639
|
+
if (lowerName.includes('done') || lowerName.includes('complete') || lowerName.includes('finished'))
|
|
640
|
+
return 'completed';
|
|
641
|
+
if (lowerName.includes('cancel') || lowerName.includes('won\'t'))
|
|
642
|
+
return 'canceled';
|
|
643
|
+
// Fallback: infer from position
|
|
644
|
+
if (position === 0)
|
|
645
|
+
return 'backlog';
|
|
646
|
+
if (position === totalColumns - 1)
|
|
647
|
+
return 'completed';
|
|
648
|
+
if (position <= totalColumns / 2)
|
|
649
|
+
return 'unstarted';
|
|
650
|
+
return 'started';
|
|
651
|
+
}
|
|
652
|
+
// ===========================================================================
|
|
653
|
+
// Lifecycle
|
|
654
|
+
// ===========================================================================
|
|
655
|
+
async close() {
|
|
656
|
+
this.db.close();
|
|
657
|
+
}
|
|
658
|
+
// ===========================================================================
|
|
659
|
+
// Cache Operations (for git storage compatibility)
|
|
660
|
+
// ===========================================================================
|
|
661
|
+
getCacheMetadata() {
|
|
662
|
+
const mtime = this.db.prepare(`SELECT value FROM ${T.cache_metadata} WHERE key = 'boardMtime'`).get();
|
|
663
|
+
const builtAt = this.db.prepare(`SELECT value FROM ${T.cache_metadata} WHERE key = 'cacheBuiltAt'`).get();
|
|
664
|
+
const hash = this.db.prepare(`SELECT value FROM ${T.cache_metadata} WHERE key = 'contentHash'`).get();
|
|
665
|
+
if (!mtime || !builtAt)
|
|
666
|
+
return null;
|
|
667
|
+
return {
|
|
668
|
+
boardMtime: parseInt(mtime.value, 10),
|
|
669
|
+
cacheBuiltAt: parseInt(builtAt.value, 10),
|
|
670
|
+
contentHash: hash?.value,
|
|
671
|
+
};
|
|
672
|
+
}
|
|
673
|
+
setCacheMetadata(metadata) {
|
|
674
|
+
const upsert = this.db.prepare(`
|
|
675
|
+
INSERT OR REPLACE INTO ${T.cache_metadata} (key, value)
|
|
676
|
+
VALUES (?, ?)
|
|
677
|
+
`);
|
|
678
|
+
upsert.run('boardMtime', metadata.boardMtime.toString());
|
|
679
|
+
upsert.run('cacheBuiltAt', metadata.cacheBuiltAt.toString());
|
|
680
|
+
if (metadata.contentHash) {
|
|
681
|
+
upsert.run('contentHash', metadata.contentHash);
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
clearCache() {
|
|
685
|
+
this.db.prepare(`DELETE FROM ${T.cache_metadata}`).run();
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
// Re-export for backward compatibility
|
|
689
|
+
export { SQLiteStorage as default };
|