@sienklogic/plan-build-run 2.21.1 → 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 (982) hide show
  1. package/CHANGELOG.md +1331 -323
  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 +210 -34
  147. package/plugins/pbr/agents/dev-sync.md +206 -0
  148. package/plugins/pbr/agents/executor.md +734 -38
  149. package/plugins/pbr/agents/general.md +69 -5
  150. package/plugins/pbr/agents/integration-checker.md +147 -31
  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 -65
  154. package/plugins/pbr/agents/planner.md +449 -41
  155. package/plugins/pbr/agents/researcher.md +218 -37
  156. package/plugins/pbr/agents/roadmapper.md +398 -0
  157. package/plugins/pbr/agents/synthesizer.md +166 -25
  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 +570 -46
  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/execute-phase.md +6 -0
  172. package/plugins/pbr/commands/fast.md +6 -0
  173. package/plugins/pbr/commands/forensics.md +6 -0
  174. package/plugins/pbr/commands/import.md +1 -1
  175. package/plugins/pbr/commands/insert-phase.md +65 -0
  176. package/plugins/pbr/commands/intel.md +5 -0
  177. package/plugins/pbr/commands/join-discord.md +11 -0
  178. package/plugins/pbr/commands/list-phase-assumptions.md +5 -0
  179. package/plugins/pbr/commands/map-codebase.md +6 -0
  180. package/plugins/pbr/commands/milestone-summary.md +6 -0
  181. package/plugins/pbr/commands/new-milestone.md +8 -0
  182. package/plugins/pbr/commands/new-project.md +6 -0
  183. package/plugins/pbr/commands/pause-work.md +5 -0
  184. package/plugins/pbr/commands/plan-milestone-gaps.md +7 -0
  185. package/plugins/pbr/commands/plan-phase.md +6 -0
  186. package/plugins/pbr/commands/plant-seed.md +6 -0
  187. package/plugins/pbr/commands/profile-user.md +5 -0
  188. package/plugins/pbr/commands/profile.md +5 -0
  189. package/plugins/pbr/commands/progress.md +6 -0
  190. package/plugins/pbr/commands/quick.md +1 -1
  191. package/plugins/pbr/commands/reapply-patches.md +47 -0
  192. package/plugins/pbr/commands/release.md +6 -0
  193. package/plugins/pbr/commands/remove-phase.md +66 -0
  194. package/plugins/pbr/commands/research-phase.md +59 -0
  195. package/plugins/pbr/commands/resume-work.md +5 -0
  196. package/plugins/pbr/commands/seed.md +6 -0
  197. package/plugins/pbr/commands/session-report.md +5 -0
  198. package/plugins/pbr/commands/set-profile.md +6 -0
  199. package/plugins/pbr/commands/settings.md +5 -0
  200. package/plugins/pbr/commands/setup.md +1 -1
  201. package/plugins/pbr/commands/ship.md +5 -0
  202. package/plugins/pbr/commands/stats.md +6 -0
  203. package/plugins/pbr/commands/test.md +5 -0
  204. package/plugins/pbr/commands/thread.md +6 -0
  205. package/plugins/pbr/commands/todo.md +1 -1
  206. package/plugins/pbr/commands/ui-phase.md +5 -0
  207. package/plugins/pbr/commands/ui-review.md +5 -0
  208. package/plugins/pbr/commands/undo.md +5 -0
  209. package/plugins/pbr/commands/update.md +37 -0
  210. package/plugins/pbr/commands/validate-phase.md +5 -0
  211. package/plugins/pbr/commands/verify-work.md +6 -0
  212. package/plugins/pbr/dashboard/package-lock.json +6 -0
  213. package/plugins/pbr/dist/architecture-guard.js +76 -0
  214. package/plugins/pbr/dist/audit-dimensions.js +556 -0
  215. package/plugins/pbr/dist/auto-continue.js +277 -0
  216. package/plugins/pbr/dist/block-skill-self-read.js +124 -0
  217. package/plugins/pbr/dist/check-agent-state-write.js +63 -0
  218. package/plugins/pbr/dist/check-config-change.js +213 -0
  219. package/plugins/pbr/dist/check-cross-plugin-sync.js +93 -0
  220. package/plugins/pbr/dist/check-dangerous-commands.js +193 -0
  221. package/plugins/pbr/dist/check-direct-state-write.js +37 -0
  222. package/plugins/pbr/dist/check-doc-sprawl.js +102 -0
  223. package/plugins/pbr/dist/check-phase-boundary.js +191 -0
  224. package/plugins/pbr/dist/check-plan-format.js +227 -0
  225. package/plugins/pbr/dist/check-read-first.js +345 -0
  226. package/plugins/pbr/dist/check-roadmap-sync.js +507 -0
  227. package/plugins/pbr/dist/check-skill-workflow.js +354 -0
  228. package/plugins/pbr/dist/check-state-sync.js +676 -0
  229. package/plugins/pbr/dist/check-subagent-output.js +425 -0
  230. package/plugins/pbr/dist/check-summary-gate.js +188 -0
  231. package/plugins/pbr/dist/context-bridge.js +425 -0
  232. package/plugins/pbr/dist/context-budget-check.js +442 -0
  233. package/plugins/pbr/dist/context-quality.js +271 -0
  234. package/plugins/pbr/dist/enforce-context-budget.js +138 -0
  235. package/plugins/pbr/dist/enforce-pbr-workflow.js +277 -0
  236. package/plugins/pbr/dist/event-handler.js +212 -0
  237. package/plugins/pbr/dist/event-logger.js +125 -0
  238. package/plugins/pbr/dist/feedback-loop.js +155 -0
  239. package/plugins/pbr/dist/graph-update.js +422 -0
  240. package/plugins/pbr/dist/hook-logger.js +114 -0
  241. package/plugins/pbr/dist/hook-server-client.js +361 -0
  242. package/plugins/pbr/dist/hook-server.js +664 -0
  243. package/plugins/pbr/dist/hooks-schema.json +87 -0
  244. package/plugins/pbr/dist/instructions-loaded.js +173 -0
  245. package/plugins/pbr/dist/intercept-plan-mode.js +81 -0
  246. package/plugins/pbr/dist/log-notification.js +131 -0
  247. package/plugins/pbr/dist/log-subagent.js +367 -0
  248. package/plugins/pbr/dist/log-tool-failure.js +140 -0
  249. package/plugins/pbr/dist/milestone-learnings.js +519 -0
  250. package/plugins/pbr/dist/pbr-tools.js +493 -0
  251. package/plugins/pbr/dist/post-bash-triage.js +96 -0
  252. package/plugins/pbr/dist/post-compact.js +135 -0
  253. package/plugins/pbr/dist/post-hoc.js +237 -0
  254. package/plugins/pbr/dist/post-write-dispatch.js +243 -0
  255. package/plugins/pbr/dist/post-write-quality.js +208 -0
  256. package/plugins/pbr/dist/pre-bash-dispatch.js +212 -0
  257. package/plugins/pbr/dist/pre-skill-dispatch.js +114 -0
  258. package/plugins/pbr/dist/pre-task-dispatch.js +269 -0
  259. package/plugins/pbr/dist/pre-write-dispatch.js +234 -0
  260. package/plugins/pbr/dist/progress-tracker.js +173 -0
  261. package/plugins/pbr/dist/prompt-guard.js +114 -0
  262. package/plugins/pbr/dist/prompt-routing.js +209 -0
  263. package/plugins/pbr/dist/quick-status.js +179 -0
  264. package/plugins/pbr/dist/record-incident.js +37 -0
  265. package/plugins/pbr/dist/run-hook.js +132 -0
  266. package/plugins/pbr/dist/session-cleanup.js +653 -0
  267. package/plugins/pbr/dist/session-tracker.js +124 -0
  268. package/plugins/pbr/dist/status-line.js +849 -0
  269. package/plugins/pbr/dist/suggest-compact.js +307 -0
  270. package/plugins/pbr/dist/sync-context-to-claude.js +100 -0
  271. package/plugins/pbr/dist/task-completed.js +206 -0
  272. package/plugins/pbr/dist/track-context-budget.js +432 -0
  273. package/plugins/pbr/dist/track-user-gates.js +88 -0
  274. package/plugins/pbr/dist/trust-tracker.js +193 -0
  275. package/plugins/pbr/dist/validate-commit.js +233 -0
  276. package/plugins/pbr/dist/validate-skill-args.js +222 -0
  277. package/plugins/pbr/dist/validate-task.js +271 -0
  278. package/plugins/pbr/dist/worktree-create.js +144 -0
  279. package/plugins/pbr/dist/worktree-remove.js +147 -0
  280. package/plugins/pbr/hooks/hooks.json +137 -65
  281. package/plugins/pbr/references/agent-contracts.md +39 -8
  282. package/plugins/pbr/references/agent-teams.md +3 -3
  283. package/plugins/pbr/references/archive/checkpoints.md +189 -0
  284. package/plugins/pbr/references/archive/context-quality-tiers.md +45 -0
  285. package/plugins/pbr/references/archive/hook-ordering.md +89 -0
  286. package/plugins/pbr/references/archive/limitations.md +106 -0
  287. package/plugins/pbr/references/archive/pbr-rules.md +194 -0
  288. package/plugins/pbr/references/archive/pbr-tools-cli.md +415 -0
  289. package/plugins/pbr/references/archive/pretooluse-jsonl-behavior.md +58 -0
  290. package/plugins/pbr/references/archive/signal-files.md +41 -0
  291. package/plugins/pbr/references/archive/tmux-setup.md +288 -0
  292. package/plugins/pbr/references/archive/verification-matrix.md +34 -0
  293. package/plugins/pbr/references/archive/verification-patterns.md +277 -0
  294. package/plugins/pbr/references/archive/worktree-sparse-checkout.md +86 -0
  295. package/plugins/pbr/references/assumptions.md +42 -0
  296. package/plugins/pbr/references/checkpoints.md +723 -104
  297. package/plugins/pbr/references/config-reference.md +387 -10
  298. package/plugins/pbr/references/continuation-format.md +1 -0
  299. package/plugins/pbr/references/decimal-phase-calculation.md +65 -0
  300. package/plugins/pbr/references/deviation-rules.md +12 -0
  301. package/plugins/pbr/references/few-shot-examples/audit.md +77 -0
  302. package/plugins/pbr/references/few-shot-examples/check-plan-format.md +172 -0
  303. package/plugins/pbr/references/few-shot-examples/check-subagent-output.md +118 -0
  304. package/plugins/pbr/references/few-shot-examples/integration-checker.md +70 -0
  305. package/plugins/pbr/references/few-shot-examples/nyquist-auditor.md +83 -0
  306. package/plugins/pbr/references/few-shot-examples/plan-checker.md +73 -0
  307. package/plugins/pbr/references/few-shot-examples/ui-checker.md +71 -0
  308. package/plugins/pbr/references/few-shot-examples/verifier.md +109 -0
  309. package/plugins/pbr/references/git-integration.md +110 -27
  310. package/plugins/pbr/references/git-planning-commit.md +35 -0
  311. package/plugins/pbr/references/model-profile-resolution.md +34 -0
  312. package/plugins/pbr/references/model-profiles.md +90 -7
  313. package/plugins/pbr/references/model-selection.md +1 -1
  314. package/plugins/pbr/references/node-repair.md +48 -0
  315. package/plugins/pbr/references/plan-authoring.md +65 -0
  316. package/plugins/pbr/references/plan-format.md +184 -10
  317. package/plugins/pbr/references/questioning.md +138 -49
  318. package/plugins/pbr/references/reading-verification.md +4 -4
  319. package/plugins/pbr/references/tdd.md +263 -0
  320. package/plugins/pbr/references/thinking-models-planning.md +47 -0
  321. package/plugins/pbr/references/thinking-models-verification.md +44 -0
  322. package/plugins/pbr/references/ui-brand.md +449 -0
  323. package/plugins/pbr/references/verification-overrides.md +39 -0
  324. package/plugins/pbr/references/verification-patterns.md +529 -113
  325. package/plugins/pbr/scripts/architecture-guard.js +76 -0
  326. package/plugins/pbr/scripts/audit-checks/behavioral-compliance.js +2098 -0
  327. package/plugins/pbr/scripts/audit-checks/error-analysis.js +989 -0
  328. package/plugins/pbr/scripts/audit-checks/feature-verification.js +723 -0
  329. package/plugins/pbr/scripts/audit-checks/index.js +433 -0
  330. package/plugins/pbr/scripts/audit-checks/infrastructure.js +816 -0
  331. package/plugins/pbr/scripts/audit-checks/quality-metrics.js +455 -0
  332. package/plugins/pbr/scripts/audit-checks/session-quality.js +980 -0
  333. package/plugins/pbr/scripts/audit-checks/si-agent-hook-config-checks.js +396 -0
  334. package/plugins/pbr/scripts/audit-checks/si-cross-cutting-checks.js +272 -0
  335. package/plugins/pbr/scripts/audit-checks/si-skill-checks.js +424 -0
  336. package/plugins/pbr/scripts/audit-checks/workflow-compliance.js +1175 -0
  337. package/plugins/pbr/scripts/audit-dimensions.js +556 -0
  338. package/plugins/pbr/scripts/auto-continue.js +192 -37
  339. package/plugins/pbr/scripts/block-skill-self-read.js +124 -0
  340. package/plugins/pbr/scripts/check-agent-state-write.js +63 -0
  341. package/plugins/pbr/scripts/check-config-change.js +84 -1
  342. package/plugins/pbr/scripts/check-cross-plugin-sync.js +93 -0
  343. package/plugins/pbr/scripts/check-dangerous-commands.js +18 -5
  344. package/plugins/pbr/scripts/check-direct-state-write.js +37 -0
  345. package/plugins/pbr/scripts/check-phase-boundary.js +3 -2
  346. package/plugins/pbr/scripts/check-plan-format.js +153 -354
  347. package/plugins/pbr/scripts/check-read-first.js +345 -0
  348. package/plugins/pbr/scripts/check-roadmap-sync.js +174 -19
  349. package/plugins/pbr/scripts/check-skill-workflow.js +21 -16
  350. package/plugins/pbr/scripts/check-state-sync.js +352 -220
  351. package/plugins/pbr/scripts/check-subagent-output.js +296 -333
  352. package/plugins/pbr/scripts/check-summary-gate.js +5 -15
  353. package/plugins/pbr/scripts/commands/benchmarks.js +195 -0
  354. package/plugins/pbr/scripts/commands/calibrate.js +530 -0
  355. package/plugins/pbr/scripts/commands/config.js +72 -0
  356. package/plugins/pbr/scripts/commands/misc.js +779 -0
  357. package/plugins/pbr/scripts/commands/phase.js +293 -0
  358. package/plugins/pbr/scripts/commands/roadmap.js +75 -0
  359. package/plugins/pbr/scripts/commands/state.js +84 -0
  360. package/plugins/pbr/scripts/commands/stress-test.js +349 -0
  361. package/plugins/pbr/scripts/commands/todo.js +191 -0
  362. package/plugins/pbr/scripts/commands/verify.js +169 -0
  363. package/plugins/pbr/scripts/config-schema.json +1183 -95
  364. package/plugins/pbr/scripts/context-bridge.js +425 -0
  365. package/plugins/pbr/scripts/context-budget-check.js +171 -16
  366. package/plugins/pbr/scripts/context-quality.js +271 -0
  367. package/plugins/pbr/scripts/enforce-context-budget.js +138 -0
  368. package/plugins/pbr/scripts/enforce-pbr-workflow.js +277 -0
  369. package/plugins/pbr/scripts/event-handler.js +137 -87
  370. package/plugins/pbr/scripts/event-logger.js +58 -25
  371. package/plugins/pbr/scripts/feedback-loop.js +155 -0
  372. package/plugins/pbr/scripts/graph-update.js +422 -0
  373. package/plugins/pbr/scripts/hook-logger.js +69 -35
  374. package/plugins/pbr/scripts/hook-server-client.js +361 -0
  375. package/plugins/pbr/scripts/hook-server.js +664 -0
  376. package/plugins/pbr/scripts/hooks-schema.json +12 -5
  377. package/plugins/pbr/scripts/instructions-loaded.js +173 -0
  378. package/plugins/pbr/scripts/intent-router.cjs +147 -0
  379. package/plugins/pbr/scripts/intercept-plan-mode.js +52 -18
  380. package/plugins/pbr/scripts/lib/alternatives.js +203 -0
  381. package/plugins/pbr/scripts/lib/audit.js +65 -0
  382. package/plugins/pbr/scripts/lib/auto-cleanup.js +221 -0
  383. package/plugins/pbr/scripts/lib/auto-verify.js +123 -0
  384. package/plugins/pbr/scripts/lib/benchmark.js +190 -0
  385. package/plugins/pbr/scripts/lib/build.js +719 -0
  386. package/plugins/pbr/scripts/lib/ci-fix-loop.js +228 -0
  387. package/plugins/pbr/scripts/lib/commands.js +483 -0
  388. package/plugins/pbr/scripts/lib/compound.js +222 -0
  389. package/plugins/pbr/scripts/lib/config-cache.js +83 -0
  390. package/plugins/pbr/scripts/lib/config.js +1469 -0
  391. package/plugins/pbr/scripts/lib/context.js +254 -0
  392. package/plugins/pbr/scripts/lib/contextual-help.js +183 -0
  393. package/plugins/pbr/scripts/lib/convention-detector.js +413 -0
  394. package/plugins/pbr/scripts/lib/core.js +1585 -0
  395. package/plugins/pbr/scripts/lib/dashboard-launch.js +364 -0
  396. package/plugins/pbr/scripts/lib/data-hygiene.js +179 -0
  397. package/plugins/pbr/scripts/lib/decision-extraction.js +183 -0
  398. package/plugins/pbr/scripts/lib/decisions.js +194 -0
  399. package/plugins/pbr/scripts/lib/dependency-break.js +147 -0
  400. package/plugins/pbr/scripts/lib/format-validators.js +1049 -0
  401. package/plugins/pbr/scripts/lib/frontmatter.js +302 -0
  402. package/plugins/pbr/scripts/lib/gates/advisories.js +133 -0
  403. package/plugins/pbr/scripts/lib/gates/build-dependency.js +118 -0
  404. package/plugins/pbr/scripts/lib/gates/build-executor.js +106 -0
  405. package/plugins/pbr/scripts/lib/gates/doc-existence.js +46 -0
  406. package/plugins/pbr/scripts/lib/gates/helpers.js +98 -0
  407. package/plugins/pbr/scripts/lib/gates/inline-execution.js +187 -0
  408. package/plugins/pbr/scripts/lib/gates/milestone-complete.js +139 -0
  409. package/plugins/pbr/scripts/lib/gates/milestone-summary.js +121 -0
  410. package/plugins/pbr/scripts/lib/gates/multi-phase-loader.js +149 -0
  411. package/plugins/pbr/scripts/lib/gates/plan-executor.js +36 -0
  412. package/plugins/pbr/scripts/lib/gates/plan-validation.js +115 -0
  413. package/plugins/pbr/scripts/lib/gates/quick-executor.js +78 -0
  414. package/plugins/pbr/scripts/lib/gates/review-planner.js +63 -0
  415. package/plugins/pbr/scripts/lib/gates/review-verifier.js +71 -0
  416. package/plugins/pbr/scripts/lib/gates/rich-agent-context.js +148 -0
  417. package/plugins/pbr/scripts/lib/gates/sprint-preflight.js +30 -0
  418. package/plugins/pbr/scripts/lib/gates/user-confirmation.js +95 -0
  419. package/plugins/pbr/scripts/lib/graph-cli.js +89 -0
  420. package/plugins/pbr/scripts/lib/graph.js +553 -0
  421. package/plugins/pbr/scripts/lib/handoff-validators.js +224 -0
  422. package/plugins/pbr/scripts/lib/health-checks.js +107 -0
  423. package/plugins/pbr/scripts/lib/health-phase06.js +120 -0
  424. package/plugins/pbr/scripts/lib/health.js +132 -0
  425. package/plugins/pbr/scripts/lib/help.js +100 -0
  426. package/plugins/pbr/scripts/lib/history.js +150 -0
  427. package/plugins/pbr/scripts/lib/impact-analysis.js +319 -0
  428. package/plugins/pbr/scripts/lib/incidents.js +190 -0
  429. package/plugins/pbr/scripts/lib/init.js +643 -0
  430. package/plugins/pbr/scripts/lib/insights-parser.js +320 -0
  431. package/plugins/pbr/scripts/lib/intel.js +653 -0
  432. package/plugins/pbr/scripts/lib/learnings.js +511 -0
  433. package/plugins/pbr/scripts/lib/migrate.js +309 -0
  434. package/plugins/pbr/scripts/lib/milestone.js +306 -0
  435. package/plugins/pbr/scripts/lib/msys-path.js +20 -0
  436. package/plugins/pbr/scripts/lib/negative-knowledge.js +194 -0
  437. package/plugins/pbr/scripts/lib/notification-throttle.js +141 -0
  438. package/plugins/pbr/scripts/lib/onboarding-generator.js +288 -0
  439. package/plugins/pbr/scripts/lib/parse-args.js +134 -0
  440. package/plugins/pbr/scripts/lib/pattern-routing.js +55 -0
  441. package/plugins/pbr/scripts/lib/patterns.js +272 -0
  442. package/plugins/pbr/scripts/lib/perf.js +190 -0
  443. package/plugins/pbr/scripts/lib/phase.js +1043 -0
  444. package/plugins/pbr/scripts/lib/pid-lock.js +156 -0
  445. package/plugins/pbr/scripts/lib/post-hoc.js +160 -0
  446. package/plugins/pbr/scripts/lib/pre-commit-checks.js +220 -0
  447. package/plugins/pbr/scripts/lib/pre-research.js +126 -0
  448. package/plugins/pbr/scripts/lib/premature-completion.js +312 -0
  449. package/plugins/pbr/scripts/lib/preview.js +174 -0
  450. package/plugins/pbr/scripts/lib/progress-visualization.js +296 -0
  451. package/plugins/pbr/scripts/lib/quick-init.js +131 -0
  452. package/plugins/pbr/scripts/lib/reference.js +236 -0
  453. package/plugins/pbr/scripts/lib/requirements.js +153 -0
  454. package/plugins/pbr/scripts/lib/resolve-root.js +66 -0
  455. package/plugins/pbr/scripts/lib/reverse-spec.js +259 -0
  456. package/plugins/pbr/scripts/lib/roadmap.js +1089 -0
  457. package/plugins/pbr/scripts/lib/security-scan.js +200 -0
  458. package/plugins/pbr/scripts/lib/session-briefing.js +918 -0
  459. package/plugins/pbr/scripts/lib/skill-section.js +99 -0
  460. package/plugins/pbr/scripts/lib/smart-next-task.js +198 -0
  461. package/plugins/pbr/scripts/lib/snapshot-manager.js +232 -0
  462. package/plugins/pbr/scripts/lib/spec-diff.js +209 -0
  463. package/plugins/pbr/scripts/lib/spec-engine.js +189 -0
  464. package/plugins/pbr/scripts/lib/spot-check.js +539 -0
  465. package/plugins/pbr/scripts/lib/state-queue.js +171 -0
  466. package/plugins/pbr/scripts/lib/state.js +1082 -0
  467. package/plugins/pbr/scripts/lib/status-render.js +511 -0
  468. package/plugins/pbr/scripts/lib/step-verify.js +149 -0
  469. package/plugins/pbr/scripts/lib/subagent-validators.js +1119 -0
  470. package/plugins/pbr/scripts/lib/suggest-next.js +435 -0
  471. package/plugins/pbr/scripts/lib/tech-debt-scanner.js +116 -0
  472. package/plugins/pbr/scripts/lib/templates.js +362 -0
  473. package/plugins/pbr/scripts/lib/test-selection.js +163 -0
  474. package/plugins/pbr/scripts/lib/todo.js +300 -0
  475. package/plugins/pbr/scripts/lib/verify.js +1561 -0
  476. package/plugins/pbr/scripts/log-notification.js +131 -0
  477. package/plugins/pbr/scripts/log-subagent.js +221 -18
  478. package/plugins/pbr/scripts/log-tool-failure.js +60 -5
  479. package/plugins/pbr/scripts/milestone-learnings.js +519 -0
  480. package/plugins/pbr/scripts/package.json +1 -1
  481. package/plugins/pbr/scripts/pbr-tools.js +362 -1247
  482. package/plugins/pbr/scripts/post-bash-triage.js +96 -0
  483. package/plugins/pbr/scripts/post-compact.js +135 -0
  484. package/plugins/pbr/scripts/post-hoc.js +237 -0
  485. package/plugins/pbr/scripts/post-write-dispatch.js +201 -31
  486. package/plugins/pbr/scripts/post-write-quality.js +4 -3
  487. package/plugins/pbr/scripts/pre-bash-dispatch.js +147 -51
  488. package/plugins/pbr/scripts/pre-skill-dispatch.js +114 -0
  489. package/plugins/pbr/scripts/pre-task-dispatch.js +269 -0
  490. package/plugins/pbr/scripts/pre-write-dispatch.js +170 -72
  491. package/plugins/pbr/scripts/progress-tracker.js +121 -324
  492. package/plugins/pbr/scripts/prompt-guard.js +114 -0
  493. package/plugins/pbr/scripts/prompt-routing.js +209 -0
  494. package/plugins/pbr/scripts/quick-status.js +179 -0
  495. package/plugins/pbr/scripts/record-incident.js +37 -0
  496. package/plugins/pbr/scripts/risk-classifier.cjs +123 -0
  497. package/plugins/pbr/scripts/run-hook.js +63 -23
  498. package/plugins/pbr/scripts/session-cleanup.js +428 -29
  499. package/plugins/pbr/scripts/session-tracker.js +124 -0
  500. package/plugins/pbr/scripts/status-line.js +571 -43
  501. package/plugins/pbr/scripts/suggest-compact.js +201 -13
  502. package/plugins/pbr/scripts/sync-context-to-claude.js +100 -0
  503. package/plugins/pbr/scripts/task-completed.js +165 -4
  504. package/plugins/pbr/scripts/test/config.test.js +126 -0
  505. package/plugins/pbr/scripts/test/cross-platform.test.js +120 -0
  506. package/plugins/pbr/scripts/test/fixtures/config.json +20 -0
  507. package/plugins/pbr/scripts/test/fixtures/plan.md +54 -0
  508. package/plugins/pbr/scripts/test/fixtures/project.md +30 -0
  509. package/plugins/pbr/scripts/test/fixtures/roadmap.md +55 -0
  510. package/plugins/pbr/scripts/test/fixtures/state.md +60 -0
  511. package/plugins/pbr/scripts/test/fixtures/summary.md +35 -0
  512. package/plugins/pbr/scripts/test/fixtures.test.js +184 -0
  513. package/plugins/pbr/scripts/test/phase.test.js +142 -0
  514. package/plugins/pbr/scripts/test/roadmap.test.js +96 -0
  515. package/plugins/pbr/scripts/test/state.test.js +155 -0
  516. package/plugins/pbr/scripts/track-context-budget.js +368 -104
  517. package/plugins/pbr/scripts/track-user-gates.js +88 -0
  518. package/plugins/pbr/scripts/trust-tracker.js +193 -0
  519. package/plugins/pbr/scripts/validate-commit.js +51 -19
  520. package/plugins/pbr/scripts/validate-skill-args.js +85 -14
  521. package/plugins/pbr/scripts/validate-task.js +83 -622
  522. package/plugins/pbr/scripts/worktree-create.js +144 -0
  523. package/plugins/pbr/scripts/worktree-remove.js +147 -0
  524. package/plugins/pbr/skills/audit/SKILL.md +195 -24
  525. package/plugins/pbr/skills/audit-fix/SKILL.md +326 -0
  526. package/plugins/pbr/skills/autonomous/SKILL.md +551 -0
  527. package/plugins/pbr/skills/backlog/SKILL.md +56 -0
  528. package/plugins/pbr/skills/begin/SKILL.md +508 -153
  529. package/plugins/pbr/skills/begin/templates/STATE.md.tmpl +1 -2
  530. package/plugins/pbr/skills/begin/templates/config.json.tmpl +419 -36
  531. package/plugins/pbr/skills/begin/templates/researcher-prompt.md.tmpl +28 -0
  532. package/plugins/pbr/skills/begin/templates/roadmap-prompt.md.tmpl +28 -3
  533. package/plugins/pbr/skills/begin/templates/synthesis-prompt.md.tmpl +33 -5
  534. package/plugins/pbr/skills/build/SKILL.md +1180 -357
  535. package/plugins/pbr/skills/build/templates/continuation-prompt.md.tmpl +26 -0
  536. package/plugins/pbr/skills/build/templates/executor-prompt.md.tmpl +77 -0
  537. package/plugins/pbr/skills/build/templates/inline-verifier-prompt.md.tmpl +33 -0
  538. package/plugins/pbr/skills/build/templates/qa-round-context.md.tmpl +16 -0
  539. package/plugins/pbr/skills/config/SKILL.md +112 -9
  540. package/plugins/pbr/skills/continue/SKILL.md +113 -33
  541. package/plugins/pbr/skills/dashboard/SKILL.md +21 -9
  542. package/plugins/pbr/skills/debug/SKILL.md +70 -12
  543. package/plugins/pbr/skills/debug/templates/continuation-prompt.md.tmpl +12 -1
  544. package/plugins/pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +12 -5
  545. package/plugins/pbr/skills/discuss/SKILL.md +205 -24
  546. package/plugins/pbr/skills/discuss/templates/CONTEXT.md.tmpl +21 -1
  547. package/plugins/pbr/skills/do/SKILL.md +119 -24
  548. package/plugins/pbr/skills/explore/SKILL.md +95 -20
  549. package/plugins/pbr/skills/fast/SKILL.md +94 -0
  550. package/plugins/pbr/skills/forensics/SKILL.md +144 -0
  551. package/plugins/pbr/skills/health/SKILL.md +35 -115
  552. package/plugins/pbr/skills/help/SKILL.md +83 -123
  553. package/plugins/pbr/skills/import/SKILL.md +332 -13
  554. package/plugins/pbr/skills/intel/SKILL.md +131 -0
  555. package/plugins/pbr/skills/list-phase-assumptions/SKILL.md +231 -0
  556. package/plugins/pbr/skills/milestone/SKILL.md +383 -274
  557. package/plugins/pbr/skills/milestone/templates/audit-output.md.tmpl +76 -0
  558. package/plugins/pbr/skills/milestone/templates/complete-output.md.tmpl +32 -0
  559. package/plugins/pbr/skills/milestone/templates/edge-cases.md +54 -0
  560. package/plugins/pbr/skills/milestone/templates/gaps-output.md.tmpl +25 -0
  561. package/plugins/pbr/skills/milestone/templates/integration-checker-prompt.md.tmpl +25 -0
  562. package/plugins/pbr/skills/milestone/templates/new-output.md.tmpl +29 -0
  563. package/plugins/pbr/skills/milestone-summary/SKILL.md +86 -0
  564. package/plugins/pbr/skills/note/SKILL.md +20 -4
  565. package/plugins/pbr/skills/pause/SKILL.md +54 -14
  566. package/plugins/pbr/skills/pause/templates/continue-here.md.tmpl +33 -52
  567. package/plugins/pbr/skills/plan/SKILL.md +526 -280
  568. package/plugins/pbr/skills/plan/templates/checker-prompt.md.tmpl +20 -2
  569. package/plugins/pbr/skills/plan/templates/completion-output.md.tmpl +27 -0
  570. package/plugins/pbr/skills/plan/templates/planner-prompt.md.tmpl +43 -1
  571. package/plugins/pbr/skills/plan/templates/revision-prompt.md.tmpl +21 -5
  572. package/plugins/pbr/skills/profile/SKILL.md +185 -0
  573. package/plugins/pbr/skills/profile-user/SKILL.md +227 -0
  574. package/plugins/pbr/skills/quick/SKILL.md +435 -100
  575. package/plugins/pbr/skills/release/SKILL.md +206 -0
  576. package/plugins/pbr/skills/resume/SKILL.md +170 -46
  577. package/plugins/pbr/skills/review/SKILL.md +233 -165
  578. package/plugins/pbr/skills/review/templates/verifier-prompt.md.tmpl +7 -0
  579. package/plugins/pbr/skills/scan/SKILL.md +152 -106
  580. package/plugins/pbr/skills/scan/templates/mapper-prompt.md.tmpl +5 -56
  581. package/plugins/pbr/skills/seed/SKILL.md +87 -0
  582. package/plugins/pbr/skills/session-report/SKILL.md +130 -0
  583. package/plugins/pbr/skills/setup/SKILL.md +150 -202
  584. package/plugins/pbr/skills/shared/agent-context-enrichment.md +21 -0
  585. package/plugins/pbr/skills/shared/agent-type-resolution.md +32 -0
  586. package/plugins/pbr/skills/shared/commit-planning-docs.md +8 -0
  587. package/plugins/pbr/skills/shared/context-budget.md +66 -1
  588. package/plugins/pbr/skills/shared/context-loader-task.md +18 -11
  589. package/plugins/pbr/skills/shared/criterion-writing.md +58 -0
  590. package/plugins/pbr/skills/shared/digest-select.md +2 -2
  591. package/plugins/pbr/skills/shared/domain-probes.md +1 -1
  592. package/plugins/pbr/skills/shared/error-reporting.md +38 -60
  593. package/plugins/pbr/skills/shared/gate-prompts.md +4 -2
  594. package/plugins/pbr/skills/shared/memory-capture.md +48 -0
  595. package/plugins/pbr/skills/shared/phase-argument-parsing.md +4 -4
  596. package/plugins/pbr/skills/shared/revision-loop.md +24 -6
  597. package/plugins/pbr/skills/shared/state-update.md +46 -61
  598. package/plugins/pbr/skills/shared/universal-anti-patterns.md +27 -4
  599. package/plugins/pbr/skills/ship/SKILL.md +155 -0
  600. package/plugins/pbr/skills/stats/SKILL.md +110 -0
  601. package/plugins/pbr/skills/status/SKILL.md +185 -119
  602. package/plugins/pbr/skills/test/SKILL.md +254 -0
  603. package/plugins/pbr/skills/thread/SKILL.md +73 -0
  604. package/plugins/pbr/skills/todo/SKILL.md +28 -72
  605. package/plugins/pbr/skills/ui-phase/SKILL.md +180 -0
  606. package/plugins/pbr/skills/ui-review/SKILL.md +206 -0
  607. package/plugins/pbr/skills/undo/SKILL.md +221 -0
  608. package/plugins/pbr/skills/validate-phase/SKILL.md +362 -0
  609. package/plugins/pbr/templates/CONTEXT.md.tmpl +45 -20
  610. package/plugins/pbr/templates/DISCOVERY.md.tmpl +29 -0
  611. package/plugins/pbr/templates/DISCUSSION-LOG.md.tmpl +49 -0
  612. package/plugins/pbr/templates/HANDOFF.json.tmpl +30 -0
  613. package/plugins/pbr/templates/INTEGRATION-REPORT.md.tmpl +18 -2
  614. package/plugins/pbr/templates/MILESTONE-AUDIT.md.tmpl +44 -0
  615. package/plugins/pbr/templates/PROJECT.md.tmpl +126 -0
  616. package/plugins/pbr/templates/REQUIREMENTS.md.tmpl +96 -0
  617. package/plugins/pbr/templates/RETROSPECTIVE.md.tmpl +43 -0
  618. package/plugins/pbr/templates/ROADMAP.md.tmpl +106 -14
  619. package/plugins/pbr/templates/SUMMARY-complex.md.tmpl +133 -0
  620. package/plugins/pbr/templates/SUMMARY-minimal.md.tmpl +55 -0
  621. package/plugins/pbr/templates/SUMMARY.md.tmpl +21 -0
  622. package/plugins/pbr/templates/UAT.md.tmpl +94 -0
  623. package/plugins/pbr/templates/UI-SPEC.md.tmpl +144 -0
  624. package/plugins/pbr/templates/VALIDATION.md.tmpl +94 -0
  625. package/plugins/pbr/templates/VERIFICATION-DETAIL.md.tmpl +54 -13
  626. package/plugins/pbr/templates/project-CONTEXT.md.tmpl +59 -0
  627. package/plugins/pbr/templates/research-outputs/ARCHITECTURE.md.tmpl +91 -0
  628. package/plugins/pbr/templates/research-outputs/FEATURES.md.tmpl +64 -0
  629. package/plugins/pbr/templates/research-outputs/PITFALLS.md.tmpl +50 -0
  630. package/plugins/pbr/templates/research-outputs/STACK.md.tmpl +63 -0
  631. package/plugins/pbr/templates/research-outputs/SUMMARY.md.tmpl +98 -0
  632. package/scripts/build-hooks.js +61 -0
  633. package/scripts/check-ci.js +100 -0
  634. package/scripts/clean-changelog.js +364 -0
  635. package/scripts/generate-derivatives.js +581 -0
  636. package/scripts/posttest.js +93 -0
  637. package/scripts/release.js +262 -0
  638. package/scripts/run-tests.cjs +29 -0
  639. package/scripts/test-wrapper.js +43 -0
  640. package/dashboard/bin/cli.js +0 -25
  641. package/dashboard/public/css/layout.css +0 -704
  642. package/dashboard/public/css/status-colors.css +0 -98
  643. package/dashboard/public/css/tokens.css +0 -59
  644. package/dashboard/public/js/htmx-title.js +0 -5
  645. package/dashboard/public/js/sidebar-toggle.js +0 -34
  646. package/dashboard/public/js/sse-client.js +0 -100
  647. package/dashboard/public/js/theme-toggle.js +0 -46
  648. package/dashboard/src/app.js +0 -91
  649. package/dashboard/src/middleware/current-phase.js +0 -24
  650. package/dashboard/src/middleware/errorHandler.js +0 -52
  651. package/dashboard/src/middleware/notFoundHandler.js +0 -9
  652. package/dashboard/src/repositories/planning.repository.js +0 -130
  653. package/dashboard/src/routes/events.routes.js +0 -45
  654. package/dashboard/src/routes/index.routes.js +0 -35
  655. package/dashboard/src/routes/pages.routes.js +0 -426
  656. package/dashboard/src/server.js +0 -42
  657. package/dashboard/src/services/analytics.service.js +0 -141
  658. package/dashboard/src/services/dashboard.service.js +0 -309
  659. package/dashboard/src/services/milestone.service.js +0 -222
  660. package/dashboard/src/services/notes.service.js +0 -50
  661. package/dashboard/src/services/phase.service.js +0 -232
  662. package/dashboard/src/services/project.service.js +0 -57
  663. package/dashboard/src/services/roadmap.service.js +0 -258
  664. package/dashboard/src/services/sse.service.js +0 -58
  665. package/dashboard/src/services/todo.service.js +0 -272
  666. package/dashboard/src/services/watcher.service.js +0 -48
  667. package/dashboard/src/utils/cache.js +0 -55
  668. package/dashboard/src/views/analytics.ejs +0 -5
  669. package/dashboard/src/views/coming-soon.ejs +0 -11
  670. package/dashboard/src/views/dependencies.ejs +0 -5
  671. package/dashboard/src/views/error.ejs +0 -20
  672. package/dashboard/src/views/index.ejs +0 -5
  673. package/dashboard/src/views/milestone-detail.ejs +0 -5
  674. package/dashboard/src/views/milestones.ejs +0 -5
  675. package/dashboard/src/views/notes.ejs +0 -5
  676. package/dashboard/src/views/partials/analytics-content.ejs +0 -90
  677. package/dashboard/src/views/partials/breadcrumbs.ejs +0 -14
  678. package/dashboard/src/views/partials/dashboard-content.ejs +0 -84
  679. package/dashboard/src/views/partials/dependencies-content.ejs +0 -48
  680. package/dashboard/src/views/partials/empty-state.ejs +0 -7
  681. package/dashboard/src/views/partials/footer.ejs +0 -3
  682. package/dashboard/src/views/partials/head.ejs +0 -30
  683. package/dashboard/src/views/partials/header.ejs +0 -21
  684. package/dashboard/src/views/partials/layout-bottom.ejs +0 -43
  685. package/dashboard/src/views/partials/layout-top.ejs +0 -16
  686. package/dashboard/src/views/partials/milestone-detail-content.ejs +0 -20
  687. package/dashboard/src/views/partials/milestones-content.ejs +0 -88
  688. package/dashboard/src/views/partials/notes-content.ejs +0 -23
  689. package/dashboard/src/views/partials/phase-content.ejs +0 -193
  690. package/dashboard/src/views/partials/phase-doc-content.ejs +0 -38
  691. package/dashboard/src/views/partials/phases-content.ejs +0 -124
  692. package/dashboard/src/views/partials/roadmap-content.ejs +0 -180
  693. package/dashboard/src/views/partials/sidebar.ejs +0 -99
  694. package/dashboard/src/views/partials/todo-create-content.ejs +0 -54
  695. package/dashboard/src/views/partials/todo-detail-content.ejs +0 -42
  696. package/dashboard/src/views/partials/todos-content.ejs +0 -97
  697. package/dashboard/src/views/phase-detail.ejs +0 -5
  698. package/dashboard/src/views/phase-doc.ejs +0 -5
  699. package/dashboard/src/views/phases.ejs +0 -5
  700. package/dashboard/src/views/roadmap.ejs +0 -5
  701. package/dashboard/src/views/todo-create.ejs +0 -5
  702. package/dashboard/src/views/todo-detail.ejs +0 -5
  703. package/dashboard/src/views/todos.ejs +0 -5
  704. package/plugins/copilot-pbr/CHANGELOG.md +0 -19
  705. package/plugins/copilot-pbr/README.md +0 -139
  706. package/plugins/copilot-pbr/agents/audit.agent.md +0 -113
  707. package/plugins/copilot-pbr/agents/codebase-mapper.agent.md +0 -151
  708. package/plugins/copilot-pbr/agents/debugger.agent.md +0 -184
  709. package/plugins/copilot-pbr/agents/executor.agent.md +0 -269
  710. package/plugins/copilot-pbr/agents/general.agent.md +0 -89
  711. package/plugins/copilot-pbr/agents/integration-checker.agent.md +0 -121
  712. package/plugins/copilot-pbr/agents/plan-checker.agent.md +0 -208
  713. package/plugins/copilot-pbr/agents/planner.agent.md +0 -240
  714. package/plugins/copilot-pbr/agents/researcher.agent.md +0 -188
  715. package/plugins/copilot-pbr/agents/synthesizer.agent.md +0 -126
  716. package/plugins/copilot-pbr/agents/verifier.agent.md +0 -228
  717. package/plugins/copilot-pbr/hooks/hooks.json +0 -258
  718. package/plugins/copilot-pbr/plugin.json +0 -30
  719. package/plugins/copilot-pbr/references/agent-anti-patterns.md +0 -25
  720. package/plugins/copilot-pbr/references/agent-contracts.md +0 -297
  721. package/plugins/copilot-pbr/references/agent-interactions.md +0 -135
  722. package/plugins/copilot-pbr/references/agent-teams.md +0 -55
  723. package/plugins/copilot-pbr/references/checkpoints.md +0 -158
  724. package/plugins/copilot-pbr/references/common-bug-patterns.md +0 -14
  725. package/plugins/copilot-pbr/references/config-reference.md +0 -442
  726. package/plugins/copilot-pbr/references/continuation-format.md +0 -213
  727. package/plugins/copilot-pbr/references/deviation-rules.md +0 -113
  728. package/plugins/copilot-pbr/references/git-integration.md +0 -227
  729. package/plugins/copilot-pbr/references/integration-patterns.md +0 -118
  730. package/plugins/copilot-pbr/references/model-profiles.md +0 -100
  731. package/plugins/copilot-pbr/references/model-selection.md +0 -32
  732. package/plugins/copilot-pbr/references/pbr-rules.md +0 -195
  733. package/plugins/copilot-pbr/references/pbr-tools-cli.md +0 -285
  734. package/plugins/copilot-pbr/references/plan-authoring.md +0 -182
  735. package/plugins/copilot-pbr/references/plan-format.md +0 -288
  736. package/plugins/copilot-pbr/references/planning-config.md +0 -214
  737. package/plugins/copilot-pbr/references/questioning.md +0 -215
  738. package/plugins/copilot-pbr/references/reading-verification.md +0 -128
  739. package/plugins/copilot-pbr/references/stub-patterns.md +0 -161
  740. package/plugins/copilot-pbr/references/subagent-coordination.md +0 -120
  741. package/plugins/copilot-pbr/references/ui-formatting.md +0 -444
  742. package/plugins/copilot-pbr/references/verification-patterns.md +0 -199
  743. package/plugins/copilot-pbr/references/wave-execution.md +0 -96
  744. package/plugins/copilot-pbr/rules/pbr-workflow.mdc +0 -48
  745. package/plugins/copilot-pbr/setup.ps1 +0 -93
  746. package/plugins/copilot-pbr/setup.sh +0 -93
  747. package/plugins/copilot-pbr/skills/audit/SKILL.md +0 -330
  748. package/plugins/copilot-pbr/skills/begin/SKILL.md +0 -589
  749. package/plugins/copilot-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  750. package/plugins/copilot-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  751. package/plugins/copilot-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  752. package/plugins/copilot-pbr/skills/begin/templates/config.json.tmpl +0 -64
  753. package/plugins/copilot-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  754. package/plugins/copilot-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  755. package/plugins/copilot-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  756. package/plugins/copilot-pbr/skills/build/SKILL.md +0 -959
  757. package/plugins/copilot-pbr/skills/config/SKILL.md +0 -250
  758. package/plugins/copilot-pbr/skills/continue/SKILL.md +0 -159
  759. package/plugins/copilot-pbr/skills/dashboard/SKILL.md +0 -43
  760. package/plugins/copilot-pbr/skills/debug/SKILL.md +0 -508
  761. package/plugins/copilot-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  762. package/plugins/copilot-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  763. package/plugins/copilot-pbr/skills/discuss/SKILL.md +0 -353
  764. package/plugins/copilot-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  765. package/plugins/copilot-pbr/skills/discuss/templates/decision-categories.md +0 -10
  766. package/plugins/copilot-pbr/skills/do/SKILL.md +0 -66
  767. package/plugins/copilot-pbr/skills/explore/SKILL.md +0 -373
  768. package/plugins/copilot-pbr/skills/health/SKILL.md +0 -283
  769. package/plugins/copilot-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  770. package/plugins/copilot-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  771. package/plugins/copilot-pbr/skills/help/SKILL.md +0 -193
  772. package/plugins/copilot-pbr/skills/import/SKILL.md +0 -502
  773. package/plugins/copilot-pbr/skills/milestone/SKILL.md +0 -806
  774. package/plugins/copilot-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  775. package/plugins/copilot-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  776. package/plugins/copilot-pbr/skills/note/SKILL.md +0 -213
  777. package/plugins/copilot-pbr/skills/pause/SKILL.md +0 -247
  778. package/plugins/copilot-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  779. package/plugins/copilot-pbr/skills/plan/SKILL.md +0 -662
  780. package/plugins/copilot-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  781. package/plugins/copilot-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  782. package/plugins/copilot-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  783. package/plugins/copilot-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  784. package/plugins/copilot-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  785. package/plugins/copilot-pbr/skills/quick/SKILL.md +0 -376
  786. package/plugins/copilot-pbr/skills/resume/SKILL.md +0 -399
  787. package/plugins/copilot-pbr/skills/review/SKILL.md +0 -653
  788. package/plugins/copilot-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  789. package/plugins/copilot-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  790. package/plugins/copilot-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  791. package/plugins/copilot-pbr/skills/scan/SKILL.md +0 -299
  792. package/plugins/copilot-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  793. package/plugins/copilot-pbr/skills/setup/SKILL.md +0 -296
  794. package/plugins/copilot-pbr/skills/shared/commit-planning-docs.md +0 -36
  795. package/plugins/copilot-pbr/skills/shared/config-loading.md +0 -103
  796. package/plugins/copilot-pbr/skills/shared/context-budget.md +0 -41
  797. package/plugins/copilot-pbr/skills/shared/context-loader-task.md +0 -87
  798. package/plugins/copilot-pbr/skills/shared/digest-select.md +0 -80
  799. package/plugins/copilot-pbr/skills/shared/domain-probes.md +0 -126
  800. package/plugins/copilot-pbr/skills/shared/error-recovery-strategies.md +0 -51
  801. package/plugins/copilot-pbr/skills/shared/error-reporting.md +0 -81
  802. package/plugins/copilot-pbr/skills/shared/gate-prompts.md +0 -389
  803. package/plugins/copilot-pbr/skills/shared/phase-argument-parsing.md +0 -46
  804. package/plugins/copilot-pbr/skills/shared/progress-display.md +0 -53
  805. package/plugins/copilot-pbr/skills/shared/revision-loop.md +0 -82
  806. package/plugins/copilot-pbr/skills/shared/state-loading.md +0 -63
  807. package/plugins/copilot-pbr/skills/shared/state-update.md +0 -170
  808. package/plugins/copilot-pbr/skills/shared/universal-anti-patterns.md +0 -38
  809. package/plugins/copilot-pbr/skills/status/SKILL.md +0 -362
  810. package/plugins/copilot-pbr/skills/statusline/SKILL.md +0 -149
  811. package/plugins/copilot-pbr/skills/todo/SKILL.md +0 -279
  812. package/plugins/copilot-pbr/templates/CONTEXT.md.tmpl +0 -53
  813. package/plugins/copilot-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  814. package/plugins/copilot-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  815. package/plugins/copilot-pbr/templates/ROADMAP.md.tmpl +0 -48
  816. package/plugins/copilot-pbr/templates/SUMMARY.md.tmpl +0 -82
  817. package/plugins/copilot-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  818. package/plugins/copilot-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  819. package/plugins/copilot-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  820. package/plugins/copilot-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  821. package/plugins/copilot-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  822. package/plugins/copilot-pbr/templates/codebase/STACK.md.tmpl +0 -78
  823. package/plugins/copilot-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  824. package/plugins/copilot-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  825. package/plugins/copilot-pbr/templates/continue-here.md.tmpl +0 -74
  826. package/plugins/copilot-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  827. package/plugins/copilot-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  828. package/plugins/copilot-pbr/templates/research/STACK.md.tmpl +0 -71
  829. package/plugins/copilot-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  830. package/plugins/copilot-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  831. package/plugins/copilot-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  832. package/plugins/copilot-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  833. package/plugins/cursor-pbr/.cursor-plugin/plugin.json +0 -32
  834. package/plugins/cursor-pbr/CHANGELOG.md +0 -15
  835. package/plugins/cursor-pbr/README.md +0 -123
  836. package/plugins/cursor-pbr/agents/audit.md +0 -178
  837. package/plugins/cursor-pbr/agents/codebase-mapper.md +0 -150
  838. package/plugins/cursor-pbr/agents/debugger.md +0 -183
  839. package/plugins/cursor-pbr/agents/executor.md +0 -268
  840. package/plugins/cursor-pbr/agents/general.md +0 -88
  841. package/plugins/cursor-pbr/agents/integration-checker.md +0 -120
  842. package/plugins/cursor-pbr/agents/plan-checker.md +0 -207
  843. package/plugins/cursor-pbr/agents/planner.md +0 -239
  844. package/plugins/cursor-pbr/agents/researcher.md +0 -187
  845. package/plugins/cursor-pbr/agents/synthesizer.md +0 -125
  846. package/plugins/cursor-pbr/agents/verifier.md +0 -227
  847. package/plugins/cursor-pbr/assets/.gitkeep +0 -0
  848. package/plugins/cursor-pbr/assets/logo.svg +0 -21
  849. package/plugins/cursor-pbr/hooks/hooks.json +0 -224
  850. package/plugins/cursor-pbr/references/agent-anti-patterns.md +0 -25
  851. package/plugins/cursor-pbr/references/agent-contracts.md +0 -297
  852. package/plugins/cursor-pbr/references/agent-interactions.md +0 -135
  853. package/plugins/cursor-pbr/references/agent-teams.md +0 -55
  854. package/plugins/cursor-pbr/references/checkpoints.md +0 -158
  855. package/plugins/cursor-pbr/references/common-bug-patterns.md +0 -14
  856. package/plugins/cursor-pbr/references/config-reference.md +0 -442
  857. package/plugins/cursor-pbr/references/continuation-format.md +0 -213
  858. package/plugins/cursor-pbr/references/deviation-rules.md +0 -113
  859. package/plugins/cursor-pbr/references/git-integration.md +0 -227
  860. package/plugins/cursor-pbr/references/integration-patterns.md +0 -118
  861. package/plugins/cursor-pbr/references/model-profiles.md +0 -100
  862. package/plugins/cursor-pbr/references/model-selection.md +0 -32
  863. package/plugins/cursor-pbr/references/pbr-rules.md +0 -195
  864. package/plugins/cursor-pbr/references/pbr-tools-cli.md +0 -285
  865. package/plugins/cursor-pbr/references/plan-authoring.md +0 -182
  866. package/plugins/cursor-pbr/references/plan-format.md +0 -288
  867. package/plugins/cursor-pbr/references/planning-config.md +0 -214
  868. package/plugins/cursor-pbr/references/questioning.md +0 -215
  869. package/plugins/cursor-pbr/references/reading-verification.md +0 -128
  870. package/plugins/cursor-pbr/references/stub-patterns.md +0 -161
  871. package/plugins/cursor-pbr/references/subagent-coordination.md +0 -120
  872. package/plugins/cursor-pbr/references/ui-formatting.md +0 -444
  873. package/plugins/cursor-pbr/references/verification-patterns.md +0 -199
  874. package/plugins/cursor-pbr/references/wave-execution.md +0 -96
  875. package/plugins/cursor-pbr/rules/pbr-workflow.mdc +0 -48
  876. package/plugins/cursor-pbr/setup.ps1 +0 -78
  877. package/plugins/cursor-pbr/setup.sh +0 -83
  878. package/plugins/cursor-pbr/skills/audit/SKILL.md +0 -331
  879. package/plugins/cursor-pbr/skills/begin/SKILL.md +0 -589
  880. package/plugins/cursor-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  881. package/plugins/cursor-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  882. package/plugins/cursor-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  883. package/plugins/cursor-pbr/skills/begin/templates/config.json.tmpl +0 -64
  884. package/plugins/cursor-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  885. package/plugins/cursor-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  886. package/plugins/cursor-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  887. package/plugins/cursor-pbr/skills/build/SKILL.md +0 -960
  888. package/plugins/cursor-pbr/skills/config/SKILL.md +0 -252
  889. package/plugins/cursor-pbr/skills/continue/SKILL.md +0 -159
  890. package/plugins/cursor-pbr/skills/dashboard/SKILL.md +0 -44
  891. package/plugins/cursor-pbr/skills/debug/SKILL.md +0 -512
  892. package/plugins/cursor-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  893. package/plugins/cursor-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  894. package/plugins/cursor-pbr/skills/discuss/SKILL.md +0 -354
  895. package/plugins/cursor-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  896. package/plugins/cursor-pbr/skills/discuss/templates/decision-categories.md +0 -10
  897. package/plugins/cursor-pbr/skills/do/SKILL.md +0 -67
  898. package/plugins/cursor-pbr/skills/explore/SKILL.md +0 -376
  899. package/plugins/cursor-pbr/skills/health/SKILL.md +0 -283
  900. package/plugins/cursor-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  901. package/plugins/cursor-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  902. package/plugins/cursor-pbr/skills/help/SKILL.md +0 -193
  903. package/plugins/cursor-pbr/skills/import/SKILL.md +0 -505
  904. package/plugins/cursor-pbr/skills/milestone/SKILL.md +0 -807
  905. package/plugins/cursor-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  906. package/plugins/cursor-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  907. package/plugins/cursor-pbr/skills/note/SKILL.md +0 -214
  908. package/plugins/cursor-pbr/skills/pause/SKILL.md +0 -248
  909. package/plugins/cursor-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  910. package/plugins/cursor-pbr/skills/plan/SKILL.md +0 -663
  911. package/plugins/cursor-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  912. package/plugins/cursor-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  913. package/plugins/cursor-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  914. package/plugins/cursor-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  915. package/plugins/cursor-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  916. package/plugins/cursor-pbr/skills/quick/SKILL.md +0 -376
  917. package/plugins/cursor-pbr/skills/resume/SKILL.md +0 -399
  918. package/plugins/cursor-pbr/skills/review/SKILL.md +0 -654
  919. package/plugins/cursor-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  920. package/plugins/cursor-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  921. package/plugins/cursor-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  922. package/plugins/cursor-pbr/skills/scan/SKILL.md +0 -300
  923. package/plugins/cursor-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  924. package/plugins/cursor-pbr/skills/setup/SKILL.md +0 -296
  925. package/plugins/cursor-pbr/skills/shared/commit-planning-docs.md +0 -36
  926. package/plugins/cursor-pbr/skills/shared/config-loading.md +0 -103
  927. package/plugins/cursor-pbr/skills/shared/context-budget.md +0 -41
  928. package/plugins/cursor-pbr/skills/shared/context-loader-task.md +0 -87
  929. package/plugins/cursor-pbr/skills/shared/digest-select.md +0 -80
  930. package/plugins/cursor-pbr/skills/shared/domain-probes.md +0 -126
  931. package/plugins/cursor-pbr/skills/shared/error-recovery-strategies.md +0 -51
  932. package/plugins/cursor-pbr/skills/shared/error-reporting.md +0 -81
  933. package/plugins/cursor-pbr/skills/shared/gate-prompts.md +0 -389
  934. package/plugins/cursor-pbr/skills/shared/phase-argument-parsing.md +0 -46
  935. package/plugins/cursor-pbr/skills/shared/progress-display.md +0 -53
  936. package/plugins/cursor-pbr/skills/shared/revision-loop.md +0 -82
  937. package/plugins/cursor-pbr/skills/shared/state-loading.md +0 -63
  938. package/plugins/cursor-pbr/skills/shared/state-update.md +0 -170
  939. package/plugins/cursor-pbr/skills/shared/universal-anti-patterns.md +0 -38
  940. package/plugins/cursor-pbr/skills/status/SKILL.md +0 -362
  941. package/plugins/cursor-pbr/skills/statusline/SKILL.md +0 -150
  942. package/plugins/cursor-pbr/skills/todo/SKILL.md +0 -280
  943. package/plugins/cursor-pbr/templates/CONTEXT.md.tmpl +0 -53
  944. package/plugins/cursor-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  945. package/plugins/cursor-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  946. package/plugins/cursor-pbr/templates/ROADMAP.md.tmpl +0 -48
  947. package/plugins/cursor-pbr/templates/SUMMARY.md.tmpl +0 -82
  948. package/plugins/cursor-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  949. package/plugins/cursor-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  950. package/plugins/cursor-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  951. package/plugins/cursor-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  952. package/plugins/cursor-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  953. package/plugins/cursor-pbr/templates/codebase/STACK.md.tmpl +0 -78
  954. package/plugins/cursor-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  955. package/plugins/cursor-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  956. package/plugins/cursor-pbr/templates/continue-here.md.tmpl +0 -74
  957. package/plugins/cursor-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  958. package/plugins/cursor-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  959. package/plugins/cursor-pbr/templates/research/STACK.md.tmpl +0 -71
  960. package/plugins/cursor-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  961. package/plugins/cursor-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  962. package/plugins/cursor-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  963. package/plugins/cursor-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  964. package/plugins/pbr/references/agent-interactions.md +0 -134
  965. package/plugins/pbr/references/pbr-rules.md +0 -194
  966. package/plugins/pbr/references/pbr-tools-cli.md +0 -285
  967. package/plugins/pbr/references/planning-config.md +0 -213
  968. package/plugins/pbr/references/subagent-coordination.md +0 -119
  969. package/plugins/pbr/references/ui-formatting.md +0 -444
  970. package/plugins/pbr/scripts/validate-plugin-structure.js +0 -183
  971. package/plugins/pbr/skills/milestone/templates/audit-report.md.tmpl +0 -48
  972. package/plugins/pbr/skills/shared/error-recovery-strategies.md +0 -51
  973. package/plugins/pbr/skills/shared/progress-display.md +0 -53
  974. package/plugins/pbr/skills/shared/state-loading.md +0 -62
  975. package/plugins/pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -97
  976. package/plugins/pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  977. package/plugins/pbr/templates/research/STACK.md.tmpl +0 -71
  978. package/plugins/pbr/templates/research/SUMMARY.md.tmpl +0 -112
  979. package/plugins/pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  980. package/plugins/pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  981. package/plugins/pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  982. /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
+ };