@sienklogic/plan-build-run 2.19.0 → 2.19.1

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