@sienklogic/plan-build-run 2.18.1 → 2.19.1

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