@sienklogic/plan-build-run 2.12.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 -234
  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 +167 -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 +294 -283
  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 +57 -4
  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 -291
  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 +326 -100
  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 -626
  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,1210 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Workflow Compliance Check Module
5
+ *
6
+ * Implements WC-02, WC-03, WC-04, WC-05, WC-06, WC-08, WC-09, WC-12
7
+ * workflow compliance dimensions for the PBR audit system. Each check
8
+ * returns a structured result: { dimension, status, message, evidence }.
9
+ *
10
+ * Checks:
11
+ * WC-01: CI verification after push (gh run list/view/watch after git push)
12
+ * WC-02: State file integrity (STATE.md matches disk)
13
+ * WC-03: STATE.md frontmatter integrity (valid YAML, required fields)
14
+ * WC-04: ROADMAP sync validation (ROADMAP.md matches phase directories)
15
+ * WC-05: Planning artifact completeness (SUMMARY + VERIFICATION)
16
+ * WC-06: Artifact format validation (required fields, task blocks)
17
+ * WC-07: Compaction quality (STATE.md preservation after compact events)
18
+ * WC-08: Naming convention compliance (PLAN-{NN}.md format)
19
+ * WC-09: Commit pattern validation (heredoc, --no-verify detection)
20
+ * WC-10: Model selection compliance (agent model vs config.models)
21
+ * WC-11: Git branching compliance (phase branches when git.branching=phase)
22
+ * WC-12: Test health baseline comparison
23
+ */
24
+
25
+ const fs = require('fs');
26
+ const path = require('path');
27
+ const { execSync } = require('child_process');
28
+
29
+ // ---------------------------------------------------------------------------
30
+ // Result helper
31
+ // ---------------------------------------------------------------------------
32
+
33
+ /**
34
+ * Build a structured check result.
35
+ * @param {string} dimCode - Dimension code (e.g. "WC-02")
36
+ * @param {'pass'|'warn'|'fail'} status
37
+ * @param {string} message
38
+ * @param {string[]} [evidence]
39
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
40
+ */
41
+ function result(dimCode, status, message, evidence) {
42
+ return {
43
+ dimension: dimCode,
44
+ status,
45
+ message,
46
+ evidence: evidence || [],
47
+ };
48
+ }
49
+
50
+ // ---------------------------------------------------------------------------
51
+ // YAML frontmatter parser (lightweight, no external deps)
52
+ // ---------------------------------------------------------------------------
53
+
54
+ /**
55
+ * Extract YAML frontmatter from markdown content as key-value pairs.
56
+ * Handles both \n and \r\n line endings.
57
+ * @param {string} content
58
+ * @returns {object} Parsed frontmatter fields
59
+ */
60
+ function parseFrontmatter(content) {
61
+ const lines = content.replace(/\r\n/g, '\n').split('\n');
62
+ if (lines[0] !== '---') return {};
63
+
64
+ const fields = {};
65
+ for (let i = 1; i < lines.length; i++) {
66
+ if (lines[i] === '---') break;
67
+ const match = lines[i].match(/^(\w[\w_-]*):\s*(.*)$/);
68
+ if (match) {
69
+ let value = match[2].trim();
70
+ // Strip surrounding quotes
71
+ if ((value.startsWith('"') && value.endsWith('"')) ||
72
+ (value.startsWith("'") && value.endsWith("'"))) {
73
+ value = value.slice(1, -1);
74
+ }
75
+ // Parse arrays (simple single-line format)
76
+ if (value === '[]') {
77
+ value = [];
78
+ } else if (value === 'null' || value === '') {
79
+ value = value === 'null' ? null : value;
80
+ }
81
+ fields[match[1]] = value;
82
+ }
83
+ }
84
+ return fields;
85
+ }
86
+
87
+ // ---------------------------------------------------------------------------
88
+ // Session log helper (shared by WC-01, WC-07, WC-09, WC-10)
89
+ // ---------------------------------------------------------------------------
90
+
91
+ /**
92
+ * Find session JSONL log files for the current project.
93
+ * Returns an array of absolute paths to the most recent log files.
94
+ * @param {string} planningDir - Path to .planning/ directory
95
+ * @param {number} [maxFiles=5] - Maximum number of log files to return
96
+ * @returns {string[]}
97
+ */
98
+ function findSessionLogs(planningDir, maxFiles) {
99
+ if (maxFiles === undefined) maxFiles = 5;
100
+ const projectRoot = path.resolve(planningDir, '..');
101
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
102
+ const encodedPath = projectRoot.replace(/[/\\:]/g, '-').replace(/^-+/, '');
103
+ const claudeProjectsDir = path.join(homeDir, '.claude', 'projects');
104
+ const sessionLogs = [];
105
+
106
+ try {
107
+ const projectDirs = fs.readdirSync(claudeProjectsDir);
108
+ for (const dir of projectDirs) {
109
+ if (encodedPath.includes(dir) || dir.includes('plan-build-run')) {
110
+ const fullDir = path.join(claudeProjectsDir, dir);
111
+ try {
112
+ const stat = fs.statSync(fullDir);
113
+ if (!stat.isDirectory()) continue;
114
+ const files = fs.readdirSync(fullDir);
115
+ const jsonlFiles = files.filter(f => f.endsWith('.jsonl'));
116
+ const paths = jsonlFiles
117
+ .sort()
118
+ .slice(-maxFiles)
119
+ .map(f => path.join(fullDir, f));
120
+ sessionLogs.push(...paths);
121
+ } catch (_e) {
122
+ // skip
123
+ }
124
+ }
125
+ }
126
+ } catch (_e) {
127
+ // No session logs directory
128
+ }
129
+
130
+ return sessionLogs;
131
+ }
132
+
133
+ /**
134
+ * Parse session JSONL entries from a list of log files.
135
+ * Returns an array of parsed JSON objects.
136
+ * @param {string[]} logFiles
137
+ * @returns {object[]}
138
+ */
139
+ function parseSessionEntries(logFiles) {
140
+ const entries = [];
141
+ for (const logFile of logFiles) {
142
+ try {
143
+ const content = fs.readFileSync(logFile, 'utf8');
144
+ const lines = content.split('\n').filter(l => l.trim());
145
+ for (const line of lines) {
146
+ try {
147
+ entries.push(JSON.parse(line));
148
+ } catch (_e) {
149
+ // skip malformed lines
150
+ }
151
+ }
152
+ } catch (_e) {
153
+ // skip unreadable files
154
+ }
155
+ }
156
+ return entries;
157
+ }
158
+
159
+ // ---------------------------------------------------------------------------
160
+ // WC-01: CI Verification After Push
161
+ // ---------------------------------------------------------------------------
162
+
163
+ /**
164
+ * Detect git push commands not followed by CI verification (gh run list/view/watch).
165
+ * Scans session JSONL logs for Bash tool_use entries.
166
+ *
167
+ * @param {string} planningDir - Path to .planning/ directory
168
+ * @param {object} _config - Parsed config.json (unused)
169
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
170
+ */
171
+ function checkCiVerifyAfterPush(planningDir, _config) {
172
+ const logFiles = findSessionLogs(planningDir);
173
+
174
+ if (logFiles.length === 0) {
175
+ return result('WC-01', 'pass', 'No session logs available');
176
+ }
177
+
178
+ const entries = parseSessionEntries(logFiles);
179
+ const evidence = [];
180
+
181
+ // Find all Bash tool_use entries and index them
182
+ const bashEntries = [];
183
+ for (let i = 0; i < entries.length; i++) {
184
+ const entry = entries[i];
185
+ const command = entry.command ||
186
+ (entry.input && entry.input.command ? entry.input.command : '');
187
+ if (command && (entry.type === 'tool_use' || entry.type === 'assistant')) {
188
+ bashEntries.push({ index: i, command });
189
+ }
190
+ }
191
+
192
+ // For each git push, look for CI check in next 10 tool calls
193
+ for (let b = 0; b < bashEntries.length; b++) {
194
+ const { command } = bashEntries[b];
195
+ if (!command.includes('git push')) continue;
196
+
197
+ let foundCiCheck = false;
198
+ const lookAhead = Math.min(b + 10, bashEntries.length);
199
+ for (let j = b + 1; j < lookAhead; j++) {
200
+ const nextCmd = bashEntries[j].command;
201
+ if (/gh\s+run\s+(list|view|watch)/.test(nextCmd)) {
202
+ foundCiCheck = true;
203
+ break;
204
+ }
205
+ }
206
+
207
+ if (!foundCiCheck) {
208
+ const snippet = command.substring(0, 120);
209
+ evidence.push(`git push at entry ${bashEntries[b].index} not followed by CI check: "${snippet}"`);
210
+ }
211
+ }
212
+
213
+ if (evidence.length === 0) {
214
+ return result('WC-01', 'pass', 'All git pushes followed by CI verification');
215
+ }
216
+
217
+ return result('WC-01', 'warn',
218
+ `${evidence.length} git push(es) without CI verification`,
219
+ evidence
220
+ );
221
+ }
222
+
223
+ // ---------------------------------------------------------------------------
224
+ // WC-07: Compaction Quality
225
+ // ---------------------------------------------------------------------------
226
+
227
+ /**
228
+ * Detect STATE.md content loss after compaction events.
229
+ * Scans session JSONL for compact events and checks STATE.md integrity.
230
+ *
231
+ * @param {string} planningDir - Path to .planning/ directory
232
+ * @param {object} _config - Parsed config.json (unused)
233
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
234
+ */
235
+ function checkCompactionQuality(planningDir, _config) {
236
+ const logFiles = findSessionLogs(planningDir);
237
+
238
+ if (logFiles.length === 0) {
239
+ return result('WC-07', 'pass', 'No session logs available');
240
+ }
241
+
242
+ const entries = parseSessionEntries(logFiles);
243
+ const evidence = [];
244
+
245
+ // Find compact events
246
+ const compactIndices = [];
247
+ for (let i = 0; i < entries.length; i++) {
248
+ const entry = entries[i];
249
+ const toolName = entry.tool || entry.name ||
250
+ (entry.input && entry.input.tool ? entry.input.tool : '');
251
+ const content = typeof entry.content === 'string' ? entry.content : '';
252
+
253
+ if (toolName === 'Compact' ||
254
+ (entry.type === 'tool_use' && content.includes('compact')) ||
255
+ (entry.type === 'system' && content.includes('compact'))) {
256
+ compactIndices.push(i);
257
+ }
258
+ }
259
+
260
+ if (compactIndices.length === 0) {
261
+ return result('WC-07', 'pass', 'No compaction events detected in session');
262
+ }
263
+
264
+ // For each compact event, check if STATE.md is read/written after it
265
+ for (const ci of compactIndices) {
266
+ let statePreserved = false;
267
+ const lookAhead = Math.min(ci + 15, entries.length);
268
+ for (let j = ci + 1; j < lookAhead; j++) {
269
+ const entry = entries[j];
270
+ const filePath = entry.file_path ||
271
+ (entry.input && entry.input.file_path ? entry.input.file_path : '') ||
272
+ (typeof entry.content === 'string' ? entry.content : '');
273
+ if (filePath.includes('STATE.md')) {
274
+ statePreserved = true;
275
+ break;
276
+ }
277
+ }
278
+
279
+ if (!statePreserved) {
280
+ evidence.push(`Compact event at entry ${ci} — no STATE.md read/write detected within next 15 entries`);
281
+ }
282
+ }
283
+
284
+ // Also check STATE.md itself for missing fields (sign of content loss)
285
+ const statePath = path.join(planningDir, 'STATE.md');
286
+ try {
287
+ const stateContent = fs.readFileSync(statePath, 'utf8');
288
+ const fm = parseFrontmatter(stateContent);
289
+ const criticalFields = ['current_phase', 'status', 'last_activity'];
290
+ const missing = criticalFields.filter(f => fm[f] === undefined || fm[f] === '');
291
+ if (missing.length > 0) {
292
+ evidence.push(`STATE.md missing critical fields after compaction: ${missing.join(', ')}`);
293
+ }
294
+ } catch (_e) {
295
+ evidence.push('STATE.md not readable — possible compaction content loss');
296
+ }
297
+
298
+ if (evidence.length === 0) {
299
+ return result('WC-07', 'pass',
300
+ `${compactIndices.length} compaction event(s) — STATE.md intact`);
301
+ }
302
+
303
+ return result('WC-07', 'warn',
304
+ `${evidence.length} compaction quality concern(s)`,
305
+ evidence
306
+ );
307
+ }
308
+
309
+ // ---------------------------------------------------------------------------
310
+ // WC-02: State File Integrity
311
+ // ---------------------------------------------------------------------------
312
+
313
+ /**
314
+ * Check STATE.md integrity against actual phase directories.
315
+ * Cross-references current_phase, phases_total, and status against disk.
316
+ *
317
+ * @param {string} planningDir - Path to .planning/ directory
318
+ * @param {object} _config - Parsed config.json (unused)
319
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
320
+ */
321
+ function checkStateFileIntegrity(planningDir, _config) {
322
+ const statePath = path.join(planningDir, 'STATE.md');
323
+ let content;
324
+
325
+ try {
326
+ content = fs.readFileSync(statePath, 'utf8');
327
+ } catch (_e) {
328
+ return result('WC-02', 'fail', 'STATE.md not found', [
329
+ `Expected at: ${statePath}`,
330
+ ]);
331
+ }
332
+
333
+ const fm = parseFrontmatter(content);
334
+ const evidence = [];
335
+
336
+ // Get actual phase directories
337
+ const phasesDir = path.join(planningDir, 'phases');
338
+ let actualDirs = [];
339
+ try {
340
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
341
+ actualDirs = entries
342
+ .filter(e => e.isDirectory() && /^\d{2}-/.test(e.name))
343
+ .map(e => e.name)
344
+ .sort();
345
+ } catch (_e) {
346
+ evidence.push('Could not read phases/ directory');
347
+ }
348
+
349
+ const actualCount = actualDirs.length;
350
+
351
+ // Check phases_total against actual directory count
352
+ const phasesTotal = parseInt(fm.phases_total, 10);
353
+ if (!isNaN(phasesTotal) && phasesTotal !== actualCount) {
354
+ evidence.push(
355
+ `phases_total=${phasesTotal} but ${actualCount} phase directories on disk`
356
+ );
357
+ }
358
+
359
+ // Check current_phase refers to existing directory
360
+ const currentPhase = parseInt(fm.current_phase, 10);
361
+ if (!isNaN(currentPhase)) {
362
+ const prefix = String(currentPhase).padStart(2, '0') + '-';
363
+ const hasDir = actualDirs.some(d => d.startsWith(prefix));
364
+ if (!hasDir && actualDirs.length > 0) {
365
+ evidence.push(
366
+ `current_phase=${currentPhase} but no directory starting with "${prefix}" in phases/`
367
+ );
368
+ }
369
+ }
370
+
371
+ // If status is building/built, verify current phase dir has PLAN files
372
+ const status = fm.status;
373
+ if (status === 'building' || status === 'built') {
374
+ const prefix = String(currentPhase).padStart(2, '0') + '-';
375
+ const phaseDir = actualDirs.find(d => d.startsWith(prefix));
376
+ if (phaseDir) {
377
+ const phasePath = path.join(phasesDir, phaseDir);
378
+ try {
379
+ const files = fs.readdirSync(phasePath);
380
+ const planFiles = files.filter(f => /^PLAN.*\.md$/i.test(f));
381
+ if (planFiles.length === 0) {
382
+ evidence.push(
383
+ `Status is "${status}" but phase dir "${phaseDir}" has no PLAN files`
384
+ );
385
+ }
386
+ } catch (_e) {
387
+ evidence.push(`Could not read phase dir "${phaseDir}"`);
388
+ }
389
+ }
390
+ }
391
+
392
+ if (evidence.length === 0) {
393
+ return result('WC-02', 'pass', 'STATE.md aligns with disk state');
394
+ }
395
+
396
+ // Critical mismatches (missing dirs, wrong phase) = fail; minor = warn
397
+ const hasCritical = evidence.some(
398
+ e => e.includes('not found') || e.includes('no directory')
399
+ );
400
+
401
+ return result(
402
+ 'WC-02',
403
+ hasCritical ? 'fail' : 'warn',
404
+ `STATE.md has ${evidence.length} mismatch(es) with disk`,
405
+ evidence
406
+ );
407
+ }
408
+
409
+ // ---------------------------------------------------------------------------
410
+ // WC-03: STATE.md Frontmatter Integrity
411
+ // ---------------------------------------------------------------------------
412
+
413
+ /**
414
+ * Validate STATE.md YAML frontmatter for required fields and correct types.
415
+ *
416
+ * @param {string} planningDir - Path to .planning/ directory
417
+ * @param {object} _config - Parsed config.json (unused)
418
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
419
+ */
420
+ function checkStateFrontmatterIntegrity(planningDir, _config) {
421
+ const statePath = path.join(planningDir, 'STATE.md');
422
+ let content;
423
+
424
+ try {
425
+ content = fs.readFileSync(statePath, 'utf8');
426
+ } catch (_e) {
427
+ return result('WC-03', 'fail', 'STATE.md not found', [
428
+ `Expected at: ${statePath}`,
429
+ ]);
430
+ }
431
+
432
+ const fm = parseFrontmatter(content);
433
+ const evidence = [];
434
+
435
+ // Required fields
436
+ const requiredFields = [
437
+ 'version', 'current_phase', 'phase_slug', 'status',
438
+ 'phases_total', 'plans_total', 'last_activity',
439
+ ];
440
+
441
+ const missingFields = [];
442
+ for (const field of requiredFields) {
443
+ if (fm[field] === undefined || fm[field] === '') {
444
+ missingFields.push(field);
445
+ }
446
+ }
447
+
448
+ if (missingFields.length > 0) {
449
+ evidence.push(`Missing required fields: ${missingFields.join(', ')}`);
450
+ }
451
+
452
+ // Type validations
453
+ const validStatuses = [
454
+ 'not_started', 'discussed', 'ready_to_plan', 'planning', 'planned',
455
+ 'ready_to_execute', 'building', 'built', 'partial', 'verified',
456
+ 'needs_fixes', 'complete', 'skipped',
457
+ ];
458
+
459
+ if (fm.version !== undefined) {
460
+ const ver = Number(fm.version);
461
+ if (isNaN(ver)) {
462
+ evidence.push(`version "${fm.version}" is not a number`);
463
+ }
464
+ }
465
+
466
+ if (fm.current_phase !== undefined) {
467
+ const cp = Number(fm.current_phase);
468
+ if (isNaN(cp)) {
469
+ evidence.push(`current_phase "${fm.current_phase}" is not a number`);
470
+ }
471
+ }
472
+
473
+ if (fm.status !== undefined && !validStatuses.includes(fm.status)) {
474
+ evidence.push(
475
+ `status "${fm.status}" is not a valid status (expected one of: ${validStatuses.join(', ')})`
476
+ );
477
+ }
478
+
479
+ if (fm.phases_total !== undefined) {
480
+ const pt = Number(fm.phases_total);
481
+ if (isNaN(pt)) {
482
+ evidence.push(`phases_total "${fm.phases_total}" is not numeric`);
483
+ }
484
+ }
485
+
486
+ if (fm.plans_total !== undefined) {
487
+ const plt = Number(fm.plans_total);
488
+ if (isNaN(plt)) {
489
+ evidence.push(`plans_total "${fm.plans_total}" is not numeric`);
490
+ }
491
+ }
492
+
493
+ if (evidence.length === 0) {
494
+ return result('WC-03', 'pass', 'STATE.md frontmatter is valid');
495
+ }
496
+
497
+ // Missing required fields = fail, type issues = warn
498
+ const hasMissing = missingFields.length > 0;
499
+
500
+ return result(
501
+ 'WC-03',
502
+ hasMissing ? 'fail' : 'warn',
503
+ `STATE.md frontmatter has ${evidence.length} issue(s)`,
504
+ evidence
505
+ );
506
+ }
507
+
508
+ // ---------------------------------------------------------------------------
509
+ // WC-04: ROADMAP Sync Validation
510
+ // ---------------------------------------------------------------------------
511
+
512
+ /**
513
+ * Validate ROADMAP.md phase entries match actual phase directories on disk.
514
+ * Detects orphan directories (on disk but not in ROADMAP) and phantom phases
515
+ * (in ROADMAP but not on disk).
516
+ *
517
+ * @param {string} planningDir - Path to .planning/ directory
518
+ * @param {object} _config - Parsed config.json (unused)
519
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
520
+ */
521
+ function checkRoadmapSyncValidation(planningDir, _config) {
522
+ const roadmapPath = path.join(planningDir, 'ROADMAP.md');
523
+ let content;
524
+
525
+ try {
526
+ content = fs.readFileSync(roadmapPath, 'utf8');
527
+ } catch (_e) {
528
+ return result('WC-04', 'fail', 'ROADMAP.md not found', [
529
+ `Expected at: ${roadmapPath}`,
530
+ ]);
531
+ }
532
+
533
+ // Get actual phase directories
534
+ const phasesDir = path.join(planningDir, 'phases');
535
+ let actualDirs = [];
536
+ try {
537
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
538
+ actualDirs = entries
539
+ .filter(e => e.isDirectory() && /^\d{2}-/.test(e.name))
540
+ .map(e => e.name)
541
+ .sort();
542
+ } catch (_e) {
543
+ return result('WC-04', 'warn', 'Could not read phases/ directory', [
544
+ `Expected at: ${phasesDir}`,
545
+ ]);
546
+ }
547
+
548
+ // Extract actual phase numbers from disk
549
+ const diskPhaseNums = new Set();
550
+ for (const dir of actualDirs) {
551
+ const num = parseInt(dir.substring(0, 2), 10);
552
+ if (!isNaN(num)) diskPhaseNums.add(num);
553
+ }
554
+
555
+ // Extract phase entries from ROADMAP.md
556
+ // Look for patterns like:
557
+ // "| N. Name |" in progress tables
558
+ // "### Phase N: Name"
559
+ // "| {N}. {name} |"
560
+ const lines = content.replace(/\r\n/g, '\n').split('\n');
561
+ const roadmapPhaseNums = new Set();
562
+
563
+ // Find the active milestone section (look for "## Progress" or most recent non-COMPLETED milestone)
564
+ // We scan the entire file for phase references under the active milestone
565
+ let inActiveMilestone = false;
566
+ for (const line of lines) {
567
+ // Detect active milestone sections (not COMPLETED)
568
+ if (/^##\s+Milestone:.*(?:ACTIVE|COMPLETED)/i.test(line)) {
569
+ inActiveMilestone = !line.includes('COMPLETED');
570
+ }
571
+ if (/^##\s+Progress\b/.test(line)) {
572
+ inActiveMilestone = true;
573
+ }
574
+
575
+ if (!inActiveMilestone) continue;
576
+
577
+ // Match table rows: "| N. Name |" or "|N. Name|"
578
+ const tableMatch = line.match(/\|\s*(\d{1,2})\.\s+/);
579
+ if (tableMatch) {
580
+ roadmapPhaseNums.add(parseInt(tableMatch[1], 10));
581
+ }
582
+
583
+ // Match headers: "### Phase N: Name" or "### Phase NN: Name"
584
+ const headerMatch = line.match(/^###\s+Phase\s+(\d{1,2})\b/);
585
+ if (headerMatch) {
586
+ roadmapPhaseNums.add(parseInt(headerMatch[1], 10));
587
+ }
588
+ }
589
+
590
+ const evidence = [];
591
+
592
+ // Orphan directories: on disk but not in ROADMAP
593
+ for (const num of diskPhaseNums) {
594
+ if (!roadmapPhaseNums.has(num)) {
595
+ const dirName = actualDirs.find(d => parseInt(d.substring(0, 2), 10) === num);
596
+ evidence.push(`Orphan directory: "${dirName}" (phase ${num}) not in ROADMAP`);
597
+ }
598
+ }
599
+
600
+ // Phantom phases: in ROADMAP but not on disk
601
+ for (const num of roadmapPhaseNums) {
602
+ if (!diskPhaseNums.has(num)) {
603
+ evidence.push(`Phantom phase: phase ${num} in ROADMAP but no directory on disk`);
604
+ }
605
+ }
606
+
607
+ if (evidence.length === 0) {
608
+ return result('WC-04', 'pass', 'ROADMAP.md aligns with phase directories');
609
+ }
610
+
611
+ return result('WC-04', 'fail',
612
+ `ROADMAP has ${evidence.length} sync issue(s) with disk`,
613
+ evidence
614
+ );
615
+ }
616
+
617
+ // ---------------------------------------------------------------------------
618
+ // WC-08: Naming Convention Compliance
619
+ // ---------------------------------------------------------------------------
620
+
621
+ /**
622
+ * Scan all phase directories for PLAN files and verify they follow
623
+ * the PLAN-{NN}.md naming convention.
624
+ *
625
+ * @param {string} planningDir - Path to .planning/ directory
626
+ * @param {object} _config - Parsed config.json (unused)
627
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
628
+ */
629
+ function checkNamingConventionCompliance(planningDir, _config) {
630
+ const phasesDir = path.join(planningDir, 'phases');
631
+ let phaseDirs;
632
+
633
+ try {
634
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
635
+ phaseDirs = entries
636
+ .filter(e => e.isDirectory() && /^\d{2}-/.test(e.name))
637
+ .map(e => e.name)
638
+ .sort();
639
+ } catch (_e) {
640
+ return result('WC-08', 'warn', 'Could not read phases/ directory');
641
+ }
642
+
643
+ const conformingPattern = /^PLAN-\d{2}\.md$/;
644
+ const planFilePattern = /^PLAN.*\.md$/i;
645
+ const evidence = [];
646
+
647
+ for (const dir of phaseDirs) {
648
+ const dirPath = path.join(phasesDir, dir);
649
+ let files;
650
+ try {
651
+ files = fs.readdirSync(dirPath);
652
+ } catch (_e) {
653
+ continue;
654
+ }
655
+
656
+ const planFiles = files.filter(f => planFilePattern.test(f));
657
+ for (const planFile of planFiles) {
658
+ if (!conformingPattern.test(planFile)) {
659
+ evidence.push(`${dir}/${planFile} does not match PLAN-{NN}.md convention`);
660
+ }
661
+ }
662
+ }
663
+
664
+ if (evidence.length === 0) {
665
+ return result('WC-08', 'pass', 'All PLAN files follow naming convention');
666
+ }
667
+
668
+ return result('WC-08', 'warn',
669
+ `${evidence.length} PLAN file(s) do not follow naming convention`,
670
+ evidence
671
+ );
672
+ }
673
+
674
+ // ---------------------------------------------------------------------------
675
+ // WC-05: Planning Artifact Completeness
676
+ // ---------------------------------------------------------------------------
677
+
678
+ /**
679
+ * Check that built phases have both SUMMARY and VERIFICATION artifacts.
680
+ * Detects phases marked as built/complete that are missing required artifacts.
681
+ *
682
+ * @param {string} planningDir - Path to .planning/ directory
683
+ * @param {object} _config - Parsed config.json (unused)
684
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
685
+ */
686
+ function checkPlanningArtifactCompleteness(planningDir, _config) {
687
+ const phasesDir = path.join(planningDir, 'phases');
688
+ let phaseDirs;
689
+
690
+ try {
691
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
692
+ phaseDirs = entries
693
+ .filter(e => e.isDirectory() && /^\d{2}-/.test(e.name))
694
+ .map(e => e.name)
695
+ .sort();
696
+ } catch (_e) {
697
+ return result('WC-05', 'warn', 'Could not read phases/ directory');
698
+ }
699
+
700
+ // Read ROADMAP.md to detect phases marked as complete/verified
701
+ const roadmapPath = path.join(planningDir, 'ROADMAP.md');
702
+ let roadmapContent = '';
703
+ try {
704
+ roadmapContent = fs.readFileSync(roadmapPath, 'utf8').replace(/\r\n/g, '\n');
705
+ } catch (_e) {
706
+ // No roadmap — can only check by artifact presence
707
+ }
708
+
709
+ const evidence = [];
710
+
711
+ for (const dir of phaseDirs) {
712
+ const dirPath = path.join(phasesDir, dir);
713
+ let files;
714
+ try {
715
+ files = fs.readdirSync(dirPath);
716
+ } catch (_e) {
717
+ continue;
718
+ }
719
+
720
+ const summaryFiles = files.filter(f => /^SUMMARY.*\.md$/i.test(f));
721
+ const verificationFiles = files.filter(f => /^VERIFICATION.*\.md$/i.test(f));
722
+ const planFiles = files.filter(f => /^PLAN.*\.md$/i.test(f));
723
+
724
+ // If SUMMARY exists (indicates phase was built) but no VERIFICATION
725
+ if (summaryFiles.length > 0 && verificationFiles.length === 0) {
726
+ evidence.push(
727
+ `Phase "${dir}" built (has SUMMARY) but missing VERIFICATION.md`
728
+ );
729
+ }
730
+
731
+ // Check ROADMAP for phases marked complete/verified but missing artifacts
732
+ if (roadmapContent) {
733
+ const phaseNum = parseInt(dir.substring(0, 2), 10);
734
+ // Look for phase in roadmap marked as Complete or Verified
735
+ const completePat = new RegExp(
736
+ `\\|\\s*${phaseNum}\\.\\s+[^|]*\\|[^|]*(?:Complete|Verified|Built)`,
737
+ 'i'
738
+ );
739
+ if (completePat.test(roadmapContent)) {
740
+ if (planFiles.length > 0 && summaryFiles.length === 0) {
741
+ evidence.push(
742
+ `Phase "${dir}" marked complete in ROADMAP but has no SUMMARY files`
743
+ );
744
+ }
745
+ }
746
+ }
747
+ }
748
+
749
+ if (evidence.length === 0) {
750
+ return result('WC-05', 'pass', 'All built phases have required artifacts');
751
+ }
752
+
753
+ return result('WC-05', 'warn',
754
+ `${evidence.length} artifact completeness gap(s) found`,
755
+ evidence
756
+ );
757
+ }
758
+
759
+ // ---------------------------------------------------------------------------
760
+ // WC-06: Artifact Format Validation
761
+ // ---------------------------------------------------------------------------
762
+
763
+ /**
764
+ * Validate SUMMARY.md required fields and PLAN.md task block structure.
765
+ * Checks SUMMARY frontmatter for requires, key_files, deferred fields
766
+ * and PLAN files for at least one <task XML block.
767
+ *
768
+ * @param {string} planningDir - Path to .planning/ directory
769
+ * @param {object} _config - Parsed config.json (unused)
770
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
771
+ */
772
+ function checkArtifactFormatValidation(planningDir, _config) {
773
+ const phasesDir = path.join(planningDir, 'phases');
774
+ let phaseDirs;
775
+
776
+ try {
777
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
778
+ phaseDirs = entries
779
+ .filter(e => e.isDirectory() && /^\d{2}-/.test(e.name))
780
+ .map(e => e.name)
781
+ .sort();
782
+ } catch (_e) {
783
+ return result('WC-06', 'warn', 'Could not read phases/ directory');
784
+ }
785
+
786
+ const evidence = [];
787
+
788
+ for (const dir of phaseDirs) {
789
+ const dirPath = path.join(phasesDir, dir);
790
+ let files;
791
+ try {
792
+ files = fs.readdirSync(dirPath);
793
+ } catch (_e) {
794
+ continue;
795
+ }
796
+
797
+ // Validate SUMMARY files
798
+ const summaryFiles = files.filter(f => /^SUMMARY.*\.md$/i.test(f));
799
+ for (const sf of summaryFiles) {
800
+ try {
801
+ const content = fs.readFileSync(path.join(dirPath, sf), 'utf8');
802
+ const fm = parseFrontmatter(content);
803
+ const missingFields = [];
804
+
805
+ if (fm.requires === undefined) missingFields.push('requires');
806
+ if (fm.key_files === undefined) missingFields.push('key_files');
807
+ if (fm.deferred === undefined) missingFields.push('deferred');
808
+
809
+ if (missingFields.length > 0) {
810
+ evidence.push(
811
+ `${dir}/${sf}: missing required fields: ${missingFields.join(', ')}`
812
+ );
813
+ }
814
+ } catch (_e) {
815
+ evidence.push(`${dir}/${sf}: could not read file`);
816
+ }
817
+ }
818
+
819
+ // Validate PLAN files have at least one <task block
820
+ const planFiles = files.filter(f => /^PLAN.*\.md$/i.test(f));
821
+ for (const pf of planFiles) {
822
+ try {
823
+ const content = fs.readFileSync(path.join(dirPath, pf), 'utf8');
824
+ if (!/<task\s/.test(content)) {
825
+ evidence.push(`${dir}/${pf}: no <task XML block found`);
826
+ }
827
+ } catch (_e) {
828
+ evidence.push(`${dir}/${pf}: could not read file`);
829
+ }
830
+ }
831
+ }
832
+
833
+ if (evidence.length === 0) {
834
+ return result('WC-06', 'pass', 'All artifacts conform to format requirements');
835
+ }
836
+
837
+ return result('WC-06', 'warn',
838
+ `${evidence.length} format violation(s) found`,
839
+ evidence
840
+ );
841
+ }
842
+
843
+ // ---------------------------------------------------------------------------
844
+ // WC-09: Commit Pattern Validation
845
+ // ---------------------------------------------------------------------------
846
+
847
+ /**
848
+ * Detect git commit commands using heredoc, missing -m flag, or --no-verify.
849
+ * Scans session JSONL logs for the current project. Falls back to git log
850
+ * format validation if session logs are unavailable.
851
+ *
852
+ * @param {string} planningDir - Path to .planning/ directory
853
+ * @param {object} _config - Parsed config.json (unused)
854
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
855
+ */
856
+ function checkCommitPatternValidation(planningDir, _config) {
857
+ const evidence = [];
858
+ const sessionLogs = findSessionLogs(planningDir);
859
+
860
+ if (sessionLogs.length > 0) {
861
+ const entries = parseSessionEntries(sessionLogs);
862
+
863
+ for (const entry of entries) {
864
+ if (entry.type !== 'tool_use' && entry.type !== 'assistant') continue;
865
+
866
+ const command = entry.command ||
867
+ (entry.content && typeof entry.content === 'string' ? entry.content : '') ||
868
+ (entry.input && entry.input.command ? entry.input.command : '');
869
+
870
+ if (!command || !command.includes('git commit')) continue;
871
+
872
+ // Flag heredoc usage
873
+ if (command.includes('<<')) {
874
+ const snippet = command.substring(0, 120);
875
+ evidence.push(`Heredoc in commit: "${snippet}..."`);
876
+ }
877
+
878
+ // Flag missing -m flag (but not --amend which may not need -m)
879
+ if (!command.includes('-m') && !command.includes('--amend')) {
880
+ const snippet = command.substring(0, 120);
881
+ evidence.push(`Missing -m flag: "${snippet}..."`);
882
+ }
883
+
884
+ // Flag --no-verify
885
+ if (command.includes('--no-verify')) {
886
+ const snippet = command.substring(0, 120);
887
+ evidence.push(`Uses --no-verify: "${snippet}..."`);
888
+ }
889
+ }
890
+
891
+ if (evidence.length === 0) {
892
+ return result('WC-09', 'pass', 'No commit pattern violations in session logs');
893
+ }
894
+
895
+ return result('WC-09', 'warn',
896
+ `${evidence.length} commit pattern violation(s) found`,
897
+ evidence
898
+ );
899
+ }
900
+
901
+ // Fallback: validate recent git log commit messages match convention
902
+ const conventionPattern = /^[a-z]+\([^)]+\):\s.+$/;
903
+ try {
904
+ const log = execSync('git log --oneline -20', {
905
+ cwd: projectRoot,
906
+ timeout: 10000,
907
+ encoding: 'utf8',
908
+ });
909
+
910
+ const commits = log.trim().split('\n');
911
+ for (const commit of commits) {
912
+ // Strip SHA prefix
913
+ const msg = commit.replace(/^[a-f0-9]+\s+/, '');
914
+ // Skip merge commits
915
+ if (msg.startsWith('Merge')) continue;
916
+ if (!conventionPattern.test(msg)) {
917
+ evidence.push(`Non-conventional commit: "${msg.substring(0, 120)}"`);
918
+ }
919
+ }
920
+ } catch (_e) {
921
+ return result('WC-09', 'pass', 'No session logs available for analysis');
922
+ }
923
+
924
+ if (evidence.length === 0) {
925
+ return result('WC-09', 'pass', 'All recent commits follow convention format');
926
+ }
927
+
928
+ return result('WC-09', 'warn',
929
+ `${evidence.length} non-conventional commit(s) in recent history`,
930
+ evidence
931
+ );
932
+ }
933
+
934
+ // ---------------------------------------------------------------------------
935
+ // WC-12: Test Health Baseline
936
+ // ---------------------------------------------------------------------------
937
+
938
+ /**
939
+ * Compare current test failures against a known baseline.
940
+ * Detects new test failures that were not previously known.
941
+ *
942
+ * @param {string} planningDir - Path to .planning/ directory
943
+ * @param {object} _config - Parsed config.json (unused)
944
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
945
+ */
946
+ function checkTestHealthBaseline(planningDir, _config) {
947
+ const projectRoot = path.resolve(planningDir, '..');
948
+
949
+ // Run tests and detect pass/fail
950
+ let testOutput = '';
951
+ let hasFailures = false;
952
+
953
+ try {
954
+ testOutput = execSync('npm test -- --ci --silent 2>&1', {
955
+ cwd: projectRoot,
956
+ timeout: 60000,
957
+ encoding: 'utf8',
958
+ });
959
+ hasFailures = testOutput.includes('FAIL');
960
+ } catch (_e) {
961
+ // Non-zero exit = test failures
962
+ hasFailures = true;
963
+ if (_e.stdout) testOutput = _e.stdout.toString();
964
+ }
965
+
966
+ const currentStatus = hasFailures ? 'HAS_FAILURES' : 'ALL_PASS';
967
+
968
+ // Read baseline file
969
+ const baselinePath = path.join(planningDir, 'test-baseline.json');
970
+ let baseline = null;
971
+
972
+ try {
973
+ const raw = fs.readFileSync(baselinePath, 'utf8');
974
+ baseline = JSON.parse(raw);
975
+ } catch (_e) {
976
+ // No baseline file
977
+ }
978
+
979
+ if (!baseline) {
980
+ return result('WC-12', 'info',
981
+ 'No test baseline established yet',
982
+ [`Current test status: ${currentStatus}`]
983
+ );
984
+ }
985
+
986
+ // Compare against baseline
987
+ const evidence = [];
988
+ const knownFailures = baseline.known_failures || [];
989
+
990
+ if (hasFailures && knownFailures.length === 0) {
991
+ evidence.push('Tests have failures but baseline shows no known failures — new regressions detected');
992
+ }
993
+
994
+ // Extract failing test names if possible
995
+ const failLines = testOutput.split('\n').filter(l => /FAIL\s/.test(l));
996
+ for (const fl of failLines) {
997
+ const trimmed = fl.trim().substring(0, 120);
998
+ const isKnown = knownFailures.some(kf => trimmed.includes(kf));
999
+ if (!isKnown) {
1000
+ evidence.push(`New failure: ${trimmed}`);
1001
+ }
1002
+ }
1003
+
1004
+ if (evidence.length === 0) {
1005
+ return result('WC-12', 'pass',
1006
+ `Test health matches baseline (${currentStatus})`,
1007
+ [`Known failures: ${knownFailures.length}`]
1008
+ );
1009
+ }
1010
+
1011
+ return result('WC-12', 'warn',
1012
+ `${evidence.length} new test issue(s) beyond baseline`,
1013
+ evidence
1014
+ );
1015
+ }
1016
+
1017
+ // ---------------------------------------------------------------------------
1018
+ // WC-10: Model Selection Compliance
1019
+ // ---------------------------------------------------------------------------
1020
+
1021
+ /**
1022
+ * Cross-reference agent spawns in session logs against config.models settings.
1023
+ * Detects agents using models that differ from configured preferences.
1024
+ *
1025
+ * @param {string} planningDir - Path to .planning/ directory
1026
+ * @param {object} config - Parsed config.json
1027
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
1028
+ */
1029
+ function checkModelSelectionCompliance(planningDir, config) {
1030
+ const models = (config && config.models) || {};
1031
+ const logFiles = findSessionLogs(planningDir);
1032
+
1033
+ if (logFiles.length === 0) {
1034
+ return result('WC-10', 'pass', 'No session logs available for model verification');
1035
+ }
1036
+
1037
+ const entries = parseSessionEntries(logFiles);
1038
+ const evidence = [];
1039
+ let totalSpawns = 0;
1040
+ let compliant = 0;
1041
+
1042
+ for (const entry of entries) {
1043
+ // Look for Task tool_use entries with subagent_type or model fields
1044
+ if (entry.type !== 'tool_use' && entry.type !== 'assistant') continue;
1045
+
1046
+ const input = entry.input || {};
1047
+ const subagentType = input.subagent_type || input.agent_type || '';
1048
+ const usedModel = input.model || '';
1049
+
1050
+ // Only care about pbr agent spawns
1051
+ if (!subagentType.startsWith('pbr:')) continue;
1052
+
1053
+ totalSpawns++;
1054
+ const agentName = subagentType.replace('pbr:', '');
1055
+
1056
+ // Check if config has a model preference for this agent type
1057
+ const configuredModel = models[agentName];
1058
+ if (!configuredModel || configuredModel === 'inherit') {
1059
+ // No specific model configured or set to inherit — always compliant
1060
+ compliant++;
1061
+ continue;
1062
+ }
1063
+
1064
+ if (usedModel && usedModel !== configuredModel) {
1065
+ evidence.push(
1066
+ `Agent "${agentName}" used model "${usedModel}" but config specifies "${configuredModel}"`
1067
+ );
1068
+ } else {
1069
+ compliant++;
1070
+ }
1071
+ }
1072
+
1073
+ if (totalSpawns === 0) {
1074
+ return result('WC-10', 'pass', 'No agent spawns detected for model verification');
1075
+ }
1076
+
1077
+ const pct = Math.round((compliant / totalSpawns) * 100);
1078
+
1079
+ if (evidence.length === 0) {
1080
+ return result('WC-10', 'pass',
1081
+ `${totalSpawns} agent spawn(s), ${pct}% model-compliant`);
1082
+ }
1083
+
1084
+ return result('WC-10', 'info',
1085
+ `${evidence.length} model mismatch(es) across ${totalSpawns} spawns (${pct}% compliant)`,
1086
+ evidence
1087
+ );
1088
+ }
1089
+
1090
+ // ---------------------------------------------------------------------------
1091
+ // WC-11: Git Branching Compliance
1092
+ // ---------------------------------------------------------------------------
1093
+
1094
+ /**
1095
+ * Verify phase branches exist when git.branching is set to "phase".
1096
+ * Reads config.json git settings and checks git branch list.
1097
+ *
1098
+ * @param {string} planningDir - Path to .planning/ directory
1099
+ * @param {object} config - Parsed config.json
1100
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
1101
+ */
1102
+ function checkGitBranchingCompliance(planningDir, config) {
1103
+ const gitConfig = (config && config.git) || {};
1104
+ const branching = gitConfig.branching || 'none';
1105
+
1106
+ if (branching === 'none' || branching === 'disabled') {
1107
+ return result('WC-11', 'pass', 'Git branching not configured');
1108
+ }
1109
+
1110
+ if (branching !== 'phase') {
1111
+ return result('WC-11', 'pass',
1112
+ `Git branching mode "${branching}" — phase branch check not applicable`);
1113
+ }
1114
+
1115
+ const projectRoot = path.resolve(planningDir, '..');
1116
+ const template = gitConfig.phase_branch_template ||
1117
+ 'plan-build-run/phase-{phase}-{slug}';
1118
+
1119
+ // Get list of git branches
1120
+ let branches;
1121
+ try {
1122
+ const branchOutput = execSync('git branch --list --all', {
1123
+ cwd: projectRoot,
1124
+ timeout: 10000,
1125
+ encoding: 'utf8',
1126
+ });
1127
+ branches = branchOutput
1128
+ .split('\n')
1129
+ .map(b => b.replace(/^\*?\s+/, '').trim())
1130
+ .filter(b => b.length > 0);
1131
+ } catch (_e) {
1132
+ return result('WC-11', 'pass', 'Git not available');
1133
+ }
1134
+
1135
+ // Get active phase directories
1136
+ const phasesDir = path.join(planningDir, 'phases');
1137
+ let phaseDirs;
1138
+ try {
1139
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
1140
+ phaseDirs = entries
1141
+ .filter(e => e.isDirectory() && /^\d{2}-/.test(e.name))
1142
+ .map(e => e.name)
1143
+ .sort();
1144
+ } catch (_e) {
1145
+ return result('WC-11', 'pass', 'No phases/ directory');
1146
+ }
1147
+
1148
+ const evidence = [];
1149
+
1150
+ for (const dir of phaseDirs) {
1151
+ // Check if this phase has PLAN files (indicates active work)
1152
+ const dirPath = path.join(phasesDir, dir);
1153
+ let hasPlan = false;
1154
+ try {
1155
+ const files = fs.readdirSync(dirPath);
1156
+ hasPlan = files.some(f => /^PLAN.*\.md$/i.test(f));
1157
+ } catch (_e) {
1158
+ continue;
1159
+ }
1160
+
1161
+ if (!hasPlan) continue;
1162
+
1163
+ // Build expected branch name from template
1164
+ const phaseNum = dir.substring(0, 2);
1165
+ const slug = dir.substring(3); // everything after "NN-"
1166
+ const expectedBranch = template
1167
+ .replace('{phase}', phaseNum)
1168
+ .replace('{slug}', slug);
1169
+
1170
+ // Check if any branch matches (local or remote)
1171
+ const hasBranch = branches.some(b =>
1172
+ b === expectedBranch ||
1173
+ b.endsWith('/' + expectedBranch) ||
1174
+ b.includes(expectedBranch)
1175
+ );
1176
+
1177
+ if (!hasBranch) {
1178
+ evidence.push(`Phase "${dir}" missing expected branch "${expectedBranch}"`);
1179
+ }
1180
+ }
1181
+
1182
+ if (evidence.length === 0) {
1183
+ return result('WC-11', 'pass',
1184
+ `All active phases have corresponding git branches`);
1185
+ }
1186
+
1187
+ return result('WC-11', 'info',
1188
+ `${evidence.length} phase(s) missing expected git branches`,
1189
+ evidence
1190
+ );
1191
+ }
1192
+
1193
+ // ---------------------------------------------------------------------------
1194
+ // Exports
1195
+ // ---------------------------------------------------------------------------
1196
+
1197
+ module.exports = {
1198
+ checkCiVerifyAfterPush,
1199
+ checkStateFileIntegrity,
1200
+ checkStateFrontmatterIntegrity,
1201
+ checkRoadmapSyncValidation,
1202
+ checkPlanningArtifactCompleteness,
1203
+ checkArtifactFormatValidation,
1204
+ checkCompactionQuality,
1205
+ checkNamingConventionCompliance,
1206
+ checkCommitPatternValidation,
1207
+ checkModelSelectionCompliance,
1208
+ checkGitBranchingCompliance,
1209
+ checkTestHealthBaseline,
1210
+ };