@sienklogic/plan-build-run 2.21.1 → 2.21.2

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