@sienklogic/plan-build-run 2.11.0 → 2.12.1

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