@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,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR Utilities
|
|
3
|
+
*
|
|
4
|
+
* Utilities for creating and managing GitHub pull requests.
|
|
5
|
+
* Uses the `gh` CLI for GitHub operations.
|
|
6
|
+
*/
|
|
7
|
+
export interface PRInfo {
|
|
8
|
+
number: number;
|
|
9
|
+
url: string;
|
|
10
|
+
title: string;
|
|
11
|
+
state: 'OPEN' | 'CLOSED' | 'MERGED';
|
|
12
|
+
headBranch: string;
|
|
13
|
+
baseBranch: string;
|
|
14
|
+
isDraft: boolean;
|
|
15
|
+
createdAt: string;
|
|
16
|
+
updatedAt: string;
|
|
17
|
+
}
|
|
18
|
+
export interface CreatePROptions {
|
|
19
|
+
title: string;
|
|
20
|
+
body?: string;
|
|
21
|
+
base?: string;
|
|
22
|
+
draft?: boolean;
|
|
23
|
+
cwd?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface CreatePRResult {
|
|
26
|
+
success: boolean;
|
|
27
|
+
url?: string;
|
|
28
|
+
number?: number;
|
|
29
|
+
error?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check if `gh` CLI is installed.
|
|
33
|
+
*/
|
|
34
|
+
export declare function isGHInstalled(): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Check if `gh` is authenticated.
|
|
37
|
+
*/
|
|
38
|
+
export declare function isGHAuthenticated(): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Get the authenticated GitHub username.
|
|
41
|
+
*/
|
|
42
|
+
export declare function getGHUsername(): string | null;
|
|
43
|
+
/**
|
|
44
|
+
* Check if GH_TOKEN or GITHUB_TOKEN is set in environment.
|
|
45
|
+
*/
|
|
46
|
+
export declare function isGHTokenInEnv(): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Get the GitHub repository from git remote.
|
|
49
|
+
* Returns format: owner/repo
|
|
50
|
+
*/
|
|
51
|
+
export declare function getGitHubRepo(cwd?: string): string | null;
|
|
52
|
+
/**
|
|
53
|
+
* Get the default base branch (main or master).
|
|
54
|
+
*/
|
|
55
|
+
export declare function getDefaultBaseBranch(cwd?: string): string;
|
|
56
|
+
/**
|
|
57
|
+
* Get the current branch name.
|
|
58
|
+
*/
|
|
59
|
+
export declare function getCurrentBranch(cwd?: string): string | null;
|
|
60
|
+
/**
|
|
61
|
+
* Check if the current branch has been pushed to remote.
|
|
62
|
+
*/
|
|
63
|
+
export declare function hasBranchBeenPushed(branch: string, cwd?: string): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Push the current branch to origin.
|
|
66
|
+
*/
|
|
67
|
+
export declare function pushBranch(branch: string, cwd?: string): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Check if there are unpushed commits.
|
|
70
|
+
*/
|
|
71
|
+
export declare function hasUnpushedCommits(branch: string, cwd?: string): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Get the commit log between base and head.
|
|
74
|
+
*/
|
|
75
|
+
export declare function getCommitLog(base: string, cwd?: string): string[];
|
|
76
|
+
/**
|
|
77
|
+
* Create a GitHub pull request using `gh` CLI.
|
|
78
|
+
*/
|
|
79
|
+
export declare function createPR(options: CreatePROptions): CreatePRResult;
|
|
80
|
+
/**
|
|
81
|
+
* Get PR info for a branch.
|
|
82
|
+
*/
|
|
83
|
+
export declare function getPRForBranch(branch: string, cwd?: string): PRInfo | null;
|
|
84
|
+
/**
|
|
85
|
+
* Get PR info by number.
|
|
86
|
+
*/
|
|
87
|
+
export declare function getPRByNumber(prNumber: number, cwd?: string): PRInfo | null;
|
|
88
|
+
/**
|
|
89
|
+
* List open PRs for the current repo.
|
|
90
|
+
*/
|
|
91
|
+
export declare function listOpenPRs(cwd?: string): PRInfo[];
|
|
92
|
+
/**
|
|
93
|
+
* Generate PR title from ticket info.
|
|
94
|
+
*/
|
|
95
|
+
export declare function generatePRTitle(ticketId: string, ticketTitle: string): string;
|
|
96
|
+
/**
|
|
97
|
+
* Generate PR body from ticket info.
|
|
98
|
+
*/
|
|
99
|
+
export declare function generatePRBody(options: {
|
|
100
|
+
ticketId: string;
|
|
101
|
+
ticketTitle: string;
|
|
102
|
+
ticketDescription?: string;
|
|
103
|
+
commits?: string[];
|
|
104
|
+
}): string;
|
|
105
|
+
/**
|
|
106
|
+
* Comment on a PR (either review comment or general comment).
|
|
107
|
+
*/
|
|
108
|
+
export interface PRComment {
|
|
109
|
+
id: string;
|
|
110
|
+
author: string;
|
|
111
|
+
body: string;
|
|
112
|
+
createdAt: string;
|
|
113
|
+
path?: string;
|
|
114
|
+
line?: number;
|
|
115
|
+
diffHunk?: string;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Review on a PR.
|
|
119
|
+
*/
|
|
120
|
+
export interface PRReview {
|
|
121
|
+
id: string;
|
|
122
|
+
author: string;
|
|
123
|
+
state: 'APPROVED' | 'CHANGES_REQUESTED' | 'COMMENTED' | 'PENDING' | 'DISMISSED';
|
|
124
|
+
body: string;
|
|
125
|
+
createdAt: string;
|
|
126
|
+
comments: PRComment[];
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Full feedback for a PR (reviews + comments).
|
|
130
|
+
*/
|
|
131
|
+
export interface PRFeedback {
|
|
132
|
+
prNumber: number;
|
|
133
|
+
prUrl: string;
|
|
134
|
+
prTitle: string;
|
|
135
|
+
reviews: PRReview[];
|
|
136
|
+
comments: PRComment[];
|
|
137
|
+
reviewDecision?: 'APPROVED' | 'CHANGES_REQUESTED' | 'REVIEW_REQUIRED' | null;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get PR feedback (reviews and comments) by PR URL or number.
|
|
141
|
+
*/
|
|
142
|
+
export declare function getPRFeedback(prUrlOrNumber: string | number, cwd?: string): PRFeedback | null;
|
|
143
|
+
/**
|
|
144
|
+
* Check if a PR has pending feedback that needs addressing.
|
|
145
|
+
*/
|
|
146
|
+
export declare function hasPendingFeedback(feedback: PRFeedback): boolean;
|
|
147
|
+
/**
|
|
148
|
+
* Format PR feedback as markdown for agent prompt.
|
|
149
|
+
*/
|
|
150
|
+
export declare function formatPRFeedbackForPrompt(feedback: PRFeedback): string;
|
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR Utilities
|
|
3
|
+
*
|
|
4
|
+
* Utilities for creating and managing GitHub pull requests.
|
|
5
|
+
* Uses the `gh` CLI for GitHub operations.
|
|
6
|
+
*/
|
|
7
|
+
import { execSync, spawnSync } from 'node:child_process';
|
|
8
|
+
// =============================================================================
|
|
9
|
+
// GitHub CLI Detection
|
|
10
|
+
// =============================================================================
|
|
11
|
+
/**
|
|
12
|
+
* Check if `gh` CLI is installed.
|
|
13
|
+
*/
|
|
14
|
+
export function isGHInstalled() {
|
|
15
|
+
try {
|
|
16
|
+
execSync('gh --version', { stdio: ['pipe', 'pipe', 'pipe'] });
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Check if `gh` is authenticated.
|
|
25
|
+
*/
|
|
26
|
+
export function isGHAuthenticated() {
|
|
27
|
+
try {
|
|
28
|
+
execSync('gh auth status', { stdio: ['pipe', 'pipe', 'pipe'] });
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get the authenticated GitHub username.
|
|
37
|
+
*/
|
|
38
|
+
export function getGHUsername() {
|
|
39
|
+
try {
|
|
40
|
+
const result = execSync('gh api user -q .login', {
|
|
41
|
+
encoding: 'utf-8',
|
|
42
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
43
|
+
}).trim();
|
|
44
|
+
return result || null;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check if GH_TOKEN or GITHUB_TOKEN is set in environment.
|
|
52
|
+
*/
|
|
53
|
+
export function isGHTokenInEnv() {
|
|
54
|
+
return !!(process.env.GH_TOKEN || process.env.GITHUB_TOKEN);
|
|
55
|
+
}
|
|
56
|
+
// =============================================================================
|
|
57
|
+
// Git Remote Detection
|
|
58
|
+
// =============================================================================
|
|
59
|
+
/**
|
|
60
|
+
* Get the GitHub repository from git remote.
|
|
61
|
+
* Returns format: owner/repo
|
|
62
|
+
*/
|
|
63
|
+
export function getGitHubRepo(cwd) {
|
|
64
|
+
try {
|
|
65
|
+
const remoteUrl = execSync('git remote get-url origin', {
|
|
66
|
+
cwd,
|
|
67
|
+
encoding: 'utf-8',
|
|
68
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
69
|
+
}).trim();
|
|
70
|
+
// Parse GitHub URL formats:
|
|
71
|
+
// https://github.com/owner/repo.git
|
|
72
|
+
// git@github.com:owner/repo.git
|
|
73
|
+
// ssh://git@github.com/owner/repo.git
|
|
74
|
+
const httpsMatch = remoteUrl.match(/github\.com[/:]([^/]+)\/([^/.]+)(\.git)?$/);
|
|
75
|
+
const sshMatch = remoteUrl.match(/git@github\.com:([^/]+)\/([^/.]+)(\.git)?$/);
|
|
76
|
+
const match = httpsMatch || sshMatch;
|
|
77
|
+
if (match) {
|
|
78
|
+
return `${match[1]}/${match[2]}`;
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get the default base branch (main or master).
|
|
88
|
+
*/
|
|
89
|
+
export function getDefaultBaseBranch(cwd) {
|
|
90
|
+
try {
|
|
91
|
+
// Check if 'main' exists
|
|
92
|
+
execSync('git rev-parse --verify main', {
|
|
93
|
+
cwd,
|
|
94
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
95
|
+
});
|
|
96
|
+
return 'main';
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Fall back to 'master'
|
|
100
|
+
try {
|
|
101
|
+
execSync('git rev-parse --verify master', {
|
|
102
|
+
cwd,
|
|
103
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
104
|
+
});
|
|
105
|
+
return 'master';
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return 'main'; // Default to main even if not found
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get the current branch name.
|
|
114
|
+
*/
|
|
115
|
+
export function getCurrentBranch(cwd) {
|
|
116
|
+
try {
|
|
117
|
+
return execSync('git rev-parse --abbrev-ref HEAD', {
|
|
118
|
+
cwd,
|
|
119
|
+
encoding: 'utf-8',
|
|
120
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
121
|
+
}).trim();
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Check if the current branch has been pushed to remote.
|
|
129
|
+
*/
|
|
130
|
+
export function hasBranchBeenPushed(branch, cwd) {
|
|
131
|
+
try {
|
|
132
|
+
execSync(`git rev-parse --verify origin/${branch}`, {
|
|
133
|
+
cwd,
|
|
134
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
135
|
+
});
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Push the current branch to origin.
|
|
144
|
+
*/
|
|
145
|
+
export function pushBranch(branch, cwd) {
|
|
146
|
+
try {
|
|
147
|
+
execSync(`git push -u origin ${branch}`, {
|
|
148
|
+
cwd,
|
|
149
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
150
|
+
});
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Check if there are unpushed commits.
|
|
159
|
+
*/
|
|
160
|
+
export function hasUnpushedCommits(branch, cwd) {
|
|
161
|
+
try {
|
|
162
|
+
const result = execSync(`git log origin/${branch}..HEAD --oneline`, {
|
|
163
|
+
cwd,
|
|
164
|
+
encoding: 'utf-8',
|
|
165
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
166
|
+
}).trim();
|
|
167
|
+
return result.length > 0;
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// If origin/branch doesn't exist, all commits are unpushed
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Get the commit log between base and head.
|
|
176
|
+
*/
|
|
177
|
+
export function getCommitLog(base, cwd) {
|
|
178
|
+
try {
|
|
179
|
+
const output = execSync(`git log ${base}..HEAD --oneline`, {
|
|
180
|
+
cwd,
|
|
181
|
+
encoding: 'utf-8',
|
|
182
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
183
|
+
}).trim();
|
|
184
|
+
return output ? output.split('\n') : [];
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return [];
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// =============================================================================
|
|
191
|
+
// PR Operations
|
|
192
|
+
// =============================================================================
|
|
193
|
+
/**
|
|
194
|
+
* Create a GitHub pull request using `gh` CLI.
|
|
195
|
+
*/
|
|
196
|
+
export function createPR(options) {
|
|
197
|
+
const { title, body, base, draft, cwd } = options;
|
|
198
|
+
const args = ['pr', 'create', '--title', title];
|
|
199
|
+
if (body) {
|
|
200
|
+
args.push('--body', body);
|
|
201
|
+
}
|
|
202
|
+
if (base) {
|
|
203
|
+
args.push('--base', base);
|
|
204
|
+
}
|
|
205
|
+
if (draft) {
|
|
206
|
+
args.push('--draft');
|
|
207
|
+
}
|
|
208
|
+
try {
|
|
209
|
+
const result = spawnSync('gh', args, {
|
|
210
|
+
cwd,
|
|
211
|
+
encoding: 'utf-8',
|
|
212
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
213
|
+
});
|
|
214
|
+
if (result.status !== 0) {
|
|
215
|
+
return {
|
|
216
|
+
success: false,
|
|
217
|
+
error: result.stderr || 'Failed to create PR',
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
// Parse the PR URL from stdout
|
|
221
|
+
const url = result.stdout.trim();
|
|
222
|
+
const prMatch = url.match(/\/pull\/(\d+)/);
|
|
223
|
+
const number = prMatch ? parseInt(prMatch[1], 10) : undefined;
|
|
224
|
+
return {
|
|
225
|
+
success: true,
|
|
226
|
+
url,
|
|
227
|
+
number,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
return {
|
|
232
|
+
success: false,
|
|
233
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get PR info for a branch.
|
|
239
|
+
*/
|
|
240
|
+
export function getPRForBranch(branch, cwd) {
|
|
241
|
+
try {
|
|
242
|
+
const result = execSync(`gh pr view ${branch} --json number,url,title,state,headRefName,baseRefName,isDraft,createdAt,updatedAt`, {
|
|
243
|
+
cwd,
|
|
244
|
+
encoding: 'utf-8',
|
|
245
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
246
|
+
});
|
|
247
|
+
const data = JSON.parse(result);
|
|
248
|
+
return {
|
|
249
|
+
number: data.number,
|
|
250
|
+
url: data.url,
|
|
251
|
+
title: data.title,
|
|
252
|
+
state: data.state,
|
|
253
|
+
headBranch: data.headRefName,
|
|
254
|
+
baseBranch: data.baseRefName,
|
|
255
|
+
isDraft: data.isDraft,
|
|
256
|
+
createdAt: data.createdAt,
|
|
257
|
+
updatedAt: data.updatedAt,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Get PR info by number.
|
|
266
|
+
*/
|
|
267
|
+
export function getPRByNumber(prNumber, cwd) {
|
|
268
|
+
try {
|
|
269
|
+
const result = execSync(`gh pr view ${prNumber} --json number,url,title,state,headRefName,baseRefName,isDraft,createdAt,updatedAt`, {
|
|
270
|
+
cwd,
|
|
271
|
+
encoding: 'utf-8',
|
|
272
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
273
|
+
});
|
|
274
|
+
const data = JSON.parse(result);
|
|
275
|
+
return {
|
|
276
|
+
number: data.number,
|
|
277
|
+
url: data.url,
|
|
278
|
+
title: data.title,
|
|
279
|
+
state: data.state,
|
|
280
|
+
headBranch: data.headRefName,
|
|
281
|
+
baseBranch: data.baseRefName,
|
|
282
|
+
isDraft: data.isDraft,
|
|
283
|
+
createdAt: data.createdAt,
|
|
284
|
+
updatedAt: data.updatedAt,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* List open PRs for the current repo.
|
|
293
|
+
*/
|
|
294
|
+
export function listOpenPRs(cwd) {
|
|
295
|
+
try {
|
|
296
|
+
const result = execSync('gh pr list --json number,url,title,state,headRefName,baseRefName,isDraft,createdAt,updatedAt', {
|
|
297
|
+
cwd,
|
|
298
|
+
encoding: 'utf-8',
|
|
299
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
300
|
+
});
|
|
301
|
+
const data = JSON.parse(result);
|
|
302
|
+
return data.map(pr => ({
|
|
303
|
+
number: pr.number,
|
|
304
|
+
url: pr.url,
|
|
305
|
+
title: pr.title,
|
|
306
|
+
state: pr.state,
|
|
307
|
+
headBranch: pr.headRefName,
|
|
308
|
+
baseBranch: pr.baseRefName,
|
|
309
|
+
isDraft: pr.isDraft,
|
|
310
|
+
createdAt: pr.createdAt,
|
|
311
|
+
updatedAt: pr.updatedAt,
|
|
312
|
+
}));
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
return [];
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// =============================================================================
|
|
319
|
+
// PR Title Generation
|
|
320
|
+
// =============================================================================
|
|
321
|
+
/**
|
|
322
|
+
* Generate PR title from ticket info.
|
|
323
|
+
*/
|
|
324
|
+
export function generatePRTitle(ticketId, ticketTitle) {
|
|
325
|
+
return `${ticketId}: ${ticketTitle}`;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Generate PR body from ticket info.
|
|
329
|
+
*/
|
|
330
|
+
export function generatePRBody(options) {
|
|
331
|
+
const { ticketId, ticketTitle, ticketDescription, commits } = options;
|
|
332
|
+
const lines = [];
|
|
333
|
+
lines.push('## Summary');
|
|
334
|
+
lines.push('');
|
|
335
|
+
lines.push(`Resolves ${ticketId}: ${ticketTitle}`);
|
|
336
|
+
lines.push('');
|
|
337
|
+
if (ticketDescription) {
|
|
338
|
+
lines.push('## Description');
|
|
339
|
+
lines.push('');
|
|
340
|
+
lines.push(ticketDescription);
|
|
341
|
+
lines.push('');
|
|
342
|
+
}
|
|
343
|
+
if (commits && commits.length > 0) {
|
|
344
|
+
lines.push('## Changes');
|
|
345
|
+
lines.push('');
|
|
346
|
+
for (const commit of commits) {
|
|
347
|
+
lines.push(`- ${commit}`);
|
|
348
|
+
}
|
|
349
|
+
lines.push('');
|
|
350
|
+
}
|
|
351
|
+
lines.push('## Test Plan');
|
|
352
|
+
lines.push('');
|
|
353
|
+
lines.push('- [ ] Tests pass locally');
|
|
354
|
+
lines.push('- [ ] Manual testing completed');
|
|
355
|
+
lines.push('');
|
|
356
|
+
return lines.join('\n');
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Get PR feedback (reviews and comments) by PR URL or number.
|
|
360
|
+
*/
|
|
361
|
+
export function getPRFeedback(prUrlOrNumber, cwd) {
|
|
362
|
+
try {
|
|
363
|
+
const result = execSync(`gh pr view ${prUrlOrNumber} --json number,url,title,reviews,comments,reviewDecision`, {
|
|
364
|
+
cwd,
|
|
365
|
+
encoding: 'utf-8',
|
|
366
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
367
|
+
});
|
|
368
|
+
const data = JSON.parse(result);
|
|
369
|
+
// Parse reviews
|
|
370
|
+
const reviews = (data.reviews || []).map((review) => ({
|
|
371
|
+
id: review.id,
|
|
372
|
+
author: review.author?.login || 'unknown',
|
|
373
|
+
state: review.state,
|
|
374
|
+
body: review.body || '',
|
|
375
|
+
createdAt: review.createdAt,
|
|
376
|
+
comments: (review.comments || []).map(c => ({
|
|
377
|
+
id: c.id,
|
|
378
|
+
author: c.author?.login || 'unknown',
|
|
379
|
+
body: c.body,
|
|
380
|
+
createdAt: c.createdAt,
|
|
381
|
+
path: c.path,
|
|
382
|
+
line: c.line,
|
|
383
|
+
diffHunk: c.diffHunk,
|
|
384
|
+
})),
|
|
385
|
+
}));
|
|
386
|
+
// Parse general comments (not part of reviews)
|
|
387
|
+
const comments = (data.comments || []).map((comment) => ({
|
|
388
|
+
id: comment.id,
|
|
389
|
+
author: comment.author?.login || 'unknown',
|
|
390
|
+
body: comment.body,
|
|
391
|
+
createdAt: comment.createdAt,
|
|
392
|
+
}));
|
|
393
|
+
return {
|
|
394
|
+
prNumber: data.number,
|
|
395
|
+
prUrl: data.url,
|
|
396
|
+
prTitle: data.title,
|
|
397
|
+
reviews,
|
|
398
|
+
comments,
|
|
399
|
+
reviewDecision: data.reviewDecision,
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
catch {
|
|
403
|
+
return null;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Check if a PR has pending feedback that needs addressing.
|
|
408
|
+
*/
|
|
409
|
+
export function hasPendingFeedback(feedback) {
|
|
410
|
+
// Check for "changes requested" reviews
|
|
411
|
+
const hasChangesRequested = feedback.reviews.some(r => r.state === 'CHANGES_REQUESTED');
|
|
412
|
+
if (hasChangesRequested)
|
|
413
|
+
return true;
|
|
414
|
+
// Check review decision
|
|
415
|
+
if (feedback.reviewDecision === 'CHANGES_REQUESTED')
|
|
416
|
+
return true;
|
|
417
|
+
// Check for unresolved comments (any review comments or general comments)
|
|
418
|
+
const hasReviewComments = feedback.reviews.some(r => r.comments.length > 0);
|
|
419
|
+
const hasGeneralComments = feedback.comments.length > 0;
|
|
420
|
+
return hasReviewComments || hasGeneralComments;
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Format PR feedback as markdown for agent prompt.
|
|
424
|
+
*/
|
|
425
|
+
export function formatPRFeedbackForPrompt(feedback) {
|
|
426
|
+
const lines = [];
|
|
427
|
+
lines.push(`## PR Feedback to Address`);
|
|
428
|
+
lines.push('');
|
|
429
|
+
lines.push(`**PR:** ${feedback.prTitle} (#${feedback.prNumber})`);
|
|
430
|
+
lines.push(`**URL:** ${feedback.prUrl}`);
|
|
431
|
+
if (feedback.reviewDecision) {
|
|
432
|
+
const decisionEmoji = feedback.reviewDecision === 'APPROVED' ? '✅' :
|
|
433
|
+
feedback.reviewDecision === 'CHANGES_REQUESTED' ? '❌' : '⏳';
|
|
434
|
+
lines.push(`**Status:** ${decisionEmoji} ${feedback.reviewDecision}`);
|
|
435
|
+
}
|
|
436
|
+
lines.push('');
|
|
437
|
+
// Add reviews with comments
|
|
438
|
+
const reviewsWithFeedback = feedback.reviews.filter(r => r.state === 'CHANGES_REQUESTED' || r.body || r.comments.length > 0);
|
|
439
|
+
if (reviewsWithFeedback.length > 0) {
|
|
440
|
+
lines.push('### Reviews');
|
|
441
|
+
lines.push('');
|
|
442
|
+
for (const review of reviewsWithFeedback) {
|
|
443
|
+
const stateEmoji = review.state === 'APPROVED' ? '✅' :
|
|
444
|
+
review.state === 'CHANGES_REQUESTED' ? '❌' : '💬';
|
|
445
|
+
lines.push(`#### ${stateEmoji} ${review.author} (${review.state})`);
|
|
446
|
+
if (review.body) {
|
|
447
|
+
lines.push('');
|
|
448
|
+
lines.push(review.body);
|
|
449
|
+
}
|
|
450
|
+
if (review.comments.length > 0) {
|
|
451
|
+
lines.push('');
|
|
452
|
+
lines.push('**Comments:**');
|
|
453
|
+
for (const comment of review.comments) {
|
|
454
|
+
lines.push('');
|
|
455
|
+
if (comment.path) {
|
|
456
|
+
lines.push(`📄 **${comment.path}**${comment.line ? `:${comment.line}` : ''}`);
|
|
457
|
+
if (comment.diffHunk) {
|
|
458
|
+
lines.push('```diff');
|
|
459
|
+
lines.push(comment.diffHunk);
|
|
460
|
+
lines.push('```');
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
lines.push(`> ${comment.body.replace(/\n/g, '\n> ')}`);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
lines.push('');
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
// Add general comments
|
|
470
|
+
if (feedback.comments.length > 0) {
|
|
471
|
+
lines.push('### General Comments');
|
|
472
|
+
lines.push('');
|
|
473
|
+
for (const comment of feedback.comments) {
|
|
474
|
+
lines.push(`**${comment.author}:**`);
|
|
475
|
+
lines.push(`> ${comment.body.replace(/\n/g, '\n> ')}`);
|
|
476
|
+
lines.push('');
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
lines.push('---');
|
|
480
|
+
lines.push('');
|
|
481
|
+
lines.push('Please address the feedback above. After making changes, commit and push.');
|
|
482
|
+
return lines.join('\n');
|
|
483
|
+
}
|