@sienklogic/plan-build-run 2.21.0 → 2.21.2

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.
Files changed (983) hide show
  1. package/CHANGELOG.md +1331 -299
  2. package/CLAUDE.md +75 -40
  3. package/LICENSE +2 -1
  4. package/README.md +412 -177
  5. package/bin/install.js +2752 -0
  6. package/dashboard/bin/cli.cjs +96 -0
  7. package/dashboard/bin/stop.cjs +129 -0
  8. package/dashboard/eslint.config.js +37 -0
  9. package/dashboard/index.html +20 -0
  10. package/dashboard/package.json +27 -25
  11. package/dashboard/server/index.js +151 -0
  12. package/dashboard/server/lib/frontmatter.js +92 -0
  13. package/dashboard/server/middleware/static.js +35 -0
  14. package/dashboard/server/package.json +16 -0
  15. package/dashboard/server/routes/agents.js +234 -0
  16. package/dashboard/server/routes/config.js +64 -0
  17. package/dashboard/server/routes/health.js +98 -0
  18. package/dashboard/server/routes/incidents.js +78 -0
  19. package/dashboard/server/routes/intel.js +69 -0
  20. package/dashboard/server/routes/memory.js +107 -0
  21. package/dashboard/server/routes/planning.js +234 -0
  22. package/dashboard/server/routes/progress.js +77 -0
  23. package/dashboard/server/routes/projects.js +36 -0
  24. package/dashboard/server/routes/requirements.js +40 -0
  25. package/dashboard/server/routes/roadmap.js +69 -0
  26. package/dashboard/server/routes/sessions.js +70 -0
  27. package/dashboard/server/routes/status.js +25 -0
  28. package/dashboard/server/routes/telemetry.js +233 -0
  29. package/dashboard/server/services/file-watcher.js +105 -0
  30. package/dashboard/server/services/planning-reader.js +727 -0
  31. package/dashboard/server/test/cli.test.js +34 -0
  32. package/dashboard/server/test/frontmatter.test.js +104 -0
  33. package/dashboard/server/test/isolation.test.js +32 -0
  34. package/dashboard/server/test/planning-reader.test.js +151 -0
  35. package/dashboard/server/test/routes.test.js +91 -0
  36. package/dashboard/server/test/ws.test.js +81 -0
  37. package/dashboard/server/ws.js +96 -0
  38. package/dashboard/src/App.jsx +165 -0
  39. package/dashboard/src/components/charts/BudgetBars.jsx +42 -0
  40. package/dashboard/src/components/charts/ContextRadar.jsx +34 -0
  41. package/dashboard/src/components/charts/PhaseDonut.jsx +66 -0
  42. package/dashboard/src/components/charts/SuccessTrend.jsx +45 -0
  43. package/dashboard/src/components/charts/TokenChart.jsx +55 -0
  44. package/dashboard/src/components/charts/index.js +5 -0
  45. package/dashboard/src/components/config/CfgSection.jsx +93 -0
  46. package/dashboard/src/components/layout/Header.jsx +89 -0
  47. package/dashboard/src/components/layout/ProjectSwitcher.jsx +160 -0
  48. package/dashboard/src/components/layout/Sidebar.jsx +161 -0
  49. package/dashboard/src/components/ui/AutoModeBanner.jsx +138 -0
  50. package/dashboard/src/components/ui/BackButton.jsx +27 -0
  51. package/dashboard/src/components/ui/Badge.jsx +27 -0
  52. package/dashboard/src/components/ui/Card.jsx +23 -0
  53. package/dashboard/src/components/ui/ChartTooltip.jsx +48 -0
  54. package/dashboard/src/components/ui/CheckpointBox.jsx +110 -0
  55. package/dashboard/src/components/ui/CodeBlock.jsx +27 -0
  56. package/dashboard/src/components/ui/ConfidenceBadge.jsx +20 -0
  57. package/dashboard/src/components/ui/ConfirmModal.jsx +161 -0
  58. package/dashboard/src/components/ui/ConnectionBanner.jsx +60 -0
  59. package/dashboard/src/components/ui/ErrorBoundary.jsx +106 -0
  60. package/dashboard/src/components/ui/ErrorBox.jsx +107 -0
  61. package/dashboard/src/components/ui/KeyValue.jsx +33 -0
  62. package/dashboard/src/components/ui/LoadingSkeleton.jsx +84 -0
  63. package/dashboard/src/components/ui/MetricCard.jsx +58 -0
  64. package/dashboard/src/components/ui/NextUpBlock.jsx +92 -0
  65. package/dashboard/src/components/ui/NumberInput.jsx +44 -0
  66. package/dashboard/src/components/ui/PBRBanner.jsx +47 -0
  67. package/dashboard/src/components/ui/PipelineView.jsx +130 -0
  68. package/dashboard/src/components/ui/ProgressBar.jsx +28 -0
  69. package/dashboard/src/components/ui/ProgressDisplay.jsx +47 -0
  70. package/dashboard/src/components/ui/QualityGateBadge.jsx +15 -0
  71. package/dashboard/src/components/ui/SectionTitle.jsx +35 -0
  72. package/dashboard/src/components/ui/SelectInput.jsx +45 -0
  73. package/dashboard/src/components/ui/StatusDot.jsx +51 -0
  74. package/dashboard/src/components/ui/StatusSymbol.jsx +49 -0
  75. package/dashboard/src/components/ui/TabBar.jsx +41 -0
  76. package/dashboard/src/components/ui/TextInput.jsx +42 -0
  77. package/dashboard/src/components/ui/Toast.jsx +117 -0
  78. package/dashboard/src/components/ui/Toggle.jsx +70 -0
  79. package/dashboard/src/components/ui/index.js +29 -0
  80. package/dashboard/src/hooks/useDocumentTitle.js +16 -0
  81. package/dashboard/src/hooks/useFetch.js +50 -0
  82. package/dashboard/src/hooks/useToast.jsx +43 -0
  83. package/dashboard/src/hooks/useWebSocket.js +103 -0
  84. package/dashboard/src/lib/api.js +112 -0
  85. package/dashboard/src/lib/configSchema.js +189 -0
  86. package/dashboard/src/lib/constants.js +22 -0
  87. package/dashboard/src/main.jsx +15 -0
  88. package/dashboard/src/pages/AgentsPage.jsx +191 -0
  89. package/dashboard/src/pages/ConfigPage.jsx +298 -0
  90. package/dashboard/src/pages/HooksPage.jsx +412 -0
  91. package/dashboard/src/pages/IncidentsPage.jsx +135 -0
  92. package/dashboard/src/pages/IntelPage.jsx +193 -0
  93. package/dashboard/src/pages/LiveFeed.jsx +274 -0
  94. package/dashboard/src/pages/MemoryPage.jsx +107 -0
  95. package/dashboard/src/pages/OnboardingPage.jsx +117 -0
  96. package/dashboard/src/pages/Overview.jsx +360 -0
  97. package/dashboard/src/pages/PhaseDetailView.jsx +216 -0
  98. package/dashboard/src/pages/PlanningPage.jsx +181 -0
  99. package/dashboard/src/pages/ProgressPage.jsx +249 -0
  100. package/dashboard/src/pages/ResearchPage.jsx +129 -0
  101. package/dashboard/src/pages/RoadmapPage.jsx +251 -0
  102. package/dashboard/src/pages/SessionsPage.jsx +117 -0
  103. package/dashboard/src/pages/Telemetry.jsx +166 -0
  104. package/dashboard/src/pages/planning/DecisionsTab.jsx +153 -0
  105. package/dashboard/src/pages/planning/FilesTab.jsx +420 -0
  106. package/dashboard/src/pages/planning/MilestoneDetail.jsx +319 -0
  107. package/dashboard/src/pages/planning/MilestonesTab.jsx +151 -0
  108. package/dashboard/src/pages/planning/NotesTab.jsx +251 -0
  109. package/dashboard/src/pages/planning/PhasesTab.jsx +218 -0
  110. package/dashboard/src/pages/planning/QuickTab.jsx +50 -0
  111. package/dashboard/src/pages/planning/ResearchTab.jsx +103 -0
  112. package/dashboard/src/pages/planning/TodosTab.jsx +297 -0
  113. package/dashboard/src/theme/ThemeProvider.jsx +38 -0
  114. package/dashboard/src/theme/tokens.js +17 -0
  115. package/dashboard/tests/components/ConfirmModal.test.jsx +179 -0
  116. package/dashboard/tests/components/ConnectionBanner.test.jsx +37 -0
  117. package/dashboard/tests/components/ErrorBoundary.test.jsx +59 -0
  118. package/dashboard/tests/components/LoadingSkeleton.test.jsx +46 -0
  119. package/dashboard/tests/components/ToastContainer.test.jsx +47 -0
  120. package/dashboard/tests/components/Toggle.test.jsx +61 -0
  121. package/dashboard/tests/hooks/useFetch.test.jsx +77 -0
  122. package/dashboard/tests/hooks/useToast.test.jsx +78 -0
  123. package/dashboard/tests/hooks/useWebSocket.test.jsx +128 -0
  124. package/dashboard/tests/pages/ConfigPage.test.jsx +199 -0
  125. package/dashboard/tests/pages/PlanningPage.test.jsx +119 -0
  126. package/dashboard/tests/pages/planning/FilesTab.test.jsx +198 -0
  127. package/dashboard/tests/pages/planning/NotesTab.test.jsx +178 -0
  128. package/dashboard/tests/pages/planning/TodosTab.test.jsx +188 -0
  129. package/dashboard/tests/performance.test.jsx +46 -0
  130. package/dashboard/tests/routes/config.test.js +98 -0
  131. package/dashboard/tests/routes/health.test.js +40 -0
  132. package/dashboard/tests/routes/planning.test.js +112 -0
  133. package/dashboard/tests/routes/roadmap.test.js +91 -0
  134. package/dashboard/tests/routes/status.test.js +131 -0
  135. package/dashboard/tests/server/planning-reader.test.js +153 -0
  136. package/dashboard/tests/setup.js +7 -0
  137. package/dashboard/vite.config.js +41 -0
  138. package/package.json +56 -41
  139. package/plan-build-run/bin/config-schema.json +1298 -0
  140. package/plugins/pbr/.claude-plugin/plugin.json +1 -1
  141. package/plugins/pbr/CLAUDE.md +19 -0
  142. package/plugins/pbr/UI-CONSISTENCY-GAPS.md +1 -1
  143. package/plugins/pbr/agents/advisor-researcher.md +101 -0
  144. package/plugins/pbr/agents/audit.md +207 -89
  145. package/plugins/pbr/agents/codebase-mapper.md +158 -23
  146. package/plugins/pbr/agents/debugger.md +212 -34
  147. package/plugins/pbr/agents/dev-sync.md +206 -0
  148. package/plugins/pbr/agents/executor.md +737 -39
  149. package/plugins/pbr/agents/general.md +71 -6
  150. package/plugins/pbr/agents/integration-checker.md +148 -30
  151. package/plugins/pbr/agents/intel-updater.md +332 -0
  152. package/plugins/pbr/agents/nyquist-auditor.md +254 -0
  153. package/plugins/pbr/agents/plan-checker.md +268 -66
  154. package/plugins/pbr/agents/planner.md +451 -42
  155. package/plugins/pbr/agents/researcher.md +219 -36
  156. package/plugins/pbr/agents/roadmapper.md +398 -0
  157. package/plugins/pbr/agents/synthesizer.md +166 -26
  158. package/plugins/pbr/agents/ui-checker.md +204 -0
  159. package/plugins/pbr/agents/ui-researcher.md +224 -0
  160. package/plugins/pbr/agents/verifier.md +571 -47
  161. package/plugins/pbr/commands/add-phase.md +75 -0
  162. package/plugins/pbr/commands/add-todo.md +8 -0
  163. package/plugins/pbr/commands/audit-fix.md +5 -0
  164. package/plugins/pbr/commands/audit-milestone.md +8 -0
  165. package/plugins/pbr/commands/autonomous.md +5 -0
  166. package/plugins/pbr/commands/backlog.md +6 -0
  167. package/plugins/pbr/commands/check-todos.md +8 -0
  168. package/plugins/pbr/commands/complete-milestone.md +8 -0
  169. package/plugins/pbr/commands/config.md +1 -1
  170. package/plugins/pbr/commands/discuss-phase.md +6 -0
  171. package/plugins/pbr/commands/do.md +5 -0
  172. package/plugins/pbr/commands/execute-phase.md +6 -0
  173. package/plugins/pbr/commands/fast.md +6 -0
  174. package/plugins/pbr/commands/forensics.md +6 -0
  175. package/plugins/pbr/commands/import.md +1 -1
  176. package/plugins/pbr/commands/insert-phase.md +65 -0
  177. package/plugins/pbr/commands/intel.md +5 -0
  178. package/plugins/pbr/commands/join-discord.md +11 -0
  179. package/plugins/pbr/commands/list-phase-assumptions.md +5 -0
  180. package/plugins/pbr/commands/map-codebase.md +6 -0
  181. package/plugins/pbr/commands/milestone-summary.md +6 -0
  182. package/plugins/pbr/commands/new-milestone.md +8 -0
  183. package/plugins/pbr/commands/new-project.md +6 -0
  184. package/plugins/pbr/commands/pause-work.md +5 -0
  185. package/plugins/pbr/commands/plan-milestone-gaps.md +7 -0
  186. package/plugins/pbr/commands/plan-phase.md +6 -0
  187. package/plugins/pbr/commands/plant-seed.md +6 -0
  188. package/plugins/pbr/commands/profile-user.md +5 -0
  189. package/plugins/pbr/commands/profile.md +5 -0
  190. package/plugins/pbr/commands/progress.md +6 -0
  191. package/plugins/pbr/commands/quick.md +1 -1
  192. package/plugins/pbr/commands/reapply-patches.md +47 -0
  193. package/plugins/pbr/commands/release.md +6 -0
  194. package/plugins/pbr/commands/remove-phase.md +66 -0
  195. package/plugins/pbr/commands/research-phase.md +59 -0
  196. package/plugins/pbr/commands/resume-work.md +5 -0
  197. package/plugins/pbr/commands/seed.md +6 -0
  198. package/plugins/pbr/commands/session-report.md +5 -0
  199. package/plugins/pbr/commands/set-profile.md +6 -0
  200. package/plugins/pbr/commands/settings.md +5 -0
  201. package/plugins/pbr/commands/setup.md +1 -1
  202. package/plugins/pbr/commands/ship.md +5 -0
  203. package/plugins/pbr/commands/stats.md +6 -0
  204. package/plugins/pbr/commands/test.md +5 -0
  205. package/plugins/pbr/commands/thread.md +6 -0
  206. package/plugins/pbr/commands/todo.md +1 -1
  207. package/plugins/pbr/commands/ui-phase.md +5 -0
  208. package/plugins/pbr/commands/ui-review.md +5 -0
  209. package/plugins/pbr/commands/undo.md +5 -0
  210. package/plugins/pbr/commands/update.md +37 -0
  211. package/plugins/pbr/commands/validate-phase.md +5 -0
  212. package/plugins/pbr/commands/verify-work.md +6 -0
  213. package/plugins/pbr/dashboard/package-lock.json +6 -0
  214. package/plugins/pbr/dist/architecture-guard.js +76 -0
  215. package/plugins/pbr/dist/audit-dimensions.js +556 -0
  216. package/plugins/pbr/dist/auto-continue.js +277 -0
  217. package/plugins/pbr/dist/block-skill-self-read.js +124 -0
  218. package/plugins/pbr/dist/check-agent-state-write.js +63 -0
  219. package/plugins/pbr/dist/check-config-change.js +213 -0
  220. package/plugins/pbr/dist/check-cross-plugin-sync.js +93 -0
  221. package/plugins/pbr/dist/check-dangerous-commands.js +193 -0
  222. package/plugins/pbr/dist/check-direct-state-write.js +37 -0
  223. package/plugins/pbr/dist/check-doc-sprawl.js +102 -0
  224. package/plugins/pbr/dist/check-phase-boundary.js +191 -0
  225. package/plugins/pbr/dist/check-plan-format.js +227 -0
  226. package/plugins/pbr/dist/check-read-first.js +345 -0
  227. package/plugins/pbr/dist/check-roadmap-sync.js +507 -0
  228. package/plugins/pbr/dist/check-skill-workflow.js +354 -0
  229. package/plugins/pbr/dist/check-state-sync.js +676 -0
  230. package/plugins/pbr/dist/check-subagent-output.js +425 -0
  231. package/plugins/pbr/dist/check-summary-gate.js +188 -0
  232. package/plugins/pbr/dist/context-bridge.js +425 -0
  233. package/plugins/pbr/dist/context-budget-check.js +442 -0
  234. package/plugins/pbr/dist/context-quality.js +271 -0
  235. package/plugins/pbr/dist/enforce-context-budget.js +138 -0
  236. package/plugins/pbr/dist/enforce-pbr-workflow.js +277 -0
  237. package/plugins/pbr/dist/event-handler.js +212 -0
  238. package/plugins/pbr/dist/event-logger.js +125 -0
  239. package/plugins/pbr/dist/feedback-loop.js +155 -0
  240. package/plugins/pbr/dist/graph-update.js +422 -0
  241. package/plugins/pbr/dist/hook-logger.js +114 -0
  242. package/plugins/pbr/dist/hook-server-client.js +361 -0
  243. package/plugins/pbr/dist/hook-server.js +664 -0
  244. package/plugins/pbr/dist/hooks-schema.json +87 -0
  245. package/plugins/pbr/dist/instructions-loaded.js +173 -0
  246. package/plugins/pbr/dist/intercept-plan-mode.js +81 -0
  247. package/plugins/pbr/dist/log-notification.js +131 -0
  248. package/plugins/pbr/dist/log-subagent.js +367 -0
  249. package/plugins/pbr/dist/log-tool-failure.js +140 -0
  250. package/plugins/pbr/dist/milestone-learnings.js +519 -0
  251. package/plugins/pbr/dist/pbr-tools.js +493 -0
  252. package/plugins/pbr/dist/post-bash-triage.js +96 -0
  253. package/plugins/pbr/dist/post-compact.js +135 -0
  254. package/plugins/pbr/dist/post-hoc.js +237 -0
  255. package/plugins/pbr/dist/post-write-dispatch.js +243 -0
  256. package/plugins/pbr/dist/post-write-quality.js +208 -0
  257. package/plugins/pbr/dist/pre-bash-dispatch.js +212 -0
  258. package/plugins/pbr/dist/pre-skill-dispatch.js +114 -0
  259. package/plugins/pbr/dist/pre-task-dispatch.js +269 -0
  260. package/plugins/pbr/dist/pre-write-dispatch.js +234 -0
  261. package/plugins/pbr/dist/progress-tracker.js +173 -0
  262. package/plugins/pbr/dist/prompt-guard.js +114 -0
  263. package/plugins/pbr/dist/prompt-routing.js +209 -0
  264. package/plugins/pbr/dist/quick-status.js +179 -0
  265. package/plugins/pbr/dist/record-incident.js +37 -0
  266. package/plugins/pbr/dist/run-hook.js +132 -0
  267. package/plugins/pbr/dist/session-cleanup.js +653 -0
  268. package/plugins/pbr/dist/session-tracker.js +124 -0
  269. package/plugins/pbr/dist/status-line.js +849 -0
  270. package/plugins/pbr/dist/suggest-compact.js +307 -0
  271. package/plugins/pbr/dist/sync-context-to-claude.js +100 -0
  272. package/plugins/pbr/dist/task-completed.js +206 -0
  273. package/plugins/pbr/dist/track-context-budget.js +432 -0
  274. package/plugins/pbr/dist/track-user-gates.js +88 -0
  275. package/plugins/pbr/dist/trust-tracker.js +193 -0
  276. package/plugins/pbr/dist/validate-commit.js +233 -0
  277. package/plugins/pbr/dist/validate-skill-args.js +222 -0
  278. package/plugins/pbr/dist/validate-task.js +271 -0
  279. package/plugins/pbr/dist/worktree-create.js +144 -0
  280. package/plugins/pbr/dist/worktree-remove.js +147 -0
  281. package/plugins/pbr/hooks/hooks.json +137 -65
  282. package/plugins/pbr/references/agent-contracts.md +39 -8
  283. package/plugins/pbr/references/agent-teams.md +3 -3
  284. package/plugins/pbr/references/archive/checkpoints.md +189 -0
  285. package/plugins/pbr/references/archive/context-quality-tiers.md +45 -0
  286. package/plugins/pbr/references/archive/hook-ordering.md +89 -0
  287. package/plugins/pbr/references/archive/limitations.md +106 -0
  288. package/plugins/pbr/references/archive/pbr-rules.md +194 -0
  289. package/plugins/pbr/references/archive/pbr-tools-cli.md +415 -0
  290. package/plugins/pbr/references/archive/pretooluse-jsonl-behavior.md +58 -0
  291. package/plugins/pbr/references/archive/signal-files.md +41 -0
  292. package/plugins/pbr/references/archive/tmux-setup.md +288 -0
  293. package/plugins/pbr/references/archive/verification-matrix.md +34 -0
  294. package/plugins/pbr/references/archive/verification-patterns.md +277 -0
  295. package/plugins/pbr/references/archive/worktree-sparse-checkout.md +86 -0
  296. package/plugins/pbr/references/assumptions.md +42 -0
  297. package/plugins/pbr/references/checkpoints.md +723 -104
  298. package/plugins/pbr/references/config-reference.md +387 -10
  299. package/plugins/pbr/references/continuation-format.md +1 -0
  300. package/plugins/pbr/references/decimal-phase-calculation.md +65 -0
  301. package/plugins/pbr/references/deviation-rules.md +12 -0
  302. package/plugins/pbr/references/few-shot-examples/audit.md +77 -0
  303. package/plugins/pbr/references/few-shot-examples/check-plan-format.md +172 -0
  304. package/plugins/pbr/references/few-shot-examples/check-subagent-output.md +118 -0
  305. package/plugins/pbr/references/few-shot-examples/integration-checker.md +70 -0
  306. package/plugins/pbr/references/few-shot-examples/nyquist-auditor.md +83 -0
  307. package/plugins/pbr/references/few-shot-examples/plan-checker.md +73 -0
  308. package/plugins/pbr/references/few-shot-examples/ui-checker.md +71 -0
  309. package/plugins/pbr/references/few-shot-examples/verifier.md +109 -0
  310. package/plugins/pbr/references/git-integration.md +110 -27
  311. package/plugins/pbr/references/git-planning-commit.md +35 -0
  312. package/plugins/pbr/references/model-profile-resolution.md +34 -0
  313. package/plugins/pbr/references/model-profiles.md +90 -7
  314. package/plugins/pbr/references/model-selection.md +1 -1
  315. package/plugins/pbr/references/node-repair.md +48 -0
  316. package/plugins/pbr/references/plan-authoring.md +65 -0
  317. package/plugins/pbr/references/plan-format.md +184 -10
  318. package/plugins/pbr/references/questioning.md +138 -49
  319. package/plugins/pbr/references/reading-verification.md +4 -4
  320. package/plugins/pbr/references/tdd.md +263 -0
  321. package/plugins/pbr/references/thinking-models-planning.md +47 -0
  322. package/plugins/pbr/references/thinking-models-verification.md +44 -0
  323. package/plugins/pbr/references/ui-brand.md +449 -0
  324. package/plugins/pbr/references/verification-overrides.md +39 -0
  325. package/plugins/pbr/references/verification-patterns.md +529 -113
  326. package/plugins/pbr/scripts/architecture-guard.js +76 -0
  327. package/plugins/pbr/scripts/audit-checks/behavioral-compliance.js +2098 -0
  328. package/plugins/pbr/scripts/audit-checks/error-analysis.js +989 -0
  329. package/plugins/pbr/scripts/audit-checks/feature-verification.js +723 -0
  330. package/plugins/pbr/scripts/audit-checks/index.js +433 -0
  331. package/plugins/pbr/scripts/audit-checks/infrastructure.js +816 -0
  332. package/plugins/pbr/scripts/audit-checks/quality-metrics.js +455 -0
  333. package/plugins/pbr/scripts/audit-checks/session-quality.js +980 -0
  334. package/plugins/pbr/scripts/audit-checks/si-agent-hook-config-checks.js +396 -0
  335. package/plugins/pbr/scripts/audit-checks/si-cross-cutting-checks.js +272 -0
  336. package/plugins/pbr/scripts/audit-checks/si-skill-checks.js +424 -0
  337. package/plugins/pbr/scripts/audit-checks/workflow-compliance.js +1175 -0
  338. package/plugins/pbr/scripts/audit-dimensions.js +556 -0
  339. package/plugins/pbr/scripts/auto-continue.js +192 -37
  340. package/plugins/pbr/scripts/block-skill-self-read.js +124 -0
  341. package/plugins/pbr/scripts/check-agent-state-write.js +63 -0
  342. package/plugins/pbr/scripts/check-config-change.js +84 -1
  343. package/plugins/pbr/scripts/check-cross-plugin-sync.js +93 -0
  344. package/plugins/pbr/scripts/check-dangerous-commands.js +18 -5
  345. package/plugins/pbr/scripts/check-direct-state-write.js +37 -0
  346. package/plugins/pbr/scripts/check-phase-boundary.js +3 -8
  347. package/plugins/pbr/scripts/check-plan-format.js +153 -278
  348. package/plugins/pbr/scripts/check-read-first.js +345 -0
  349. package/plugins/pbr/scripts/check-roadmap-sync.js +174 -19
  350. package/plugins/pbr/scripts/check-skill-workflow.js +24 -27
  351. package/plugins/pbr/scripts/check-state-sync.js +360 -218
  352. package/plugins/pbr/scripts/check-subagent-output.js +308 -273
  353. package/plugins/pbr/scripts/check-summary-gate.js +5 -15
  354. package/plugins/pbr/scripts/commands/benchmarks.js +195 -0
  355. package/plugins/pbr/scripts/commands/calibrate.js +530 -0
  356. package/plugins/pbr/scripts/commands/config.js +72 -0
  357. package/plugins/pbr/scripts/commands/misc.js +779 -0
  358. package/plugins/pbr/scripts/commands/phase.js +293 -0
  359. package/plugins/pbr/scripts/commands/roadmap.js +75 -0
  360. package/plugins/pbr/scripts/commands/state.js +84 -0
  361. package/plugins/pbr/scripts/commands/stress-test.js +349 -0
  362. package/plugins/pbr/scripts/commands/todo.js +191 -0
  363. package/plugins/pbr/scripts/commands/verify.js +169 -0
  364. package/plugins/pbr/scripts/config-schema.json +1183 -95
  365. package/plugins/pbr/scripts/context-bridge.js +425 -0
  366. package/plugins/pbr/scripts/context-budget-check.js +171 -16
  367. package/plugins/pbr/scripts/context-quality.js +271 -0
  368. package/plugins/pbr/scripts/enforce-context-budget.js +138 -0
  369. package/plugins/pbr/scripts/enforce-pbr-workflow.js +277 -0
  370. package/plugins/pbr/scripts/event-handler.js +137 -87
  371. package/plugins/pbr/scripts/event-logger.js +58 -25
  372. package/plugins/pbr/scripts/feedback-loop.js +155 -0
  373. package/plugins/pbr/scripts/graph-update.js +422 -0
  374. package/plugins/pbr/scripts/hook-logger.js +69 -35
  375. package/plugins/pbr/scripts/hook-server-client.js +361 -0
  376. package/plugins/pbr/scripts/hook-server.js +664 -0
  377. package/plugins/pbr/scripts/hooks-schema.json +12 -5
  378. package/plugins/pbr/scripts/instructions-loaded.js +173 -0
  379. package/plugins/pbr/scripts/intent-router.cjs +147 -0
  380. package/plugins/pbr/scripts/intercept-plan-mode.js +52 -18
  381. package/plugins/pbr/scripts/lib/alternatives.js +203 -0
  382. package/plugins/pbr/scripts/lib/audit.js +65 -0
  383. package/plugins/pbr/scripts/lib/auto-cleanup.js +221 -0
  384. package/plugins/pbr/scripts/lib/auto-verify.js +123 -0
  385. package/plugins/pbr/scripts/lib/benchmark.js +190 -0
  386. package/plugins/pbr/scripts/lib/build.js +719 -0
  387. package/plugins/pbr/scripts/lib/ci-fix-loop.js +228 -0
  388. package/plugins/pbr/scripts/lib/commands.js +483 -0
  389. package/plugins/pbr/scripts/lib/compound.js +222 -0
  390. package/plugins/pbr/scripts/lib/config-cache.js +83 -0
  391. package/plugins/pbr/scripts/lib/config.js +1469 -0
  392. package/plugins/pbr/scripts/lib/context.js +254 -0
  393. package/plugins/pbr/scripts/lib/contextual-help.js +183 -0
  394. package/plugins/pbr/scripts/lib/convention-detector.js +413 -0
  395. package/plugins/pbr/scripts/lib/core.js +1585 -0
  396. package/plugins/pbr/scripts/lib/dashboard-launch.js +364 -0
  397. package/plugins/pbr/scripts/lib/data-hygiene.js +179 -0
  398. package/plugins/pbr/scripts/lib/decision-extraction.js +183 -0
  399. package/plugins/pbr/scripts/lib/decisions.js +194 -0
  400. package/plugins/pbr/scripts/lib/dependency-break.js +147 -0
  401. package/plugins/pbr/scripts/lib/format-validators.js +1049 -0
  402. package/plugins/pbr/scripts/lib/frontmatter.js +302 -0
  403. package/plugins/pbr/scripts/lib/gates/advisories.js +133 -0
  404. package/plugins/pbr/scripts/lib/gates/build-dependency.js +118 -0
  405. package/plugins/pbr/scripts/lib/gates/build-executor.js +106 -0
  406. package/plugins/pbr/scripts/lib/gates/doc-existence.js +46 -0
  407. package/plugins/pbr/scripts/lib/gates/helpers.js +98 -0
  408. package/plugins/pbr/scripts/lib/gates/inline-execution.js +187 -0
  409. package/plugins/pbr/scripts/lib/gates/milestone-complete.js +139 -0
  410. package/plugins/pbr/scripts/lib/gates/milestone-summary.js +121 -0
  411. package/plugins/pbr/scripts/lib/gates/multi-phase-loader.js +149 -0
  412. package/plugins/pbr/scripts/lib/gates/plan-executor.js +36 -0
  413. package/plugins/pbr/scripts/lib/gates/plan-validation.js +115 -0
  414. package/plugins/pbr/scripts/lib/gates/quick-executor.js +78 -0
  415. package/plugins/pbr/scripts/lib/gates/review-planner.js +63 -0
  416. package/plugins/pbr/scripts/lib/gates/review-verifier.js +71 -0
  417. package/plugins/pbr/scripts/lib/gates/rich-agent-context.js +148 -0
  418. package/plugins/pbr/scripts/lib/gates/sprint-preflight.js +30 -0
  419. package/plugins/pbr/scripts/lib/gates/user-confirmation.js +95 -0
  420. package/plugins/pbr/scripts/lib/graph-cli.js +89 -0
  421. package/plugins/pbr/scripts/lib/graph.js +553 -0
  422. package/plugins/pbr/scripts/lib/handoff-validators.js +224 -0
  423. package/plugins/pbr/scripts/lib/health-checks.js +107 -0
  424. package/plugins/pbr/scripts/lib/health-phase06.js +120 -0
  425. package/plugins/pbr/scripts/lib/health.js +132 -0
  426. package/plugins/pbr/scripts/lib/help.js +100 -0
  427. package/plugins/pbr/scripts/lib/history.js +150 -0
  428. package/plugins/pbr/scripts/lib/impact-analysis.js +319 -0
  429. package/plugins/pbr/scripts/lib/incidents.js +190 -0
  430. package/plugins/pbr/scripts/lib/init.js +643 -0
  431. package/plugins/pbr/scripts/lib/insights-parser.js +320 -0
  432. package/plugins/pbr/scripts/lib/intel.js +653 -0
  433. package/plugins/pbr/scripts/lib/learnings.js +511 -0
  434. package/plugins/pbr/scripts/lib/migrate.js +309 -0
  435. package/plugins/pbr/scripts/lib/milestone.js +306 -0
  436. package/plugins/pbr/scripts/lib/msys-path.js +20 -0
  437. package/plugins/pbr/scripts/lib/negative-knowledge.js +194 -0
  438. package/plugins/pbr/scripts/lib/notification-throttle.js +141 -0
  439. package/plugins/pbr/scripts/lib/onboarding-generator.js +288 -0
  440. package/plugins/pbr/scripts/lib/parse-args.js +134 -0
  441. package/plugins/pbr/scripts/lib/pattern-routing.js +55 -0
  442. package/plugins/pbr/scripts/lib/patterns.js +272 -0
  443. package/plugins/pbr/scripts/lib/perf.js +190 -0
  444. package/plugins/pbr/scripts/lib/phase.js +1043 -0
  445. package/plugins/pbr/scripts/lib/pid-lock.js +156 -0
  446. package/plugins/pbr/scripts/lib/post-hoc.js +160 -0
  447. package/plugins/pbr/scripts/lib/pre-commit-checks.js +220 -0
  448. package/plugins/pbr/scripts/lib/pre-research.js +126 -0
  449. package/plugins/pbr/scripts/lib/premature-completion.js +312 -0
  450. package/plugins/pbr/scripts/lib/preview.js +174 -0
  451. package/plugins/pbr/scripts/lib/progress-visualization.js +296 -0
  452. package/plugins/pbr/scripts/lib/quick-init.js +131 -0
  453. package/plugins/pbr/scripts/lib/reference.js +236 -0
  454. package/plugins/pbr/scripts/lib/requirements.js +153 -0
  455. package/plugins/pbr/scripts/lib/resolve-root.js +66 -0
  456. package/plugins/pbr/scripts/lib/reverse-spec.js +259 -0
  457. package/plugins/pbr/scripts/lib/roadmap.js +1089 -0
  458. package/plugins/pbr/scripts/lib/security-scan.js +200 -0
  459. package/plugins/pbr/scripts/lib/session-briefing.js +918 -0
  460. package/plugins/pbr/scripts/lib/skill-section.js +99 -0
  461. package/plugins/pbr/scripts/lib/smart-next-task.js +198 -0
  462. package/plugins/pbr/scripts/lib/snapshot-manager.js +232 -0
  463. package/plugins/pbr/scripts/lib/spec-diff.js +209 -0
  464. package/plugins/pbr/scripts/lib/spec-engine.js +189 -0
  465. package/plugins/pbr/scripts/lib/spot-check.js +539 -0
  466. package/plugins/pbr/scripts/lib/state-queue.js +171 -0
  467. package/plugins/pbr/scripts/lib/state.js +1082 -0
  468. package/plugins/pbr/scripts/lib/status-render.js +511 -0
  469. package/plugins/pbr/scripts/lib/step-verify.js +149 -0
  470. package/plugins/pbr/scripts/lib/subagent-validators.js +1119 -0
  471. package/plugins/pbr/scripts/lib/suggest-next.js +435 -0
  472. package/plugins/pbr/scripts/lib/tech-debt-scanner.js +116 -0
  473. package/plugins/pbr/scripts/lib/templates.js +362 -0
  474. package/plugins/pbr/scripts/lib/test-selection.js +163 -0
  475. package/plugins/pbr/scripts/lib/todo.js +300 -0
  476. package/plugins/pbr/scripts/lib/verify.js +1561 -0
  477. package/plugins/pbr/scripts/log-notification.js +131 -0
  478. package/plugins/pbr/scripts/log-subagent.js +221 -18
  479. package/plugins/pbr/scripts/log-tool-failure.js +60 -8
  480. package/plugins/pbr/scripts/milestone-learnings.js +519 -0
  481. package/plugins/pbr/scripts/package.json +1 -1
  482. package/plugins/pbr/scripts/pbr-tools.js +362 -1247
  483. package/plugins/pbr/scripts/post-bash-triage.js +96 -0
  484. package/plugins/pbr/scripts/post-compact.js +135 -0
  485. package/plugins/pbr/scripts/post-hoc.js +237 -0
  486. package/plugins/pbr/scripts/post-write-dispatch.js +201 -31
  487. package/plugins/pbr/scripts/post-write-quality.js +4 -3
  488. package/plugins/pbr/scripts/pre-bash-dispatch.js +147 -51
  489. package/plugins/pbr/scripts/pre-skill-dispatch.js +114 -0
  490. package/plugins/pbr/scripts/pre-task-dispatch.js +269 -0
  491. package/plugins/pbr/scripts/pre-write-dispatch.js +170 -73
  492. package/plugins/pbr/scripts/progress-tracker.js +121 -324
  493. package/plugins/pbr/scripts/prompt-guard.js +114 -0
  494. package/plugins/pbr/scripts/prompt-routing.js +209 -0
  495. package/plugins/pbr/scripts/quick-status.js +179 -0
  496. package/plugins/pbr/scripts/record-incident.js +37 -0
  497. package/plugins/pbr/scripts/risk-classifier.cjs +123 -0
  498. package/plugins/pbr/scripts/run-hook.js +63 -23
  499. package/plugins/pbr/scripts/session-cleanup.js +428 -29
  500. package/plugins/pbr/scripts/session-tracker.js +124 -0
  501. package/plugins/pbr/scripts/status-line.js +593 -32
  502. package/plugins/pbr/scripts/suggest-compact.js +201 -13
  503. package/plugins/pbr/scripts/sync-context-to-claude.js +100 -0
  504. package/plugins/pbr/scripts/task-completed.js +165 -4
  505. package/plugins/pbr/scripts/test/config.test.js +126 -0
  506. package/plugins/pbr/scripts/test/cross-platform.test.js +120 -0
  507. package/plugins/pbr/scripts/test/fixtures/config.json +20 -0
  508. package/plugins/pbr/scripts/test/fixtures/plan.md +54 -0
  509. package/plugins/pbr/scripts/test/fixtures/project.md +30 -0
  510. package/plugins/pbr/scripts/test/fixtures/roadmap.md +55 -0
  511. package/plugins/pbr/scripts/test/fixtures/state.md +60 -0
  512. package/plugins/pbr/scripts/test/fixtures/summary.md +35 -0
  513. package/plugins/pbr/scripts/test/fixtures.test.js +184 -0
  514. package/plugins/pbr/scripts/test/phase.test.js +142 -0
  515. package/plugins/pbr/scripts/test/roadmap.test.js +96 -0
  516. package/plugins/pbr/scripts/test/state.test.js +155 -0
  517. package/plugins/pbr/scripts/track-context-budget.js +368 -104
  518. package/plugins/pbr/scripts/track-user-gates.js +88 -0
  519. package/plugins/pbr/scripts/trust-tracker.js +193 -0
  520. package/plugins/pbr/scripts/validate-commit.js +59 -26
  521. package/plugins/pbr/scripts/validate-skill-args.js +87 -15
  522. package/plugins/pbr/scripts/validate-task.js +83 -627
  523. package/plugins/pbr/scripts/worktree-create.js +144 -0
  524. package/plugins/pbr/scripts/worktree-remove.js +147 -0
  525. package/plugins/pbr/skills/audit/SKILL.md +195 -24
  526. package/plugins/pbr/skills/audit-fix/SKILL.md +326 -0
  527. package/plugins/pbr/skills/autonomous/SKILL.md +551 -0
  528. package/plugins/pbr/skills/backlog/SKILL.md +56 -0
  529. package/plugins/pbr/skills/begin/SKILL.md +508 -153
  530. package/plugins/pbr/skills/begin/templates/STATE.md.tmpl +1 -2
  531. package/plugins/pbr/skills/begin/templates/config.json.tmpl +419 -36
  532. package/plugins/pbr/skills/begin/templates/researcher-prompt.md.tmpl +28 -0
  533. package/plugins/pbr/skills/begin/templates/roadmap-prompt.md.tmpl +28 -3
  534. package/plugins/pbr/skills/begin/templates/synthesis-prompt.md.tmpl +33 -5
  535. package/plugins/pbr/skills/build/SKILL.md +1180 -358
  536. package/plugins/pbr/skills/build/templates/continuation-prompt.md.tmpl +26 -0
  537. package/plugins/pbr/skills/build/templates/executor-prompt.md.tmpl +77 -0
  538. package/plugins/pbr/skills/build/templates/inline-verifier-prompt.md.tmpl +33 -0
  539. package/plugins/pbr/skills/build/templates/qa-round-context.md.tmpl +16 -0
  540. package/plugins/pbr/skills/config/SKILL.md +112 -9
  541. package/plugins/pbr/skills/continue/SKILL.md +113 -33
  542. package/plugins/pbr/skills/dashboard/SKILL.md +21 -9
  543. package/plugins/pbr/skills/debug/SKILL.md +70 -12
  544. package/plugins/pbr/skills/debug/templates/continuation-prompt.md.tmpl +12 -1
  545. package/plugins/pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +12 -5
  546. package/plugins/pbr/skills/discuss/SKILL.md +205 -24
  547. package/plugins/pbr/skills/discuss/templates/CONTEXT.md.tmpl +21 -1
  548. package/plugins/pbr/skills/do/SKILL.md +119 -24
  549. package/plugins/pbr/skills/explore/SKILL.md +95 -20
  550. package/plugins/pbr/skills/fast/SKILL.md +94 -0
  551. package/plugins/pbr/skills/forensics/SKILL.md +144 -0
  552. package/plugins/pbr/skills/health/SKILL.md +35 -117
  553. package/plugins/pbr/skills/help/SKILL.md +83 -123
  554. package/plugins/pbr/skills/import/SKILL.md +332 -13
  555. package/plugins/pbr/skills/intel/SKILL.md +131 -0
  556. package/plugins/pbr/skills/list-phase-assumptions/SKILL.md +231 -0
  557. package/plugins/pbr/skills/milestone/SKILL.md +383 -274
  558. package/plugins/pbr/skills/milestone/templates/audit-output.md.tmpl +76 -0
  559. package/plugins/pbr/skills/milestone/templates/complete-output.md.tmpl +32 -0
  560. package/plugins/pbr/skills/milestone/templates/edge-cases.md +54 -0
  561. package/plugins/pbr/skills/milestone/templates/gaps-output.md.tmpl +25 -0
  562. package/plugins/pbr/skills/milestone/templates/integration-checker-prompt.md.tmpl +25 -0
  563. package/plugins/pbr/skills/milestone/templates/new-output.md.tmpl +29 -0
  564. package/plugins/pbr/skills/milestone-summary/SKILL.md +86 -0
  565. package/plugins/pbr/skills/note/SKILL.md +20 -4
  566. package/plugins/pbr/skills/pause/SKILL.md +54 -14
  567. package/plugins/pbr/skills/pause/templates/continue-here.md.tmpl +33 -52
  568. package/plugins/pbr/skills/plan/SKILL.md +526 -280
  569. package/plugins/pbr/skills/plan/templates/checker-prompt.md.tmpl +20 -2
  570. package/plugins/pbr/skills/plan/templates/completion-output.md.tmpl +27 -0
  571. package/plugins/pbr/skills/plan/templates/planner-prompt.md.tmpl +43 -1
  572. package/plugins/pbr/skills/plan/templates/revision-prompt.md.tmpl +21 -5
  573. package/plugins/pbr/skills/profile/SKILL.md +185 -0
  574. package/plugins/pbr/skills/profile-user/SKILL.md +227 -0
  575. package/plugins/pbr/skills/quick/SKILL.md +435 -100
  576. package/plugins/pbr/skills/release/SKILL.md +206 -0
  577. package/plugins/pbr/skills/resume/SKILL.md +170 -46
  578. package/plugins/pbr/skills/review/SKILL.md +233 -165
  579. package/plugins/pbr/skills/review/templates/verifier-prompt.md.tmpl +7 -0
  580. package/plugins/pbr/skills/scan/SKILL.md +152 -106
  581. package/plugins/pbr/skills/scan/templates/mapper-prompt.md.tmpl +5 -56
  582. package/plugins/pbr/skills/seed/SKILL.md +87 -0
  583. package/plugins/pbr/skills/session-report/SKILL.md +130 -0
  584. package/plugins/pbr/skills/setup/SKILL.md +150 -202
  585. package/plugins/pbr/skills/shared/agent-context-enrichment.md +21 -0
  586. package/plugins/pbr/skills/shared/agent-type-resolution.md +32 -0
  587. package/plugins/pbr/skills/shared/commit-planning-docs.md +8 -0
  588. package/plugins/pbr/skills/shared/context-budget.md +66 -1
  589. package/plugins/pbr/skills/shared/context-loader-task.md +18 -11
  590. package/plugins/pbr/skills/shared/criterion-writing.md +58 -0
  591. package/plugins/pbr/skills/shared/digest-select.md +2 -2
  592. package/plugins/pbr/skills/shared/domain-probes.md +1 -1
  593. package/plugins/pbr/skills/shared/error-reporting.md +38 -60
  594. package/plugins/pbr/skills/shared/gate-prompts.md +4 -2
  595. package/plugins/pbr/skills/shared/memory-capture.md +48 -0
  596. package/plugins/pbr/skills/shared/phase-argument-parsing.md +4 -4
  597. package/plugins/pbr/skills/shared/revision-loop.md +24 -6
  598. package/plugins/pbr/skills/shared/state-update.md +49 -56
  599. package/plugins/pbr/skills/shared/universal-anti-patterns.md +27 -4
  600. package/plugins/pbr/skills/ship/SKILL.md +155 -0
  601. package/plugins/pbr/skills/stats/SKILL.md +110 -0
  602. package/plugins/pbr/skills/status/SKILL.md +185 -119
  603. package/plugins/pbr/skills/test/SKILL.md +254 -0
  604. package/plugins/pbr/skills/thread/SKILL.md +73 -0
  605. package/plugins/pbr/skills/todo/SKILL.md +28 -72
  606. package/plugins/pbr/skills/ui-phase/SKILL.md +180 -0
  607. package/plugins/pbr/skills/ui-review/SKILL.md +206 -0
  608. package/plugins/pbr/skills/undo/SKILL.md +221 -0
  609. package/plugins/pbr/skills/validate-phase/SKILL.md +362 -0
  610. package/plugins/pbr/templates/CONTEXT.md.tmpl +45 -20
  611. package/plugins/pbr/templates/DISCOVERY.md.tmpl +29 -0
  612. package/plugins/pbr/templates/DISCUSSION-LOG.md.tmpl +49 -0
  613. package/plugins/pbr/templates/HANDOFF.json.tmpl +30 -0
  614. package/plugins/pbr/templates/INTEGRATION-REPORT.md.tmpl +18 -2
  615. package/plugins/pbr/templates/MILESTONE-AUDIT.md.tmpl +44 -0
  616. package/plugins/pbr/templates/PROJECT.md.tmpl +126 -0
  617. package/plugins/pbr/templates/REQUIREMENTS.md.tmpl +96 -0
  618. package/plugins/pbr/templates/RETROSPECTIVE.md.tmpl +43 -0
  619. package/plugins/pbr/templates/ROADMAP.md.tmpl +108 -14
  620. package/plugins/pbr/templates/SUMMARY-complex.md.tmpl +133 -0
  621. package/plugins/pbr/templates/SUMMARY-minimal.md.tmpl +55 -0
  622. package/plugins/pbr/templates/SUMMARY.md.tmpl +21 -0
  623. package/plugins/pbr/templates/UAT.md.tmpl +94 -0
  624. package/plugins/pbr/templates/UI-SPEC.md.tmpl +144 -0
  625. package/plugins/pbr/templates/VALIDATION.md.tmpl +94 -0
  626. package/plugins/pbr/templates/VERIFICATION-DETAIL.md.tmpl +54 -13
  627. package/plugins/pbr/templates/project-CONTEXT.md.tmpl +59 -0
  628. package/plugins/pbr/templates/research-outputs/ARCHITECTURE.md.tmpl +91 -0
  629. package/plugins/pbr/templates/research-outputs/FEATURES.md.tmpl +64 -0
  630. package/plugins/pbr/templates/research-outputs/PITFALLS.md.tmpl +50 -0
  631. package/plugins/pbr/templates/research-outputs/STACK.md.tmpl +63 -0
  632. package/plugins/pbr/templates/research-outputs/SUMMARY.md.tmpl +98 -0
  633. package/scripts/build-hooks.js +61 -0
  634. package/scripts/check-ci.js +100 -0
  635. package/scripts/clean-changelog.js +364 -0
  636. package/scripts/generate-derivatives.js +581 -0
  637. package/scripts/posttest.js +93 -0
  638. package/scripts/release.js +262 -0
  639. package/scripts/run-tests.cjs +29 -0
  640. package/scripts/test-wrapper.js +43 -0
  641. package/dashboard/bin/cli.js +0 -25
  642. package/dashboard/public/css/layout.css +0 -704
  643. package/dashboard/public/css/status-colors.css +0 -98
  644. package/dashboard/public/css/tokens.css +0 -59
  645. package/dashboard/public/js/htmx-title.js +0 -5
  646. package/dashboard/public/js/sidebar-toggle.js +0 -34
  647. package/dashboard/public/js/sse-client.js +0 -100
  648. package/dashboard/public/js/theme-toggle.js +0 -46
  649. package/dashboard/src/app.js +0 -91
  650. package/dashboard/src/middleware/current-phase.js +0 -24
  651. package/dashboard/src/middleware/errorHandler.js +0 -52
  652. package/dashboard/src/middleware/notFoundHandler.js +0 -9
  653. package/dashboard/src/repositories/planning.repository.js +0 -130
  654. package/dashboard/src/routes/events.routes.js +0 -45
  655. package/dashboard/src/routes/index.routes.js +0 -35
  656. package/dashboard/src/routes/pages.routes.js +0 -426
  657. package/dashboard/src/server.js +0 -42
  658. package/dashboard/src/services/analytics.service.js +0 -141
  659. package/dashboard/src/services/dashboard.service.js +0 -309
  660. package/dashboard/src/services/milestone.service.js +0 -222
  661. package/dashboard/src/services/notes.service.js +0 -50
  662. package/dashboard/src/services/phase.service.js +0 -232
  663. package/dashboard/src/services/project.service.js +0 -57
  664. package/dashboard/src/services/roadmap.service.js +0 -258
  665. package/dashboard/src/services/sse.service.js +0 -58
  666. package/dashboard/src/services/todo.service.js +0 -272
  667. package/dashboard/src/services/watcher.service.js +0 -48
  668. package/dashboard/src/utils/cache.js +0 -55
  669. package/dashboard/src/views/analytics.ejs +0 -5
  670. package/dashboard/src/views/coming-soon.ejs +0 -11
  671. package/dashboard/src/views/dependencies.ejs +0 -5
  672. package/dashboard/src/views/error.ejs +0 -20
  673. package/dashboard/src/views/index.ejs +0 -5
  674. package/dashboard/src/views/milestone-detail.ejs +0 -5
  675. package/dashboard/src/views/milestones.ejs +0 -5
  676. package/dashboard/src/views/notes.ejs +0 -5
  677. package/dashboard/src/views/partials/analytics-content.ejs +0 -90
  678. package/dashboard/src/views/partials/breadcrumbs.ejs +0 -14
  679. package/dashboard/src/views/partials/dashboard-content.ejs +0 -84
  680. package/dashboard/src/views/partials/dependencies-content.ejs +0 -48
  681. package/dashboard/src/views/partials/empty-state.ejs +0 -7
  682. package/dashboard/src/views/partials/footer.ejs +0 -3
  683. package/dashboard/src/views/partials/head.ejs +0 -30
  684. package/dashboard/src/views/partials/header.ejs +0 -21
  685. package/dashboard/src/views/partials/layout-bottom.ejs +0 -43
  686. package/dashboard/src/views/partials/layout-top.ejs +0 -16
  687. package/dashboard/src/views/partials/milestone-detail-content.ejs +0 -20
  688. package/dashboard/src/views/partials/milestones-content.ejs +0 -88
  689. package/dashboard/src/views/partials/notes-content.ejs +0 -23
  690. package/dashboard/src/views/partials/phase-content.ejs +0 -193
  691. package/dashboard/src/views/partials/phase-doc-content.ejs +0 -38
  692. package/dashboard/src/views/partials/phases-content.ejs +0 -124
  693. package/dashboard/src/views/partials/roadmap-content.ejs +0 -180
  694. package/dashboard/src/views/partials/sidebar.ejs +0 -99
  695. package/dashboard/src/views/partials/todo-create-content.ejs +0 -54
  696. package/dashboard/src/views/partials/todo-detail-content.ejs +0 -42
  697. package/dashboard/src/views/partials/todos-content.ejs +0 -97
  698. package/dashboard/src/views/phase-detail.ejs +0 -5
  699. package/dashboard/src/views/phase-doc.ejs +0 -5
  700. package/dashboard/src/views/phases.ejs +0 -5
  701. package/dashboard/src/views/roadmap.ejs +0 -5
  702. package/dashboard/src/views/todo-create.ejs +0 -5
  703. package/dashboard/src/views/todo-detail.ejs +0 -5
  704. package/dashboard/src/views/todos.ejs +0 -5
  705. package/plugins/copilot-pbr/CHANGELOG.md +0 -19
  706. package/plugins/copilot-pbr/README.md +0 -139
  707. package/plugins/copilot-pbr/agents/audit.agent.md +0 -113
  708. package/plugins/copilot-pbr/agents/codebase-mapper.agent.md +0 -151
  709. package/plugins/copilot-pbr/agents/debugger.agent.md +0 -182
  710. package/plugins/copilot-pbr/agents/executor.agent.md +0 -267
  711. package/plugins/copilot-pbr/agents/general.agent.md +0 -88
  712. package/plugins/copilot-pbr/agents/integration-checker.agent.md +0 -119
  713. package/plugins/copilot-pbr/agents/plan-checker.agent.md +0 -208
  714. package/plugins/copilot-pbr/agents/planner.agent.md +0 -238
  715. package/plugins/copilot-pbr/agents/researcher.agent.md +0 -186
  716. package/plugins/copilot-pbr/agents/synthesizer.agent.md +0 -126
  717. package/plugins/copilot-pbr/agents/verifier.agent.md +0 -228
  718. package/plugins/copilot-pbr/hooks/hooks.json +0 -258
  719. package/plugins/copilot-pbr/plugin.json +0 -30
  720. package/plugins/copilot-pbr/references/agent-anti-patterns.md +0 -25
  721. package/plugins/copilot-pbr/references/agent-contracts.md +0 -297
  722. package/plugins/copilot-pbr/references/agent-interactions.md +0 -135
  723. package/plugins/copilot-pbr/references/agent-teams.md +0 -55
  724. package/plugins/copilot-pbr/references/checkpoints.md +0 -158
  725. package/plugins/copilot-pbr/references/common-bug-patterns.md +0 -14
  726. package/plugins/copilot-pbr/references/config-reference.md +0 -442
  727. package/plugins/copilot-pbr/references/continuation-format.md +0 -213
  728. package/plugins/copilot-pbr/references/deviation-rules.md +0 -113
  729. package/plugins/copilot-pbr/references/git-integration.md +0 -227
  730. package/plugins/copilot-pbr/references/integration-patterns.md +0 -118
  731. package/plugins/copilot-pbr/references/model-profiles.md +0 -100
  732. package/plugins/copilot-pbr/references/model-selection.md +0 -32
  733. package/plugins/copilot-pbr/references/pbr-rules.md +0 -195
  734. package/plugins/copilot-pbr/references/pbr-tools-cli.md +0 -285
  735. package/plugins/copilot-pbr/references/plan-authoring.md +0 -182
  736. package/plugins/copilot-pbr/references/plan-format.md +0 -288
  737. package/plugins/copilot-pbr/references/planning-config.md +0 -214
  738. package/plugins/copilot-pbr/references/questioning.md +0 -215
  739. package/plugins/copilot-pbr/references/reading-verification.md +0 -128
  740. package/plugins/copilot-pbr/references/stub-patterns.md +0 -161
  741. package/plugins/copilot-pbr/references/subagent-coordination.md +0 -120
  742. package/plugins/copilot-pbr/references/ui-formatting.md +0 -444
  743. package/plugins/copilot-pbr/references/verification-patterns.md +0 -199
  744. package/plugins/copilot-pbr/references/wave-execution.md +0 -96
  745. package/plugins/copilot-pbr/rules/pbr-workflow.mdc +0 -48
  746. package/plugins/copilot-pbr/setup.ps1 +0 -93
  747. package/plugins/copilot-pbr/setup.sh +0 -93
  748. package/plugins/copilot-pbr/skills/audit/SKILL.md +0 -330
  749. package/plugins/copilot-pbr/skills/begin/SKILL.md +0 -589
  750. package/plugins/copilot-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  751. package/plugins/copilot-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  752. package/plugins/copilot-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  753. package/plugins/copilot-pbr/skills/begin/templates/config.json.tmpl +0 -64
  754. package/plugins/copilot-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  755. package/plugins/copilot-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  756. package/plugins/copilot-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  757. package/plugins/copilot-pbr/skills/build/SKILL.md +0 -960
  758. package/plugins/copilot-pbr/skills/config/SKILL.md +0 -250
  759. package/plugins/copilot-pbr/skills/continue/SKILL.md +0 -159
  760. package/plugins/copilot-pbr/skills/dashboard/SKILL.md +0 -43
  761. package/plugins/copilot-pbr/skills/debug/SKILL.md +0 -508
  762. package/plugins/copilot-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  763. package/plugins/copilot-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  764. package/plugins/copilot-pbr/skills/discuss/SKILL.md +0 -353
  765. package/plugins/copilot-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  766. package/plugins/copilot-pbr/skills/discuss/templates/decision-categories.md +0 -10
  767. package/plugins/copilot-pbr/skills/do/SKILL.md +0 -66
  768. package/plugins/copilot-pbr/skills/explore/SKILL.md +0 -373
  769. package/plugins/copilot-pbr/skills/health/SKILL.md +0 -283
  770. package/plugins/copilot-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  771. package/plugins/copilot-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  772. package/plugins/copilot-pbr/skills/help/SKILL.md +0 -193
  773. package/plugins/copilot-pbr/skills/import/SKILL.md +0 -502
  774. package/plugins/copilot-pbr/skills/milestone/SKILL.md +0 -806
  775. package/plugins/copilot-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  776. package/plugins/copilot-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  777. package/plugins/copilot-pbr/skills/note/SKILL.md +0 -213
  778. package/plugins/copilot-pbr/skills/pause/SKILL.md +0 -247
  779. package/plugins/copilot-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  780. package/plugins/copilot-pbr/skills/plan/SKILL.md +0 -662
  781. package/plugins/copilot-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  782. package/plugins/copilot-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  783. package/plugins/copilot-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  784. package/plugins/copilot-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  785. package/plugins/copilot-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  786. package/plugins/copilot-pbr/skills/quick/SKILL.md +0 -376
  787. package/plugins/copilot-pbr/skills/resume/SKILL.md +0 -399
  788. package/plugins/copilot-pbr/skills/review/SKILL.md +0 -653
  789. package/plugins/copilot-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  790. package/plugins/copilot-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  791. package/plugins/copilot-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  792. package/plugins/copilot-pbr/skills/scan/SKILL.md +0 -299
  793. package/plugins/copilot-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  794. package/plugins/copilot-pbr/skills/setup/SKILL.md +0 -296
  795. package/plugins/copilot-pbr/skills/shared/commit-planning-docs.md +0 -36
  796. package/plugins/copilot-pbr/skills/shared/config-loading.md +0 -103
  797. package/plugins/copilot-pbr/skills/shared/context-budget.md +0 -41
  798. package/plugins/copilot-pbr/skills/shared/context-loader-task.md +0 -87
  799. package/plugins/copilot-pbr/skills/shared/digest-select.md +0 -80
  800. package/plugins/copilot-pbr/skills/shared/domain-probes.md +0 -126
  801. package/plugins/copilot-pbr/skills/shared/error-recovery-strategies.md +0 -51
  802. package/plugins/copilot-pbr/skills/shared/error-reporting.md +0 -81
  803. package/plugins/copilot-pbr/skills/shared/gate-prompts.md +0 -389
  804. package/plugins/copilot-pbr/skills/shared/phase-argument-parsing.md +0 -46
  805. package/plugins/copilot-pbr/skills/shared/progress-display.md +0 -53
  806. package/plugins/copilot-pbr/skills/shared/revision-loop.md +0 -82
  807. package/plugins/copilot-pbr/skills/shared/state-loading.md +0 -63
  808. package/plugins/copilot-pbr/skills/shared/state-update.md +0 -162
  809. package/plugins/copilot-pbr/skills/shared/universal-anti-patterns.md +0 -38
  810. package/plugins/copilot-pbr/skills/status/SKILL.md +0 -362
  811. package/plugins/copilot-pbr/skills/statusline/SKILL.md +0 -149
  812. package/plugins/copilot-pbr/skills/todo/SKILL.md +0 -279
  813. package/plugins/copilot-pbr/templates/CONTEXT.md.tmpl +0 -53
  814. package/plugins/copilot-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  815. package/plugins/copilot-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  816. package/plugins/copilot-pbr/templates/ROADMAP.md.tmpl +0 -41
  817. package/plugins/copilot-pbr/templates/SUMMARY.md.tmpl +0 -82
  818. package/plugins/copilot-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  819. package/plugins/copilot-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  820. package/plugins/copilot-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  821. package/plugins/copilot-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  822. package/plugins/copilot-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  823. package/plugins/copilot-pbr/templates/codebase/STACK.md.tmpl +0 -78
  824. package/plugins/copilot-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  825. package/plugins/copilot-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  826. package/plugins/copilot-pbr/templates/continue-here.md.tmpl +0 -74
  827. package/plugins/copilot-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  828. package/plugins/copilot-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  829. package/plugins/copilot-pbr/templates/research/STACK.md.tmpl +0 -71
  830. package/plugins/copilot-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  831. package/plugins/copilot-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  832. package/plugins/copilot-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  833. package/plugins/copilot-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  834. package/plugins/cursor-pbr/.cursor-plugin/plugin.json +0 -32
  835. package/plugins/cursor-pbr/CHANGELOG.md +0 -15
  836. package/plugins/cursor-pbr/README.md +0 -123
  837. package/plugins/cursor-pbr/agents/audit.md +0 -178
  838. package/plugins/cursor-pbr/agents/codebase-mapper.md +0 -150
  839. package/plugins/cursor-pbr/agents/debugger.md +0 -181
  840. package/plugins/cursor-pbr/agents/executor.md +0 -266
  841. package/plugins/cursor-pbr/agents/general.md +0 -87
  842. package/plugins/cursor-pbr/agents/integration-checker.md +0 -118
  843. package/plugins/cursor-pbr/agents/plan-checker.md +0 -207
  844. package/plugins/cursor-pbr/agents/planner.md +0 -237
  845. package/plugins/cursor-pbr/agents/researcher.md +0 -185
  846. package/plugins/cursor-pbr/agents/synthesizer.md +0 -125
  847. package/plugins/cursor-pbr/agents/verifier.md +0 -227
  848. package/plugins/cursor-pbr/assets/.gitkeep +0 -0
  849. package/plugins/cursor-pbr/assets/logo.svg +0 -21
  850. package/plugins/cursor-pbr/hooks/hooks.json +0 -224
  851. package/plugins/cursor-pbr/references/agent-anti-patterns.md +0 -25
  852. package/plugins/cursor-pbr/references/agent-contracts.md +0 -297
  853. package/plugins/cursor-pbr/references/agent-interactions.md +0 -135
  854. package/plugins/cursor-pbr/references/agent-teams.md +0 -55
  855. package/plugins/cursor-pbr/references/checkpoints.md +0 -158
  856. package/plugins/cursor-pbr/references/common-bug-patterns.md +0 -14
  857. package/plugins/cursor-pbr/references/config-reference.md +0 -442
  858. package/plugins/cursor-pbr/references/continuation-format.md +0 -213
  859. package/plugins/cursor-pbr/references/deviation-rules.md +0 -113
  860. package/plugins/cursor-pbr/references/git-integration.md +0 -227
  861. package/plugins/cursor-pbr/references/integration-patterns.md +0 -118
  862. package/plugins/cursor-pbr/references/model-profiles.md +0 -100
  863. package/plugins/cursor-pbr/references/model-selection.md +0 -32
  864. package/plugins/cursor-pbr/references/pbr-rules.md +0 -195
  865. package/plugins/cursor-pbr/references/pbr-tools-cli.md +0 -285
  866. package/plugins/cursor-pbr/references/plan-authoring.md +0 -182
  867. package/plugins/cursor-pbr/references/plan-format.md +0 -288
  868. package/plugins/cursor-pbr/references/planning-config.md +0 -214
  869. package/plugins/cursor-pbr/references/questioning.md +0 -215
  870. package/plugins/cursor-pbr/references/reading-verification.md +0 -128
  871. package/plugins/cursor-pbr/references/stub-patterns.md +0 -161
  872. package/plugins/cursor-pbr/references/subagent-coordination.md +0 -120
  873. package/plugins/cursor-pbr/references/ui-formatting.md +0 -444
  874. package/plugins/cursor-pbr/references/verification-patterns.md +0 -199
  875. package/plugins/cursor-pbr/references/wave-execution.md +0 -96
  876. package/plugins/cursor-pbr/rules/pbr-workflow.mdc +0 -48
  877. package/plugins/cursor-pbr/setup.ps1 +0 -78
  878. package/plugins/cursor-pbr/setup.sh +0 -83
  879. package/plugins/cursor-pbr/skills/audit/SKILL.md +0 -331
  880. package/plugins/cursor-pbr/skills/begin/SKILL.md +0 -589
  881. package/plugins/cursor-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  882. package/plugins/cursor-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  883. package/plugins/cursor-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  884. package/plugins/cursor-pbr/skills/begin/templates/config.json.tmpl +0 -64
  885. package/plugins/cursor-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  886. package/plugins/cursor-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  887. package/plugins/cursor-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  888. package/plugins/cursor-pbr/skills/build/SKILL.md +0 -961
  889. package/plugins/cursor-pbr/skills/config/SKILL.md +0 -252
  890. package/plugins/cursor-pbr/skills/continue/SKILL.md +0 -159
  891. package/plugins/cursor-pbr/skills/dashboard/SKILL.md +0 -44
  892. package/plugins/cursor-pbr/skills/debug/SKILL.md +0 -512
  893. package/plugins/cursor-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  894. package/plugins/cursor-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  895. package/plugins/cursor-pbr/skills/discuss/SKILL.md +0 -354
  896. package/plugins/cursor-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  897. package/plugins/cursor-pbr/skills/discuss/templates/decision-categories.md +0 -10
  898. package/plugins/cursor-pbr/skills/do/SKILL.md +0 -67
  899. package/plugins/cursor-pbr/skills/explore/SKILL.md +0 -376
  900. package/plugins/cursor-pbr/skills/health/SKILL.md +0 -283
  901. package/plugins/cursor-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  902. package/plugins/cursor-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  903. package/plugins/cursor-pbr/skills/help/SKILL.md +0 -193
  904. package/plugins/cursor-pbr/skills/import/SKILL.md +0 -505
  905. package/plugins/cursor-pbr/skills/milestone/SKILL.md +0 -807
  906. package/plugins/cursor-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  907. package/plugins/cursor-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  908. package/plugins/cursor-pbr/skills/note/SKILL.md +0 -214
  909. package/plugins/cursor-pbr/skills/pause/SKILL.md +0 -248
  910. package/plugins/cursor-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  911. package/plugins/cursor-pbr/skills/plan/SKILL.md +0 -663
  912. package/plugins/cursor-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  913. package/plugins/cursor-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  914. package/plugins/cursor-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  915. package/plugins/cursor-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  916. package/plugins/cursor-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  917. package/plugins/cursor-pbr/skills/quick/SKILL.md +0 -376
  918. package/plugins/cursor-pbr/skills/resume/SKILL.md +0 -399
  919. package/plugins/cursor-pbr/skills/review/SKILL.md +0 -654
  920. package/plugins/cursor-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  921. package/plugins/cursor-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  922. package/plugins/cursor-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  923. package/plugins/cursor-pbr/skills/scan/SKILL.md +0 -300
  924. package/plugins/cursor-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  925. package/plugins/cursor-pbr/skills/setup/SKILL.md +0 -296
  926. package/plugins/cursor-pbr/skills/shared/commit-planning-docs.md +0 -36
  927. package/plugins/cursor-pbr/skills/shared/config-loading.md +0 -103
  928. package/plugins/cursor-pbr/skills/shared/context-budget.md +0 -41
  929. package/plugins/cursor-pbr/skills/shared/context-loader-task.md +0 -87
  930. package/plugins/cursor-pbr/skills/shared/digest-select.md +0 -80
  931. package/plugins/cursor-pbr/skills/shared/domain-probes.md +0 -126
  932. package/plugins/cursor-pbr/skills/shared/error-recovery-strategies.md +0 -51
  933. package/plugins/cursor-pbr/skills/shared/error-reporting.md +0 -81
  934. package/plugins/cursor-pbr/skills/shared/gate-prompts.md +0 -389
  935. package/plugins/cursor-pbr/skills/shared/phase-argument-parsing.md +0 -46
  936. package/plugins/cursor-pbr/skills/shared/progress-display.md +0 -53
  937. package/plugins/cursor-pbr/skills/shared/revision-loop.md +0 -82
  938. package/plugins/cursor-pbr/skills/shared/state-loading.md +0 -63
  939. package/plugins/cursor-pbr/skills/shared/state-update.md +0 -162
  940. package/plugins/cursor-pbr/skills/shared/universal-anti-patterns.md +0 -38
  941. package/plugins/cursor-pbr/skills/status/SKILL.md +0 -362
  942. package/plugins/cursor-pbr/skills/statusline/SKILL.md +0 -150
  943. package/plugins/cursor-pbr/skills/todo/SKILL.md +0 -280
  944. package/plugins/cursor-pbr/templates/CONTEXT.md.tmpl +0 -53
  945. package/plugins/cursor-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  946. package/plugins/cursor-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  947. package/plugins/cursor-pbr/templates/ROADMAP.md.tmpl +0 -41
  948. package/plugins/cursor-pbr/templates/SUMMARY.md.tmpl +0 -82
  949. package/plugins/cursor-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  950. package/plugins/cursor-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  951. package/plugins/cursor-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  952. package/plugins/cursor-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  953. package/plugins/cursor-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  954. package/plugins/cursor-pbr/templates/codebase/STACK.md.tmpl +0 -78
  955. package/plugins/cursor-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  956. package/plugins/cursor-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  957. package/plugins/cursor-pbr/templates/continue-here.md.tmpl +0 -74
  958. package/plugins/cursor-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  959. package/plugins/cursor-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  960. package/plugins/cursor-pbr/templates/research/STACK.md.tmpl +0 -71
  961. package/plugins/cursor-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  962. package/plugins/cursor-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  963. package/plugins/cursor-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  964. package/plugins/cursor-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  965. package/plugins/pbr/references/agent-interactions.md +0 -134
  966. package/plugins/pbr/references/pbr-rules.md +0 -194
  967. package/plugins/pbr/references/pbr-tools-cli.md +0 -285
  968. package/plugins/pbr/references/planning-config.md +0 -213
  969. package/plugins/pbr/references/subagent-coordination.md +0 -119
  970. package/plugins/pbr/references/ui-formatting.md +0 -444
  971. package/plugins/pbr/scripts/validate-plugin-structure.js +0 -183
  972. package/plugins/pbr/skills/milestone/templates/audit-report.md.tmpl +0 -48
  973. package/plugins/pbr/skills/shared/error-recovery-strategies.md +0 -51
  974. package/plugins/pbr/skills/shared/progress-display.md +0 -53
  975. package/plugins/pbr/skills/shared/state-loading.md +0 -62
  976. package/plugins/pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -97
  977. package/plugins/pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  978. package/plugins/pbr/templates/research/STACK.md.tmpl +0 -71
  979. package/plugins/pbr/templates/research/SUMMARY.md.tmpl +0 -112
  980. package/plugins/pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  981. package/plugins/pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  982. package/plugins/pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  983. /package/plugins/pbr/references/{agent-anti-patterns.md → archive/agent-anti-patterns.md} +0 -0
@@ -0,0 +1,1043 @@
1
+ /**
2
+ * lib/phase.js — Phase operations for Plan-Build-Run tools.
3
+ *
4
+ * Handles phase directory management (add/remove/list), plan indexing,
5
+ * must-haves collection, and comprehensive phase info.
6
+ */
7
+
8
+ const fs = require('fs');
9
+ const path = require('path');
10
+ const {
11
+ parseYamlFrontmatter,
12
+ findFiles,
13
+ countMustHaves,
14
+ determinePhaseStatus,
15
+ lockedFileUpdate
16
+ } = require('./core');
17
+ const { statePatch, stateUpdateProgress, updateFrontmatterField } = require('./state');
18
+ const {
19
+ roadmapAppendPhase,
20
+ roadmapRemovePhase,
21
+ roadmapRenumberPhases
22
+ } = require('./roadmap');
23
+
24
+ /**
25
+ * Parse a markdown file's YAML frontmatter and return as JSON.
26
+ * Wraps parseYamlFrontmatter().
27
+ *
28
+ * @param {string} filePath - Path to markdown file
29
+ * @returns {object} Parsed frontmatter or error
30
+ */
31
+ function frontmatter(filePath) {
32
+ const resolved = path.resolve(filePath);
33
+ if (!fs.existsSync(resolved)) {
34
+ return { error: `File not found: ${resolved}` };
35
+ }
36
+ const content = fs.readFileSync(resolved, 'utf8');
37
+ return parseYamlFrontmatter(content);
38
+ }
39
+
40
+ /**
41
+ * Plan inventory for a phase, grouped by wave.
42
+ *
43
+ * @param {string} phaseNum - Phase number
44
+ * @param {string} [planningDir] - Path to .planning directory
45
+ * @returns {object} Plan index
46
+ */
47
+ function planIndex(phaseNum, planningDir) {
48
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
49
+ const phasesDir = path.join(dir, 'phases');
50
+ if (!fs.existsSync(phasesDir)) {
51
+ return { error: 'No phases directory found' };
52
+ }
53
+
54
+ // Find phase directory matching the number
55
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true })
56
+ .filter(e => e.isDirectory());
57
+
58
+ const phaseDir = entries.find(e => e.name.startsWith(phaseNum.padStart(2, '0') + '-'));
59
+ if (!phaseDir) {
60
+ return { error: `No phase directory found matching phase ${phaseNum}` };
61
+ }
62
+
63
+ const fullDir = path.join(phasesDir, phaseDir.name);
64
+ const planFiles = findFiles(fullDir, /PLAN.*\.md$/i);
65
+
66
+ const plans = [];
67
+ const waves = {};
68
+
69
+ for (const file of planFiles) {
70
+ const content = fs.readFileSync(path.join(fullDir, file), 'utf8');
71
+ const fm = parseYamlFrontmatter(content);
72
+
73
+ const plan = {
74
+ file,
75
+ plan_id: fm.plan || file.replace(/^PLAN-?/i, '').replace(/\.md$/i, ''),
76
+ wave: parseInt(fm.wave, 10) || 1,
77
+ type: fm.type || 'unknown',
78
+ autonomous: fm.autonomous !== false,
79
+ depends_on: fm.depends_on || [],
80
+ gap_closure: fm.gap_closure || false,
81
+ has_summary: fs.existsSync(path.join(fullDir, `SUMMARY-${fm.plan || ''}.md`)),
82
+ must_haves_count: countMustHaves(fm.must_haves)
83
+ };
84
+
85
+ plans.push(plan);
86
+
87
+ const waveKey = `wave_${plan.wave}`;
88
+ if (!waves[waveKey]) waves[waveKey] = [];
89
+ waves[waveKey].push(plan.plan_id);
90
+ }
91
+
92
+ return {
93
+ phase: phaseDir.name,
94
+ total_plans: plans.length,
95
+ plans,
96
+ waves
97
+ };
98
+ }
99
+
100
+ /**
101
+ * Collect all must-haves from all PLAN.md files in a phase.
102
+ * Returns per-plan grouping + flat deduplicated list + total count.
103
+ *
104
+ * @param {string} phaseNum - Phase number
105
+ * @param {string} [planningDir] - Path to .planning directory
106
+ */
107
+ function mustHavesCollect(phaseNum, planningDir) {
108
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
109
+ const phasesDir = path.join(dir, 'phases');
110
+ if (!fs.existsSync(phasesDir)) {
111
+ return { error: 'No phases directory found' };
112
+ }
113
+
114
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true })
115
+ .filter(e => e.isDirectory());
116
+ const phaseDir = entries.find(e => e.name.startsWith(phaseNum.padStart(2, '0') + '-'));
117
+ if (!phaseDir) {
118
+ return { error: `No phase directory found matching phase ${phaseNum}` };
119
+ }
120
+
121
+ const fullDir = path.join(phasesDir, phaseDir.name);
122
+ const planFiles = findFiles(fullDir, /PLAN.*\.md$/i);
123
+
124
+ const perPlan = {};
125
+ const allTruths = new Set();
126
+ const allArtifacts = new Set();
127
+ const allKeyLinks = new Set();
128
+
129
+ for (const file of planFiles) {
130
+ const content = fs.readFileSync(path.join(fullDir, file), 'utf8');
131
+ const fm = parseYamlFrontmatter(content);
132
+ const planId = fm.plan || file.replace(/^PLAN-?/i, '').replace(/\.md$/i, '');
133
+ const mh = fm.must_haves || { truths: [], artifacts: [], key_links: [] };
134
+
135
+ perPlan[planId] = mh;
136
+ (mh.truths || []).forEach(t => allTruths.add(t));
137
+ (mh.artifacts || []).forEach(a => allArtifacts.add(a));
138
+ (mh.key_links || []).forEach(k => allKeyLinks.add(k));
139
+ }
140
+
141
+ const all = {
142
+ truths: [...allTruths],
143
+ artifacts: [...allArtifacts],
144
+ key_links: [...allKeyLinks]
145
+ };
146
+
147
+ return {
148
+ phase: phaseDir.name,
149
+ plans: perPlan,
150
+ all,
151
+ total: all.truths.length + all.artifacts.length + all.key_links.length
152
+ };
153
+ }
154
+
155
+ /**
156
+ * Comprehensive single-phase status combining roadmap, filesystem, and plan data.
157
+ *
158
+ * @param {string} phaseNum - Phase number
159
+ * @param {string} [planningDir] - Path to .planning directory
160
+ */
161
+ function phaseInfo(phaseNum, planningDir) {
162
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
163
+ const { parseRoadmapMd } = require('./roadmap');
164
+ const phasesDir = path.join(dir, 'phases');
165
+ if (!fs.existsSync(phasesDir)) {
166
+ return { error: 'No phases directory found' };
167
+ }
168
+
169
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true })
170
+ .filter(e => e.isDirectory());
171
+ const phaseDir = entries.find(e => e.name.startsWith(phaseNum.padStart(2, '0') + '-'));
172
+ if (!phaseDir) {
173
+ return { error: `No phase directory found matching phase ${phaseNum}` };
174
+ }
175
+
176
+ const fullDir = path.join(phasesDir, phaseDir.name);
177
+
178
+ // Get roadmap info
179
+ let roadmapInfo = null;
180
+ const roadmapPath = path.join(dir, 'ROADMAP.md');
181
+ if (fs.existsSync(roadmapPath)) {
182
+ const roadmapContent = fs.readFileSync(roadmapPath, 'utf8');
183
+ const roadmap = parseRoadmapMd(roadmapContent);
184
+ roadmapInfo = roadmap.phases.find(p => p.number === phaseNum.padStart(2, '0')) || null;
185
+ }
186
+
187
+ // Get plan index
188
+ const plans = planIndex(phaseNum, dir);
189
+
190
+ // Check for verification
191
+ const verificationPath = path.join(fullDir, 'VERIFICATION.md');
192
+ let verification = null;
193
+ if (fs.existsSync(verificationPath)) {
194
+ const vContent = fs.readFileSync(verificationPath, 'utf8');
195
+ verification = parseYamlFrontmatter(vContent);
196
+ }
197
+
198
+ // Check summaries
199
+ const summaryFiles = findFiles(fullDir, /^SUMMARY-.*\.md$/);
200
+ const summaries = summaryFiles.map(f => {
201
+ const content = fs.readFileSync(path.join(fullDir, f), 'utf8');
202
+ const fm = parseYamlFrontmatter(content);
203
+ return { file: f, plan: fm.plan || f.replace(/^SUMMARY-|\.md$/g, ''), status: fm.status || 'unknown' };
204
+ });
205
+
206
+ // Determine filesystem status
207
+ const planCount = plans.total_plans || 0;
208
+ const completedCount = summaries.filter(s => s.status === 'complete').length;
209
+ const hasVerification = fs.existsSync(verificationPath);
210
+ const fsStatus = determinePhaseStatus(planCount, completedCount, summaryFiles.length, hasVerification, fullDir);
211
+
212
+ return {
213
+ phase: phaseDir.name,
214
+ name: roadmapInfo ? roadmapInfo.name : phaseDir.name.replace(/^\d+-/, ''),
215
+ goal: roadmapInfo ? roadmapInfo.goal : null,
216
+ roadmap_status: roadmapInfo ? roadmapInfo.status : null,
217
+ filesystem_status: fsStatus,
218
+ plans: plans.plans || [],
219
+ plan_count: planCount,
220
+ summaries,
221
+ completed: completedCount,
222
+ verification,
223
+ has_context: fs.existsSync(path.join(fullDir, 'CONTEXT.md'))
224
+ };
225
+ }
226
+
227
+ /**
228
+ * Add a new phase directory (with renumbering and optional ROADMAP.md integration).
229
+ *
230
+ * @param {string} slug - Phase slug
231
+ * @param {string|null} afterPhase - Insert after this phase number
232
+ * @param {string} [planningDir] - Path to .planning directory
233
+ * @param {object} [options] - Optional settings: { goal, dependsOn }
234
+ */
235
+ async function phaseAdd(slug, afterPhase, planningDir, options) {
236
+ // Handle backward compat: if planningDir is an object, it's actually options
237
+ if (typeof planningDir === 'object' && planningDir !== null && !options) {
238
+ options = planningDir;
239
+ planningDir = undefined;
240
+ }
241
+ const opts = options || {};
242
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
243
+ const phasesDir = path.join(dir, 'phases');
244
+ if (!fs.existsSync(phasesDir)) {
245
+ fs.mkdirSync(phasesDir, { recursive: true });
246
+ }
247
+
248
+ // Determine next phase number
249
+ const existing = fs.readdirSync(phasesDir)
250
+ .filter(d => /^\d+-/.test(d))
251
+ .map(d => parseInt(d.split('-')[0], 10))
252
+ .sort((a, b) => a - b);
253
+
254
+ let newNum;
255
+ if (afterPhase) {
256
+ const after = parseInt(afterPhase, 10);
257
+ // Find the next number after the specified phase
258
+ const higher = existing.filter(n => n > after);
259
+ if (higher.length > 0) {
260
+ // Need to renumber: insert between after and next
261
+ newNum = after + 1;
262
+ // Renumber all phases >= newNum
263
+ for (const dirName of fs.readdirSync(phasesDir).sort().reverse()) {
264
+ const num = parseInt(dirName.split('-')[0], 10);
265
+ if (num >= newNum) {
266
+ const newName = dirName.replace(/^\d+/, String(num + 1).padStart(2, '0'));
267
+ fs.renameSync(path.join(phasesDir, dirName), path.join(phasesDir, newName));
268
+ }
269
+ }
270
+ } else {
271
+ newNum = after + 1;
272
+ }
273
+ } else {
274
+ newNum = existing.length > 0 ? Math.max(...existing) + 1 : 1;
275
+ }
276
+
277
+ const dirName = `${String(newNum).padStart(2, '0')}-${slug}`;
278
+ const fullPath = path.join(phasesDir, dirName);
279
+ fs.mkdirSync(fullPath, { recursive: true });
280
+
281
+ // ROADMAP.md integration
282
+ let roadmapUpdated = false;
283
+ const roadmapPath = path.join(dir, 'ROADMAP.md');
284
+ if (fs.existsSync(roadmapPath)) {
285
+ const phaseName = slug.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase());
286
+ const depNum = opts.dependsOn ? parseInt(opts.dependsOn, 10) : null;
287
+ const result = await roadmapAppendPhase(dir, newNum, phaseName, opts.goal || null, depNum);
288
+ roadmapUpdated = result.success !== false;
289
+ }
290
+
291
+ return {
292
+ phase: newNum,
293
+ slug,
294
+ directory: dirName,
295
+ path: fullPath,
296
+ renumbered: afterPhase ? true : false,
297
+ goal: opts.goal || null,
298
+ depends_on: opts.dependsOn || null,
299
+ roadmap_updated: roadmapUpdated
300
+ };
301
+ }
302
+
303
+ /**
304
+ * Remove a phase directory (with renumbering, ROADMAP.md cleanup, STATE.md adjustment).
305
+ * Refuses to remove current or completed phases.
306
+ *
307
+ * @param {string} phaseNum - Phase number to remove
308
+ * @param {string} [planningDir] - Path to .planning directory
309
+ */
310
+ async function phaseRemove(phaseNum, planningDir) {
311
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
312
+ const phasesDir = path.join(dir, 'phases');
313
+ const num = parseInt(phaseNum, 10);
314
+ const padded = String(num).padStart(2, '0');
315
+ const dirs = fs.readdirSync(phasesDir).filter(d => d.startsWith(padded + '-'));
316
+
317
+ if (dirs.length === 0) {
318
+ return { removed: false, error: `Phase ${phaseNum} not found` };
319
+ }
320
+
321
+ const dirName = dirs[0];
322
+ const fullPath = path.join(phasesDir, dirName);
323
+
324
+ // Safety check: refuse to remove current phase
325
+ const statePath = path.join(dir, 'STATE.md');
326
+ let currentPhase = null;
327
+ if (fs.existsSync(statePath)) {
328
+ const stateContent = fs.readFileSync(statePath, 'utf8');
329
+ const fm = parseYamlFrontmatter(stateContent);
330
+ currentPhase = fm.current_phase != null ? parseInt(fm.current_phase, 10) : null;
331
+ if (currentPhase === num) {
332
+ return { removed: false, error: `Cannot remove phase ${phaseNum}: it is the current active phase` };
333
+ }
334
+ }
335
+
336
+ // Safety check: refuse to remove completed phase (has passing VERIFICATION.md)
337
+ const verPath = path.join(fullPath, 'VERIFICATION.md');
338
+ if (fs.existsSync(verPath)) {
339
+ const verContent = fs.readFileSync(verPath, 'utf8');
340
+ const verFm = parseYamlFrontmatter(verContent);
341
+ if (verFm.result === 'passed') {
342
+ return { removed: false, error: `Cannot remove phase ${phaseNum}: it has passed verification` };
343
+ }
344
+ }
345
+
346
+ // Check if phase has artifacts (still allow removal if empty)
347
+ const contents = fs.readdirSync(fullPath);
348
+ if (contents.length > 0) {
349
+ return {
350
+ removed: false,
351
+ error: `Phase ${phaseNum} (${dirName}) has ${contents.length} files. Remove contents first or use --force.`,
352
+ files: contents
353
+ };
354
+ }
355
+
356
+ fs.rmdirSync(fullPath);
357
+
358
+ // Renumber subsequent phases on disk
359
+ const allDirs = fs.readdirSync(phasesDir)
360
+ .filter(d => /^\d+-/.test(d))
361
+ .sort();
362
+
363
+ for (const d of allDirs) {
364
+ const dNum = parseInt(d.split('-')[0], 10);
365
+ if (dNum > num) {
366
+ const newName = d.replace(/^\d+/, String(dNum - 1).padStart(2, '0'));
367
+ fs.renameSync(path.join(phasesDir, d), path.join(phasesDir, newName));
368
+ }
369
+ }
370
+
371
+ // ROADMAP.md integration
372
+ let roadmapUpdated = false;
373
+ const roadmapPath = path.join(dir, 'ROADMAP.md');
374
+ if (fs.existsSync(roadmapPath)) {
375
+ await roadmapRemovePhase(dir, num);
376
+ await roadmapRenumberPhases(dir, num + 1, -1);
377
+ roadmapUpdated = true;
378
+ }
379
+
380
+ // STATE.md adjustment: if current_phase > removed phase, decrement it
381
+ let stateUpdated = false;
382
+ if (currentPhase !== null && currentPhase > num && fs.existsSync(statePath)) {
383
+ const stateContent = fs.readFileSync(statePath, 'utf8');
384
+ const newContent = updateFrontmatterField(stateContent, 'current_phase', currentPhase - 1);
385
+ fs.writeFileSync(statePath, newContent, 'utf8');
386
+ stateUpdated = true;
387
+ }
388
+
389
+ return {
390
+ removed: true,
391
+ directory: dirName,
392
+ renumbered: true,
393
+ roadmap_updated: roadmapUpdated,
394
+ state_updated: stateUpdated
395
+ };
396
+ }
397
+
398
+ /**
399
+ * List all phase directories with status.
400
+ *
401
+ * @param {string} [planningDir] - Path to .planning directory
402
+ */
403
+ function phaseList(planningDir, opts = {}) {
404
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
405
+ const phasesDir = path.join(dir, 'phases');
406
+ if (!fs.existsSync(phasesDir)) {
407
+ return { phases: [] };
408
+ }
409
+
410
+ let phases = fs.readdirSync(phasesDir)
411
+ .filter(d => /^\d+-/.test(d))
412
+ .sort()
413
+ .map(d => {
414
+ const num = parseInt(d.split('-')[0], 10);
415
+ const slug = d.replace(/^\d+-/, '');
416
+ const fullPath = path.join(phasesDir, d);
417
+ const files = fs.readdirSync(fullPath);
418
+ const hasPlan = files.some(f => /^PLAN/i.test(f));
419
+ const hasSummary = files.some(f => /^SUMMARY/i.test(f));
420
+ const hasVerification = files.some(f => /^VERIFICATION/i.test(f));
421
+ // Determine status from filesystem artifacts
422
+ let status = 'pending';
423
+ if (hasVerification) status = 'verified';
424
+ else if (hasSummary) status = 'built';
425
+ else if (hasPlan) status = 'planned';
426
+ return { num, slug, directory: d, files: files.length, hasPlan, hasSummary, hasVerification, status };
427
+ });
428
+
429
+ // Apply --status filter
430
+ if (opts.status) {
431
+ phases = phases.filter(p => p.status === opts.status);
432
+ }
433
+
434
+ // Apply --before filter
435
+ if (opts.before) {
436
+ const beforeNum = parseInt(opts.before, 10);
437
+ phases = phases.filter(p => p.num < beforeNum);
438
+ }
439
+
440
+ return { phases };
441
+ }
442
+
443
+ /**
444
+ * Extract frontmatter-only stats from all SUMMARY.md files across a milestone's phases.
445
+ * Never reads SUMMARY body content — only YAML frontmatter.
446
+ *
447
+ * Strategy for finding phases:
448
+ * 1. Check milestone archive: .planning/milestones/v{version}/phases/
449
+ * 2. Fall back to active phases dir: .planning/phases/
450
+ * matching phase numbers extracted from ROADMAP.md milestone section.
451
+ *
452
+ * @param {string} version - Milestone version string (e.g. "5.0", "6.0")
453
+ * @param {string} [planningDir] - Path to .planning directory
454
+ * @returns {object} Milestone stats with per-phase summaries and aggregated fields
455
+ */
456
+ function milestoneStats(version, planningDir) {
457
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
458
+
459
+ const phases = [];
460
+
461
+ // --- Strategy 1: Check milestone archive ---
462
+ const archivePhasesDir = path.join(dir, 'milestones', `v${version}`, 'phases');
463
+ if (fs.existsSync(archivePhasesDir)) {
464
+ const phaseDirs = fs.readdirSync(archivePhasesDir, { withFileTypes: true })
465
+ .filter(e => e.isDirectory() && /^\d+-/.test(e.name))
466
+ .sort((a, b) => a.name.localeCompare(b.name));
467
+
468
+ for (const phaseEntry of phaseDirs) {
469
+ const phaseData = _collectPhaseStats(path.join(archivePhasesDir, phaseEntry.name), phaseEntry.name);
470
+ if (phaseData) phases.push(phaseData);
471
+ }
472
+ } else {
473
+ // --- Strategy 2: Parse ROADMAP.md to find phase numbers for this milestone ---
474
+ const roadmapPath = path.join(dir, 'ROADMAP.md');
475
+ const phaseNums = _extractMilestonePhaseNums(roadmapPath, version);
476
+ const phasesDir = path.join(dir, 'phases');
477
+
478
+ if (fs.existsSync(phasesDir) && phaseNums.length > 0) {
479
+ const allDirs = fs.readdirSync(phasesDir, { withFileTypes: true })
480
+ .filter(e => e.isDirectory() && /^\d+-/.test(e.name))
481
+ .sort((a, b) => a.name.localeCompare(b.name));
482
+
483
+ for (const phaseEntry of allDirs) {
484
+ const num = parseInt(phaseEntry.name.split('-')[0], 10);
485
+ if (phaseNums.includes(num)) {
486
+ const phaseData = _collectPhaseStats(path.join(phasesDir, phaseEntry.name), phaseEntry.name);
487
+ if (phaseData) phases.push(phaseData);
488
+ }
489
+ }
490
+ }
491
+ }
492
+
493
+ // --- Aggregate across all phases ---
494
+ const providesSet = new Set();
495
+ const keyFilesSet = new Set();
496
+ const patternsSet = new Set();
497
+ const allKeyDecisions = [];
498
+ const allDeferred = [];
499
+ const totalMetrics = { tasks_completed: 0, commits: 0, files_changed: 0 };
500
+
501
+ for (const phase of phases) {
502
+ for (const summary of phase.summaries) {
503
+ (summary.provides || []).forEach(v => providesSet.add(v));
504
+ (summary.key_files || []).forEach(v => keyFilesSet.add(v));
505
+ (summary.patterns || []).forEach(v => patternsSet.add(v));
506
+ (summary.key_decisions || []).forEach(v => allKeyDecisions.push(v));
507
+ (summary.deferred || []).forEach(v => allDeferred.push(v));
508
+ const m = summary.metrics || {};
509
+ totalMetrics.tasks_completed += parseInt(m.tasks_completed, 10) || 0;
510
+ totalMetrics.commits += parseInt(m.commits, 10) || 0;
511
+ totalMetrics.files_changed += parseInt(m.files_changed, 10) || 0;
512
+ }
513
+ }
514
+
515
+ return {
516
+ version,
517
+ phase_count: phases.length,
518
+ phases,
519
+ aggregated: {
520
+ all_provides: [...providesSet],
521
+ all_key_files: [...keyFilesSet],
522
+ all_key_decisions: allKeyDecisions,
523
+ all_patterns: [...patternsSet],
524
+ all_deferred: allDeferred,
525
+ total_metrics: totalMetrics
526
+ }
527
+ };
528
+ }
529
+
530
+ /**
531
+ * Collect frontmatter-only stats from all SUMMARY*.md files in a single phase directory.
532
+ *
533
+ * @param {string} fullDir - Full path to phase directory
534
+ * @param {string} dirName - Directory name (e.g. "46-agent-contracts")
535
+ * @returns {object}
536
+ */
537
+ function _collectPhaseStats(fullDir, dirName) {
538
+ const numStr = dirName.split('-')[0];
539
+ const name = dirName.replace(/^\d+-/, '');
540
+
541
+ const summaryFiles = findFiles(fullDir, /^SUMMARY.*\.md$/i);
542
+ const summaries = [];
543
+
544
+ for (const file of summaryFiles) {
545
+ const filePath = path.join(fullDir, file);
546
+ const content = fs.readFileSync(filePath, 'utf8');
547
+
548
+ // Extract ONLY the YAML frontmatter — never read body content
549
+ const fm = parseYamlFrontmatter(content);
550
+
551
+ // Collect only the documented frontmatter fields
552
+ const entry = {};
553
+ const fields = ['phase', 'plan', 'status', 'provides', 'requires', 'key_files',
554
+ 'key_decisions', 'patterns', 'metrics', 'deferred', 'tags'];
555
+ for (const field of fields) {
556
+ if (fm[field] !== undefined) {
557
+ entry[field] = fm[field];
558
+ }
559
+ }
560
+ summaries.push(entry);
561
+ }
562
+
563
+ return {
564
+ number: numStr,
565
+ name,
566
+ summaries
567
+ };
568
+ }
569
+
570
+ /**
571
+ * Parse ROADMAP.md to find phase numbers belonging to a milestone version.
572
+ * Scans for milestone section headers containing the version string, then
573
+ * collects phase numbers from "### Phase N:" headings or "Phases N-M" text.
574
+ *
575
+ * @param {string} roadmapPath - Path to ROADMAP.md
576
+ * @param {string} version - Version string (e.g. "5.0")
577
+ * @returns {number[]} Array of phase numbers
578
+ */
579
+ function _extractMilestonePhaseNums(roadmapPath, version) {
580
+ if (!fs.existsSync(roadmapPath)) return [];
581
+
582
+ const content = fs.readFileSync(roadmapPath, 'utf8');
583
+ const lines = content.split(/\r?\n/);
584
+
585
+ const phaseNums = [];
586
+ let inMilestoneSection = false;
587
+
588
+ for (let i = 0; i < lines.length; i++) {
589
+ const line = lines[i];
590
+
591
+ // Detect milestone section header (## Milestone: ... (vX.Y) or containing version)
592
+ if (/^##\s+Milestone:/i.test(line)) {
593
+ inMilestoneSection = line.includes(`v${version}`) || line.includes(`(${version})`);
594
+ continue;
595
+ }
596
+
597
+ // If we hit a new ## section (not ###), exit the milestone section
598
+ if (/^##\s+[^#]/.test(line)) {
599
+ if (inMilestoneSection) break;
600
+ continue;
601
+ }
602
+
603
+ if (!inMilestoneSection) continue;
604
+
605
+ // Extract phase numbers from "### Phase N:" headings
606
+ const phaseHeading = line.match(/^###\s+Phase\s+(\d+)/i);
607
+ if (phaseHeading) {
608
+ phaseNums.push(parseInt(phaseHeading[1], 10));
609
+ continue;
610
+ }
611
+
612
+ // Extract from "Phases N-M" or "Phase N" text
613
+ const phaseRange = line.match(/Phases?\s+(\d+)(?:-(\d+))?/gi);
614
+ if (phaseRange) {
615
+ for (const match of phaseRange) {
616
+ const rangeMatch = match.match(/(\d+)(?:-(\d+))?/);
617
+ if (rangeMatch) {
618
+ const start = parseInt(rangeMatch[1], 10);
619
+ const end = rangeMatch[2] ? parseInt(rangeMatch[2], 10) : start;
620
+ for (let n = start; n <= end; n++) {
621
+ if (!phaseNums.includes(n)) phaseNums.push(n);
622
+ }
623
+ }
624
+ }
625
+ }
626
+
627
+ // Row entries in phase overview tables: | 51 | CLI Foundation | ...
628
+ const tableRow = line.match(/^\|\s*(\d+)\s*\|/);
629
+ if (tableRow) {
630
+ const n = parseInt(tableRow[1], 10);
631
+ if (!phaseNums.includes(n)) phaseNums.push(n);
632
+ }
633
+ }
634
+
635
+ return phaseNums;
636
+ }
637
+
638
+ /**
639
+ * Mark a phase as complete: update ROADMAP.md progress table and STATE.md.
640
+ *
641
+ * Atomically updates ROADMAP.md (status → Complete, date appended, checklist checked)
642
+ * and STATE.md (advance to next phase, reset plans_complete, set status).
643
+ *
644
+ * @param {string} phaseNum - Phase number to complete (string)
645
+ * @param {string} [planningDir] - Path to .planning directory
646
+ * @returns {object} Result with success, completed_phase, next_phase, etc.
647
+ */
648
+ async function phaseComplete(phaseNum, planningDir) {
649
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
650
+ const statePath = path.join(dir, 'STATE.md');
651
+ const roadmapPath = path.join(dir, 'ROADMAP.md');
652
+
653
+ if (!fs.existsSync(statePath)) {
654
+ return { success: false, error: 'STATE.md not found' };
655
+ }
656
+ if (!fs.existsSync(roadmapPath)) {
657
+ return { success: false, error: 'ROADMAP.md not found' };
658
+ }
659
+
660
+ const num = parseInt(phaseNum, 10);
661
+ const today = new Date().toISOString().slice(0, 10);
662
+
663
+ // --- Parse ROADMAP.md progress table to find all phases and the target row ---
664
+ const roadmapContent = fs.readFileSync(roadmapPath, 'utf8');
665
+ const lines = roadmapContent.split(/\r?\n/);
666
+
667
+ // Find all phase entries in progress table rows
668
+ const phaseEntries = [];
669
+ let targetRowIdx = -1;
670
+
671
+ for (let i = 0; i < lines.length; i++) {
672
+ const match = lines[i].match(/^\|\s*(\d+)\.\s+(.+?)\s*\|/);
673
+ if (match) {
674
+ const entryNum = parseInt(match[1], 10);
675
+ const entryName = match[2].trim();
676
+ phaseEntries.push({ num: entryNum, name: entryName, lineIdx: i });
677
+ if (entryNum === num) {
678
+ targetRowIdx = i;
679
+ }
680
+ }
681
+ }
682
+
683
+ if (targetRowIdx === -1) {
684
+ return { success: false, error: `Phase ${phaseNum} not found in ROADMAP.md progress table` };
685
+ }
686
+
687
+ // --- Update ROADMAP.md atomically ---
688
+ const roadmapResult = await lockedFileUpdate(roadmapPath, (content) => {
689
+ let updated = content;
690
+ const contentLines = updated.split(/\r?\n/);
691
+ const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
692
+
693
+ // Update the progress table row: replace status column with Complete and add date
694
+ const row = contentLines[targetRowIdx];
695
+ const cols = row.split('|').map(c => c.trim());
696
+ // cols: ['', 'N. Name', 'X/Y', 'Status', '' (trailing)]
697
+ // Find the status column (usually index 3)
698
+ if (cols.length >= 4) {
699
+ cols[3] = ` Complete`;
700
+ // Add date — if there are only 4 cols (+ trailing empty), add a new column
701
+ if (cols.length === 5) {
702
+ // Insert date before the trailing empty
703
+ cols.splice(4, 0, ` ${today} `);
704
+ } else if (cols.length > 5) {
705
+ cols[4] = ` ${today} `;
706
+ }
707
+ contentLines[targetRowIdx] = cols.join('|');
708
+ }
709
+
710
+ // Update phase checklist if present: - [ ] Phase N: → - [x] Phase N:
711
+ const checklistPattern = new RegExp(`^(\\s*- \\[)( )(\\] Phase ${num}[:\\s])`, 'i');
712
+ for (let i = 0; i < contentLines.length; i++) {
713
+ if (checklistPattern.test(contentLines[i])) {
714
+ contentLines[i] = contentLines[i].replace(checklistPattern, '$1x$3');
715
+ }
716
+ }
717
+
718
+ return contentLines.join(lineEnding);
719
+ });
720
+
721
+ if (!roadmapResult.success) {
722
+ return { success: false, error: `Failed to update ROADMAP.md: ${roadmapResult.error}` };
723
+ }
724
+
725
+ // --- Determine next phase ---
726
+ const sortedEntries = phaseEntries.sort((a, b) => a.num - b.num);
727
+ const currentIdx = sortedEntries.findIndex(e => e.num === num);
728
+ const nextEntry = currentIdx !== -1 && currentIdx < sortedEntries.length - 1
729
+ ? sortedEntries[currentIdx + 1]
730
+ : null;
731
+
732
+ const nextPhaseNum = nextEntry ? String(nextEntry.num) : null;
733
+ // Derive slug from name: lowercase, replace spaces with hyphens
734
+ const nextSlug = nextEntry
735
+ ? nextEntry.name.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '')
736
+ : null;
737
+
738
+ // --- Update STATE.md (compound update via statePatch for atomicity) ---
739
+ if (nextEntry) {
740
+ await statePatch(JSON.stringify({
741
+ current_phase: nextPhaseNum,
742
+ plans_complete: '0',
743
+ status: 'planned',
744
+ phase_slug: nextSlug
745
+ }), dir);
746
+ } else {
747
+ // Final phase in milestone
748
+ await statePatch(JSON.stringify({ status: 'verified' }), dir);
749
+ }
750
+
751
+ // --- Check VERIFICATION.md exists (advisory warning) ---
752
+ let verificationMissing = false;
753
+ try {
754
+ const phasesDir = path.join(dir, 'phases');
755
+ const padded = String(num).padStart(2, '0');
756
+ const phaseDirEntry = fs.readdirSync(phasesDir).find(d => d.startsWith(padded + '-'));
757
+ if (phaseDirEntry) {
758
+ const fullPhaseDir = path.join(phasesDir, phaseDirEntry);
759
+ const hasVerification = fs.readdirSync(fullPhaseDir).some(f => /^VERIFICATION(-R\d+)?\.md$/i.test(f));
760
+ if (!hasVerification) {
761
+ verificationMissing = true;
762
+ }
763
+ }
764
+ } catch (_e) {
765
+ // intentionally silent: check is advisory
766
+ }
767
+
768
+ // Recalculate progress
769
+ await stateUpdateProgress(dir);
770
+
771
+ // --- Write .phase-manifest.json aggregating all plan commits ---
772
+ let manifestWritten = false;
773
+ try {
774
+ const phasesDir = path.join(dir, 'phases');
775
+ const padded = String(num).padStart(2, '0');
776
+ const phaseDirEntry = fs.readdirSync(phasesDir).find(d => d.startsWith(padded + '-'));
777
+ if (phaseDirEntry) {
778
+ const fullPhaseDir = path.join(phasesDir, phaseDirEntry);
779
+ const manifest = _buildPhaseManifest(num, fullPhaseDir);
780
+ const manifestPath = path.join(fullPhaseDir, '.phase-manifest.json');
781
+ fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), 'utf8');
782
+ manifestWritten = true;
783
+ }
784
+ } catch (_e) {
785
+ // intentionally silent: manifest is advisory for undo operations
786
+ }
787
+
788
+ return {
789
+ success: true,
790
+ completed_phase: num,
791
+ next_phase: nextPhaseNum ? parseInt(nextPhaseNum, 10) : null,
792
+ next_slug: nextSlug,
793
+ roadmap_updated: true,
794
+ state_updated: true,
795
+ final_phase: nextPhaseNum === null,
796
+ manifest_written: manifestWritten,
797
+ verification_missing: verificationMissing
798
+ };
799
+ }
800
+
801
+ /**
802
+ * Build a phase manifest by collecting commit hashes from all plan SUMMARY.md files.
803
+ *
804
+ * Manifest format:
805
+ * {
806
+ * phase: "NN",
807
+ * completed: "ISO_DATE",
808
+ * commits: [{ hash, message, plan, task }],
809
+ * first_commit: "abc123",
810
+ * last_commit: "def456"
811
+ * }
812
+ *
813
+ * @param {number} phaseNum - Phase number
814
+ * @param {string} phaseDir - Full path to the phase directory
815
+ * @returns {object} Phase manifest
816
+ */
817
+ function _buildPhaseManifest(phaseNum, phaseDir) {
818
+ const summaryFiles = findFiles(phaseDir, /^SUMMARY.*\.md$/i);
819
+ const commits = [];
820
+
821
+ for (const file of summaryFiles) {
822
+ const content = fs.readFileSync(path.join(phaseDir, file), 'utf8');
823
+ const fm = parseYamlFrontmatter(content);
824
+ const planId = fm.plan || file.replace(/^SUMMARY-?/i, '').replace(/\.md$/i, '');
825
+
826
+ // Extract commits from frontmatter metrics or commits field
827
+ if (fm.commits && Array.isArray(fm.commits)) {
828
+ for (const c of fm.commits) {
829
+ commits.push({
830
+ hash: c.hash || c.sha || c,
831
+ message: c.message || '',
832
+ plan: planId,
833
+ task: c.task || null
834
+ });
835
+ }
836
+ }
837
+
838
+ // Also try to parse "Task Commits" section from body
839
+ const taskCommitRegex = /\|\s*(\d+)\s*\|[^|]*\|\s*([0-9a-f]{7,})\s*\|/gi;
840
+ let match;
841
+ while ((match = taskCommitRegex.exec(content)) !== null) {
842
+ const hash = match[2];
843
+ // Avoid duplicates
844
+ if (!commits.some(c => c.hash === hash)) {
845
+ commits.push({
846
+ hash,
847
+ message: '',
848
+ plan: planId,
849
+ task: parseInt(match[1], 10)
850
+ });
851
+ }
852
+ }
853
+ }
854
+
855
+ return {
856
+ phase: String(phaseNum).padStart(2, '0'),
857
+ completed: new Date().toISOString(),
858
+ commits,
859
+ first_commit: commits.length > 0 ? commits[0].hash : null,
860
+ last_commit: commits.length > 0 ? commits[commits.length - 1].hash : null
861
+ };
862
+ }
863
+
864
+
865
+ /**
866
+ * Insert a new phase at a specific position, renumbering all subsequent phases
867
+ * on disk, in ROADMAP.md, and in STATE.md.
868
+ *
869
+ * @param {number} position - Position to insert at (1-based)
870
+ * @param {string} slug - Phase slug
871
+ * @param {string} [planningDir] - Path to .planning directory
872
+ * @param {object} [options] - Optional: { goal, dependsOn }
873
+ * @returns {object} Result with phase, slug, directory, renumbered_count, etc.
874
+ */
875
+ async function phaseInsert(position, slug, planningDir, options) {
876
+ // Handle backward compat: if planningDir is an object, it's actually options
877
+ if (typeof planningDir === 'object' && planningDir !== null && !options) {
878
+ options = planningDir;
879
+ planningDir = undefined;
880
+ }
881
+ const opts = options || {};
882
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
883
+ const phasesDir = path.join(dir, 'phases');
884
+
885
+ if (!Number.isInteger(position) || position < 1) {
886
+ return { error: 'Position must be a positive integer' };
887
+ }
888
+
889
+ if (!fs.existsSync(phasesDir)) {
890
+ fs.mkdirSync(phasesDir, { recursive: true });
891
+ }
892
+
893
+ // Get existing phase dirs sorted by number
894
+ const existingDirs = fs.readdirSync(phasesDir)
895
+ .filter(d => /^\d+-/.test(d))
896
+ .sort();
897
+
898
+ // Renumber dirs with number >= position (iterate in REVERSE to avoid collisions)
899
+ let renumberedCount = 0;
900
+ const dirsToRename = existingDirs
901
+ .filter(d => parseInt(d.split('-')[0], 10) >= position)
902
+ .sort()
903
+ .reverse();
904
+
905
+ for (const d of dirsToRename) {
906
+ const num = parseInt(d.split('-')[0], 10);
907
+ const newName = d.replace(/^\d+/, String(num + 1).padStart(2, '0'));
908
+ fs.renameSync(path.join(phasesDir, d), path.join(phasesDir, newName));
909
+ renumberedCount++;
910
+ }
911
+
912
+ // Create the new phase directory
913
+ const dirName = String(position).padStart(2, '0') + '-' + slug;
914
+ const fullPath = path.join(phasesDir, dirName);
915
+ fs.mkdirSync(fullPath, { recursive: true });
916
+
917
+ // ROADMAP.md integration
918
+ let roadmapUpdated = false;
919
+ const roadmapPath = path.join(dir, 'ROADMAP.md');
920
+ if (fs.existsSync(roadmapPath)) {
921
+ const { roadmapInsertPhase } = require('./roadmap');
922
+ // First renumber existing phases in ROADMAP.md
923
+ await roadmapRenumberPhases(dir, position, +1);
924
+ // Then insert the new phase at the right position
925
+ const phaseName = slug.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase());
926
+ const depNum = opts.dependsOn ? parseInt(opts.dependsOn, 10) : null;
927
+ await roadmapInsertPhase(dir, position, phaseName, opts.goal || null, depNum);
928
+ roadmapUpdated = true;
929
+ }
930
+
931
+ // STATE.md adjustment: if current_phase >= position, increment it
932
+ let stateUpdated = false;
933
+ const statePath = path.join(dir, 'STATE.md');
934
+ if (fs.existsSync(statePath)) {
935
+ const stateContent = fs.readFileSync(statePath, 'utf8');
936
+ const fm = parseYamlFrontmatter(stateContent);
937
+ const currentPhase = fm.current_phase != null ? parseInt(fm.current_phase, 10) : null;
938
+ if (currentPhase !== null && currentPhase >= position) {
939
+ const newContent = updateFrontmatterField(stateContent, 'current_phase', currentPhase + 1);
940
+ fs.writeFileSync(statePath, newContent, 'utf8');
941
+ stateUpdated = true;
942
+ }
943
+ }
944
+
945
+ return {
946
+ phase: position,
947
+ slug,
948
+ directory: dirName,
949
+ path: fullPath,
950
+ renumbered_count: renumberedCount,
951
+ roadmap_updated: roadmapUpdated,
952
+ state_updated: stateUpdated
953
+ };
954
+ }
955
+
956
+ /**
957
+ * Get all commits associated with a phase by scanning SUMMARY.md files.
958
+ *
959
+ * @param {string} phaseNum - Phase number
960
+ * @param {string} [planningDir] - Path to .planning directory
961
+ * @returns {object} { commits: Array, first_commit, last_commit }
962
+ */
963
+ function phaseCommitsFor(phaseNum, planningDir) {
964
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
965
+ const phasesDir = path.join(dir, 'phases');
966
+ const padded = String(phaseNum).padStart(2, '0');
967
+
968
+ let phaseDir = null;
969
+ try {
970
+ const entries = fs.readdirSync(phasesDir);
971
+ const match = entries.find(d => d.startsWith(padded + '-'));
972
+ if (match) phaseDir = path.join(phasesDir, match);
973
+ } catch (_e) { /* intentionally silent: non-fatal */ }
974
+
975
+ if (!phaseDir) {
976
+ return { error: `Phase ${phaseNum} directory not found`, commits: [] };
977
+ }
978
+
979
+ const manifest = _buildPhaseManifest(parseInt(phaseNum, 10), phaseDir);
980
+ return {
981
+ commits: manifest.commits,
982
+ first_commit: manifest.first_commit,
983
+ last_commit: manifest.last_commit,
984
+ phase: padded
985
+ };
986
+ }
987
+
988
+ /**
989
+ * Get the first and last commit hashes for a phase.
990
+ *
991
+ * @param {string} phaseNum - Phase number
992
+ * @param {string} [planningDir] - Path to .planning directory
993
+ * @returns {object} { first_commit, last_commit }
994
+ */
995
+ function phaseFirstLastCommit(phaseNum, planningDir) {
996
+ const result = phaseCommitsFor(phaseNum, planningDir);
997
+ return {
998
+ first_commit: result.first_commit || null,
999
+ last_commit: result.last_commit || null,
1000
+ commit_count: result.commits ? result.commits.length : 0
1001
+ };
1002
+ }
1003
+
1004
+ /**
1005
+ * Get the next sequential phase number based on existing phase directories.
1006
+ *
1007
+ * @param {string} [planningDir] - Path to .planning directory
1008
+ * @returns {object} { next: number, existing: number[] }
1009
+ */
1010
+ function phaseNextNumber(planningDir) {
1011
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
1012
+ const phasesDir = path.join(dir, 'phases');
1013
+ if (!fs.existsSync(phasesDir)) {
1014
+ return { next: 1, existing: [] };
1015
+ }
1016
+ const existing = fs.readdirSync(phasesDir)
1017
+ .filter(d => /^\d+-/.test(d))
1018
+ .map(d => parseInt(d.split('-')[0], 10))
1019
+ .filter(n => !isNaN(n))
1020
+ .sort((a, b) => a - b);
1021
+ const next = existing.length > 0 ? Math.max(...existing) + 1 : 1;
1022
+ return { next, existing };
1023
+ }
1024
+
1025
+ module.exports = {
1026
+ frontmatter,
1027
+ planIndex,
1028
+ mustHavesCollect,
1029
+ phaseInfo,
1030
+ phaseAdd,
1031
+ phaseRemove,
1032
+ phaseList,
1033
+ milestoneStats,
1034
+ phaseComplete,
1035
+ phaseInsert,
1036
+ phaseNextNumber,
1037
+ // Aliases for backward compatibility with phase.cjs consumers
1038
+ phasePlanIndex: planIndex,
1039
+ phaseMustHaves: mustHavesCollect,
1040
+ // New exports
1041
+ phaseCommitsFor,
1042
+ phaseFirstLastCommit
1043
+ };