@sienklogic/plan-build-run 2.21.0 → 2.21.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (983) hide show
  1. package/CHANGELOG.md +1331 -299
  2. package/CLAUDE.md +75 -40
  3. package/LICENSE +2 -1
  4. package/README.md +412 -177
  5. package/bin/install.js +2752 -0
  6. package/dashboard/bin/cli.cjs +96 -0
  7. package/dashboard/bin/stop.cjs +129 -0
  8. package/dashboard/eslint.config.js +37 -0
  9. package/dashboard/index.html +20 -0
  10. package/dashboard/package.json +27 -25
  11. package/dashboard/server/index.js +151 -0
  12. package/dashboard/server/lib/frontmatter.js +92 -0
  13. package/dashboard/server/middleware/static.js +35 -0
  14. package/dashboard/server/package.json +16 -0
  15. package/dashboard/server/routes/agents.js +234 -0
  16. package/dashboard/server/routes/config.js +64 -0
  17. package/dashboard/server/routes/health.js +98 -0
  18. package/dashboard/server/routes/incidents.js +78 -0
  19. package/dashboard/server/routes/intel.js +69 -0
  20. package/dashboard/server/routes/memory.js +107 -0
  21. package/dashboard/server/routes/planning.js +234 -0
  22. package/dashboard/server/routes/progress.js +77 -0
  23. package/dashboard/server/routes/projects.js +36 -0
  24. package/dashboard/server/routes/requirements.js +40 -0
  25. package/dashboard/server/routes/roadmap.js +69 -0
  26. package/dashboard/server/routes/sessions.js +70 -0
  27. package/dashboard/server/routes/status.js +25 -0
  28. package/dashboard/server/routes/telemetry.js +233 -0
  29. package/dashboard/server/services/file-watcher.js +105 -0
  30. package/dashboard/server/services/planning-reader.js +727 -0
  31. package/dashboard/server/test/cli.test.js +34 -0
  32. package/dashboard/server/test/frontmatter.test.js +104 -0
  33. package/dashboard/server/test/isolation.test.js +32 -0
  34. package/dashboard/server/test/planning-reader.test.js +151 -0
  35. package/dashboard/server/test/routes.test.js +91 -0
  36. package/dashboard/server/test/ws.test.js +81 -0
  37. package/dashboard/server/ws.js +96 -0
  38. package/dashboard/src/App.jsx +165 -0
  39. package/dashboard/src/components/charts/BudgetBars.jsx +42 -0
  40. package/dashboard/src/components/charts/ContextRadar.jsx +34 -0
  41. package/dashboard/src/components/charts/PhaseDonut.jsx +66 -0
  42. package/dashboard/src/components/charts/SuccessTrend.jsx +45 -0
  43. package/dashboard/src/components/charts/TokenChart.jsx +55 -0
  44. package/dashboard/src/components/charts/index.js +5 -0
  45. package/dashboard/src/components/config/CfgSection.jsx +93 -0
  46. package/dashboard/src/components/layout/Header.jsx +89 -0
  47. package/dashboard/src/components/layout/ProjectSwitcher.jsx +160 -0
  48. package/dashboard/src/components/layout/Sidebar.jsx +161 -0
  49. package/dashboard/src/components/ui/AutoModeBanner.jsx +138 -0
  50. package/dashboard/src/components/ui/BackButton.jsx +27 -0
  51. package/dashboard/src/components/ui/Badge.jsx +27 -0
  52. package/dashboard/src/components/ui/Card.jsx +23 -0
  53. package/dashboard/src/components/ui/ChartTooltip.jsx +48 -0
  54. package/dashboard/src/components/ui/CheckpointBox.jsx +110 -0
  55. package/dashboard/src/components/ui/CodeBlock.jsx +27 -0
  56. package/dashboard/src/components/ui/ConfidenceBadge.jsx +20 -0
  57. package/dashboard/src/components/ui/ConfirmModal.jsx +161 -0
  58. package/dashboard/src/components/ui/ConnectionBanner.jsx +60 -0
  59. package/dashboard/src/components/ui/ErrorBoundary.jsx +106 -0
  60. package/dashboard/src/components/ui/ErrorBox.jsx +107 -0
  61. package/dashboard/src/components/ui/KeyValue.jsx +33 -0
  62. package/dashboard/src/components/ui/LoadingSkeleton.jsx +84 -0
  63. package/dashboard/src/components/ui/MetricCard.jsx +58 -0
  64. package/dashboard/src/components/ui/NextUpBlock.jsx +92 -0
  65. package/dashboard/src/components/ui/NumberInput.jsx +44 -0
  66. package/dashboard/src/components/ui/PBRBanner.jsx +47 -0
  67. package/dashboard/src/components/ui/PipelineView.jsx +130 -0
  68. package/dashboard/src/components/ui/ProgressBar.jsx +28 -0
  69. package/dashboard/src/components/ui/ProgressDisplay.jsx +47 -0
  70. package/dashboard/src/components/ui/QualityGateBadge.jsx +15 -0
  71. package/dashboard/src/components/ui/SectionTitle.jsx +35 -0
  72. package/dashboard/src/components/ui/SelectInput.jsx +45 -0
  73. package/dashboard/src/components/ui/StatusDot.jsx +51 -0
  74. package/dashboard/src/components/ui/StatusSymbol.jsx +49 -0
  75. package/dashboard/src/components/ui/TabBar.jsx +41 -0
  76. package/dashboard/src/components/ui/TextInput.jsx +42 -0
  77. package/dashboard/src/components/ui/Toast.jsx +117 -0
  78. package/dashboard/src/components/ui/Toggle.jsx +70 -0
  79. package/dashboard/src/components/ui/index.js +29 -0
  80. package/dashboard/src/hooks/useDocumentTitle.js +16 -0
  81. package/dashboard/src/hooks/useFetch.js +50 -0
  82. package/dashboard/src/hooks/useToast.jsx +43 -0
  83. package/dashboard/src/hooks/useWebSocket.js +103 -0
  84. package/dashboard/src/lib/api.js +112 -0
  85. package/dashboard/src/lib/configSchema.js +189 -0
  86. package/dashboard/src/lib/constants.js +22 -0
  87. package/dashboard/src/main.jsx +15 -0
  88. package/dashboard/src/pages/AgentsPage.jsx +191 -0
  89. package/dashboard/src/pages/ConfigPage.jsx +298 -0
  90. package/dashboard/src/pages/HooksPage.jsx +412 -0
  91. package/dashboard/src/pages/IncidentsPage.jsx +135 -0
  92. package/dashboard/src/pages/IntelPage.jsx +193 -0
  93. package/dashboard/src/pages/LiveFeed.jsx +274 -0
  94. package/dashboard/src/pages/MemoryPage.jsx +107 -0
  95. package/dashboard/src/pages/OnboardingPage.jsx +117 -0
  96. package/dashboard/src/pages/Overview.jsx +360 -0
  97. package/dashboard/src/pages/PhaseDetailView.jsx +216 -0
  98. package/dashboard/src/pages/PlanningPage.jsx +181 -0
  99. package/dashboard/src/pages/ProgressPage.jsx +249 -0
  100. package/dashboard/src/pages/ResearchPage.jsx +129 -0
  101. package/dashboard/src/pages/RoadmapPage.jsx +251 -0
  102. package/dashboard/src/pages/SessionsPage.jsx +117 -0
  103. package/dashboard/src/pages/Telemetry.jsx +166 -0
  104. package/dashboard/src/pages/planning/DecisionsTab.jsx +153 -0
  105. package/dashboard/src/pages/planning/FilesTab.jsx +420 -0
  106. package/dashboard/src/pages/planning/MilestoneDetail.jsx +319 -0
  107. package/dashboard/src/pages/planning/MilestonesTab.jsx +151 -0
  108. package/dashboard/src/pages/planning/NotesTab.jsx +251 -0
  109. package/dashboard/src/pages/planning/PhasesTab.jsx +218 -0
  110. package/dashboard/src/pages/planning/QuickTab.jsx +50 -0
  111. package/dashboard/src/pages/planning/ResearchTab.jsx +103 -0
  112. package/dashboard/src/pages/planning/TodosTab.jsx +297 -0
  113. package/dashboard/src/theme/ThemeProvider.jsx +38 -0
  114. package/dashboard/src/theme/tokens.js +17 -0
  115. package/dashboard/tests/components/ConfirmModal.test.jsx +179 -0
  116. package/dashboard/tests/components/ConnectionBanner.test.jsx +37 -0
  117. package/dashboard/tests/components/ErrorBoundary.test.jsx +59 -0
  118. package/dashboard/tests/components/LoadingSkeleton.test.jsx +46 -0
  119. package/dashboard/tests/components/ToastContainer.test.jsx +47 -0
  120. package/dashboard/tests/components/Toggle.test.jsx +61 -0
  121. package/dashboard/tests/hooks/useFetch.test.jsx +77 -0
  122. package/dashboard/tests/hooks/useToast.test.jsx +78 -0
  123. package/dashboard/tests/hooks/useWebSocket.test.jsx +128 -0
  124. package/dashboard/tests/pages/ConfigPage.test.jsx +199 -0
  125. package/dashboard/tests/pages/PlanningPage.test.jsx +119 -0
  126. package/dashboard/tests/pages/planning/FilesTab.test.jsx +198 -0
  127. package/dashboard/tests/pages/planning/NotesTab.test.jsx +178 -0
  128. package/dashboard/tests/pages/planning/TodosTab.test.jsx +188 -0
  129. package/dashboard/tests/performance.test.jsx +46 -0
  130. package/dashboard/tests/routes/config.test.js +98 -0
  131. package/dashboard/tests/routes/health.test.js +40 -0
  132. package/dashboard/tests/routes/planning.test.js +112 -0
  133. package/dashboard/tests/routes/roadmap.test.js +91 -0
  134. package/dashboard/tests/routes/status.test.js +131 -0
  135. package/dashboard/tests/server/planning-reader.test.js +153 -0
  136. package/dashboard/tests/setup.js +7 -0
  137. package/dashboard/vite.config.js +41 -0
  138. package/package.json +56 -41
  139. package/plan-build-run/bin/config-schema.json +1298 -0
  140. package/plugins/pbr/.claude-plugin/plugin.json +1 -1
  141. package/plugins/pbr/CLAUDE.md +19 -0
  142. package/plugins/pbr/UI-CONSISTENCY-GAPS.md +1 -1
  143. package/plugins/pbr/agents/advisor-researcher.md +101 -0
  144. package/plugins/pbr/agents/audit.md +207 -89
  145. package/plugins/pbr/agents/codebase-mapper.md +158 -23
  146. package/plugins/pbr/agents/debugger.md +212 -34
  147. package/plugins/pbr/agents/dev-sync.md +206 -0
  148. package/plugins/pbr/agents/executor.md +737 -39
  149. package/plugins/pbr/agents/general.md +71 -6
  150. package/plugins/pbr/agents/integration-checker.md +148 -30
  151. package/plugins/pbr/agents/intel-updater.md +332 -0
  152. package/plugins/pbr/agents/nyquist-auditor.md +254 -0
  153. package/plugins/pbr/agents/plan-checker.md +268 -66
  154. package/plugins/pbr/agents/planner.md +451 -42
  155. package/plugins/pbr/agents/researcher.md +219 -36
  156. package/plugins/pbr/agents/roadmapper.md +398 -0
  157. package/plugins/pbr/agents/synthesizer.md +166 -26
  158. package/plugins/pbr/agents/ui-checker.md +204 -0
  159. package/plugins/pbr/agents/ui-researcher.md +224 -0
  160. package/plugins/pbr/agents/verifier.md +571 -47
  161. package/plugins/pbr/commands/add-phase.md +75 -0
  162. package/plugins/pbr/commands/add-todo.md +8 -0
  163. package/plugins/pbr/commands/audit-fix.md +5 -0
  164. package/plugins/pbr/commands/audit-milestone.md +8 -0
  165. package/plugins/pbr/commands/autonomous.md +5 -0
  166. package/plugins/pbr/commands/backlog.md +6 -0
  167. package/plugins/pbr/commands/check-todos.md +8 -0
  168. package/plugins/pbr/commands/complete-milestone.md +8 -0
  169. package/plugins/pbr/commands/config.md +1 -1
  170. package/plugins/pbr/commands/discuss-phase.md +6 -0
  171. package/plugins/pbr/commands/do.md +5 -0
  172. package/plugins/pbr/commands/execute-phase.md +6 -0
  173. package/plugins/pbr/commands/fast.md +6 -0
  174. package/plugins/pbr/commands/forensics.md +6 -0
  175. package/plugins/pbr/commands/import.md +1 -1
  176. package/plugins/pbr/commands/insert-phase.md +65 -0
  177. package/plugins/pbr/commands/intel.md +5 -0
  178. package/plugins/pbr/commands/join-discord.md +11 -0
  179. package/plugins/pbr/commands/list-phase-assumptions.md +5 -0
  180. package/plugins/pbr/commands/map-codebase.md +6 -0
  181. package/plugins/pbr/commands/milestone-summary.md +6 -0
  182. package/plugins/pbr/commands/new-milestone.md +8 -0
  183. package/plugins/pbr/commands/new-project.md +6 -0
  184. package/plugins/pbr/commands/pause-work.md +5 -0
  185. package/plugins/pbr/commands/plan-milestone-gaps.md +7 -0
  186. package/plugins/pbr/commands/plan-phase.md +6 -0
  187. package/plugins/pbr/commands/plant-seed.md +6 -0
  188. package/plugins/pbr/commands/profile-user.md +5 -0
  189. package/plugins/pbr/commands/profile.md +5 -0
  190. package/plugins/pbr/commands/progress.md +6 -0
  191. package/plugins/pbr/commands/quick.md +1 -1
  192. package/plugins/pbr/commands/reapply-patches.md +47 -0
  193. package/plugins/pbr/commands/release.md +6 -0
  194. package/plugins/pbr/commands/remove-phase.md +66 -0
  195. package/plugins/pbr/commands/research-phase.md +59 -0
  196. package/plugins/pbr/commands/resume-work.md +5 -0
  197. package/plugins/pbr/commands/seed.md +6 -0
  198. package/plugins/pbr/commands/session-report.md +5 -0
  199. package/plugins/pbr/commands/set-profile.md +6 -0
  200. package/plugins/pbr/commands/settings.md +5 -0
  201. package/plugins/pbr/commands/setup.md +1 -1
  202. package/plugins/pbr/commands/ship.md +5 -0
  203. package/plugins/pbr/commands/stats.md +6 -0
  204. package/plugins/pbr/commands/test.md +5 -0
  205. package/plugins/pbr/commands/thread.md +6 -0
  206. package/plugins/pbr/commands/todo.md +1 -1
  207. package/plugins/pbr/commands/ui-phase.md +5 -0
  208. package/plugins/pbr/commands/ui-review.md +5 -0
  209. package/plugins/pbr/commands/undo.md +5 -0
  210. package/plugins/pbr/commands/update.md +37 -0
  211. package/plugins/pbr/commands/validate-phase.md +5 -0
  212. package/plugins/pbr/commands/verify-work.md +6 -0
  213. package/plugins/pbr/dashboard/package-lock.json +6 -0
  214. package/plugins/pbr/dist/architecture-guard.js +76 -0
  215. package/plugins/pbr/dist/audit-dimensions.js +556 -0
  216. package/plugins/pbr/dist/auto-continue.js +277 -0
  217. package/plugins/pbr/dist/block-skill-self-read.js +124 -0
  218. package/plugins/pbr/dist/check-agent-state-write.js +63 -0
  219. package/plugins/pbr/dist/check-config-change.js +213 -0
  220. package/plugins/pbr/dist/check-cross-plugin-sync.js +93 -0
  221. package/plugins/pbr/dist/check-dangerous-commands.js +193 -0
  222. package/plugins/pbr/dist/check-direct-state-write.js +37 -0
  223. package/plugins/pbr/dist/check-doc-sprawl.js +102 -0
  224. package/plugins/pbr/dist/check-phase-boundary.js +191 -0
  225. package/plugins/pbr/dist/check-plan-format.js +227 -0
  226. package/plugins/pbr/dist/check-read-first.js +345 -0
  227. package/plugins/pbr/dist/check-roadmap-sync.js +507 -0
  228. package/plugins/pbr/dist/check-skill-workflow.js +354 -0
  229. package/plugins/pbr/dist/check-state-sync.js +676 -0
  230. package/plugins/pbr/dist/check-subagent-output.js +425 -0
  231. package/plugins/pbr/dist/check-summary-gate.js +188 -0
  232. package/plugins/pbr/dist/context-bridge.js +425 -0
  233. package/plugins/pbr/dist/context-budget-check.js +442 -0
  234. package/plugins/pbr/dist/context-quality.js +271 -0
  235. package/plugins/pbr/dist/enforce-context-budget.js +138 -0
  236. package/plugins/pbr/dist/enforce-pbr-workflow.js +277 -0
  237. package/plugins/pbr/dist/event-handler.js +212 -0
  238. package/plugins/pbr/dist/event-logger.js +125 -0
  239. package/plugins/pbr/dist/feedback-loop.js +155 -0
  240. package/plugins/pbr/dist/graph-update.js +422 -0
  241. package/plugins/pbr/dist/hook-logger.js +114 -0
  242. package/plugins/pbr/dist/hook-server-client.js +361 -0
  243. package/plugins/pbr/dist/hook-server.js +664 -0
  244. package/plugins/pbr/dist/hooks-schema.json +87 -0
  245. package/plugins/pbr/dist/instructions-loaded.js +173 -0
  246. package/plugins/pbr/dist/intercept-plan-mode.js +81 -0
  247. package/plugins/pbr/dist/log-notification.js +131 -0
  248. package/plugins/pbr/dist/log-subagent.js +367 -0
  249. package/plugins/pbr/dist/log-tool-failure.js +140 -0
  250. package/plugins/pbr/dist/milestone-learnings.js +519 -0
  251. package/plugins/pbr/dist/pbr-tools.js +493 -0
  252. package/plugins/pbr/dist/post-bash-triage.js +96 -0
  253. package/plugins/pbr/dist/post-compact.js +135 -0
  254. package/plugins/pbr/dist/post-hoc.js +237 -0
  255. package/plugins/pbr/dist/post-write-dispatch.js +243 -0
  256. package/plugins/pbr/dist/post-write-quality.js +208 -0
  257. package/plugins/pbr/dist/pre-bash-dispatch.js +212 -0
  258. package/plugins/pbr/dist/pre-skill-dispatch.js +114 -0
  259. package/plugins/pbr/dist/pre-task-dispatch.js +269 -0
  260. package/plugins/pbr/dist/pre-write-dispatch.js +234 -0
  261. package/plugins/pbr/dist/progress-tracker.js +173 -0
  262. package/plugins/pbr/dist/prompt-guard.js +114 -0
  263. package/plugins/pbr/dist/prompt-routing.js +209 -0
  264. package/plugins/pbr/dist/quick-status.js +179 -0
  265. package/plugins/pbr/dist/record-incident.js +37 -0
  266. package/plugins/pbr/dist/run-hook.js +132 -0
  267. package/plugins/pbr/dist/session-cleanup.js +653 -0
  268. package/plugins/pbr/dist/session-tracker.js +124 -0
  269. package/plugins/pbr/dist/status-line.js +849 -0
  270. package/plugins/pbr/dist/suggest-compact.js +307 -0
  271. package/plugins/pbr/dist/sync-context-to-claude.js +100 -0
  272. package/plugins/pbr/dist/task-completed.js +206 -0
  273. package/plugins/pbr/dist/track-context-budget.js +432 -0
  274. package/plugins/pbr/dist/track-user-gates.js +88 -0
  275. package/plugins/pbr/dist/trust-tracker.js +193 -0
  276. package/plugins/pbr/dist/validate-commit.js +233 -0
  277. package/plugins/pbr/dist/validate-skill-args.js +222 -0
  278. package/plugins/pbr/dist/validate-task.js +271 -0
  279. package/plugins/pbr/dist/worktree-create.js +144 -0
  280. package/plugins/pbr/dist/worktree-remove.js +147 -0
  281. package/plugins/pbr/hooks/hooks.json +137 -65
  282. package/plugins/pbr/references/agent-contracts.md +39 -8
  283. package/plugins/pbr/references/agent-teams.md +3 -3
  284. package/plugins/pbr/references/archive/checkpoints.md +189 -0
  285. package/plugins/pbr/references/archive/context-quality-tiers.md +45 -0
  286. package/plugins/pbr/references/archive/hook-ordering.md +89 -0
  287. package/plugins/pbr/references/archive/limitations.md +106 -0
  288. package/plugins/pbr/references/archive/pbr-rules.md +194 -0
  289. package/plugins/pbr/references/archive/pbr-tools-cli.md +415 -0
  290. package/plugins/pbr/references/archive/pretooluse-jsonl-behavior.md +58 -0
  291. package/plugins/pbr/references/archive/signal-files.md +41 -0
  292. package/plugins/pbr/references/archive/tmux-setup.md +288 -0
  293. package/plugins/pbr/references/archive/verification-matrix.md +34 -0
  294. package/plugins/pbr/references/archive/verification-patterns.md +277 -0
  295. package/plugins/pbr/references/archive/worktree-sparse-checkout.md +86 -0
  296. package/plugins/pbr/references/assumptions.md +42 -0
  297. package/plugins/pbr/references/checkpoints.md +723 -104
  298. package/plugins/pbr/references/config-reference.md +387 -10
  299. package/plugins/pbr/references/continuation-format.md +1 -0
  300. package/plugins/pbr/references/decimal-phase-calculation.md +65 -0
  301. package/plugins/pbr/references/deviation-rules.md +12 -0
  302. package/plugins/pbr/references/few-shot-examples/audit.md +77 -0
  303. package/plugins/pbr/references/few-shot-examples/check-plan-format.md +172 -0
  304. package/plugins/pbr/references/few-shot-examples/check-subagent-output.md +118 -0
  305. package/plugins/pbr/references/few-shot-examples/integration-checker.md +70 -0
  306. package/plugins/pbr/references/few-shot-examples/nyquist-auditor.md +83 -0
  307. package/plugins/pbr/references/few-shot-examples/plan-checker.md +73 -0
  308. package/plugins/pbr/references/few-shot-examples/ui-checker.md +71 -0
  309. package/plugins/pbr/references/few-shot-examples/verifier.md +109 -0
  310. package/plugins/pbr/references/git-integration.md +110 -27
  311. package/plugins/pbr/references/git-planning-commit.md +35 -0
  312. package/plugins/pbr/references/model-profile-resolution.md +34 -0
  313. package/plugins/pbr/references/model-profiles.md +90 -7
  314. package/plugins/pbr/references/model-selection.md +1 -1
  315. package/plugins/pbr/references/node-repair.md +48 -0
  316. package/plugins/pbr/references/plan-authoring.md +65 -0
  317. package/plugins/pbr/references/plan-format.md +184 -10
  318. package/plugins/pbr/references/questioning.md +138 -49
  319. package/plugins/pbr/references/reading-verification.md +4 -4
  320. package/plugins/pbr/references/tdd.md +263 -0
  321. package/plugins/pbr/references/thinking-models-planning.md +47 -0
  322. package/plugins/pbr/references/thinking-models-verification.md +44 -0
  323. package/plugins/pbr/references/ui-brand.md +449 -0
  324. package/plugins/pbr/references/verification-overrides.md +39 -0
  325. package/plugins/pbr/references/verification-patterns.md +529 -113
  326. package/plugins/pbr/scripts/architecture-guard.js +76 -0
  327. package/plugins/pbr/scripts/audit-checks/behavioral-compliance.js +2098 -0
  328. package/plugins/pbr/scripts/audit-checks/error-analysis.js +989 -0
  329. package/plugins/pbr/scripts/audit-checks/feature-verification.js +723 -0
  330. package/plugins/pbr/scripts/audit-checks/index.js +433 -0
  331. package/plugins/pbr/scripts/audit-checks/infrastructure.js +816 -0
  332. package/plugins/pbr/scripts/audit-checks/quality-metrics.js +455 -0
  333. package/plugins/pbr/scripts/audit-checks/session-quality.js +980 -0
  334. package/plugins/pbr/scripts/audit-checks/si-agent-hook-config-checks.js +396 -0
  335. package/plugins/pbr/scripts/audit-checks/si-cross-cutting-checks.js +272 -0
  336. package/plugins/pbr/scripts/audit-checks/si-skill-checks.js +424 -0
  337. package/plugins/pbr/scripts/audit-checks/workflow-compliance.js +1175 -0
  338. package/plugins/pbr/scripts/audit-dimensions.js +556 -0
  339. package/plugins/pbr/scripts/auto-continue.js +192 -37
  340. package/plugins/pbr/scripts/block-skill-self-read.js +124 -0
  341. package/plugins/pbr/scripts/check-agent-state-write.js +63 -0
  342. package/plugins/pbr/scripts/check-config-change.js +84 -1
  343. package/plugins/pbr/scripts/check-cross-plugin-sync.js +93 -0
  344. package/plugins/pbr/scripts/check-dangerous-commands.js +18 -5
  345. package/plugins/pbr/scripts/check-direct-state-write.js +37 -0
  346. package/plugins/pbr/scripts/check-phase-boundary.js +3 -8
  347. package/plugins/pbr/scripts/check-plan-format.js +153 -278
  348. package/plugins/pbr/scripts/check-read-first.js +345 -0
  349. package/plugins/pbr/scripts/check-roadmap-sync.js +174 -19
  350. package/plugins/pbr/scripts/check-skill-workflow.js +24 -27
  351. package/plugins/pbr/scripts/check-state-sync.js +360 -218
  352. package/plugins/pbr/scripts/check-subagent-output.js +308 -273
  353. package/plugins/pbr/scripts/check-summary-gate.js +5 -15
  354. package/plugins/pbr/scripts/commands/benchmarks.js +195 -0
  355. package/plugins/pbr/scripts/commands/calibrate.js +530 -0
  356. package/plugins/pbr/scripts/commands/config.js +72 -0
  357. package/plugins/pbr/scripts/commands/misc.js +779 -0
  358. package/plugins/pbr/scripts/commands/phase.js +293 -0
  359. package/plugins/pbr/scripts/commands/roadmap.js +75 -0
  360. package/plugins/pbr/scripts/commands/state.js +84 -0
  361. package/plugins/pbr/scripts/commands/stress-test.js +349 -0
  362. package/plugins/pbr/scripts/commands/todo.js +191 -0
  363. package/plugins/pbr/scripts/commands/verify.js +169 -0
  364. package/plugins/pbr/scripts/config-schema.json +1183 -95
  365. package/plugins/pbr/scripts/context-bridge.js +425 -0
  366. package/plugins/pbr/scripts/context-budget-check.js +171 -16
  367. package/plugins/pbr/scripts/context-quality.js +271 -0
  368. package/plugins/pbr/scripts/enforce-context-budget.js +138 -0
  369. package/plugins/pbr/scripts/enforce-pbr-workflow.js +277 -0
  370. package/plugins/pbr/scripts/event-handler.js +137 -87
  371. package/plugins/pbr/scripts/event-logger.js +58 -25
  372. package/plugins/pbr/scripts/feedback-loop.js +155 -0
  373. package/plugins/pbr/scripts/graph-update.js +422 -0
  374. package/plugins/pbr/scripts/hook-logger.js +69 -35
  375. package/plugins/pbr/scripts/hook-server-client.js +361 -0
  376. package/plugins/pbr/scripts/hook-server.js +664 -0
  377. package/plugins/pbr/scripts/hooks-schema.json +12 -5
  378. package/plugins/pbr/scripts/instructions-loaded.js +173 -0
  379. package/plugins/pbr/scripts/intent-router.cjs +147 -0
  380. package/plugins/pbr/scripts/intercept-plan-mode.js +52 -18
  381. package/plugins/pbr/scripts/lib/alternatives.js +203 -0
  382. package/plugins/pbr/scripts/lib/audit.js +65 -0
  383. package/plugins/pbr/scripts/lib/auto-cleanup.js +221 -0
  384. package/plugins/pbr/scripts/lib/auto-verify.js +123 -0
  385. package/plugins/pbr/scripts/lib/benchmark.js +190 -0
  386. package/plugins/pbr/scripts/lib/build.js +719 -0
  387. package/plugins/pbr/scripts/lib/ci-fix-loop.js +228 -0
  388. package/plugins/pbr/scripts/lib/commands.js +483 -0
  389. package/plugins/pbr/scripts/lib/compound.js +222 -0
  390. package/plugins/pbr/scripts/lib/config-cache.js +83 -0
  391. package/plugins/pbr/scripts/lib/config.js +1469 -0
  392. package/plugins/pbr/scripts/lib/context.js +254 -0
  393. package/plugins/pbr/scripts/lib/contextual-help.js +183 -0
  394. package/plugins/pbr/scripts/lib/convention-detector.js +413 -0
  395. package/plugins/pbr/scripts/lib/core.js +1585 -0
  396. package/plugins/pbr/scripts/lib/dashboard-launch.js +364 -0
  397. package/plugins/pbr/scripts/lib/data-hygiene.js +179 -0
  398. package/plugins/pbr/scripts/lib/decision-extraction.js +183 -0
  399. package/plugins/pbr/scripts/lib/decisions.js +194 -0
  400. package/plugins/pbr/scripts/lib/dependency-break.js +147 -0
  401. package/plugins/pbr/scripts/lib/format-validators.js +1049 -0
  402. package/plugins/pbr/scripts/lib/frontmatter.js +302 -0
  403. package/plugins/pbr/scripts/lib/gates/advisories.js +133 -0
  404. package/plugins/pbr/scripts/lib/gates/build-dependency.js +118 -0
  405. package/plugins/pbr/scripts/lib/gates/build-executor.js +106 -0
  406. package/plugins/pbr/scripts/lib/gates/doc-existence.js +46 -0
  407. package/plugins/pbr/scripts/lib/gates/helpers.js +98 -0
  408. package/plugins/pbr/scripts/lib/gates/inline-execution.js +187 -0
  409. package/plugins/pbr/scripts/lib/gates/milestone-complete.js +139 -0
  410. package/plugins/pbr/scripts/lib/gates/milestone-summary.js +121 -0
  411. package/plugins/pbr/scripts/lib/gates/multi-phase-loader.js +149 -0
  412. package/plugins/pbr/scripts/lib/gates/plan-executor.js +36 -0
  413. package/plugins/pbr/scripts/lib/gates/plan-validation.js +115 -0
  414. package/plugins/pbr/scripts/lib/gates/quick-executor.js +78 -0
  415. package/plugins/pbr/scripts/lib/gates/review-planner.js +63 -0
  416. package/plugins/pbr/scripts/lib/gates/review-verifier.js +71 -0
  417. package/plugins/pbr/scripts/lib/gates/rich-agent-context.js +148 -0
  418. package/plugins/pbr/scripts/lib/gates/sprint-preflight.js +30 -0
  419. package/plugins/pbr/scripts/lib/gates/user-confirmation.js +95 -0
  420. package/plugins/pbr/scripts/lib/graph-cli.js +89 -0
  421. package/plugins/pbr/scripts/lib/graph.js +553 -0
  422. package/plugins/pbr/scripts/lib/handoff-validators.js +224 -0
  423. package/plugins/pbr/scripts/lib/health-checks.js +107 -0
  424. package/plugins/pbr/scripts/lib/health-phase06.js +120 -0
  425. package/plugins/pbr/scripts/lib/health.js +132 -0
  426. package/plugins/pbr/scripts/lib/help.js +100 -0
  427. package/plugins/pbr/scripts/lib/history.js +150 -0
  428. package/plugins/pbr/scripts/lib/impact-analysis.js +319 -0
  429. package/plugins/pbr/scripts/lib/incidents.js +190 -0
  430. package/plugins/pbr/scripts/lib/init.js +643 -0
  431. package/plugins/pbr/scripts/lib/insights-parser.js +320 -0
  432. package/plugins/pbr/scripts/lib/intel.js +653 -0
  433. package/plugins/pbr/scripts/lib/learnings.js +511 -0
  434. package/plugins/pbr/scripts/lib/migrate.js +309 -0
  435. package/plugins/pbr/scripts/lib/milestone.js +306 -0
  436. package/plugins/pbr/scripts/lib/msys-path.js +20 -0
  437. package/plugins/pbr/scripts/lib/negative-knowledge.js +194 -0
  438. package/plugins/pbr/scripts/lib/notification-throttle.js +141 -0
  439. package/plugins/pbr/scripts/lib/onboarding-generator.js +288 -0
  440. package/plugins/pbr/scripts/lib/parse-args.js +134 -0
  441. package/plugins/pbr/scripts/lib/pattern-routing.js +55 -0
  442. package/plugins/pbr/scripts/lib/patterns.js +272 -0
  443. package/plugins/pbr/scripts/lib/perf.js +190 -0
  444. package/plugins/pbr/scripts/lib/phase.js +1043 -0
  445. package/plugins/pbr/scripts/lib/pid-lock.js +156 -0
  446. package/plugins/pbr/scripts/lib/post-hoc.js +160 -0
  447. package/plugins/pbr/scripts/lib/pre-commit-checks.js +220 -0
  448. package/plugins/pbr/scripts/lib/pre-research.js +126 -0
  449. package/plugins/pbr/scripts/lib/premature-completion.js +312 -0
  450. package/plugins/pbr/scripts/lib/preview.js +174 -0
  451. package/plugins/pbr/scripts/lib/progress-visualization.js +296 -0
  452. package/plugins/pbr/scripts/lib/quick-init.js +131 -0
  453. package/plugins/pbr/scripts/lib/reference.js +236 -0
  454. package/plugins/pbr/scripts/lib/requirements.js +153 -0
  455. package/plugins/pbr/scripts/lib/resolve-root.js +66 -0
  456. package/plugins/pbr/scripts/lib/reverse-spec.js +259 -0
  457. package/plugins/pbr/scripts/lib/roadmap.js +1089 -0
  458. package/plugins/pbr/scripts/lib/security-scan.js +200 -0
  459. package/plugins/pbr/scripts/lib/session-briefing.js +918 -0
  460. package/plugins/pbr/scripts/lib/skill-section.js +99 -0
  461. package/plugins/pbr/scripts/lib/smart-next-task.js +198 -0
  462. package/plugins/pbr/scripts/lib/snapshot-manager.js +232 -0
  463. package/plugins/pbr/scripts/lib/spec-diff.js +209 -0
  464. package/plugins/pbr/scripts/lib/spec-engine.js +189 -0
  465. package/plugins/pbr/scripts/lib/spot-check.js +539 -0
  466. package/plugins/pbr/scripts/lib/state-queue.js +171 -0
  467. package/plugins/pbr/scripts/lib/state.js +1082 -0
  468. package/plugins/pbr/scripts/lib/status-render.js +511 -0
  469. package/plugins/pbr/scripts/lib/step-verify.js +149 -0
  470. package/plugins/pbr/scripts/lib/subagent-validators.js +1119 -0
  471. package/plugins/pbr/scripts/lib/suggest-next.js +435 -0
  472. package/plugins/pbr/scripts/lib/tech-debt-scanner.js +116 -0
  473. package/plugins/pbr/scripts/lib/templates.js +362 -0
  474. package/plugins/pbr/scripts/lib/test-selection.js +163 -0
  475. package/plugins/pbr/scripts/lib/todo.js +300 -0
  476. package/plugins/pbr/scripts/lib/verify.js +1561 -0
  477. package/plugins/pbr/scripts/log-notification.js +131 -0
  478. package/plugins/pbr/scripts/log-subagent.js +221 -18
  479. package/plugins/pbr/scripts/log-tool-failure.js +60 -8
  480. package/plugins/pbr/scripts/milestone-learnings.js +519 -0
  481. package/plugins/pbr/scripts/package.json +1 -1
  482. package/plugins/pbr/scripts/pbr-tools.js +362 -1247
  483. package/plugins/pbr/scripts/post-bash-triage.js +96 -0
  484. package/plugins/pbr/scripts/post-compact.js +135 -0
  485. package/plugins/pbr/scripts/post-hoc.js +237 -0
  486. package/plugins/pbr/scripts/post-write-dispatch.js +201 -31
  487. package/plugins/pbr/scripts/post-write-quality.js +4 -3
  488. package/plugins/pbr/scripts/pre-bash-dispatch.js +147 -51
  489. package/plugins/pbr/scripts/pre-skill-dispatch.js +114 -0
  490. package/plugins/pbr/scripts/pre-task-dispatch.js +269 -0
  491. package/plugins/pbr/scripts/pre-write-dispatch.js +170 -73
  492. package/plugins/pbr/scripts/progress-tracker.js +121 -324
  493. package/plugins/pbr/scripts/prompt-guard.js +114 -0
  494. package/plugins/pbr/scripts/prompt-routing.js +209 -0
  495. package/plugins/pbr/scripts/quick-status.js +179 -0
  496. package/plugins/pbr/scripts/record-incident.js +37 -0
  497. package/plugins/pbr/scripts/risk-classifier.cjs +123 -0
  498. package/plugins/pbr/scripts/run-hook.js +63 -23
  499. package/plugins/pbr/scripts/session-cleanup.js +428 -29
  500. package/plugins/pbr/scripts/session-tracker.js +124 -0
  501. package/plugins/pbr/scripts/status-line.js +593 -32
  502. package/plugins/pbr/scripts/suggest-compact.js +201 -13
  503. package/plugins/pbr/scripts/sync-context-to-claude.js +100 -0
  504. package/plugins/pbr/scripts/task-completed.js +165 -4
  505. package/plugins/pbr/scripts/test/config.test.js +126 -0
  506. package/plugins/pbr/scripts/test/cross-platform.test.js +120 -0
  507. package/plugins/pbr/scripts/test/fixtures/config.json +20 -0
  508. package/plugins/pbr/scripts/test/fixtures/plan.md +54 -0
  509. package/plugins/pbr/scripts/test/fixtures/project.md +30 -0
  510. package/plugins/pbr/scripts/test/fixtures/roadmap.md +55 -0
  511. package/plugins/pbr/scripts/test/fixtures/state.md +60 -0
  512. package/plugins/pbr/scripts/test/fixtures/summary.md +35 -0
  513. package/plugins/pbr/scripts/test/fixtures.test.js +184 -0
  514. package/plugins/pbr/scripts/test/phase.test.js +142 -0
  515. package/plugins/pbr/scripts/test/roadmap.test.js +96 -0
  516. package/plugins/pbr/scripts/test/state.test.js +155 -0
  517. package/plugins/pbr/scripts/track-context-budget.js +368 -104
  518. package/plugins/pbr/scripts/track-user-gates.js +88 -0
  519. package/plugins/pbr/scripts/trust-tracker.js +193 -0
  520. package/plugins/pbr/scripts/validate-commit.js +59 -26
  521. package/plugins/pbr/scripts/validate-skill-args.js +87 -15
  522. package/plugins/pbr/scripts/validate-task.js +83 -627
  523. package/plugins/pbr/scripts/worktree-create.js +144 -0
  524. package/plugins/pbr/scripts/worktree-remove.js +147 -0
  525. package/plugins/pbr/skills/audit/SKILL.md +195 -24
  526. package/plugins/pbr/skills/audit-fix/SKILL.md +326 -0
  527. package/plugins/pbr/skills/autonomous/SKILL.md +551 -0
  528. package/plugins/pbr/skills/backlog/SKILL.md +56 -0
  529. package/plugins/pbr/skills/begin/SKILL.md +508 -153
  530. package/plugins/pbr/skills/begin/templates/STATE.md.tmpl +1 -2
  531. package/plugins/pbr/skills/begin/templates/config.json.tmpl +419 -36
  532. package/plugins/pbr/skills/begin/templates/researcher-prompt.md.tmpl +28 -0
  533. package/plugins/pbr/skills/begin/templates/roadmap-prompt.md.tmpl +28 -3
  534. package/plugins/pbr/skills/begin/templates/synthesis-prompt.md.tmpl +33 -5
  535. package/plugins/pbr/skills/build/SKILL.md +1180 -358
  536. package/plugins/pbr/skills/build/templates/continuation-prompt.md.tmpl +26 -0
  537. package/plugins/pbr/skills/build/templates/executor-prompt.md.tmpl +77 -0
  538. package/plugins/pbr/skills/build/templates/inline-verifier-prompt.md.tmpl +33 -0
  539. package/plugins/pbr/skills/build/templates/qa-round-context.md.tmpl +16 -0
  540. package/plugins/pbr/skills/config/SKILL.md +112 -9
  541. package/plugins/pbr/skills/continue/SKILL.md +113 -33
  542. package/plugins/pbr/skills/dashboard/SKILL.md +21 -9
  543. package/plugins/pbr/skills/debug/SKILL.md +70 -12
  544. package/plugins/pbr/skills/debug/templates/continuation-prompt.md.tmpl +12 -1
  545. package/plugins/pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +12 -5
  546. package/plugins/pbr/skills/discuss/SKILL.md +205 -24
  547. package/plugins/pbr/skills/discuss/templates/CONTEXT.md.tmpl +21 -1
  548. package/plugins/pbr/skills/do/SKILL.md +119 -24
  549. package/plugins/pbr/skills/explore/SKILL.md +95 -20
  550. package/plugins/pbr/skills/fast/SKILL.md +94 -0
  551. package/plugins/pbr/skills/forensics/SKILL.md +144 -0
  552. package/plugins/pbr/skills/health/SKILL.md +35 -117
  553. package/plugins/pbr/skills/help/SKILL.md +83 -123
  554. package/plugins/pbr/skills/import/SKILL.md +332 -13
  555. package/plugins/pbr/skills/intel/SKILL.md +131 -0
  556. package/plugins/pbr/skills/list-phase-assumptions/SKILL.md +231 -0
  557. package/plugins/pbr/skills/milestone/SKILL.md +383 -274
  558. package/plugins/pbr/skills/milestone/templates/audit-output.md.tmpl +76 -0
  559. package/plugins/pbr/skills/milestone/templates/complete-output.md.tmpl +32 -0
  560. package/plugins/pbr/skills/milestone/templates/edge-cases.md +54 -0
  561. package/plugins/pbr/skills/milestone/templates/gaps-output.md.tmpl +25 -0
  562. package/plugins/pbr/skills/milestone/templates/integration-checker-prompt.md.tmpl +25 -0
  563. package/plugins/pbr/skills/milestone/templates/new-output.md.tmpl +29 -0
  564. package/plugins/pbr/skills/milestone-summary/SKILL.md +86 -0
  565. package/plugins/pbr/skills/note/SKILL.md +20 -4
  566. package/plugins/pbr/skills/pause/SKILL.md +54 -14
  567. package/plugins/pbr/skills/pause/templates/continue-here.md.tmpl +33 -52
  568. package/plugins/pbr/skills/plan/SKILL.md +526 -280
  569. package/plugins/pbr/skills/plan/templates/checker-prompt.md.tmpl +20 -2
  570. package/plugins/pbr/skills/plan/templates/completion-output.md.tmpl +27 -0
  571. package/plugins/pbr/skills/plan/templates/planner-prompt.md.tmpl +43 -1
  572. package/plugins/pbr/skills/plan/templates/revision-prompt.md.tmpl +21 -5
  573. package/plugins/pbr/skills/profile/SKILL.md +185 -0
  574. package/plugins/pbr/skills/profile-user/SKILL.md +227 -0
  575. package/plugins/pbr/skills/quick/SKILL.md +435 -100
  576. package/plugins/pbr/skills/release/SKILL.md +206 -0
  577. package/plugins/pbr/skills/resume/SKILL.md +170 -46
  578. package/plugins/pbr/skills/review/SKILL.md +233 -165
  579. package/plugins/pbr/skills/review/templates/verifier-prompt.md.tmpl +7 -0
  580. package/plugins/pbr/skills/scan/SKILL.md +152 -106
  581. package/plugins/pbr/skills/scan/templates/mapper-prompt.md.tmpl +5 -56
  582. package/plugins/pbr/skills/seed/SKILL.md +87 -0
  583. package/plugins/pbr/skills/session-report/SKILL.md +130 -0
  584. package/plugins/pbr/skills/setup/SKILL.md +150 -202
  585. package/plugins/pbr/skills/shared/agent-context-enrichment.md +21 -0
  586. package/plugins/pbr/skills/shared/agent-type-resolution.md +32 -0
  587. package/plugins/pbr/skills/shared/commit-planning-docs.md +8 -0
  588. package/plugins/pbr/skills/shared/context-budget.md +66 -1
  589. package/plugins/pbr/skills/shared/context-loader-task.md +18 -11
  590. package/plugins/pbr/skills/shared/criterion-writing.md +58 -0
  591. package/plugins/pbr/skills/shared/digest-select.md +2 -2
  592. package/plugins/pbr/skills/shared/domain-probes.md +1 -1
  593. package/plugins/pbr/skills/shared/error-reporting.md +38 -60
  594. package/plugins/pbr/skills/shared/gate-prompts.md +4 -2
  595. package/plugins/pbr/skills/shared/memory-capture.md +48 -0
  596. package/plugins/pbr/skills/shared/phase-argument-parsing.md +4 -4
  597. package/plugins/pbr/skills/shared/revision-loop.md +24 -6
  598. package/plugins/pbr/skills/shared/state-update.md +49 -56
  599. package/plugins/pbr/skills/shared/universal-anti-patterns.md +27 -4
  600. package/plugins/pbr/skills/ship/SKILL.md +155 -0
  601. package/plugins/pbr/skills/stats/SKILL.md +110 -0
  602. package/plugins/pbr/skills/status/SKILL.md +185 -119
  603. package/plugins/pbr/skills/test/SKILL.md +254 -0
  604. package/plugins/pbr/skills/thread/SKILL.md +73 -0
  605. package/plugins/pbr/skills/todo/SKILL.md +28 -72
  606. package/plugins/pbr/skills/ui-phase/SKILL.md +180 -0
  607. package/plugins/pbr/skills/ui-review/SKILL.md +206 -0
  608. package/plugins/pbr/skills/undo/SKILL.md +221 -0
  609. package/plugins/pbr/skills/validate-phase/SKILL.md +362 -0
  610. package/plugins/pbr/templates/CONTEXT.md.tmpl +45 -20
  611. package/plugins/pbr/templates/DISCOVERY.md.tmpl +29 -0
  612. package/plugins/pbr/templates/DISCUSSION-LOG.md.tmpl +49 -0
  613. package/plugins/pbr/templates/HANDOFF.json.tmpl +30 -0
  614. package/plugins/pbr/templates/INTEGRATION-REPORT.md.tmpl +18 -2
  615. package/plugins/pbr/templates/MILESTONE-AUDIT.md.tmpl +44 -0
  616. package/plugins/pbr/templates/PROJECT.md.tmpl +126 -0
  617. package/plugins/pbr/templates/REQUIREMENTS.md.tmpl +96 -0
  618. package/plugins/pbr/templates/RETROSPECTIVE.md.tmpl +43 -0
  619. package/plugins/pbr/templates/ROADMAP.md.tmpl +108 -14
  620. package/plugins/pbr/templates/SUMMARY-complex.md.tmpl +133 -0
  621. package/plugins/pbr/templates/SUMMARY-minimal.md.tmpl +55 -0
  622. package/plugins/pbr/templates/SUMMARY.md.tmpl +21 -0
  623. package/plugins/pbr/templates/UAT.md.tmpl +94 -0
  624. package/plugins/pbr/templates/UI-SPEC.md.tmpl +144 -0
  625. package/plugins/pbr/templates/VALIDATION.md.tmpl +94 -0
  626. package/plugins/pbr/templates/VERIFICATION-DETAIL.md.tmpl +54 -13
  627. package/plugins/pbr/templates/project-CONTEXT.md.tmpl +59 -0
  628. package/plugins/pbr/templates/research-outputs/ARCHITECTURE.md.tmpl +91 -0
  629. package/plugins/pbr/templates/research-outputs/FEATURES.md.tmpl +64 -0
  630. package/plugins/pbr/templates/research-outputs/PITFALLS.md.tmpl +50 -0
  631. package/plugins/pbr/templates/research-outputs/STACK.md.tmpl +63 -0
  632. package/plugins/pbr/templates/research-outputs/SUMMARY.md.tmpl +98 -0
  633. package/scripts/build-hooks.js +61 -0
  634. package/scripts/check-ci.js +100 -0
  635. package/scripts/clean-changelog.js +364 -0
  636. package/scripts/generate-derivatives.js +581 -0
  637. package/scripts/posttest.js +93 -0
  638. package/scripts/release.js +262 -0
  639. package/scripts/run-tests.cjs +29 -0
  640. package/scripts/test-wrapper.js +43 -0
  641. package/dashboard/bin/cli.js +0 -25
  642. package/dashboard/public/css/layout.css +0 -704
  643. package/dashboard/public/css/status-colors.css +0 -98
  644. package/dashboard/public/css/tokens.css +0 -59
  645. package/dashboard/public/js/htmx-title.js +0 -5
  646. package/dashboard/public/js/sidebar-toggle.js +0 -34
  647. package/dashboard/public/js/sse-client.js +0 -100
  648. package/dashboard/public/js/theme-toggle.js +0 -46
  649. package/dashboard/src/app.js +0 -91
  650. package/dashboard/src/middleware/current-phase.js +0 -24
  651. package/dashboard/src/middleware/errorHandler.js +0 -52
  652. package/dashboard/src/middleware/notFoundHandler.js +0 -9
  653. package/dashboard/src/repositories/planning.repository.js +0 -130
  654. package/dashboard/src/routes/events.routes.js +0 -45
  655. package/dashboard/src/routes/index.routes.js +0 -35
  656. package/dashboard/src/routes/pages.routes.js +0 -426
  657. package/dashboard/src/server.js +0 -42
  658. package/dashboard/src/services/analytics.service.js +0 -141
  659. package/dashboard/src/services/dashboard.service.js +0 -309
  660. package/dashboard/src/services/milestone.service.js +0 -222
  661. package/dashboard/src/services/notes.service.js +0 -50
  662. package/dashboard/src/services/phase.service.js +0 -232
  663. package/dashboard/src/services/project.service.js +0 -57
  664. package/dashboard/src/services/roadmap.service.js +0 -258
  665. package/dashboard/src/services/sse.service.js +0 -58
  666. package/dashboard/src/services/todo.service.js +0 -272
  667. package/dashboard/src/services/watcher.service.js +0 -48
  668. package/dashboard/src/utils/cache.js +0 -55
  669. package/dashboard/src/views/analytics.ejs +0 -5
  670. package/dashboard/src/views/coming-soon.ejs +0 -11
  671. package/dashboard/src/views/dependencies.ejs +0 -5
  672. package/dashboard/src/views/error.ejs +0 -20
  673. package/dashboard/src/views/index.ejs +0 -5
  674. package/dashboard/src/views/milestone-detail.ejs +0 -5
  675. package/dashboard/src/views/milestones.ejs +0 -5
  676. package/dashboard/src/views/notes.ejs +0 -5
  677. package/dashboard/src/views/partials/analytics-content.ejs +0 -90
  678. package/dashboard/src/views/partials/breadcrumbs.ejs +0 -14
  679. package/dashboard/src/views/partials/dashboard-content.ejs +0 -84
  680. package/dashboard/src/views/partials/dependencies-content.ejs +0 -48
  681. package/dashboard/src/views/partials/empty-state.ejs +0 -7
  682. package/dashboard/src/views/partials/footer.ejs +0 -3
  683. package/dashboard/src/views/partials/head.ejs +0 -30
  684. package/dashboard/src/views/partials/header.ejs +0 -21
  685. package/dashboard/src/views/partials/layout-bottom.ejs +0 -43
  686. package/dashboard/src/views/partials/layout-top.ejs +0 -16
  687. package/dashboard/src/views/partials/milestone-detail-content.ejs +0 -20
  688. package/dashboard/src/views/partials/milestones-content.ejs +0 -88
  689. package/dashboard/src/views/partials/notes-content.ejs +0 -23
  690. package/dashboard/src/views/partials/phase-content.ejs +0 -193
  691. package/dashboard/src/views/partials/phase-doc-content.ejs +0 -38
  692. package/dashboard/src/views/partials/phases-content.ejs +0 -124
  693. package/dashboard/src/views/partials/roadmap-content.ejs +0 -180
  694. package/dashboard/src/views/partials/sidebar.ejs +0 -99
  695. package/dashboard/src/views/partials/todo-create-content.ejs +0 -54
  696. package/dashboard/src/views/partials/todo-detail-content.ejs +0 -42
  697. package/dashboard/src/views/partials/todos-content.ejs +0 -97
  698. package/dashboard/src/views/phase-detail.ejs +0 -5
  699. package/dashboard/src/views/phase-doc.ejs +0 -5
  700. package/dashboard/src/views/phases.ejs +0 -5
  701. package/dashboard/src/views/roadmap.ejs +0 -5
  702. package/dashboard/src/views/todo-create.ejs +0 -5
  703. package/dashboard/src/views/todo-detail.ejs +0 -5
  704. package/dashboard/src/views/todos.ejs +0 -5
  705. package/plugins/copilot-pbr/CHANGELOG.md +0 -19
  706. package/plugins/copilot-pbr/README.md +0 -139
  707. package/plugins/copilot-pbr/agents/audit.agent.md +0 -113
  708. package/plugins/copilot-pbr/agents/codebase-mapper.agent.md +0 -151
  709. package/plugins/copilot-pbr/agents/debugger.agent.md +0 -182
  710. package/plugins/copilot-pbr/agents/executor.agent.md +0 -267
  711. package/plugins/copilot-pbr/agents/general.agent.md +0 -88
  712. package/plugins/copilot-pbr/agents/integration-checker.agent.md +0 -119
  713. package/plugins/copilot-pbr/agents/plan-checker.agent.md +0 -208
  714. package/plugins/copilot-pbr/agents/planner.agent.md +0 -238
  715. package/plugins/copilot-pbr/agents/researcher.agent.md +0 -186
  716. package/plugins/copilot-pbr/agents/synthesizer.agent.md +0 -126
  717. package/plugins/copilot-pbr/agents/verifier.agent.md +0 -228
  718. package/plugins/copilot-pbr/hooks/hooks.json +0 -258
  719. package/plugins/copilot-pbr/plugin.json +0 -30
  720. package/plugins/copilot-pbr/references/agent-anti-patterns.md +0 -25
  721. package/plugins/copilot-pbr/references/agent-contracts.md +0 -297
  722. package/plugins/copilot-pbr/references/agent-interactions.md +0 -135
  723. package/plugins/copilot-pbr/references/agent-teams.md +0 -55
  724. package/plugins/copilot-pbr/references/checkpoints.md +0 -158
  725. package/plugins/copilot-pbr/references/common-bug-patterns.md +0 -14
  726. package/plugins/copilot-pbr/references/config-reference.md +0 -442
  727. package/plugins/copilot-pbr/references/continuation-format.md +0 -213
  728. package/plugins/copilot-pbr/references/deviation-rules.md +0 -113
  729. package/plugins/copilot-pbr/references/git-integration.md +0 -227
  730. package/plugins/copilot-pbr/references/integration-patterns.md +0 -118
  731. package/plugins/copilot-pbr/references/model-profiles.md +0 -100
  732. package/plugins/copilot-pbr/references/model-selection.md +0 -32
  733. package/plugins/copilot-pbr/references/pbr-rules.md +0 -195
  734. package/plugins/copilot-pbr/references/pbr-tools-cli.md +0 -285
  735. package/plugins/copilot-pbr/references/plan-authoring.md +0 -182
  736. package/plugins/copilot-pbr/references/plan-format.md +0 -288
  737. package/plugins/copilot-pbr/references/planning-config.md +0 -214
  738. package/plugins/copilot-pbr/references/questioning.md +0 -215
  739. package/plugins/copilot-pbr/references/reading-verification.md +0 -128
  740. package/plugins/copilot-pbr/references/stub-patterns.md +0 -161
  741. package/plugins/copilot-pbr/references/subagent-coordination.md +0 -120
  742. package/plugins/copilot-pbr/references/ui-formatting.md +0 -444
  743. package/plugins/copilot-pbr/references/verification-patterns.md +0 -199
  744. package/plugins/copilot-pbr/references/wave-execution.md +0 -96
  745. package/plugins/copilot-pbr/rules/pbr-workflow.mdc +0 -48
  746. package/plugins/copilot-pbr/setup.ps1 +0 -93
  747. package/plugins/copilot-pbr/setup.sh +0 -93
  748. package/plugins/copilot-pbr/skills/audit/SKILL.md +0 -330
  749. package/plugins/copilot-pbr/skills/begin/SKILL.md +0 -589
  750. package/plugins/copilot-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  751. package/plugins/copilot-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  752. package/plugins/copilot-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  753. package/plugins/copilot-pbr/skills/begin/templates/config.json.tmpl +0 -64
  754. package/plugins/copilot-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  755. package/plugins/copilot-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  756. package/plugins/copilot-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  757. package/plugins/copilot-pbr/skills/build/SKILL.md +0 -960
  758. package/plugins/copilot-pbr/skills/config/SKILL.md +0 -250
  759. package/plugins/copilot-pbr/skills/continue/SKILL.md +0 -159
  760. package/plugins/copilot-pbr/skills/dashboard/SKILL.md +0 -43
  761. package/plugins/copilot-pbr/skills/debug/SKILL.md +0 -508
  762. package/plugins/copilot-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  763. package/plugins/copilot-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  764. package/plugins/copilot-pbr/skills/discuss/SKILL.md +0 -353
  765. package/plugins/copilot-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  766. package/plugins/copilot-pbr/skills/discuss/templates/decision-categories.md +0 -10
  767. package/plugins/copilot-pbr/skills/do/SKILL.md +0 -66
  768. package/plugins/copilot-pbr/skills/explore/SKILL.md +0 -373
  769. package/plugins/copilot-pbr/skills/health/SKILL.md +0 -283
  770. package/plugins/copilot-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  771. package/plugins/copilot-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  772. package/plugins/copilot-pbr/skills/help/SKILL.md +0 -193
  773. package/plugins/copilot-pbr/skills/import/SKILL.md +0 -502
  774. package/plugins/copilot-pbr/skills/milestone/SKILL.md +0 -806
  775. package/plugins/copilot-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  776. package/plugins/copilot-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  777. package/plugins/copilot-pbr/skills/note/SKILL.md +0 -213
  778. package/plugins/copilot-pbr/skills/pause/SKILL.md +0 -247
  779. package/plugins/copilot-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  780. package/plugins/copilot-pbr/skills/plan/SKILL.md +0 -662
  781. package/plugins/copilot-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  782. package/plugins/copilot-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  783. package/plugins/copilot-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  784. package/plugins/copilot-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  785. package/plugins/copilot-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  786. package/plugins/copilot-pbr/skills/quick/SKILL.md +0 -376
  787. package/plugins/copilot-pbr/skills/resume/SKILL.md +0 -399
  788. package/plugins/copilot-pbr/skills/review/SKILL.md +0 -653
  789. package/plugins/copilot-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  790. package/plugins/copilot-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  791. package/plugins/copilot-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  792. package/plugins/copilot-pbr/skills/scan/SKILL.md +0 -299
  793. package/plugins/copilot-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  794. package/plugins/copilot-pbr/skills/setup/SKILL.md +0 -296
  795. package/plugins/copilot-pbr/skills/shared/commit-planning-docs.md +0 -36
  796. package/plugins/copilot-pbr/skills/shared/config-loading.md +0 -103
  797. package/plugins/copilot-pbr/skills/shared/context-budget.md +0 -41
  798. package/plugins/copilot-pbr/skills/shared/context-loader-task.md +0 -87
  799. package/plugins/copilot-pbr/skills/shared/digest-select.md +0 -80
  800. package/plugins/copilot-pbr/skills/shared/domain-probes.md +0 -126
  801. package/plugins/copilot-pbr/skills/shared/error-recovery-strategies.md +0 -51
  802. package/plugins/copilot-pbr/skills/shared/error-reporting.md +0 -81
  803. package/plugins/copilot-pbr/skills/shared/gate-prompts.md +0 -389
  804. package/plugins/copilot-pbr/skills/shared/phase-argument-parsing.md +0 -46
  805. package/plugins/copilot-pbr/skills/shared/progress-display.md +0 -53
  806. package/plugins/copilot-pbr/skills/shared/revision-loop.md +0 -82
  807. package/plugins/copilot-pbr/skills/shared/state-loading.md +0 -63
  808. package/plugins/copilot-pbr/skills/shared/state-update.md +0 -162
  809. package/plugins/copilot-pbr/skills/shared/universal-anti-patterns.md +0 -38
  810. package/plugins/copilot-pbr/skills/status/SKILL.md +0 -362
  811. package/plugins/copilot-pbr/skills/statusline/SKILL.md +0 -149
  812. package/plugins/copilot-pbr/skills/todo/SKILL.md +0 -279
  813. package/plugins/copilot-pbr/templates/CONTEXT.md.tmpl +0 -53
  814. package/plugins/copilot-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  815. package/plugins/copilot-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  816. package/plugins/copilot-pbr/templates/ROADMAP.md.tmpl +0 -41
  817. package/plugins/copilot-pbr/templates/SUMMARY.md.tmpl +0 -82
  818. package/plugins/copilot-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  819. package/plugins/copilot-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  820. package/plugins/copilot-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  821. package/plugins/copilot-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  822. package/plugins/copilot-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  823. package/plugins/copilot-pbr/templates/codebase/STACK.md.tmpl +0 -78
  824. package/plugins/copilot-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  825. package/plugins/copilot-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  826. package/plugins/copilot-pbr/templates/continue-here.md.tmpl +0 -74
  827. package/plugins/copilot-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  828. package/plugins/copilot-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  829. package/plugins/copilot-pbr/templates/research/STACK.md.tmpl +0 -71
  830. package/plugins/copilot-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  831. package/plugins/copilot-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  832. package/plugins/copilot-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  833. package/plugins/copilot-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  834. package/plugins/cursor-pbr/.cursor-plugin/plugin.json +0 -32
  835. package/plugins/cursor-pbr/CHANGELOG.md +0 -15
  836. package/plugins/cursor-pbr/README.md +0 -123
  837. package/plugins/cursor-pbr/agents/audit.md +0 -178
  838. package/plugins/cursor-pbr/agents/codebase-mapper.md +0 -150
  839. package/plugins/cursor-pbr/agents/debugger.md +0 -181
  840. package/plugins/cursor-pbr/agents/executor.md +0 -266
  841. package/plugins/cursor-pbr/agents/general.md +0 -87
  842. package/plugins/cursor-pbr/agents/integration-checker.md +0 -118
  843. package/plugins/cursor-pbr/agents/plan-checker.md +0 -207
  844. package/plugins/cursor-pbr/agents/planner.md +0 -237
  845. package/plugins/cursor-pbr/agents/researcher.md +0 -185
  846. package/plugins/cursor-pbr/agents/synthesizer.md +0 -125
  847. package/plugins/cursor-pbr/agents/verifier.md +0 -227
  848. package/plugins/cursor-pbr/assets/.gitkeep +0 -0
  849. package/plugins/cursor-pbr/assets/logo.svg +0 -21
  850. package/plugins/cursor-pbr/hooks/hooks.json +0 -224
  851. package/plugins/cursor-pbr/references/agent-anti-patterns.md +0 -25
  852. package/plugins/cursor-pbr/references/agent-contracts.md +0 -297
  853. package/plugins/cursor-pbr/references/agent-interactions.md +0 -135
  854. package/plugins/cursor-pbr/references/agent-teams.md +0 -55
  855. package/plugins/cursor-pbr/references/checkpoints.md +0 -158
  856. package/plugins/cursor-pbr/references/common-bug-patterns.md +0 -14
  857. package/plugins/cursor-pbr/references/config-reference.md +0 -442
  858. package/plugins/cursor-pbr/references/continuation-format.md +0 -213
  859. package/plugins/cursor-pbr/references/deviation-rules.md +0 -113
  860. package/plugins/cursor-pbr/references/git-integration.md +0 -227
  861. package/plugins/cursor-pbr/references/integration-patterns.md +0 -118
  862. package/plugins/cursor-pbr/references/model-profiles.md +0 -100
  863. package/plugins/cursor-pbr/references/model-selection.md +0 -32
  864. package/plugins/cursor-pbr/references/pbr-rules.md +0 -195
  865. package/plugins/cursor-pbr/references/pbr-tools-cli.md +0 -285
  866. package/plugins/cursor-pbr/references/plan-authoring.md +0 -182
  867. package/plugins/cursor-pbr/references/plan-format.md +0 -288
  868. package/plugins/cursor-pbr/references/planning-config.md +0 -214
  869. package/plugins/cursor-pbr/references/questioning.md +0 -215
  870. package/plugins/cursor-pbr/references/reading-verification.md +0 -128
  871. package/plugins/cursor-pbr/references/stub-patterns.md +0 -161
  872. package/plugins/cursor-pbr/references/subagent-coordination.md +0 -120
  873. package/plugins/cursor-pbr/references/ui-formatting.md +0 -444
  874. package/plugins/cursor-pbr/references/verification-patterns.md +0 -199
  875. package/plugins/cursor-pbr/references/wave-execution.md +0 -96
  876. package/plugins/cursor-pbr/rules/pbr-workflow.mdc +0 -48
  877. package/plugins/cursor-pbr/setup.ps1 +0 -78
  878. package/plugins/cursor-pbr/setup.sh +0 -83
  879. package/plugins/cursor-pbr/skills/audit/SKILL.md +0 -331
  880. package/plugins/cursor-pbr/skills/begin/SKILL.md +0 -589
  881. package/plugins/cursor-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  882. package/plugins/cursor-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  883. package/plugins/cursor-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  884. package/plugins/cursor-pbr/skills/begin/templates/config.json.tmpl +0 -64
  885. package/plugins/cursor-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  886. package/plugins/cursor-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  887. package/plugins/cursor-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  888. package/plugins/cursor-pbr/skills/build/SKILL.md +0 -961
  889. package/plugins/cursor-pbr/skills/config/SKILL.md +0 -252
  890. package/plugins/cursor-pbr/skills/continue/SKILL.md +0 -159
  891. package/plugins/cursor-pbr/skills/dashboard/SKILL.md +0 -44
  892. package/plugins/cursor-pbr/skills/debug/SKILL.md +0 -512
  893. package/plugins/cursor-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  894. package/plugins/cursor-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  895. package/plugins/cursor-pbr/skills/discuss/SKILL.md +0 -354
  896. package/plugins/cursor-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  897. package/plugins/cursor-pbr/skills/discuss/templates/decision-categories.md +0 -10
  898. package/plugins/cursor-pbr/skills/do/SKILL.md +0 -67
  899. package/plugins/cursor-pbr/skills/explore/SKILL.md +0 -376
  900. package/plugins/cursor-pbr/skills/health/SKILL.md +0 -283
  901. package/plugins/cursor-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  902. package/plugins/cursor-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  903. package/plugins/cursor-pbr/skills/help/SKILL.md +0 -193
  904. package/plugins/cursor-pbr/skills/import/SKILL.md +0 -505
  905. package/plugins/cursor-pbr/skills/milestone/SKILL.md +0 -807
  906. package/plugins/cursor-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  907. package/plugins/cursor-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  908. package/plugins/cursor-pbr/skills/note/SKILL.md +0 -214
  909. package/plugins/cursor-pbr/skills/pause/SKILL.md +0 -248
  910. package/plugins/cursor-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  911. package/plugins/cursor-pbr/skills/plan/SKILL.md +0 -663
  912. package/plugins/cursor-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  913. package/plugins/cursor-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  914. package/plugins/cursor-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  915. package/plugins/cursor-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  916. package/plugins/cursor-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  917. package/plugins/cursor-pbr/skills/quick/SKILL.md +0 -376
  918. package/plugins/cursor-pbr/skills/resume/SKILL.md +0 -399
  919. package/plugins/cursor-pbr/skills/review/SKILL.md +0 -654
  920. package/plugins/cursor-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  921. package/plugins/cursor-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  922. package/plugins/cursor-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  923. package/plugins/cursor-pbr/skills/scan/SKILL.md +0 -300
  924. package/plugins/cursor-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  925. package/plugins/cursor-pbr/skills/setup/SKILL.md +0 -296
  926. package/plugins/cursor-pbr/skills/shared/commit-planning-docs.md +0 -36
  927. package/plugins/cursor-pbr/skills/shared/config-loading.md +0 -103
  928. package/plugins/cursor-pbr/skills/shared/context-budget.md +0 -41
  929. package/plugins/cursor-pbr/skills/shared/context-loader-task.md +0 -87
  930. package/plugins/cursor-pbr/skills/shared/digest-select.md +0 -80
  931. package/plugins/cursor-pbr/skills/shared/domain-probes.md +0 -126
  932. package/plugins/cursor-pbr/skills/shared/error-recovery-strategies.md +0 -51
  933. package/plugins/cursor-pbr/skills/shared/error-reporting.md +0 -81
  934. package/plugins/cursor-pbr/skills/shared/gate-prompts.md +0 -389
  935. package/plugins/cursor-pbr/skills/shared/phase-argument-parsing.md +0 -46
  936. package/plugins/cursor-pbr/skills/shared/progress-display.md +0 -53
  937. package/plugins/cursor-pbr/skills/shared/revision-loop.md +0 -82
  938. package/plugins/cursor-pbr/skills/shared/state-loading.md +0 -63
  939. package/plugins/cursor-pbr/skills/shared/state-update.md +0 -162
  940. package/plugins/cursor-pbr/skills/shared/universal-anti-patterns.md +0 -38
  941. package/plugins/cursor-pbr/skills/status/SKILL.md +0 -362
  942. package/plugins/cursor-pbr/skills/statusline/SKILL.md +0 -150
  943. package/plugins/cursor-pbr/skills/todo/SKILL.md +0 -280
  944. package/plugins/cursor-pbr/templates/CONTEXT.md.tmpl +0 -53
  945. package/plugins/cursor-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  946. package/plugins/cursor-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  947. package/plugins/cursor-pbr/templates/ROADMAP.md.tmpl +0 -41
  948. package/plugins/cursor-pbr/templates/SUMMARY.md.tmpl +0 -82
  949. package/plugins/cursor-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  950. package/plugins/cursor-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  951. package/plugins/cursor-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  952. package/plugins/cursor-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  953. package/plugins/cursor-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  954. package/plugins/cursor-pbr/templates/codebase/STACK.md.tmpl +0 -78
  955. package/plugins/cursor-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  956. package/plugins/cursor-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  957. package/plugins/cursor-pbr/templates/continue-here.md.tmpl +0 -74
  958. package/plugins/cursor-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  959. package/plugins/cursor-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  960. package/plugins/cursor-pbr/templates/research/STACK.md.tmpl +0 -71
  961. package/plugins/cursor-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  962. package/plugins/cursor-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  963. package/plugins/cursor-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  964. package/plugins/cursor-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  965. package/plugins/pbr/references/agent-interactions.md +0 -134
  966. package/plugins/pbr/references/pbr-rules.md +0 -194
  967. package/plugins/pbr/references/pbr-tools-cli.md +0 -285
  968. package/plugins/pbr/references/planning-config.md +0 -213
  969. package/plugins/pbr/references/subagent-coordination.md +0 -119
  970. package/plugins/pbr/references/ui-formatting.md +0 -444
  971. package/plugins/pbr/scripts/validate-plugin-structure.js +0 -183
  972. package/plugins/pbr/skills/milestone/templates/audit-report.md.tmpl +0 -48
  973. package/plugins/pbr/skills/shared/error-recovery-strategies.md +0 -51
  974. package/plugins/pbr/skills/shared/progress-display.md +0 -53
  975. package/plugins/pbr/skills/shared/state-loading.md +0 -62
  976. package/plugins/pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -97
  977. package/plugins/pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  978. package/plugins/pbr/templates/research/STACK.md.tmpl +0 -71
  979. package/plugins/pbr/templates/research/SUMMARY.md.tmpl +0 -112
  980. package/plugins/pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  981. package/plugins/pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  982. package/plugins/pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  983. /package/plugins/pbr/references/{agent-anti-patterns.md → archive/agent-anti-patterns.md} +0 -0
@@ -0,0 +1,1119 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * lib/subagent-validators.js — Extracted validator functions and constants
5
+ * from check-subagent-output.js.
6
+ *
7
+ * Contains: AGENT_TO_SKILL, AGENT_OUTPUTS, SKILL_CHECKS, and all helper
8
+ * functions used for subagent output validation.
9
+ */
10
+
11
+ const fs = require('fs');
12
+ const path = require('path');
13
+ const { logHook } = require('../hook-logger');
14
+ const { KNOWN_AGENTS, sessionLoad } = require('../pbr-tools');
15
+ const { detectConventions, writeConventions } = require('./convention-detector');
16
+ const { resolveSessionPath } = require('./core');
17
+ const handoff = require('./handoff-validators');
18
+
19
+ // Agent-type to skill mapping for .active-skill auto-creation
20
+ const AGENT_TO_SKILL = {
21
+ 'pbr:executor': 'build', 'pbr:planner': 'plan', 'pbr:verifier': 'review',
22
+ 'pbr:researcher': 'plan', 'pbr:synthesizer': 'plan', 'pbr:audit': 'audit',
23
+ 'pbr:debugger': 'debug', 'pbr:codebase-mapper': 'begin', 'pbr:roadmapper': 'begin',
24
+ 'pbr:nyquist-auditor': 'validate', 'pbr:intel-updater': 'intel',
25
+ 'pbr:ui-checker': 'ui-review', 'pbr:ui-researcher': 'ui-phase'
26
+ };
27
+
28
+ /**
29
+ * Load a feature flag value from config.json.
30
+ * @param {string} planningDir - Path to .planning directory
31
+ * @param {string} flagName - Feature flag name (e.g. 'trust_tracking')
32
+ * @returns {*} Flag value or undefined if not found
33
+ */
34
+ function loadFeatureFlag(planningDir, flagName) {
35
+ try {
36
+ const configPath = path.join(planningDir, 'config.json');
37
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
38
+ return config.features?.[flagName];
39
+ } catch (_e) { // intentionally silent: config may not exist
40
+ return undefined;
41
+ }
42
+ }
43
+
44
+ /**
45
+ * Check whether trust tracking is enabled in config.
46
+ * @param {string} planningDir - Path to .planning directory
47
+ * @returns {boolean} True if trust_tracking is not explicitly disabled
48
+ */
49
+ function shouldTrackTrust(planningDir) {
50
+ const flag = loadFeatureFlag(planningDir, 'trust_tracking');
51
+ return flag !== false;
52
+ }
53
+
54
+ /**
55
+ * Extract verification outcome from the most recent VERIFICATION.md
56
+ * in the current phase directory.
57
+ * @param {string} planningDir - Path to .planning directory
58
+ * @returns {{ passed: boolean, category: string, mustHavesPassed: number|undefined, mustHavesTotal: number|undefined }|null}
59
+ */
60
+ function extractVerificationOutcome(planningDir) {
61
+ try {
62
+ const verFiles = findInPhaseDir(planningDir, /^VERIFICATION(-R\d+)?\.md$/i);
63
+ if (verFiles.length === 0) return null;
64
+
65
+ // Use the latest verification file (highest round number, or base VERIFICATION.md)
66
+ const sorted = verFiles.sort();
67
+ const verPath = path.join(planningDir, sorted[sorted.length - 1]);
68
+ const content = fs.readFileSync(verPath, 'utf8');
69
+ const fmMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
70
+ if (!fmMatch) return null;
71
+
72
+ const fm = fmMatch[1];
73
+ const statusMatch = fm.match(/^status:\s*(\S+)/mi);
74
+ if (!statusMatch) return null;
75
+
76
+ const status = statusMatch[1];
77
+ const passed = status === 'passed';
78
+
79
+ // Extract must_haves counts
80
+ const passedMatch = fm.match(/^must_haves_passed:\s*(\d+)/mi);
81
+ const totalMatch = fm.match(/^must_haves_total:\s*(\d+)/mi);
82
+ const mustHavesPassed = passedMatch ? parseInt(passedMatch[1], 10) : undefined;
83
+ const mustHavesTotal = totalMatch ? parseInt(totalMatch[1], 10) : undefined;
84
+
85
+ // Extract category from STATE.md phase_slug
86
+ let category = 'unknown';
87
+ const stateFile = path.join(planningDir, 'STATE.md');
88
+ if (fs.existsSync(stateFile)) {
89
+ const stateContent = fs.readFileSync(stateFile, 'utf8');
90
+ const slugMatch = stateContent.match(/^phase_slug:\s*"?([^"\n]+)"?/mi);
91
+ if (slugMatch) {
92
+ category = slugMatch[1].trim();
93
+ }
94
+ }
95
+
96
+ return { passed, category, mustHavesPassed, mustHavesTotal };
97
+ } catch (_e) { // intentionally silent: verification data may not exist
98
+ return null;
99
+ }
100
+ }
101
+
102
+ /**
103
+ * Check if a file was modified recently (within thresholdMs).
104
+ * Returns false if file doesn't exist or on error.
105
+ */
106
+ function isRecent(filePath, thresholdMs = 1800000) {
107
+ try {
108
+ const stat = fs.statSync(filePath);
109
+ return (Date.now() - stat.mtimeMs) < thresholdMs;
110
+ } catch (_e) { // intentionally silent: file may not exist
111
+ return false;
112
+ }
113
+ }
114
+
115
+ /**
116
+ * Extract current phase number from STATE.md, preferring frontmatter over body.
117
+ * @param {string} stateContent - Full STATE.md content
118
+ * @returns {string|null} Phase number string or null
119
+ */
120
+ function getCurrentPhase(stateContent) {
121
+ // Prefer frontmatter (always up-to-date)
122
+ const fmMatch = stateContent.match(/^current_phase:\s*(\d+)/m);
123
+ if (fmMatch) return fmMatch[1];
124
+ // Fall back to body text
125
+ const bodyMatch = stateContent.match(/Phase:\s*(\d+)\s+of\s+\d+/);
126
+ return bodyMatch ? bodyMatch[1] : null;
127
+ }
128
+
129
+ function findInPhaseDir(planningDir, pattern) {
130
+ const matches = [];
131
+ const phasesDir = path.join(planningDir, 'phases');
132
+ if (!fs.existsSync(phasesDir)) return matches;
133
+
134
+ try {
135
+ // Find the active phase from STATE.md (prefer frontmatter over body)
136
+ const stateFile = path.join(planningDir, 'STATE.md');
137
+ if (!fs.existsSync(stateFile)) return matches;
138
+
139
+ const stateContent = fs.readFileSync(stateFile, 'utf8');
140
+ const phaseNum = getCurrentPhase(stateContent);
141
+ if (!phaseNum) return matches;
142
+
143
+ const currentPhase = phaseNum.padStart(2, '0');
144
+ const dirs = fs.readdirSync(phasesDir).filter(d => d.startsWith(currentPhase));
145
+ if (dirs.length === 0) return matches;
146
+
147
+ const phaseDir = path.join(phasesDir, dirs[0]);
148
+ const files = fs.readdirSync(phaseDir);
149
+ for (const file of files) {
150
+ if (pattern.test(file)) {
151
+ // Check it's non-empty
152
+ const filePath = path.join(phaseDir, file);
153
+ const stat = fs.statSync(filePath);
154
+ if (stat.size > 0) {
155
+ matches.push(path.join('phases', dirs[0], file));
156
+ }
157
+ }
158
+ }
159
+ } catch (_e) { logHook('subagent-validators', 'debug', 'Failed to search phase directory');
160
+ // best-effort
161
+ }
162
+ return matches;
163
+ }
164
+
165
+ function findInQuickDir(planningDir, pattern) {
166
+ const matches = [];
167
+ const quickDir = path.join(planningDir, 'quick');
168
+ if (!fs.existsSync(quickDir)) return matches;
169
+
170
+ try {
171
+ // Find the most recent quick task directory (highest NNN)
172
+ const dirs = fs.readdirSync(quickDir)
173
+ .filter(d => /^\d{3}-/.test(d))
174
+ .sort()
175
+ .reverse();
176
+ if (dirs.length === 0) return matches;
177
+
178
+ const latestDir = path.join(quickDir, dirs[0]);
179
+ const stat = fs.statSync(latestDir);
180
+ if (!stat.isDirectory()) return matches;
181
+
182
+ const files = fs.readdirSync(latestDir);
183
+ for (const file of files) {
184
+ if (pattern.test(file)) {
185
+ const filePath = path.join(latestDir, file);
186
+ const fileStat = fs.statSync(filePath);
187
+ if (fileStat.size > 0) {
188
+ matches.push(path.join('quick', dirs[0], file));
189
+ }
190
+ }
191
+ }
192
+ } catch (_e) { logHook('subagent-validators', 'debug', 'Failed to search quick directory');
193
+ // best-effort
194
+ }
195
+ return matches;
196
+ }
197
+
198
+ function checkSummaryCommits(planningDir, foundFiles, warnings) {
199
+ // Look for SUMMARY files in found list
200
+ const summaryFiles = foundFiles.filter(f => /SUMMARY/i.test(f));
201
+ for (const relPath of summaryFiles) {
202
+ try {
203
+ const fullPath = path.join(planningDir, relPath);
204
+ const content = fs.readFileSync(fullPath, 'utf8');
205
+ // Parse frontmatter for commits field
206
+ const fmMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
207
+ if (!fmMatch) continue;
208
+ const fm = fmMatch[1];
209
+ const commitsMatch = fm.match(/commits:\s*(\[.*?\]|.*)/);
210
+ if (!commitsMatch) {
211
+ warnings.push(`${relPath}: No "commits" field in frontmatter. Executor should record commit hashes.`);
212
+ continue;
213
+ }
214
+ const commitsVal = commitsMatch[1].trim();
215
+ if (commitsVal === '[]' || commitsVal === '' || commitsVal === '~' || commitsVal === 'null') {
216
+ warnings.push(`${relPath}: "commits" field is empty. Executor may have failed to commit changes.`);
217
+ }
218
+ } catch (_e) { logHook('subagent-validators', 'debug', 'Failed to check summary commits'); }
219
+ }
220
+ }
221
+
222
+ /**
223
+ * Check SUMMARY.md deviations for Rule 3/4 (action: "ask") that require user review.
224
+ * These deviations were flagged by the executor as needing human decision.
225
+ *
226
+ * @param {string} planningDir - Path to .planning/
227
+ * @param {string[]} foundFiles - List of found output files (relative to planningDir)
228
+ * @param {string[]} warnings - Array to push warnings into
229
+ */
230
+ function checkDeviationsRequiringReview(planningDir, foundFiles, warnings) {
231
+ const summaryFiles = foundFiles.filter(f => /SUMMARY/i.test(f));
232
+ for (const relPath of summaryFiles) {
233
+ try {
234
+ const fullPath = path.join(planningDir, relPath);
235
+ const content = fs.readFileSync(fullPath, 'utf8');
236
+ const fmMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
237
+ if (!fmMatch) continue;
238
+ const fm = fmMatch[1];
239
+
240
+ // Parse deviations block for items with action: "ask"
241
+ const deviationsIdx = fm.indexOf('deviations:');
242
+ if (deviationsIdx === -1) continue;
243
+
244
+ const afterDeviations = fm.substring(deviationsIdx + 'deviations:'.length);
245
+ const firstLine = afterDeviations.split(/\r?\n/)[0].trim();
246
+ if (firstLine === '[]' || firstLine === 'none' || firstLine === '~' || firstLine === 'null') continue;
247
+
248
+ const askDeviations = [];
249
+ const lines = afterDeviations.split(/\r?\n/);
250
+ let currentItem = null;
251
+
252
+ for (const line of lines) {
253
+ if (/^\s+-\s+rule:/.test(line)) {
254
+ if (currentItem && currentItem.action === 'ask') askDeviations.push(currentItem);
255
+ currentItem = {};
256
+ const ruleMatch = line.match(/rule:\s*(\d+)/);
257
+ if (ruleMatch) currentItem.rule = ruleMatch[1];
258
+ } else if (currentItem) {
259
+ if (/^[a-zA-Z_][a-zA-Z0-9_]*:/.test(line)) {
260
+ if (currentItem.action === 'ask') askDeviations.push(currentItem);
261
+ currentItem = null;
262
+ break;
263
+ }
264
+ const actionMatch = line.match(/^\s+action:\s*["']?(\w+)/);
265
+ if (actionMatch) currentItem.action = actionMatch[1];
266
+ const descMatch = line.match(/^\s+description:\s*["']?(.+?)["']?\s*$/);
267
+ if (descMatch) currentItem.description = descMatch[1];
268
+ }
269
+ }
270
+ if (currentItem && currentItem.action === 'ask') askDeviations.push(currentItem);
271
+
272
+ if (askDeviations.length > 0) {
273
+ const descriptions = askDeviations
274
+ .map(d => d.description || `Rule ${d.rule || '?'}`)
275
+ .join('; ');
276
+ warnings.push(`Executor flagged ${askDeviations.length} deviation(s) requiring review: ${descriptions}`);
277
+ }
278
+ } catch (_e) { logHook('subagent-validators', 'debug', 'Failed to check deviations in summary'); }
279
+ }
280
+ }
281
+
282
+ /**
283
+ * Log a compliance violation to .planning/logs/compliance.jsonl.
284
+ * These are surfaced to the user at session end by session-cleanup.js.
285
+ * @param {string} planningDir - Path to .planning/
286
+ * @param {string} agentType - Agent that violated
287
+ * @param {string} violation - What was missing or wrong
288
+ * @param {string} severity - 'required' or 'advisory'
289
+ */
290
+ function logCompliance(planningDir, agentType, violation, severity) {
291
+ try {
292
+ const logsDir = path.join(planningDir, 'logs');
293
+ if (!fs.existsSync(logsDir)) fs.mkdirSync(logsDir, { recursive: true });
294
+ const logFile = path.join(logsDir, 'compliance.jsonl');
295
+ const entry = JSON.stringify({
296
+ ts: new Date().toISOString(),
297
+ agent: agentType,
298
+ violation,
299
+ severity
300
+ });
301
+ fs.appendFileSync(logFile, entry + '\n', 'utf8');
302
+ } catch (_e) { // intentionally silent: compliance logging must not crash hooks
303
+ // Best-effort — never crash the hook
304
+ }
305
+ }
306
+
307
+ /**
308
+ * Check for seeds whose trigger matches the completed phase slug.
309
+ * When an executor completes, check if any seed files in .planning/seeds/
310
+ * have a trigger field matching the current phase slug.
311
+ * @param {string} planningDir - Path to .planning/
312
+ * @param {string[]} warnings - Mutable warnings array to push into
313
+ */
314
+ function checkTriggeredSeeds(planningDir, warnings) {
315
+ try {
316
+ const seedsDir = path.join(planningDir, 'seeds');
317
+ if (!fs.existsSync(seedsDir)) return;
318
+
319
+ // Get current phase slug from STATE.md
320
+ const stateFile = path.join(planningDir, 'STATE.md');
321
+ if (!fs.existsSync(stateFile)) return;
322
+ const stateContent = fs.readFileSync(stateFile, 'utf8');
323
+ const slugMatch = stateContent.match(/^phase_slug:\s*"?([^"\n]+)"?/mi);
324
+ if (!slugMatch) return;
325
+ const phaseSlug = slugMatch[1].trim();
326
+
327
+ const seeds = fs.readdirSync(seedsDir).filter(f => f.endsWith('.md'));
328
+ const triggered = [];
329
+ for (const seed of seeds) {
330
+ try {
331
+ const content = fs.readFileSync(path.join(seedsDir, seed), 'utf-8');
332
+ const triggerMatch = content.match(/trigger:\s*"([^"]+)"/);
333
+ if (triggerMatch && phaseSlug.includes(triggerMatch[1])) {
334
+ const idMatch = seed.match(/SEED-(\d+)/);
335
+ triggered.push({ id: idMatch ? idMatch[1] : seed, trigger: triggerMatch[1] });
336
+ }
337
+ } catch (_e) { /* intentionally silent: seed file may be unreadable */ }
338
+ }
339
+ if (triggered.length > 0) {
340
+ const seedList = triggered.map(s => `SEED-${s.id} (trigger: ${s.trigger})`).join(', ');
341
+ warnings.push(`Seed(s) triggered by phase completion: ${seedList}. Review with /pbr:explore.`);
342
+ }
343
+ } catch (_e) { logHook('subagent-validators', 'debug', 'Failed to check triggered seeds'); }
344
+ }
345
+
346
+ /**
347
+ * Check that LEARNINGS.md exists in the current phase directory.
348
+ * LEARNINGS.md is REQUIRED for all agents — every agent must document what it learned.
349
+ * @param {string} planningDir - Path to .planning/
350
+ * @param {string[]} warnings - Mutable warnings array to push into
351
+ * @param {string} agentLabel - Human-readable agent label for the warning message
352
+ */
353
+ function checkLearningsRequired(planningDir, warnings, agentLabel) {
354
+ const learningsFiles = findInPhaseDir(planningDir, /^LEARNINGS\.md$/i);
355
+ if (learningsFiles.length === 0) {
356
+ warnings.push(`[REQUIRED] No LEARNINGS.md found in phase directory. The ${agentLabel} agent MUST write LEARNINGS.md documenting what it learned — patterns discovered, pitfalls avoided, decisions made. This is required for cross-phase knowledge transfer.`);
357
+ }
358
+ }
359
+
360
+ // Agent type -> expected output patterns
361
+ const AGENT_OUTPUTS = {
362
+ 'pbr:executor': {
363
+ description: 'SUMMARY.md in the phase or quick directory',
364
+ check: (planningDir) => {
365
+ // Check phase directory first, then quick directory
366
+ const phaseMatches = findInPhaseDir(planningDir, /^SUMMARY.*\.md$/i);
367
+ if (phaseMatches.length > 0) return phaseMatches;
368
+ return findInQuickDir(planningDir, /^SUMMARY.*\.md$/i);
369
+ }
370
+ },
371
+ 'pbr:planner': {
372
+ description: 'PLAN.md in the phase directory',
373
+ check: (planningDir) => findInPhaseDir(planningDir, /^PLAN.*\.md$/i)
374
+ },
375
+ 'pbr:verifier': {
376
+ description: 'VERIFICATION.md or VERIFICATION-R{N}.md in the phase directory',
377
+ check: (planningDir) => findInPhaseDir(planningDir, /^VERIFICATION(-R\d+)?\.md$/i)
378
+ },
379
+ 'pbr:researcher': {
380
+ description: 'research file in .planning/research/',
381
+ check: (planningDir) => {
382
+ const researchDir = path.join(planningDir, 'research');
383
+ if (!fs.existsSync(researchDir)) return [];
384
+ try {
385
+ const allFiles = fs.readdirSync(researchDir)
386
+ .filter(f => f.endsWith('.md'))
387
+ .map(f => path.join('research', f));
388
+ if (allFiles.length === 0) return [];
389
+ const recentFiles = allFiles.filter(f => isRecent(path.join(planningDir, f)));
390
+ if (recentFiles.length === 0) {
391
+ // Files exist but none are recent — return them but flag staleness
392
+ allFiles._stale = true;
393
+ }
394
+ return allFiles;
395
+ } catch (_e) { // intentionally silent: directory listing may fail
396
+ return [];
397
+ }
398
+ }
399
+ },
400
+ 'pbr:synthesizer': {
401
+ description: 'synthesis file in .planning/research/ or CONTEXT.md update',
402
+ check: (planningDir) => {
403
+ const researchDir = path.join(planningDir, 'research');
404
+ if (fs.existsSync(researchDir)) {
405
+ try {
406
+ const files = fs.readdirSync(researchDir).filter(f => f.endsWith('.md'));
407
+ if (files.length > 0) {
408
+ const allFiles = files.map(f => path.join('research', f));
409
+ const recentFiles = allFiles.filter(f => isRecent(path.join(planningDir, f)));
410
+ if (recentFiles.length === 0) {
411
+ allFiles._stale = true;
412
+ }
413
+ return allFiles;
414
+ }
415
+ } catch (_e) { /* intentionally silent: directory listing may fail */ }
416
+ }
417
+ const contextFile = path.join(planningDir, 'CONTEXT.md');
418
+ if (fs.existsSync(contextFile)) {
419
+ try {
420
+ const stat = fs.statSync(contextFile);
421
+ if (stat.size > 0) {
422
+ const result = ['CONTEXT.md'];
423
+ if (!isRecent(contextFile)) {
424
+ result._stale = true;
425
+ }
426
+ return result;
427
+ }
428
+ } catch (_e) { /* intentionally silent: directory listing may fail */ }
429
+ }
430
+ return [];
431
+ }
432
+ },
433
+ 'pbr:plan-checker': {
434
+ description: 'advisory output (no file expected)',
435
+ noFileExpected: true,
436
+ check: () => []
437
+ },
438
+ 'pbr:integration-checker': {
439
+ description: 'INTEGRATION-REPORT.md in the phase directory',
440
+ check: (planningDir) => findInPhaseDir(planningDir, /^INTEGRATION-REPORT\.md$/i)
441
+ },
442
+ 'pbr:debugger': {
443
+ description: 'debug file in .planning/debug/',
444
+ check: (planningDir) => {
445
+ const debugDir = path.join(planningDir, 'debug');
446
+ if (!fs.existsSync(debugDir)) return [];
447
+ try {
448
+ return fs.readdirSync(debugDir)
449
+ .filter(f => f.endsWith('.md'))
450
+ .map(f => path.join('debug', f));
451
+ } catch (_e) { // intentionally silent: directory listing may fail
452
+ return [];
453
+ }
454
+ }
455
+ },
456
+ 'pbr:codebase-mapper': {
457
+ description: 'codebase map in .planning/codebase/',
458
+ check: (planningDir) => {
459
+ const codebaseDir = path.join(planningDir, 'codebase');
460
+ if (!fs.existsSync(codebaseDir)) return [];
461
+ try {
462
+ return fs.readdirSync(codebaseDir)
463
+ .filter(f => f.endsWith('.md'))
464
+ .map(f => path.join('codebase', f));
465
+ } catch (_e) { // intentionally silent: directory listing may fail
466
+ return [];
467
+ }
468
+ }
469
+ },
470
+ 'pbr:general': {
471
+ description: 'advisory output (no file expected)',
472
+ noFileExpected: true,
473
+ check: () => []
474
+ },
475
+ 'pbr:audit': {
476
+ description: 'audit report in .planning/audits/',
477
+ check: (planningDir) => {
478
+ const auditsDir = path.join(planningDir, 'audits');
479
+ if (!fs.existsSync(auditsDir)) return [];
480
+ try {
481
+ return fs.readdirSync(auditsDir)
482
+ .filter(f => f.endsWith('.md'))
483
+ .map(f => path.join('audits', f));
484
+ } catch (_e) { // intentionally silent: directory listing may fail
485
+ return [];
486
+ }
487
+ }
488
+ },
489
+ 'pbr:dev-sync': {
490
+ description: 'advisory output (no file expected)',
491
+ noFileExpected: true,
492
+ check: () => []
493
+ },
494
+ 'pbr:intel-updater': {
495
+ description: 'intel files in .planning/intel/',
496
+ check: (planningDir) => {
497
+ const intelDir = path.join(planningDir, 'intel');
498
+ if (!fs.existsSync(intelDir)) return [];
499
+ try {
500
+ return fs.readdirSync(intelDir)
501
+ .filter(f => f.endsWith('.md') || f.endsWith('.json'))
502
+ .map(f => path.join('intel', f));
503
+ } catch (_e) { // intentionally silent: directory listing may fail
504
+ return [];
505
+ }
506
+ }
507
+ },
508
+ 'pbr:ui-checker': {
509
+ description: 'UI-REVIEW.md in the phase directory',
510
+ check: (planningDir) => findInPhaseDir(planningDir, /^UI-REVIEW\.md$/i)
511
+ },
512
+ 'pbr:ui-researcher': {
513
+ description: 'UI-SPEC.md in the phase directory',
514
+ check: (planningDir) => findInPhaseDir(planningDir, /^UI-SPEC\.md$/i)
515
+ },
516
+ 'pbr:roadmapper': {
517
+ description: 'ROADMAP.md in .planning/',
518
+ check: (planningDir) => {
519
+ const roadmapPath = path.join(planningDir, 'ROADMAP.md');
520
+ if (fs.existsSync(roadmapPath)) {
521
+ const result = ['ROADMAP.md'];
522
+ if (!isRecent(roadmapPath)) {
523
+ result._stale = true;
524
+ }
525
+ return result;
526
+ }
527
+ return [];
528
+ }
529
+ },
530
+ 'pbr:nyquist-auditor': {
531
+ description: 'VALIDATION.md in the phase directory',
532
+ check: (planningDir) => {
533
+ const phaseMatches = findInPhaseDir(planningDir, /^VALIDATION\.md$/i);
534
+ return phaseMatches;
535
+ }
536
+ }
537
+ };
538
+
539
+ /**
540
+ * Check if ROADMAP.md is stale after executor/verifier completion.
541
+ * Detects: (1) no Progress table for current milestone, (2) table exists but
542
+ * phase row is out of date vs. phase artifacts on disk.
543
+ *
544
+ * @param {string} planningDir - Path to .planning/
545
+ * @returns {string|null} Warning message or null if in sync
546
+ */
547
+ function checkRoadmapStaleness(planningDir) {
548
+ const roadmapPath = path.join(planningDir, 'ROADMAP.md');
549
+ if (!fs.existsSync(roadmapPath)) return null;
550
+
551
+ try {
552
+ const content = fs.readFileSync(roadmapPath, 'utf8');
553
+
554
+ // Check if there's a Progress table at all
555
+ const hasProgressTable = /Plans\s*Complete/i.test(content);
556
+ if (!hasProgressTable) {
557
+ return 'ROADMAP.md has no Progress table for the current milestone. The orchestrator should add a Progress table with columns: Phase | Plans Complete | Status | Completed. See skills/shared/state-update.md for format.';
558
+ }
559
+
560
+ // If table exists, check if current phase row is present
561
+ const stateFile = path.join(planningDir, 'STATE.md');
562
+ if (fs.existsSync(stateFile)) {
563
+ const stateContent = fs.readFileSync(stateFile, 'utf8');
564
+ const currentPhase = getCurrentPhase(stateContent);
565
+ if (currentPhase) {
566
+ const paddedPhase = currentPhase.padStart(2, '0');
567
+ const phaseInTable = new RegExp(`\\|\\s*${paddedPhase}\\.`).test(content) ||
568
+ new RegExp(`\\|\\s*${parseInt(currentPhase, 10)}\\.`).test(content);
569
+ if (!phaseInTable) {
570
+ return `ROADMAP.md Progress table exists but has no row for Phase ${currentPhase}. Add a row for the current phase.`;
571
+ }
572
+ }
573
+ }
574
+ } catch (_e) { // intentionally silent: roadmap check is best-effort
575
+ // best-effort
576
+ }
577
+ return null;
578
+ }
579
+
580
+ // Skill-specific check lookup table keyed by 'activeSkill:agentType'
581
+ const SKILL_CHECKS = {
582
+ 'begin:pbr:planner': {
583
+ description: 'begin planner core files',
584
+ check: (planningDir, _found, warnings) => {
585
+ const coreFiles = ['REQUIREMENTS.md', 'ROADMAP.md', 'STATE.md'];
586
+ for (const f of coreFiles) {
587
+ if (!fs.existsSync(path.join(planningDir, f))) {
588
+ warnings.push(`Begin planner: ${f} was not created. The project may be in an incomplete state.`);
589
+ }
590
+ }
591
+ }
592
+ },
593
+ 'plan:pbr:researcher': {
594
+ description: 'plan researcher phase-level RESEARCH.md and LEARNINGS.md',
595
+ check: (planningDir, found, warnings) => {
596
+ const phaseResearch = findInPhaseDir(planningDir, /^RESEARCH\.md$/i);
597
+ if (found.length === 0 && phaseResearch.length === 0) {
598
+ warnings.push('Plan researcher: No research output found in .planning/research/ or in the phase directory.');
599
+ }
600
+ checkLearningsRequired(planningDir, warnings, 'researcher');
601
+ }
602
+ },
603
+ 'plan:pbr:planner': {
604
+ description: 'plan planner LEARNINGS.md and handoff completeness',
605
+ check: (planningDir, found, warnings) => {
606
+ checkLearningsRequired(planningDir, warnings, 'planner');
607
+ // Handoff completeness check (REQ-HI-03)
608
+ const planFiles = (found || []).filter(f => /PLAN/i.test(f));
609
+ for (const relPath of planFiles) {
610
+ try {
611
+ const fullPath = path.join(planningDir, relPath);
612
+ const result = handoff.validatePlanCompleteness(fullPath);
613
+ if (!result.adequate) {
614
+ warnings.push(...result.warnings.map(w => `Handoff: ${w}`));
615
+ }
616
+ } catch (_e) { /* intentionally silent: handoff check must not crash hooks */ }
617
+ }
618
+ }
619
+ },
620
+ 'scan:pbr:codebase-mapper': {
621
+ description: 'scan codebase-mapper 4 focus areas',
622
+ check: (planningDir, _found, warnings) => {
623
+ const expectedAreas = ['tech', 'arch', 'quality', 'concerns'];
624
+ const codebaseDir = path.join(planningDir, 'codebase');
625
+ if (fs.existsSync(codebaseDir)) {
626
+ try {
627
+ const files = fs.readdirSync(codebaseDir).map(f => f.toLowerCase());
628
+ for (const area of expectedAreas) {
629
+ if (!files.some(f => f.includes(area))) {
630
+ warnings.push(`Scan mapper: No output file containing "${area}" found in .planning/codebase/. One of the 4 mappers may have failed.`);
631
+ }
632
+ }
633
+ } catch (_e) { /* intentionally silent: directory listing may fail */ }
634
+ }
635
+ }
636
+ },
637
+ 'review:pbr:verifier': {
638
+ description: 'review verifier VERIFICATION.md status, LEARNINGS.md, and trust update',
639
+ check: (planningDir, _found, warnings) => {
640
+ const verFiles = findInPhaseDir(planningDir, /^VERIFICATION(-R\d+)?\.md$/i);
641
+ for (const vf of verFiles) {
642
+ logHook('subagent-validators', 'debug', 'Found verification file: ' + vf);
643
+ try {
644
+ const content = fs.readFileSync(path.join(planningDir, vf), 'utf8');
645
+ const statusMatch = content.match(/^status:\s*(\S+)/mi);
646
+ if (statusMatch && statusMatch[1] === 'gaps_found') {
647
+ warnings.push('Review verifier: VERIFICATION.md has status "gaps_found" — ensure gaps are surfaced to the user.');
648
+ }
649
+ } catch (_e) { logHook('subagent-validators', 'debug', 'Skill check failed in review:pbr:verifier'); }
650
+ }
651
+ checkLearningsRequired(planningDir, warnings, 'verifier');
652
+ // Handoff completeness check (REQ-HI-03)
653
+ for (const vf of verFiles) {
654
+ try {
655
+ const fullPath = path.join(planningDir, vf);
656
+ const result = handoff.validateVerificationCompleteness(fullPath);
657
+ if (!result.adequate) {
658
+ warnings.push(...result.warnings.map(w => `Handoff: ${w}`));
659
+ }
660
+ } catch (_e) { /* intentionally silent: handoff check must not crash hooks */ }
661
+ }
662
+
663
+ // Trust score update: record verification outcome
664
+ try {
665
+ if (!shouldTrackTrust(planningDir)) return;
666
+ const outcome = extractVerificationOutcome(planningDir);
667
+ if (!outcome) return;
668
+ const { recordOutcome } = require('../trust-tracker');
669
+ recordOutcome(planningDir, 'pbr:executor', outcome.category, outcome.passed);
670
+ recordOutcome(planningDir, 'pbr:verifier', outcome.category, true);
671
+ logHook('check-subagent-output', 'PostToolUse', 'trust-updated', {
672
+ agent: 'pbr:executor',
673
+ category: outcome.category,
674
+ passed: outcome.passed
675
+ });
676
+ } catch (_e) { logHook('subagent-validators', 'debug', 'Skill check error in review:pbr:verifier');
677
+ // Never crash the hook for trust tracking failures
678
+ }
679
+ }
680
+ },
681
+ 'build:pbr:executor': {
682
+ description: 'build executor SUMMARY commits, self-check, LEARNINGS.md, and convention update',
683
+ check: (planningDir, found, warnings) => {
684
+ // Warn if no SUMMARY.md was created by the executor
685
+ if (found.length === 0) {
686
+ warnings.push('Build executor completed but no SUMMARY.md was found in the phase or quick directory. The executor may have skipped artifact creation. Re-run the build skill to generate the missing artifact.');
687
+ }
688
+ checkSummaryCommits(planningDir, found, warnings);
689
+ // Check for deviations requiring user review (Rule 3/4 with action: "ask")
690
+ checkDeviationsRequiringReview(planningDir, found, warnings);
691
+ // Validate self-verification ran when feature is enabled
692
+ const summaryFiles = found.filter(f => /SUMMARY/i.test(f));
693
+ for (const relPath of summaryFiles) {
694
+ try {
695
+ const fullPath = path.join(planningDir, relPath);
696
+ const { resolveConfig } = require('./config');
697
+ const config = resolveConfig(planningDir);
698
+ const selfCheckWarnings = validateSelfCheck(fullPath, config);
699
+ warnings.push(...selfCheckWarnings);
700
+ } catch (_e) { logHook('subagent-validators', 'debug', 'Skill check failed in build:pbr:executor'); }
701
+ }
702
+ // Handoff completeness check (REQ-HI-03)
703
+ for (const relPath of summaryFiles) {
704
+ try {
705
+ const fullPath = path.join(planningDir, relPath);
706
+ const result = handoff.validateSummaryCompleteness(fullPath);
707
+ if (!result.adequate) {
708
+ warnings.push(...result.warnings.map(w => `Handoff: ${w}`));
709
+ }
710
+ } catch (_e) { /* intentionally silent: handoff check must not crash hooks */ }
711
+ }
712
+ // Extract feedback for agent prompt enrichment
713
+ try {
714
+ const { extractFeedback, isEnabled } = require('../feedback-loop');
715
+ if (isEnabled(planningDir)) {
716
+ const phaseDirMatches = found.filter(f => /^phases[/\\]/.test(f));
717
+ const phaseDir = phaseDirMatches.length > 0
718
+ ? path.join(planningDir, phaseDirMatches[0].split(/[/\\]/).slice(0, 2).join(path.sep))
719
+ : null;
720
+ if (phaseDir) {
721
+ const feedback = extractFeedback(phaseDir);
722
+ if (feedback) {
723
+ warnings.push(`Feedback loop: ${feedback.summary || 'verification feedback recorded'}`);
724
+ }
725
+ }
726
+ }
727
+ } catch (_e) { logHook('subagent-validators', 'debug', 'Skill check failed in build:pbr:executor'); }
728
+ checkLearningsRequired(planningDir, warnings, 'executor');
729
+ // Check for seeds triggered by this phase completion
730
+ checkTriggeredSeeds(planningDir, warnings);
731
+ // Log post-hoc skip for non-quick executors (audit evidence)
732
+ const { logEvent } = require('../event-logger');
733
+ logEvent('post_hoc', 'post_hoc_skipped', { reason: 'not_quick_task', feature: 'post_hoc_artifacts' });
734
+ // Update conventions after successful build
735
+ updateConventionsAfterBuild(planningDir);
736
+ // Log inline execution decision for audit
737
+ try {
738
+ const inlineSignal = path.join(planningDir, '.inline-active');
739
+ const wasInline = fs.existsSync(inlineSignal);
740
+ logInlineDecision(planningDir, {
741
+ inline: wasInline,
742
+ decision: wasInline ? 'inline' : 'delegate',
743
+ reason: wasInline ? 'signal file present' : 'normal task spawn',
744
+ taskCount: found.filter(f => /SUMMARY/i.test(f)).length,
745
+ fileCount: 0
746
+ });
747
+ } catch (_e) { /* intentionally silent: audit logging must not crash hooks */ }
748
+ }
749
+ },
750
+ 'quick:pbr:executor': {
751
+ description: 'quick executor SUMMARY commits and post-hoc generation',
752
+ check: (planningDir, found, warnings) => {
753
+ checkSummaryCommits(planningDir, found, warnings);
754
+ // Post-hoc SUMMARY.md generation for quick tasks
755
+ const postHocEnabled = loadFeatureFlag(planningDir, 'post_hoc_artifacts');
756
+ if (postHocEnabled === false) {
757
+ const { logEvent } = require('../event-logger');
758
+ logEvent('post_hoc', 'post_hoc_skipped', { reason: 'feature_disabled', feature: 'post_hoc_artifacts' });
759
+ return;
760
+ }
761
+ // Check if SUMMARY.md is missing in the quick dir
762
+ const quickSummaries = findInQuickDir(planningDir, /^SUMMARY.*\.md$/i);
763
+ if (quickSummaries.length > 0) return; // Already exists, no need for post-hoc
764
+ // Find the latest quick task directory
765
+ const quickDir = path.join(planningDir, 'quick');
766
+ if (!fs.existsSync(quickDir)) return;
767
+ try {
768
+ const dirs = fs.readdirSync(quickDir)
769
+ .filter(d => /^\d{3}-/.test(d))
770
+ .sort()
771
+ .reverse();
772
+ if (dirs.length === 0) return;
773
+ const taskDir = path.join(quickDir, dirs[0]);
774
+ const taskSlug = dirs[0];
775
+ // Attempt post-hoc generation
776
+ try {
777
+ const { generateSummary } = require(path.join(__dirname, 'post-hoc'));
778
+ const projectRoot = path.resolve(planningDir, '..');
779
+ const result = generateSummary(projectRoot, taskDir, {
780
+ commitPattern: taskSlug.replace(/^(\d{3})-.*/, 'quick-$1')
781
+ });
782
+ const { logEvent } = require('../event-logger');
783
+ logEvent('post_hoc', 'post_hoc_summary_generated', {
784
+ taskDir: taskSlug,
785
+ commitCount: result.commitCount,
786
+ feature: 'post_hoc_artifacts',
787
+ timestamp: new Date().toISOString()
788
+ });
789
+ warnings.push(`SUMMARY.md auto-generated post-hoc for quick task ${taskSlug} (${result.commitCount} commits found)`);
790
+ } catch (_genErr) { // error logged via logEvent below
791
+ const { logEvent } = require('../event-logger');
792
+ logEvent('post_hoc', 'post_hoc_generation_failed', {
793
+ taskDir: taskSlug,
794
+ error: _genErr.message,
795
+ feature: 'post_hoc_artifacts'
796
+ });
797
+ }
798
+ } catch (_e) { logHook('subagent-validators', 'debug', 'Failed in quick executor post-hoc check'); }
799
+ }
800
+ },
801
+ 'begin:pbr:researcher': {
802
+ description: 'begin researcher YAML frontmatter validation',
803
+ check: (planningDir, found, warnings) => {
804
+ const EXPECTED_NAMES = ['STACK.md', 'FEATURES.md', 'ARCHITECTURE.md', 'PITFALLS.md'];
805
+ for (const relPath of found) {
806
+ const basename = path.basename(relPath);
807
+ // Skip SUMMARY.md -- that's synthesizer output
808
+ if (basename.toUpperCase() === 'SUMMARY.MD') continue;
809
+ try {
810
+ // Warn if unexpected filename
811
+ if (!EXPECTED_NAMES.includes(basename)) {
812
+ warnings.push(`${basename}: unexpected research file name. Expected one of: ${EXPECTED_NAMES.join(', ')}`);
813
+ }
814
+ // Read and validate YAML frontmatter
815
+ const fullPath = path.join(planningDir, relPath);
816
+ const content = fs.readFileSync(fullPath, 'utf8');
817
+ const fmMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
818
+ if (!fmMatch) {
819
+ warnings.push(`${basename}: YAML frontmatter is missing. Researcher output must include frontmatter with confidence and sources_checked fields.`);
820
+ continue;
821
+ }
822
+ const fm = fmMatch[1];
823
+ if (!/confidence\s*:/i.test(fm)) {
824
+ warnings.push(`${basename}: frontmatter missing "confidence" field.`);
825
+ }
826
+ if (!/sources_checked\s*:/i.test(fm)) {
827
+ warnings.push(`${basename}: frontmatter missing "sources_checked" field.`);
828
+ }
829
+ } catch (_e) { /* intentionally silent: directory listing may fail */ }
830
+ }
831
+ }
832
+ },
833
+ 'begin:pbr:roadmapper': {
834
+ description: 'begin roadmapper LEARNINGS.md',
835
+ check: (planningDir, _found, warnings) => {
836
+ checkLearningsRequired(planningDir, warnings, 'roadmapper');
837
+ }
838
+ },
839
+ 'debug:pbr:debugger': {
840
+ description: 'debug agent LEARNINGS.md',
841
+ check: (planningDir, _found, warnings) => {
842
+ // Debugger writes to .planning/debug/ — check LEARNINGS there
843
+ const debugDir = path.join(planningDir, 'debug');
844
+ if (!fs.existsSync(debugDir)) return;
845
+ try {
846
+ const files = fs.readdirSync(debugDir);
847
+ const hasLearnings = files.some(f => /^LEARNINGS/i.test(f));
848
+ if (!hasLearnings) {
849
+ warnings.push('[REQUIRED] No LEARNINGS.md found in .planning/debug/. The debugger agent MUST document what it learned — root causes found, debugging approaches that worked, environment quirks discovered.');
850
+ }
851
+ } catch (_e) { /* intentionally silent: directory listing may fail */ }
852
+ }
853
+ },
854
+ 'begin:pbr:synthesizer': {
855
+ description: 'begin synthesizer SUMMARY.md structure validation',
856
+ check: (planningDir, _found, warnings) => {
857
+ // Check for SUMMARY.md in research directory
858
+ const researchDir = path.join(planningDir, 'research');
859
+ const summaryPath = path.join(researchDir, 'SUMMARY.md');
860
+ try {
861
+ if (!fs.existsSync(summaryPath)) {
862
+ warnings.push('SUMMARY.md not found in .planning/research/. Synthesizer must produce a SUMMARY.md.');
863
+ return;
864
+ }
865
+ const content = fs.readFileSync(summaryPath, 'utf8');
866
+ // Check for Research Coverage table
867
+ if (!/research\s+coverage/i.test(content)) {
868
+ warnings.push('SUMMARY.md missing "Research Coverage" table.');
869
+ }
870
+ // Check for Confidence Assessment table
871
+ if (!/confidence\s+assessment/i.test(content)) {
872
+ warnings.push('SUMMARY.md missing "Confidence Assessment" table.');
873
+ }
874
+ // Check all 4 dimensions are referenced
875
+ const dimensions = ['Stack', 'Features', 'Architecture', 'Pitfalls'];
876
+ for (const dim of dimensions) {
877
+ if (!new RegExp(dim, 'i').test(content)) {
878
+ warnings.push(`SUMMARY.md missing dimension: ${dim}. All 4 research dimensions must be covered.`);
879
+ }
880
+ }
881
+ } catch (_e) { /* intentionally silent: directory listing may fail */ }
882
+ }
883
+ },
884
+ 'milestone:pbr:general': {
885
+ description: 'milestone archive completeness validation',
886
+ check: (planningDir, _found, warnings) => {
887
+ // After milestone completion, verify the archive structure
888
+ const milestonesDir = path.join(planningDir, 'milestones');
889
+ if (!fs.existsSync(milestonesDir)) return;
890
+
891
+ try {
892
+ // Find the most recent milestone archive (highest version)
893
+ const archiveDirs = fs.readdirSync(milestonesDir)
894
+ .filter(d => d.startsWith('v') && fs.statSync(path.join(milestonesDir, d)).isDirectory())
895
+ .sort()
896
+ .reverse();
897
+
898
+ if (archiveDirs.length === 0) return;
899
+
900
+ const latestArchive = path.join(milestonesDir, archiveDirs[0]);
901
+ const archiveFiles = fs.readdirSync(latestArchive);
902
+
903
+ // Check for required archive files
904
+ if (!archiveFiles.includes('ROADMAP.md')) {
905
+ warnings.push(`[REQUIRED] Milestone archive ${archiveDirs[0]}: missing ROADMAP.md snapshot`);
906
+ }
907
+ if (!archiveFiles.includes('STATS.md')) {
908
+ warnings.push(`[REQUIRED] Milestone archive ${archiveDirs[0]}: missing STATS.md summary`);
909
+ }
910
+
911
+ // Check for phases/ subdirectory with per-phase artifacts
912
+ const archivePhasesDir = path.join(latestArchive, 'phases');
913
+ if (fs.existsSync(archivePhasesDir)) {
914
+ const phaseDirs = fs.readdirSync(archivePhasesDir)
915
+ .filter(d => fs.statSync(path.join(archivePhasesDir, d)).isDirectory());
916
+
917
+ for (const pd of phaseDirs) {
918
+ const phaseFiles = fs.readdirSync(path.join(archivePhasesDir, pd));
919
+ const hasPlan = phaseFiles.some(f => /^PLAN/i.test(f));
920
+ const hasSummary = phaseFiles.some(f => /^SUMMARY/i.test(f));
921
+ const hasVerification = phaseFiles.some(f => f === 'VERIFICATION.md');
922
+
923
+ if (!hasPlan) warnings.push(`[REQUIRED] Archive phase ${pd}: missing PLAN.md`);
924
+ if (!hasSummary) warnings.push(`[REQUIRED] Archive phase ${pd}: missing SUMMARY.md`);
925
+ if (!hasVerification) warnings.push(`[REQUIRED] Archive phase ${pd}: missing VERIFICATION.md`);
926
+ }
927
+ } else {
928
+ warnings.push(`[REQUIRED] Milestone archive ${archiveDirs[0]}: missing phases/ subdirectory`);
929
+ }
930
+ } catch (_e) { logHook('subagent-validators', 'debug', 'Failed in milestone archive validation'); }
931
+ }
932
+ },
933
+ 'autonomous:pbr:executor': {
934
+ description: 'autonomous executor reminder to verify phase before completion',
935
+ check: (planningDir, _found, warnings) => {
936
+ // When executor completes during autonomous mode, remind the orchestrator
937
+ // to run Step 3d (verification) before proceeding to Step 3e (phase complete).
938
+ // This catches the known failure mode where the LLM skips verification.
939
+ try {
940
+ const statePath = path.join(planningDir, 'STATE.md');
941
+ if (!fs.existsSync(statePath)) return;
942
+ const stateContent = fs.readFileSync(statePath, 'utf8');
943
+ const phase = getCurrentPhase(stateContent);
944
+ if (!phase) return;
945
+ const padded = String(phase).padStart(2, '0');
946
+ const phasesDir = path.join(planningDir, 'phases');
947
+ if (!fs.existsSync(phasesDir)) return;
948
+ const phaseDirEntry = fs.readdirSync(phasesDir).find(d => d.startsWith(padded + '-'));
949
+ if (!phaseDirEntry) return;
950
+ const fullPhaseDir = path.join(phasesDir, phaseDirEntry);
951
+ const hasVerification = fs.readdirSync(fullPhaseDir).some(f => /^VERIFICATION(-R\d+)?\.md$/i.test(f));
952
+ if (!hasVerification) {
953
+ warnings.push(`CRITICAL REMINDER: Phase ${phase} build complete but VERIFICATION.md is missing. You MUST execute Step 3d (Verify Phase) NOW before proceeding to Step 3e. Do NOT skip verification.`);
954
+ }
955
+ } catch (_e) { logHook('subagent-validators', 'debug', 'Failed in autonomous executor verification check'); }
956
+ }
957
+ }
958
+ };
959
+
960
+ /**
961
+ * Update convention patterns after a build executor completes.
962
+ * Gated by features.convention_memory config toggle.
963
+ * Non-fatal — convention detection failure never crashes the hook.
964
+ *
965
+ * @param {string} planningDir - Path to .planning directory
966
+ */
967
+ function updateConventionsAfterBuild(planningDir) {
968
+ try {
969
+ const config = loadFeatureFlag(planningDir, 'convention_memory');
970
+ if (config === false) return;
971
+
972
+ const cwd = process.env.PBR_PROJECT_ROOT || process.cwd();
973
+ const conventions = detectConventions(cwd);
974
+ const totalPatterns = Object.values(conventions).reduce((sum, arr) => sum + arr.length, 0);
975
+ if (totalPatterns > 0) {
976
+ writeConventions(planningDir, conventions);
977
+ logHook('check-subagent-output', 'PostToolUse', 'conventions-updated', { patterns: totalPatterns });
978
+ }
979
+ } catch (_e) {
980
+ // Convention detection failure is non-fatal
981
+ logHook('check-subagent-output', 'PostToolUse', 'conventions-failed', { error: _e.message });
982
+ }
983
+ }
984
+
985
+ /**
986
+ * Log an inline execution decision to .planning/logs/hooks.jsonl for audit evidence.
987
+ * Called by the build skill orchestrator after running shouldInlineExecution.
988
+ *
989
+ * @param {string} planningDir - Path to .planning/ directory
990
+ * @param {object} decision - Result from shouldInlineExecution
991
+ * @param {boolean} decision.inline - Whether inline execution was chosen
992
+ * @param {string} [decision.reason] - Reason for the decision
993
+ * @param {number} [decision.taskCount] - Number of tasks in the plan
994
+ * @param {number} [decision.fileCount] - Number of files in the plan
995
+ * @param {number} [decision.estimatedLines] - Estimated lines of code
996
+ */
997
+ function logInlineDecision(planningDir, decision) {
998
+ try {
999
+ const logsDir = path.join(planningDir, 'logs');
1000
+ if (!fs.existsSync(logsDir)) fs.mkdirSync(logsDir, { recursive: true });
1001
+ const logFile = path.join(logsDir, 'hooks.jsonl');
1002
+ const entry = JSON.stringify({
1003
+ timestamp: new Date().toISOString(),
1004
+ hook: 'inline-execution-gate',
1005
+ decision: decision.inline ? 'inline' : 'delegate',
1006
+ reason: decision.reason || null,
1007
+ taskCount: decision.taskCount || 0,
1008
+ fileCount: decision.fileCount || 0,
1009
+ estimatedLines: decision.estimatedLines || 0
1010
+ });
1011
+ fs.appendFileSync(logFile, entry + '\n', 'utf8');
1012
+ } catch (_e) { // intentionally silent: audit logging must not crash hooks
1013
+ // Best-effort — never crash the caller
1014
+ }
1015
+ }
1016
+
1017
+ /**
1018
+ * Validate self-verification data in an executor SUMMARY.md file.
1019
+ */
1020
+ function validateSelfCheck(summaryPath, config) {
1021
+ if (!config || !config.features || !config.features.self_verification) {
1022
+ return [];
1023
+ }
1024
+ const warnings = [];
1025
+ try {
1026
+ const content = fs.readFileSync(summaryPath, 'utf8');
1027
+ const fmMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
1028
+ if (!fmMatch) {
1029
+ warnings.push('Executor SUMMARY.md missing self_check field — self-verification may not have run');
1030
+ return warnings;
1031
+ }
1032
+ const fm = fmMatch[1];
1033
+ if (!/self_check\s*:/i.test(fm)) {
1034
+ warnings.push('Executor SUMMARY.md missing self_check field — self-verification may not have run');
1035
+ return warnings;
1036
+ }
1037
+ const failedMatch = fm.match(/failed\s*:\s*(\d+)/);
1038
+ const retriesMatch = fm.match(/retries\s*:\s*(\d+)/);
1039
+ if (failedMatch && parseInt(failedMatch[1], 10) > 0) {
1040
+ const failed = failedMatch[1];
1041
+ const retries = retriesMatch ? retriesMatch[1] : '0';
1042
+ warnings.push(`Executor self-check reported ${failed} failed must-haves after ${retries} retries`);
1043
+ }
1044
+ } catch (_e) { /* intentionally silent: self-check parse error is non-fatal */ }
1045
+ return warnings;
1046
+ }
1047
+
1048
+ /**
1049
+ * Skills that require AskUserQuestion gate prompts.
1050
+ * Value = minimum expected calls (0 = conditional, warn only if zero).
1051
+ */
1052
+ const SKILLS_REQUIRING_GATES = {
1053
+ health: 1,
1054
+ milestone: 1,
1055
+ import: 1,
1056
+ review: 1,
1057
+ discuss: 1,
1058
+ build: 0
1059
+ };
1060
+
1061
+ /**
1062
+ * Check whether a gate-requiring skill completed without any AskUserQuestion calls.
1063
+ * Called by check-subagent-output.js after subagent completion.
1064
+ *
1065
+ * @param {string} planningDir - Path to .planning/ directory
1066
+ * @param {string} skillName - Active skill name
1067
+ * @returns {string|null} Warning message or null if compliant
1068
+ */
1069
+ function checkUserGateCompliance(planningDir, skillName) {
1070
+ if (!skillName || !Object.prototype.hasOwnProperty.call(SKILLS_REQUIRING_GATES, skillName)) {
1071
+ return null; // Not a gate-requiring skill
1072
+ }
1073
+
1074
+ const signalPath = path.join(planningDir, '.user-gate-passed');
1075
+
1076
+ try {
1077
+ if (!fs.existsSync(signalPath)) {
1078
+ return `Skill '${skillName}' completed without any AskUserQuestion calls. This skill has gate-prompt references that should require user confirmation.`;
1079
+ }
1080
+
1081
+ const signalData = JSON.parse(fs.readFileSync(signalPath, 'utf8'));
1082
+
1083
+ // Check if signal matches current skill
1084
+ if (signalData.skill !== skillName) {
1085
+ return `Skill '${skillName}' completed without any AskUserQuestion calls. This skill has gate-prompt references that should require user confirmation.`;
1086
+ }
1087
+
1088
+ // Signal exists and matches — clean up
1089
+ try { fs.unlinkSync(signalPath); } catch (_e) { /* intentionally silent: signal file cleanup */ }
1090
+ return null;
1091
+ } catch (_e) { logHook('subagent-validators', 'debug', 'Failed to check user gate compliance');
1092
+ // If signal file exists but can't be parsed, treat as missing
1093
+ return `Skill '${skillName}' completed without any AskUserQuestion calls. This skill has gate-prompt references that should require user confirmation.`;
1094
+ }
1095
+ }
1096
+
1097
+ module.exports = {
1098
+ AGENT_TO_SKILL,
1099
+ AGENT_OUTPUTS,
1100
+ SKILL_CHECKS,
1101
+ findInPhaseDir,
1102
+ findInQuickDir,
1103
+ checkSummaryCommits,
1104
+ checkDeviationsRequiringReview,
1105
+ logCompliance,
1106
+ checkTriggeredSeeds,
1107
+ checkLearningsRequired,
1108
+ isRecent,
1109
+ getCurrentPhase,
1110
+ checkRoadmapStaleness,
1111
+ logInlineDecision,
1112
+ extractVerificationOutcome,
1113
+ shouldTrackTrust,
1114
+ loadFeatureFlag,
1115
+ updateConventionsAfterBuild,
1116
+ validateSelfCheck,
1117
+ checkUserGateCompliance,
1118
+ SKILLS_REQUIRING_GATES
1119
+ };