@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,1097 @@
1
+ /**
2
+ * lib/roadmap.cjs — ROADMAP.md operations for Plan-Build-Run tools.
3
+ *
4
+ * Handles parsing and updating the ROADMAP.md phase overview table,
5
+ * comprehensive analysis with disk cross-referencing, and dynamic
6
+ * phase operations (append, remove, insert, renumber).
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
+ lockedFileUpdate,
15
+ validateStatusTransition,
16
+ parseYamlFrontmatter,
17
+ findFiles
18
+ } = require('./core.cjs');
19
+
20
+ // --- Parsers ---
21
+
22
+ function parseRoadmapMd(content) {
23
+ // Normalize CRLF to LF at parse boundary for cross-platform support
24
+ const normalized = content.replace(/\r\n/g, '\n');
25
+ // Strip <details>/<summary> tags so collapsed milestones are parsed
26
+ const stripped = normalized
27
+ .replace(/<\/?details>/gi, '')
28
+ .replace(/<\/?summary>/gi, '');
29
+ const result = { phases: [], has_progress_table: false };
30
+
31
+ // Parse Progress table (primary) or Phase Overview table (legacy fallback)
32
+ const progressMatch = stripped.match(/## Progress[\s\S]*?(?=\n##(?!\s*Progress)|\s*$)/);
33
+ // Only use Progress table if it actually contains a markdown table with pipe rows
34
+ const progressRows = progressMatch ? progressMatch[0].split('\n').filter(r => r.includes('|')) : [];
35
+ if (progressMatch && progressRows.length >= 2) {
36
+ result.has_progress_table = true;
37
+ const rows = progressRows;
38
+ if (rows.length >= 2) {
39
+ // Dynamic column detection from header row
40
+ const headers = rows[0].split('|').map(h => h.trim().toLowerCase()).filter(Boolean);
41
+ const colIdx = {
42
+ phase: headers.findIndex(h => /phase/i.test(h)),
43
+ milestone: headers.findIndex(h => /milestone/i.test(h)),
44
+ plans: headers.findIndex(h => /plans?\s*complete/i.test(h)),
45
+ status: headers.findIndex(h => /status/i.test(h)),
46
+ completed: headers.findIndex(h => /completed/i.test(h))
47
+ };
48
+
49
+ // Skip header (0) and separator (1) rows
50
+ for (let i = 2; i < rows.length; i++) {
51
+ const cols = rows[i].split('|').map(c => c.trim()).filter(Boolean);
52
+ if (cols.length >= 2) {
53
+ result.phases.push({
54
+ number: colIdx.phase !== -1 ? cols[colIdx.phase] || '' : cols[0] || '',
55
+ name: '', // Name is embedded in Phase column as "N. Name"
56
+ goal: '',
57
+ plans: colIdx.plans !== -1 && colIdx.plans < cols.length ? cols[colIdx.plans] : '',
58
+ milestone: colIdx.milestone !== -1 && colIdx.milestone < cols.length ? cols[colIdx.milestone] : '',
59
+ status: colIdx.status !== -1 && colIdx.status < cols.length ? cols[colIdx.status] : 'pending',
60
+ completed: colIdx.completed !== -1 && colIdx.completed < cols.length ? cols[colIdx.completed] : ''
61
+ });
62
+ }
63
+ }
64
+ }
65
+ } else {
66
+ // Fallback: try legacy Phase Overview table
67
+ const overviewMatch = stripped.match(/## Phase Overview[\s\S]*?\|[\s\S]*?(?=\n##|\s*$)/);
68
+ if (overviewMatch) {
69
+ const rows = overviewMatch[0].split('\n').filter(r => r.includes('|'));
70
+ for (let i = 2; i < rows.length; i++) {
71
+ const cols = rows[i].split('|').map(c => c.trim()).filter(Boolean);
72
+ if (cols.length >= 3) {
73
+ result.phases.push({
74
+ number: cols[0],
75
+ name: cols[1],
76
+ goal: cols[2],
77
+ plans: cols[3] || '',
78
+ wave: cols[4] || '',
79
+ status: cols[5] || 'pending'
80
+ });
81
+ }
82
+ }
83
+ }
84
+ // Even without a parseable Progress table, note if the heading exists
85
+ result.has_progress_table = !!progressMatch;
86
+ }
87
+
88
+ // Parse phase heading blocks for requirements and success criteria
89
+ const lines = stripped.split('\n');
90
+ const phaseMap = new Map();
91
+ for (const phase of result.phases) {
92
+ const numMatch = String(phase.number).match(/^(\d+)/);
93
+ if (numMatch) phaseMap.set(parseInt(numMatch[1], 10), phase);
94
+ }
95
+
96
+ for (let i = 0; i < lines.length; i++) {
97
+ const phaseMatch = lines[i].match(/^###\s+Phase\s+(\d+)\s*:\s*(.*)/i);
98
+ if (phaseMatch) {
99
+ const phaseNum = parseInt(phaseMatch[1], 10);
100
+ const phase = phaseMap.get(phaseNum);
101
+ if (phase) {
102
+ if (!phase.name) phase.name = phaseMatch[2].trim();
103
+ // Look ahead for fields
104
+ for (let j = i + 1; j < Math.min(i + 20, lines.length); j++) {
105
+ if (/^#{1,3}\s/.test(lines[j])) break;
106
+ const goalMatch = lines[j].match(/\*\*Goal:\*\*\s*(.*)/i);
107
+ if (goalMatch && !phase.goal) phase.goal = goalMatch[1].trim();
108
+ const reqMatch = lines[j].match(/\*\*Requirements:\*\*\s*(.*)/i);
109
+ if (reqMatch) phase.requirements = reqMatch[1].trim();
110
+ const critMatch = lines[j].match(/\*\*Success Criteria:\*\*\s*(.*)/i);
111
+ if (critMatch) phase.success_criteria = critMatch[1].trim();
112
+ }
113
+ }
114
+ }
115
+ }
116
+
117
+ return result;
118
+ }
119
+
120
+ // --- Table helpers ---
121
+
122
+ /**
123
+ * Find the row index of a phase in a ROADMAP.md table.
124
+ * @returns {number} Line index or -1 if not found
125
+ */
126
+ function findRoadmapRow(lines, phaseNum) {
127
+ const paddedPhase = phaseNum.padStart(2, '0');
128
+ const numericPhase = String(parseInt(phaseNum, 10));
129
+ for (let i = 0; i < lines.length; i++) {
130
+ if (!lines[i].includes('|')) continue;
131
+ // Skip separator rows
132
+ if (/^\s*\|[\s-:|]+\|\s*$/.test(lines[i])) continue;
133
+ const parts = lines[i].split('|');
134
+ if (parts.length < 3) continue;
135
+ // Search ALL columns for a phase number match (handles both old and new column layouts)
136
+ // Handles v9+ format: "| 21. Phase Name | X/Y | Status |" (number+name merged in 3-col table)
137
+ // as well as legacy formats: "| 21 | Phase Name | ... |" (separate columns)
138
+ for (let c = 1; c < parts.length - 1; c++) {
139
+ const col = (parts[c] || '').trim();
140
+ // Match "01", "1", "01.", "01. Name", etc.
141
+ const match = col.match(/^0*(\d+)\./);
142
+ if (match && (match[1] === numericPhase || col === paddedPhase)) {
143
+ return i;
144
+ }
145
+ if (col === paddedPhase || col === numericPhase) {
146
+ return i;
147
+ }
148
+ }
149
+ }
150
+ return -1;
151
+ }
152
+
153
+ /**
154
+ * Update a specific column in a markdown table row.
155
+ * @param {string} row - The full table row string (e.g., "| 01 | Setup | ... |")
156
+ * @param {number} columnIndex - 0-based column index (Phase=0, Name=1, ..., Status=5)
157
+ * @param {string} newValue - New cell value
158
+ * @returns {string} Updated row
159
+ */
160
+ function updateTableRow(row, columnIndex, newValue) {
161
+ const parts = row.split('|');
162
+ // parts[0] is empty (before first |), data starts at parts[1]
163
+ const partIndex = columnIndex + 1;
164
+ if (partIndex < parts.length) {
165
+ parts[partIndex] = ` ${newValue} `;
166
+ }
167
+ return parts.join('|');
168
+ }
169
+
170
+ /**
171
+ * Find the pipe-delimited column index for a header matching `pattern` by
172
+ * scanning backward from `rowIdx` to find the nearest header row.
173
+ * Returns the raw split('|') index (includes leading empty element), or -1.
174
+ */
175
+ function _findColumnIndex(lines, rowIdx, pattern) {
176
+ // Scan backward from rowIdx to find the header row
177
+ for (let h = rowIdx - 1; h >= 0; h--) {
178
+ if (!lines[h].includes('|')) continue;
179
+ // Skip separator rows
180
+ if (/^\s*\|[\s-:|]+\|\s*$/.test(lines[h])) continue;
181
+ // Check if this looks like a header (contains recognizable column names)
182
+ if (/phase/i.test(lines[h]) || /status/i.test(lines[h]) || /plans/i.test(lines[h])) {
183
+ const parts = lines[h].split('|');
184
+ for (let c = 0; c < parts.length; c++) {
185
+ if (pattern.test(parts[c].trim())) return c;
186
+ }
187
+ }
188
+ }
189
+ return -1;
190
+ }
191
+
192
+ // --- Mutation commands ---
193
+
194
+ /**
195
+ * Update the Status column for a phase in ROADMAP.md's Phase Overview table.
196
+ *
197
+ * @param {string} phaseNum - Phase number
198
+ * @param {string} newStatus - New status value
199
+ * @param {string} [planningDir] - Path to .planning directory
200
+ */
201
+ function roadmapUpdateStatus(phaseNum, newStatus, planningDir) {
202
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
203
+ const roadmapPath = path.join(dir, 'ROADMAP.md');
204
+ if (!fs.existsSync(roadmapPath)) {
205
+ return { success: false, error: 'ROADMAP.md not found' };
206
+ }
207
+
208
+ let oldStatus = null;
209
+
210
+ const result = lockedFileUpdate(roadmapPath, (content) => {
211
+ const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
212
+ const lines = content.replace(/\r\n/g, '\n').split('\n');
213
+ const rowIdx = findRoadmapRow(lines, phaseNum);
214
+ if (rowIdx === -1) {
215
+ return content; // No matching row found
216
+ }
217
+ // Dynamic column detection: find Status column from nearest header row
218
+ const statusColIdx = _findColumnIndex(lines, rowIdx, /status/i);
219
+ const parts = lines[rowIdx].split('|');
220
+ if (statusColIdx !== -1 && statusColIdx < parts.length) {
221
+ oldStatus = parts[statusColIdx] ? parts[statusColIdx].trim() : 'unknown';
222
+ parts[statusColIdx] = ` ${newStatus} `;
223
+ lines[rowIdx] = parts.join('|');
224
+ } else {
225
+ // Fallback: detect column count to pick correct index
226
+ // 3-col table (v9+ format): Status at raw index 3; legacy 6-col: index 5
227
+ const colCount = parts.filter(p => p.trim()).length;
228
+ const fallbackIdx = colCount <= 3 ? 3 : 5;
229
+ oldStatus = parts[fallbackIdx] ? parts[fallbackIdx].trim() : (parts[4] ? parts[4].trim() : 'unknown');
230
+ lines[rowIdx] = updateTableRow(lines[rowIdx], fallbackIdx - 1, newStatus);
231
+ }
232
+ return lines.join(lineEnding);
233
+ });
234
+
235
+ if (!oldStatus) {
236
+ return { success: false, error: `Phase ${phaseNum} not found in ROADMAP.md table` };
237
+ }
238
+
239
+ // Advisory transition validation -- warn on suspicious transitions but don't block
240
+ const transition = validateStatusTransition(oldStatus, newStatus);
241
+ if (!transition.valid && transition.warning) {
242
+ process.stderr.write(`[pbr-tools] WARNING: ${transition.warning}\n`);
243
+ }
244
+
245
+ if (result.success) {
246
+ const response = { success: true, old_status: oldStatus, new_status: newStatus };
247
+ if (!transition.valid) {
248
+ response.transition_warning = transition.warning;
249
+ }
250
+ return response;
251
+ }
252
+ return { success: false, error: result.error };
253
+ }
254
+
255
+ /**
256
+ * Update the Plans column for a phase in ROADMAP.md's Phase Overview table.
257
+ *
258
+ * @param {string} phaseNum - Phase number
259
+ * @param {string} complete - Completed plan count
260
+ * @param {string} total - Total plan count
261
+ * @param {string} [planningDir] - Path to .planning directory
262
+ */
263
+ function roadmapUpdatePlans(phaseNum, complete, total, planningDir) {
264
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
265
+ const roadmapPath = path.join(dir, 'ROADMAP.md');
266
+ if (!fs.existsSync(roadmapPath)) {
267
+ return { success: false, error: 'ROADMAP.md not found' };
268
+ }
269
+
270
+ let oldPlans = null;
271
+ const newPlans = `${complete}/${total}`;
272
+
273
+ const result = lockedFileUpdate(roadmapPath, (content) => {
274
+ const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
275
+ const lines = content.replace(/\r\n/g, '\n').split('\n');
276
+ const rowIdx = findRoadmapRow(lines, phaseNum);
277
+ if (rowIdx === -1) {
278
+ return content;
279
+ }
280
+ // Dynamic column detection: find Plans Complete column from nearest header row
281
+ const plansColIdx = _findColumnIndex(lines, rowIdx, /plans?\s*complete/i);
282
+ const parts = lines[rowIdx].split('|');
283
+ if (plansColIdx !== -1 && plansColIdx < parts.length) {
284
+ oldPlans = parts[plansColIdx] ? parts[plansColIdx].trim() : 'unknown';
285
+ parts[plansColIdx] = ` ${newPlans} `;
286
+ lines[rowIdx] = parts.join('|');
287
+ } else {
288
+ // Fallback: detect column count to pick correct index
289
+ // 3-col table (v9+ format): Plans Complete at raw index 2; legacy 6-col: index 3
290
+ const colCount = parts.filter(p => p.trim()).length;
291
+ const fallbackIdx = colCount <= 3 ? 2 : 3;
292
+ oldPlans = parts[fallbackIdx + 1] ? parts[fallbackIdx + 1].trim() : (parts[2] ? parts[2].trim() : 'unknown');
293
+ lines[rowIdx] = updateTableRow(lines[rowIdx], fallbackIdx, newPlans);
294
+ }
295
+ return lines.join(lineEnding);
296
+ });
297
+
298
+ if (!oldPlans) {
299
+ return { success: false, error: `Phase ${phaseNum} not found in ROADMAP.md table` };
300
+ }
301
+
302
+ if (result.success) {
303
+ return { success: true, old_plans: oldPlans, new_plans: newPlans };
304
+ }
305
+ return { success: false, error: result.error };
306
+ }
307
+
308
+ /**
309
+ * Update plan progress for a specific phase in ROADMAP.md.
310
+ * GSD-unique: updates progress table row, plan count in phase section,
311
+ * and checkbox completion status.
312
+ *
313
+ * @param {string} phaseNum - Phase number
314
+ * @param {string} [planningDir] - Path to .planning directory
315
+ */
316
+ function roadmapUpdatePlanProgress(phaseNum, planningDir) {
317
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
318
+ const roadmapPath = path.join(dir, 'ROADMAP.md');
319
+ if (!fs.existsSync(roadmapPath)) {
320
+ return { success: false, error: 'ROADMAP.md not found' };
321
+ }
322
+
323
+ // Find the phase directory to count plans and summaries
324
+ const phasesDir = path.join(dir, 'phases');
325
+ if (!fs.existsSync(phasesDir)) {
326
+ return { success: false, error: 'No phases directory found' };
327
+ }
328
+
329
+ const paddedPhase = String(phaseNum).padStart(2, '0');
330
+ let phaseDir = null;
331
+ try {
332
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
333
+ for (const entry of entries) {
334
+ if (entry.isDirectory() && entry.name.startsWith(paddedPhase + '-')) {
335
+ phaseDir = path.join(phasesDir, entry.name);
336
+ break;
337
+ }
338
+ }
339
+ } catch (_e) { /* ignore */ }
340
+
341
+ if (!phaseDir) {
342
+ return { success: false, error: `Phase ${phaseNum} directory not found` };
343
+ }
344
+
345
+ const planFiles = findFiles(phaseDir, /PLAN.*\.md$/i);
346
+ const summaryFiles = findFiles(phaseDir, /SUMMARY.*\.md$/i);
347
+ const planCount = planFiles.length;
348
+ const summaryCount = summaryFiles.length;
349
+
350
+ if (planCount === 0) {
351
+ return { success: false, error: 'No plans found', plan_count: 0, summary_count: 0 };
352
+ }
353
+
354
+ const isComplete = summaryCount >= planCount;
355
+ const status = isComplete ? 'Complete' : summaryCount > 0 ? 'In Progress' : 'Planned';
356
+ const today = new Date().toISOString().slice(0, 10);
357
+
358
+ const { escapeRegex } = require('./core.cjs');
359
+ const phaseEscaped = escapeRegex(String(phaseNum));
360
+
361
+ const result = lockedFileUpdate(roadmapPath, (content) => {
362
+ let updated = content;
363
+
364
+ // Progress table row: update Plans column (summaries/plans) and Status column
365
+ const tablePattern = new RegExp(
366
+ `(\\|\\s*${phaseEscaped}\\.?\\s[^|]*\\|)[^|]*(\\|)\\s*[^|]*(\\|)\\s*[^|]*(\\|)`,
367
+ 'i'
368
+ );
369
+ const dateField = isComplete ? ` ${today} ` : ' ';
370
+ updated = updated.replace(
371
+ tablePattern,
372
+ `$1 ${summaryCount}/${planCount} $2 ${status.padEnd(11)}$3${dateField}$4`
373
+ );
374
+
375
+ // Update plan count in phase detail section
376
+ const planCountPattern = new RegExp(
377
+ `(#{2,4}\\s*Phase\\s+${phaseEscaped}[\\s\\S]*?\\*\\*Plans:\\*\\*\\s*)[^\\n]+`,
378
+ 'i'
379
+ );
380
+ const planCountText = isComplete
381
+ ? `${summaryCount}/${planCount} plans complete`
382
+ : `${summaryCount}/${planCount} plans executed`;
383
+ updated = updated.replace(planCountPattern, `$1${planCountText}`);
384
+
385
+ // If complete: check checkbox
386
+ if (isComplete) {
387
+ const checkboxPattern = new RegExp(
388
+ `(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${phaseEscaped}[:\\s][^\\n]*)`,
389
+ 'i'
390
+ );
391
+ updated = updated.replace(checkboxPattern, `$1x$2 (completed ${today})`);
392
+ }
393
+
394
+ return updated;
395
+ });
396
+
397
+ if (result.success) {
398
+ return { success: true, phase: phaseNum, plan_count: planCount, summary_count: summaryCount, status, complete: isComplete };
399
+ }
400
+ return { success: false, error: result.error };
401
+ }
402
+
403
+ // --- Comprehensive analysis ---
404
+
405
+ /**
406
+ * Analyze ROADMAP.md comprehensively, cross-referencing with disk state.
407
+ *
408
+ * Returns a structured object with all phases, their goals, dependencies,
409
+ * progress, disk status, and aggregated statistics.
410
+ *
411
+ * @param {string} planningDir - Path to .planning/ directory
412
+ * @returns {{ phases: Array, current_phase: number|null, next_phase: number|null, stats: object, error?: string }}
413
+ */
414
+ function roadmapAnalyze(planningDir) {
415
+ const roadmapPath = path.join(planningDir, 'ROADMAP.md');
416
+ if (!fs.existsSync(roadmapPath)) {
417
+ return { phases: [], current_phase: null, next_phase: null, stats: _emptyStats(), error: 'ROADMAP.md not found' };
418
+ }
419
+
420
+ // snapshot pattern: single read, parse from memory -- no re-reads during analysis or renumbering
421
+ const content = fs.readFileSync(roadmapPath, 'utf8');
422
+ // Strip <details>/<summary> tags so collapsed milestones are parsed correctly
423
+ const stripped = content.replace(/<\/?details>/gi, '').replace(/<\/?summary>/gi, '');
424
+ const lines = stripped.split(/\r?\n/);
425
+
426
+ // 1. Parse phase headings, goals, dependencies from milestone sections
427
+ const phases = _parsePhaseHeadings(lines);
428
+
429
+ // 2. Parse progress tables and merge
430
+ _mergeProgressTables(lines, phases);
431
+
432
+ // 3. Parse phase checklist items and merge
433
+ _mergePhaseChecklist(lines, phases);
434
+
435
+ // 4. Cross-reference with disk
436
+ const phasesDir = path.join(planningDir, 'phases');
437
+ for (const phase of phases) {
438
+ _crossReferenceDisk(phase, phasesDir);
439
+ }
440
+
441
+ // 5. Get current_phase from STATE.md
442
+ let current_phase = null;
443
+ const statePath = path.join(planningDir, 'STATE.md');
444
+ if (fs.existsSync(statePath)) {
445
+ try {
446
+ const stateContent = fs.readFileSync(statePath, 'utf8');
447
+ const fm = parseYamlFrontmatter(stateContent);
448
+ if (fm && fm.current_phase != null) {
449
+ current_phase = typeof fm.current_phase === 'number' ? fm.current_phase : parseInt(fm.current_phase, 10);
450
+ if (isNaN(current_phase)) current_phase = null;
451
+ }
452
+ } catch (_e) { /* ignore */ }
453
+ }
454
+
455
+ // 6. Derive next_phase
456
+ let next_phase = null;
457
+ if (current_phase != null) {
458
+ // Find phases after current that are not complete
459
+ const remaining = phases
460
+ .filter(p => p.number > current_phase && p.disk_status !== 'complete')
461
+ .sort((a, b) => a.number - b.number);
462
+ if (remaining.length > 0) {
463
+ next_phase = remaining[0].number;
464
+ }
465
+ }
466
+
467
+ // 7. Compute stats
468
+ const stats = _computeStats(phases);
469
+
470
+ return { phases, current_phase, next_phase, stats };
471
+ }
472
+
473
+ function _emptyStats() {
474
+ return {
475
+ total_phases: 0,
476
+ total_plans: 0,
477
+ total_summaries: 0,
478
+ progress_percent: 0,
479
+ phases_complete: 0,
480
+ phases_remaining: 0
481
+ };
482
+ }
483
+
484
+ /**
485
+ * Parse `### Phase N:` headings within milestone `## Milestone:` sections.
486
+ */
487
+ function _parsePhaseHeadings(lines) {
488
+ const phases = [];
489
+ const phaseMap = new Map();
490
+ let currentMilestone = null;
491
+
492
+ // Strip <details>/<summary> HTML tags from lines so collapsed milestones are parsed
493
+ const cleanLines = lines.map(l => l.replace(/<\/?details>/gi, '').replace(/<\/?summary>/gi, ''));
494
+
495
+ for (let i = 0; i < cleanLines.length; i++) {
496
+ const line = cleanLines[i];
497
+
498
+ // Detect milestone heading: ## Milestone: ... or ## Milestone N: ...
499
+ const milestoneMatch = line.match(/^##\s+Milestone[:\s]+(.*)/i);
500
+ if (milestoneMatch) {
501
+ currentMilestone = milestoneMatch[1].trim();
502
+ continue;
503
+ }
504
+
505
+ // Detect phase heading: ### Phase N: Name or ### Phase NN: Name
506
+ const phaseMatch = line.match(/^###\s+Phase\s+(\d+)\s*:\s*(.*)/i);
507
+ if (phaseMatch) {
508
+ const phaseNum = parseInt(phaseMatch[1], 10);
509
+ const phaseName = phaseMatch[2].trim();
510
+
511
+ // Look ahead for **Goal:**, **Depends on:**, **Requirements:**, **Success Criteria:**
512
+ let goal = '';
513
+ let depends_on = [];
514
+ let requirements = '';
515
+ let success_criteria = '';
516
+ for (let j = i + 1; j < Math.min(i + 20, cleanLines.length); j++) {
517
+ const ahead = cleanLines[j];
518
+ // Stop at next heading
519
+ if (/^#{1,3}\s/.test(ahead)) break;
520
+
521
+ const goalMatch = ahead.match(/\*\*Goal:\*\*\s*(.*)/i);
522
+ if (goalMatch) {
523
+ goal = goalMatch[1].trim();
524
+ }
525
+
526
+ const depsMatch = ahead.match(/\*\*Depends?\s*on:\*\*\s*(.*)/i);
527
+ if (depsMatch) {
528
+ const depsStr = depsMatch[1].trim();
529
+ if (depsStr && depsStr !== 'None' && depsStr !== '-' && depsStr !== 'none') {
530
+ depends_on = depsStr.split(/[,;]/)
531
+ .map(s => s.replace(/[^0-9]/g, ''))
532
+ .filter(Boolean)
533
+ .map(Number);
534
+ }
535
+ }
536
+
537
+ const reqMatch = ahead.match(/\*\*Requirements:\*\*\s*(.*)/i);
538
+ if (reqMatch) {
539
+ requirements = reqMatch[1].trim();
540
+ }
541
+
542
+ const critMatch = ahead.match(/\*\*Success Criteria:\*\*\s*(.*)/i);
543
+ if (critMatch) {
544
+ success_criteria = critMatch[1].trim();
545
+ }
546
+ }
547
+
548
+ const entry = {
549
+ number: phaseNum,
550
+ name: phaseName,
551
+ goal,
552
+ depends_on,
553
+ requirements,
554
+ success_criteria,
555
+ milestone: currentMilestone || 'Unknown',
556
+ progress: null,
557
+ checklist_checked: null,
558
+ plan_count: 0,
559
+ summary_count: 0,
560
+ has_verification: false,
561
+ verification_result: null,
562
+ disk_status: 'no_directory'
563
+ };
564
+
565
+ phases.push(entry);
566
+ phaseMap.set(phaseNum, entry);
567
+ continue;
568
+ }
569
+ }
570
+
571
+ return phases;
572
+ }
573
+
574
+ /**
575
+ * Parse Progress tables: `| N. Phase Name | X/Y | Status |`
576
+ */
577
+ function _mergeProgressTables(lines, phases) {
578
+ const phaseMap = new Map(phases.map(p => [p.number, p]));
579
+ let inProgressSection = false;
580
+ let progressColIdx = { phase: 0, plans: 1 };
581
+
582
+ // Strip <details>/<summary> tags from lines for parsing
583
+ const cleanLines = lines.map(l => l.replace(/<\/?details>/gi, '').replace(/<\/?summary>/gi, ''));
584
+
585
+ for (const line of cleanLines) {
586
+ if (/^##\s+Progress/i.test(line)) {
587
+ inProgressSection = true;
588
+ continue;
589
+ }
590
+ if (inProgressSection && /^##\s/.test(line) && !/^##\s+Progress/i.test(line)) {
591
+ inProgressSection = false;
592
+ continue;
593
+ }
594
+
595
+ if (inProgressSection && line.includes('|')) {
596
+ const cols = line.split('|').map(c => c.trim()).filter(Boolean);
597
+
598
+ // Detect header row and extract column positions
599
+ if (/Plans?\s*Complete/i.test(line)) {
600
+ const lowerCols = cols.map(c => c.toLowerCase());
601
+ const pIdx = lowerCols.findIndex(c => /phase/i.test(c));
602
+ const plIdx = lowerCols.findIndex(c => /plans?\s*complete/i.test(c));
603
+ if (pIdx !== -1) progressColIdx.phase = pIdx;
604
+ if (plIdx !== -1) progressColIdx.plans = plIdx;
605
+ continue;
606
+ }
607
+
608
+ // Skip separator rows
609
+ if (/^[\s-:|]+$/.test(cols.join(''))) continue;
610
+
611
+ if (cols.length >= 2) {
612
+ const phaseCol = cols[progressColIdx.phase] || cols[0];
613
+ const numMatch = phaseCol.match(/^(\d+)/);
614
+ if (numMatch) {
615
+ const phaseNum = parseInt(numMatch[1], 10);
616
+ const phase = phaseMap.get(phaseNum);
617
+ if (phase) {
618
+ const plansCol = progressColIdx.plans < cols.length ? cols[progressColIdx.plans] : cols[1];
619
+ const progressMatch = plansCol.match(/(\d+)\s*\/\s*(\d+)/);
620
+ if (progressMatch) {
621
+ phase.progress = `${progressMatch[1]}/${progressMatch[2]}`;
622
+ }
623
+ }
624
+ }
625
+ }
626
+ }
627
+ }
628
+ }
629
+
630
+ /**
631
+ * Parse Phase Checklist items: `- [ ] Phase N:` or `- [x] Phase N:`
632
+ */
633
+ function _mergePhaseChecklist(lines, phases) {
634
+ const phaseMap = new Map(phases.map(p => [p.number, p]));
635
+
636
+ for (const line of lines) {
637
+ const checkMatch = line.match(/^-\s+\[([ xX])\]\s+Phase\s+(\d+)/i);
638
+ if (checkMatch) {
639
+ const checked = checkMatch[1].toLowerCase() === 'x';
640
+ const phaseNum = parseInt(checkMatch[2], 10);
641
+ const phase = phaseMap.get(phaseNum);
642
+ if (phase) {
643
+ phase.checklist_checked = checked;
644
+ }
645
+ }
646
+ }
647
+ }
648
+
649
+ /**
650
+ * Cross-reference a phase entry against files on disk.
651
+ */
652
+ function _crossReferenceDisk(phase, phasesDir) {
653
+ if (!fs.existsSync(phasesDir)) {
654
+ phase.disk_status = 'no_directory';
655
+ return;
656
+ }
657
+
658
+ // Find matching directory by phase number prefix
659
+ const paddedNum = String(phase.number).padStart(2, '0');
660
+ let phaseDir = null;
661
+ try {
662
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
663
+ for (const entry of entries) {
664
+ if (entry.isDirectory() && entry.name.startsWith(paddedNum + '-')) {
665
+ phaseDir = path.join(phasesDir, entry.name);
666
+ break;
667
+ }
668
+ }
669
+ } catch (_e) { /* ignore */ }
670
+
671
+ if (!phaseDir) {
672
+ phase.disk_status = 'no_directory';
673
+ return;
674
+ }
675
+
676
+ // Count PLANs and SUMMARYs
677
+ const plans = findFiles(phaseDir, /^PLAN.*\.md$/i);
678
+ const summaries = findFiles(phaseDir, /^SUMMARY.*\.md$/i);
679
+ phase.plan_count = plans.length;
680
+ phase.summary_count = summaries.length;
681
+
682
+ // Check VERIFICATION.md
683
+ const verificationPath = path.join(phaseDir, 'VERIFICATION.md');
684
+ if (fs.existsSync(verificationPath)) {
685
+ phase.has_verification = true;
686
+ try {
687
+ const vContent = fs.readFileSync(verificationPath, 'utf8');
688
+ const fm = parseYamlFrontmatter(vContent);
689
+ if (fm && fm.result) {
690
+ phase.verification_result = fm.result;
691
+ }
692
+ } catch (_e) { /* ignore */ }
693
+ }
694
+
695
+ // Determine disk_status
696
+ if (phase.has_verification && phase.verification_result === 'passed') {
697
+ phase.disk_status = 'complete';
698
+ } else if (phase.summary_count > 0) {
699
+ phase.disk_status = 'partial';
700
+ } else if (phase.plan_count > 0) {
701
+ phase.disk_status = 'planned';
702
+ } else {
703
+ phase.disk_status = 'empty';
704
+ }
705
+ }
706
+
707
+ /**
708
+ * Compute aggregated stats from phase data.
709
+ */
710
+ function _computeStats(phases) {
711
+ let total_plans = 0;
712
+ let total_summaries = 0;
713
+ let phases_complete = 0;
714
+
715
+ for (const phase of phases) {
716
+ total_plans += phase.plan_count;
717
+ total_summaries += phase.summary_count;
718
+ if (phase.disk_status === 'complete') {
719
+ phases_complete++;
720
+ }
721
+ }
722
+
723
+ const total_phases = phases.length;
724
+ const phases_remaining = total_phases - phases_complete;
725
+ const progress_percent = total_phases > 0 ? Math.round((phases_complete / total_phases) * 100) : 0;
726
+
727
+ return {
728
+ total_phases,
729
+ total_plans,
730
+ total_summaries,
731
+ progress_percent,
732
+ phases_complete,
733
+ phases_remaining
734
+ };
735
+ }
736
+
737
+ // --- Dynamic phase operations ---
738
+
739
+ /**
740
+ * Append a new phase heading + progress row to the current (non-COMPLETED) milestone section.
741
+ *
742
+ * @param {string} planningDir - Path to .planning/ directory
743
+ * @param {number} phaseNum - Phase number to add
744
+ * @param {string} name - Human-readable phase name
745
+ * @param {string} [goal] - Goal description
746
+ * @param {number|null} [dependsOn] - Phase number this depends on
747
+ * @returns {{ success: boolean, error?: string }}
748
+ */
749
+ function roadmapAppendPhase(planningDir, phaseNum, name, goal, dependsOn) {
750
+ const roadmapPath = path.join(planningDir, 'ROADMAP.md');
751
+ if (!fs.existsSync(roadmapPath)) {
752
+ return { success: false, error: 'ROADMAP.md not found' };
753
+ }
754
+
755
+ return lockedFileUpdate(roadmapPath, (content) => {
756
+ const lines = content.split(/\r?\n/);
757
+ const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
758
+
759
+ // Find the last milestone section that is NOT completed
760
+ let lastMilestoneIdx = -1;
761
+ for (let i = 0; i < lines.length; i++) {
762
+ if (/^##\s+Milestone/i.test(lines[i]) && !/COMPLETED/i.test(lines[i])) {
763
+ lastMilestoneIdx = i;
764
+ }
765
+ }
766
+
767
+ // Build the phase heading block
768
+ const block = [];
769
+ block.push(`### Phase ${phaseNum}: ${name}`);
770
+ if (goal) block.push(`**Goal:** ${goal}`);
771
+ const depText = dependsOn ? `Phase ${dependsOn}` : 'None';
772
+ block.push(`**Depends on:** ${depText}`);
773
+ block.push('');
774
+
775
+ // Find where to insert the phase heading: before the next ## heading after the milestone
776
+ let insertIdx = lines.length;
777
+ if (lastMilestoneIdx !== -1) {
778
+ for (let i = lastMilestoneIdx + 1; i < lines.length; i++) {
779
+ if (/^##\s+[^#]/.test(lines[i])) {
780
+ insertIdx = i;
781
+ break;
782
+ }
783
+ }
784
+ }
785
+
786
+ // Insert the phase heading block
787
+ lines.splice(insertIdx, 0, ...block);
788
+
789
+ // Find and update Progress table: append a row
790
+ // Detect if existing table has Milestone column
791
+ let hasMilestoneCol = false;
792
+ let hasCompletedCol = false;
793
+ for (let i = 0; i < lines.length; i++) {
794
+ if (lines[i].includes('|') && /Plans?\s*Complete/i.test(lines[i])) {
795
+ hasMilestoneCol = /milestone/i.test(lines[i]);
796
+ hasCompletedCol = /completed/i.test(lines[i]);
797
+ break;
798
+ }
799
+ }
800
+ let progressRowLine = `| ${phaseNum}. ${name} |`;
801
+ if (hasMilestoneCol) progressRowLine += ' |';
802
+ progressRowLine += ' 0/0 | Pending |';
803
+ if (hasCompletedCol) progressRowLine += ' |';
804
+
805
+ let progressTableEnd = -1;
806
+ let inProgressSection = false;
807
+ for (let i = 0; i < lines.length; i++) {
808
+ if (/^##\s+Progress/i.test(lines[i])) {
809
+ inProgressSection = true;
810
+ continue;
811
+ }
812
+ if (inProgressSection) {
813
+ if (/^##\s/.test(lines[i]) && !/^##\s+Progress/i.test(lines[i])) {
814
+ progressTableEnd = i;
815
+ break;
816
+ }
817
+ // Track last table row
818
+ if (lines[i].includes('|')) {
819
+ progressTableEnd = i + 1;
820
+ }
821
+ }
822
+ }
823
+
824
+ if (progressTableEnd > 0) {
825
+ lines.splice(progressTableEnd, 0, progressRowLine);
826
+ }
827
+
828
+ return lines.join(lineEnding);
829
+ });
830
+ }
831
+
832
+ /**
833
+ * Remove a phase heading block and its progress table row from ROADMAP.md.
834
+ *
835
+ * @param {string} planningDir - Path to .planning/ directory
836
+ * @param {number} phaseNum - Phase number to remove
837
+ * @returns {{ success: boolean, error?: string }}
838
+ */
839
+ function roadmapRemovePhase(planningDir, phaseNum) {
840
+ const roadmapPath = path.join(planningDir, 'ROADMAP.md');
841
+ if (!fs.existsSync(roadmapPath)) {
842
+ return { success: false, error: 'ROADMAP.md not found' };
843
+ }
844
+
845
+ return lockedFileUpdate(roadmapPath, (content) => {
846
+ const lines = content.split(/\r?\n/);
847
+ const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
848
+
849
+ // Find and remove the ### Phase N: heading and its content block
850
+ let headingIdx = -1;
851
+ let blockEnd = -1;
852
+ for (let i = 0; i < lines.length; i++) {
853
+ const match = lines[i].match(/^###\s+Phase\s+(\d+)\s*:/i);
854
+ if (match && parseInt(match[1], 10) === phaseNum) {
855
+ headingIdx = i;
856
+ // Find end of this block (next ### or ## heading)
857
+ for (let j = i + 1; j < lines.length; j++) {
858
+ if (/^#{1,3}\s/.test(lines[j])) {
859
+ blockEnd = j;
860
+ break;
861
+ }
862
+ }
863
+ if (blockEnd === -1) blockEnd = lines.length;
864
+ break;
865
+ }
866
+ }
867
+
868
+ if (headingIdx !== -1) {
869
+ lines.splice(headingIdx, blockEnd - headingIdx);
870
+ }
871
+
872
+ // Remove progress table row matching "| N. " pattern
873
+ for (let i = lines.length - 1; i >= 0; i--) {
874
+ const rowMatch = lines[i].match(/^\|\s*(\d+)\./);
875
+ if (rowMatch && parseInt(rowMatch[1], 10) === phaseNum) {
876
+ lines.splice(i, 1);
877
+ break;
878
+ }
879
+ }
880
+
881
+ return lines.join(lineEnding);
882
+ });
883
+ }
884
+
885
+ /**
886
+ * Renumber all phase references >= startNum by delta in ROADMAP.md.
887
+ * Handles: ### Phase N: headings, "Phase N" in text, progress table rows "| N.",
888
+ * checklist items "Phase N:".
889
+ *
890
+ * Iterates in reverse when delta > 0 (to avoid collisions), forward when delta < 0.
891
+ *
892
+ * @param {string} planningDir - Path to .planning/ directory
893
+ * @param {number} startNum - Renumber phases with number >= this
894
+ * @param {number} delta - Amount to shift (+1 for insert, -1 for remove)
895
+ * @returns {{ success: boolean, error?: string }}
896
+ */
897
+ function roadmapRenumberPhases(planningDir, startNum, delta) {
898
+ const roadmapPath = path.join(planningDir, 'ROADMAP.md');
899
+ if (!fs.existsSync(roadmapPath)) {
900
+ return { success: false, error: 'ROADMAP.md not found' };
901
+ }
902
+
903
+ return lockedFileUpdate(roadmapPath, (content) => {
904
+ const lines = content.split(/\r?\n/);
905
+ const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
906
+
907
+ // Collect all phase numbers that need renumbering, process in correct order
908
+ const nums = [];
909
+ for (let i = 0; i < lines.length; i++) {
910
+ const headingMatch = lines[i].match(/^###\s+Phase\s+(\d+)\s*:/i);
911
+ if (headingMatch) {
912
+ const n = parseInt(headingMatch[1], 10);
913
+ if (n >= startNum && !nums.includes(n)) nums.push(n);
914
+ }
915
+ const rowMatch = lines[i].match(/^\|\s*(\d+)\./);
916
+ if (rowMatch) {
917
+ const n = parseInt(rowMatch[1], 10);
918
+ if (n >= startNum && !nums.includes(n)) nums.push(n);
919
+ }
920
+ }
921
+
922
+ // Sort: reverse for delta > 0 (avoid collisions), forward for delta < 0
923
+ if (delta > 0) {
924
+ nums.sort((a, b) => b - a);
925
+ } else {
926
+ nums.sort((a, b) => a - b);
927
+ }
928
+
929
+ for (const num of nums) {
930
+ const newNum = num + delta;
931
+ for (let i = 0; i < lines.length; i++) {
932
+ // ### Phase N: heading
933
+ const headingRegex = new RegExp(`^(###\\s+Phase\\s+)${num}(\\s*:.*)`, 'i');
934
+ if (headingRegex.test(lines[i])) {
935
+ lines[i] = lines[i].replace(headingRegex, `$1${newNum}$2`);
936
+ }
937
+ // Progress table row: | N. Name |
938
+ const rowRegex = new RegExp(`^(\\|\\s*)${num}(\\.)`);
939
+ if (rowRegex.test(lines[i])) {
940
+ lines[i] = lines[i].replace(rowRegex, `$1${newNum}$2`);
941
+ }
942
+ // Checklist: - [ ] Phase N: or - [x] Phase N:
943
+ const checkRegex = new RegExp(`^(\\s*-\\s+\\[[ xX]\\]\\s+Phase\\s+)${num}(\\s*[:])`, 'i');
944
+ if (checkRegex.test(lines[i])) {
945
+ lines[i] = lines[i].replace(checkRegex, `$1${newNum}$2`);
946
+ }
947
+ // Dependency text: "Phase N" (but not in headings already handled)
948
+ if (!/^###/.test(lines[i]) && !/^\|/.test(lines[i])) {
949
+ const depRegex = new RegExp(`(Phase\\s+)${num}(?=\\b)`, 'gi');
950
+ lines[i] = lines[i].replace(depRegex, `$1${newNum}`);
951
+ }
952
+ }
953
+ }
954
+
955
+ return lines.join(lineEnding);
956
+ });
957
+ }
958
+
959
+ /**
960
+ * Insert a phase heading at a specific position in ROADMAP.md (before the next phase).
961
+ * Unlike roadmapAppendPhase which appends at end, this inserts at the right position.
962
+ *
963
+ * @param {string} planningDir - Path to .planning/ directory
964
+ * @param {number} position - Position number for the new phase
965
+ * @param {string} name - Phase name
966
+ * @param {string} [goal] - Goal description
967
+ * @param {number|null} [dependsOn] - Dependency phase number
968
+ * @returns {{ success: boolean, error?: string }}
969
+ */
970
+ function roadmapInsertPhase(planningDir, position, name, goal, dependsOn) {
971
+ const roadmapPath = path.join(planningDir, 'ROADMAP.md');
972
+ if (!fs.existsSync(roadmapPath)) {
973
+ return { success: false, error: 'ROADMAP.md not found' };
974
+ }
975
+
976
+ return lockedFileUpdate(roadmapPath, (content) => {
977
+ const lines = content.split(/\r?\n/);
978
+ const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
979
+
980
+ // Build the phase heading block
981
+ const block = [];
982
+ block.push(`### Phase ${position}: ${name}`);
983
+ if (goal) block.push(`**Goal:** ${goal}`);
984
+ const depText = dependsOn ? `Phase ${dependsOn}` : 'None';
985
+ block.push(`**Depends on:** ${depText}`);
986
+ block.push('');
987
+
988
+ // Find where to insert: before the phase heading that now has number position+1
989
+ // (since renumbering already happened)
990
+ let insertIdx = -1;
991
+ for (let i = 0; i < lines.length; i++) {
992
+ const match = lines[i].match(/^###\s+Phase\s+(\d+)\s*:/i);
993
+ if (match && parseInt(match[1], 10) === position + 1) {
994
+ insertIdx = i;
995
+ break;
996
+ }
997
+ }
998
+
999
+ if (insertIdx === -1) {
1000
+ // No phase after this position found; append at end of last milestone section
1001
+ let lastMilestoneEnd = lines.length;
1002
+ for (let i = 0; i < lines.length; i++) {
1003
+ if (/^##\s+Milestone/i.test(lines[i]) && !/COMPLETED/i.test(lines[i])) {
1004
+ // Find end of this milestone section
1005
+ for (let j = i + 1; j < lines.length; j++) {
1006
+ if (/^##\s+[^#]/.test(lines[j])) {
1007
+ lastMilestoneEnd = j;
1008
+ break;
1009
+ }
1010
+ }
1011
+ }
1012
+ }
1013
+ insertIdx = lastMilestoneEnd;
1014
+ }
1015
+
1016
+ lines.splice(insertIdx, 0, ...block);
1017
+
1018
+ // Insert progress table row at the right position — detect Milestone/Completed columns
1019
+ let _hasMilestoneCol = false;
1020
+ let _hasCompletedCol = false;
1021
+ for (let i = 0; i < lines.length; i++) {
1022
+ if (lines[i].includes('|') && /Plans?\s*Complete/i.test(lines[i])) {
1023
+ _hasMilestoneCol = /milestone/i.test(lines[i]);
1024
+ _hasCompletedCol = /completed/i.test(lines[i]);
1025
+ break;
1026
+ }
1027
+ }
1028
+ let progressRow = `| ${position}. ${name} |`;
1029
+ if (_hasMilestoneCol) progressRow += ' |';
1030
+ progressRow += ' 0/0 | Pending |';
1031
+ if (_hasCompletedCol) progressRow += ' |';
1032
+ let progressInsertIdx = -1;
1033
+ let inProgressSection = false;
1034
+ for (let i = 0; i < lines.length; i++) {
1035
+ if (/^##\s+Progress/i.test(lines[i])) {
1036
+ inProgressSection = true;
1037
+ continue;
1038
+ }
1039
+ if (inProgressSection) {
1040
+ if (/^##\s/.test(lines[i]) && !/^##\s+Progress/i.test(lines[i])) {
1041
+ // End of progress section, insert here if we haven't found a spot
1042
+ if (progressInsertIdx === -1) progressInsertIdx = i;
1043
+ break;
1044
+ }
1045
+ // Find the row for position+1 (the phase that was just shifted)
1046
+ const rowMatch = lines[i].match(/^\|\s*(\d+)\./);
1047
+ if (rowMatch) {
1048
+ const rowNum = parseInt(rowMatch[1], 10);
1049
+ if (rowNum === position + 1 && progressInsertIdx === -1) {
1050
+ progressInsertIdx = i;
1051
+ }
1052
+ }
1053
+ }
1054
+ }
1055
+
1056
+ if (progressInsertIdx > 0) {
1057
+ lines.splice(progressInsertIdx, 0, progressRow);
1058
+ }
1059
+
1060
+ return lines.join(lineEnding);
1061
+ });
1062
+ }
1063
+
1064
+ /**
1065
+ * Get a single phase entry from ROADMAP.md by number.
1066
+ *
1067
+ * @param {string} phaseNum - Phase number
1068
+ * @param {string} [planningDir] - Path to .planning directory
1069
+ * @returns {object|null} Phase entry or null
1070
+ */
1071
+ function roadmapGetPhase(phaseNum, planningDir) {
1072
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
1073
+ const roadmapPath = path.join(dir, 'ROADMAP.md');
1074
+ if (!fs.existsSync(roadmapPath)) {
1075
+ return null;
1076
+ }
1077
+
1078
+ const content = fs.readFileSync(roadmapPath, 'utf8');
1079
+ const parsed = parseRoadmapMd(content);
1080
+ const paddedPhase = String(phaseNum).padStart(2, '0');
1081
+ return parsed.phases.find(p => p.number === paddedPhase) || null;
1082
+ }
1083
+
1084
+ module.exports = {
1085
+ parseRoadmapMd,
1086
+ findRoadmapRow,
1087
+ updateTableRow,
1088
+ roadmapUpdateStatus,
1089
+ roadmapUpdatePlans,
1090
+ roadmapUpdatePlanProgress,
1091
+ roadmapAnalyze,
1092
+ roadmapAppendPhase,
1093
+ roadmapRemovePhase,
1094
+ roadmapRenumberPhases,
1095
+ roadmapInsertPhase,
1096
+ roadmapGetPhase
1097
+ };