@sienklogic/plan-build-run 2.11.0 → 2.12.1

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