@proletariat/cli 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +561 -251
- package/bin/dev.cmd +3 -0
- package/bin/dev.js +5 -0
- package/bin/run.cmd +3 -0
- package/bin/run.js +23 -0
- package/dist/commands/action/create.d.ts +21 -0
- package/dist/commands/action/create.js +126 -0
- package/dist/commands/action/delete.d.ts +17 -0
- package/dist/commands/action/delete.js +78 -0
- package/dist/commands/action/index.d.ts +15 -0
- package/dist/commands/action/index.js +107 -0
- package/dist/commands/action/list.d.ts +14 -0
- package/dist/commands/action/list.js +89 -0
- package/dist/commands/action/run.d.ts +19 -0
- package/dist/commands/action/run.js +179 -0
- package/dist/commands/action/show.d.ts +15 -0
- package/dist/commands/action/show.js +47 -0
- package/dist/commands/action/update.d.ts +22 -0
- package/dist/commands/action/update.js +168 -0
- package/dist/commands/agent/index.d.ts +13 -0
- package/dist/commands/agent/index.js +131 -0
- package/dist/commands/agent/list.d.ts +7 -0
- package/dist/commands/agent/list.js +126 -0
- package/dist/commands/agent/login.d.ts +16 -0
- package/dist/commands/agent/login.js +146 -0
- package/dist/commands/agent/rebuild.d.ts +18 -0
- package/dist/commands/agent/rebuild.js +133 -0
- package/dist/commands/agent/restart.d.ts +17 -0
- package/dist/commands/agent/restart.js +116 -0
- package/dist/commands/agent/shell.d.ts +23 -0
- package/dist/commands/agent/shell.js +378 -0
- package/dist/commands/agent/staff/add.d.ts +15 -0
- package/dist/commands/agent/staff/add.js +281 -0
- package/dist/commands/agent/staff/index.d.ts +14 -0
- package/dist/commands/agent/staff/index.js +90 -0
- package/dist/commands/agent/staff/list.d.ts +7 -0
- package/dist/commands/agent/staff/list.js +90 -0
- package/dist/commands/agent/staff/remove.d.ts +16 -0
- package/dist/commands/agent/staff/remove.js +137 -0
- package/dist/commands/agent/status.d.ts +17 -0
- package/dist/commands/agent/status.js +139 -0
- package/dist/commands/agent/temp/cleanup.d.ts +23 -0
- package/dist/commands/agent/temp/cleanup.js +388 -0
- package/dist/commands/agent/temp/index.d.ts +14 -0
- package/dist/commands/agent/temp/index.js +82 -0
- package/dist/commands/agent/temp/list.d.ts +7 -0
- package/dist/commands/agent/temp/list.js +108 -0
- package/dist/commands/agent/themes/add-names.d.ts +10 -0
- package/dist/commands/agent/themes/add-names.js +67 -0
- package/dist/commands/agent/themes/create.d.ts +13 -0
- package/dist/commands/agent/themes/create.js +66 -0
- package/dist/commands/agent/themes/index.d.ts +9 -0
- package/dist/commands/agent/themes/index.js +194 -0
- package/dist/commands/agent/themes/list.d.ts +6 -0
- package/dist/commands/agent/themes/list.js +41 -0
- package/dist/commands/agent/themes/set.d.ts +12 -0
- package/dist/commands/agent/themes/set.js +77 -0
- package/dist/commands/agent/visit.d.ts +16 -0
- package/dist/commands/agent/visit.js +88 -0
- package/dist/commands/autocomplete/setup.d.ts +14 -0
- package/dist/commands/autocomplete/setup.js +154 -0
- package/dist/commands/board/index.d.ts +17 -0
- package/dist/commands/board/index.js +255 -0
- package/dist/commands/board/watch.d.ts +13 -0
- package/dist/commands/board/watch.js +52 -0
- package/dist/commands/branch/create.d.ts +50 -0
- package/dist/commands/branch/create.js +624 -0
- package/dist/commands/branch/index.d.ts +13 -0
- package/dist/commands/branch/index.js +50 -0
- package/dist/commands/branch/list.d.ts +17 -0
- package/dist/commands/branch/list.js +120 -0
- package/dist/commands/branch/validate.d.ts +15 -0
- package/dist/commands/branch/validate.js +73 -0
- package/dist/commands/commit.d.ts +71 -0
- package/dist/commands/commit.js +499 -0
- package/dist/commands/docker/clean.d.ts +13 -0
- package/dist/commands/docker/clean.js +224 -0
- package/dist/commands/docker/index.d.ts +19 -0
- package/dist/commands/docker/index.js +274 -0
- package/dist/commands/docker/list.d.ts +16 -0
- package/dist/commands/docker/list.js +200 -0
- package/dist/commands/docker/logs.d.ts +14 -0
- package/dist/commands/docker/logs.js +118 -0
- package/dist/commands/docker/prune.d.ts +14 -0
- package/dist/commands/docker/prune.js +211 -0
- package/dist/commands/docker/restart.d.ts +14 -0
- package/dist/commands/docker/restart.js +129 -0
- package/dist/commands/docker/shell.d.ts +14 -0
- package/dist/commands/docker/shell.js +103 -0
- package/dist/commands/docker/start.d.ts +12 -0
- package/dist/commands/docker/start.js +92 -0
- package/dist/commands/docker/status.d.ts +7 -0
- package/dist/commands/docker/status.js +40 -0
- package/dist/commands/docker/stop.d.ts +14 -0
- package/dist/commands/docker/stop.js +134 -0
- package/dist/commands/docker/sync.d.ts +15 -0
- package/dist/commands/docker/sync.js +112 -0
- package/dist/commands/epic/activate.d.ts +13 -0
- package/dist/commands/epic/activate.js +118 -0
- package/dist/commands/epic/archive.d.ts +14 -0
- package/dist/commands/epic/archive.js +132 -0
- package/dist/commands/epic/create.d.ts +15 -0
- package/dist/commands/epic/create.js +137 -0
- package/dist/commands/epic/index.d.ts +13 -0
- package/dist/commands/epic/index.js +88 -0
- package/dist/commands/epic/link/block.d.ts +14 -0
- package/dist/commands/epic/link/block.js +79 -0
- package/dist/commands/epic/link/duplicates.d.ts +14 -0
- package/dist/commands/epic/link/duplicates.js +66 -0
- package/dist/commands/epic/link/index.d.ts +19 -0
- package/dist/commands/epic/link/index.js +242 -0
- package/dist/commands/epic/link/relates.d.ts +14 -0
- package/dist/commands/epic/link/relates.js +66 -0
- package/dist/commands/epic/link/remove.d.ts +16 -0
- package/dist/commands/epic/link/remove.js +89 -0
- package/dist/commands/epic/list.d.ts +11 -0
- package/dist/commands/epic/list.js +87 -0
- package/dist/commands/epic/move.d.ts +15 -0
- package/dist/commands/epic/move.js +184 -0
- package/dist/commands/epic/progress.d.ts +16 -0
- package/dist/commands/epic/progress.js +166 -0
- package/dist/commands/epic/project.d.ts +15 -0
- package/dist/commands/epic/project.js +219 -0
- package/dist/commands/epic/reorder.d.ts +21 -0
- package/dist/commands/epic/reorder.js +160 -0
- package/dist/commands/epic/spec.d.ts +15 -0
- package/dist/commands/epic/spec.js +191 -0
- package/dist/commands/epic/ticket.d.ts +18 -0
- package/dist/commands/epic/ticket.js +291 -0
- package/dist/commands/epic/view.d.ts +13 -0
- package/dist/commands/epic/view.js +117 -0
- package/dist/commands/execution/index.d.ts +13 -0
- package/dist/commands/execution/index.js +70 -0
- package/dist/commands/execution/list.d.ts +15 -0
- package/dist/commands/execution/list.js +144 -0
- package/dist/commands/execution/logs.d.ts +18 -0
- package/dist/commands/execution/logs.js +161 -0
- package/dist/commands/execution/stop.d.ts +22 -0
- package/dist/commands/execution/stop.js +248 -0
- package/dist/commands/gh/index.d.ts +9 -0
- package/dist/commands/gh/index.js +53 -0
- package/dist/commands/gh/login.d.ts +6 -0
- package/dist/commands/gh/login.js +57 -0
- package/dist/commands/gh/status.d.ts +6 -0
- package/dist/commands/gh/status.js +48 -0
- package/dist/commands/gh/token.d.ts +6 -0
- package/dist/commands/gh/token.js +59 -0
- package/dist/commands/init.d.ts +26 -0
- package/dist/commands/init.js +200 -0
- package/dist/commands/phase/create.d.ts +22 -0
- package/dist/commands/phase/create.js +123 -0
- package/dist/commands/phase/delete.d.ts +17 -0
- package/dist/commands/phase/delete.js +73 -0
- package/dist/commands/phase/list.d.ts +12 -0
- package/dist/commands/phase/list.js +76 -0
- package/dist/commands/phase/move.d.ts +17 -0
- package/dist/commands/phase/move.js +115 -0
- package/dist/commands/phase/template/apply.d.ts +17 -0
- package/dist/commands/phase/template/apply.js +106 -0
- package/dist/commands/phase/template/create.d.ts +16 -0
- package/dist/commands/phase/template/create.js +58 -0
- package/dist/commands/phase/template/delete.d.ts +17 -0
- package/dist/commands/phase/template/delete.js +98 -0
- package/dist/commands/phase/template/index.d.ts +15 -0
- package/dist/commands/phase/template/index.js +128 -0
- package/dist/commands/phase/template/list.d.ts +16 -0
- package/dist/commands/phase/template/list.js +95 -0
- package/dist/commands/phase/template/update.d.ts +17 -0
- package/dist/commands/phase/template/update.js +89 -0
- package/dist/commands/phase/update.d.ts +23 -0
- package/dist/commands/phase/update.js +174 -0
- package/dist/commands/pmo/init.d.ts +25 -0
- package/dist/commands/pmo/init.js +341 -0
- package/dist/commands/pr/create.d.ts +17 -0
- package/dist/commands/pr/create.js +242 -0
- package/dist/commands/pr/index.d.ts +9 -0
- package/dist/commands/pr/index.js +68 -0
- package/dist/commands/pr/link.d.ts +14 -0
- package/dist/commands/pr/link.js +212 -0
- package/dist/commands/pr/status.d.ts +12 -0
- package/dist/commands/pr/status.js +161 -0
- package/dist/commands/project/archive.d.ts +17 -0
- package/dist/commands/project/archive.js +83 -0
- package/dist/commands/project/create.d.ts +22 -0
- package/dist/commands/project/create.js +143 -0
- package/dist/commands/project/delete.d.ts +17 -0
- package/dist/commands/project/delete.js +128 -0
- package/dist/commands/project/index.d.ts +13 -0
- package/dist/commands/project/index.js +64 -0
- package/dist/commands/project/list.d.ts +14 -0
- package/dist/commands/project/list.js +96 -0
- package/dist/commands/project/spec.d.ts +18 -0
- package/dist/commands/project/spec.js +216 -0
- package/dist/commands/project/unarchive.d.ts +15 -0
- package/dist/commands/project/unarchive.js +35 -0
- package/dist/commands/project/view.d.ts +16 -0
- package/dist/commands/project/view.js +94 -0
- package/dist/commands/repo/add.d.ts +21 -0
- package/dist/commands/repo/add.js +118 -0
- package/dist/commands/repo/index.d.ts +13 -0
- package/dist/commands/repo/index.js +114 -0
- package/dist/commands/repo/list.d.ts +13 -0
- package/dist/commands/repo/list.js +96 -0
- package/dist/commands/repo/remove.d.ts +23 -0
- package/dist/commands/repo/remove.js +217 -0
- package/dist/commands/repo/view.d.ts +15 -0
- package/dist/commands/repo/view.js +99 -0
- package/dist/commands/session/attach.d.ts +40 -0
- package/dist/commands/session/attach.js +307 -0
- package/dist/commands/session/index.d.ts +13 -0
- package/dist/commands/session/index.js +64 -0
- package/dist/commands/session/list.d.ts +21 -0
- package/dist/commands/session/list.js +181 -0
- package/dist/commands/spec/create.d.ts +19 -0
- package/dist/commands/spec/create.js +130 -0
- package/dist/commands/spec/index.d.ts +13 -0
- package/dist/commands/spec/index.js +68 -0
- package/dist/commands/spec/link/depends.d.ts +14 -0
- package/dist/commands/spec/link/depends.js +64 -0
- package/dist/commands/spec/link/duplicates.d.ts +14 -0
- package/dist/commands/spec/link/duplicates.js +63 -0
- package/dist/commands/spec/link/index.d.ts +19 -0
- package/dist/commands/spec/link/index.js +200 -0
- package/dist/commands/spec/link/relates.d.ts +14 -0
- package/dist/commands/spec/link/relates.js +63 -0
- package/dist/commands/spec/link/remove.d.ts +16 -0
- package/dist/commands/spec/link/remove.js +94 -0
- package/dist/commands/spec/list.d.ts +12 -0
- package/dist/commands/spec/list.js +75 -0
- package/dist/commands/spec/plan.d.ts +15 -0
- package/dist/commands/spec/plan.js +108 -0
- package/dist/commands/spec/ticket.d.ts +18 -0
- package/dist/commands/spec/ticket.js +160 -0
- package/dist/commands/spec/view.d.ts +15 -0
- package/dist/commands/spec/view.js +163 -0
- package/dist/commands/status/create.d.ts +21 -0
- package/dist/commands/status/create.js +140 -0
- package/dist/commands/status/delete.d.ts +13 -0
- package/dist/commands/status/delete.js +77 -0
- package/dist/commands/status/index.d.ts +14 -0
- package/dist/commands/status/index.js +91 -0
- package/dist/commands/status/list.d.ts +12 -0
- package/dist/commands/status/list.js +93 -0
- package/dist/commands/status/move.d.ts +14 -0
- package/dist/commands/status/move.js +120 -0
- package/dist/commands/status/update.d.ts +20 -0
- package/dist/commands/status/update.js +180 -0
- package/dist/commands/template/delete.d.ts +15 -0
- package/dist/commands/template/delete.js +142 -0
- package/dist/commands/template/index.d.ts +10 -0
- package/dist/commands/template/index.js +64 -0
- package/dist/commands/template/list.d.ts +18 -0
- package/dist/commands/template/list.js +157 -0
- package/dist/commands/template/phase/apply.d.ts +14 -0
- package/dist/commands/template/phase/apply.js +41 -0
- package/dist/commands/template/phase/create.d.ts +12 -0
- package/dist/commands/template/phase/create.js +29 -0
- package/dist/commands/template/phase/delete.d.ts +13 -0
- package/dist/commands/template/phase/delete.js +34 -0
- package/dist/commands/template/phase/index.d.ts +10 -0
- package/dist/commands/template/phase/index.js +62 -0
- package/dist/commands/template/phase/list.d.ts +11 -0
- package/dist/commands/template/phase/list.js +34 -0
- package/dist/commands/template/phase/update.d.ts +13 -0
- package/dist/commands/template/phase/update.js +35 -0
- package/dist/commands/template/ticket/apply.d.ts +17 -0
- package/dist/commands/template/ticket/apply.js +58 -0
- package/dist/commands/template/ticket/delete.d.ts +13 -0
- package/dist/commands/template/ticket/delete.js +34 -0
- package/dist/commands/template/ticket/index.d.ts +10 -0
- package/dist/commands/template/ticket/index.js +62 -0
- package/dist/commands/template/ticket/list.d.ts +11 -0
- package/dist/commands/template/ticket/list.js +34 -0
- package/dist/commands/template/ticket/save.d.ts +13 -0
- package/dist/commands/template/ticket/save.js +35 -0
- package/dist/commands/ticket/bulk.d.ts +13 -0
- package/dist/commands/ticket/bulk.js +145 -0
- package/dist/commands/ticket/complete.d.ts +16 -0
- package/dist/commands/ticket/complete.js +170 -0
- package/dist/commands/ticket/create.d.ts +22 -0
- package/dist/commands/ticket/create.js +390 -0
- package/dist/commands/ticket/delete.d.ts +16 -0
- package/dist/commands/ticket/delete.js +178 -0
- package/dist/commands/ticket/edit.d.ts +27 -0
- package/dist/commands/ticket/edit.js +322 -0
- package/dist/commands/ticket/epic.d.ts +20 -0
- package/dist/commands/ticket/epic.js +333 -0
- package/dist/commands/ticket/index.d.ts +13 -0
- package/dist/commands/ticket/index.js +103 -0
- package/dist/commands/ticket/link/block.d.ts +14 -0
- package/dist/commands/ticket/link/block.js +94 -0
- package/dist/commands/ticket/link/duplicates.d.ts +14 -0
- package/dist/commands/ticket/link/duplicates.js +93 -0
- package/dist/commands/ticket/link/index.d.ts +19 -0
- package/dist/commands/ticket/link/index.js +239 -0
- package/dist/commands/ticket/link/relates.d.ts +14 -0
- package/dist/commands/ticket/link/relates.js +93 -0
- package/dist/commands/ticket/link/remove.d.ts +16 -0
- package/dist/commands/ticket/link/remove.js +128 -0
- package/dist/commands/ticket/list.d.ts +24 -0
- package/dist/commands/ticket/list.js +431 -0
- package/dist/commands/ticket/move.d.ts +18 -0
- package/dist/commands/ticket/move.js +212 -0
- package/dist/commands/ticket/project.d.ts +18 -0
- package/dist/commands/ticket/project.js +254 -0
- package/dist/commands/ticket/reassign.d.ts +19 -0
- package/dist/commands/ticket/reassign.js +279 -0
- package/dist/commands/ticket/spec.d.ts +18 -0
- package/dist/commands/ticket/spec.js +259 -0
- package/dist/commands/ticket/status.d.ts +13 -0
- package/dist/commands/ticket/status.js +87 -0
- package/dist/commands/ticket/template/apply.d.ts +25 -0
- package/dist/commands/ticket/template/apply.js +249 -0
- package/dist/commands/ticket/template/create.d.ts +19 -0
- package/dist/commands/ticket/template/create.js +210 -0
- package/dist/commands/ticket/template/delete.d.ts +17 -0
- package/dist/commands/ticket/template/delete.js +92 -0
- package/dist/commands/ticket/template/index.d.ts +15 -0
- package/dist/commands/ticket/template/index.js +118 -0
- package/dist/commands/ticket/template/list.d.ts +16 -0
- package/dist/commands/ticket/template/list.js +110 -0
- package/dist/commands/ticket/template/save.d.ts +14 -0
- package/dist/commands/ticket/template/save.js +110 -0
- package/dist/commands/ticket/update.d.ts +18 -0
- package/dist/commands/ticket/update.js +325 -0
- package/dist/commands/ticket/view.d.ts +13 -0
- package/dist/commands/ticket/view.js +80 -0
- package/dist/commands/whoami.d.ts +9 -0
- package/dist/commands/whoami.js +103 -0
- package/dist/commands/work/complete.d.ts +13 -0
- package/dist/commands/work/complete.js +121 -0
- package/dist/commands/work/index.d.ts +13 -0
- package/dist/commands/work/index.js +70 -0
- package/dist/commands/work/ready.d.ts +24 -0
- package/dist/commands/work/ready.js +290 -0
- package/dist/commands/work/revise.d.ts +19 -0
- package/dist/commands/work/revise.js +377 -0
- package/dist/commands/work/spawn-all.d.ts +17 -0
- package/dist/commands/work/spawn-all.js +58 -0
- package/dist/commands/work/spawn.d.ts +29 -0
- package/dist/commands/work/spawn.js +728 -0
- package/dist/commands/work/start.d.ts +39 -0
- package/dist/commands/work/start.js +1393 -0
- package/dist/commands/work/watch.d.ts +31 -0
- package/dist/commands/work/watch.js +359 -0
- package/dist/commands/workflow/create.d.ts +18 -0
- package/dist/commands/workflow/create.js +119 -0
- package/dist/commands/workflow/delete.d.ts +17 -0
- package/dist/commands/workflow/delete.js +119 -0
- package/dist/commands/workflow/index.d.ts +15 -0
- package/dist/commands/workflow/index.js +75 -0
- package/dist/commands/workflow/list.d.ts +15 -0
- package/dist/commands/workflow/list.js +75 -0
- package/dist/commands/workflow/switch.d.ts +13 -0
- package/dist/commands/workflow/switch.js +117 -0
- package/dist/commands/workflow/view.d.ts +16 -0
- package/dist/commands/workflow/view.js +114 -0
- package/dist/commands/workspace/add.d.ts +12 -0
- package/dist/commands/workspace/add.js +74 -0
- package/dist/commands/workspace/list.d.ts +9 -0
- package/dist/commands/workspace/list.js +153 -0
- package/dist/commands/workspace/remove.d.ts +13 -0
- package/dist/commands/workspace/remove.js +98 -0
- package/dist/commands/workspace/use.d.ts +12 -0
- package/dist/commands/workspace/use.js +111 -0
- package/dist/hooks/init.d.ts +11 -0
- package/dist/hooks/init.js +57 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/lib/agents/commands.d.ts +189 -0
- package/dist/lib/agents/commands.js +893 -0
- package/dist/lib/agents/index.d.ts +54 -0
- package/dist/lib/agents/index.js +382 -0
- package/dist/lib/branch/index.d.ts +120 -0
- package/dist/lib/branch/index.js +334 -0
- package/dist/lib/colors.d.ts +94 -0
- package/dist/lib/colors.js +68 -0
- package/dist/lib/commands/docker-command.d.ts +21 -0
- package/dist/lib/commands/docker-command.js +27 -0
- package/dist/lib/database/index.d.ts +176 -0
- package/dist/lib/database/index.js +581 -0
- package/dist/lib/docker/resolve.d.ts +38 -0
- package/dist/lib/docker/resolve.js +175 -0
- package/dist/lib/execution/config.d.ts +150 -0
- package/dist/lib/execution/config.js +541 -0
- package/dist/lib/execution/devcontainer.d.ts +85 -0
- package/dist/lib/execution/devcontainer.js +594 -0
- package/dist/lib/execution/index.d.ts +10 -0
- package/dist/lib/execution/index.js +10 -0
- package/dist/lib/execution/runners.d.ts +53 -0
- package/dist/lib/execution/runners.js +1182 -0
- package/dist/lib/execution/spawner.d.ts +85 -0
- package/dist/lib/execution/spawner.js +548 -0
- package/dist/lib/execution/storage.d.ts +159 -0
- package/dist/lib/execution/storage.js +425 -0
- package/dist/lib/execution/types.d.ts +145 -0
- package/dist/lib/execution/types.js +157 -0
- package/dist/lib/init/index.d.ts +75 -0
- package/dist/lib/init/index.js +355 -0
- package/dist/lib/machine-config.d.ts +170 -0
- package/dist/lib/machine-config.js +386 -0
- package/dist/lib/pmo/base-command.d.ts +195 -0
- package/dist/lib/pmo/base-command.js +319 -0
- package/dist/lib/pmo/create-spec-folders.d.ts +43 -0
- package/dist/lib/pmo/create-spec-folders.js +64 -0
- package/dist/lib/pmo/epic-files.d.ts +56 -0
- package/dist/lib/pmo/epic-files.js +195 -0
- package/dist/lib/pmo/find-pmo.d.ts +14 -0
- package/dist/lib/pmo/find-pmo.js +172 -0
- package/dist/lib/pmo/index.d.ts +109 -0
- package/dist/lib/pmo/index.js +501 -0
- package/dist/lib/pmo/markdown.d.ts +31 -0
- package/dist/lib/pmo/markdown.js +245 -0
- package/dist/lib/pmo/pmo-context.d.ts +27 -0
- package/dist/lib/pmo/pmo-context.js +44 -0
- package/dist/lib/pmo/schema.d.ts +82 -0
- package/dist/lib/pmo/schema.js +531 -0
- package/dist/lib/pmo/spec-parser.d.ts +25 -0
- package/dist/lib/pmo/spec-parser.js +205 -0
- package/dist/lib/pmo/spec-types.d.ts +43 -0
- package/dist/lib/pmo/spec-types.js +7 -0
- package/dist/lib/pmo/storage/actions.d.ts +34 -0
- package/dist/lib/pmo/storage/actions.js +177 -0
- package/dist/lib/pmo/storage/base.d.ts +47 -0
- package/dist/lib/pmo/storage/base.js +858 -0
- package/dist/lib/pmo/storage/dependencies.d.ts +61 -0
- package/dist/lib/pmo/storage/dependencies.js +267 -0
- package/dist/lib/pmo/storage/epics.d.ts +46 -0
- package/dist/lib/pmo/storage/epics.js +243 -0
- package/dist/lib/pmo/storage/helpers.d.ts +33 -0
- package/dist/lib/pmo/storage/helpers.js +148 -0
- package/dist/lib/pmo/storage/index.d.ts +186 -0
- package/dist/lib/pmo/storage/index.js +689 -0
- package/dist/lib/pmo/storage/phases.d.ts +65 -0
- package/dist/lib/pmo/storage/phases.js +392 -0
- package/dist/lib/pmo/storage/projects.d.ts +79 -0
- package/dist/lib/pmo/storage/projects.js +303 -0
- package/dist/lib/pmo/storage/specs.d.ts +77 -0
- package/dist/lib/pmo/storage/specs.js +389 -0
- package/dist/lib/pmo/storage/statuses.d.ts +63 -0
- package/dist/lib/pmo/storage/statuses.js +404 -0
- package/dist/lib/pmo/storage/subtasks.d.ts +37 -0
- package/dist/lib/pmo/storage/subtasks.js +184 -0
- package/dist/lib/pmo/storage/templates.d.ts +40 -0
- package/dist/lib/pmo/storage/templates.js +210 -0
- package/dist/lib/pmo/storage/tickets.d.ts +57 -0
- package/dist/lib/pmo/storage/tickets.js +453 -0
- package/dist/lib/pmo/storage/types.d.ts +200 -0
- package/dist/lib/pmo/storage/types.js +5 -0
- package/dist/lib/pmo/storage/views.d.ts +44 -0
- package/dist/lib/pmo/storage/views.js +355 -0
- package/dist/lib/pmo/storage-sqlite.d.ts +7 -0
- package/dist/lib/pmo/storage-sqlite.js +7 -0
- package/dist/lib/pmo/sync-manager.d.ts +92 -0
- package/dist/lib/pmo/sync-manager.js +229 -0
- package/dist/lib/pmo/types.d.ts +710 -0
- package/dist/lib/pmo/types.js +108 -0
- package/dist/lib/pmo/utils.d.ts +122 -0
- package/dist/lib/pmo/utils.js +174 -0
- package/dist/lib/pmo/watcher.d.ts +43 -0
- package/dist/lib/pmo/watcher.js +208 -0
- package/dist/lib/pr/index.d.ts +150 -0
- package/dist/lib/pr/index.js +483 -0
- package/dist/lib/prompt-json.d.ts +231 -0
- package/dist/lib/prompt-json.js +213 -0
- package/dist/lib/repos/index.d.ts +81 -0
- package/dist/lib/repos/index.js +679 -0
- package/dist/lib/styles.d.ts +98 -0
- package/dist/lib/styles.js +195 -0
- package/dist/lib/themes.d.ts +128 -0
- package/dist/lib/themes.js +301 -0
- package/dist/lib/ui/BoardUI.d.ts +21 -0
- package/dist/lib/ui/BoardUI.js +85 -0
- package/dist/lib/ui/ClaimTicketUI.d.ts +17 -0
- package/dist/lib/ui/ClaimTicketUI.js +64 -0
- package/dist/lib/ui/CreateTicketUI.d.ts +13 -0
- package/dist/lib/ui/CreateTicketUI.js +101 -0
- package/dist/lib/workspace.d.ts +66 -0
- package/dist/lib/workspace.js +204 -0
- package/oclif.manifest.json +10593 -0
- package/package.json +103 -56
- package/LICENSE +0 -21
- package/dist/bin/prlt.d.ts +0 -11
- package/dist/bin/prlt.d.ts.map +0 -1
- package/dist/bin/prlt.js +0 -144
- package/dist/bin/prlt.js.map +0 -1
- package/dist/lib/config/index.d.ts +0 -14
- package/dist/lib/config/index.d.ts.map +0 -1
- package/dist/lib/config/index.js +0 -142
- package/dist/lib/config/index.js.map +0 -1
- package/dist/lib/config/upgrade.d.ts +0 -2
- package/dist/lib/config/upgrade.d.ts.map +0 -1
- package/dist/lib/config/upgrade.js +0 -248
- package/dist/lib/config/upgrade.js.map +0 -1
- package/dist/lib/themes/index.d.ts +0 -8
- package/dist/lib/themes/index.d.ts.map +0 -1
- package/dist/lib/themes/index.js +0 -80
- package/dist/lib/themes/index.js.map +0 -1
- package/dist/lib/utils/helpers.d.ts +0 -4
- package/dist/lib/utils/helpers.d.ts.map +0 -1
- package/dist/lib/utils/helpers.js +0 -39
- package/dist/lib/utils/helpers.js.map +0 -1
- package/dist/lib/utils/logger.d.ts +0 -4
- package/dist/lib/utils/logger.d.ts.map +0 -1
- package/dist/lib/utils/logger.js +0 -28
- package/dist/lib/utils/logger.js.map +0 -1
- package/dist/lib/workspace/index.d.ts +0 -13
- package/dist/lib/workspace/index.d.ts.map +0 -1
- package/dist/lib/workspace/index.js +0 -116
- package/dist/lib/workspace/index.js.map +0 -1
- package/dist/lib/worktree/index.d.ts +0 -7
- package/dist/lib/worktree/index.d.ts.map +0 -1
- package/dist/lib/worktree/index.js +0 -362
- package/dist/lib/worktree/index.js.map +0 -1
- package/dist/lib/worktree/migrate.d.ts +0 -2
- package/dist/lib/worktree/migrate.d.ts.map +0 -1
- package/dist/lib/worktree/migrate.js +0 -214
- package/dist/lib/worktree/migrate.js.map +0 -1
- package/dist/lib/worktree/repair.d.ts +0 -3
- package/dist/lib/worktree/repair.d.ts.map +0 -1
- package/dist/lib/worktree/repair.js +0 -320
- package/dist/lib/worktree/repair.js.map +0 -1
- package/dist/types/index.d.ts +0 -57
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -3
- package/dist/types/index.js.map +0 -1
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import inquirer from 'inquirer';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { SQLiteStorage } from './storage-sqlite.js';
|
|
6
|
+
import { createSpecFolders } from './create-spec-folders.js';
|
|
7
|
+
import { slugify } from './utils.js';
|
|
8
|
+
import { createDevcontainerConfig } from '../execution/devcontainer.js';
|
|
9
|
+
// Re-export new PMO modules
|
|
10
|
+
export * from './types.js';
|
|
11
|
+
export * from './utils.js';
|
|
12
|
+
export { parseBoard, generateBoardMarkdown, findAddedTickets, findRemovedTickets, findModifiedTickets, } from './markdown.js';
|
|
13
|
+
export { SQLiteStorage } from './storage-sqlite.js';
|
|
14
|
+
export { getStorageWithAutoSync, autoExportToBoard, withAutoExport, autoSyncFromBoard, getBoardPath, getWorkspaceDbPath, } from './sync-manager.js';
|
|
15
|
+
export { startWatcher, runWatcherForeground, } from './watcher.js';
|
|
16
|
+
export { createSpecFolders, getSpecFolderPath, getProjectPath, getProductPath, getEpicsPath, } from './create-spec-folders.js';
|
|
17
|
+
export { findPMO } from './find-pmo.js';
|
|
18
|
+
export { getPMOContext } from './pmo-context.js';
|
|
19
|
+
export { PMOCommand, pmoBaseFlags } from './base-command.js';
|
|
20
|
+
export { PMO_TABLES, PMO_TABLE_SCHEMAS, PMO_INDEXES, PMO_SCHEMA_SQL, EXPECTED_TICKET_COLUMNS, validateTicketSchema, } from './schema.js';
|
|
21
|
+
/**
|
|
22
|
+
* Get available board templates
|
|
23
|
+
*/
|
|
24
|
+
export function getBoardTemplates() {
|
|
25
|
+
return {
|
|
26
|
+
// Linear-style: Simple workflow with Planned for scheduled work
|
|
27
|
+
kanban: ['Backlog', 'Planned', 'In Progress', 'Done'],
|
|
28
|
+
// Linear-style with Triage and Review columns
|
|
29
|
+
linear: ['Backlog', 'Triage', 'Todo', 'In Progress', 'In Review', 'Done'],
|
|
30
|
+
// Bug tracking workflow
|
|
31
|
+
'bug-smash': ['Reported', 'Confirmed', 'Fixing', 'Verifying', 'Fixed'],
|
|
32
|
+
// Founder template: 5-tool backlogs (by work type) + workflow stages
|
|
33
|
+
'5-tool-founder': [
|
|
34
|
+
'Ship', 'Grow', 'Support', 'Strategy', 'BizOps',
|
|
35
|
+
'In Progress', 'Review', 'Done'
|
|
36
|
+
],
|
|
37
|
+
// Go-to-market workflow
|
|
38
|
+
'gtm': ['Ideation', 'Planning', 'In Development', 'Ready to Launch', 'Launched'],
|
|
39
|
+
// Legacy alias for founder
|
|
40
|
+
founder: [
|
|
41
|
+
'SHIP BL', 'GROW BL', 'SUPPORT BL', 'BIZOPS BL', 'STRATEGY BL',
|
|
42
|
+
'Planned', 'In Progress', 'Done', 'Dropped'
|
|
43
|
+
],
|
|
44
|
+
custom: [] // Will be handled separately
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get column settings for work commands based on board template.
|
|
49
|
+
* These settings determine which columns are used for:
|
|
50
|
+
* - work start: moves ticket to column_in_progress
|
|
51
|
+
* - work ready: moves ticket to column_review
|
|
52
|
+
* - work complete: moves ticket to column_done
|
|
53
|
+
*
|
|
54
|
+
* For custom templates, we try to find matching columns by keyword.
|
|
55
|
+
*/
|
|
56
|
+
export function getColumnSettingsForTemplate(template, columns) {
|
|
57
|
+
// Template-specific mappings (Linear-style: planned -> in_progress -> done)
|
|
58
|
+
const templateMappings = {
|
|
59
|
+
kanban: {
|
|
60
|
+
column_planned: 'Planned',
|
|
61
|
+
column_in_progress: 'In Progress',
|
|
62
|
+
column_done: 'Done',
|
|
63
|
+
},
|
|
64
|
+
linear: {
|
|
65
|
+
column_planned: 'Todo',
|
|
66
|
+
column_in_progress: 'In Progress',
|
|
67
|
+
column_done: 'Done',
|
|
68
|
+
},
|
|
69
|
+
'bug-smash': {
|
|
70
|
+
column_planned: 'Confirmed',
|
|
71
|
+
column_in_progress: 'Fixing',
|
|
72
|
+
column_done: 'Fixed',
|
|
73
|
+
},
|
|
74
|
+
'5-tool-founder': {
|
|
75
|
+
column_planned: 'Ship',
|
|
76
|
+
column_in_progress: 'In Progress',
|
|
77
|
+
column_done: 'Done',
|
|
78
|
+
},
|
|
79
|
+
'gtm': {
|
|
80
|
+
column_planned: 'Planning',
|
|
81
|
+
column_in_progress: 'In Development',
|
|
82
|
+
column_done: 'Launched',
|
|
83
|
+
},
|
|
84
|
+
founder: {
|
|
85
|
+
column_planned: 'Planned',
|
|
86
|
+
column_in_progress: 'In Progress',
|
|
87
|
+
column_done: 'Done',
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
// Use template mapping if available
|
|
91
|
+
if (templateMappings[template]) {
|
|
92
|
+
return templateMappings[template];
|
|
93
|
+
}
|
|
94
|
+
// For custom templates, try to find matching columns by keyword
|
|
95
|
+
const findColumn = (keywords, fallback) => {
|
|
96
|
+
const lowerColumns = columns.map(c => c.toLowerCase());
|
|
97
|
+
for (const keyword of keywords) {
|
|
98
|
+
const idx = lowerColumns.findIndex(c => c.includes(keyword));
|
|
99
|
+
if (idx !== -1)
|
|
100
|
+
return columns[idx];
|
|
101
|
+
}
|
|
102
|
+
return fallback;
|
|
103
|
+
};
|
|
104
|
+
return {
|
|
105
|
+
column_planned: findColumn(['planned', 'ready', 'scheduled', 'todo'], columns[1] || 'Planned'),
|
|
106
|
+
column_in_progress: findColumn(['progress', 'active', 'doing', 'working'], columns[2] || 'In Progress'),
|
|
107
|
+
column_done: findColumn(['done', 'complete', 'finished', 'published', 'shipped'], columns[columns.length - 1] || 'Done'),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Detect repositories in an HQ
|
|
112
|
+
*/
|
|
113
|
+
export function detectRepos(hqRoot) {
|
|
114
|
+
const reposDir = path.join(hqRoot, 'repos');
|
|
115
|
+
if (!fs.existsSync(reposDir)) {
|
|
116
|
+
return [];
|
|
117
|
+
}
|
|
118
|
+
const entries = fs.readdirSync(reposDir, { withFileTypes: true });
|
|
119
|
+
return entries
|
|
120
|
+
.filter(entry => entry.isDirectory())
|
|
121
|
+
.map(entry => ({
|
|
122
|
+
name: entry.name,
|
|
123
|
+
path: path.join(reposDir, entry.name),
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Prompt for PMO location (in-repo vs separate)
|
|
128
|
+
*/
|
|
129
|
+
export async function promptForPMOLocation(hqRoot) {
|
|
130
|
+
if (!hqRoot) {
|
|
131
|
+
return 'separate';
|
|
132
|
+
}
|
|
133
|
+
const repos = detectRepos(hqRoot);
|
|
134
|
+
if (repos.length === 0) {
|
|
135
|
+
return 'separate';
|
|
136
|
+
}
|
|
137
|
+
else if (repos.length === 1) {
|
|
138
|
+
const { location } = await inquirer.prompt([{
|
|
139
|
+
type: 'list',
|
|
140
|
+
name: 'location',
|
|
141
|
+
message: 'PMO location:',
|
|
142
|
+
choices: [
|
|
143
|
+
{
|
|
144
|
+
name: `Inside repo (${repos[0].name}/pmo)`,
|
|
145
|
+
value: `repo:${repos[0].name}`,
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
name: 'Separate from repo (hq/pmo)',
|
|
149
|
+
value: 'separate',
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
default: `repo:${repos[0].name}`,
|
|
153
|
+
}]);
|
|
154
|
+
return location;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
const { location } = await inquirer.prompt([{
|
|
158
|
+
type: 'list',
|
|
159
|
+
name: 'location',
|
|
160
|
+
message: 'PMO location:',
|
|
161
|
+
choices: [
|
|
162
|
+
{
|
|
163
|
+
name: 'Separate from repos (recommended for multi-repo HQs)',
|
|
164
|
+
value: 'separate',
|
|
165
|
+
},
|
|
166
|
+
new inquirer.Separator(),
|
|
167
|
+
...repos.map(repo => ({
|
|
168
|
+
name: `Inside ${repo.name} repo`,
|
|
169
|
+
value: `repo:${repo.name}`,
|
|
170
|
+
})),
|
|
171
|
+
],
|
|
172
|
+
default: 'separate',
|
|
173
|
+
}]);
|
|
174
|
+
return location;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Prompt for board template
|
|
179
|
+
*/
|
|
180
|
+
export async function promptForBoardTemplate() {
|
|
181
|
+
const { template } = await inquirer.prompt([{
|
|
182
|
+
type: 'list',
|
|
183
|
+
name: 'template',
|
|
184
|
+
message: 'Choose board template:',
|
|
185
|
+
choices: [
|
|
186
|
+
{ name: 'Kanban - Backlog → Planned → In Progress → Done', value: 'kanban' },
|
|
187
|
+
{ name: 'Linear - Backlog, Triage, Todo, In Progress, In Review, Done', value: 'linear' },
|
|
188
|
+
{ name: 'Bug Smash - Reported → Confirmed → Fixing → Verifying → Fixed', value: 'bug-smash' },
|
|
189
|
+
{ name: '5-Tool Founder - Ship, Grow, Support, Strategy, BizOps → In Progress → Review → Done', value: '5-tool-founder' },
|
|
190
|
+
{ name: 'GTM - Ideation → Planning → In Development → Ready to Launch → Launched', value: 'gtm' },
|
|
191
|
+
{ name: 'Custom (define your own columns)', value: 'custom' },
|
|
192
|
+
],
|
|
193
|
+
default: 'kanban',
|
|
194
|
+
}]);
|
|
195
|
+
return template;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Prompt for custom columns
|
|
199
|
+
*/
|
|
200
|
+
export async function promptForCustomColumns() {
|
|
201
|
+
const { columnsInput } = await inquirer.prompt([{
|
|
202
|
+
type: 'input',
|
|
203
|
+
name: 'columnsInput',
|
|
204
|
+
message: 'Enter column names (comma-separated):',
|
|
205
|
+
default: 'Backlog, In Progress, Done',
|
|
206
|
+
validate: (input) => {
|
|
207
|
+
const cols = input.split(',').map(c => c.trim()).filter(Boolean);
|
|
208
|
+
if (cols.length < 2) {
|
|
209
|
+
return 'Please enter at least 2 columns';
|
|
210
|
+
}
|
|
211
|
+
return true;
|
|
212
|
+
},
|
|
213
|
+
}]);
|
|
214
|
+
return columnsInput.split(',').map((c) => c.trim()).filter(Boolean);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Prompt for board name
|
|
218
|
+
*/
|
|
219
|
+
export async function promptForBoardName(defaultName) {
|
|
220
|
+
const { name } = await inquirer.prompt([{
|
|
221
|
+
type: 'input',
|
|
222
|
+
name: 'name',
|
|
223
|
+
message: 'Board name:',
|
|
224
|
+
default: defaultName || 'Project Board',
|
|
225
|
+
}]);
|
|
226
|
+
return name;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Full PMO setup prompt - used by both `prlt init` and `prlt pmo init`
|
|
230
|
+
*
|
|
231
|
+
* PMO is included by default (no prompt) per TKT-469 requirements.
|
|
232
|
+
*/
|
|
233
|
+
export async function promptForPMOSetup(hqRoot, hqName) {
|
|
234
|
+
// PMO is always included by default (R5 - no prompt)
|
|
235
|
+
console.log(chalk.blue('\n📋 Setting up PMO (project management)...\n'));
|
|
236
|
+
// PMO location (in-repo vs separate)
|
|
237
|
+
const location = await promptForPMOLocation(hqRoot);
|
|
238
|
+
// Board template
|
|
239
|
+
const boardTemplate = await promptForBoardTemplate();
|
|
240
|
+
// Get columns for template (or prompt for custom)
|
|
241
|
+
let columns = getColumnsForTemplate(boardTemplate);
|
|
242
|
+
if (boardTemplate === 'custom') {
|
|
243
|
+
columns = await promptForCustomColumns();
|
|
244
|
+
}
|
|
245
|
+
// Board name - default to {hqname}-kanban (can be changed later via `prlt project rename`)
|
|
246
|
+
const boardName = hqName ? `${hqName}-kanban` : 'Project Board';
|
|
247
|
+
return {
|
|
248
|
+
includePMO: true,
|
|
249
|
+
boardTemplate,
|
|
250
|
+
storageType: 'sqlite', // Always SQLite now
|
|
251
|
+
location,
|
|
252
|
+
boardName,
|
|
253
|
+
columns,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Get columns for a board template
|
|
258
|
+
*/
|
|
259
|
+
export function getColumnsForTemplate(template) {
|
|
260
|
+
const templates = getBoardTemplates();
|
|
261
|
+
return templates[template] || templates.kanban;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Create board content for Obsidian Kanban
|
|
265
|
+
*/
|
|
266
|
+
export function createBoardContent(template, boardName) {
|
|
267
|
+
const columns = getColumnsForTemplate(template);
|
|
268
|
+
const icons = {
|
|
269
|
+
// Linear-style workflow
|
|
270
|
+
'Backlog': '📥',
|
|
271
|
+
'Planned': '📋',
|
|
272
|
+
'In Progress': '🚀',
|
|
273
|
+
'Done': '✅',
|
|
274
|
+
'Canceled': '🚫',
|
|
275
|
+
// 5-Tool Founder backlogs
|
|
276
|
+
'SHIP BL': '🚢',
|
|
277
|
+
'GROW BL': '📈',
|
|
278
|
+
'SUPPORT BL': '🛟',
|
|
279
|
+
'BIZOPS BL': '⚙️',
|
|
280
|
+
'STRATEGY BL': '🎯',
|
|
281
|
+
// 5-Tool Founder workflow
|
|
282
|
+
'Dropped': '🗑️',
|
|
283
|
+
};
|
|
284
|
+
let content = '---\nkanban-plugin: obsidian-kanban\n---\n\n';
|
|
285
|
+
// Add board title (matches parser expectation for `# Title` line)
|
|
286
|
+
if (boardName) {
|
|
287
|
+
content += `# ${boardName}\n\n`;
|
|
288
|
+
}
|
|
289
|
+
for (const column of columns) {
|
|
290
|
+
const icon = icons[column] || '📋';
|
|
291
|
+
content += `## ${icon} ${column}\n\n`;
|
|
292
|
+
}
|
|
293
|
+
return content;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Determine PMO path based on location setting
|
|
297
|
+
*/
|
|
298
|
+
export function determinePMOPath(hqPath, location) {
|
|
299
|
+
if (location === 'separate') {
|
|
300
|
+
return path.join(hqPath, 'pmo');
|
|
301
|
+
}
|
|
302
|
+
else if (location.startsWith('repo:')) {
|
|
303
|
+
const repoName = location.substring(5);
|
|
304
|
+
return path.join(hqPath, 'repos', repoName, 'pmo');
|
|
305
|
+
}
|
|
306
|
+
throw new Error(`Invalid PMO location: ${location}`);
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Create PMO structure in HQ
|
|
310
|
+
*
|
|
311
|
+
* Used by both `prlt init` and `prlt pmo init` for consistent behavior.
|
|
312
|
+
*
|
|
313
|
+
* Structure:
|
|
314
|
+
* - PMO data is stored in workspace.db (pmo_* tables)
|
|
315
|
+
* - Boards live in pmo/projects/{id}/board.md
|
|
316
|
+
* - Specs live in pmo/projects/{id}/specs/{active,complete,future,dropped}
|
|
317
|
+
*/
|
|
318
|
+
export async function createPMO(options) {
|
|
319
|
+
const { hqPath, location, boardTemplate, boardName, columns, } = options;
|
|
320
|
+
console.log(chalk.blue('Creating PMO structure...'));
|
|
321
|
+
// Determine PMO path based on location
|
|
322
|
+
const pmoPath = determinePMOPath(hqPath, location);
|
|
323
|
+
// Generate project ID from board name
|
|
324
|
+
const projectId = slugify(boardName);
|
|
325
|
+
// Create PMO directory
|
|
326
|
+
fs.mkdirSync(pmoPath, { recursive: true });
|
|
327
|
+
// Initialize workspace.db with PMO tables
|
|
328
|
+
const dbPath = path.join(hqPath, '.proletariat', 'workspace.db');
|
|
329
|
+
if (!fs.existsSync(dbPath)) {
|
|
330
|
+
throw new Error(`workspace.db not found. Run 'prlt init' first.`);
|
|
331
|
+
}
|
|
332
|
+
const storage = new SQLiteStorage(dbPath);
|
|
333
|
+
// Create project
|
|
334
|
+
await storage.createProject({
|
|
335
|
+
id: projectId,
|
|
336
|
+
name: boardName,
|
|
337
|
+
description: `Project for ${boardName}`,
|
|
338
|
+
template: boardTemplate,
|
|
339
|
+
});
|
|
340
|
+
// Initialize board with columns (projectId already created above)
|
|
341
|
+
await storage.init(projectId, {
|
|
342
|
+
name: boardName,
|
|
343
|
+
columns,
|
|
344
|
+
});
|
|
345
|
+
// For custom templates, create statuses from columns
|
|
346
|
+
// (built-in templates have statuses created via applyTemplate in createProject)
|
|
347
|
+
if (boardTemplate === 'custom' && columns) {
|
|
348
|
+
for (let i = 0; i < columns.length; i++) {
|
|
349
|
+
const name = columns[i];
|
|
350
|
+
const nameLower = name.toLowerCase();
|
|
351
|
+
// Infer category from column name
|
|
352
|
+
let category = 'backlog';
|
|
353
|
+
if (nameLower.includes('done') || nameLower.includes('complete') || nameLower.includes('shipped')) {
|
|
354
|
+
category = 'completed';
|
|
355
|
+
}
|
|
356
|
+
else if (nameLower.includes('progress') || nameLower.includes('review') || nameLower.includes('active')) {
|
|
357
|
+
category = 'started';
|
|
358
|
+
}
|
|
359
|
+
else if (nameLower.includes('todo') || nameLower.includes('to do') || nameLower.includes('planned') || nameLower.includes('next')) {
|
|
360
|
+
category = 'unstarted';
|
|
361
|
+
}
|
|
362
|
+
else if (nameLower.includes('cancel') || nameLower.includes('archived')) {
|
|
363
|
+
category = 'canceled';
|
|
364
|
+
}
|
|
365
|
+
// Default: backlog (for first columns, custom backlogs, etc.)
|
|
366
|
+
await storage.createStatus(projectId, {
|
|
367
|
+
name,
|
|
368
|
+
category,
|
|
369
|
+
position: i,
|
|
370
|
+
isDefault: i === 0,
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// Save PMO path and column settings (relative to HQ root for container compatibility)
|
|
375
|
+
try {
|
|
376
|
+
const db = new (await import('better-sqlite3')).default(dbPath);
|
|
377
|
+
// Store relative path from HQ root (e.g., "pmo" or "repos/myrepo/pmo")
|
|
378
|
+
const relativePmoPath = path.relative(hqPath, pmoPath);
|
|
379
|
+
db.prepare('INSERT OR REPLACE INTO pmo_settings (key, value) VALUES (?, ?)').run('pmo_path', relativePmoPath);
|
|
380
|
+
// Set column settings based on template
|
|
381
|
+
// These determine which columns work commands use for transitions
|
|
382
|
+
const columnSettings = getColumnSettingsForTemplate(boardTemplate, columns);
|
|
383
|
+
for (const [key, value] of Object.entries(columnSettings)) {
|
|
384
|
+
db.prepare('INSERT OR REPLACE INTO pmo_settings (key, value) VALUES (?, ?)').run(key, value);
|
|
385
|
+
}
|
|
386
|
+
db.close();
|
|
387
|
+
}
|
|
388
|
+
catch {
|
|
389
|
+
// Ignore if settings table doesn't exist
|
|
390
|
+
}
|
|
391
|
+
await storage.close();
|
|
392
|
+
console.log(chalk.green(' ✓ PMO tables initialized in workspace.db'));
|
|
393
|
+
console.log(chalk.green(` ✓ Project "${projectId}" created`));
|
|
394
|
+
// Create project folder structure: pmo/projects/{projectId}/
|
|
395
|
+
const projectPath = path.join(pmoPath, 'projects', projectId);
|
|
396
|
+
fs.mkdirSync(projectPath, { recursive: true });
|
|
397
|
+
// Create spec folders in project directory
|
|
398
|
+
createSpecFolders(pmoPath, projectId);
|
|
399
|
+
console.log(chalk.green(' ✓ Spec folders created'));
|
|
400
|
+
// Create kanban.md in project directory with board name as title
|
|
401
|
+
const boardFileName = 'kanban.md';
|
|
402
|
+
const boardContent = createBoardContent(boardTemplate, boardName);
|
|
403
|
+
const boardFilePath = path.join(projectPath, boardFileName);
|
|
404
|
+
fs.writeFileSync(boardFilePath, boardContent);
|
|
405
|
+
console.log(chalk.green(` ✓ ${boardFileName} created`));
|
|
406
|
+
// Create README for PMO
|
|
407
|
+
const readmeContent = `# PMO (Project Management Office)
|
|
408
|
+
|
|
409
|
+
## Template: ${boardTemplate}
|
|
410
|
+
|
|
411
|
+
## Structure
|
|
412
|
+
|
|
413
|
+
### product/ - Living Product Definitions
|
|
414
|
+
Specs, requirements, and architecture docs that define WHAT the product should do.
|
|
415
|
+
These don't move through lifecycle - they get updated in place as the product evolves.
|
|
416
|
+
|
|
417
|
+
### projects/{id}/ - Implementation Work
|
|
418
|
+
Work that flows through a lifecycle to build the product.
|
|
419
|
+
|
|
420
|
+
\`\`\`
|
|
421
|
+
pmo/
|
|
422
|
+
├── product/ # WHAT (specs, requirements, architecture)
|
|
423
|
+
│ ├── init-commands.md # How init should work
|
|
424
|
+
│ ├── ticket-commands.md # How tickets should work
|
|
425
|
+
│ └── architecture.md # System design
|
|
426
|
+
│
|
|
427
|
+
└── projects/
|
|
428
|
+
└── {project-id}/
|
|
429
|
+
├── {project-id}-kanban.md # Kanban board (Obsidian compatible)
|
|
430
|
+
└── epics/ # Implementation work
|
|
431
|
+
├── draft/ # Planning phase
|
|
432
|
+
├── active/ # Currently implementing
|
|
433
|
+
└── complete/ # Done
|
|
434
|
+
\`\`\`
|
|
435
|
+
|
|
436
|
+
## Commands
|
|
437
|
+
\`\`\`bash
|
|
438
|
+
# Create ticket
|
|
439
|
+
prlt ticket create --title "My ticket" --column "Backlog"
|
|
440
|
+
|
|
441
|
+
# List tickets
|
|
442
|
+
prlt ticket list
|
|
443
|
+
prlt ticket list --column "In Progress"
|
|
444
|
+
|
|
445
|
+
# Move ticket
|
|
446
|
+
prlt ticket move <ticket-id> "In Progress"
|
|
447
|
+
|
|
448
|
+
# View board
|
|
449
|
+
prlt board view
|
|
450
|
+
\`\`\`
|
|
451
|
+
|
|
452
|
+
## Columns
|
|
453
|
+
${columns.join(', ')}
|
|
454
|
+
|
|
455
|
+
## Obsidian Setup
|
|
456
|
+
1. Open this folder as an Obsidian vault
|
|
457
|
+
2. Install the "Kanban" plugin
|
|
458
|
+
3. Open ${projectId}-kanban.md and switch to Kanban view
|
|
459
|
+
`;
|
|
460
|
+
fs.writeFileSync(path.join(pmoPath, 'README.md'), readmeContent);
|
|
461
|
+
// Create devcontainer for separate PMO (it's its own repo)
|
|
462
|
+
if (location === 'separate') {
|
|
463
|
+
console.log(chalk.blue('Creating devcontainer config for PMO...'));
|
|
464
|
+
createDevcontainerConfig({
|
|
465
|
+
agentName: 'pmo',
|
|
466
|
+
agentDir: pmoPath,
|
|
467
|
+
repoWorktrees: [], // PMO is the repo itself, no nested worktrees
|
|
468
|
+
});
|
|
469
|
+
console.log(chalk.green(' ✓ Devcontainer config created'));
|
|
470
|
+
}
|
|
471
|
+
const locationDesc = location === 'separate' ? 'hq/pmo' : location.replace('repo:', '') + '/pmo';
|
|
472
|
+
console.log(chalk.green(`✅ PMO created at ${locationDesc} with ${boardTemplate} template`));
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Update HQ config to include PMO
|
|
476
|
+
*/
|
|
477
|
+
export function updateHQConfigWithPMO(hqPath) {
|
|
478
|
+
const configPath = path.join(hqPath, '.proletariat', 'config.json');
|
|
479
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
480
|
+
config.hasPMO = true;
|
|
481
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Check if PMO exists in HQ by checking workspace.db for pmo_projects table
|
|
485
|
+
*/
|
|
486
|
+
export function hasPMO(hqPath) {
|
|
487
|
+
const dbPath = path.join(hqPath, '.proletariat', 'workspace.db');
|
|
488
|
+
if (!fs.existsSync(dbPath)) {
|
|
489
|
+
return false;
|
|
490
|
+
}
|
|
491
|
+
try {
|
|
492
|
+
const Database = require('better-sqlite3');
|
|
493
|
+
const db = new Database(dbPath);
|
|
494
|
+
const result = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='pmo_projects'").get();
|
|
495
|
+
db.close();
|
|
496
|
+
return result !== undefined;
|
|
497
|
+
}
|
|
498
|
+
catch {
|
|
499
|
+
return false;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PMO Markdown Parser and Generator
|
|
3
|
+
*
|
|
4
|
+
* Handles conversion between Obsidian Kanban markdown format and Board objects.
|
|
5
|
+
*/
|
|
6
|
+
import { Board, Ticket } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Parse an Obsidian Kanban markdown board into a Board object
|
|
9
|
+
* @param markdown The markdown content
|
|
10
|
+
* @param projectId The project ID to use (defaults to 'default')
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseBoard(markdown: string, projectId?: string): Board;
|
|
13
|
+
/**
|
|
14
|
+
* Generate Obsidian Kanban markdown from a Board object
|
|
15
|
+
*/
|
|
16
|
+
export declare function generateBoardMarkdown(board: Board): string;
|
|
17
|
+
/**
|
|
18
|
+
* Find tickets that exist in newBoard but not in oldBoard
|
|
19
|
+
*/
|
|
20
|
+
export declare function findAddedTickets(oldBoard: Board, newBoard: Board): Ticket[];
|
|
21
|
+
/**
|
|
22
|
+
* Find tickets that exist in oldBoard but not in newBoard
|
|
23
|
+
*/
|
|
24
|
+
export declare function findRemovedTickets(oldBoard: Board, newBoard: Board): Ticket[];
|
|
25
|
+
/**
|
|
26
|
+
* Find tickets that changed between boards
|
|
27
|
+
*/
|
|
28
|
+
export declare function findModifiedTickets(oldBoard: Board, newBoard: Board): Array<{
|
|
29
|
+
old: Ticket;
|
|
30
|
+
new: Ticket;
|
|
31
|
+
}>;
|