@sienklogic/plan-build-run 2.21.1 → 2.21.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (982) hide show
  1. package/CHANGELOG.md +1331 -323
  2. package/CLAUDE.md +75 -40
  3. package/LICENSE +2 -1
  4. package/README.md +412 -177
  5. package/bin/install.js +2752 -0
  6. package/dashboard/bin/cli.cjs +96 -0
  7. package/dashboard/bin/stop.cjs +129 -0
  8. package/dashboard/eslint.config.js +37 -0
  9. package/dashboard/index.html +20 -0
  10. package/dashboard/package.json +27 -25
  11. package/dashboard/server/index.js +151 -0
  12. package/dashboard/server/lib/frontmatter.js +92 -0
  13. package/dashboard/server/middleware/static.js +35 -0
  14. package/dashboard/server/package.json +16 -0
  15. package/dashboard/server/routes/agents.js +234 -0
  16. package/dashboard/server/routes/config.js +64 -0
  17. package/dashboard/server/routes/health.js +98 -0
  18. package/dashboard/server/routes/incidents.js +78 -0
  19. package/dashboard/server/routes/intel.js +69 -0
  20. package/dashboard/server/routes/memory.js +107 -0
  21. package/dashboard/server/routes/planning.js +234 -0
  22. package/dashboard/server/routes/progress.js +77 -0
  23. package/dashboard/server/routes/projects.js +36 -0
  24. package/dashboard/server/routes/requirements.js +40 -0
  25. package/dashboard/server/routes/roadmap.js +69 -0
  26. package/dashboard/server/routes/sessions.js +70 -0
  27. package/dashboard/server/routes/status.js +25 -0
  28. package/dashboard/server/routes/telemetry.js +233 -0
  29. package/dashboard/server/services/file-watcher.js +105 -0
  30. package/dashboard/server/services/planning-reader.js +727 -0
  31. package/dashboard/server/test/cli.test.js +34 -0
  32. package/dashboard/server/test/frontmatter.test.js +104 -0
  33. package/dashboard/server/test/isolation.test.js +32 -0
  34. package/dashboard/server/test/planning-reader.test.js +151 -0
  35. package/dashboard/server/test/routes.test.js +91 -0
  36. package/dashboard/server/test/ws.test.js +81 -0
  37. package/dashboard/server/ws.js +96 -0
  38. package/dashboard/src/App.jsx +165 -0
  39. package/dashboard/src/components/charts/BudgetBars.jsx +42 -0
  40. package/dashboard/src/components/charts/ContextRadar.jsx +34 -0
  41. package/dashboard/src/components/charts/PhaseDonut.jsx +66 -0
  42. package/dashboard/src/components/charts/SuccessTrend.jsx +45 -0
  43. package/dashboard/src/components/charts/TokenChart.jsx +55 -0
  44. package/dashboard/src/components/charts/index.js +5 -0
  45. package/dashboard/src/components/config/CfgSection.jsx +93 -0
  46. package/dashboard/src/components/layout/Header.jsx +89 -0
  47. package/dashboard/src/components/layout/ProjectSwitcher.jsx +160 -0
  48. package/dashboard/src/components/layout/Sidebar.jsx +161 -0
  49. package/dashboard/src/components/ui/AutoModeBanner.jsx +138 -0
  50. package/dashboard/src/components/ui/BackButton.jsx +27 -0
  51. package/dashboard/src/components/ui/Badge.jsx +27 -0
  52. package/dashboard/src/components/ui/Card.jsx +23 -0
  53. package/dashboard/src/components/ui/ChartTooltip.jsx +48 -0
  54. package/dashboard/src/components/ui/CheckpointBox.jsx +110 -0
  55. package/dashboard/src/components/ui/CodeBlock.jsx +27 -0
  56. package/dashboard/src/components/ui/ConfidenceBadge.jsx +20 -0
  57. package/dashboard/src/components/ui/ConfirmModal.jsx +161 -0
  58. package/dashboard/src/components/ui/ConnectionBanner.jsx +60 -0
  59. package/dashboard/src/components/ui/ErrorBoundary.jsx +106 -0
  60. package/dashboard/src/components/ui/ErrorBox.jsx +107 -0
  61. package/dashboard/src/components/ui/KeyValue.jsx +33 -0
  62. package/dashboard/src/components/ui/LoadingSkeleton.jsx +84 -0
  63. package/dashboard/src/components/ui/MetricCard.jsx +58 -0
  64. package/dashboard/src/components/ui/NextUpBlock.jsx +92 -0
  65. package/dashboard/src/components/ui/NumberInput.jsx +44 -0
  66. package/dashboard/src/components/ui/PBRBanner.jsx +47 -0
  67. package/dashboard/src/components/ui/PipelineView.jsx +130 -0
  68. package/dashboard/src/components/ui/ProgressBar.jsx +28 -0
  69. package/dashboard/src/components/ui/ProgressDisplay.jsx +47 -0
  70. package/dashboard/src/components/ui/QualityGateBadge.jsx +15 -0
  71. package/dashboard/src/components/ui/SectionTitle.jsx +35 -0
  72. package/dashboard/src/components/ui/SelectInput.jsx +45 -0
  73. package/dashboard/src/components/ui/StatusDot.jsx +51 -0
  74. package/dashboard/src/components/ui/StatusSymbol.jsx +49 -0
  75. package/dashboard/src/components/ui/TabBar.jsx +41 -0
  76. package/dashboard/src/components/ui/TextInput.jsx +42 -0
  77. package/dashboard/src/components/ui/Toast.jsx +117 -0
  78. package/dashboard/src/components/ui/Toggle.jsx +70 -0
  79. package/dashboard/src/components/ui/index.js +29 -0
  80. package/dashboard/src/hooks/useDocumentTitle.js +16 -0
  81. package/dashboard/src/hooks/useFetch.js +50 -0
  82. package/dashboard/src/hooks/useToast.jsx +43 -0
  83. package/dashboard/src/hooks/useWebSocket.js +103 -0
  84. package/dashboard/src/lib/api.js +112 -0
  85. package/dashboard/src/lib/configSchema.js +189 -0
  86. package/dashboard/src/lib/constants.js +22 -0
  87. package/dashboard/src/main.jsx +15 -0
  88. package/dashboard/src/pages/AgentsPage.jsx +191 -0
  89. package/dashboard/src/pages/ConfigPage.jsx +298 -0
  90. package/dashboard/src/pages/HooksPage.jsx +412 -0
  91. package/dashboard/src/pages/IncidentsPage.jsx +135 -0
  92. package/dashboard/src/pages/IntelPage.jsx +193 -0
  93. package/dashboard/src/pages/LiveFeed.jsx +274 -0
  94. package/dashboard/src/pages/MemoryPage.jsx +107 -0
  95. package/dashboard/src/pages/OnboardingPage.jsx +117 -0
  96. package/dashboard/src/pages/Overview.jsx +360 -0
  97. package/dashboard/src/pages/PhaseDetailView.jsx +216 -0
  98. package/dashboard/src/pages/PlanningPage.jsx +181 -0
  99. package/dashboard/src/pages/ProgressPage.jsx +249 -0
  100. package/dashboard/src/pages/ResearchPage.jsx +129 -0
  101. package/dashboard/src/pages/RoadmapPage.jsx +251 -0
  102. package/dashboard/src/pages/SessionsPage.jsx +117 -0
  103. package/dashboard/src/pages/Telemetry.jsx +166 -0
  104. package/dashboard/src/pages/planning/DecisionsTab.jsx +153 -0
  105. package/dashboard/src/pages/planning/FilesTab.jsx +420 -0
  106. package/dashboard/src/pages/planning/MilestoneDetail.jsx +319 -0
  107. package/dashboard/src/pages/planning/MilestonesTab.jsx +151 -0
  108. package/dashboard/src/pages/planning/NotesTab.jsx +251 -0
  109. package/dashboard/src/pages/planning/PhasesTab.jsx +218 -0
  110. package/dashboard/src/pages/planning/QuickTab.jsx +50 -0
  111. package/dashboard/src/pages/planning/ResearchTab.jsx +103 -0
  112. package/dashboard/src/pages/planning/TodosTab.jsx +297 -0
  113. package/dashboard/src/theme/ThemeProvider.jsx +38 -0
  114. package/dashboard/src/theme/tokens.js +17 -0
  115. package/dashboard/tests/components/ConfirmModal.test.jsx +179 -0
  116. package/dashboard/tests/components/ConnectionBanner.test.jsx +37 -0
  117. package/dashboard/tests/components/ErrorBoundary.test.jsx +59 -0
  118. package/dashboard/tests/components/LoadingSkeleton.test.jsx +46 -0
  119. package/dashboard/tests/components/ToastContainer.test.jsx +47 -0
  120. package/dashboard/tests/components/Toggle.test.jsx +61 -0
  121. package/dashboard/tests/hooks/useFetch.test.jsx +77 -0
  122. package/dashboard/tests/hooks/useToast.test.jsx +78 -0
  123. package/dashboard/tests/hooks/useWebSocket.test.jsx +128 -0
  124. package/dashboard/tests/pages/ConfigPage.test.jsx +199 -0
  125. package/dashboard/tests/pages/PlanningPage.test.jsx +119 -0
  126. package/dashboard/tests/pages/planning/FilesTab.test.jsx +198 -0
  127. package/dashboard/tests/pages/planning/NotesTab.test.jsx +178 -0
  128. package/dashboard/tests/pages/planning/TodosTab.test.jsx +188 -0
  129. package/dashboard/tests/performance.test.jsx +46 -0
  130. package/dashboard/tests/routes/config.test.js +98 -0
  131. package/dashboard/tests/routes/health.test.js +40 -0
  132. package/dashboard/tests/routes/planning.test.js +112 -0
  133. package/dashboard/tests/routes/roadmap.test.js +91 -0
  134. package/dashboard/tests/routes/status.test.js +131 -0
  135. package/dashboard/tests/server/planning-reader.test.js +153 -0
  136. package/dashboard/tests/setup.js +7 -0
  137. package/dashboard/vite.config.js +41 -0
  138. package/package.json +56 -41
  139. package/plan-build-run/bin/config-schema.json +1298 -0
  140. package/plugins/pbr/.claude-plugin/plugin.json +1 -1
  141. package/plugins/pbr/CLAUDE.md +19 -0
  142. package/plugins/pbr/UI-CONSISTENCY-GAPS.md +1 -1
  143. package/plugins/pbr/agents/advisor-researcher.md +101 -0
  144. package/plugins/pbr/agents/audit.md +207 -89
  145. package/plugins/pbr/agents/codebase-mapper.md +158 -23
  146. package/plugins/pbr/agents/debugger.md +210 -34
  147. package/plugins/pbr/agents/dev-sync.md +206 -0
  148. package/plugins/pbr/agents/executor.md +734 -38
  149. package/plugins/pbr/agents/general.md +69 -5
  150. package/plugins/pbr/agents/integration-checker.md +147 -31
  151. package/plugins/pbr/agents/intel-updater.md +332 -0
  152. package/plugins/pbr/agents/nyquist-auditor.md +254 -0
  153. package/plugins/pbr/agents/plan-checker.md +268 -65
  154. package/plugins/pbr/agents/planner.md +449 -41
  155. package/plugins/pbr/agents/researcher.md +218 -37
  156. package/plugins/pbr/agents/roadmapper.md +398 -0
  157. package/plugins/pbr/agents/synthesizer.md +166 -25
  158. package/plugins/pbr/agents/ui-checker.md +204 -0
  159. package/plugins/pbr/agents/ui-researcher.md +224 -0
  160. package/plugins/pbr/agents/verifier.md +570 -46
  161. package/plugins/pbr/commands/add-phase.md +75 -0
  162. package/plugins/pbr/commands/add-todo.md +8 -0
  163. package/plugins/pbr/commands/audit-fix.md +5 -0
  164. package/plugins/pbr/commands/audit-milestone.md +8 -0
  165. package/plugins/pbr/commands/autonomous.md +5 -0
  166. package/plugins/pbr/commands/backlog.md +6 -0
  167. package/plugins/pbr/commands/check-todos.md +8 -0
  168. package/plugins/pbr/commands/complete-milestone.md +8 -0
  169. package/plugins/pbr/commands/config.md +1 -1
  170. package/plugins/pbr/commands/discuss-phase.md +6 -0
  171. package/plugins/pbr/commands/execute-phase.md +6 -0
  172. package/plugins/pbr/commands/fast.md +6 -0
  173. package/plugins/pbr/commands/forensics.md +6 -0
  174. package/plugins/pbr/commands/import.md +1 -1
  175. package/plugins/pbr/commands/insert-phase.md +65 -0
  176. package/plugins/pbr/commands/intel.md +5 -0
  177. package/plugins/pbr/commands/join-discord.md +11 -0
  178. package/plugins/pbr/commands/list-phase-assumptions.md +5 -0
  179. package/plugins/pbr/commands/map-codebase.md +6 -0
  180. package/plugins/pbr/commands/milestone-summary.md +6 -0
  181. package/plugins/pbr/commands/new-milestone.md +8 -0
  182. package/plugins/pbr/commands/new-project.md +6 -0
  183. package/plugins/pbr/commands/pause-work.md +5 -0
  184. package/plugins/pbr/commands/plan-milestone-gaps.md +7 -0
  185. package/plugins/pbr/commands/plan-phase.md +6 -0
  186. package/plugins/pbr/commands/plant-seed.md +6 -0
  187. package/plugins/pbr/commands/profile-user.md +5 -0
  188. package/plugins/pbr/commands/profile.md +5 -0
  189. package/plugins/pbr/commands/progress.md +6 -0
  190. package/plugins/pbr/commands/quick.md +1 -1
  191. package/plugins/pbr/commands/reapply-patches.md +47 -0
  192. package/plugins/pbr/commands/release.md +6 -0
  193. package/plugins/pbr/commands/remove-phase.md +66 -0
  194. package/plugins/pbr/commands/research-phase.md +59 -0
  195. package/plugins/pbr/commands/resume-work.md +5 -0
  196. package/plugins/pbr/commands/seed.md +6 -0
  197. package/plugins/pbr/commands/session-report.md +5 -0
  198. package/plugins/pbr/commands/set-profile.md +6 -0
  199. package/plugins/pbr/commands/settings.md +5 -0
  200. package/plugins/pbr/commands/setup.md +1 -1
  201. package/plugins/pbr/commands/ship.md +5 -0
  202. package/plugins/pbr/commands/stats.md +6 -0
  203. package/plugins/pbr/commands/test.md +5 -0
  204. package/plugins/pbr/commands/thread.md +6 -0
  205. package/plugins/pbr/commands/todo.md +1 -1
  206. package/plugins/pbr/commands/ui-phase.md +5 -0
  207. package/plugins/pbr/commands/ui-review.md +5 -0
  208. package/plugins/pbr/commands/undo.md +5 -0
  209. package/plugins/pbr/commands/update.md +37 -0
  210. package/plugins/pbr/commands/validate-phase.md +5 -0
  211. package/plugins/pbr/commands/verify-work.md +6 -0
  212. package/plugins/pbr/dashboard/package-lock.json +6 -0
  213. package/plugins/pbr/dist/architecture-guard.js +76 -0
  214. package/plugins/pbr/dist/audit-dimensions.js +556 -0
  215. package/plugins/pbr/dist/auto-continue.js +277 -0
  216. package/plugins/pbr/dist/block-skill-self-read.js +124 -0
  217. package/plugins/pbr/dist/check-agent-state-write.js +63 -0
  218. package/plugins/pbr/dist/check-config-change.js +213 -0
  219. package/plugins/pbr/dist/check-cross-plugin-sync.js +93 -0
  220. package/plugins/pbr/dist/check-dangerous-commands.js +193 -0
  221. package/plugins/pbr/dist/check-direct-state-write.js +37 -0
  222. package/plugins/pbr/dist/check-doc-sprawl.js +102 -0
  223. package/plugins/pbr/dist/check-phase-boundary.js +191 -0
  224. package/plugins/pbr/dist/check-plan-format.js +227 -0
  225. package/plugins/pbr/dist/check-read-first.js +345 -0
  226. package/plugins/pbr/dist/check-roadmap-sync.js +507 -0
  227. package/plugins/pbr/dist/check-skill-workflow.js +354 -0
  228. package/plugins/pbr/dist/check-state-sync.js +676 -0
  229. package/plugins/pbr/dist/check-subagent-output.js +425 -0
  230. package/plugins/pbr/dist/check-summary-gate.js +188 -0
  231. package/plugins/pbr/dist/context-bridge.js +425 -0
  232. package/plugins/pbr/dist/context-budget-check.js +442 -0
  233. package/plugins/pbr/dist/context-quality.js +271 -0
  234. package/plugins/pbr/dist/enforce-context-budget.js +138 -0
  235. package/plugins/pbr/dist/enforce-pbr-workflow.js +277 -0
  236. package/plugins/pbr/dist/event-handler.js +212 -0
  237. package/plugins/pbr/dist/event-logger.js +125 -0
  238. package/plugins/pbr/dist/feedback-loop.js +155 -0
  239. package/plugins/pbr/dist/graph-update.js +422 -0
  240. package/plugins/pbr/dist/hook-logger.js +114 -0
  241. package/plugins/pbr/dist/hook-server-client.js +361 -0
  242. package/plugins/pbr/dist/hook-server.js +664 -0
  243. package/plugins/pbr/dist/hooks-schema.json +87 -0
  244. package/plugins/pbr/dist/instructions-loaded.js +173 -0
  245. package/plugins/pbr/dist/intercept-plan-mode.js +81 -0
  246. package/plugins/pbr/dist/log-notification.js +131 -0
  247. package/plugins/pbr/dist/log-subagent.js +367 -0
  248. package/plugins/pbr/dist/log-tool-failure.js +140 -0
  249. package/plugins/pbr/dist/milestone-learnings.js +519 -0
  250. package/plugins/pbr/dist/pbr-tools.js +493 -0
  251. package/plugins/pbr/dist/post-bash-triage.js +96 -0
  252. package/plugins/pbr/dist/post-compact.js +135 -0
  253. package/plugins/pbr/dist/post-hoc.js +237 -0
  254. package/plugins/pbr/dist/post-write-dispatch.js +243 -0
  255. package/plugins/pbr/dist/post-write-quality.js +208 -0
  256. package/plugins/pbr/dist/pre-bash-dispatch.js +212 -0
  257. package/plugins/pbr/dist/pre-skill-dispatch.js +114 -0
  258. package/plugins/pbr/dist/pre-task-dispatch.js +269 -0
  259. package/plugins/pbr/dist/pre-write-dispatch.js +234 -0
  260. package/plugins/pbr/dist/progress-tracker.js +173 -0
  261. package/plugins/pbr/dist/prompt-guard.js +114 -0
  262. package/plugins/pbr/dist/prompt-routing.js +209 -0
  263. package/plugins/pbr/dist/quick-status.js +179 -0
  264. package/plugins/pbr/dist/record-incident.js +37 -0
  265. package/plugins/pbr/dist/run-hook.js +132 -0
  266. package/plugins/pbr/dist/session-cleanup.js +653 -0
  267. package/plugins/pbr/dist/session-tracker.js +124 -0
  268. package/plugins/pbr/dist/status-line.js +849 -0
  269. package/plugins/pbr/dist/suggest-compact.js +307 -0
  270. package/plugins/pbr/dist/sync-context-to-claude.js +100 -0
  271. package/plugins/pbr/dist/task-completed.js +206 -0
  272. package/plugins/pbr/dist/track-context-budget.js +432 -0
  273. package/plugins/pbr/dist/track-user-gates.js +88 -0
  274. package/plugins/pbr/dist/trust-tracker.js +193 -0
  275. package/plugins/pbr/dist/validate-commit.js +233 -0
  276. package/plugins/pbr/dist/validate-skill-args.js +222 -0
  277. package/plugins/pbr/dist/validate-task.js +271 -0
  278. package/plugins/pbr/dist/worktree-create.js +144 -0
  279. package/plugins/pbr/dist/worktree-remove.js +147 -0
  280. package/plugins/pbr/hooks/hooks.json +137 -65
  281. package/plugins/pbr/references/agent-contracts.md +39 -8
  282. package/plugins/pbr/references/agent-teams.md +3 -3
  283. package/plugins/pbr/references/archive/checkpoints.md +189 -0
  284. package/plugins/pbr/references/archive/context-quality-tiers.md +45 -0
  285. package/plugins/pbr/references/archive/hook-ordering.md +89 -0
  286. package/plugins/pbr/references/archive/limitations.md +106 -0
  287. package/plugins/pbr/references/archive/pbr-rules.md +194 -0
  288. package/plugins/pbr/references/archive/pbr-tools-cli.md +415 -0
  289. package/plugins/pbr/references/archive/pretooluse-jsonl-behavior.md +58 -0
  290. package/plugins/pbr/references/archive/signal-files.md +41 -0
  291. package/plugins/pbr/references/archive/tmux-setup.md +288 -0
  292. package/plugins/pbr/references/archive/verification-matrix.md +34 -0
  293. package/plugins/pbr/references/archive/verification-patterns.md +277 -0
  294. package/plugins/pbr/references/archive/worktree-sparse-checkout.md +86 -0
  295. package/plugins/pbr/references/assumptions.md +42 -0
  296. package/plugins/pbr/references/checkpoints.md +723 -104
  297. package/plugins/pbr/references/config-reference.md +387 -10
  298. package/plugins/pbr/references/continuation-format.md +1 -0
  299. package/plugins/pbr/references/decimal-phase-calculation.md +65 -0
  300. package/plugins/pbr/references/deviation-rules.md +12 -0
  301. package/plugins/pbr/references/few-shot-examples/audit.md +77 -0
  302. package/plugins/pbr/references/few-shot-examples/check-plan-format.md +172 -0
  303. package/plugins/pbr/references/few-shot-examples/check-subagent-output.md +118 -0
  304. package/plugins/pbr/references/few-shot-examples/integration-checker.md +70 -0
  305. package/plugins/pbr/references/few-shot-examples/nyquist-auditor.md +83 -0
  306. package/plugins/pbr/references/few-shot-examples/plan-checker.md +73 -0
  307. package/plugins/pbr/references/few-shot-examples/ui-checker.md +71 -0
  308. package/plugins/pbr/references/few-shot-examples/verifier.md +109 -0
  309. package/plugins/pbr/references/git-integration.md +110 -27
  310. package/plugins/pbr/references/git-planning-commit.md +35 -0
  311. package/plugins/pbr/references/model-profile-resolution.md +34 -0
  312. package/plugins/pbr/references/model-profiles.md +90 -7
  313. package/plugins/pbr/references/model-selection.md +1 -1
  314. package/plugins/pbr/references/node-repair.md +48 -0
  315. package/plugins/pbr/references/plan-authoring.md +65 -0
  316. package/plugins/pbr/references/plan-format.md +184 -10
  317. package/plugins/pbr/references/questioning.md +138 -49
  318. package/plugins/pbr/references/reading-verification.md +4 -4
  319. package/plugins/pbr/references/tdd.md +263 -0
  320. package/plugins/pbr/references/thinking-models-planning.md +47 -0
  321. package/plugins/pbr/references/thinking-models-verification.md +44 -0
  322. package/plugins/pbr/references/ui-brand.md +449 -0
  323. package/plugins/pbr/references/verification-overrides.md +39 -0
  324. package/plugins/pbr/references/verification-patterns.md +529 -113
  325. package/plugins/pbr/scripts/architecture-guard.js +76 -0
  326. package/plugins/pbr/scripts/audit-checks/behavioral-compliance.js +2098 -0
  327. package/plugins/pbr/scripts/audit-checks/error-analysis.js +989 -0
  328. package/plugins/pbr/scripts/audit-checks/feature-verification.js +723 -0
  329. package/plugins/pbr/scripts/audit-checks/index.js +433 -0
  330. package/plugins/pbr/scripts/audit-checks/infrastructure.js +816 -0
  331. package/plugins/pbr/scripts/audit-checks/quality-metrics.js +455 -0
  332. package/plugins/pbr/scripts/audit-checks/session-quality.js +980 -0
  333. package/plugins/pbr/scripts/audit-checks/si-agent-hook-config-checks.js +396 -0
  334. package/plugins/pbr/scripts/audit-checks/si-cross-cutting-checks.js +272 -0
  335. package/plugins/pbr/scripts/audit-checks/si-skill-checks.js +424 -0
  336. package/plugins/pbr/scripts/audit-checks/workflow-compliance.js +1175 -0
  337. package/plugins/pbr/scripts/audit-dimensions.js +556 -0
  338. package/plugins/pbr/scripts/auto-continue.js +192 -37
  339. package/plugins/pbr/scripts/block-skill-self-read.js +124 -0
  340. package/plugins/pbr/scripts/check-agent-state-write.js +63 -0
  341. package/plugins/pbr/scripts/check-config-change.js +84 -1
  342. package/plugins/pbr/scripts/check-cross-plugin-sync.js +93 -0
  343. package/plugins/pbr/scripts/check-dangerous-commands.js +18 -5
  344. package/plugins/pbr/scripts/check-direct-state-write.js +37 -0
  345. package/plugins/pbr/scripts/check-phase-boundary.js +3 -2
  346. package/plugins/pbr/scripts/check-plan-format.js +153 -354
  347. package/plugins/pbr/scripts/check-read-first.js +345 -0
  348. package/plugins/pbr/scripts/check-roadmap-sync.js +174 -19
  349. package/plugins/pbr/scripts/check-skill-workflow.js +21 -16
  350. package/plugins/pbr/scripts/check-state-sync.js +352 -220
  351. package/plugins/pbr/scripts/check-subagent-output.js +296 -333
  352. package/plugins/pbr/scripts/check-summary-gate.js +5 -15
  353. package/plugins/pbr/scripts/commands/benchmarks.js +195 -0
  354. package/plugins/pbr/scripts/commands/calibrate.js +530 -0
  355. package/plugins/pbr/scripts/commands/config.js +72 -0
  356. package/plugins/pbr/scripts/commands/misc.js +779 -0
  357. package/plugins/pbr/scripts/commands/phase.js +293 -0
  358. package/plugins/pbr/scripts/commands/roadmap.js +75 -0
  359. package/plugins/pbr/scripts/commands/state.js +84 -0
  360. package/plugins/pbr/scripts/commands/stress-test.js +349 -0
  361. package/plugins/pbr/scripts/commands/todo.js +191 -0
  362. package/plugins/pbr/scripts/commands/verify.js +169 -0
  363. package/plugins/pbr/scripts/config-schema.json +1183 -95
  364. package/plugins/pbr/scripts/context-bridge.js +425 -0
  365. package/plugins/pbr/scripts/context-budget-check.js +171 -16
  366. package/plugins/pbr/scripts/context-quality.js +271 -0
  367. package/plugins/pbr/scripts/enforce-context-budget.js +138 -0
  368. package/plugins/pbr/scripts/enforce-pbr-workflow.js +277 -0
  369. package/plugins/pbr/scripts/event-handler.js +137 -87
  370. package/plugins/pbr/scripts/event-logger.js +58 -25
  371. package/plugins/pbr/scripts/feedback-loop.js +155 -0
  372. package/plugins/pbr/scripts/graph-update.js +422 -0
  373. package/plugins/pbr/scripts/hook-logger.js +69 -35
  374. package/plugins/pbr/scripts/hook-server-client.js +361 -0
  375. package/plugins/pbr/scripts/hook-server.js +664 -0
  376. package/plugins/pbr/scripts/hooks-schema.json +12 -5
  377. package/plugins/pbr/scripts/instructions-loaded.js +173 -0
  378. package/plugins/pbr/scripts/intent-router.cjs +147 -0
  379. package/plugins/pbr/scripts/intercept-plan-mode.js +52 -18
  380. package/plugins/pbr/scripts/lib/alternatives.js +203 -0
  381. package/plugins/pbr/scripts/lib/audit.js +65 -0
  382. package/plugins/pbr/scripts/lib/auto-cleanup.js +221 -0
  383. package/plugins/pbr/scripts/lib/auto-verify.js +123 -0
  384. package/plugins/pbr/scripts/lib/benchmark.js +190 -0
  385. package/plugins/pbr/scripts/lib/build.js +719 -0
  386. package/plugins/pbr/scripts/lib/ci-fix-loop.js +228 -0
  387. package/plugins/pbr/scripts/lib/commands.js +483 -0
  388. package/plugins/pbr/scripts/lib/compound.js +222 -0
  389. package/plugins/pbr/scripts/lib/config-cache.js +83 -0
  390. package/plugins/pbr/scripts/lib/config.js +1469 -0
  391. package/plugins/pbr/scripts/lib/context.js +254 -0
  392. package/plugins/pbr/scripts/lib/contextual-help.js +183 -0
  393. package/plugins/pbr/scripts/lib/convention-detector.js +413 -0
  394. package/plugins/pbr/scripts/lib/core.js +1585 -0
  395. package/plugins/pbr/scripts/lib/dashboard-launch.js +364 -0
  396. package/plugins/pbr/scripts/lib/data-hygiene.js +179 -0
  397. package/plugins/pbr/scripts/lib/decision-extraction.js +183 -0
  398. package/plugins/pbr/scripts/lib/decisions.js +194 -0
  399. package/plugins/pbr/scripts/lib/dependency-break.js +147 -0
  400. package/plugins/pbr/scripts/lib/format-validators.js +1049 -0
  401. package/plugins/pbr/scripts/lib/frontmatter.js +302 -0
  402. package/plugins/pbr/scripts/lib/gates/advisories.js +133 -0
  403. package/plugins/pbr/scripts/lib/gates/build-dependency.js +118 -0
  404. package/plugins/pbr/scripts/lib/gates/build-executor.js +106 -0
  405. package/plugins/pbr/scripts/lib/gates/doc-existence.js +46 -0
  406. package/plugins/pbr/scripts/lib/gates/helpers.js +98 -0
  407. package/plugins/pbr/scripts/lib/gates/inline-execution.js +187 -0
  408. package/plugins/pbr/scripts/lib/gates/milestone-complete.js +139 -0
  409. package/plugins/pbr/scripts/lib/gates/milestone-summary.js +121 -0
  410. package/plugins/pbr/scripts/lib/gates/multi-phase-loader.js +149 -0
  411. package/plugins/pbr/scripts/lib/gates/plan-executor.js +36 -0
  412. package/plugins/pbr/scripts/lib/gates/plan-validation.js +115 -0
  413. package/plugins/pbr/scripts/lib/gates/quick-executor.js +78 -0
  414. package/plugins/pbr/scripts/lib/gates/review-planner.js +63 -0
  415. package/plugins/pbr/scripts/lib/gates/review-verifier.js +71 -0
  416. package/plugins/pbr/scripts/lib/gates/rich-agent-context.js +148 -0
  417. package/plugins/pbr/scripts/lib/gates/sprint-preflight.js +30 -0
  418. package/plugins/pbr/scripts/lib/gates/user-confirmation.js +95 -0
  419. package/plugins/pbr/scripts/lib/graph-cli.js +89 -0
  420. package/plugins/pbr/scripts/lib/graph.js +553 -0
  421. package/plugins/pbr/scripts/lib/handoff-validators.js +224 -0
  422. package/plugins/pbr/scripts/lib/health-checks.js +107 -0
  423. package/plugins/pbr/scripts/lib/health-phase06.js +120 -0
  424. package/plugins/pbr/scripts/lib/health.js +132 -0
  425. package/plugins/pbr/scripts/lib/help.js +100 -0
  426. package/plugins/pbr/scripts/lib/history.js +150 -0
  427. package/plugins/pbr/scripts/lib/impact-analysis.js +319 -0
  428. package/plugins/pbr/scripts/lib/incidents.js +190 -0
  429. package/plugins/pbr/scripts/lib/init.js +643 -0
  430. package/plugins/pbr/scripts/lib/insights-parser.js +320 -0
  431. package/plugins/pbr/scripts/lib/intel.js +653 -0
  432. package/plugins/pbr/scripts/lib/learnings.js +511 -0
  433. package/plugins/pbr/scripts/lib/migrate.js +309 -0
  434. package/plugins/pbr/scripts/lib/milestone.js +306 -0
  435. package/plugins/pbr/scripts/lib/msys-path.js +20 -0
  436. package/plugins/pbr/scripts/lib/negative-knowledge.js +194 -0
  437. package/plugins/pbr/scripts/lib/notification-throttle.js +141 -0
  438. package/plugins/pbr/scripts/lib/onboarding-generator.js +288 -0
  439. package/plugins/pbr/scripts/lib/parse-args.js +134 -0
  440. package/plugins/pbr/scripts/lib/pattern-routing.js +55 -0
  441. package/plugins/pbr/scripts/lib/patterns.js +272 -0
  442. package/plugins/pbr/scripts/lib/perf.js +190 -0
  443. package/plugins/pbr/scripts/lib/phase.js +1043 -0
  444. package/plugins/pbr/scripts/lib/pid-lock.js +156 -0
  445. package/plugins/pbr/scripts/lib/post-hoc.js +160 -0
  446. package/plugins/pbr/scripts/lib/pre-commit-checks.js +220 -0
  447. package/plugins/pbr/scripts/lib/pre-research.js +126 -0
  448. package/plugins/pbr/scripts/lib/premature-completion.js +312 -0
  449. package/plugins/pbr/scripts/lib/preview.js +174 -0
  450. package/plugins/pbr/scripts/lib/progress-visualization.js +296 -0
  451. package/plugins/pbr/scripts/lib/quick-init.js +131 -0
  452. package/plugins/pbr/scripts/lib/reference.js +236 -0
  453. package/plugins/pbr/scripts/lib/requirements.js +153 -0
  454. package/plugins/pbr/scripts/lib/resolve-root.js +66 -0
  455. package/plugins/pbr/scripts/lib/reverse-spec.js +259 -0
  456. package/plugins/pbr/scripts/lib/roadmap.js +1089 -0
  457. package/plugins/pbr/scripts/lib/security-scan.js +200 -0
  458. package/plugins/pbr/scripts/lib/session-briefing.js +918 -0
  459. package/plugins/pbr/scripts/lib/skill-section.js +99 -0
  460. package/plugins/pbr/scripts/lib/smart-next-task.js +198 -0
  461. package/plugins/pbr/scripts/lib/snapshot-manager.js +232 -0
  462. package/plugins/pbr/scripts/lib/spec-diff.js +209 -0
  463. package/plugins/pbr/scripts/lib/spec-engine.js +189 -0
  464. package/plugins/pbr/scripts/lib/spot-check.js +539 -0
  465. package/plugins/pbr/scripts/lib/state-queue.js +171 -0
  466. package/plugins/pbr/scripts/lib/state.js +1082 -0
  467. package/plugins/pbr/scripts/lib/status-render.js +511 -0
  468. package/plugins/pbr/scripts/lib/step-verify.js +149 -0
  469. package/plugins/pbr/scripts/lib/subagent-validators.js +1119 -0
  470. package/plugins/pbr/scripts/lib/suggest-next.js +435 -0
  471. package/plugins/pbr/scripts/lib/tech-debt-scanner.js +116 -0
  472. package/plugins/pbr/scripts/lib/templates.js +362 -0
  473. package/plugins/pbr/scripts/lib/test-selection.js +163 -0
  474. package/plugins/pbr/scripts/lib/todo.js +300 -0
  475. package/plugins/pbr/scripts/lib/verify.js +1561 -0
  476. package/plugins/pbr/scripts/log-notification.js +131 -0
  477. package/plugins/pbr/scripts/log-subagent.js +221 -18
  478. package/plugins/pbr/scripts/log-tool-failure.js +60 -5
  479. package/plugins/pbr/scripts/milestone-learnings.js +519 -0
  480. package/plugins/pbr/scripts/package.json +1 -1
  481. package/plugins/pbr/scripts/pbr-tools.js +362 -1247
  482. package/plugins/pbr/scripts/post-bash-triage.js +96 -0
  483. package/plugins/pbr/scripts/post-compact.js +135 -0
  484. package/plugins/pbr/scripts/post-hoc.js +237 -0
  485. package/plugins/pbr/scripts/post-write-dispatch.js +201 -31
  486. package/plugins/pbr/scripts/post-write-quality.js +4 -3
  487. package/plugins/pbr/scripts/pre-bash-dispatch.js +147 -51
  488. package/plugins/pbr/scripts/pre-skill-dispatch.js +114 -0
  489. package/plugins/pbr/scripts/pre-task-dispatch.js +269 -0
  490. package/plugins/pbr/scripts/pre-write-dispatch.js +170 -72
  491. package/plugins/pbr/scripts/progress-tracker.js +121 -324
  492. package/plugins/pbr/scripts/prompt-guard.js +114 -0
  493. package/plugins/pbr/scripts/prompt-routing.js +209 -0
  494. package/plugins/pbr/scripts/quick-status.js +179 -0
  495. package/plugins/pbr/scripts/record-incident.js +37 -0
  496. package/plugins/pbr/scripts/risk-classifier.cjs +123 -0
  497. package/plugins/pbr/scripts/run-hook.js +63 -23
  498. package/plugins/pbr/scripts/session-cleanup.js +428 -29
  499. package/plugins/pbr/scripts/session-tracker.js +124 -0
  500. package/plugins/pbr/scripts/status-line.js +571 -43
  501. package/plugins/pbr/scripts/suggest-compact.js +201 -13
  502. package/plugins/pbr/scripts/sync-context-to-claude.js +100 -0
  503. package/plugins/pbr/scripts/task-completed.js +165 -4
  504. package/plugins/pbr/scripts/test/config.test.js +126 -0
  505. package/plugins/pbr/scripts/test/cross-platform.test.js +120 -0
  506. package/plugins/pbr/scripts/test/fixtures/config.json +20 -0
  507. package/plugins/pbr/scripts/test/fixtures/plan.md +54 -0
  508. package/plugins/pbr/scripts/test/fixtures/project.md +30 -0
  509. package/plugins/pbr/scripts/test/fixtures/roadmap.md +55 -0
  510. package/plugins/pbr/scripts/test/fixtures/state.md +60 -0
  511. package/plugins/pbr/scripts/test/fixtures/summary.md +35 -0
  512. package/plugins/pbr/scripts/test/fixtures.test.js +184 -0
  513. package/plugins/pbr/scripts/test/phase.test.js +142 -0
  514. package/plugins/pbr/scripts/test/roadmap.test.js +96 -0
  515. package/plugins/pbr/scripts/test/state.test.js +155 -0
  516. package/plugins/pbr/scripts/track-context-budget.js +368 -104
  517. package/plugins/pbr/scripts/track-user-gates.js +88 -0
  518. package/plugins/pbr/scripts/trust-tracker.js +193 -0
  519. package/plugins/pbr/scripts/validate-commit.js +51 -19
  520. package/plugins/pbr/scripts/validate-skill-args.js +85 -14
  521. package/plugins/pbr/scripts/validate-task.js +83 -622
  522. package/plugins/pbr/scripts/worktree-create.js +144 -0
  523. package/plugins/pbr/scripts/worktree-remove.js +147 -0
  524. package/plugins/pbr/skills/audit/SKILL.md +195 -24
  525. package/plugins/pbr/skills/audit-fix/SKILL.md +326 -0
  526. package/plugins/pbr/skills/autonomous/SKILL.md +551 -0
  527. package/plugins/pbr/skills/backlog/SKILL.md +56 -0
  528. package/plugins/pbr/skills/begin/SKILL.md +508 -153
  529. package/plugins/pbr/skills/begin/templates/STATE.md.tmpl +1 -2
  530. package/plugins/pbr/skills/begin/templates/config.json.tmpl +419 -36
  531. package/plugins/pbr/skills/begin/templates/researcher-prompt.md.tmpl +28 -0
  532. package/plugins/pbr/skills/begin/templates/roadmap-prompt.md.tmpl +28 -3
  533. package/plugins/pbr/skills/begin/templates/synthesis-prompt.md.tmpl +33 -5
  534. package/plugins/pbr/skills/build/SKILL.md +1180 -357
  535. package/plugins/pbr/skills/build/templates/continuation-prompt.md.tmpl +26 -0
  536. package/plugins/pbr/skills/build/templates/executor-prompt.md.tmpl +77 -0
  537. package/plugins/pbr/skills/build/templates/inline-verifier-prompt.md.tmpl +33 -0
  538. package/plugins/pbr/skills/build/templates/qa-round-context.md.tmpl +16 -0
  539. package/plugins/pbr/skills/config/SKILL.md +112 -9
  540. package/plugins/pbr/skills/continue/SKILL.md +113 -33
  541. package/plugins/pbr/skills/dashboard/SKILL.md +21 -9
  542. package/plugins/pbr/skills/debug/SKILL.md +70 -12
  543. package/plugins/pbr/skills/debug/templates/continuation-prompt.md.tmpl +12 -1
  544. package/plugins/pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +12 -5
  545. package/plugins/pbr/skills/discuss/SKILL.md +205 -24
  546. package/plugins/pbr/skills/discuss/templates/CONTEXT.md.tmpl +21 -1
  547. package/plugins/pbr/skills/do/SKILL.md +119 -24
  548. package/plugins/pbr/skills/explore/SKILL.md +95 -20
  549. package/plugins/pbr/skills/fast/SKILL.md +94 -0
  550. package/plugins/pbr/skills/forensics/SKILL.md +144 -0
  551. package/plugins/pbr/skills/health/SKILL.md +35 -115
  552. package/plugins/pbr/skills/help/SKILL.md +83 -123
  553. package/plugins/pbr/skills/import/SKILL.md +332 -13
  554. package/plugins/pbr/skills/intel/SKILL.md +131 -0
  555. package/plugins/pbr/skills/list-phase-assumptions/SKILL.md +231 -0
  556. package/plugins/pbr/skills/milestone/SKILL.md +383 -274
  557. package/plugins/pbr/skills/milestone/templates/audit-output.md.tmpl +76 -0
  558. package/plugins/pbr/skills/milestone/templates/complete-output.md.tmpl +32 -0
  559. package/plugins/pbr/skills/milestone/templates/edge-cases.md +54 -0
  560. package/plugins/pbr/skills/milestone/templates/gaps-output.md.tmpl +25 -0
  561. package/plugins/pbr/skills/milestone/templates/integration-checker-prompt.md.tmpl +25 -0
  562. package/plugins/pbr/skills/milestone/templates/new-output.md.tmpl +29 -0
  563. package/plugins/pbr/skills/milestone-summary/SKILL.md +86 -0
  564. package/plugins/pbr/skills/note/SKILL.md +20 -4
  565. package/plugins/pbr/skills/pause/SKILL.md +54 -14
  566. package/plugins/pbr/skills/pause/templates/continue-here.md.tmpl +33 -52
  567. package/plugins/pbr/skills/plan/SKILL.md +526 -280
  568. package/plugins/pbr/skills/plan/templates/checker-prompt.md.tmpl +20 -2
  569. package/plugins/pbr/skills/plan/templates/completion-output.md.tmpl +27 -0
  570. package/plugins/pbr/skills/plan/templates/planner-prompt.md.tmpl +43 -1
  571. package/plugins/pbr/skills/plan/templates/revision-prompt.md.tmpl +21 -5
  572. package/plugins/pbr/skills/profile/SKILL.md +185 -0
  573. package/plugins/pbr/skills/profile-user/SKILL.md +227 -0
  574. package/plugins/pbr/skills/quick/SKILL.md +435 -100
  575. package/plugins/pbr/skills/release/SKILL.md +206 -0
  576. package/plugins/pbr/skills/resume/SKILL.md +170 -46
  577. package/plugins/pbr/skills/review/SKILL.md +233 -165
  578. package/plugins/pbr/skills/review/templates/verifier-prompt.md.tmpl +7 -0
  579. package/plugins/pbr/skills/scan/SKILL.md +152 -106
  580. package/plugins/pbr/skills/scan/templates/mapper-prompt.md.tmpl +5 -56
  581. package/plugins/pbr/skills/seed/SKILL.md +87 -0
  582. package/plugins/pbr/skills/session-report/SKILL.md +130 -0
  583. package/plugins/pbr/skills/setup/SKILL.md +150 -202
  584. package/plugins/pbr/skills/shared/agent-context-enrichment.md +21 -0
  585. package/plugins/pbr/skills/shared/agent-type-resolution.md +32 -0
  586. package/plugins/pbr/skills/shared/commit-planning-docs.md +8 -0
  587. package/plugins/pbr/skills/shared/context-budget.md +66 -1
  588. package/plugins/pbr/skills/shared/context-loader-task.md +18 -11
  589. package/plugins/pbr/skills/shared/criterion-writing.md +58 -0
  590. package/plugins/pbr/skills/shared/digest-select.md +2 -2
  591. package/plugins/pbr/skills/shared/domain-probes.md +1 -1
  592. package/plugins/pbr/skills/shared/error-reporting.md +38 -60
  593. package/plugins/pbr/skills/shared/gate-prompts.md +4 -2
  594. package/plugins/pbr/skills/shared/memory-capture.md +48 -0
  595. package/plugins/pbr/skills/shared/phase-argument-parsing.md +4 -4
  596. package/plugins/pbr/skills/shared/revision-loop.md +24 -6
  597. package/plugins/pbr/skills/shared/state-update.md +46 -61
  598. package/plugins/pbr/skills/shared/universal-anti-patterns.md +27 -4
  599. package/plugins/pbr/skills/ship/SKILL.md +155 -0
  600. package/plugins/pbr/skills/stats/SKILL.md +110 -0
  601. package/plugins/pbr/skills/status/SKILL.md +185 -119
  602. package/plugins/pbr/skills/test/SKILL.md +254 -0
  603. package/plugins/pbr/skills/thread/SKILL.md +73 -0
  604. package/plugins/pbr/skills/todo/SKILL.md +28 -72
  605. package/plugins/pbr/skills/ui-phase/SKILL.md +180 -0
  606. package/plugins/pbr/skills/ui-review/SKILL.md +206 -0
  607. package/plugins/pbr/skills/undo/SKILL.md +221 -0
  608. package/plugins/pbr/skills/validate-phase/SKILL.md +362 -0
  609. package/plugins/pbr/templates/CONTEXT.md.tmpl +45 -20
  610. package/plugins/pbr/templates/DISCOVERY.md.tmpl +29 -0
  611. package/plugins/pbr/templates/DISCUSSION-LOG.md.tmpl +49 -0
  612. package/plugins/pbr/templates/HANDOFF.json.tmpl +30 -0
  613. package/plugins/pbr/templates/INTEGRATION-REPORT.md.tmpl +18 -2
  614. package/plugins/pbr/templates/MILESTONE-AUDIT.md.tmpl +44 -0
  615. package/plugins/pbr/templates/PROJECT.md.tmpl +126 -0
  616. package/plugins/pbr/templates/REQUIREMENTS.md.tmpl +96 -0
  617. package/plugins/pbr/templates/RETROSPECTIVE.md.tmpl +43 -0
  618. package/plugins/pbr/templates/ROADMAP.md.tmpl +106 -14
  619. package/plugins/pbr/templates/SUMMARY-complex.md.tmpl +133 -0
  620. package/plugins/pbr/templates/SUMMARY-minimal.md.tmpl +55 -0
  621. package/plugins/pbr/templates/SUMMARY.md.tmpl +21 -0
  622. package/plugins/pbr/templates/UAT.md.tmpl +94 -0
  623. package/plugins/pbr/templates/UI-SPEC.md.tmpl +144 -0
  624. package/plugins/pbr/templates/VALIDATION.md.tmpl +94 -0
  625. package/plugins/pbr/templates/VERIFICATION-DETAIL.md.tmpl +54 -13
  626. package/plugins/pbr/templates/project-CONTEXT.md.tmpl +59 -0
  627. package/plugins/pbr/templates/research-outputs/ARCHITECTURE.md.tmpl +91 -0
  628. package/plugins/pbr/templates/research-outputs/FEATURES.md.tmpl +64 -0
  629. package/plugins/pbr/templates/research-outputs/PITFALLS.md.tmpl +50 -0
  630. package/plugins/pbr/templates/research-outputs/STACK.md.tmpl +63 -0
  631. package/plugins/pbr/templates/research-outputs/SUMMARY.md.tmpl +98 -0
  632. package/scripts/build-hooks.js +61 -0
  633. package/scripts/check-ci.js +100 -0
  634. package/scripts/clean-changelog.js +364 -0
  635. package/scripts/generate-derivatives.js +581 -0
  636. package/scripts/posttest.js +93 -0
  637. package/scripts/release.js +262 -0
  638. package/scripts/run-tests.cjs +29 -0
  639. package/scripts/test-wrapper.js +43 -0
  640. package/dashboard/bin/cli.js +0 -25
  641. package/dashboard/public/css/layout.css +0 -704
  642. package/dashboard/public/css/status-colors.css +0 -98
  643. package/dashboard/public/css/tokens.css +0 -59
  644. package/dashboard/public/js/htmx-title.js +0 -5
  645. package/dashboard/public/js/sidebar-toggle.js +0 -34
  646. package/dashboard/public/js/sse-client.js +0 -100
  647. package/dashboard/public/js/theme-toggle.js +0 -46
  648. package/dashboard/src/app.js +0 -91
  649. package/dashboard/src/middleware/current-phase.js +0 -24
  650. package/dashboard/src/middleware/errorHandler.js +0 -52
  651. package/dashboard/src/middleware/notFoundHandler.js +0 -9
  652. package/dashboard/src/repositories/planning.repository.js +0 -130
  653. package/dashboard/src/routes/events.routes.js +0 -45
  654. package/dashboard/src/routes/index.routes.js +0 -35
  655. package/dashboard/src/routes/pages.routes.js +0 -426
  656. package/dashboard/src/server.js +0 -42
  657. package/dashboard/src/services/analytics.service.js +0 -141
  658. package/dashboard/src/services/dashboard.service.js +0 -309
  659. package/dashboard/src/services/milestone.service.js +0 -222
  660. package/dashboard/src/services/notes.service.js +0 -50
  661. package/dashboard/src/services/phase.service.js +0 -232
  662. package/dashboard/src/services/project.service.js +0 -57
  663. package/dashboard/src/services/roadmap.service.js +0 -258
  664. package/dashboard/src/services/sse.service.js +0 -58
  665. package/dashboard/src/services/todo.service.js +0 -272
  666. package/dashboard/src/services/watcher.service.js +0 -48
  667. package/dashboard/src/utils/cache.js +0 -55
  668. package/dashboard/src/views/analytics.ejs +0 -5
  669. package/dashboard/src/views/coming-soon.ejs +0 -11
  670. package/dashboard/src/views/dependencies.ejs +0 -5
  671. package/dashboard/src/views/error.ejs +0 -20
  672. package/dashboard/src/views/index.ejs +0 -5
  673. package/dashboard/src/views/milestone-detail.ejs +0 -5
  674. package/dashboard/src/views/milestones.ejs +0 -5
  675. package/dashboard/src/views/notes.ejs +0 -5
  676. package/dashboard/src/views/partials/analytics-content.ejs +0 -90
  677. package/dashboard/src/views/partials/breadcrumbs.ejs +0 -14
  678. package/dashboard/src/views/partials/dashboard-content.ejs +0 -84
  679. package/dashboard/src/views/partials/dependencies-content.ejs +0 -48
  680. package/dashboard/src/views/partials/empty-state.ejs +0 -7
  681. package/dashboard/src/views/partials/footer.ejs +0 -3
  682. package/dashboard/src/views/partials/head.ejs +0 -30
  683. package/dashboard/src/views/partials/header.ejs +0 -21
  684. package/dashboard/src/views/partials/layout-bottom.ejs +0 -43
  685. package/dashboard/src/views/partials/layout-top.ejs +0 -16
  686. package/dashboard/src/views/partials/milestone-detail-content.ejs +0 -20
  687. package/dashboard/src/views/partials/milestones-content.ejs +0 -88
  688. package/dashboard/src/views/partials/notes-content.ejs +0 -23
  689. package/dashboard/src/views/partials/phase-content.ejs +0 -193
  690. package/dashboard/src/views/partials/phase-doc-content.ejs +0 -38
  691. package/dashboard/src/views/partials/phases-content.ejs +0 -124
  692. package/dashboard/src/views/partials/roadmap-content.ejs +0 -180
  693. package/dashboard/src/views/partials/sidebar.ejs +0 -99
  694. package/dashboard/src/views/partials/todo-create-content.ejs +0 -54
  695. package/dashboard/src/views/partials/todo-detail-content.ejs +0 -42
  696. package/dashboard/src/views/partials/todos-content.ejs +0 -97
  697. package/dashboard/src/views/phase-detail.ejs +0 -5
  698. package/dashboard/src/views/phase-doc.ejs +0 -5
  699. package/dashboard/src/views/phases.ejs +0 -5
  700. package/dashboard/src/views/roadmap.ejs +0 -5
  701. package/dashboard/src/views/todo-create.ejs +0 -5
  702. package/dashboard/src/views/todo-detail.ejs +0 -5
  703. package/dashboard/src/views/todos.ejs +0 -5
  704. package/plugins/copilot-pbr/CHANGELOG.md +0 -19
  705. package/plugins/copilot-pbr/README.md +0 -139
  706. package/plugins/copilot-pbr/agents/audit.agent.md +0 -113
  707. package/plugins/copilot-pbr/agents/codebase-mapper.agent.md +0 -151
  708. package/plugins/copilot-pbr/agents/debugger.agent.md +0 -184
  709. package/plugins/copilot-pbr/agents/executor.agent.md +0 -269
  710. package/plugins/copilot-pbr/agents/general.agent.md +0 -89
  711. package/plugins/copilot-pbr/agents/integration-checker.agent.md +0 -121
  712. package/plugins/copilot-pbr/agents/plan-checker.agent.md +0 -208
  713. package/plugins/copilot-pbr/agents/planner.agent.md +0 -240
  714. package/plugins/copilot-pbr/agents/researcher.agent.md +0 -188
  715. package/plugins/copilot-pbr/agents/synthesizer.agent.md +0 -126
  716. package/plugins/copilot-pbr/agents/verifier.agent.md +0 -228
  717. package/plugins/copilot-pbr/hooks/hooks.json +0 -258
  718. package/plugins/copilot-pbr/plugin.json +0 -30
  719. package/plugins/copilot-pbr/references/agent-anti-patterns.md +0 -25
  720. package/plugins/copilot-pbr/references/agent-contracts.md +0 -297
  721. package/plugins/copilot-pbr/references/agent-interactions.md +0 -135
  722. package/plugins/copilot-pbr/references/agent-teams.md +0 -55
  723. package/plugins/copilot-pbr/references/checkpoints.md +0 -158
  724. package/plugins/copilot-pbr/references/common-bug-patterns.md +0 -14
  725. package/plugins/copilot-pbr/references/config-reference.md +0 -442
  726. package/plugins/copilot-pbr/references/continuation-format.md +0 -213
  727. package/plugins/copilot-pbr/references/deviation-rules.md +0 -113
  728. package/plugins/copilot-pbr/references/git-integration.md +0 -227
  729. package/plugins/copilot-pbr/references/integration-patterns.md +0 -118
  730. package/plugins/copilot-pbr/references/model-profiles.md +0 -100
  731. package/plugins/copilot-pbr/references/model-selection.md +0 -32
  732. package/plugins/copilot-pbr/references/pbr-rules.md +0 -195
  733. package/plugins/copilot-pbr/references/pbr-tools-cli.md +0 -285
  734. package/plugins/copilot-pbr/references/plan-authoring.md +0 -182
  735. package/plugins/copilot-pbr/references/plan-format.md +0 -288
  736. package/plugins/copilot-pbr/references/planning-config.md +0 -214
  737. package/plugins/copilot-pbr/references/questioning.md +0 -215
  738. package/plugins/copilot-pbr/references/reading-verification.md +0 -128
  739. package/plugins/copilot-pbr/references/stub-patterns.md +0 -161
  740. package/plugins/copilot-pbr/references/subagent-coordination.md +0 -120
  741. package/plugins/copilot-pbr/references/ui-formatting.md +0 -444
  742. package/plugins/copilot-pbr/references/verification-patterns.md +0 -199
  743. package/plugins/copilot-pbr/references/wave-execution.md +0 -96
  744. package/plugins/copilot-pbr/rules/pbr-workflow.mdc +0 -48
  745. package/plugins/copilot-pbr/setup.ps1 +0 -93
  746. package/plugins/copilot-pbr/setup.sh +0 -93
  747. package/plugins/copilot-pbr/skills/audit/SKILL.md +0 -330
  748. package/plugins/copilot-pbr/skills/begin/SKILL.md +0 -589
  749. package/plugins/copilot-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  750. package/plugins/copilot-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  751. package/plugins/copilot-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  752. package/plugins/copilot-pbr/skills/begin/templates/config.json.tmpl +0 -64
  753. package/plugins/copilot-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  754. package/plugins/copilot-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  755. package/plugins/copilot-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  756. package/plugins/copilot-pbr/skills/build/SKILL.md +0 -959
  757. package/plugins/copilot-pbr/skills/config/SKILL.md +0 -250
  758. package/plugins/copilot-pbr/skills/continue/SKILL.md +0 -159
  759. package/plugins/copilot-pbr/skills/dashboard/SKILL.md +0 -43
  760. package/plugins/copilot-pbr/skills/debug/SKILL.md +0 -508
  761. package/plugins/copilot-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  762. package/plugins/copilot-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  763. package/plugins/copilot-pbr/skills/discuss/SKILL.md +0 -353
  764. package/plugins/copilot-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  765. package/plugins/copilot-pbr/skills/discuss/templates/decision-categories.md +0 -10
  766. package/plugins/copilot-pbr/skills/do/SKILL.md +0 -66
  767. package/plugins/copilot-pbr/skills/explore/SKILL.md +0 -373
  768. package/plugins/copilot-pbr/skills/health/SKILL.md +0 -283
  769. package/plugins/copilot-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  770. package/plugins/copilot-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  771. package/plugins/copilot-pbr/skills/help/SKILL.md +0 -193
  772. package/plugins/copilot-pbr/skills/import/SKILL.md +0 -502
  773. package/plugins/copilot-pbr/skills/milestone/SKILL.md +0 -806
  774. package/plugins/copilot-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  775. package/plugins/copilot-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  776. package/plugins/copilot-pbr/skills/note/SKILL.md +0 -213
  777. package/plugins/copilot-pbr/skills/pause/SKILL.md +0 -247
  778. package/plugins/copilot-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  779. package/plugins/copilot-pbr/skills/plan/SKILL.md +0 -662
  780. package/plugins/copilot-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  781. package/plugins/copilot-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  782. package/plugins/copilot-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  783. package/plugins/copilot-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  784. package/plugins/copilot-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  785. package/plugins/copilot-pbr/skills/quick/SKILL.md +0 -376
  786. package/plugins/copilot-pbr/skills/resume/SKILL.md +0 -399
  787. package/plugins/copilot-pbr/skills/review/SKILL.md +0 -653
  788. package/plugins/copilot-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  789. package/plugins/copilot-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  790. package/plugins/copilot-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  791. package/plugins/copilot-pbr/skills/scan/SKILL.md +0 -299
  792. package/plugins/copilot-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  793. package/plugins/copilot-pbr/skills/setup/SKILL.md +0 -296
  794. package/plugins/copilot-pbr/skills/shared/commit-planning-docs.md +0 -36
  795. package/plugins/copilot-pbr/skills/shared/config-loading.md +0 -103
  796. package/plugins/copilot-pbr/skills/shared/context-budget.md +0 -41
  797. package/plugins/copilot-pbr/skills/shared/context-loader-task.md +0 -87
  798. package/plugins/copilot-pbr/skills/shared/digest-select.md +0 -80
  799. package/plugins/copilot-pbr/skills/shared/domain-probes.md +0 -126
  800. package/plugins/copilot-pbr/skills/shared/error-recovery-strategies.md +0 -51
  801. package/plugins/copilot-pbr/skills/shared/error-reporting.md +0 -81
  802. package/plugins/copilot-pbr/skills/shared/gate-prompts.md +0 -389
  803. package/plugins/copilot-pbr/skills/shared/phase-argument-parsing.md +0 -46
  804. package/plugins/copilot-pbr/skills/shared/progress-display.md +0 -53
  805. package/plugins/copilot-pbr/skills/shared/revision-loop.md +0 -82
  806. package/plugins/copilot-pbr/skills/shared/state-loading.md +0 -63
  807. package/plugins/copilot-pbr/skills/shared/state-update.md +0 -170
  808. package/plugins/copilot-pbr/skills/shared/universal-anti-patterns.md +0 -38
  809. package/plugins/copilot-pbr/skills/status/SKILL.md +0 -362
  810. package/plugins/copilot-pbr/skills/statusline/SKILL.md +0 -149
  811. package/plugins/copilot-pbr/skills/todo/SKILL.md +0 -279
  812. package/plugins/copilot-pbr/templates/CONTEXT.md.tmpl +0 -53
  813. package/plugins/copilot-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  814. package/plugins/copilot-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  815. package/plugins/copilot-pbr/templates/ROADMAP.md.tmpl +0 -48
  816. package/plugins/copilot-pbr/templates/SUMMARY.md.tmpl +0 -82
  817. package/plugins/copilot-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  818. package/plugins/copilot-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  819. package/plugins/copilot-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  820. package/plugins/copilot-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  821. package/plugins/copilot-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  822. package/plugins/copilot-pbr/templates/codebase/STACK.md.tmpl +0 -78
  823. package/plugins/copilot-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  824. package/plugins/copilot-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  825. package/plugins/copilot-pbr/templates/continue-here.md.tmpl +0 -74
  826. package/plugins/copilot-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  827. package/plugins/copilot-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  828. package/plugins/copilot-pbr/templates/research/STACK.md.tmpl +0 -71
  829. package/plugins/copilot-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  830. package/plugins/copilot-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  831. package/plugins/copilot-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  832. package/plugins/copilot-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  833. package/plugins/cursor-pbr/.cursor-plugin/plugin.json +0 -32
  834. package/plugins/cursor-pbr/CHANGELOG.md +0 -15
  835. package/plugins/cursor-pbr/README.md +0 -123
  836. package/plugins/cursor-pbr/agents/audit.md +0 -178
  837. package/plugins/cursor-pbr/agents/codebase-mapper.md +0 -150
  838. package/plugins/cursor-pbr/agents/debugger.md +0 -183
  839. package/plugins/cursor-pbr/agents/executor.md +0 -268
  840. package/plugins/cursor-pbr/agents/general.md +0 -88
  841. package/plugins/cursor-pbr/agents/integration-checker.md +0 -120
  842. package/plugins/cursor-pbr/agents/plan-checker.md +0 -207
  843. package/plugins/cursor-pbr/agents/planner.md +0 -239
  844. package/plugins/cursor-pbr/agents/researcher.md +0 -187
  845. package/plugins/cursor-pbr/agents/synthesizer.md +0 -125
  846. package/plugins/cursor-pbr/agents/verifier.md +0 -227
  847. package/plugins/cursor-pbr/assets/.gitkeep +0 -0
  848. package/plugins/cursor-pbr/assets/logo.svg +0 -21
  849. package/plugins/cursor-pbr/hooks/hooks.json +0 -224
  850. package/plugins/cursor-pbr/references/agent-anti-patterns.md +0 -25
  851. package/plugins/cursor-pbr/references/agent-contracts.md +0 -297
  852. package/plugins/cursor-pbr/references/agent-interactions.md +0 -135
  853. package/plugins/cursor-pbr/references/agent-teams.md +0 -55
  854. package/plugins/cursor-pbr/references/checkpoints.md +0 -158
  855. package/plugins/cursor-pbr/references/common-bug-patterns.md +0 -14
  856. package/plugins/cursor-pbr/references/config-reference.md +0 -442
  857. package/plugins/cursor-pbr/references/continuation-format.md +0 -213
  858. package/plugins/cursor-pbr/references/deviation-rules.md +0 -113
  859. package/plugins/cursor-pbr/references/git-integration.md +0 -227
  860. package/plugins/cursor-pbr/references/integration-patterns.md +0 -118
  861. package/plugins/cursor-pbr/references/model-profiles.md +0 -100
  862. package/plugins/cursor-pbr/references/model-selection.md +0 -32
  863. package/plugins/cursor-pbr/references/pbr-rules.md +0 -195
  864. package/plugins/cursor-pbr/references/pbr-tools-cli.md +0 -285
  865. package/plugins/cursor-pbr/references/plan-authoring.md +0 -182
  866. package/plugins/cursor-pbr/references/plan-format.md +0 -288
  867. package/plugins/cursor-pbr/references/planning-config.md +0 -214
  868. package/plugins/cursor-pbr/references/questioning.md +0 -215
  869. package/plugins/cursor-pbr/references/reading-verification.md +0 -128
  870. package/plugins/cursor-pbr/references/stub-patterns.md +0 -161
  871. package/plugins/cursor-pbr/references/subagent-coordination.md +0 -120
  872. package/plugins/cursor-pbr/references/ui-formatting.md +0 -444
  873. package/plugins/cursor-pbr/references/verification-patterns.md +0 -199
  874. package/plugins/cursor-pbr/references/wave-execution.md +0 -96
  875. package/plugins/cursor-pbr/rules/pbr-workflow.mdc +0 -48
  876. package/plugins/cursor-pbr/setup.ps1 +0 -78
  877. package/plugins/cursor-pbr/setup.sh +0 -83
  878. package/plugins/cursor-pbr/skills/audit/SKILL.md +0 -331
  879. package/plugins/cursor-pbr/skills/begin/SKILL.md +0 -589
  880. package/plugins/cursor-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  881. package/plugins/cursor-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  882. package/plugins/cursor-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  883. package/plugins/cursor-pbr/skills/begin/templates/config.json.tmpl +0 -64
  884. package/plugins/cursor-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  885. package/plugins/cursor-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  886. package/plugins/cursor-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  887. package/plugins/cursor-pbr/skills/build/SKILL.md +0 -960
  888. package/plugins/cursor-pbr/skills/config/SKILL.md +0 -252
  889. package/plugins/cursor-pbr/skills/continue/SKILL.md +0 -159
  890. package/plugins/cursor-pbr/skills/dashboard/SKILL.md +0 -44
  891. package/plugins/cursor-pbr/skills/debug/SKILL.md +0 -512
  892. package/plugins/cursor-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  893. package/plugins/cursor-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  894. package/plugins/cursor-pbr/skills/discuss/SKILL.md +0 -354
  895. package/plugins/cursor-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  896. package/plugins/cursor-pbr/skills/discuss/templates/decision-categories.md +0 -10
  897. package/plugins/cursor-pbr/skills/do/SKILL.md +0 -67
  898. package/plugins/cursor-pbr/skills/explore/SKILL.md +0 -376
  899. package/plugins/cursor-pbr/skills/health/SKILL.md +0 -283
  900. package/plugins/cursor-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  901. package/plugins/cursor-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  902. package/plugins/cursor-pbr/skills/help/SKILL.md +0 -193
  903. package/plugins/cursor-pbr/skills/import/SKILL.md +0 -505
  904. package/plugins/cursor-pbr/skills/milestone/SKILL.md +0 -807
  905. package/plugins/cursor-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  906. package/plugins/cursor-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  907. package/plugins/cursor-pbr/skills/note/SKILL.md +0 -214
  908. package/plugins/cursor-pbr/skills/pause/SKILL.md +0 -248
  909. package/plugins/cursor-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  910. package/plugins/cursor-pbr/skills/plan/SKILL.md +0 -663
  911. package/plugins/cursor-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  912. package/plugins/cursor-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  913. package/plugins/cursor-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  914. package/plugins/cursor-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  915. package/plugins/cursor-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  916. package/plugins/cursor-pbr/skills/quick/SKILL.md +0 -376
  917. package/plugins/cursor-pbr/skills/resume/SKILL.md +0 -399
  918. package/plugins/cursor-pbr/skills/review/SKILL.md +0 -654
  919. package/plugins/cursor-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  920. package/plugins/cursor-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  921. package/plugins/cursor-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  922. package/plugins/cursor-pbr/skills/scan/SKILL.md +0 -300
  923. package/plugins/cursor-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  924. package/plugins/cursor-pbr/skills/setup/SKILL.md +0 -296
  925. package/plugins/cursor-pbr/skills/shared/commit-planning-docs.md +0 -36
  926. package/plugins/cursor-pbr/skills/shared/config-loading.md +0 -103
  927. package/plugins/cursor-pbr/skills/shared/context-budget.md +0 -41
  928. package/plugins/cursor-pbr/skills/shared/context-loader-task.md +0 -87
  929. package/plugins/cursor-pbr/skills/shared/digest-select.md +0 -80
  930. package/plugins/cursor-pbr/skills/shared/domain-probes.md +0 -126
  931. package/plugins/cursor-pbr/skills/shared/error-recovery-strategies.md +0 -51
  932. package/plugins/cursor-pbr/skills/shared/error-reporting.md +0 -81
  933. package/plugins/cursor-pbr/skills/shared/gate-prompts.md +0 -389
  934. package/plugins/cursor-pbr/skills/shared/phase-argument-parsing.md +0 -46
  935. package/plugins/cursor-pbr/skills/shared/progress-display.md +0 -53
  936. package/plugins/cursor-pbr/skills/shared/revision-loop.md +0 -82
  937. package/plugins/cursor-pbr/skills/shared/state-loading.md +0 -63
  938. package/plugins/cursor-pbr/skills/shared/state-update.md +0 -170
  939. package/plugins/cursor-pbr/skills/shared/universal-anti-patterns.md +0 -38
  940. package/plugins/cursor-pbr/skills/status/SKILL.md +0 -362
  941. package/plugins/cursor-pbr/skills/statusline/SKILL.md +0 -150
  942. package/plugins/cursor-pbr/skills/todo/SKILL.md +0 -280
  943. package/plugins/cursor-pbr/templates/CONTEXT.md.tmpl +0 -53
  944. package/plugins/cursor-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  945. package/plugins/cursor-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  946. package/plugins/cursor-pbr/templates/ROADMAP.md.tmpl +0 -48
  947. package/plugins/cursor-pbr/templates/SUMMARY.md.tmpl +0 -82
  948. package/plugins/cursor-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  949. package/plugins/cursor-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  950. package/plugins/cursor-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  951. package/plugins/cursor-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  952. package/plugins/cursor-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  953. package/plugins/cursor-pbr/templates/codebase/STACK.md.tmpl +0 -78
  954. package/plugins/cursor-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  955. package/plugins/cursor-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  956. package/plugins/cursor-pbr/templates/continue-here.md.tmpl +0 -74
  957. package/plugins/cursor-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  958. package/plugins/cursor-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  959. package/plugins/cursor-pbr/templates/research/STACK.md.tmpl +0 -71
  960. package/plugins/cursor-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  961. package/plugins/cursor-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  962. package/plugins/cursor-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  963. package/plugins/cursor-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  964. package/plugins/pbr/references/agent-interactions.md +0 -134
  965. package/plugins/pbr/references/pbr-rules.md +0 -194
  966. package/plugins/pbr/references/pbr-tools-cli.md +0 -285
  967. package/plugins/pbr/references/planning-config.md +0 -213
  968. package/plugins/pbr/references/subagent-coordination.md +0 -119
  969. package/plugins/pbr/references/ui-formatting.md +0 -444
  970. package/plugins/pbr/scripts/validate-plugin-structure.js +0 -183
  971. package/plugins/pbr/skills/milestone/templates/audit-report.md.tmpl +0 -48
  972. package/plugins/pbr/skills/shared/error-recovery-strategies.md +0 -51
  973. package/plugins/pbr/skills/shared/progress-display.md +0 -53
  974. package/plugins/pbr/skills/shared/state-loading.md +0 -62
  975. package/plugins/pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -97
  976. package/plugins/pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  977. package/plugins/pbr/templates/research/STACK.md.tmpl +0 -71
  978. package/plugins/pbr/templates/research/SUMMARY.md.tmpl +0 -112
  979. package/plugins/pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  980. package/plugins/pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  981. package/plugins/pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  982. /package/plugins/pbr/references/{agent-anti-patterns.md → archive/agent-anti-patterns.md} +0 -0
@@ -0,0 +1,1049 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Format validators extracted from check-plan-format.js.
5
+ * Validates planning artifact structure (PLAN, SUMMARY, VERIFICATION, STATE,
6
+ * ROADMAP, LEARNINGS, config.json, RESEARCH, CONTEXT).
7
+ *
8
+ * Each validate* function returns { errors: string[], warnings: string[] }.
9
+ */
10
+
11
+ const fs = require('fs');
12
+ const path = require('path');
13
+ const { logHook } = require('../hook-logger');
14
+ const { logEvent } = require('../event-logger');
15
+ const { lockedFileUpdate } = require('../pbr-tools');
16
+
17
+ // ---------------------------------------------------------------------------
18
+ // Must-haves
19
+ // ---------------------------------------------------------------------------
20
+
21
+ /**
22
+ * Validate must_haves sub-field structure within frontmatter.
23
+ * Checks that truths, artifacts, and key_links sub-fields exist under must_haves.
24
+ * Uses warnings (not errors) during migration period.
25
+ *
26
+ * @param {string} frontmatter - The frontmatter content (between --- delimiters)
27
+ * @returns {{ errors: string[], warnings: string[] }}
28
+ */
29
+ function validateMustHaves(frontmatter) {
30
+ const warnings = [];
31
+
32
+ const mustHavesIdx = frontmatter.indexOf('must_haves:');
33
+ if (mustHavesIdx === -1) return { errors: [], warnings };
34
+
35
+ const afterMustHaves = frontmatter.substring(mustHavesIdx + 'must_haves:'.length);
36
+ const nextKeyMatch = afterMustHaves.match(/\n[a-zA-Z_][a-zA-Z0-9_]*:/);
37
+ const mustHavesBlock = nextKeyMatch
38
+ ? afterMustHaves.substring(0, nextKeyMatch.index)
39
+ : afterMustHaves;
40
+
41
+ const requiredSubFields = ['truths', 'artifacts', 'key_links'];
42
+ for (const subField of requiredSubFields) {
43
+ const subFieldRegex = new RegExp(`^\\s+${subField}:`, 'm');
44
+ if (!subFieldRegex.test(mustHavesBlock)) {
45
+ warnings.push(`must_haves missing "${subField}" sub-field`);
46
+ }
47
+ }
48
+
49
+ return { errors: [], warnings };
50
+ }
51
+
52
+ // ---------------------------------------------------------------------------
53
+ // PLAN validation
54
+ // ---------------------------------------------------------------------------
55
+
56
+ /** Canonical required fields for PLAN.md frontmatter. */
57
+ const PLAN_REQUIRED_FIELDS = ['phase', 'plan', 'wave', 'type', 'depends_on', 'files_modified', 'autonomous'];
58
+
59
+ /** Valid values for the type: field in PLAN.md frontmatter. */
60
+ const PLAN_VALID_TYPES = ['feature', 'bugfix', 'refactor', 'infrastructure', 'docs', 'chore'];
61
+
62
+ /** Vague criterion patterns that produce advisory warnings (REQ-HI-02). */
63
+ const VAGUE_PATTERNS = [
64
+ { regex: /\bshould be (good|nice|clean|proper|fine)\b/i, label: 'subjective quality' },
65
+ { regex: /\bproperly (handle|handles|manage|manages|process|processes|implement|implements)\b/i, label: 'undefined "properly"' },
66
+ { regex: /\bclean code\b/i, label: 'aesthetic judgment' },
67
+ { regex: /\bwell[- ]?(tested|structured|organized|designed)\b/i, label: 'subjective quality' },
68
+ { regex: /\bresponsive\b(?!.*\d+px)/i, label: 'no viewport threshold' },
69
+ { regex: /\bperformant\b(?!.*\d)/i, label: 'no performance threshold' },
70
+ { regex: /\brobust\b(?!.*\b(retry|fallback|timeout)\b)/i, label: 'no resilience mechanism specified' },
71
+ { regex: /\bsecure\b(?!.*\b(sanitize|validate|encrypt|auth|CORS|CSP)\b)/i, label: 'no security mechanism specified' },
72
+ ];
73
+
74
+ function validatePlan(content, _filePath) {
75
+ const errors = [];
76
+ const warnings = [];
77
+
78
+ // Check frontmatter
79
+ if (!content.startsWith('---')) {
80
+ errors.push('Missing YAML frontmatter');
81
+ } else {
82
+ const frontmatterEnd = content.indexOf('---', 3);
83
+ if (frontmatterEnd === -1) {
84
+ errors.push('Unclosed YAML frontmatter');
85
+ } else {
86
+ const frontmatter = content.substring(3, frontmatterEnd);
87
+ for (const field of PLAN_REQUIRED_FIELDS) {
88
+ if (!frontmatter.includes(`${field}:`)) {
89
+ errors.push(`Frontmatter missing "${field}" field`);
90
+ }
91
+ }
92
+
93
+ // Validate type enum value
94
+ const typeMatch = frontmatter.match(/^type:\s*["']?([^"'\r\n]+)["']?\s*$/m);
95
+ if (typeMatch) {
96
+ const typeValue = typeMatch[1].trim();
97
+ if (!PLAN_VALID_TYPES.includes(typeValue)) {
98
+ warnings.push(`Unexpected type value: "${typeValue}" (expected: ${PLAN_VALID_TYPES.join(', ')})`);
99
+ }
100
+ }
101
+ if (!frontmatter.includes('must_haves:')) {
102
+ errors.push('Frontmatter missing "must_haves" field (truths/artifacts/key_links required)');
103
+ } else {
104
+ const mhResult = validateMustHaves(frontmatter);
105
+ warnings.push(...mhResult.warnings);
106
+
107
+ // Vague criteria detection (advisory only — REQ-HI-02)
108
+ const mhBlock = frontmatter.substring(frontmatter.indexOf('must_haves:'));
109
+ const nextKey = mhBlock.match(/\n[a-zA-Z_][a-zA-Z0-9_]*:/);
110
+ const mhText = nextKey ? mhBlock.substring(0, nextKey.index) : mhBlock;
111
+ for (const { regex, label } of VAGUE_PATTERNS) {
112
+ const match = mhText.match(regex);
113
+ if (match) {
114
+ warnings.push(`Vague criterion detected (${label}): "${match[0]}" — consider a specific threshold or observable behavior`);
115
+ }
116
+ }
117
+ }
118
+ // Blocking: implements:[] is required for REQ-ID traceability (Phase 66)
119
+ if (!frontmatter.includes('implements:')) {
120
+ errors.push('Frontmatter missing required "implements" field (use implements:[] if no requirements apply)');
121
+ }
122
+ }
123
+ }
124
+
125
+ // Count tasks
126
+ const taskMatches = content.match(/<task\b[^>]*>/g) || [];
127
+ const taskCount = taskMatches.length;
128
+
129
+ if (taskCount === 0) {
130
+ errors.push('No <task> elements found');
131
+ } else if (taskCount > 3) {
132
+ errors.push(`Too many tasks: ${taskCount} (max 3 per plan)`);
133
+ }
134
+
135
+ // Check each task has required elements
136
+ const taskTags = content.match(/<task\b[^>]*>/g) || [];
137
+ const taskBlocks = content.split(/<task\b[^>]*>/).slice(1);
138
+ const requiredElements = ['name', 'read_first', 'files', 'action', 'acceptance_criteria', 'verify', 'done'];
139
+
140
+ taskBlocks.forEach((block, index) => {
141
+ const taskEnd = block.indexOf('</task>');
142
+ const taskContent = taskEnd !== -1 ? block.substring(0, taskEnd) : block;
143
+
144
+ // Skip checkpoint tasks - they have different required elements
145
+ const taskTag = taskTags[index] || '';
146
+ if (/\btype\s*=\s*["']?checkpoint/i.test(taskTag) || /\bcheckpoint\s*[:=]/i.test(taskTag)) {
147
+ return; // Checkpoint tasks have different structure
148
+ }
149
+
150
+ for (const elem of requiredElements) {
151
+ if (!taskContent.includes(`<${elem}>`) && !taskContent.includes(`<${elem} `)) {
152
+ errors.push(`Task ${index + 1}: missing <${elem}> element`);
153
+ }
154
+ }
155
+
156
+ // Validate read_first paths don't contain wildcards
157
+ const readFirstMatch = taskContent.match(/<read_first>([\s\S]*?)<\/read_first>/);
158
+ if (readFirstMatch) {
159
+ const rfPaths = readFirstMatch[1].split(/\n/).map(l => l.trim()).filter(Boolean);
160
+ for (const rfPath of rfPaths) {
161
+ if (rfPath.includes('*')) {
162
+ warnings.push(`Task ${index + 1}: read_first should use specific paths, not globs: "${rfPath}"`);
163
+ }
164
+ }
165
+ }
166
+
167
+ // Feature task validation: require <behavior> and <implementation> child elements
168
+ if (taskContent.includes('<feature>')) {
169
+ if (!taskContent.includes('<behavior>') && !taskContent.includes('<behavior ')) {
170
+ errors.push(`Task ${index + 1}: feature task missing <behavior> element`);
171
+ }
172
+ if (!taskContent.includes('<implementation>') && !taskContent.includes('<implementation ')) {
173
+ errors.push(`Task ${index + 1}: feature task missing <implementation> element`);
174
+ }
175
+ }
176
+
177
+ // Informational: automated verify wrapper advisory
178
+ const verifyMatch = taskContent.match(/<verify>([\s\S]*?)<\/verify>/);
179
+ if (verifyMatch && verifyMatch[1].includes('<automated>')) {
180
+ warnings.push(`Task ${index + 1}: uses automated verify wrapper (machine-parseable commands for auto_checkpoints mode)`);
181
+ }
182
+ });
183
+
184
+ // Path traversal check: ensure <files> elements don't escape project root
185
+ const filesTags = content.match(/<files>([\s\S]*?)<\/files>/g) || [];
186
+ for (const filesTag of filesTags) {
187
+ const filesContent = filesTag.replace(/<\/?files>/g, '');
188
+ const paths = filesContent.split(/[\n,]/).map(p => p.trim()).filter(Boolean);
189
+ for (const p of paths) {
190
+ if (p.includes('..') || path.isAbsolute(p.replace(/^[A-Za-z]:/, ''))) {
191
+ warnings.push(`Path traversal risk in <files>: "${p}" — use relative paths without ".." segments`);
192
+ }
193
+ }
194
+ }
195
+
196
+ return { errors, warnings };
197
+ }
198
+
199
+ // ---------------------------------------------------------------------------
200
+ // SUMMARY validation
201
+ // ---------------------------------------------------------------------------
202
+
203
+ function validateSummary(content, _filePath) {
204
+ const errors = [];
205
+ const warnings = [];
206
+
207
+ // Check frontmatter
208
+ if (!content.startsWith('---')) {
209
+ errors.push('Missing YAML frontmatter');
210
+ } else {
211
+ const frontmatterEnd = content.indexOf('---', 3);
212
+ if (frontmatterEnd === -1) {
213
+ errors.push('Unclosed YAML frontmatter');
214
+ } else {
215
+ const frontmatter = content.substring(3, frontmatterEnd);
216
+
217
+ // Required fields -- structural errors
218
+ const requiredFields = ['phase', 'plan', 'status', 'provides', 'requires', 'key_files'];
219
+ for (const field of requiredFields) {
220
+ if (!frontmatter.includes(`${field}:`)) {
221
+ errors.push(`Frontmatter missing "${field}" field`);
222
+ }
223
+ }
224
+
225
+ // Optional but encouraged -- warnings
226
+ if (!frontmatter.includes('deferred:')) {
227
+ warnings.push('Frontmatter missing "deferred" field (forces executor to consciously record scope creep)');
228
+ }
229
+
230
+ // Metrics fields -- warnings only
231
+ if (!frontmatter.includes('duration:')) {
232
+ warnings.push('Frontmatter missing "duration" field (minutes as number — dashboard depends on this)');
233
+ }
234
+ if (!frontmatter.includes('requirements-completed:')) {
235
+ warnings.push('Frontmatter missing "requirements-completed" field (array of REQ-IDs — status skill depends on this)');
236
+ }
237
+
238
+ // Validate key_files paths exist on disk
239
+ const keyFilesMatch = frontmatter.match(/key_files:\s*\n((?:\s+-\s+.*\n?)*)/);
240
+ if (keyFilesMatch) {
241
+ const lines = keyFilesMatch[1].split('\n').filter(l => l.trim().startsWith('-'));
242
+ for (const line of lines) {
243
+ const entryMatch = line.match(/^\s*-\s+"?([^":]+?)(?::.*)?"?\s*$/);
244
+ if (entryMatch) {
245
+ const filePortion = entryMatch[1].trim();
246
+ if (filePortion && !fs.existsSync(filePortion)) {
247
+ warnings.push(`key_files path not found on disk: ${filePortion}`);
248
+ }
249
+ }
250
+ }
251
+ }
252
+
253
+ // Validate deviations structure if present
254
+ const deviationsResult = validateDeviationsField(frontmatter);
255
+ errors.push(...deviationsResult.errors);
256
+ warnings.push(...deviationsResult.warnings);
257
+ }
258
+ }
259
+
260
+ // Body section validation — check that required template sections exist
261
+ // Advisory only (warnings) since executors may use minimal template
262
+ const secondDash = content.indexOf('---', 3);
263
+ if (secondDash !== -1) {
264
+ const body = content.substring(secondDash + 3);
265
+ const hasWhatWasBuilt = /^##\s+What Was Built/m.test(body);
266
+ const hasTaskResults = /^##\s+Task Results/m.test(body);
267
+ const hasSelfCheck = /^##\s+Self-Check/m.test(body);
268
+
269
+ if (!hasWhatWasBuilt && !hasTaskResults) {
270
+ warnings.push('Body missing required section: "## What Was Built" or "## Task Results" (see SUMMARY.md template)');
271
+ }
272
+ if (!hasSelfCheck) {
273
+ warnings.push('Body missing required section: "## Self-Check" (required per all template tiers)');
274
+ }
275
+ }
276
+
277
+ return { errors, warnings };
278
+ }
279
+
280
+ // ---------------------------------------------------------------------------
281
+ // Deviations field validation
282
+ // ---------------------------------------------------------------------------
283
+
284
+ /**
285
+ * Validate the deviations field structure in SUMMARY.md frontmatter.
286
+ * Deviations use a taxonomy: rule (1-4), action (auto|ask), description, justification.
287
+ *
288
+ * @param {string} frontmatter - The frontmatter content (between --- delimiters)
289
+ * @returns {{ errors: string[], warnings: string[] }}
290
+ */
291
+ function validateDeviationsField(frontmatter) {
292
+ const errors = [];
293
+ const warnings = [];
294
+
295
+ const deviationsIdx = frontmatter.indexOf('deviations:');
296
+ if (deviationsIdx === -1) return { errors, warnings };
297
+
298
+ const afterDeviations = frontmatter.substring(deviationsIdx + 'deviations:'.length);
299
+
300
+ // Check if it's an empty/inline value
301
+ const firstLine = afterDeviations.split(/\r?\n/)[0].trim();
302
+ if (firstLine === '[]' || firstLine === 'none' || firstLine === '~' || firstLine === 'null') {
303
+ return { errors, warnings };
304
+ }
305
+
306
+ const itemMatches = afterDeviations.match(/^\s+-\s+rule:/gm);
307
+ if (!itemMatches) return { errors, warnings };
308
+
309
+ const VALID_RULES = [1, 2, 3, 4];
310
+ const VALID_ACTIONS = ['auto', 'ask'];
311
+
312
+ const lines = afterDeviations.split(/\r?\n/);
313
+ let currentItem = null;
314
+ const items = [];
315
+
316
+ for (const line of lines) {
317
+ if (/^\s+-\s+rule:/.test(line)) {
318
+ if (currentItem) items.push(currentItem);
319
+ currentItem = { raw: line };
320
+ const ruleMatch = line.match(/rule:\s*(\d+)/);
321
+ if (ruleMatch) currentItem.rule = parseInt(ruleMatch[1], 10);
322
+ } else if (currentItem) {
323
+ if (/^[a-zA-Z_][a-zA-Z0-9_]*:/.test(line)) break;
324
+ const actionMatch = line.match(/^\s+action:\s*["']?(\w+)/);
325
+ if (actionMatch) currentItem.action = actionMatch[1];
326
+ const descMatch = line.match(/^\s+description:/);
327
+ if (descMatch) currentItem.hasDescription = true;
328
+ }
329
+ }
330
+ if (currentItem) items.push(currentItem);
331
+
332
+ for (let i = 0; i < items.length; i++) {
333
+ const item = items[i];
334
+ if (item.rule !== undefined && !VALID_RULES.includes(item.rule)) {
335
+ errors.push(`deviations[${i}]: invalid rule "${item.rule}" (must be 1-4)`);
336
+ }
337
+ if (item.action && !VALID_ACTIONS.includes(item.action)) {
338
+ errors.push(`deviations[${i}]: invalid action "${item.action}" (must be auto|ask)`);
339
+ }
340
+ if (!item.hasDescription) {
341
+ warnings.push(`deviations[${i}]: missing "description" field`);
342
+ }
343
+ }
344
+
345
+ return { errors, warnings };
346
+ }
347
+
348
+ // ---------------------------------------------------------------------------
349
+ // checkPlanWrite (dispatcher entry point)
350
+ // ---------------------------------------------------------------------------
351
+
352
+ /**
353
+ * Core plan/summary check logic for use by dispatchers.
354
+ * @param {Object} data - Parsed hook input (tool_input, etc.)
355
+ * @returns {Promise<null|{output: Object}>} null if pass or not applicable, result otherwise
356
+ */
357
+ async function checkPlanWrite(data) {
358
+ const filePath = data.tool_input?.file_path || data.tool_input?.path || '';
359
+ const basename = path.basename(filePath);
360
+ const isPlan = /^PLAN.*\.md$/.test(basename);
361
+ const isSummary = basename.includes('SUMMARY') && basename.endsWith('.md');
362
+ const isVerification = basename === 'VERIFICATION.md';
363
+ const isRoadmap = basename === 'ROADMAP.md';
364
+ const isLearnings = basename === 'LEARNINGS.md';
365
+ const isConfig = basename === 'config.json' && filePath.includes('.planning');
366
+ const isResearch = basename === 'RESEARCH.md';
367
+ const isContext = basename === 'CONTEXT.md' && filePath.includes('.planning');
368
+
369
+ if (!isPlan && !isSummary && !isVerification && !isRoadmap && !isLearnings && !isConfig && !isResearch && !isContext) return null;
370
+
371
+ // Todo 015: First-write awareness -- downgrade errors to warnings on Write
372
+ // PostToolUse runs AFTER the write, so fs.existsSync() always returns true.
373
+ // Instead, detect Write vs Edit via tool_name: Write = full file creation/overwrite
374
+ // (likely first attempt), Edit = modifying existing content (refinement).
375
+ // On Write, downgrade blocking errors to advisory warnings so agents aren't
376
+ // blocked on first attempt, reducing false positive block-and-retry cycles.
377
+ const isWriteTool = (data.tool_name || '').toLowerCase() === 'write';
378
+
379
+ if (!fs.existsSync(filePath)) return null;
380
+
381
+ const content = fs.readFileSync(filePath, 'utf8');
382
+ const result = isPlan
383
+ ? validatePlan(content, filePath)
384
+ : isVerification
385
+ ? validateVerification(content, filePath)
386
+ : isRoadmap
387
+ ? validateRoadmap(content, filePath)
388
+ : isLearnings
389
+ ? validateLearnings(content, filePath)
390
+ : isConfig
391
+ ? validateConfig(content, filePath)
392
+ : isResearch
393
+ ? validateResearch(content, filePath)
394
+ : isContext
395
+ ? validateContext(content, filePath)
396
+ : validateSummary(content, filePath);
397
+
398
+ const eventType = isPlan ? 'plan-validated' : isVerification ? 'verification-validated' : isRoadmap ? 'roadmap-validated' : isLearnings ? 'learnings-validated' : isConfig ? 'config-validated' : isResearch ? 'research-validated' : isContext ? 'context-validated' : 'summary-validated';
399
+
400
+ if (result.errors.length > 0) {
401
+ // On Write tool (first creation), downgrade errors to warnings.
402
+ // The agent will see the advisory and can fix on next Edit without
403
+ // wasting a block-and-retry cycle.
404
+ if (isWriteTool) {
405
+ const allIssues = [...result.errors, ...result.warnings];
406
+ logHook('check-plan-format', 'PostToolUse', 'warn-downgraded', { file: basename, errors: result.errors, reason: 'Write tool (first creation)' });
407
+ logEvent('workflow', eventType, { file: basename, status: 'warn-downgraded', errorCount: result.errors.length });
408
+ return { output: { additionalContext: `${basename} advisory (fix on next edit):\n${allIssues.map(i => ` - ${i}`).join('\n')}` } };
409
+ }
410
+
411
+ logHook('check-plan-format', 'PostToolUse', 'block', { file: basename, errors: result.errors });
412
+ logEvent('workflow', eventType, { file: basename, status: 'block', errorCount: result.errors.length });
413
+
414
+ const summary = `${basename} has structural errors that must be fixed.`;
415
+ const explanation = result.errors.map(i => ` - ${i}`).join('\n') +
416
+ (result.warnings.length > 0 ? '\n\nWarnings (non-blocking):\n' + result.warnings.map(i => ` - ${i}`).join('\n') : '');
417
+ const remediation = 'Fix the listed issues and re-save the file.';
418
+ return { output: { decision: 'block', reason: `${summary}\n\n${explanation}\n\n${remediation}` } };
419
+ }
420
+
421
+ if (result.warnings.length > 0) {
422
+ logHook('check-plan-format', 'PostToolUse', 'warn', { file: basename, warnings: result.warnings });
423
+ logEvent('workflow', eventType, { file: basename, status: 'warn', warningCount: result.warnings.length });
424
+ return { output: { additionalContext: `${basename} warnings:\n${result.warnings.map(i => ` - ${i}`).join('\n')}` } };
425
+ }
426
+
427
+ logHook('check-plan-format', 'PostToolUse', 'pass', { file: basename });
428
+ logEvent('workflow', eventType, { file: basename, status: 'pass' });
429
+ return null;
430
+ }
431
+
432
+ // ---------------------------------------------------------------------------
433
+ // STATE validation
434
+ // ---------------------------------------------------------------------------
435
+
436
+ /** All valid STATE.md status values (13 canonical + legacy aliases). */
437
+ const VALID_STATE_STATUSES = [
438
+ 'not_started', 'discussed', 'ready_to_plan', 'planning',
439
+ 'planned', 'ready_to_execute', 'building', 'built',
440
+ 'partial', 'verified', 'needs_fixes', 'complete', 'skipped',
441
+ // Legacy aliases
442
+ 'pending', 'reviewed', 'milestone_complete'
443
+ ];
444
+
445
+ function validateState(content, _filePath) {
446
+ const errors = [];
447
+ const warnings = [];
448
+
449
+ // STATE.md uses warnings (not errors) because it's written by multiple hooks
450
+ // and auto-sync processes. Blocking would create feedback loops.
451
+ if (!content.startsWith('---')) {
452
+ warnings.push('Missing YAML frontmatter');
453
+ } else {
454
+ const frontmatterEnd = content.indexOf('---', 3);
455
+ if (frontmatterEnd === -1) {
456
+ warnings.push('Unclosed YAML frontmatter');
457
+ } else {
458
+ const frontmatter = content.substring(3, frontmatterEnd);
459
+ const requiredFields = ['version', 'current_phase', 'phase_slug', 'status'];
460
+ for (const field of requiredFields) {
461
+ if (!frontmatter.includes(`${field}:`)) {
462
+ warnings.push(`Frontmatter missing "${field}" field`);
463
+ }
464
+ }
465
+
466
+ // Validate status value against the 13-state lifecycle + legacy aliases
467
+ const statusMatch = frontmatter.match(/^status:\s*["']?([^"'\r\n]+)["']?\s*$/m);
468
+ if (statusMatch) {
469
+ const statusValue = statusMatch[1].trim();
470
+ if (!VALID_STATE_STATUSES.includes(statusValue)) {
471
+ warnings.push(`Unknown status value: "${statusValue}" (valid: ${VALID_STATE_STATUSES.slice(0, 13).join(', ')})`);
472
+ }
473
+ }
474
+ }
475
+ }
476
+
477
+ return { errors, warnings };
478
+ }
479
+
480
+ // ---------------------------------------------------------------------------
481
+ // VERIFICATION validation
482
+ // ---------------------------------------------------------------------------
483
+
484
+ function validateVerification(content, filePath) {
485
+ const errors = [];
486
+ const warnings = [];
487
+
488
+ if (!content.startsWith('---')) {
489
+ errors.push('Missing YAML frontmatter');
490
+ } else {
491
+ const frontmatterEnd = content.indexOf('---', 3);
492
+ if (frontmatterEnd === -1) {
493
+ errors.push('Unclosed YAML frontmatter');
494
+ } else {
495
+ const frontmatter = content.substring(3, frontmatterEnd);
496
+ const requiredFields = ['status', 'phase', 'checked_at', 'must_haves_checked', 'must_haves_passed', 'must_haves_failed'];
497
+ for (const field of requiredFields) {
498
+ if (!frontmatter.includes(`${field}:`)) {
499
+ errors.push(`Frontmatter missing "${field}" field`);
500
+ }
501
+ }
502
+
503
+ // Advisory: traceability fields
504
+ if (!/(?:^|\n)\s*satisfied:/.test(frontmatter)) {
505
+ warnings.push('Frontmatter missing "satisfied" field — add satisfied:[] listing REQ-IDs confirmed in this phase');
506
+ }
507
+ if (!frontmatter.includes('unsatisfied:')) {
508
+ warnings.push('Frontmatter missing "unsatisfied" field — add unsatisfied:[] listing REQ-IDs that failed verification');
509
+ }
510
+
511
+ // Advisory: fix_plans field when gaps are found
512
+ const statusMatch = frontmatter.match(/^status:\s*["']?([^"'\r\n]+)["']?\s*$/m);
513
+ const hasGaps = statusMatch && statusMatch[1].trim() === 'gaps_found';
514
+ if (hasGaps && !frontmatter.includes('fix_plans:')) {
515
+ warnings.push('Frontmatter has status "gaps_found" but no "fix_plans" field — add fix_plans with gap/effort/tasks for each gap');
516
+ }
517
+
518
+ // Advisory: gap severity classification
519
+ const gapsFoundMatch = frontmatter.match(/gaps_found:\s*(\d+)/);
520
+ if (gapsFoundMatch && parseInt(gapsFoundMatch[1], 10) > 0) {
521
+ if (!frontmatter.includes('severity:') && !frontmatter.includes('gap_severity:')) {
522
+ warnings.push('Gaps found but no severity classification — add severity (critical|non-critical) to gap entries');
523
+ }
524
+ }
525
+
526
+ // Advisory: must_haves_checked: 0 with PLAN files that have must-haves
527
+ const mustHavesCheckedMatch = frontmatter.match(/must_haves_checked:\s*(\d+)/);
528
+ if (mustHavesCheckedMatch && parseInt(mustHavesCheckedMatch[1], 10) === 0 && filePath) {
529
+ try {
530
+ const phaseDir = path.dirname(filePath);
531
+ const planFiles = fs.readdirSync(phaseDir).filter(f => /^PLAN.*\.md$/i.test(f));
532
+ let totalMustHaves = 0;
533
+ for (const pf of planFiles) {
534
+ try {
535
+ const planContent = fs.readFileSync(path.join(phaseDir, pf), 'utf8');
536
+ const pfmEnd = planContent.indexOf('---', 3);
537
+ if (pfmEnd !== -1) {
538
+ const pfm = planContent.substring(3, pfmEnd);
539
+ // Count non-empty truths and artifacts entries
540
+ const truthsMatch = pfm.match(/truths:\s*\n((?:\s+-\s+.+\n)*)/);
541
+ const artifactsMatch = pfm.match(/artifacts:\s*\n((?:\s+-\s+.+\n)*)/);
542
+ if (truthsMatch && truthsMatch[1].trim()) totalMustHaves += truthsMatch[1].trim().split('\n').length;
543
+ if (artifactsMatch && artifactsMatch[1].trim()) totalMustHaves += artifactsMatch[1].trim().split('\n').length;
544
+ }
545
+ } catch (_planErr) { /* best-effort */ }
546
+ }
547
+ if (totalMustHaves > 0) {
548
+ warnings.push(`VERIFICATION.md has must_haves_checked: 0 but phase has ${totalMustHaves} must-haves in PLAN files. Run /pbr:verify-work to check them.`);
549
+ }
550
+ } catch (_dirErr) { /* best-effort — phase dir may not exist */ }
551
+ }
552
+ }
553
+ }
554
+
555
+ // Body section validation — check that required template sections exist
556
+ // Advisory only (warnings) since verifier output may vary
557
+ const secondDash = content.indexOf('---', 3);
558
+ if (secondDash !== -1) {
559
+ const body = content.substring(secondDash + 3);
560
+ const hasObservableTruths = /^##\s+Observable Truths/m.test(body);
561
+ const hasMustHaveVerification = /^##\s+Must-Have Verification/m.test(body);
562
+ const hasArtifactVerification = /^##\s+Artifact Verification/m.test(body);
563
+ const hasSummary = /^##\s+Summary/m.test(body);
564
+
565
+ if (!hasObservableTruths && !hasMustHaveVerification && !hasArtifactVerification) {
566
+ warnings.push('Body missing required section: "## Observable Truths", "## Must-Have Verification", or "## Artifact Verification" (see VERIFICATION template)');
567
+ }
568
+ if (!hasSummary) {
569
+ warnings.push('Body missing required section: "## Summary" (see VERIFICATION template)');
570
+ }
571
+
572
+ // If status is gaps_found, check for a Gaps section
573
+ const fmEnd = content.indexOf('---', 3);
574
+ if (fmEnd !== -1) {
575
+ const fm = content.substring(3, fmEnd);
576
+ const statusMatch = fm.match(/^status:\s*["']?([^"'\r\n]+)["']?\s*$/m);
577
+ if (statusMatch && statusMatch[1].trim() === 'gaps_found') {
578
+ const hasGapsSection = /^##\s+(Gaps|Critical Gaps|Gap \d)/m.test(body);
579
+ if (!hasGapsSection) {
580
+ warnings.push('Status is "gaps_found" but body missing "## Gaps", "## Critical Gaps", or "## Gap N" section');
581
+ }
582
+ }
583
+ }
584
+ }
585
+
586
+ return { errors, warnings };
587
+ }
588
+
589
+ // ---------------------------------------------------------------------------
590
+ // checkStateWrite (dispatcher entry point)
591
+ // ---------------------------------------------------------------------------
592
+
593
+ /**
594
+ * Separate STATE.md validation for use by dispatchers.
595
+ * Kept separate from checkPlanWrite because STATE.md routing in the
596
+ * dispatcher must happen AFTER roadmap sync.
597
+ */
598
+ async function checkStateWrite(data) {
599
+ const filePath = data.tool_input?.file_path || data.tool_input?.path || '';
600
+ const basename = path.basename(filePath);
601
+ if (basename !== 'STATE.md') return null;
602
+ if (!fs.existsSync(filePath)) return null;
603
+
604
+ let content = fs.readFileSync(filePath, 'utf8');
605
+ const result = validateState(content, filePath);
606
+
607
+ // Auto-fix frontmatter/body drift
608
+ const bodyFixed = await syncStateBody(content, filePath);
609
+ if (bodyFixed) {
610
+ content = bodyFixed.content;
611
+ result.warnings.push(bodyFixed.message);
612
+ }
613
+
614
+ // Line count advisory
615
+ const lineCount = content.split('\n').length;
616
+ if (lineCount > 100) {
617
+ result.warnings.push(`Advisory: STATE.md exceeds 100-line cap (${lineCount} lines). Move history entries older than the current milestone to PROJECT.md or archive.`);
618
+ }
619
+
620
+ if (result.warnings.length > 0) {
621
+ logHook('check-plan-format', 'PostToolUse', 'warn', { file: basename, warnings: result.warnings });
622
+ logEvent('workflow', 'state-validated', { file: basename, status: 'warn', warningCount: result.warnings.length });
623
+ return { output: { additionalContext: `${basename} warnings:\n${result.warnings.map(i => ` - ${i}`).join('\n')}` } };
624
+ }
625
+
626
+ logHook('check-plan-format', 'PostToolUse', 'pass', { file: basename });
627
+ logEvent('workflow', 'state-validated', { file: basename, status: 'pass' });
628
+ return null;
629
+ }
630
+
631
+ // ---------------------------------------------------------------------------
632
+ // syncStateBody
633
+ // ---------------------------------------------------------------------------
634
+
635
+ /**
636
+ * Detect and fix frontmatter/body drift in STATE.md.
637
+ *
638
+ * @param {string} content - Full STATE.md content
639
+ * @param {string} filePath - Absolute path to STATE.md
640
+ * @returns {null|{content: string, message: string}} null if in sync, otherwise the fixed content + message
641
+ */
642
+ async function syncStateBody(content, filePath) {
643
+ if (!content.startsWith('---')) return null;
644
+ const fmEnd = content.indexOf('---', 3);
645
+ if (fmEnd === -1) return null;
646
+
647
+ const fm = content.substring(3, fmEnd);
648
+ const fmPhaseMatch = fm.match(/^current_phase:\s*(\d+)/m);
649
+ const fmSlugMatch = fm.match(/^phase_slug:\s*"?([^"\r\n]+)"?/m);
650
+ const fmNameMatch = fm.match(/^phase_name:\s*"?([^"\r\n]+)"?/m);
651
+ const fmStatusMatch = fm.match(/^status:\s*"?([^"\r\n]+)"?/m);
652
+ const fmPlansMatch = fm.match(/^plans_complete:\s*(\d+)/m);
653
+ const fmProgressMatch = fm.match(/^progress_percent:\s*(\d+)/m);
654
+ const fmActivityMatch = fm.match(/^last_activity:\s*"?([^"\r\n]+)"?/m);
655
+
656
+ if (!fmPhaseMatch) return null;
657
+
658
+ const fmPhase = fmPhaseMatch[1];
659
+ const fmName = fmSlugMatch ? fmSlugMatch[1] : (fmNameMatch ? fmNameMatch[1] : null);
660
+ const fmStatus = fmStatusMatch ? fmStatusMatch[1] : null;
661
+ const fmPlans = fmPlansMatch ? fmPlansMatch[1] : null;
662
+ const fmProgress = fmProgressMatch ? parseInt(fmProgressMatch[1], 10) : null;
663
+ const fmActivity = fmActivityMatch ? fmActivityMatch[1] : null;
664
+
665
+ const bodyPhaseMatch = content.match(/^Phase:\s*(\d+)\s*of\s*(\d+)/m);
666
+ const bodyStatusMatch = content.match(/^Status:\s*(.+)/m);
667
+ const bodyPlansMatch = content.match(/^Plan:\s*(\d+)\s+of\s+(\d+)/m);
668
+ const bodyProgressMatch = content.match(/^Progress:\s*.*?(\d+)%/m);
669
+ const bodyActivityMatch = content.match(/^Last activity:\s*(.+)/im);
670
+
671
+ const drifts = [];
672
+ let updated = content;
673
+
674
+ // Fix phase line drift
675
+ if (bodyPhaseMatch && bodyPhaseMatch[1] !== fmPhase) {
676
+ const bodyTotal = bodyPhaseMatch[2];
677
+ const newPhaseLine = bodyTotal
678
+ ? (fmName ? `Phase: ${fmPhase} of ${bodyTotal} (${fmName})` : `Phase: ${fmPhase} of ${bodyTotal}`)
679
+ : `Phase: ${fmPhase}`;
680
+ updated = updated.replace(/^Phase:\s*\d+\s*of\s*\d+.*/m, newPhaseLine);
681
+ drifts.push(`phase ${bodyPhaseMatch[1]}→${fmPhase}`);
682
+ }
683
+
684
+ // Fix status drift
685
+ if (fmStatus && bodyStatusMatch) {
686
+ const displayStatus = fmStatus.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase());
687
+ const bodyStatus = bodyStatusMatch[1].trim();
688
+ if (bodyStatus.toLowerCase() !== displayStatus.toLowerCase()) {
689
+ updated = updated.replace(/^Status:\s*.+/m, `Status: ${displayStatus}`);
690
+ drifts.push(`status ${bodyStatus}→${displayStatus}`);
691
+ }
692
+ }
693
+
694
+ // Fix plans_complete drift
695
+ if (fmPlans !== null && bodyPlansMatch && bodyPlansMatch[1] !== fmPlans) {
696
+ updated = updated.replace(/^(Plan:\s*)\d+/m, `$1${fmPlans}`);
697
+ drifts.push(`plans ${bodyPlansMatch[1]}→${fmPlans}`);
698
+ }
699
+
700
+ // Fix progress_percent drift
701
+ if (fmProgress !== null && bodyProgressMatch) {
702
+ const bodyPct = parseInt(bodyProgressMatch[1], 10);
703
+ if (bodyPct !== fmProgress) {
704
+ const { buildProgressBar } = require('./state');
705
+ updated = updated.replace(/^Progress:\s*.+/m, `Progress: ${buildProgressBar(fmProgress)}`);
706
+ drifts.push(`progress ${bodyPct}%→${fmProgress}%`);
707
+ }
708
+ }
709
+
710
+ // Fix last_activity drift
711
+ if (fmActivity && bodyActivityMatch) {
712
+ const bodyActivity = bodyActivityMatch[1].trim();
713
+ if (bodyActivity !== fmActivity && !bodyActivity.startsWith(fmActivity)) {
714
+ updated = updated.replace(/^(Last activity:\s*).+/im, `$1${fmActivity}`);
715
+ drifts.push('last_activity');
716
+ }
717
+ }
718
+
719
+ if (drifts.length === 0) return null;
720
+
721
+ try {
722
+ await lockedFileUpdate(filePath, () => updated);
723
+ logHook('check-plan-format', 'PostToolUse', 'body-sync', { drifts });
724
+ return {
725
+ content: updated,
726
+ message: `Auto-fixed body drift: ${drifts.join(', ')} (body now matches frontmatter)`
727
+ };
728
+ } catch (_e) {
729
+ return null;
730
+ }
731
+ }
732
+
733
+ // ---------------------------------------------------------------------------
734
+ // ROADMAP validation
735
+ // ---------------------------------------------------------------------------
736
+
737
+ /**
738
+ * Validate ROADMAP.md structure.
739
+ *
740
+ * @param {string} content - Full ROADMAP.md content
741
+ * @param {string} _filePath - File path (unused)
742
+ * @returns {{ errors: string[], warnings: string[] }}
743
+ */
744
+ function validateRoadmap(content, _filePath) {
745
+ const errors = [];
746
+ const warnings = [];
747
+
748
+ if (!/^#\s+(Roadmap|ROADMAP|Project Roadmap)(:\s*.+)?$/m.test(content)) {
749
+ errors.push('Missing "# Roadmap" heading');
750
+ }
751
+
752
+ // Strip <details>/<summary> HTML tags
753
+ const strippedContent = content
754
+ .replace(/<\/?details>/gi, '')
755
+ .replace(/<\/?summary>/gi, '');
756
+
757
+ const milestoneMatches = strippedContent.match(/^##\s+Milestone:/gm);
758
+ if (!milestoneMatches || milestoneMatches.length === 0) {
759
+ errors.push('No "## Milestone:" sections found');
760
+ } else {
761
+ const milestoneBlocks = strippedContent.split(/^##\s+Milestone:/m).slice(1);
762
+ milestoneBlocks.forEach((block, idx) => {
763
+ const headingLine = block.split('\n')[0] || '';
764
+
765
+ // Skip all structural checks for completed milestones (collapsed format)
766
+ if (/--\s*COMPLETED/i.test(headingLine)) return;
767
+
768
+ if (!/\*\*Phases:\*\*/.test(block)) {
769
+ warnings.push(`Milestone ${idx + 1}: missing "**Phases:**" line`);
770
+ }
771
+
772
+ if (!/###\s+Phase Checklist/.test(block) && !/- \[[ x]\] Phase/i.test(block)) {
773
+ warnings.push(`Milestone ${idx + 1}: missing Phase Checklist (expected "- [ ] Phase NN:" format)`);
774
+ }
775
+
776
+ if (!/\*\*Requirement coverage:\*\*/.test(block)) {
777
+ warnings.push(`Milestone ${idx + 1}: missing "**Requirement coverage:**" line`);
778
+ }
779
+ });
780
+ }
781
+
782
+ // Check each ### Phase NN: (only in active milestones)
783
+ // Extract content from active milestones only (skip COMPLETED blocks)
784
+ const activeMilestoneContent = strippedContent.split(/^##\s+Milestone:/m).slice(1)
785
+ .filter(block => {
786
+ const headingLine = block.split('\n')[0] || '';
787
+ return !/--\s*COMPLETED/i.test(headingLine);
788
+ })
789
+ .join('\n');
790
+
791
+ const phaseRegex = /^###\s+Phase\s+\d+:/gm;
792
+ const phaseMatches = activeMilestoneContent.match(phaseRegex);
793
+
794
+ // Check for sequential phase numbering (advisory)
795
+ if (phaseMatches && phaseMatches.length > 1) {
796
+ const phaseNums = phaseMatches
797
+ .map(m => parseInt(m.match(/\d+/)[0], 10))
798
+ .sort((a, b) => a - b);
799
+ // Check first phase starts at 1
800
+ if (phaseNums[0] > 1) {
801
+ warnings.push(`Phase numbering starts at ${phaseNums[0]} instead of 1 — phases should be numbered sequentially from 1`);
802
+ }
803
+ // Check for gaps
804
+ for (let i = 1; i < phaseNums.length; i++) {
805
+ if (phaseNums[i] !== phaseNums[i - 1] + 1) {
806
+ warnings.push(`Gap in phase numbering: Phase ${phaseNums[i - 1]} → Phase ${phaseNums[i]} (expected ${phaseNums[i - 1] + 1})`);
807
+ }
808
+ }
809
+ }
810
+
811
+ if (phaseMatches) {
812
+ const phaseBlocks = activeMilestoneContent.split(/^###\s+Phase\s+\d+:/m).slice(1);
813
+ phaseBlocks.forEach((block, idx) => {
814
+ const nextHeading = block.search(/^#{2,3}\s+/m);
815
+ const section = nextHeading !== -1 ? block.substring(0, nextHeading) : block;
816
+
817
+ if (!/\*\*Goal:\*\*/.test(section)) {
818
+ warnings.push(`Phase ${idx + 1}: missing "**Goal:**"`);
819
+ }
820
+ if (!/\*\*Provides:\*\*/.test(section)) {
821
+ warnings.push(`Phase ${idx + 1}: missing "**Provides:**"`);
822
+ }
823
+ if (!/\*\*Depends on:\*\*/.test(section)) {
824
+ warnings.push(`Phase ${idx + 1}: missing "**Depends on:**"`);
825
+ }
826
+ if (!/\*\*Requirements:\*\*/.test(section)) {
827
+ warnings.push(`Phase ${idx + 1}: missing "**Requirements:**" (recommended for GSD alignment)`);
828
+ }
829
+ if (!/\*\*Success Criteria:\*\*/.test(section)) {
830
+ warnings.push(`Phase ${idx + 1}: missing "**Success Criteria:**" (recommended for GSD alignment)`);
831
+ }
832
+ });
833
+ }
834
+
835
+ // Check Progress table syntax
836
+ const progressMatch = strippedContent.match(/^##\s+Progress/m);
837
+ if (progressMatch) {
838
+ const afterProgress = strippedContent.substring(progressMatch.index);
839
+ const headerLine = afterProgress.split('\n').find(l => l.includes('|') && /Plans?\s*Complete/i.test(l));
840
+ if (headerLine) {
841
+ const lines = afterProgress.split('\n');
842
+ const headerIdx = lines.findIndex(l => l.includes('|') && /Plans?\s*Complete/i.test(l));
843
+ if (headerIdx >= 0 && headerIdx + 1 < lines.length) {
844
+ const sepLine = lines[headerIdx + 1];
845
+ if (!/^\s*\|[\s-:|]+\|\s*$/.test(sepLine)) {
846
+ warnings.push('Progress table: missing or malformed separator row (expected |---|---|...)');
847
+ }
848
+ }
849
+ } else {
850
+ warnings.push('Progress table: header row with "Plans Complete" column not found');
851
+ }
852
+ }
853
+
854
+ return { errors, warnings };
855
+ }
856
+
857
+ // ---------------------------------------------------------------------------
858
+ // LEARNINGS validation
859
+ // ---------------------------------------------------------------------------
860
+
861
+ /**
862
+ * Validate LEARNINGS.md structure.
863
+ * DEPRECATED: Per-phase LEARNINGS.md is deprecated in favor of .planning/KNOWLEDGE.md.
864
+ */
865
+ function validateLearnings(content, _filePath) {
866
+ const errors = [];
867
+ const warnings = [];
868
+
869
+ warnings.push('Per-phase LEARNINGS.md is deprecated. Use project-scoped .planning/KNOWLEDGE.md instead.');
870
+
871
+ if (!content.startsWith('---')) {
872
+ warnings.push('Missing YAML frontmatter (recommended: phase, key_insights, patterns)');
873
+ return { errors, warnings };
874
+ }
875
+
876
+ const frontmatterEnd = content.indexOf('---', 3);
877
+ if (frontmatterEnd === -1) {
878
+ warnings.push('Unclosed YAML frontmatter');
879
+ return { errors, warnings };
880
+ }
881
+
882
+ const frontmatter = content.substring(3, frontmatterEnd);
883
+
884
+ if (!frontmatter.includes('phase:')) {
885
+ warnings.push('Frontmatter missing "phase" field');
886
+ }
887
+ if (!frontmatter.includes('key_insights:')) {
888
+ warnings.push('Frontmatter missing "key_insights" field');
889
+ }
890
+ if (!frontmatter.includes('patterns:')) {
891
+ warnings.push('Frontmatter missing "patterns" field');
892
+ }
893
+
894
+ const crossProjectMatch = frontmatter.match(/cross_project:\s*(.+)/);
895
+ if (crossProjectMatch) {
896
+ const value = crossProjectMatch[1].trim();
897
+ if (value !== 'true' && value !== 'false') {
898
+ warnings.push('cross_project field should be "true" or "false"');
899
+ }
900
+ }
901
+
902
+ return { errors, warnings };
903
+ }
904
+
905
+ // ---------------------------------------------------------------------------
906
+ // Config validation
907
+ // ---------------------------------------------------------------------------
908
+
909
+ /**
910
+ * Validate .planning/config.json structure.
911
+ */
912
+ function validateConfig(content, _filePath) {
913
+ const errors = [];
914
+ const warnings = [];
915
+
916
+ let parsed;
917
+ try {
918
+ parsed = JSON.parse(content);
919
+ } catch (e) {
920
+ errors.push(`Invalid JSON: ${e.message}`);
921
+ return { errors, warnings };
922
+ }
923
+
924
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
925
+ errors.push('config.json must be a JSON object (not array or primitive)');
926
+ return { errors, warnings };
927
+ }
928
+
929
+ if (parsed.depth !== undefined) {
930
+ if (!['quick', 'standard', 'comprehensive'].includes(parsed.depth)) {
931
+ warnings.push(`Unexpected depth value: "${parsed.depth}" (expected: quick, standard, or comprehensive)`);
932
+ }
933
+ }
934
+
935
+ const knownKeys = ['version', 'schema_version', 'context_strategy', 'mode', 'depth', 'session_phase_limit', 'session_cycling', 'context_window_tokens', 'agent_checkpoint_pct', 'features', 'autonomy', 'models', 'model_profiles', 'parallelization', 'teams', 'planning', 'git', 'gates', 'safety', 'timeouts', 'hooks', 'prd', 'depth_profiles', 'debug', 'developer_profile', 'spinner_tips', 'dashboard', 'status_line', 'workflow', 'hook_server', 'intel', 'context_ledger', 'learnings', 'verification', 'context_budget', 'ui', 'worktree', 'ceremony_level', 'skip_rag_max_lines', 'orchestrator_budget_pct'];
936
+ for (const key of Object.keys(parsed)) {
937
+ if (!knownKeys.includes(key)) {
938
+ warnings.push(`Unknown top-level key: "${key}" (known: ${knownKeys.join(', ')})`);
939
+ }
940
+ }
941
+
942
+ return { errors, warnings };
943
+ }
944
+
945
+ // ---------------------------------------------------------------------------
946
+ // RESEARCH validation
947
+ // ---------------------------------------------------------------------------
948
+
949
+ /**
950
+ * Validate RESEARCH.md structure.
951
+ */
952
+ function validateResearch(content, _filePath) {
953
+ const errors = [];
954
+ const warnings = [];
955
+
956
+ if (!content.startsWith('---')) {
957
+ errors.push('Missing YAML frontmatter (required: confidence, sources_checked)');
958
+ return { errors, warnings };
959
+ }
960
+
961
+ const frontmatterEnd = content.indexOf('---', 3);
962
+ if (frontmatterEnd === -1) {
963
+ errors.push('Unclosed YAML frontmatter');
964
+ return { errors, warnings };
965
+ }
966
+
967
+ const frontmatter = content.substring(3, frontmatterEnd);
968
+
969
+ if (!/confidence\s*:/i.test(frontmatter)) {
970
+ errors.push('Frontmatter missing "confidence" field (expected: high, medium, or low)');
971
+ }
972
+ if (!/sources_checked\s*:/i.test(frontmatter)) {
973
+ errors.push('Frontmatter missing "sources_checked" field');
974
+ }
975
+
976
+ if (!frontmatter.includes('phase:')) {
977
+ warnings.push('Frontmatter missing "phase" field — recommended for phase-level research');
978
+ }
979
+
980
+ return { errors, warnings };
981
+ }
982
+
983
+ // ---------------------------------------------------------------------------
984
+ // CONTEXT validation
985
+ // ---------------------------------------------------------------------------
986
+
987
+ /**
988
+ * Validate CONTEXT.md structure.
989
+ */
990
+ function validateContext(content, _filePath) {
991
+ const errors = [];
992
+ const warnings = [];
993
+
994
+ if (!content || content.trim().length === 0) {
995
+ errors.push('CONTEXT.md is empty — expected frontmatter and section content');
996
+ return { errors, warnings };
997
+ }
998
+
999
+ if (!/<domain>/i.test(content) && !/^##\s+Domain/mi.test(content)) {
1000
+ warnings.push('Missing <domain> section (or ## Domain heading) — recommended for phase context');
1001
+ }
1002
+
1003
+ if (!/<decisions>/i.test(content) && !/^##\s+(Locked\s+)?Decisions/mi.test(content)) {
1004
+ warnings.push('Missing <decisions> section (or ## Decisions heading) — recommended for locked decisions');
1005
+ }
1006
+
1007
+ if (!/<canonical_refs>/i.test(content) && !/^##\s+Canonical\s+Ref/mi.test(content)) {
1008
+ warnings.push('Missing <canonical_refs> section (or ## Canonical References heading) — recommended for reference docs');
1009
+ }
1010
+
1011
+ if (!/<deferred>/i.test(content) && !/^##\s+Deferred/mi.test(content)) {
1012
+ warnings.push('Missing <deferred> section (or ## Deferred heading) — recommended for excluded scope');
1013
+ }
1014
+
1015
+ if (!/<specifics>/i.test(content) && !/^##\s+Specific\s+Ref/mi.test(content)) {
1016
+ warnings.push('Missing <specifics> section (or ## Specific References heading) — recommended for GSD alignment');
1017
+ }
1018
+
1019
+ if (!/<code_context>/i.test(content) && !/^##\s+Code\s+(Patterns?|Context)/mi.test(content)) {
1020
+ warnings.push('Missing <code_context> section (or ## Code Patterns heading) — recommended for GSD alignment');
1021
+ }
1022
+
1023
+ return { errors, warnings };
1024
+ }
1025
+
1026
+ // ---------------------------------------------------------------------------
1027
+ // Exports
1028
+ // ---------------------------------------------------------------------------
1029
+
1030
+ module.exports = {
1031
+ validateMustHaves,
1032
+ PLAN_REQUIRED_FIELDS,
1033
+ PLAN_VALID_TYPES,
1034
+ VAGUE_PATTERNS,
1035
+ validatePlan,
1036
+ validateSummary,
1037
+ validateDeviationsField,
1038
+ checkPlanWrite,
1039
+ VALID_STATE_STATUSES,
1040
+ validateState,
1041
+ validateVerification,
1042
+ checkStateWrite,
1043
+ syncStateBody,
1044
+ validateRoadmap,
1045
+ validateLearnings,
1046
+ validateConfig,
1047
+ validateResearch,
1048
+ validateContext
1049
+ };