@sienklogic/plan-build-run 2.21.0 → 2.21.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (983) hide show
  1. package/CHANGELOG.md +1331 -299
  2. package/CLAUDE.md +75 -40
  3. package/LICENSE +2 -1
  4. package/README.md +412 -177
  5. package/bin/install.js +2752 -0
  6. package/dashboard/bin/cli.cjs +96 -0
  7. package/dashboard/bin/stop.cjs +129 -0
  8. package/dashboard/eslint.config.js +37 -0
  9. package/dashboard/index.html +20 -0
  10. package/dashboard/package.json +27 -25
  11. package/dashboard/server/index.js +151 -0
  12. package/dashboard/server/lib/frontmatter.js +92 -0
  13. package/dashboard/server/middleware/static.js +35 -0
  14. package/dashboard/server/package.json +16 -0
  15. package/dashboard/server/routes/agents.js +234 -0
  16. package/dashboard/server/routes/config.js +64 -0
  17. package/dashboard/server/routes/health.js +98 -0
  18. package/dashboard/server/routes/incidents.js +78 -0
  19. package/dashboard/server/routes/intel.js +69 -0
  20. package/dashboard/server/routes/memory.js +107 -0
  21. package/dashboard/server/routes/planning.js +234 -0
  22. package/dashboard/server/routes/progress.js +77 -0
  23. package/dashboard/server/routes/projects.js +36 -0
  24. package/dashboard/server/routes/requirements.js +40 -0
  25. package/dashboard/server/routes/roadmap.js +69 -0
  26. package/dashboard/server/routes/sessions.js +70 -0
  27. package/dashboard/server/routes/status.js +25 -0
  28. package/dashboard/server/routes/telemetry.js +233 -0
  29. package/dashboard/server/services/file-watcher.js +105 -0
  30. package/dashboard/server/services/planning-reader.js +727 -0
  31. package/dashboard/server/test/cli.test.js +34 -0
  32. package/dashboard/server/test/frontmatter.test.js +104 -0
  33. package/dashboard/server/test/isolation.test.js +32 -0
  34. package/dashboard/server/test/planning-reader.test.js +151 -0
  35. package/dashboard/server/test/routes.test.js +91 -0
  36. package/dashboard/server/test/ws.test.js +81 -0
  37. package/dashboard/server/ws.js +96 -0
  38. package/dashboard/src/App.jsx +165 -0
  39. package/dashboard/src/components/charts/BudgetBars.jsx +42 -0
  40. package/dashboard/src/components/charts/ContextRadar.jsx +34 -0
  41. package/dashboard/src/components/charts/PhaseDonut.jsx +66 -0
  42. package/dashboard/src/components/charts/SuccessTrend.jsx +45 -0
  43. package/dashboard/src/components/charts/TokenChart.jsx +55 -0
  44. package/dashboard/src/components/charts/index.js +5 -0
  45. package/dashboard/src/components/config/CfgSection.jsx +93 -0
  46. package/dashboard/src/components/layout/Header.jsx +89 -0
  47. package/dashboard/src/components/layout/ProjectSwitcher.jsx +160 -0
  48. package/dashboard/src/components/layout/Sidebar.jsx +161 -0
  49. package/dashboard/src/components/ui/AutoModeBanner.jsx +138 -0
  50. package/dashboard/src/components/ui/BackButton.jsx +27 -0
  51. package/dashboard/src/components/ui/Badge.jsx +27 -0
  52. package/dashboard/src/components/ui/Card.jsx +23 -0
  53. package/dashboard/src/components/ui/ChartTooltip.jsx +48 -0
  54. package/dashboard/src/components/ui/CheckpointBox.jsx +110 -0
  55. package/dashboard/src/components/ui/CodeBlock.jsx +27 -0
  56. package/dashboard/src/components/ui/ConfidenceBadge.jsx +20 -0
  57. package/dashboard/src/components/ui/ConfirmModal.jsx +161 -0
  58. package/dashboard/src/components/ui/ConnectionBanner.jsx +60 -0
  59. package/dashboard/src/components/ui/ErrorBoundary.jsx +106 -0
  60. package/dashboard/src/components/ui/ErrorBox.jsx +107 -0
  61. package/dashboard/src/components/ui/KeyValue.jsx +33 -0
  62. package/dashboard/src/components/ui/LoadingSkeleton.jsx +84 -0
  63. package/dashboard/src/components/ui/MetricCard.jsx +58 -0
  64. package/dashboard/src/components/ui/NextUpBlock.jsx +92 -0
  65. package/dashboard/src/components/ui/NumberInput.jsx +44 -0
  66. package/dashboard/src/components/ui/PBRBanner.jsx +47 -0
  67. package/dashboard/src/components/ui/PipelineView.jsx +130 -0
  68. package/dashboard/src/components/ui/ProgressBar.jsx +28 -0
  69. package/dashboard/src/components/ui/ProgressDisplay.jsx +47 -0
  70. package/dashboard/src/components/ui/QualityGateBadge.jsx +15 -0
  71. package/dashboard/src/components/ui/SectionTitle.jsx +35 -0
  72. package/dashboard/src/components/ui/SelectInput.jsx +45 -0
  73. package/dashboard/src/components/ui/StatusDot.jsx +51 -0
  74. package/dashboard/src/components/ui/StatusSymbol.jsx +49 -0
  75. package/dashboard/src/components/ui/TabBar.jsx +41 -0
  76. package/dashboard/src/components/ui/TextInput.jsx +42 -0
  77. package/dashboard/src/components/ui/Toast.jsx +117 -0
  78. package/dashboard/src/components/ui/Toggle.jsx +70 -0
  79. package/dashboard/src/components/ui/index.js +29 -0
  80. package/dashboard/src/hooks/useDocumentTitle.js +16 -0
  81. package/dashboard/src/hooks/useFetch.js +50 -0
  82. package/dashboard/src/hooks/useToast.jsx +43 -0
  83. package/dashboard/src/hooks/useWebSocket.js +103 -0
  84. package/dashboard/src/lib/api.js +112 -0
  85. package/dashboard/src/lib/configSchema.js +189 -0
  86. package/dashboard/src/lib/constants.js +22 -0
  87. package/dashboard/src/main.jsx +15 -0
  88. package/dashboard/src/pages/AgentsPage.jsx +191 -0
  89. package/dashboard/src/pages/ConfigPage.jsx +298 -0
  90. package/dashboard/src/pages/HooksPage.jsx +412 -0
  91. package/dashboard/src/pages/IncidentsPage.jsx +135 -0
  92. package/dashboard/src/pages/IntelPage.jsx +193 -0
  93. package/dashboard/src/pages/LiveFeed.jsx +274 -0
  94. package/dashboard/src/pages/MemoryPage.jsx +107 -0
  95. package/dashboard/src/pages/OnboardingPage.jsx +117 -0
  96. package/dashboard/src/pages/Overview.jsx +360 -0
  97. package/dashboard/src/pages/PhaseDetailView.jsx +216 -0
  98. package/dashboard/src/pages/PlanningPage.jsx +181 -0
  99. package/dashboard/src/pages/ProgressPage.jsx +249 -0
  100. package/dashboard/src/pages/ResearchPage.jsx +129 -0
  101. package/dashboard/src/pages/RoadmapPage.jsx +251 -0
  102. package/dashboard/src/pages/SessionsPage.jsx +117 -0
  103. package/dashboard/src/pages/Telemetry.jsx +166 -0
  104. package/dashboard/src/pages/planning/DecisionsTab.jsx +153 -0
  105. package/dashboard/src/pages/planning/FilesTab.jsx +420 -0
  106. package/dashboard/src/pages/planning/MilestoneDetail.jsx +319 -0
  107. package/dashboard/src/pages/planning/MilestonesTab.jsx +151 -0
  108. package/dashboard/src/pages/planning/NotesTab.jsx +251 -0
  109. package/dashboard/src/pages/planning/PhasesTab.jsx +218 -0
  110. package/dashboard/src/pages/planning/QuickTab.jsx +50 -0
  111. package/dashboard/src/pages/planning/ResearchTab.jsx +103 -0
  112. package/dashboard/src/pages/planning/TodosTab.jsx +297 -0
  113. package/dashboard/src/theme/ThemeProvider.jsx +38 -0
  114. package/dashboard/src/theme/tokens.js +17 -0
  115. package/dashboard/tests/components/ConfirmModal.test.jsx +179 -0
  116. package/dashboard/tests/components/ConnectionBanner.test.jsx +37 -0
  117. package/dashboard/tests/components/ErrorBoundary.test.jsx +59 -0
  118. package/dashboard/tests/components/LoadingSkeleton.test.jsx +46 -0
  119. package/dashboard/tests/components/ToastContainer.test.jsx +47 -0
  120. package/dashboard/tests/components/Toggle.test.jsx +61 -0
  121. package/dashboard/tests/hooks/useFetch.test.jsx +77 -0
  122. package/dashboard/tests/hooks/useToast.test.jsx +78 -0
  123. package/dashboard/tests/hooks/useWebSocket.test.jsx +128 -0
  124. package/dashboard/tests/pages/ConfigPage.test.jsx +199 -0
  125. package/dashboard/tests/pages/PlanningPage.test.jsx +119 -0
  126. package/dashboard/tests/pages/planning/FilesTab.test.jsx +198 -0
  127. package/dashboard/tests/pages/planning/NotesTab.test.jsx +178 -0
  128. package/dashboard/tests/pages/planning/TodosTab.test.jsx +188 -0
  129. package/dashboard/tests/performance.test.jsx +46 -0
  130. package/dashboard/tests/routes/config.test.js +98 -0
  131. package/dashboard/tests/routes/health.test.js +40 -0
  132. package/dashboard/tests/routes/planning.test.js +112 -0
  133. package/dashboard/tests/routes/roadmap.test.js +91 -0
  134. package/dashboard/tests/routes/status.test.js +131 -0
  135. package/dashboard/tests/server/planning-reader.test.js +153 -0
  136. package/dashboard/tests/setup.js +7 -0
  137. package/dashboard/vite.config.js +41 -0
  138. package/package.json +56 -41
  139. package/plan-build-run/bin/config-schema.json +1298 -0
  140. package/plugins/pbr/.claude-plugin/plugin.json +1 -1
  141. package/plugins/pbr/CLAUDE.md +19 -0
  142. package/plugins/pbr/UI-CONSISTENCY-GAPS.md +1 -1
  143. package/plugins/pbr/agents/advisor-researcher.md +101 -0
  144. package/plugins/pbr/agents/audit.md +207 -89
  145. package/plugins/pbr/agents/codebase-mapper.md +158 -23
  146. package/plugins/pbr/agents/debugger.md +212 -34
  147. package/plugins/pbr/agents/dev-sync.md +206 -0
  148. package/plugins/pbr/agents/executor.md +737 -39
  149. package/plugins/pbr/agents/general.md +71 -6
  150. package/plugins/pbr/agents/integration-checker.md +148 -30
  151. package/plugins/pbr/agents/intel-updater.md +332 -0
  152. package/plugins/pbr/agents/nyquist-auditor.md +254 -0
  153. package/plugins/pbr/agents/plan-checker.md +268 -66
  154. package/plugins/pbr/agents/planner.md +451 -42
  155. package/plugins/pbr/agents/researcher.md +219 -36
  156. package/plugins/pbr/agents/roadmapper.md +398 -0
  157. package/plugins/pbr/agents/synthesizer.md +166 -26
  158. package/plugins/pbr/agents/ui-checker.md +204 -0
  159. package/plugins/pbr/agents/ui-researcher.md +224 -0
  160. package/plugins/pbr/agents/verifier.md +571 -47
  161. package/plugins/pbr/commands/add-phase.md +75 -0
  162. package/plugins/pbr/commands/add-todo.md +8 -0
  163. package/plugins/pbr/commands/audit-fix.md +5 -0
  164. package/plugins/pbr/commands/audit-milestone.md +8 -0
  165. package/plugins/pbr/commands/autonomous.md +5 -0
  166. package/plugins/pbr/commands/backlog.md +6 -0
  167. package/plugins/pbr/commands/check-todos.md +8 -0
  168. package/plugins/pbr/commands/complete-milestone.md +8 -0
  169. package/plugins/pbr/commands/config.md +1 -1
  170. package/plugins/pbr/commands/discuss-phase.md +6 -0
  171. package/plugins/pbr/commands/do.md +5 -0
  172. package/plugins/pbr/commands/execute-phase.md +6 -0
  173. package/plugins/pbr/commands/fast.md +6 -0
  174. package/plugins/pbr/commands/forensics.md +6 -0
  175. package/plugins/pbr/commands/import.md +1 -1
  176. package/plugins/pbr/commands/insert-phase.md +65 -0
  177. package/plugins/pbr/commands/intel.md +5 -0
  178. package/plugins/pbr/commands/join-discord.md +11 -0
  179. package/plugins/pbr/commands/list-phase-assumptions.md +5 -0
  180. package/plugins/pbr/commands/map-codebase.md +6 -0
  181. package/plugins/pbr/commands/milestone-summary.md +6 -0
  182. package/plugins/pbr/commands/new-milestone.md +8 -0
  183. package/plugins/pbr/commands/new-project.md +6 -0
  184. package/plugins/pbr/commands/pause-work.md +5 -0
  185. package/plugins/pbr/commands/plan-milestone-gaps.md +7 -0
  186. package/plugins/pbr/commands/plan-phase.md +6 -0
  187. package/plugins/pbr/commands/plant-seed.md +6 -0
  188. package/plugins/pbr/commands/profile-user.md +5 -0
  189. package/plugins/pbr/commands/profile.md +5 -0
  190. package/plugins/pbr/commands/progress.md +6 -0
  191. package/plugins/pbr/commands/quick.md +1 -1
  192. package/plugins/pbr/commands/reapply-patches.md +47 -0
  193. package/plugins/pbr/commands/release.md +6 -0
  194. package/plugins/pbr/commands/remove-phase.md +66 -0
  195. package/plugins/pbr/commands/research-phase.md +59 -0
  196. package/plugins/pbr/commands/resume-work.md +5 -0
  197. package/plugins/pbr/commands/seed.md +6 -0
  198. package/plugins/pbr/commands/session-report.md +5 -0
  199. package/plugins/pbr/commands/set-profile.md +6 -0
  200. package/plugins/pbr/commands/settings.md +5 -0
  201. package/plugins/pbr/commands/setup.md +1 -1
  202. package/plugins/pbr/commands/ship.md +5 -0
  203. package/plugins/pbr/commands/stats.md +6 -0
  204. package/plugins/pbr/commands/test.md +5 -0
  205. package/plugins/pbr/commands/thread.md +6 -0
  206. package/plugins/pbr/commands/todo.md +1 -1
  207. package/plugins/pbr/commands/ui-phase.md +5 -0
  208. package/plugins/pbr/commands/ui-review.md +5 -0
  209. package/plugins/pbr/commands/undo.md +5 -0
  210. package/plugins/pbr/commands/update.md +37 -0
  211. package/plugins/pbr/commands/validate-phase.md +5 -0
  212. package/plugins/pbr/commands/verify-work.md +6 -0
  213. package/plugins/pbr/dashboard/package-lock.json +6 -0
  214. package/plugins/pbr/dist/architecture-guard.js +76 -0
  215. package/plugins/pbr/dist/audit-dimensions.js +556 -0
  216. package/plugins/pbr/dist/auto-continue.js +277 -0
  217. package/plugins/pbr/dist/block-skill-self-read.js +124 -0
  218. package/plugins/pbr/dist/check-agent-state-write.js +63 -0
  219. package/plugins/pbr/dist/check-config-change.js +213 -0
  220. package/plugins/pbr/dist/check-cross-plugin-sync.js +93 -0
  221. package/plugins/pbr/dist/check-dangerous-commands.js +193 -0
  222. package/plugins/pbr/dist/check-direct-state-write.js +37 -0
  223. package/plugins/pbr/dist/check-doc-sprawl.js +102 -0
  224. package/plugins/pbr/dist/check-phase-boundary.js +191 -0
  225. package/plugins/pbr/dist/check-plan-format.js +227 -0
  226. package/plugins/pbr/dist/check-read-first.js +345 -0
  227. package/plugins/pbr/dist/check-roadmap-sync.js +507 -0
  228. package/plugins/pbr/dist/check-skill-workflow.js +354 -0
  229. package/plugins/pbr/dist/check-state-sync.js +676 -0
  230. package/plugins/pbr/dist/check-subagent-output.js +425 -0
  231. package/plugins/pbr/dist/check-summary-gate.js +188 -0
  232. package/plugins/pbr/dist/context-bridge.js +425 -0
  233. package/plugins/pbr/dist/context-budget-check.js +442 -0
  234. package/plugins/pbr/dist/context-quality.js +271 -0
  235. package/plugins/pbr/dist/enforce-context-budget.js +138 -0
  236. package/plugins/pbr/dist/enforce-pbr-workflow.js +277 -0
  237. package/plugins/pbr/dist/event-handler.js +212 -0
  238. package/plugins/pbr/dist/event-logger.js +125 -0
  239. package/plugins/pbr/dist/feedback-loop.js +155 -0
  240. package/plugins/pbr/dist/graph-update.js +422 -0
  241. package/plugins/pbr/dist/hook-logger.js +114 -0
  242. package/plugins/pbr/dist/hook-server-client.js +361 -0
  243. package/plugins/pbr/dist/hook-server.js +664 -0
  244. package/plugins/pbr/dist/hooks-schema.json +87 -0
  245. package/plugins/pbr/dist/instructions-loaded.js +173 -0
  246. package/plugins/pbr/dist/intercept-plan-mode.js +81 -0
  247. package/plugins/pbr/dist/log-notification.js +131 -0
  248. package/plugins/pbr/dist/log-subagent.js +367 -0
  249. package/plugins/pbr/dist/log-tool-failure.js +140 -0
  250. package/plugins/pbr/dist/milestone-learnings.js +519 -0
  251. package/plugins/pbr/dist/pbr-tools.js +493 -0
  252. package/plugins/pbr/dist/post-bash-triage.js +96 -0
  253. package/plugins/pbr/dist/post-compact.js +135 -0
  254. package/plugins/pbr/dist/post-hoc.js +237 -0
  255. package/plugins/pbr/dist/post-write-dispatch.js +243 -0
  256. package/plugins/pbr/dist/post-write-quality.js +208 -0
  257. package/plugins/pbr/dist/pre-bash-dispatch.js +212 -0
  258. package/plugins/pbr/dist/pre-skill-dispatch.js +114 -0
  259. package/plugins/pbr/dist/pre-task-dispatch.js +269 -0
  260. package/plugins/pbr/dist/pre-write-dispatch.js +234 -0
  261. package/plugins/pbr/dist/progress-tracker.js +173 -0
  262. package/plugins/pbr/dist/prompt-guard.js +114 -0
  263. package/plugins/pbr/dist/prompt-routing.js +209 -0
  264. package/plugins/pbr/dist/quick-status.js +179 -0
  265. package/plugins/pbr/dist/record-incident.js +37 -0
  266. package/plugins/pbr/dist/run-hook.js +132 -0
  267. package/plugins/pbr/dist/session-cleanup.js +653 -0
  268. package/plugins/pbr/dist/session-tracker.js +124 -0
  269. package/plugins/pbr/dist/status-line.js +849 -0
  270. package/plugins/pbr/dist/suggest-compact.js +307 -0
  271. package/plugins/pbr/dist/sync-context-to-claude.js +100 -0
  272. package/plugins/pbr/dist/task-completed.js +206 -0
  273. package/plugins/pbr/dist/track-context-budget.js +432 -0
  274. package/plugins/pbr/dist/track-user-gates.js +88 -0
  275. package/plugins/pbr/dist/trust-tracker.js +193 -0
  276. package/plugins/pbr/dist/validate-commit.js +233 -0
  277. package/plugins/pbr/dist/validate-skill-args.js +222 -0
  278. package/plugins/pbr/dist/validate-task.js +271 -0
  279. package/plugins/pbr/dist/worktree-create.js +144 -0
  280. package/plugins/pbr/dist/worktree-remove.js +147 -0
  281. package/plugins/pbr/hooks/hooks.json +137 -65
  282. package/plugins/pbr/references/agent-contracts.md +39 -8
  283. package/plugins/pbr/references/agent-teams.md +3 -3
  284. package/plugins/pbr/references/archive/checkpoints.md +189 -0
  285. package/plugins/pbr/references/archive/context-quality-tiers.md +45 -0
  286. package/plugins/pbr/references/archive/hook-ordering.md +89 -0
  287. package/plugins/pbr/references/archive/limitations.md +106 -0
  288. package/plugins/pbr/references/archive/pbr-rules.md +194 -0
  289. package/plugins/pbr/references/archive/pbr-tools-cli.md +415 -0
  290. package/plugins/pbr/references/archive/pretooluse-jsonl-behavior.md +58 -0
  291. package/plugins/pbr/references/archive/signal-files.md +41 -0
  292. package/plugins/pbr/references/archive/tmux-setup.md +288 -0
  293. package/plugins/pbr/references/archive/verification-matrix.md +34 -0
  294. package/plugins/pbr/references/archive/verification-patterns.md +277 -0
  295. package/plugins/pbr/references/archive/worktree-sparse-checkout.md +86 -0
  296. package/plugins/pbr/references/assumptions.md +42 -0
  297. package/plugins/pbr/references/checkpoints.md +723 -104
  298. package/plugins/pbr/references/config-reference.md +387 -10
  299. package/plugins/pbr/references/continuation-format.md +1 -0
  300. package/plugins/pbr/references/decimal-phase-calculation.md +65 -0
  301. package/plugins/pbr/references/deviation-rules.md +12 -0
  302. package/plugins/pbr/references/few-shot-examples/audit.md +77 -0
  303. package/plugins/pbr/references/few-shot-examples/check-plan-format.md +172 -0
  304. package/plugins/pbr/references/few-shot-examples/check-subagent-output.md +118 -0
  305. package/plugins/pbr/references/few-shot-examples/integration-checker.md +70 -0
  306. package/plugins/pbr/references/few-shot-examples/nyquist-auditor.md +83 -0
  307. package/plugins/pbr/references/few-shot-examples/plan-checker.md +73 -0
  308. package/plugins/pbr/references/few-shot-examples/ui-checker.md +71 -0
  309. package/plugins/pbr/references/few-shot-examples/verifier.md +109 -0
  310. package/plugins/pbr/references/git-integration.md +110 -27
  311. package/plugins/pbr/references/git-planning-commit.md +35 -0
  312. package/plugins/pbr/references/model-profile-resolution.md +34 -0
  313. package/plugins/pbr/references/model-profiles.md +90 -7
  314. package/plugins/pbr/references/model-selection.md +1 -1
  315. package/plugins/pbr/references/node-repair.md +48 -0
  316. package/plugins/pbr/references/plan-authoring.md +65 -0
  317. package/plugins/pbr/references/plan-format.md +184 -10
  318. package/plugins/pbr/references/questioning.md +138 -49
  319. package/plugins/pbr/references/reading-verification.md +4 -4
  320. package/plugins/pbr/references/tdd.md +263 -0
  321. package/plugins/pbr/references/thinking-models-planning.md +47 -0
  322. package/plugins/pbr/references/thinking-models-verification.md +44 -0
  323. package/plugins/pbr/references/ui-brand.md +449 -0
  324. package/plugins/pbr/references/verification-overrides.md +39 -0
  325. package/plugins/pbr/references/verification-patterns.md +529 -113
  326. package/plugins/pbr/scripts/architecture-guard.js +76 -0
  327. package/plugins/pbr/scripts/audit-checks/behavioral-compliance.js +2098 -0
  328. package/plugins/pbr/scripts/audit-checks/error-analysis.js +989 -0
  329. package/plugins/pbr/scripts/audit-checks/feature-verification.js +723 -0
  330. package/plugins/pbr/scripts/audit-checks/index.js +433 -0
  331. package/plugins/pbr/scripts/audit-checks/infrastructure.js +816 -0
  332. package/plugins/pbr/scripts/audit-checks/quality-metrics.js +455 -0
  333. package/plugins/pbr/scripts/audit-checks/session-quality.js +980 -0
  334. package/plugins/pbr/scripts/audit-checks/si-agent-hook-config-checks.js +396 -0
  335. package/plugins/pbr/scripts/audit-checks/si-cross-cutting-checks.js +272 -0
  336. package/plugins/pbr/scripts/audit-checks/si-skill-checks.js +424 -0
  337. package/plugins/pbr/scripts/audit-checks/workflow-compliance.js +1175 -0
  338. package/plugins/pbr/scripts/audit-dimensions.js +556 -0
  339. package/plugins/pbr/scripts/auto-continue.js +192 -37
  340. package/plugins/pbr/scripts/block-skill-self-read.js +124 -0
  341. package/plugins/pbr/scripts/check-agent-state-write.js +63 -0
  342. package/plugins/pbr/scripts/check-config-change.js +84 -1
  343. package/plugins/pbr/scripts/check-cross-plugin-sync.js +93 -0
  344. package/plugins/pbr/scripts/check-dangerous-commands.js +18 -5
  345. package/plugins/pbr/scripts/check-direct-state-write.js +37 -0
  346. package/plugins/pbr/scripts/check-phase-boundary.js +3 -8
  347. package/plugins/pbr/scripts/check-plan-format.js +153 -278
  348. package/plugins/pbr/scripts/check-read-first.js +345 -0
  349. package/plugins/pbr/scripts/check-roadmap-sync.js +174 -19
  350. package/plugins/pbr/scripts/check-skill-workflow.js +24 -27
  351. package/plugins/pbr/scripts/check-state-sync.js +360 -218
  352. package/plugins/pbr/scripts/check-subagent-output.js +308 -273
  353. package/plugins/pbr/scripts/check-summary-gate.js +5 -15
  354. package/plugins/pbr/scripts/commands/benchmarks.js +195 -0
  355. package/plugins/pbr/scripts/commands/calibrate.js +530 -0
  356. package/plugins/pbr/scripts/commands/config.js +72 -0
  357. package/plugins/pbr/scripts/commands/misc.js +779 -0
  358. package/plugins/pbr/scripts/commands/phase.js +293 -0
  359. package/plugins/pbr/scripts/commands/roadmap.js +75 -0
  360. package/plugins/pbr/scripts/commands/state.js +84 -0
  361. package/plugins/pbr/scripts/commands/stress-test.js +349 -0
  362. package/plugins/pbr/scripts/commands/todo.js +191 -0
  363. package/plugins/pbr/scripts/commands/verify.js +169 -0
  364. package/plugins/pbr/scripts/config-schema.json +1183 -95
  365. package/plugins/pbr/scripts/context-bridge.js +425 -0
  366. package/plugins/pbr/scripts/context-budget-check.js +171 -16
  367. package/plugins/pbr/scripts/context-quality.js +271 -0
  368. package/plugins/pbr/scripts/enforce-context-budget.js +138 -0
  369. package/plugins/pbr/scripts/enforce-pbr-workflow.js +277 -0
  370. package/plugins/pbr/scripts/event-handler.js +137 -87
  371. package/plugins/pbr/scripts/event-logger.js +58 -25
  372. package/plugins/pbr/scripts/feedback-loop.js +155 -0
  373. package/plugins/pbr/scripts/graph-update.js +422 -0
  374. package/plugins/pbr/scripts/hook-logger.js +69 -35
  375. package/plugins/pbr/scripts/hook-server-client.js +361 -0
  376. package/plugins/pbr/scripts/hook-server.js +664 -0
  377. package/plugins/pbr/scripts/hooks-schema.json +12 -5
  378. package/plugins/pbr/scripts/instructions-loaded.js +173 -0
  379. package/plugins/pbr/scripts/intent-router.cjs +147 -0
  380. package/plugins/pbr/scripts/intercept-plan-mode.js +52 -18
  381. package/plugins/pbr/scripts/lib/alternatives.js +203 -0
  382. package/plugins/pbr/scripts/lib/audit.js +65 -0
  383. package/plugins/pbr/scripts/lib/auto-cleanup.js +221 -0
  384. package/plugins/pbr/scripts/lib/auto-verify.js +123 -0
  385. package/plugins/pbr/scripts/lib/benchmark.js +190 -0
  386. package/plugins/pbr/scripts/lib/build.js +719 -0
  387. package/plugins/pbr/scripts/lib/ci-fix-loop.js +228 -0
  388. package/plugins/pbr/scripts/lib/commands.js +483 -0
  389. package/plugins/pbr/scripts/lib/compound.js +222 -0
  390. package/plugins/pbr/scripts/lib/config-cache.js +83 -0
  391. package/plugins/pbr/scripts/lib/config.js +1469 -0
  392. package/plugins/pbr/scripts/lib/context.js +254 -0
  393. package/plugins/pbr/scripts/lib/contextual-help.js +183 -0
  394. package/plugins/pbr/scripts/lib/convention-detector.js +413 -0
  395. package/plugins/pbr/scripts/lib/core.js +1585 -0
  396. package/plugins/pbr/scripts/lib/dashboard-launch.js +364 -0
  397. package/plugins/pbr/scripts/lib/data-hygiene.js +179 -0
  398. package/plugins/pbr/scripts/lib/decision-extraction.js +183 -0
  399. package/plugins/pbr/scripts/lib/decisions.js +194 -0
  400. package/plugins/pbr/scripts/lib/dependency-break.js +147 -0
  401. package/plugins/pbr/scripts/lib/format-validators.js +1049 -0
  402. package/plugins/pbr/scripts/lib/frontmatter.js +302 -0
  403. package/plugins/pbr/scripts/lib/gates/advisories.js +133 -0
  404. package/plugins/pbr/scripts/lib/gates/build-dependency.js +118 -0
  405. package/plugins/pbr/scripts/lib/gates/build-executor.js +106 -0
  406. package/plugins/pbr/scripts/lib/gates/doc-existence.js +46 -0
  407. package/plugins/pbr/scripts/lib/gates/helpers.js +98 -0
  408. package/plugins/pbr/scripts/lib/gates/inline-execution.js +187 -0
  409. package/plugins/pbr/scripts/lib/gates/milestone-complete.js +139 -0
  410. package/plugins/pbr/scripts/lib/gates/milestone-summary.js +121 -0
  411. package/plugins/pbr/scripts/lib/gates/multi-phase-loader.js +149 -0
  412. package/plugins/pbr/scripts/lib/gates/plan-executor.js +36 -0
  413. package/plugins/pbr/scripts/lib/gates/plan-validation.js +115 -0
  414. package/plugins/pbr/scripts/lib/gates/quick-executor.js +78 -0
  415. package/plugins/pbr/scripts/lib/gates/review-planner.js +63 -0
  416. package/plugins/pbr/scripts/lib/gates/review-verifier.js +71 -0
  417. package/plugins/pbr/scripts/lib/gates/rich-agent-context.js +148 -0
  418. package/plugins/pbr/scripts/lib/gates/sprint-preflight.js +30 -0
  419. package/plugins/pbr/scripts/lib/gates/user-confirmation.js +95 -0
  420. package/plugins/pbr/scripts/lib/graph-cli.js +89 -0
  421. package/plugins/pbr/scripts/lib/graph.js +553 -0
  422. package/plugins/pbr/scripts/lib/handoff-validators.js +224 -0
  423. package/plugins/pbr/scripts/lib/health-checks.js +107 -0
  424. package/plugins/pbr/scripts/lib/health-phase06.js +120 -0
  425. package/plugins/pbr/scripts/lib/health.js +132 -0
  426. package/plugins/pbr/scripts/lib/help.js +100 -0
  427. package/plugins/pbr/scripts/lib/history.js +150 -0
  428. package/plugins/pbr/scripts/lib/impact-analysis.js +319 -0
  429. package/plugins/pbr/scripts/lib/incidents.js +190 -0
  430. package/plugins/pbr/scripts/lib/init.js +643 -0
  431. package/plugins/pbr/scripts/lib/insights-parser.js +320 -0
  432. package/plugins/pbr/scripts/lib/intel.js +653 -0
  433. package/plugins/pbr/scripts/lib/learnings.js +511 -0
  434. package/plugins/pbr/scripts/lib/migrate.js +309 -0
  435. package/plugins/pbr/scripts/lib/milestone.js +306 -0
  436. package/plugins/pbr/scripts/lib/msys-path.js +20 -0
  437. package/plugins/pbr/scripts/lib/negative-knowledge.js +194 -0
  438. package/plugins/pbr/scripts/lib/notification-throttle.js +141 -0
  439. package/plugins/pbr/scripts/lib/onboarding-generator.js +288 -0
  440. package/plugins/pbr/scripts/lib/parse-args.js +134 -0
  441. package/plugins/pbr/scripts/lib/pattern-routing.js +55 -0
  442. package/plugins/pbr/scripts/lib/patterns.js +272 -0
  443. package/plugins/pbr/scripts/lib/perf.js +190 -0
  444. package/plugins/pbr/scripts/lib/phase.js +1043 -0
  445. package/plugins/pbr/scripts/lib/pid-lock.js +156 -0
  446. package/plugins/pbr/scripts/lib/post-hoc.js +160 -0
  447. package/plugins/pbr/scripts/lib/pre-commit-checks.js +220 -0
  448. package/plugins/pbr/scripts/lib/pre-research.js +126 -0
  449. package/plugins/pbr/scripts/lib/premature-completion.js +312 -0
  450. package/plugins/pbr/scripts/lib/preview.js +174 -0
  451. package/plugins/pbr/scripts/lib/progress-visualization.js +296 -0
  452. package/plugins/pbr/scripts/lib/quick-init.js +131 -0
  453. package/plugins/pbr/scripts/lib/reference.js +236 -0
  454. package/plugins/pbr/scripts/lib/requirements.js +153 -0
  455. package/plugins/pbr/scripts/lib/resolve-root.js +66 -0
  456. package/plugins/pbr/scripts/lib/reverse-spec.js +259 -0
  457. package/plugins/pbr/scripts/lib/roadmap.js +1089 -0
  458. package/plugins/pbr/scripts/lib/security-scan.js +200 -0
  459. package/plugins/pbr/scripts/lib/session-briefing.js +918 -0
  460. package/plugins/pbr/scripts/lib/skill-section.js +99 -0
  461. package/plugins/pbr/scripts/lib/smart-next-task.js +198 -0
  462. package/plugins/pbr/scripts/lib/snapshot-manager.js +232 -0
  463. package/plugins/pbr/scripts/lib/spec-diff.js +209 -0
  464. package/plugins/pbr/scripts/lib/spec-engine.js +189 -0
  465. package/plugins/pbr/scripts/lib/spot-check.js +539 -0
  466. package/plugins/pbr/scripts/lib/state-queue.js +171 -0
  467. package/plugins/pbr/scripts/lib/state.js +1082 -0
  468. package/plugins/pbr/scripts/lib/status-render.js +511 -0
  469. package/plugins/pbr/scripts/lib/step-verify.js +149 -0
  470. package/plugins/pbr/scripts/lib/subagent-validators.js +1119 -0
  471. package/plugins/pbr/scripts/lib/suggest-next.js +435 -0
  472. package/plugins/pbr/scripts/lib/tech-debt-scanner.js +116 -0
  473. package/plugins/pbr/scripts/lib/templates.js +362 -0
  474. package/plugins/pbr/scripts/lib/test-selection.js +163 -0
  475. package/plugins/pbr/scripts/lib/todo.js +300 -0
  476. package/plugins/pbr/scripts/lib/verify.js +1561 -0
  477. package/plugins/pbr/scripts/log-notification.js +131 -0
  478. package/plugins/pbr/scripts/log-subagent.js +221 -18
  479. package/plugins/pbr/scripts/log-tool-failure.js +60 -8
  480. package/plugins/pbr/scripts/milestone-learnings.js +519 -0
  481. package/plugins/pbr/scripts/package.json +1 -1
  482. package/plugins/pbr/scripts/pbr-tools.js +362 -1247
  483. package/plugins/pbr/scripts/post-bash-triage.js +96 -0
  484. package/plugins/pbr/scripts/post-compact.js +135 -0
  485. package/plugins/pbr/scripts/post-hoc.js +237 -0
  486. package/plugins/pbr/scripts/post-write-dispatch.js +201 -31
  487. package/plugins/pbr/scripts/post-write-quality.js +4 -3
  488. package/plugins/pbr/scripts/pre-bash-dispatch.js +147 -51
  489. package/plugins/pbr/scripts/pre-skill-dispatch.js +114 -0
  490. package/plugins/pbr/scripts/pre-task-dispatch.js +269 -0
  491. package/plugins/pbr/scripts/pre-write-dispatch.js +170 -73
  492. package/plugins/pbr/scripts/progress-tracker.js +121 -324
  493. package/plugins/pbr/scripts/prompt-guard.js +114 -0
  494. package/plugins/pbr/scripts/prompt-routing.js +209 -0
  495. package/plugins/pbr/scripts/quick-status.js +179 -0
  496. package/plugins/pbr/scripts/record-incident.js +37 -0
  497. package/plugins/pbr/scripts/risk-classifier.cjs +123 -0
  498. package/plugins/pbr/scripts/run-hook.js +63 -23
  499. package/plugins/pbr/scripts/session-cleanup.js +428 -29
  500. package/plugins/pbr/scripts/session-tracker.js +124 -0
  501. package/plugins/pbr/scripts/status-line.js +593 -32
  502. package/plugins/pbr/scripts/suggest-compact.js +201 -13
  503. package/plugins/pbr/scripts/sync-context-to-claude.js +100 -0
  504. package/plugins/pbr/scripts/task-completed.js +165 -4
  505. package/plugins/pbr/scripts/test/config.test.js +126 -0
  506. package/plugins/pbr/scripts/test/cross-platform.test.js +120 -0
  507. package/plugins/pbr/scripts/test/fixtures/config.json +20 -0
  508. package/plugins/pbr/scripts/test/fixtures/plan.md +54 -0
  509. package/plugins/pbr/scripts/test/fixtures/project.md +30 -0
  510. package/plugins/pbr/scripts/test/fixtures/roadmap.md +55 -0
  511. package/plugins/pbr/scripts/test/fixtures/state.md +60 -0
  512. package/plugins/pbr/scripts/test/fixtures/summary.md +35 -0
  513. package/plugins/pbr/scripts/test/fixtures.test.js +184 -0
  514. package/plugins/pbr/scripts/test/phase.test.js +142 -0
  515. package/plugins/pbr/scripts/test/roadmap.test.js +96 -0
  516. package/plugins/pbr/scripts/test/state.test.js +155 -0
  517. package/plugins/pbr/scripts/track-context-budget.js +368 -104
  518. package/plugins/pbr/scripts/track-user-gates.js +88 -0
  519. package/plugins/pbr/scripts/trust-tracker.js +193 -0
  520. package/plugins/pbr/scripts/validate-commit.js +59 -26
  521. package/plugins/pbr/scripts/validate-skill-args.js +87 -15
  522. package/plugins/pbr/scripts/validate-task.js +83 -627
  523. package/plugins/pbr/scripts/worktree-create.js +144 -0
  524. package/plugins/pbr/scripts/worktree-remove.js +147 -0
  525. package/plugins/pbr/skills/audit/SKILL.md +195 -24
  526. package/plugins/pbr/skills/audit-fix/SKILL.md +326 -0
  527. package/plugins/pbr/skills/autonomous/SKILL.md +551 -0
  528. package/plugins/pbr/skills/backlog/SKILL.md +56 -0
  529. package/plugins/pbr/skills/begin/SKILL.md +508 -153
  530. package/plugins/pbr/skills/begin/templates/STATE.md.tmpl +1 -2
  531. package/plugins/pbr/skills/begin/templates/config.json.tmpl +419 -36
  532. package/plugins/pbr/skills/begin/templates/researcher-prompt.md.tmpl +28 -0
  533. package/plugins/pbr/skills/begin/templates/roadmap-prompt.md.tmpl +28 -3
  534. package/plugins/pbr/skills/begin/templates/synthesis-prompt.md.tmpl +33 -5
  535. package/plugins/pbr/skills/build/SKILL.md +1180 -358
  536. package/plugins/pbr/skills/build/templates/continuation-prompt.md.tmpl +26 -0
  537. package/plugins/pbr/skills/build/templates/executor-prompt.md.tmpl +77 -0
  538. package/plugins/pbr/skills/build/templates/inline-verifier-prompt.md.tmpl +33 -0
  539. package/plugins/pbr/skills/build/templates/qa-round-context.md.tmpl +16 -0
  540. package/plugins/pbr/skills/config/SKILL.md +112 -9
  541. package/plugins/pbr/skills/continue/SKILL.md +113 -33
  542. package/plugins/pbr/skills/dashboard/SKILL.md +21 -9
  543. package/plugins/pbr/skills/debug/SKILL.md +70 -12
  544. package/plugins/pbr/skills/debug/templates/continuation-prompt.md.tmpl +12 -1
  545. package/plugins/pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +12 -5
  546. package/plugins/pbr/skills/discuss/SKILL.md +205 -24
  547. package/plugins/pbr/skills/discuss/templates/CONTEXT.md.tmpl +21 -1
  548. package/plugins/pbr/skills/do/SKILL.md +119 -24
  549. package/plugins/pbr/skills/explore/SKILL.md +95 -20
  550. package/plugins/pbr/skills/fast/SKILL.md +94 -0
  551. package/plugins/pbr/skills/forensics/SKILL.md +144 -0
  552. package/plugins/pbr/skills/health/SKILL.md +35 -117
  553. package/plugins/pbr/skills/help/SKILL.md +83 -123
  554. package/plugins/pbr/skills/import/SKILL.md +332 -13
  555. package/plugins/pbr/skills/intel/SKILL.md +131 -0
  556. package/plugins/pbr/skills/list-phase-assumptions/SKILL.md +231 -0
  557. package/plugins/pbr/skills/milestone/SKILL.md +383 -274
  558. package/plugins/pbr/skills/milestone/templates/audit-output.md.tmpl +76 -0
  559. package/plugins/pbr/skills/milestone/templates/complete-output.md.tmpl +32 -0
  560. package/plugins/pbr/skills/milestone/templates/edge-cases.md +54 -0
  561. package/plugins/pbr/skills/milestone/templates/gaps-output.md.tmpl +25 -0
  562. package/plugins/pbr/skills/milestone/templates/integration-checker-prompt.md.tmpl +25 -0
  563. package/plugins/pbr/skills/milestone/templates/new-output.md.tmpl +29 -0
  564. package/plugins/pbr/skills/milestone-summary/SKILL.md +86 -0
  565. package/plugins/pbr/skills/note/SKILL.md +20 -4
  566. package/plugins/pbr/skills/pause/SKILL.md +54 -14
  567. package/plugins/pbr/skills/pause/templates/continue-here.md.tmpl +33 -52
  568. package/plugins/pbr/skills/plan/SKILL.md +526 -280
  569. package/plugins/pbr/skills/plan/templates/checker-prompt.md.tmpl +20 -2
  570. package/plugins/pbr/skills/plan/templates/completion-output.md.tmpl +27 -0
  571. package/plugins/pbr/skills/plan/templates/planner-prompt.md.tmpl +43 -1
  572. package/plugins/pbr/skills/plan/templates/revision-prompt.md.tmpl +21 -5
  573. package/plugins/pbr/skills/profile/SKILL.md +185 -0
  574. package/plugins/pbr/skills/profile-user/SKILL.md +227 -0
  575. package/plugins/pbr/skills/quick/SKILL.md +435 -100
  576. package/plugins/pbr/skills/release/SKILL.md +206 -0
  577. package/plugins/pbr/skills/resume/SKILL.md +170 -46
  578. package/plugins/pbr/skills/review/SKILL.md +233 -165
  579. package/plugins/pbr/skills/review/templates/verifier-prompt.md.tmpl +7 -0
  580. package/plugins/pbr/skills/scan/SKILL.md +152 -106
  581. package/plugins/pbr/skills/scan/templates/mapper-prompt.md.tmpl +5 -56
  582. package/plugins/pbr/skills/seed/SKILL.md +87 -0
  583. package/plugins/pbr/skills/session-report/SKILL.md +130 -0
  584. package/plugins/pbr/skills/setup/SKILL.md +150 -202
  585. package/plugins/pbr/skills/shared/agent-context-enrichment.md +21 -0
  586. package/plugins/pbr/skills/shared/agent-type-resolution.md +32 -0
  587. package/plugins/pbr/skills/shared/commit-planning-docs.md +8 -0
  588. package/plugins/pbr/skills/shared/context-budget.md +66 -1
  589. package/plugins/pbr/skills/shared/context-loader-task.md +18 -11
  590. package/plugins/pbr/skills/shared/criterion-writing.md +58 -0
  591. package/plugins/pbr/skills/shared/digest-select.md +2 -2
  592. package/plugins/pbr/skills/shared/domain-probes.md +1 -1
  593. package/plugins/pbr/skills/shared/error-reporting.md +38 -60
  594. package/plugins/pbr/skills/shared/gate-prompts.md +4 -2
  595. package/plugins/pbr/skills/shared/memory-capture.md +48 -0
  596. package/plugins/pbr/skills/shared/phase-argument-parsing.md +4 -4
  597. package/plugins/pbr/skills/shared/revision-loop.md +24 -6
  598. package/plugins/pbr/skills/shared/state-update.md +49 -56
  599. package/plugins/pbr/skills/shared/universal-anti-patterns.md +27 -4
  600. package/plugins/pbr/skills/ship/SKILL.md +155 -0
  601. package/plugins/pbr/skills/stats/SKILL.md +110 -0
  602. package/plugins/pbr/skills/status/SKILL.md +185 -119
  603. package/plugins/pbr/skills/test/SKILL.md +254 -0
  604. package/plugins/pbr/skills/thread/SKILL.md +73 -0
  605. package/plugins/pbr/skills/todo/SKILL.md +28 -72
  606. package/plugins/pbr/skills/ui-phase/SKILL.md +180 -0
  607. package/plugins/pbr/skills/ui-review/SKILL.md +206 -0
  608. package/plugins/pbr/skills/undo/SKILL.md +221 -0
  609. package/plugins/pbr/skills/validate-phase/SKILL.md +362 -0
  610. package/plugins/pbr/templates/CONTEXT.md.tmpl +45 -20
  611. package/plugins/pbr/templates/DISCOVERY.md.tmpl +29 -0
  612. package/plugins/pbr/templates/DISCUSSION-LOG.md.tmpl +49 -0
  613. package/plugins/pbr/templates/HANDOFF.json.tmpl +30 -0
  614. package/plugins/pbr/templates/INTEGRATION-REPORT.md.tmpl +18 -2
  615. package/plugins/pbr/templates/MILESTONE-AUDIT.md.tmpl +44 -0
  616. package/plugins/pbr/templates/PROJECT.md.tmpl +126 -0
  617. package/plugins/pbr/templates/REQUIREMENTS.md.tmpl +96 -0
  618. package/plugins/pbr/templates/RETROSPECTIVE.md.tmpl +43 -0
  619. package/plugins/pbr/templates/ROADMAP.md.tmpl +108 -14
  620. package/plugins/pbr/templates/SUMMARY-complex.md.tmpl +133 -0
  621. package/plugins/pbr/templates/SUMMARY-minimal.md.tmpl +55 -0
  622. package/plugins/pbr/templates/SUMMARY.md.tmpl +21 -0
  623. package/plugins/pbr/templates/UAT.md.tmpl +94 -0
  624. package/plugins/pbr/templates/UI-SPEC.md.tmpl +144 -0
  625. package/plugins/pbr/templates/VALIDATION.md.tmpl +94 -0
  626. package/plugins/pbr/templates/VERIFICATION-DETAIL.md.tmpl +54 -13
  627. package/plugins/pbr/templates/project-CONTEXT.md.tmpl +59 -0
  628. package/plugins/pbr/templates/research-outputs/ARCHITECTURE.md.tmpl +91 -0
  629. package/plugins/pbr/templates/research-outputs/FEATURES.md.tmpl +64 -0
  630. package/plugins/pbr/templates/research-outputs/PITFALLS.md.tmpl +50 -0
  631. package/plugins/pbr/templates/research-outputs/STACK.md.tmpl +63 -0
  632. package/plugins/pbr/templates/research-outputs/SUMMARY.md.tmpl +98 -0
  633. package/scripts/build-hooks.js +61 -0
  634. package/scripts/check-ci.js +100 -0
  635. package/scripts/clean-changelog.js +364 -0
  636. package/scripts/generate-derivatives.js +581 -0
  637. package/scripts/posttest.js +93 -0
  638. package/scripts/release.js +262 -0
  639. package/scripts/run-tests.cjs +29 -0
  640. package/scripts/test-wrapper.js +43 -0
  641. package/dashboard/bin/cli.js +0 -25
  642. package/dashboard/public/css/layout.css +0 -704
  643. package/dashboard/public/css/status-colors.css +0 -98
  644. package/dashboard/public/css/tokens.css +0 -59
  645. package/dashboard/public/js/htmx-title.js +0 -5
  646. package/dashboard/public/js/sidebar-toggle.js +0 -34
  647. package/dashboard/public/js/sse-client.js +0 -100
  648. package/dashboard/public/js/theme-toggle.js +0 -46
  649. package/dashboard/src/app.js +0 -91
  650. package/dashboard/src/middleware/current-phase.js +0 -24
  651. package/dashboard/src/middleware/errorHandler.js +0 -52
  652. package/dashboard/src/middleware/notFoundHandler.js +0 -9
  653. package/dashboard/src/repositories/planning.repository.js +0 -130
  654. package/dashboard/src/routes/events.routes.js +0 -45
  655. package/dashboard/src/routes/index.routes.js +0 -35
  656. package/dashboard/src/routes/pages.routes.js +0 -426
  657. package/dashboard/src/server.js +0 -42
  658. package/dashboard/src/services/analytics.service.js +0 -141
  659. package/dashboard/src/services/dashboard.service.js +0 -309
  660. package/dashboard/src/services/milestone.service.js +0 -222
  661. package/dashboard/src/services/notes.service.js +0 -50
  662. package/dashboard/src/services/phase.service.js +0 -232
  663. package/dashboard/src/services/project.service.js +0 -57
  664. package/dashboard/src/services/roadmap.service.js +0 -258
  665. package/dashboard/src/services/sse.service.js +0 -58
  666. package/dashboard/src/services/todo.service.js +0 -272
  667. package/dashboard/src/services/watcher.service.js +0 -48
  668. package/dashboard/src/utils/cache.js +0 -55
  669. package/dashboard/src/views/analytics.ejs +0 -5
  670. package/dashboard/src/views/coming-soon.ejs +0 -11
  671. package/dashboard/src/views/dependencies.ejs +0 -5
  672. package/dashboard/src/views/error.ejs +0 -20
  673. package/dashboard/src/views/index.ejs +0 -5
  674. package/dashboard/src/views/milestone-detail.ejs +0 -5
  675. package/dashboard/src/views/milestones.ejs +0 -5
  676. package/dashboard/src/views/notes.ejs +0 -5
  677. package/dashboard/src/views/partials/analytics-content.ejs +0 -90
  678. package/dashboard/src/views/partials/breadcrumbs.ejs +0 -14
  679. package/dashboard/src/views/partials/dashboard-content.ejs +0 -84
  680. package/dashboard/src/views/partials/dependencies-content.ejs +0 -48
  681. package/dashboard/src/views/partials/empty-state.ejs +0 -7
  682. package/dashboard/src/views/partials/footer.ejs +0 -3
  683. package/dashboard/src/views/partials/head.ejs +0 -30
  684. package/dashboard/src/views/partials/header.ejs +0 -21
  685. package/dashboard/src/views/partials/layout-bottom.ejs +0 -43
  686. package/dashboard/src/views/partials/layout-top.ejs +0 -16
  687. package/dashboard/src/views/partials/milestone-detail-content.ejs +0 -20
  688. package/dashboard/src/views/partials/milestones-content.ejs +0 -88
  689. package/dashboard/src/views/partials/notes-content.ejs +0 -23
  690. package/dashboard/src/views/partials/phase-content.ejs +0 -193
  691. package/dashboard/src/views/partials/phase-doc-content.ejs +0 -38
  692. package/dashboard/src/views/partials/phases-content.ejs +0 -124
  693. package/dashboard/src/views/partials/roadmap-content.ejs +0 -180
  694. package/dashboard/src/views/partials/sidebar.ejs +0 -99
  695. package/dashboard/src/views/partials/todo-create-content.ejs +0 -54
  696. package/dashboard/src/views/partials/todo-detail-content.ejs +0 -42
  697. package/dashboard/src/views/partials/todos-content.ejs +0 -97
  698. package/dashboard/src/views/phase-detail.ejs +0 -5
  699. package/dashboard/src/views/phase-doc.ejs +0 -5
  700. package/dashboard/src/views/phases.ejs +0 -5
  701. package/dashboard/src/views/roadmap.ejs +0 -5
  702. package/dashboard/src/views/todo-create.ejs +0 -5
  703. package/dashboard/src/views/todo-detail.ejs +0 -5
  704. package/dashboard/src/views/todos.ejs +0 -5
  705. package/plugins/copilot-pbr/CHANGELOG.md +0 -19
  706. package/plugins/copilot-pbr/README.md +0 -139
  707. package/plugins/copilot-pbr/agents/audit.agent.md +0 -113
  708. package/plugins/copilot-pbr/agents/codebase-mapper.agent.md +0 -151
  709. package/plugins/copilot-pbr/agents/debugger.agent.md +0 -182
  710. package/plugins/copilot-pbr/agents/executor.agent.md +0 -267
  711. package/plugins/copilot-pbr/agents/general.agent.md +0 -88
  712. package/plugins/copilot-pbr/agents/integration-checker.agent.md +0 -119
  713. package/plugins/copilot-pbr/agents/plan-checker.agent.md +0 -208
  714. package/plugins/copilot-pbr/agents/planner.agent.md +0 -238
  715. package/plugins/copilot-pbr/agents/researcher.agent.md +0 -186
  716. package/plugins/copilot-pbr/agents/synthesizer.agent.md +0 -126
  717. package/plugins/copilot-pbr/agents/verifier.agent.md +0 -228
  718. package/plugins/copilot-pbr/hooks/hooks.json +0 -258
  719. package/plugins/copilot-pbr/plugin.json +0 -30
  720. package/plugins/copilot-pbr/references/agent-anti-patterns.md +0 -25
  721. package/plugins/copilot-pbr/references/agent-contracts.md +0 -297
  722. package/plugins/copilot-pbr/references/agent-interactions.md +0 -135
  723. package/plugins/copilot-pbr/references/agent-teams.md +0 -55
  724. package/plugins/copilot-pbr/references/checkpoints.md +0 -158
  725. package/plugins/copilot-pbr/references/common-bug-patterns.md +0 -14
  726. package/plugins/copilot-pbr/references/config-reference.md +0 -442
  727. package/plugins/copilot-pbr/references/continuation-format.md +0 -213
  728. package/plugins/copilot-pbr/references/deviation-rules.md +0 -113
  729. package/plugins/copilot-pbr/references/git-integration.md +0 -227
  730. package/plugins/copilot-pbr/references/integration-patterns.md +0 -118
  731. package/plugins/copilot-pbr/references/model-profiles.md +0 -100
  732. package/plugins/copilot-pbr/references/model-selection.md +0 -32
  733. package/plugins/copilot-pbr/references/pbr-rules.md +0 -195
  734. package/plugins/copilot-pbr/references/pbr-tools-cli.md +0 -285
  735. package/plugins/copilot-pbr/references/plan-authoring.md +0 -182
  736. package/plugins/copilot-pbr/references/plan-format.md +0 -288
  737. package/plugins/copilot-pbr/references/planning-config.md +0 -214
  738. package/plugins/copilot-pbr/references/questioning.md +0 -215
  739. package/plugins/copilot-pbr/references/reading-verification.md +0 -128
  740. package/plugins/copilot-pbr/references/stub-patterns.md +0 -161
  741. package/plugins/copilot-pbr/references/subagent-coordination.md +0 -120
  742. package/plugins/copilot-pbr/references/ui-formatting.md +0 -444
  743. package/plugins/copilot-pbr/references/verification-patterns.md +0 -199
  744. package/plugins/copilot-pbr/references/wave-execution.md +0 -96
  745. package/plugins/copilot-pbr/rules/pbr-workflow.mdc +0 -48
  746. package/plugins/copilot-pbr/setup.ps1 +0 -93
  747. package/plugins/copilot-pbr/setup.sh +0 -93
  748. package/plugins/copilot-pbr/skills/audit/SKILL.md +0 -330
  749. package/plugins/copilot-pbr/skills/begin/SKILL.md +0 -589
  750. package/plugins/copilot-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  751. package/plugins/copilot-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  752. package/plugins/copilot-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  753. package/plugins/copilot-pbr/skills/begin/templates/config.json.tmpl +0 -64
  754. package/plugins/copilot-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  755. package/plugins/copilot-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  756. package/plugins/copilot-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  757. package/plugins/copilot-pbr/skills/build/SKILL.md +0 -960
  758. package/plugins/copilot-pbr/skills/config/SKILL.md +0 -250
  759. package/plugins/copilot-pbr/skills/continue/SKILL.md +0 -159
  760. package/plugins/copilot-pbr/skills/dashboard/SKILL.md +0 -43
  761. package/plugins/copilot-pbr/skills/debug/SKILL.md +0 -508
  762. package/plugins/copilot-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  763. package/plugins/copilot-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  764. package/plugins/copilot-pbr/skills/discuss/SKILL.md +0 -353
  765. package/plugins/copilot-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  766. package/plugins/copilot-pbr/skills/discuss/templates/decision-categories.md +0 -10
  767. package/plugins/copilot-pbr/skills/do/SKILL.md +0 -66
  768. package/plugins/copilot-pbr/skills/explore/SKILL.md +0 -373
  769. package/plugins/copilot-pbr/skills/health/SKILL.md +0 -283
  770. package/plugins/copilot-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  771. package/plugins/copilot-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  772. package/plugins/copilot-pbr/skills/help/SKILL.md +0 -193
  773. package/plugins/copilot-pbr/skills/import/SKILL.md +0 -502
  774. package/plugins/copilot-pbr/skills/milestone/SKILL.md +0 -806
  775. package/plugins/copilot-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  776. package/plugins/copilot-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  777. package/plugins/copilot-pbr/skills/note/SKILL.md +0 -213
  778. package/plugins/copilot-pbr/skills/pause/SKILL.md +0 -247
  779. package/plugins/copilot-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  780. package/plugins/copilot-pbr/skills/plan/SKILL.md +0 -662
  781. package/plugins/copilot-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  782. package/plugins/copilot-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  783. package/plugins/copilot-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  784. package/plugins/copilot-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  785. package/plugins/copilot-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  786. package/plugins/copilot-pbr/skills/quick/SKILL.md +0 -376
  787. package/plugins/copilot-pbr/skills/resume/SKILL.md +0 -399
  788. package/plugins/copilot-pbr/skills/review/SKILL.md +0 -653
  789. package/plugins/copilot-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  790. package/plugins/copilot-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  791. package/plugins/copilot-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  792. package/plugins/copilot-pbr/skills/scan/SKILL.md +0 -299
  793. package/plugins/copilot-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  794. package/plugins/copilot-pbr/skills/setup/SKILL.md +0 -296
  795. package/plugins/copilot-pbr/skills/shared/commit-planning-docs.md +0 -36
  796. package/plugins/copilot-pbr/skills/shared/config-loading.md +0 -103
  797. package/plugins/copilot-pbr/skills/shared/context-budget.md +0 -41
  798. package/plugins/copilot-pbr/skills/shared/context-loader-task.md +0 -87
  799. package/plugins/copilot-pbr/skills/shared/digest-select.md +0 -80
  800. package/plugins/copilot-pbr/skills/shared/domain-probes.md +0 -126
  801. package/plugins/copilot-pbr/skills/shared/error-recovery-strategies.md +0 -51
  802. package/plugins/copilot-pbr/skills/shared/error-reporting.md +0 -81
  803. package/plugins/copilot-pbr/skills/shared/gate-prompts.md +0 -389
  804. package/plugins/copilot-pbr/skills/shared/phase-argument-parsing.md +0 -46
  805. package/plugins/copilot-pbr/skills/shared/progress-display.md +0 -53
  806. package/plugins/copilot-pbr/skills/shared/revision-loop.md +0 -82
  807. package/plugins/copilot-pbr/skills/shared/state-loading.md +0 -63
  808. package/plugins/copilot-pbr/skills/shared/state-update.md +0 -162
  809. package/plugins/copilot-pbr/skills/shared/universal-anti-patterns.md +0 -38
  810. package/plugins/copilot-pbr/skills/status/SKILL.md +0 -362
  811. package/plugins/copilot-pbr/skills/statusline/SKILL.md +0 -149
  812. package/plugins/copilot-pbr/skills/todo/SKILL.md +0 -279
  813. package/plugins/copilot-pbr/templates/CONTEXT.md.tmpl +0 -53
  814. package/plugins/copilot-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  815. package/plugins/copilot-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  816. package/plugins/copilot-pbr/templates/ROADMAP.md.tmpl +0 -41
  817. package/plugins/copilot-pbr/templates/SUMMARY.md.tmpl +0 -82
  818. package/plugins/copilot-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  819. package/plugins/copilot-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  820. package/plugins/copilot-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  821. package/plugins/copilot-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  822. package/plugins/copilot-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  823. package/plugins/copilot-pbr/templates/codebase/STACK.md.tmpl +0 -78
  824. package/plugins/copilot-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  825. package/plugins/copilot-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  826. package/plugins/copilot-pbr/templates/continue-here.md.tmpl +0 -74
  827. package/plugins/copilot-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  828. package/plugins/copilot-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  829. package/plugins/copilot-pbr/templates/research/STACK.md.tmpl +0 -71
  830. package/plugins/copilot-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  831. package/plugins/copilot-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  832. package/plugins/copilot-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  833. package/plugins/copilot-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  834. package/plugins/cursor-pbr/.cursor-plugin/plugin.json +0 -32
  835. package/plugins/cursor-pbr/CHANGELOG.md +0 -15
  836. package/plugins/cursor-pbr/README.md +0 -123
  837. package/plugins/cursor-pbr/agents/audit.md +0 -178
  838. package/plugins/cursor-pbr/agents/codebase-mapper.md +0 -150
  839. package/plugins/cursor-pbr/agents/debugger.md +0 -181
  840. package/plugins/cursor-pbr/agents/executor.md +0 -266
  841. package/plugins/cursor-pbr/agents/general.md +0 -87
  842. package/plugins/cursor-pbr/agents/integration-checker.md +0 -118
  843. package/plugins/cursor-pbr/agents/plan-checker.md +0 -207
  844. package/plugins/cursor-pbr/agents/planner.md +0 -237
  845. package/plugins/cursor-pbr/agents/researcher.md +0 -185
  846. package/plugins/cursor-pbr/agents/synthesizer.md +0 -125
  847. package/plugins/cursor-pbr/agents/verifier.md +0 -227
  848. package/plugins/cursor-pbr/assets/.gitkeep +0 -0
  849. package/plugins/cursor-pbr/assets/logo.svg +0 -21
  850. package/plugins/cursor-pbr/hooks/hooks.json +0 -224
  851. package/plugins/cursor-pbr/references/agent-anti-patterns.md +0 -25
  852. package/plugins/cursor-pbr/references/agent-contracts.md +0 -297
  853. package/plugins/cursor-pbr/references/agent-interactions.md +0 -135
  854. package/plugins/cursor-pbr/references/agent-teams.md +0 -55
  855. package/plugins/cursor-pbr/references/checkpoints.md +0 -158
  856. package/plugins/cursor-pbr/references/common-bug-patterns.md +0 -14
  857. package/plugins/cursor-pbr/references/config-reference.md +0 -442
  858. package/plugins/cursor-pbr/references/continuation-format.md +0 -213
  859. package/plugins/cursor-pbr/references/deviation-rules.md +0 -113
  860. package/plugins/cursor-pbr/references/git-integration.md +0 -227
  861. package/plugins/cursor-pbr/references/integration-patterns.md +0 -118
  862. package/plugins/cursor-pbr/references/model-profiles.md +0 -100
  863. package/plugins/cursor-pbr/references/model-selection.md +0 -32
  864. package/plugins/cursor-pbr/references/pbr-rules.md +0 -195
  865. package/plugins/cursor-pbr/references/pbr-tools-cli.md +0 -285
  866. package/plugins/cursor-pbr/references/plan-authoring.md +0 -182
  867. package/plugins/cursor-pbr/references/plan-format.md +0 -288
  868. package/plugins/cursor-pbr/references/planning-config.md +0 -214
  869. package/plugins/cursor-pbr/references/questioning.md +0 -215
  870. package/plugins/cursor-pbr/references/reading-verification.md +0 -128
  871. package/plugins/cursor-pbr/references/stub-patterns.md +0 -161
  872. package/plugins/cursor-pbr/references/subagent-coordination.md +0 -120
  873. package/plugins/cursor-pbr/references/ui-formatting.md +0 -444
  874. package/plugins/cursor-pbr/references/verification-patterns.md +0 -199
  875. package/plugins/cursor-pbr/references/wave-execution.md +0 -96
  876. package/plugins/cursor-pbr/rules/pbr-workflow.mdc +0 -48
  877. package/plugins/cursor-pbr/setup.ps1 +0 -78
  878. package/plugins/cursor-pbr/setup.sh +0 -83
  879. package/plugins/cursor-pbr/skills/audit/SKILL.md +0 -331
  880. package/plugins/cursor-pbr/skills/begin/SKILL.md +0 -589
  881. package/plugins/cursor-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  882. package/plugins/cursor-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  883. package/plugins/cursor-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  884. package/plugins/cursor-pbr/skills/begin/templates/config.json.tmpl +0 -64
  885. package/plugins/cursor-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  886. package/plugins/cursor-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  887. package/plugins/cursor-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  888. package/plugins/cursor-pbr/skills/build/SKILL.md +0 -961
  889. package/plugins/cursor-pbr/skills/config/SKILL.md +0 -252
  890. package/plugins/cursor-pbr/skills/continue/SKILL.md +0 -159
  891. package/plugins/cursor-pbr/skills/dashboard/SKILL.md +0 -44
  892. package/plugins/cursor-pbr/skills/debug/SKILL.md +0 -512
  893. package/plugins/cursor-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  894. package/plugins/cursor-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  895. package/plugins/cursor-pbr/skills/discuss/SKILL.md +0 -354
  896. package/plugins/cursor-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  897. package/plugins/cursor-pbr/skills/discuss/templates/decision-categories.md +0 -10
  898. package/plugins/cursor-pbr/skills/do/SKILL.md +0 -67
  899. package/plugins/cursor-pbr/skills/explore/SKILL.md +0 -376
  900. package/plugins/cursor-pbr/skills/health/SKILL.md +0 -283
  901. package/plugins/cursor-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  902. package/plugins/cursor-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  903. package/plugins/cursor-pbr/skills/help/SKILL.md +0 -193
  904. package/plugins/cursor-pbr/skills/import/SKILL.md +0 -505
  905. package/plugins/cursor-pbr/skills/milestone/SKILL.md +0 -807
  906. package/plugins/cursor-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  907. package/plugins/cursor-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  908. package/plugins/cursor-pbr/skills/note/SKILL.md +0 -214
  909. package/plugins/cursor-pbr/skills/pause/SKILL.md +0 -248
  910. package/plugins/cursor-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  911. package/plugins/cursor-pbr/skills/plan/SKILL.md +0 -663
  912. package/plugins/cursor-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  913. package/plugins/cursor-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  914. package/plugins/cursor-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  915. package/plugins/cursor-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  916. package/plugins/cursor-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  917. package/plugins/cursor-pbr/skills/quick/SKILL.md +0 -376
  918. package/plugins/cursor-pbr/skills/resume/SKILL.md +0 -399
  919. package/plugins/cursor-pbr/skills/review/SKILL.md +0 -654
  920. package/plugins/cursor-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  921. package/plugins/cursor-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  922. package/plugins/cursor-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  923. package/plugins/cursor-pbr/skills/scan/SKILL.md +0 -300
  924. package/plugins/cursor-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  925. package/plugins/cursor-pbr/skills/setup/SKILL.md +0 -296
  926. package/plugins/cursor-pbr/skills/shared/commit-planning-docs.md +0 -36
  927. package/plugins/cursor-pbr/skills/shared/config-loading.md +0 -103
  928. package/plugins/cursor-pbr/skills/shared/context-budget.md +0 -41
  929. package/plugins/cursor-pbr/skills/shared/context-loader-task.md +0 -87
  930. package/plugins/cursor-pbr/skills/shared/digest-select.md +0 -80
  931. package/plugins/cursor-pbr/skills/shared/domain-probes.md +0 -126
  932. package/plugins/cursor-pbr/skills/shared/error-recovery-strategies.md +0 -51
  933. package/plugins/cursor-pbr/skills/shared/error-reporting.md +0 -81
  934. package/plugins/cursor-pbr/skills/shared/gate-prompts.md +0 -389
  935. package/plugins/cursor-pbr/skills/shared/phase-argument-parsing.md +0 -46
  936. package/plugins/cursor-pbr/skills/shared/progress-display.md +0 -53
  937. package/plugins/cursor-pbr/skills/shared/revision-loop.md +0 -82
  938. package/plugins/cursor-pbr/skills/shared/state-loading.md +0 -63
  939. package/plugins/cursor-pbr/skills/shared/state-update.md +0 -162
  940. package/plugins/cursor-pbr/skills/shared/universal-anti-patterns.md +0 -38
  941. package/plugins/cursor-pbr/skills/status/SKILL.md +0 -362
  942. package/plugins/cursor-pbr/skills/statusline/SKILL.md +0 -150
  943. package/plugins/cursor-pbr/skills/todo/SKILL.md +0 -280
  944. package/plugins/cursor-pbr/templates/CONTEXT.md.tmpl +0 -53
  945. package/plugins/cursor-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  946. package/plugins/cursor-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  947. package/plugins/cursor-pbr/templates/ROADMAP.md.tmpl +0 -41
  948. package/plugins/cursor-pbr/templates/SUMMARY.md.tmpl +0 -82
  949. package/plugins/cursor-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  950. package/plugins/cursor-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  951. package/plugins/cursor-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  952. package/plugins/cursor-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  953. package/plugins/cursor-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  954. package/plugins/cursor-pbr/templates/codebase/STACK.md.tmpl +0 -78
  955. package/plugins/cursor-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  956. package/plugins/cursor-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  957. package/plugins/cursor-pbr/templates/continue-here.md.tmpl +0 -74
  958. package/plugins/cursor-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  959. package/plugins/cursor-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  960. package/plugins/cursor-pbr/templates/research/STACK.md.tmpl +0 -71
  961. package/plugins/cursor-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  962. package/plugins/cursor-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  963. package/plugins/cursor-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  964. package/plugins/cursor-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  965. package/plugins/pbr/references/agent-interactions.md +0 -134
  966. package/plugins/pbr/references/pbr-rules.md +0 -194
  967. package/plugins/pbr/references/pbr-tools-cli.md +0 -285
  968. package/plugins/pbr/references/planning-config.md +0 -213
  969. package/plugins/pbr/references/subagent-coordination.md +0 -119
  970. package/plugins/pbr/references/ui-formatting.md +0 -444
  971. package/plugins/pbr/scripts/validate-plugin-structure.js +0 -183
  972. package/plugins/pbr/skills/milestone/templates/audit-report.md.tmpl +0 -48
  973. package/plugins/pbr/skills/shared/error-recovery-strategies.md +0 -51
  974. package/plugins/pbr/skills/shared/progress-display.md +0 -53
  975. package/plugins/pbr/skills/shared/state-loading.md +0 -62
  976. package/plugins/pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -97
  977. package/plugins/pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  978. package/plugins/pbr/templates/research/STACK.md.tmpl +0 -71
  979. package/plugins/pbr/templates/research/SUMMARY.md.tmpl +0 -112
  980. package/plugins/pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  981. package/plugins/pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  982. package/plugins/pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  983. /package/plugins/pbr/references/{agent-anti-patterns.md → archive/agent-anti-patterns.md} +0 -0
@@ -0,0 +1,1089 @@
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');
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 (v9+ format: 3-column table)
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
+ }
66
+ // Even without a parseable Progress table, note if the heading exists
67
+ if (!result.has_progress_table) {
68
+ result.has_progress_table = !!progressMatch;
69
+ }
70
+
71
+ // Heading-based phase discovery fallback: if no table rows produced phases,
72
+ // scan for "## Phase N: Name" / "### Phase N: Name" headings (v14.0+ format)
73
+ if (result.phases.length === 0) {
74
+ const headingRe = /#{2,4}\s*Phase\s+(\d+(?:\.\d+)*)\s*:\s*([^\n]+)/gi;
75
+ let hm;
76
+ while ((hm = headingRe.exec(stripped)) !== null) {
77
+ result.phases.push({
78
+ number: hm[1],
79
+ name: hm[2].trim(),
80
+ goal: '',
81
+ plans: '',
82
+ status: 'unknown'
83
+ });
84
+ }
85
+ }
86
+
87
+ // Parse phase heading blocks for requirements and success criteria
88
+ const lines = stripped.split('\n');
89
+ const phaseMap = new Map();
90
+ for (const phase of result.phases) {
91
+ const numMatch = String(phase.number).match(/^(\d+)/);
92
+ if (numMatch) phaseMap.set(parseInt(numMatch[1], 10), phase);
93
+ }
94
+
95
+ for (let i = 0; i < lines.length; i++) {
96
+ const phaseMatch = lines[i].match(/^###\s+Phase\s+(\d+)\s*:\s*(.*)/i);
97
+ if (phaseMatch) {
98
+ const phaseNum = parseInt(phaseMatch[1], 10);
99
+ const phase = phaseMap.get(phaseNum);
100
+ if (phase) {
101
+ if (!phase.name) phase.name = phaseMatch[2].trim();
102
+ // Look ahead for fields
103
+ for (let j = i + 1; j < Math.min(i + 20, lines.length); j++) {
104
+ if (/^#{1,3}\s/.test(lines[j])) break;
105
+ const goalMatch = lines[j].match(/\*\*Goal:\*\*\s*(.*)/i);
106
+ if (goalMatch && !phase.goal) phase.goal = goalMatch[1].trim();
107
+ const reqMatch = lines[j].match(/\*\*Requirements:\*\*\s*(.*)/i);
108
+ if (reqMatch) phase.requirements = reqMatch[1].trim();
109
+ const critMatch = lines[j].match(/\*\*Success Criteria:\*\*\s*(.*)/i);
110
+ if (critMatch) phase.success_criteria = critMatch[1].trim();
111
+ }
112
+ }
113
+ }
114
+ }
115
+
116
+ return result;
117
+ }
118
+
119
+ // --- Table helpers ---
120
+
121
+ /**
122
+ * Find the row index of a phase in a ROADMAP.md table.
123
+ * @returns {number} Line index or -1 if not found
124
+ */
125
+ function findRoadmapRow(lines, phaseNum) {
126
+ const paddedPhase = phaseNum.padStart(2, '0');
127
+ const numericPhase = String(parseInt(phaseNum, 10));
128
+ for (let i = 0; i < lines.length; i++) {
129
+ if (!lines[i].includes('|')) continue;
130
+ // Skip separator rows
131
+ if (/^\s*\|[\s-:|]+\|\s*$/.test(lines[i])) continue;
132
+ const parts = lines[i].split('|');
133
+ if (parts.length < 3) continue;
134
+ // Search ALL columns for a phase number match
135
+ // Handles v9+ format: "| 21. Phase Name | X/Y | Status |" (number+name merged in 3-col table)
136
+ for (let c = 1; c < parts.length - 1; c++) {
137
+ const col = (parts[c] || '').trim();
138
+ // Match "01", "1", "01.", "01. Name", etc.
139
+ const match = col.match(/^0*(\d+)\./);
140
+ if (match && (match[1] === numericPhase || col === paddedPhase)) {
141
+ return i;
142
+ }
143
+ if (col === paddedPhase || col === numericPhase) {
144
+ return i;
145
+ }
146
+ }
147
+ }
148
+ return -1;
149
+ }
150
+
151
+ /**
152
+ * Update a specific column in a markdown table row.
153
+ * @param {string} row - The full table row string (e.g., "| 01 | Setup | ... |")
154
+ * @param {number} columnIndex - 0-based column index (Phase=0, Name=1, ..., Status=5)
155
+ * @param {string} newValue - New cell value
156
+ * @returns {string} Updated row
157
+ */
158
+ function updateTableRow(row, columnIndex, newValue) {
159
+ const parts = row.split('|');
160
+ // parts[0] is empty (before first |), data starts at parts[1]
161
+ const partIndex = columnIndex + 1;
162
+ if (partIndex < parts.length) {
163
+ parts[partIndex] = ` ${newValue} `;
164
+ }
165
+ return parts.join('|');
166
+ }
167
+
168
+ /**
169
+ * Find the pipe-delimited column index for a header matching `pattern` by
170
+ * scanning backward from `rowIdx` to find the nearest header row.
171
+ * Returns the raw split('|') index (includes leading empty element), or -1.
172
+ */
173
+ function _findColumnIndex(lines, rowIdx, pattern) {
174
+ // Scan backward from rowIdx to find the header row
175
+ for (let h = rowIdx - 1; h >= 0; h--) {
176
+ if (!lines[h].includes('|')) continue;
177
+ // Skip separator rows
178
+ if (/^\s*\|[\s-:|]+\|\s*$/.test(lines[h])) continue;
179
+ // Check if this looks like a header (contains recognizable column names)
180
+ if (/phase/i.test(lines[h]) || /status/i.test(lines[h]) || /plans/i.test(lines[h])) {
181
+ const parts = lines[h].split('|');
182
+ for (let c = 0; c < parts.length; c++) {
183
+ if (pattern.test(parts[c].trim())) return c;
184
+ }
185
+ }
186
+ }
187
+ return -1;
188
+ }
189
+
190
+ // --- Mutation commands ---
191
+
192
+ /**
193
+ * Update the Status column for a phase in ROADMAP.md's Phase Overview table.
194
+ *
195
+ * @param {string} phaseNum - Phase number
196
+ * @param {string} newStatus - New status value
197
+ * @param {string} [planningDir] - Path to .planning directory
198
+ */
199
+ async function roadmapUpdateStatus(phaseNum, newStatus, planningDir) {
200
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
201
+ const roadmapPath = path.join(dir, 'ROADMAP.md');
202
+ if (!fs.existsSync(roadmapPath)) {
203
+ return { success: false, error: 'ROADMAP.md not found' };
204
+ }
205
+
206
+ let oldStatus = null;
207
+
208
+ const result = await lockedFileUpdate(roadmapPath, (content) => {
209
+ const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
210
+ const lines = content.replace(/\r\n/g, '\n').split('\n');
211
+ const rowIdx = findRoadmapRow(lines, phaseNum);
212
+ if (rowIdx === -1) {
213
+ return content; // No matching row found
214
+ }
215
+ // Dynamic column detection: find Status column from nearest header row
216
+ const statusColIdx = _findColumnIndex(lines, rowIdx, /status/i);
217
+ const parts = lines[rowIdx].split('|');
218
+ if (statusColIdx !== -1 && statusColIdx < parts.length) {
219
+ oldStatus = parts[statusColIdx] ? parts[statusColIdx].trim() : 'unknown';
220
+ parts[statusColIdx] = ` ${newStatus} `;
221
+ lines[rowIdx] = parts.join('|');
222
+ } else {
223
+ // Fallback: assume 3-col table (v9+ format), Status at raw index 3
224
+ oldStatus = parts[3] ? parts[3].trim() : 'unknown';
225
+ lines[rowIdx] = updateTableRow(lines[rowIdx], 2, newStatus);
226
+ }
227
+ return lines.join(lineEnding);
228
+ });
229
+
230
+ if (!oldStatus) {
231
+ return { success: false, error: `Phase ${phaseNum} not found in ROADMAP.md table` };
232
+ }
233
+
234
+ // Advisory transition validation -- warn on suspicious transitions but don't block
235
+ const transition = validateStatusTransition(oldStatus, newStatus);
236
+ if (!transition.valid && transition.warning) {
237
+ process.stderr.write(`[pbr-tools] WARNING: ${transition.warning}\n`);
238
+ }
239
+
240
+ if (result.success) {
241
+ const response = { success: true, old_status: oldStatus, new_status: newStatus };
242
+ if (!transition.valid) {
243
+ response.transition_warning = transition.warning;
244
+ }
245
+ return response;
246
+ }
247
+ return { success: false, error: result.error };
248
+ }
249
+
250
+ /**
251
+ * Update the Plans column for a phase in ROADMAP.md's Phase Overview table.
252
+ *
253
+ * @param {string} phaseNum - Phase number
254
+ * @param {string} complete - Completed plan count
255
+ * @param {string} total - Total plan count
256
+ * @param {string} [planningDir] - Path to .planning directory
257
+ */
258
+ async function roadmapUpdatePlans(phaseNum, complete, total, planningDir) {
259
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
260
+ const roadmapPath = path.join(dir, 'ROADMAP.md');
261
+ if (!fs.existsSync(roadmapPath)) {
262
+ return { success: false, error: 'ROADMAP.md not found' };
263
+ }
264
+
265
+ let oldPlans = null;
266
+ const newPlans = `${complete}/${total}`;
267
+
268
+ const result = await lockedFileUpdate(roadmapPath, (content) => {
269
+ const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
270
+ const lines = content.replace(/\r\n/g, '\n').split('\n');
271
+ const rowIdx = findRoadmapRow(lines, phaseNum);
272
+ if (rowIdx === -1) {
273
+ return content;
274
+ }
275
+ // Dynamic column detection: find Plans Complete column from nearest header row
276
+ const plansColIdx = _findColumnIndex(lines, rowIdx, /plans?\s*complete/i);
277
+ const parts = lines[rowIdx].split('|');
278
+ if (plansColIdx !== -1 && plansColIdx < parts.length) {
279
+ oldPlans = parts[plansColIdx] ? parts[plansColIdx].trim() : 'unknown';
280
+ parts[plansColIdx] = ` ${newPlans} `;
281
+ lines[rowIdx] = parts.join('|');
282
+ } else {
283
+ // Fallback: assume 3-col table (v9+ format), Plans Complete at raw index 2
284
+ oldPlans = parts[2] ? parts[2].trim() : 'unknown';
285
+ lines[rowIdx] = updateTableRow(lines[rowIdx], 1, newPlans);
286
+ }
287
+ return lines.join(lineEnding);
288
+ });
289
+
290
+ if (!oldPlans) {
291
+ return { success: false, error: `Phase ${phaseNum} not found in ROADMAP.md table` };
292
+ }
293
+
294
+ if (result.success) {
295
+ return { success: true, old_plans: oldPlans, new_plans: newPlans };
296
+ }
297
+ return { success: false, error: result.error };
298
+ }
299
+
300
+ /**
301
+ * Update plan progress for a specific phase in ROADMAP.md.
302
+ * GSD-unique: updates progress table row, plan count in phase section,
303
+ * and checkbox completion status.
304
+ *
305
+ * @param {string} phaseNum - Phase number
306
+ * @param {string} [planningDir] - Path to .planning directory
307
+ */
308
+ async function roadmapUpdatePlanProgress(phaseNum, planningDir) {
309
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
310
+ const roadmapPath = path.join(dir, 'ROADMAP.md');
311
+ if (!fs.existsSync(roadmapPath)) {
312
+ return { success: false, error: 'ROADMAP.md not found' };
313
+ }
314
+
315
+ // Find the phase directory to count plans and summaries
316
+ const phasesDir = path.join(dir, 'phases');
317
+ if (!fs.existsSync(phasesDir)) {
318
+ return { success: false, error: 'No phases directory found' };
319
+ }
320
+
321
+ const paddedPhase = String(phaseNum).padStart(2, '0');
322
+ let phaseDir = null;
323
+ try {
324
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
325
+ for (const entry of entries) {
326
+ if (entry.isDirectory() && entry.name.startsWith(paddedPhase + '-')) {
327
+ phaseDir = path.join(phasesDir, entry.name);
328
+ break;
329
+ }
330
+ }
331
+ } catch (_e) { /* intentionally silent: non-fatal */ }
332
+
333
+ if (!phaseDir) {
334
+ return { success: false, error: `Phase ${phaseNum} directory not found` };
335
+ }
336
+
337
+ const planFiles = findFiles(phaseDir, /PLAN.*\.md$/i);
338
+ const summaryFiles = findFiles(phaseDir, /SUMMARY.*\.md$/i);
339
+ const planCount = planFiles.length;
340
+ const summaryCount = summaryFiles.length;
341
+
342
+ if (planCount === 0) {
343
+ return { success: false, error: 'No plans found', plan_count: 0, summary_count: 0 };
344
+ }
345
+
346
+ const isComplete = summaryCount >= planCount;
347
+ const status = isComplete ? 'Complete' : summaryCount > 0 ? 'In Progress' : 'Planned';
348
+ const today = new Date().toISOString().slice(0, 10);
349
+
350
+ const { escapeRegex } = require('./core');
351
+ const phaseEscaped = escapeRegex(String(phaseNum));
352
+
353
+ const result = await lockedFileUpdate(roadmapPath, (content) => {
354
+ let updated = content;
355
+
356
+ // Progress table row: update Plans column (summaries/plans) and Status column
357
+ const tablePattern = new RegExp(
358
+ `(\\|\\s*${phaseEscaped}\\.?\\s[^|]*\\|)[^|]*(\\|)\\s*[^|]*(\\|)\\s*[^|]*(\\|)`,
359
+ 'i'
360
+ );
361
+ const dateField = isComplete ? ` ${today} ` : ' ';
362
+ updated = updated.replace(
363
+ tablePattern,
364
+ `$1 ${summaryCount}/${planCount} $2 ${status.padEnd(11)}$3${dateField}$4`
365
+ );
366
+
367
+ // Update plan count in phase detail section
368
+ const planCountPattern = new RegExp(
369
+ `(#{2,4}\\s*Phase\\s+${phaseEscaped}[\\s\\S]*?\\*\\*Plans:\\*\\*\\s*)[^\\n]+`,
370
+ 'i'
371
+ );
372
+ const planCountText = isComplete
373
+ ? `${summaryCount}/${planCount} plans complete`
374
+ : `${summaryCount}/${planCount} plans executed`;
375
+ updated = updated.replace(planCountPattern, `$1${planCountText}`);
376
+
377
+ // If complete: check checkbox
378
+ if (isComplete) {
379
+ const checkboxPattern = new RegExp(
380
+ `(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${phaseEscaped}[:\\s][^\\n]*)`,
381
+ 'i'
382
+ );
383
+ updated = updated.replace(checkboxPattern, `$1x$2 (completed ${today})`);
384
+ }
385
+
386
+ return updated;
387
+ });
388
+
389
+ if (result.success) {
390
+ return { success: true, phase: phaseNum, plan_count: planCount, summary_count: summaryCount, status, complete: isComplete };
391
+ }
392
+ return { success: false, error: result.error };
393
+ }
394
+
395
+ // --- Comprehensive analysis ---
396
+
397
+ /**
398
+ * Analyze ROADMAP.md comprehensively, cross-referencing with disk state.
399
+ *
400
+ * Returns a structured object with all phases, their goals, dependencies,
401
+ * progress, disk status, and aggregated statistics.
402
+ *
403
+ * @param {string} planningDir - Path to .planning/ directory
404
+ * @returns {{ phases: Array, current_phase: number|null, next_phase: number|null, stats: object, error?: string }}
405
+ */
406
+ function roadmapAnalyze(planningDir) {
407
+ const roadmapPath = path.join(planningDir, 'ROADMAP.md');
408
+ if (!fs.existsSync(roadmapPath)) {
409
+ return { phases: [], current_phase: null, next_phase: null, stats: _emptyStats(), error: 'ROADMAP.md not found' };
410
+ }
411
+
412
+ // snapshot pattern: single read, parse from memory -- no re-reads during analysis or renumbering
413
+ const content = fs.readFileSync(roadmapPath, 'utf8');
414
+ // Strip <details>/<summary> tags so collapsed milestones are parsed correctly
415
+ const stripped = content.replace(/<\/?details>/gi, '').replace(/<\/?summary>/gi, '');
416
+ const lines = stripped.split(/\r?\n/);
417
+
418
+ // 1. Parse phase headings, goals, dependencies from milestone sections
419
+ const phases = _parsePhaseHeadings(lines);
420
+
421
+ // 2. Parse progress tables and merge
422
+ _mergeProgressTables(lines, phases);
423
+
424
+ // 3. Parse phase checklist items and merge
425
+ _mergePhaseChecklist(lines, phases);
426
+
427
+ // 4. Cross-reference with disk
428
+ const phasesDir = path.join(planningDir, 'phases');
429
+ for (const phase of phases) {
430
+ _crossReferenceDisk(phase, phasesDir);
431
+ }
432
+
433
+ // 5. Get current_phase from STATE.md
434
+ let current_phase = null;
435
+ const statePath = path.join(planningDir, 'STATE.md');
436
+ if (fs.existsSync(statePath)) {
437
+ try {
438
+ const stateContent = fs.readFileSync(statePath, 'utf8');
439
+ const fm = parseYamlFrontmatter(stateContent);
440
+ if (fm && fm.current_phase != null) {
441
+ current_phase = typeof fm.current_phase === 'number' ? fm.current_phase : parseInt(fm.current_phase, 10);
442
+ if (isNaN(current_phase)) current_phase = null;
443
+ }
444
+ } catch (_e) { /* intentionally silent: non-fatal */ }
445
+ }
446
+
447
+ // 6. Derive next_phase
448
+ let next_phase = null;
449
+ if (current_phase != null) {
450
+ // Find phases after current that are not complete
451
+ const remaining = phases
452
+ .filter(p => p.number > current_phase && p.disk_status !== 'complete')
453
+ .sort((a, b) => a.number - b.number);
454
+ if (remaining.length > 0) {
455
+ next_phase = remaining[0].number;
456
+ }
457
+ }
458
+
459
+ // 7. Compute stats
460
+ const stats = _computeStats(phases);
461
+
462
+ return { phases, current_phase, next_phase, stats };
463
+ }
464
+
465
+ function _emptyStats() {
466
+ return {
467
+ total_phases: 0,
468
+ total_plans: 0,
469
+ total_summaries: 0,
470
+ progress_percent: 0,
471
+ phases_complete: 0,
472
+ phases_remaining: 0
473
+ };
474
+ }
475
+
476
+ /**
477
+ * Parse `### Phase N:` headings within milestone `## Milestone:` sections.
478
+ */
479
+ function _parsePhaseHeadings(lines) {
480
+ const phases = [];
481
+ const phaseMap = new Map();
482
+ let currentMilestone = null;
483
+
484
+ // Strip <details>/<summary> HTML tags from lines so collapsed milestones are parsed
485
+ const cleanLines = lines.map(l => l.replace(/<\/?details>/gi, '').replace(/<\/?summary>/gi, ''));
486
+
487
+ for (let i = 0; i < cleanLines.length; i++) {
488
+ const line = cleanLines[i];
489
+
490
+ // Detect milestone heading: ## Milestone: ... or ## Milestone N: ...
491
+ const milestoneMatch = line.match(/^##\s+Milestone[:\s]+(.*)/i);
492
+ if (milestoneMatch) {
493
+ currentMilestone = milestoneMatch[1].trim();
494
+ continue;
495
+ }
496
+
497
+ // Detect phase heading: ### Phase N: Name or ### Phase NN: Name
498
+ const phaseMatch = line.match(/^###\s+Phase\s+(\d+)\s*:\s*(.*)/i);
499
+ if (phaseMatch) {
500
+ const phaseNum = parseInt(phaseMatch[1], 10);
501
+ const phaseName = phaseMatch[2].trim();
502
+
503
+ // Look ahead for **Goal:**, **Depends on:**, **Requirements:**, **Success Criteria:**
504
+ let goal = '';
505
+ let depends_on = [];
506
+ let requirements = '';
507
+ let success_criteria = '';
508
+ for (let j = i + 1; j < Math.min(i + 20, cleanLines.length); j++) {
509
+ const ahead = cleanLines[j];
510
+ // Stop at next heading
511
+ if (/^#{1,3}\s/.test(ahead)) break;
512
+
513
+ const goalMatch = ahead.match(/\*\*Goal:\*\*\s*(.*)/i);
514
+ if (goalMatch) {
515
+ goal = goalMatch[1].trim();
516
+ }
517
+
518
+ const depsMatch = ahead.match(/\*\*Depends?\s*on:\*\*\s*(.*)/i);
519
+ if (depsMatch) {
520
+ const depsStr = depsMatch[1].trim();
521
+ if (depsStr && depsStr !== 'None' && depsStr !== '-' && depsStr !== 'none') {
522
+ depends_on = depsStr.split(/[,;]/)
523
+ .map(s => s.replace(/[^0-9]/g, ''))
524
+ .filter(Boolean)
525
+ .map(Number);
526
+ }
527
+ }
528
+
529
+ const reqMatch = ahead.match(/\*\*Requirements:\*\*\s*(.*)/i);
530
+ if (reqMatch) {
531
+ requirements = reqMatch[1].trim();
532
+ }
533
+
534
+ const critMatch = ahead.match(/\*\*Success Criteria:\*\*\s*(.*)/i);
535
+ if (critMatch) {
536
+ success_criteria = critMatch[1].trim();
537
+ }
538
+ }
539
+
540
+ const entry = {
541
+ number: phaseNum,
542
+ name: phaseName,
543
+ goal,
544
+ depends_on,
545
+ requirements,
546
+ success_criteria,
547
+ milestone: currentMilestone || 'Unknown',
548
+ progress: null,
549
+ checklist_checked: null,
550
+ plan_count: 0,
551
+ summary_count: 0,
552
+ has_verification: false,
553
+ verification_result: null,
554
+ disk_status: 'no_directory'
555
+ };
556
+
557
+ phases.push(entry);
558
+ phaseMap.set(phaseNum, entry);
559
+ continue;
560
+ }
561
+ }
562
+
563
+ return phases;
564
+ }
565
+
566
+ /**
567
+ * Parse Progress tables: `| N. Phase Name | X/Y | Status |`
568
+ */
569
+ function _mergeProgressTables(lines, phases) {
570
+ const phaseMap = new Map(phases.map(p => [p.number, p]));
571
+ let inProgressSection = false;
572
+ let progressColIdx = { phase: 0, plans: 1 };
573
+
574
+ // Strip <details>/<summary> tags from lines for parsing
575
+ const cleanLines = lines.map(l => l.replace(/<\/?details>/gi, '').replace(/<\/?summary>/gi, ''));
576
+
577
+ for (const line of cleanLines) {
578
+ if (/^##\s+Progress/i.test(line)) {
579
+ inProgressSection = true;
580
+ continue;
581
+ }
582
+ if (inProgressSection && /^##\s/.test(line) && !/^##\s+Progress/i.test(line)) {
583
+ inProgressSection = false;
584
+ continue;
585
+ }
586
+
587
+ if (inProgressSection && line.includes('|')) {
588
+ const cols = line.split('|').map(c => c.trim()).filter(Boolean);
589
+
590
+ // Detect header row and extract column positions
591
+ if (/Plans?\s*Complete/i.test(line)) {
592
+ const lowerCols = cols.map(c => c.toLowerCase());
593
+ const pIdx = lowerCols.findIndex(c => /phase/i.test(c));
594
+ const plIdx = lowerCols.findIndex(c => /plans?\s*complete/i.test(c));
595
+ if (pIdx !== -1) progressColIdx.phase = pIdx;
596
+ if (plIdx !== -1) progressColIdx.plans = plIdx;
597
+ continue;
598
+ }
599
+
600
+ // Skip separator rows
601
+ if (/^[\s-:|]+$/.test(cols.join(''))) continue;
602
+
603
+ if (cols.length >= 2) {
604
+ const phaseCol = cols[progressColIdx.phase] || cols[0];
605
+ const numMatch = phaseCol.match(/^(\d+)/);
606
+ if (numMatch) {
607
+ const phaseNum = parseInt(numMatch[1], 10);
608
+ const phase = phaseMap.get(phaseNum);
609
+ if (phase) {
610
+ const plansCol = progressColIdx.plans < cols.length ? cols[progressColIdx.plans] : cols[1];
611
+ const progressMatch = plansCol.match(/(\d+)\s*\/\s*(\d+)/);
612
+ if (progressMatch) {
613
+ phase.progress = `${progressMatch[1]}/${progressMatch[2]}`;
614
+ }
615
+ }
616
+ }
617
+ }
618
+ }
619
+ }
620
+ }
621
+
622
+ /**
623
+ * Parse Phase Checklist items: `- [ ] Phase N:` or `- [x] Phase N:`
624
+ */
625
+ function _mergePhaseChecklist(lines, phases) {
626
+ const phaseMap = new Map(phases.map(p => [p.number, p]));
627
+
628
+ for (const line of lines) {
629
+ const checkMatch = line.match(/^-\s+\[([ xX])\]\s+Phase\s+(\d+)/i);
630
+ if (checkMatch) {
631
+ const checked = checkMatch[1].toLowerCase() === 'x';
632
+ const phaseNum = parseInt(checkMatch[2], 10);
633
+ const phase = phaseMap.get(phaseNum);
634
+ if (phase) {
635
+ phase.checklist_checked = checked;
636
+ }
637
+ }
638
+ }
639
+ }
640
+
641
+ /**
642
+ * Cross-reference a phase entry against files on disk.
643
+ */
644
+ function _crossReferenceDisk(phase, phasesDir) {
645
+ if (!fs.existsSync(phasesDir)) {
646
+ phase.disk_status = 'no_directory';
647
+ return;
648
+ }
649
+
650
+ // Find matching directory by phase number prefix
651
+ const paddedNum = String(phase.number).padStart(2, '0');
652
+ let phaseDir = null;
653
+ try {
654
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
655
+ for (const entry of entries) {
656
+ if (entry.isDirectory() && entry.name.startsWith(paddedNum + '-')) {
657
+ phaseDir = path.join(phasesDir, entry.name);
658
+ break;
659
+ }
660
+ }
661
+ } catch (_e) { /* intentionally silent: non-fatal */ }
662
+
663
+ if (!phaseDir) {
664
+ phase.disk_status = 'no_directory';
665
+ return;
666
+ }
667
+
668
+ // Count PLANs and SUMMARYs
669
+ const plans = findFiles(phaseDir, /^PLAN.*\.md$/i);
670
+ const summaries = findFiles(phaseDir, /^SUMMARY.*\.md$/i);
671
+ phase.plan_count = plans.length;
672
+ phase.summary_count = summaries.length;
673
+
674
+ // Check VERIFICATION.md
675
+ const verificationPath = path.join(phaseDir, 'VERIFICATION.md');
676
+ if (fs.existsSync(verificationPath)) {
677
+ phase.has_verification = true;
678
+ try {
679
+ const vContent = fs.readFileSync(verificationPath, 'utf8');
680
+ const fm = parseYamlFrontmatter(vContent);
681
+ if (fm && fm.result) {
682
+ phase.verification_result = fm.result;
683
+ }
684
+ } catch (_e) { /* intentionally silent: non-fatal */ }
685
+ }
686
+
687
+ // Determine disk_status
688
+ if (phase.has_verification && phase.verification_result === 'passed') {
689
+ phase.disk_status = 'complete';
690
+ } else if (phase.summary_count > 0) {
691
+ phase.disk_status = 'partial';
692
+ } else if (phase.plan_count > 0) {
693
+ phase.disk_status = 'planned';
694
+ } else {
695
+ phase.disk_status = 'empty';
696
+ }
697
+ }
698
+
699
+ /**
700
+ * Compute aggregated stats from phase data.
701
+ */
702
+ function _computeStats(phases) {
703
+ let total_plans = 0;
704
+ let total_summaries = 0;
705
+ let phases_complete = 0;
706
+
707
+ for (const phase of phases) {
708
+ total_plans += phase.plan_count;
709
+ total_summaries += phase.summary_count;
710
+ if (phase.disk_status === 'complete') {
711
+ phases_complete++;
712
+ }
713
+ }
714
+
715
+ const total_phases = phases.length;
716
+ const phases_remaining = total_phases - phases_complete;
717
+ const progress_percent = total_phases > 0 ? Math.round((phases_complete / total_phases) * 100) : 0;
718
+
719
+ return {
720
+ total_phases,
721
+ total_plans,
722
+ total_summaries,
723
+ progress_percent,
724
+ phases_complete,
725
+ phases_remaining
726
+ };
727
+ }
728
+
729
+ // --- Dynamic phase operations ---
730
+
731
+ /**
732
+ * Append a new phase heading + progress row to the current (non-COMPLETED) milestone section.
733
+ *
734
+ * @param {string} planningDir - Path to .planning/ directory
735
+ * @param {number} phaseNum - Phase number to add
736
+ * @param {string} name - Human-readable phase name
737
+ * @param {string} [goal] - Goal description
738
+ * @param {number|null} [dependsOn] - Phase number this depends on
739
+ * @returns {{ success: boolean, error?: string }}
740
+ */
741
+ async function roadmapAppendPhase(planningDir, phaseNum, name, goal, dependsOn) {
742
+ const roadmapPath = path.join(planningDir, 'ROADMAP.md');
743
+ if (!fs.existsSync(roadmapPath)) {
744
+ return { success: false, error: 'ROADMAP.md not found' };
745
+ }
746
+
747
+ return await lockedFileUpdate(roadmapPath, (content) => {
748
+ const lines = content.split(/\r?\n/);
749
+ const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
750
+
751
+ // Find the last milestone section that is NOT completed
752
+ let lastMilestoneIdx = -1;
753
+ for (let i = 0; i < lines.length; i++) {
754
+ if (/^##\s+Milestone/i.test(lines[i]) && !/COMPLETED/i.test(lines[i])) {
755
+ lastMilestoneIdx = i;
756
+ }
757
+ }
758
+
759
+ // Build the phase heading block
760
+ const block = [];
761
+ block.push(`### Phase ${phaseNum}: ${name}`);
762
+ if (goal) block.push(`**Goal:** ${goal}`);
763
+ const depText = dependsOn ? `Phase ${dependsOn}` : 'None';
764
+ block.push(`**Depends on:** ${depText}`);
765
+ block.push('');
766
+
767
+ // Find where to insert the phase heading: before the next ## heading after the milestone
768
+ let insertIdx = lines.length;
769
+ if (lastMilestoneIdx !== -1) {
770
+ for (let i = lastMilestoneIdx + 1; i < lines.length; i++) {
771
+ if (/^##\s+[^#]/.test(lines[i])) {
772
+ insertIdx = i;
773
+ break;
774
+ }
775
+ }
776
+ }
777
+
778
+ // Insert the phase heading block
779
+ lines.splice(insertIdx, 0, ...block);
780
+
781
+ // Find and update Progress table: append a row
782
+ // Detect if existing table has Milestone column
783
+ let hasMilestoneCol = false;
784
+ let hasCompletedCol = false;
785
+ for (let i = 0; i < lines.length; i++) {
786
+ if (lines[i].includes('|') && /Plans?\s*Complete/i.test(lines[i])) {
787
+ hasMilestoneCol = /milestone/i.test(lines[i]);
788
+ hasCompletedCol = /completed/i.test(lines[i]);
789
+ break;
790
+ }
791
+ }
792
+ let progressRowLine = `| ${phaseNum}. ${name} |`;
793
+ if (hasMilestoneCol) progressRowLine += ' |';
794
+ progressRowLine += ' 0/0 | Pending |';
795
+ if (hasCompletedCol) progressRowLine += ' |';
796
+
797
+ let progressTableEnd = -1;
798
+ let inProgressSection = false;
799
+ for (let i = 0; i < lines.length; i++) {
800
+ if (/^##\s+Progress/i.test(lines[i])) {
801
+ inProgressSection = true;
802
+ continue;
803
+ }
804
+ if (inProgressSection) {
805
+ if (/^##\s/.test(lines[i]) && !/^##\s+Progress/i.test(lines[i])) {
806
+ progressTableEnd = i;
807
+ break;
808
+ }
809
+ // Track last table row
810
+ if (lines[i].includes('|')) {
811
+ progressTableEnd = i + 1;
812
+ }
813
+ }
814
+ }
815
+
816
+ if (progressTableEnd > 0) {
817
+ lines.splice(progressTableEnd, 0, progressRowLine);
818
+ }
819
+
820
+ return lines.join(lineEnding);
821
+ });
822
+ }
823
+
824
+ /**
825
+ * Remove a phase heading block and its progress table row from ROADMAP.md.
826
+ *
827
+ * @param {string} planningDir - Path to .planning/ directory
828
+ * @param {number} phaseNum - Phase number to remove
829
+ * @returns {{ success: boolean, error?: string }}
830
+ */
831
+ async function roadmapRemovePhase(planningDir, phaseNum) {
832
+ const roadmapPath = path.join(planningDir, 'ROADMAP.md');
833
+ if (!fs.existsSync(roadmapPath)) {
834
+ return { success: false, error: 'ROADMAP.md not found' };
835
+ }
836
+
837
+ return await lockedFileUpdate(roadmapPath, (content) => {
838
+ const lines = content.split(/\r?\n/);
839
+ const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
840
+
841
+ // Find and remove the ### Phase N: heading and its content block
842
+ let headingIdx = -1;
843
+ let blockEnd = -1;
844
+ for (let i = 0; i < lines.length; i++) {
845
+ const match = lines[i].match(/^###\s+Phase\s+(\d+)\s*:/i);
846
+ if (match && parseInt(match[1], 10) === phaseNum) {
847
+ headingIdx = i;
848
+ // Find end of this block (next ### or ## heading)
849
+ for (let j = i + 1; j < lines.length; j++) {
850
+ if (/^#{1,3}\s/.test(lines[j])) {
851
+ blockEnd = j;
852
+ break;
853
+ }
854
+ }
855
+ if (blockEnd === -1) blockEnd = lines.length;
856
+ break;
857
+ }
858
+ }
859
+
860
+ if (headingIdx !== -1) {
861
+ lines.splice(headingIdx, blockEnd - headingIdx);
862
+ }
863
+
864
+ // Remove progress table row matching "| N. " pattern
865
+ for (let i = lines.length - 1; i >= 0; i--) {
866
+ const rowMatch = lines[i].match(/^\|\s*(\d+)\./);
867
+ if (rowMatch && parseInt(rowMatch[1], 10) === phaseNum) {
868
+ lines.splice(i, 1);
869
+ break;
870
+ }
871
+ }
872
+
873
+ return lines.join(lineEnding);
874
+ });
875
+ }
876
+
877
+ /**
878
+ * Renumber all phase references >= startNum by delta in ROADMAP.md.
879
+ * Handles: ### Phase N: headings, "Phase N" in text, progress table rows "| N.",
880
+ * checklist items "Phase N:".
881
+ *
882
+ * Iterates in reverse when delta > 0 (to avoid collisions), forward when delta < 0.
883
+ *
884
+ * @param {string} planningDir - Path to .planning/ directory
885
+ * @param {number} startNum - Renumber phases with number >= this
886
+ * @param {number} delta - Amount to shift (+1 for insert, -1 for remove)
887
+ * @returns {{ success: boolean, error?: string }}
888
+ */
889
+ async function roadmapRenumberPhases(planningDir, startNum, delta) {
890
+ const roadmapPath = path.join(planningDir, 'ROADMAP.md');
891
+ if (!fs.existsSync(roadmapPath)) {
892
+ return { success: false, error: 'ROADMAP.md not found' };
893
+ }
894
+
895
+ return await lockedFileUpdate(roadmapPath, (content) => {
896
+ const lines = content.split(/\r?\n/);
897
+ const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
898
+
899
+ // Collect all phase numbers that need renumbering, process in correct order
900
+ const nums = [];
901
+ for (let i = 0; i < lines.length; i++) {
902
+ const headingMatch = lines[i].match(/^###\s+Phase\s+(\d+)\s*:/i);
903
+ if (headingMatch) {
904
+ const n = parseInt(headingMatch[1], 10);
905
+ if (n >= startNum && !nums.includes(n)) nums.push(n);
906
+ }
907
+ const rowMatch = lines[i].match(/^\|\s*(\d+)\./);
908
+ if (rowMatch) {
909
+ const n = parseInt(rowMatch[1], 10);
910
+ if (n >= startNum && !nums.includes(n)) nums.push(n);
911
+ }
912
+ }
913
+
914
+ // Sort: reverse for delta > 0 (avoid collisions), forward for delta < 0
915
+ if (delta > 0) {
916
+ nums.sort((a, b) => b - a);
917
+ } else {
918
+ nums.sort((a, b) => a - b);
919
+ }
920
+
921
+ for (const num of nums) {
922
+ const newNum = num + delta;
923
+ for (let i = 0; i < lines.length; i++) {
924
+ // ### Phase N: heading
925
+ const headingRegex = new RegExp(`^(###\\s+Phase\\s+)${num}(\\s*:.*)`, 'i');
926
+ if (headingRegex.test(lines[i])) {
927
+ lines[i] = lines[i].replace(headingRegex, `$1${newNum}$2`);
928
+ }
929
+ // Progress table row: | N. Name |
930
+ const rowRegex = new RegExp(`^(\\|\\s*)${num}(\\.)`);
931
+ if (rowRegex.test(lines[i])) {
932
+ lines[i] = lines[i].replace(rowRegex, `$1${newNum}$2`);
933
+ }
934
+ // Checklist: - [ ] Phase N: or - [x] Phase N:
935
+ const checkRegex = new RegExp(`^(\\s*-\\s+\\[[ xX]\\]\\s+Phase\\s+)${num}(\\s*[:])`, 'i');
936
+ if (checkRegex.test(lines[i])) {
937
+ lines[i] = lines[i].replace(checkRegex, `$1${newNum}$2`);
938
+ }
939
+ // Dependency text: "Phase N" (but not in headings already handled)
940
+ if (!/^###/.test(lines[i]) && !/^\|/.test(lines[i])) {
941
+ const depRegex = new RegExp(`(Phase\\s+)${num}(?=\\b)`, 'gi');
942
+ lines[i] = lines[i].replace(depRegex, `$1${newNum}`);
943
+ }
944
+ }
945
+ }
946
+
947
+ return lines.join(lineEnding);
948
+ });
949
+ }
950
+
951
+ /**
952
+ * Insert a phase heading at a specific position in ROADMAP.md (before the next phase).
953
+ * Unlike roadmapAppendPhase which appends at end, this inserts at the right position.
954
+ *
955
+ * @param {string} planningDir - Path to .planning/ directory
956
+ * @param {number} position - Position number for the new phase
957
+ * @param {string} name - Phase name
958
+ * @param {string} [goal] - Goal description
959
+ * @param {number|null} [dependsOn] - Dependency phase number
960
+ * @returns {{ success: boolean, error?: string }}
961
+ */
962
+ async function roadmapInsertPhase(planningDir, position, name, goal, dependsOn) {
963
+ const roadmapPath = path.join(planningDir, 'ROADMAP.md');
964
+ if (!fs.existsSync(roadmapPath)) {
965
+ return { success: false, error: 'ROADMAP.md not found' };
966
+ }
967
+
968
+ return await lockedFileUpdate(roadmapPath, (content) => {
969
+ const lines = content.split(/\r?\n/);
970
+ const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
971
+
972
+ // Build the phase heading block
973
+ const block = [];
974
+ block.push(`### Phase ${position}: ${name}`);
975
+ if (goal) block.push(`**Goal:** ${goal}`);
976
+ const depText = dependsOn ? `Phase ${dependsOn}` : 'None';
977
+ block.push(`**Depends on:** ${depText}`);
978
+ block.push('');
979
+
980
+ // Find where to insert: before the phase heading that now has number position+1
981
+ // (since renumbering already happened)
982
+ let insertIdx = -1;
983
+ for (let i = 0; i < lines.length; i++) {
984
+ const match = lines[i].match(/^###\s+Phase\s+(\d+)\s*:/i);
985
+ if (match && parseInt(match[1], 10) === position + 1) {
986
+ insertIdx = i;
987
+ break;
988
+ }
989
+ }
990
+
991
+ if (insertIdx === -1) {
992
+ // No phase after this position found; append at end of last milestone section
993
+ let lastMilestoneEnd = lines.length;
994
+ for (let i = 0; i < lines.length; i++) {
995
+ if (/^##\s+Milestone/i.test(lines[i]) && !/COMPLETED/i.test(lines[i])) {
996
+ // Find end of this milestone section
997
+ for (let j = i + 1; j < lines.length; j++) {
998
+ if (/^##\s+[^#]/.test(lines[j])) {
999
+ lastMilestoneEnd = j;
1000
+ break;
1001
+ }
1002
+ }
1003
+ }
1004
+ }
1005
+ insertIdx = lastMilestoneEnd;
1006
+ }
1007
+
1008
+ lines.splice(insertIdx, 0, ...block);
1009
+
1010
+ // Insert progress table row at the right position — detect Milestone/Completed columns
1011
+ let _hasMilestoneCol = false;
1012
+ let _hasCompletedCol = false;
1013
+ for (let i = 0; i < lines.length; i++) {
1014
+ if (lines[i].includes('|') && /Plans?\s*Complete/i.test(lines[i])) {
1015
+ _hasMilestoneCol = /milestone/i.test(lines[i]);
1016
+ _hasCompletedCol = /completed/i.test(lines[i]);
1017
+ break;
1018
+ }
1019
+ }
1020
+ let progressRow = `| ${position}. ${name} |`;
1021
+ if (_hasMilestoneCol) progressRow += ' |';
1022
+ progressRow += ' 0/0 | Pending |';
1023
+ if (_hasCompletedCol) progressRow += ' |';
1024
+ let progressInsertIdx = -1;
1025
+ let inProgressSection = false;
1026
+ for (let i = 0; i < lines.length; i++) {
1027
+ if (/^##\s+Progress/i.test(lines[i])) {
1028
+ inProgressSection = true;
1029
+ continue;
1030
+ }
1031
+ if (inProgressSection) {
1032
+ if (/^##\s/.test(lines[i]) && !/^##\s+Progress/i.test(lines[i])) {
1033
+ // End of progress section, insert here if we haven't found a spot
1034
+ if (progressInsertIdx === -1) progressInsertIdx = i;
1035
+ break;
1036
+ }
1037
+ // Find the row for position+1 (the phase that was just shifted)
1038
+ const rowMatch = lines[i].match(/^\|\s*(\d+)\./);
1039
+ if (rowMatch) {
1040
+ const rowNum = parseInt(rowMatch[1], 10);
1041
+ if (rowNum === position + 1 && progressInsertIdx === -1) {
1042
+ progressInsertIdx = i;
1043
+ }
1044
+ }
1045
+ }
1046
+ }
1047
+
1048
+ if (progressInsertIdx > 0) {
1049
+ lines.splice(progressInsertIdx, 0, progressRow);
1050
+ }
1051
+
1052
+ return lines.join(lineEnding);
1053
+ });
1054
+ }
1055
+
1056
+ /**
1057
+ * Get a single phase entry from ROADMAP.md by number.
1058
+ *
1059
+ * @param {string} phaseNum - Phase number
1060
+ * @param {string} [planningDir] - Path to .planning directory
1061
+ * @returns {object|null} Phase entry or null
1062
+ */
1063
+ function roadmapGetPhase(phaseNum, planningDir) {
1064
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
1065
+ const roadmapPath = path.join(dir, 'ROADMAP.md');
1066
+ if (!fs.existsSync(roadmapPath)) {
1067
+ return null;
1068
+ }
1069
+
1070
+ const content = fs.readFileSync(roadmapPath, 'utf8');
1071
+ const parsed = parseRoadmapMd(content);
1072
+ const paddedPhase = String(phaseNum).padStart(2, '0');
1073
+ return parsed.phases.find(p => p.number === paddedPhase) || null;
1074
+ }
1075
+
1076
+ module.exports = {
1077
+ parseRoadmapMd,
1078
+ findRoadmapRow,
1079
+ updateTableRow,
1080
+ roadmapUpdateStatus,
1081
+ roadmapUpdatePlans,
1082
+ roadmapUpdatePlanProgress,
1083
+ roadmapAnalyze,
1084
+ roadmapAppendPhase,
1085
+ roadmapRemovePhase,
1086
+ roadmapRenumberPhases,
1087
+ roadmapInsertPhase,
1088
+ roadmapGetPhase
1089
+ };