@sienklogic/plan-build-run 2.18.1 → 2.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (977) hide show
  1. package/CHANGELOG.md +1265 -296
  2. package/CLAUDE.md +56 -34
  3. package/LICENSE +2 -1
  4. package/README.md +412 -177
  5. package/bin/install.js +2752 -0
  6. package/dashboard/bin/cli.cjs +96 -0
  7. package/dashboard/bin/stop.cjs +129 -0
  8. package/dashboard/eslint.config.js +37 -0
  9. package/dashboard/index.html +20 -0
  10. package/dashboard/package.json +27 -25
  11. package/dashboard/server/index.js +142 -0
  12. package/dashboard/server/lib/frontmatter.js +92 -0
  13. package/dashboard/server/middleware/static.js +35 -0
  14. package/dashboard/server/package.json +16 -0
  15. package/dashboard/server/routes/agents.js +213 -0
  16. package/dashboard/server/routes/config.js +64 -0
  17. package/dashboard/server/routes/health.js +95 -0
  18. package/dashboard/server/routes/incidents.js +78 -0
  19. package/dashboard/server/routes/intel.js +69 -0
  20. package/dashboard/server/routes/memory.js +107 -0
  21. package/dashboard/server/routes/planning.js +234 -0
  22. package/dashboard/server/routes/progress.js +77 -0
  23. package/dashboard/server/routes/projects.js +36 -0
  24. package/dashboard/server/routes/requirements.js +40 -0
  25. package/dashboard/server/routes/roadmap.js +69 -0
  26. package/dashboard/server/routes/sessions.js +70 -0
  27. package/dashboard/server/routes/status.js +25 -0
  28. package/dashboard/server/routes/telemetry.js +214 -0
  29. package/dashboard/server/services/file-watcher.js +105 -0
  30. package/dashboard/server/services/planning-reader.js +741 -0
  31. package/dashboard/server/test/cli.test.js +34 -0
  32. package/dashboard/server/test/frontmatter.test.js +104 -0
  33. package/dashboard/server/test/isolation.test.js +32 -0
  34. package/dashboard/server/test/planning-reader.test.js +151 -0
  35. package/dashboard/server/test/routes.test.js +91 -0
  36. package/dashboard/server/test/ws.test.js +81 -0
  37. package/dashboard/server/ws.js +96 -0
  38. package/dashboard/src/App.jsx +165 -0
  39. package/dashboard/src/components/charts/BudgetBars.jsx +42 -0
  40. package/dashboard/src/components/charts/ContextRadar.jsx +34 -0
  41. package/dashboard/src/components/charts/PhaseDonut.jsx +66 -0
  42. package/dashboard/src/components/charts/SuccessTrend.jsx +45 -0
  43. package/dashboard/src/components/charts/TokenChart.jsx +55 -0
  44. package/dashboard/src/components/charts/index.js +5 -0
  45. package/dashboard/src/components/config/CfgSection.jsx +93 -0
  46. package/dashboard/src/components/layout/Header.jsx +89 -0
  47. package/dashboard/src/components/layout/ProjectSwitcher.jsx +160 -0
  48. package/dashboard/src/components/layout/Sidebar.jsx +161 -0
  49. package/dashboard/src/components/ui/AutoModeBanner.jsx +138 -0
  50. package/dashboard/src/components/ui/BackButton.jsx +27 -0
  51. package/dashboard/src/components/ui/Badge.jsx +27 -0
  52. package/dashboard/src/components/ui/Card.jsx +23 -0
  53. package/dashboard/src/components/ui/ChartTooltip.jsx +48 -0
  54. package/dashboard/src/components/ui/CheckpointBox.jsx +110 -0
  55. package/dashboard/src/components/ui/CodeBlock.jsx +27 -0
  56. package/dashboard/src/components/ui/ConfidenceBadge.jsx +20 -0
  57. package/dashboard/src/components/ui/ConfirmModal.jsx +161 -0
  58. package/dashboard/src/components/ui/ConnectionBanner.jsx +60 -0
  59. package/dashboard/src/components/ui/ErrorBoundary.jsx +106 -0
  60. package/dashboard/src/components/ui/ErrorBox.jsx +107 -0
  61. package/dashboard/src/components/ui/KeyValue.jsx +33 -0
  62. package/dashboard/src/components/ui/LoadingSkeleton.jsx +84 -0
  63. package/dashboard/src/components/ui/MetricCard.jsx +58 -0
  64. package/dashboard/src/components/ui/NextUpBlock.jsx +92 -0
  65. package/dashboard/src/components/ui/NumberInput.jsx +44 -0
  66. package/dashboard/src/components/ui/PBRBanner.jsx +47 -0
  67. package/dashboard/src/components/ui/PipelineView.jsx +130 -0
  68. package/dashboard/src/components/ui/ProgressBar.jsx +28 -0
  69. package/dashboard/src/components/ui/ProgressDisplay.jsx +47 -0
  70. package/dashboard/src/components/ui/QualityGateBadge.jsx +15 -0
  71. package/dashboard/src/components/ui/SectionTitle.jsx +35 -0
  72. package/dashboard/src/components/ui/SelectInput.jsx +45 -0
  73. package/dashboard/src/components/ui/StatusDot.jsx +51 -0
  74. package/dashboard/src/components/ui/StatusSymbol.jsx +49 -0
  75. package/dashboard/src/components/ui/TabBar.jsx +41 -0
  76. package/dashboard/src/components/ui/TextInput.jsx +42 -0
  77. package/dashboard/src/components/ui/Toast.jsx +117 -0
  78. package/dashboard/src/components/ui/Toggle.jsx +70 -0
  79. package/dashboard/src/components/ui/index.js +29 -0
  80. package/dashboard/src/hooks/useDocumentTitle.js +16 -0
  81. package/dashboard/src/hooks/useFetch.js +50 -0
  82. package/dashboard/src/hooks/useToast.jsx +43 -0
  83. package/dashboard/src/hooks/useWebSocket.js +103 -0
  84. package/dashboard/src/lib/api.js +112 -0
  85. package/dashboard/src/lib/configSchema.js +189 -0
  86. package/dashboard/src/lib/constants.js +22 -0
  87. package/dashboard/src/main.jsx +15 -0
  88. package/dashboard/src/pages/AgentsPage.jsx +191 -0
  89. package/dashboard/src/pages/ConfigPage.jsx +298 -0
  90. package/dashboard/src/pages/HooksPage.jsx +412 -0
  91. package/dashboard/src/pages/IncidentsPage.jsx +135 -0
  92. package/dashboard/src/pages/IntelPage.jsx +193 -0
  93. package/dashboard/src/pages/LiveFeed.jsx +274 -0
  94. package/dashboard/src/pages/MemoryPage.jsx +107 -0
  95. package/dashboard/src/pages/OnboardingPage.jsx +117 -0
  96. package/dashboard/src/pages/Overview.jsx +360 -0
  97. package/dashboard/src/pages/PhaseDetailView.jsx +216 -0
  98. package/dashboard/src/pages/PlanningPage.jsx +181 -0
  99. package/dashboard/src/pages/ProgressPage.jsx +249 -0
  100. package/dashboard/src/pages/ResearchPage.jsx +129 -0
  101. package/dashboard/src/pages/RoadmapPage.jsx +251 -0
  102. package/dashboard/src/pages/SessionsPage.jsx +117 -0
  103. package/dashboard/src/pages/Telemetry.jsx +166 -0
  104. package/dashboard/src/pages/planning/DecisionsTab.jsx +153 -0
  105. package/dashboard/src/pages/planning/FilesTab.jsx +420 -0
  106. package/dashboard/src/pages/planning/MilestoneDetail.jsx +319 -0
  107. package/dashboard/src/pages/planning/MilestonesTab.jsx +151 -0
  108. package/dashboard/src/pages/planning/NotesTab.jsx +251 -0
  109. package/dashboard/src/pages/planning/PhasesTab.jsx +218 -0
  110. package/dashboard/src/pages/planning/QuickTab.jsx +50 -0
  111. package/dashboard/src/pages/planning/ResearchTab.jsx +103 -0
  112. package/dashboard/src/pages/planning/TodosTab.jsx +297 -0
  113. package/dashboard/src/theme/ThemeProvider.jsx +38 -0
  114. package/dashboard/src/theme/tokens.js +17 -0
  115. package/dashboard/tests/components/ConfirmModal.test.jsx +179 -0
  116. package/dashboard/tests/components/ConnectionBanner.test.jsx +37 -0
  117. package/dashboard/tests/components/ErrorBoundary.test.jsx +59 -0
  118. package/dashboard/tests/components/LoadingSkeleton.test.jsx +46 -0
  119. package/dashboard/tests/components/ToastContainer.test.jsx +47 -0
  120. package/dashboard/tests/components/Toggle.test.jsx +61 -0
  121. package/dashboard/tests/hooks/useFetch.test.jsx +77 -0
  122. package/dashboard/tests/hooks/useToast.test.jsx +78 -0
  123. package/dashboard/tests/hooks/useWebSocket.test.jsx +128 -0
  124. package/dashboard/tests/pages/ConfigPage.test.jsx +199 -0
  125. package/dashboard/tests/pages/PlanningPage.test.jsx +119 -0
  126. package/dashboard/tests/pages/planning/FilesTab.test.jsx +198 -0
  127. package/dashboard/tests/pages/planning/NotesTab.test.jsx +178 -0
  128. package/dashboard/tests/pages/planning/TodosTab.test.jsx +188 -0
  129. package/dashboard/tests/performance.test.jsx +46 -0
  130. package/dashboard/tests/routes/config.test.js +98 -0
  131. package/dashboard/tests/routes/health.test.js +40 -0
  132. package/dashboard/tests/routes/planning.test.js +112 -0
  133. package/dashboard/tests/routes/roadmap.test.js +91 -0
  134. package/dashboard/tests/routes/status.test.js +131 -0
  135. package/dashboard/tests/server/planning-reader.test.js +153 -0
  136. package/dashboard/tests/setup.js +7 -0
  137. package/dashboard/vite.config.js +41 -0
  138. package/package.json +55 -40
  139. package/plan-build-run/bin/config-schema.json +1420 -0
  140. package/plugins/pbr/.claude-plugin/plugin.json +1 -1
  141. package/plugins/pbr/CLAUDE.md +19 -0
  142. package/plugins/pbr/UI-CONSISTENCY-GAPS.md +1 -1
  143. package/plugins/pbr/agents/advisor-researcher.md +100 -0
  144. package/plugins/pbr/agents/audit.md +205 -89
  145. package/plugins/pbr/agents/codebase-mapper.md +158 -23
  146. package/plugins/pbr/agents/debugger.md +222 -30
  147. package/plugins/pbr/agents/dev-sync.md +206 -0
  148. package/plugins/pbr/agents/executor.md +717 -39
  149. package/plugins/pbr/agents/general.md +71 -6
  150. package/plugins/pbr/agents/integration-checker.md +146 -30
  151. package/plugins/pbr/agents/intel-updater.md +332 -0
  152. package/plugins/pbr/agents/nyquist-auditor.md +253 -0
  153. package/plugins/pbr/agents/plan-checker.md +270 -61
  154. package/plugins/pbr/agents/planner.md +440 -42
  155. package/plugins/pbr/agents/researcher.md +223 -36
  156. package/plugins/pbr/agents/roadmapper.md +397 -0
  157. package/plugins/pbr/agents/synthesizer.md +170 -26
  158. package/plugins/pbr/agents/ui-checker.md +203 -0
  159. package/plugins/pbr/agents/ui-researcher.md +224 -0
  160. package/plugins/pbr/agents/verifier.md +495 -47
  161. package/plugins/pbr/commands/add-phase.md +75 -0
  162. package/plugins/pbr/commands/add-todo.md +8 -0
  163. package/plugins/pbr/commands/audit-fix.md +5 -0
  164. package/plugins/pbr/commands/audit-milestone.md +8 -0
  165. package/plugins/pbr/commands/autonomous.md +5 -0
  166. package/plugins/pbr/commands/backlog.md +6 -0
  167. package/plugins/pbr/commands/check-todos.md +8 -0
  168. package/plugins/pbr/commands/complete-milestone.md +8 -0
  169. package/plugins/pbr/commands/config.md +1 -1
  170. package/plugins/pbr/commands/discuss-phase.md +6 -0
  171. package/plugins/pbr/commands/do.md +5 -0
  172. package/plugins/pbr/commands/execute-phase.md +6 -0
  173. package/plugins/pbr/commands/fast.md +6 -0
  174. package/plugins/pbr/commands/forensics.md +6 -0
  175. package/plugins/pbr/commands/import.md +1 -1
  176. package/plugins/pbr/commands/insert-phase.md +65 -0
  177. package/plugins/pbr/commands/intel.md +5 -0
  178. package/plugins/pbr/commands/join-discord.md +11 -0
  179. package/plugins/pbr/commands/list-phase-assumptions.md +5 -0
  180. package/plugins/pbr/commands/map-codebase.md +6 -0
  181. package/plugins/pbr/commands/milestone-summary.md +6 -0
  182. package/plugins/pbr/commands/new-milestone.md +8 -0
  183. package/plugins/pbr/commands/new-project.md +6 -0
  184. package/plugins/pbr/commands/pause-work.md +5 -0
  185. package/plugins/pbr/commands/plan-milestone-gaps.md +7 -0
  186. package/plugins/pbr/commands/plan-phase.md +6 -0
  187. package/plugins/pbr/commands/plant-seed.md +6 -0
  188. package/plugins/pbr/commands/profile-user.md +5 -0
  189. package/plugins/pbr/commands/profile.md +5 -0
  190. package/plugins/pbr/commands/progress.md +6 -0
  191. package/plugins/pbr/commands/quick.md +1 -1
  192. package/plugins/pbr/commands/reapply-patches.md +47 -0
  193. package/plugins/pbr/commands/release.md +6 -0
  194. package/plugins/pbr/commands/remove-phase.md +66 -0
  195. package/plugins/pbr/commands/research-phase.md +59 -0
  196. package/plugins/pbr/commands/resume-work.md +5 -0
  197. package/plugins/pbr/commands/seed.md +6 -0
  198. package/plugins/pbr/commands/session-report.md +5 -0
  199. package/plugins/pbr/commands/set-profile.md +6 -0
  200. package/plugins/pbr/commands/settings.md +5 -0
  201. package/plugins/pbr/commands/setup.md +1 -1
  202. package/plugins/pbr/commands/ship.md +5 -0
  203. package/plugins/pbr/commands/stats.md +6 -0
  204. package/plugins/pbr/commands/test.md +5 -0
  205. package/plugins/pbr/commands/thread.md +6 -0
  206. package/plugins/pbr/commands/todo.md +1 -1
  207. package/plugins/pbr/commands/ui-phase.md +5 -0
  208. package/plugins/pbr/commands/ui-review.md +5 -0
  209. package/plugins/pbr/commands/undo.md +5 -0
  210. package/plugins/pbr/commands/update.md +37 -0
  211. package/plugins/pbr/commands/validate-phase.md +5 -0
  212. package/plugins/pbr/commands/verify-work.md +6 -0
  213. package/plugins/pbr/dashboard/package-lock.json +6 -0
  214. package/plugins/pbr/dist/architecture-guard.js +59 -0
  215. package/plugins/pbr/dist/audit-dimensions.js +556 -0
  216. package/plugins/pbr/dist/auto-continue.js +277 -0
  217. package/plugins/pbr/dist/block-skill-self-read.js +124 -0
  218. package/plugins/pbr/dist/check-agent-state-write.js +63 -0
  219. package/plugins/pbr/dist/check-config-change.js +162 -0
  220. package/plugins/pbr/dist/check-cross-plugin-sync.js +93 -0
  221. package/plugins/pbr/dist/check-dangerous-commands.js +193 -0
  222. package/plugins/pbr/dist/check-direct-state-write.js +37 -0
  223. package/plugins/pbr/dist/check-doc-sprawl.js +102 -0
  224. package/plugins/pbr/dist/check-phase-boundary.js +191 -0
  225. package/plugins/pbr/dist/check-plan-format.js +241 -0
  226. package/plugins/pbr/dist/check-read-first.js +345 -0
  227. package/plugins/pbr/dist/check-roadmap-sync.js +503 -0
  228. package/plugins/pbr/dist/check-skill-workflow.js +354 -0
  229. package/plugins/pbr/dist/check-state-sync.js +658 -0
  230. package/plugins/pbr/dist/check-subagent-output.js +452 -0
  231. package/plugins/pbr/dist/check-summary-gate.js +199 -0
  232. package/plugins/pbr/dist/context-bridge.js +425 -0
  233. package/plugins/pbr/dist/context-budget-check.js +442 -0
  234. package/plugins/pbr/dist/context-quality.js +271 -0
  235. package/plugins/pbr/dist/enforce-context-budget.js +138 -0
  236. package/plugins/pbr/dist/enforce-pbr-workflow.js +277 -0
  237. package/plugins/pbr/dist/event-handler.js +202 -0
  238. package/plugins/pbr/dist/event-logger.js +125 -0
  239. package/plugins/pbr/dist/feedback-loop.js +172 -0
  240. package/plugins/pbr/dist/graph-update.js +422 -0
  241. package/plugins/pbr/dist/hook-logger.js +114 -0
  242. package/plugins/pbr/dist/hook-server-client.js +361 -0
  243. package/plugins/pbr/dist/hook-server.js +606 -0
  244. package/plugins/pbr/dist/hooks-schema.json +87 -0
  245. package/plugins/pbr/dist/instructions-loaded.js +173 -0
  246. package/plugins/pbr/dist/intercept-plan-mode.js +81 -0
  247. package/plugins/pbr/dist/log-notification.js +131 -0
  248. package/plugins/pbr/dist/log-subagent.js +349 -0
  249. package/plugins/pbr/dist/log-tool-failure.js +140 -0
  250. package/plugins/pbr/dist/milestone-learnings.js +569 -0
  251. package/plugins/pbr/dist/pbr-tools.js +2044 -0
  252. package/plugins/pbr/dist/post-bash-triage.js +154 -0
  253. package/plugins/pbr/dist/post-compact.js +135 -0
  254. package/plugins/pbr/dist/post-hoc.js +286 -0
  255. package/plugins/pbr/dist/post-write-dispatch.js +279 -0
  256. package/plugins/pbr/dist/post-write-quality.js +208 -0
  257. package/plugins/pbr/dist/pre-bash-dispatch.js +218 -0
  258. package/plugins/pbr/dist/pre-skill-dispatch.js +114 -0
  259. package/plugins/pbr/dist/pre-task-dispatch.js +297 -0
  260. package/plugins/pbr/dist/pre-write-dispatch.js +234 -0
  261. package/plugins/pbr/dist/progress-tracker.js +198 -0
  262. package/plugins/pbr/dist/prompt-guard.js +114 -0
  263. package/plugins/pbr/dist/prompt-routing.js +209 -0
  264. package/plugins/pbr/dist/quick-status.js +179 -0
  265. package/plugins/pbr/dist/record-incident.js +37 -0
  266. package/plugins/pbr/dist/run-hook.js +144 -0
  267. package/plugins/pbr/dist/session-cleanup.js +683 -0
  268. package/plugins/pbr/dist/session-tracker.js +124 -0
  269. package/plugins/pbr/dist/status-line.js +847 -0
  270. package/plugins/pbr/dist/suggest-compact.js +315 -0
  271. package/plugins/pbr/dist/sync-context-to-claude.js +100 -0
  272. package/plugins/pbr/dist/task-completed.js +206 -0
  273. package/plugins/pbr/dist/track-context-budget.js +432 -0
  274. package/plugins/pbr/dist/track-user-gates.js +88 -0
  275. package/plugins/pbr/dist/trust-tracker.js +193 -0
  276. package/plugins/pbr/dist/validate-commit.js +271 -0
  277. package/plugins/pbr/dist/validate-skill-args.js +222 -0
  278. package/plugins/pbr/dist/validate-task.js +301 -0
  279. package/plugins/pbr/dist/worktree-create.js +144 -0
  280. package/plugins/pbr/dist/worktree-remove.js +147 -0
  281. package/plugins/pbr/hooks/hooks.json +143 -60
  282. package/plugins/pbr/references/agent-contracts.md +40 -9
  283. package/plugins/pbr/references/agent-teams.md +3 -3
  284. package/plugins/pbr/references/archive/checkpoints.md +189 -0
  285. package/plugins/pbr/references/archive/context-quality-tiers.md +45 -0
  286. package/plugins/pbr/references/archive/hook-ordering.md +89 -0
  287. package/plugins/pbr/references/archive/limitations.md +106 -0
  288. package/plugins/pbr/references/archive/pbr-rules.md +194 -0
  289. package/plugins/pbr/references/archive/pbr-tools-cli.md +415 -0
  290. package/plugins/pbr/references/archive/pretooluse-jsonl-behavior.md +58 -0
  291. package/plugins/pbr/references/archive/signal-files.md +41 -0
  292. package/plugins/pbr/references/archive/tmux-setup.md +288 -0
  293. package/plugins/pbr/references/archive/verification-matrix.md +34 -0
  294. package/plugins/pbr/references/archive/verification-patterns.md +277 -0
  295. package/plugins/pbr/references/archive/worktree-sparse-checkout.md +86 -0
  296. package/plugins/pbr/references/behavioral-contexts.md +53 -0
  297. package/plugins/pbr/references/checkpoints.md +723 -104
  298. package/plugins/pbr/references/config-reference.md +472 -10
  299. package/plugins/pbr/references/continuation-format.md +1 -0
  300. package/plugins/pbr/references/decimal-phase-calculation.md +65 -0
  301. package/plugins/pbr/references/deviation-rules.md +12 -0
  302. package/plugins/pbr/references/git-integration.md +110 -27
  303. package/plugins/pbr/references/git-planning-commit.md +35 -0
  304. package/plugins/pbr/references/model-profile-resolution.md +34 -0
  305. package/plugins/pbr/references/model-profiles.md +90 -7
  306. package/plugins/pbr/references/model-selection.md +1 -1
  307. package/plugins/pbr/references/node-repair.md +48 -0
  308. package/plugins/pbr/references/plan-authoring.md +65 -0
  309. package/plugins/pbr/references/plan-format.md +161 -10
  310. package/plugins/pbr/references/questioning.md +138 -49
  311. package/plugins/pbr/references/reading-verification.md +4 -4
  312. package/plugins/pbr/references/tdd.md +263 -0
  313. package/plugins/pbr/references/ui-brand.md +449 -0
  314. package/plugins/pbr/references/verification-overrides.md +39 -0
  315. package/plugins/pbr/references/verification-patterns.md +529 -113
  316. package/plugins/pbr/scripts/architecture-guard.js +59 -0
  317. package/plugins/pbr/scripts/audit-checks/behavioral-compliance.js +2098 -0
  318. package/plugins/pbr/scripts/audit-checks/error-analysis.js +989 -0
  319. package/plugins/pbr/scripts/audit-checks/feature-verification.js +723 -0
  320. package/plugins/pbr/scripts/audit-checks/index.js +433 -0
  321. package/plugins/pbr/scripts/audit-checks/infrastructure.js +816 -0
  322. package/plugins/pbr/scripts/audit-checks/quality-metrics.js +452 -0
  323. package/plugins/pbr/scripts/audit-checks/session-quality.js +980 -0
  324. package/plugins/pbr/scripts/audit-checks/si-agent-hook-config-checks.js +466 -0
  325. package/plugins/pbr/scripts/audit-checks/si-cross-cutting-checks.js +272 -0
  326. package/plugins/pbr/scripts/audit-checks/si-skill-checks.js +424 -0
  327. package/plugins/pbr/scripts/audit-checks/workflow-compliance.js +1211 -0
  328. package/plugins/pbr/scripts/audit-dimensions.js +556 -0
  329. package/plugins/pbr/scripts/auto-continue.js +198 -31
  330. package/plugins/pbr/scripts/block-skill-self-read.js +124 -0
  331. package/plugins/pbr/scripts/check-agent-state-write.js +63 -0
  332. package/plugins/pbr/scripts/check-config-change.js +162 -0
  333. package/plugins/pbr/scripts/check-cross-plugin-sync.js +93 -0
  334. package/plugins/pbr/scripts/check-dangerous-commands.js +18 -5
  335. package/plugins/pbr/scripts/check-direct-state-write.js +37 -0
  336. package/plugins/pbr/scripts/check-phase-boundary.js +3 -8
  337. package/plugins/pbr/scripts/check-plan-format.js +166 -277
  338. package/plugins/pbr/scripts/check-read-first.js +345 -0
  339. package/plugins/pbr/scripts/check-roadmap-sync.js +167 -10
  340. package/plugins/pbr/scripts/check-skill-workflow.js +24 -27
  341. package/plugins/pbr/scripts/check-state-sync.js +339 -215
  342. package/plugins/pbr/scripts/check-subagent-output.js +338 -276
  343. package/plugins/pbr/scripts/check-summary-gate.js +2 -1
  344. package/plugins/pbr/scripts/config-schema.json +1247 -95
  345. package/plugins/pbr/scripts/context-bridge.js +425 -0
  346. package/plugins/pbr/scripts/context-budget-check.js +169 -14
  347. package/plugins/pbr/scripts/context-quality.js +271 -0
  348. package/plugins/pbr/scripts/enforce-context-budget.js +138 -0
  349. package/plugins/pbr/scripts/enforce-pbr-workflow.js +277 -0
  350. package/plugins/pbr/scripts/event-handler.js +128 -77
  351. package/plugins/pbr/scripts/event-logger.js +58 -25
  352. package/plugins/pbr/scripts/feedback-loop.js +172 -0
  353. package/plugins/pbr/scripts/graph-update.js +422 -0
  354. package/plugins/pbr/scripts/hook-logger.js +69 -35
  355. package/plugins/pbr/scripts/hook-server-client.js +361 -0
  356. package/plugins/pbr/scripts/hook-server.js +606 -0
  357. package/plugins/pbr/scripts/hooks-schema.json +13 -5
  358. package/plugins/pbr/scripts/instructions-loaded.js +173 -0
  359. package/plugins/pbr/scripts/intent-router.cjs +147 -0
  360. package/plugins/pbr/scripts/intercept-plan-mode.js +52 -18
  361. package/plugins/pbr/scripts/lib/alternatives.js +203 -0
  362. package/plugins/pbr/scripts/lib/audit.js +65 -0
  363. package/plugins/pbr/scripts/lib/auto-cleanup.js +221 -0
  364. package/plugins/pbr/scripts/lib/auto-verify.js +103 -0
  365. package/plugins/pbr/scripts/lib/autonomy.js +91 -0
  366. package/plugins/pbr/scripts/lib/build.js +719 -0
  367. package/plugins/pbr/scripts/lib/ci-fix-loop.js +228 -0
  368. package/plugins/pbr/scripts/lib/circuit-state.js +133 -0
  369. package/plugins/pbr/scripts/lib/commands.js +483 -0
  370. package/plugins/pbr/scripts/lib/completion.js +377 -0
  371. package/plugins/pbr/scripts/lib/compound.js +216 -0
  372. package/plugins/pbr/scripts/lib/config.js +1315 -0
  373. package/plugins/pbr/scripts/lib/context.js +254 -0
  374. package/plugins/pbr/scripts/lib/contextual-help.js +207 -0
  375. package/plugins/pbr/scripts/lib/convention-detector.js +413 -0
  376. package/plugins/pbr/scripts/lib/core.js +1569 -0
  377. package/plugins/pbr/scripts/lib/dashboard-launch.js +364 -0
  378. package/plugins/pbr/scripts/lib/data-hygiene.js +179 -0
  379. package/plugins/pbr/scripts/lib/decision-extraction.js +183 -0
  380. package/plugins/pbr/scripts/lib/decisions.js +194 -0
  381. package/plugins/pbr/scripts/lib/dependency-break.js +147 -0
  382. package/plugins/pbr/scripts/lib/format-validators.js +1050 -0
  383. package/plugins/pbr/scripts/lib/frontmatter.js +302 -0
  384. package/plugins/pbr/scripts/lib/gates/advisories.js +129 -0
  385. package/plugins/pbr/scripts/lib/gates/build-dependency.js +115 -0
  386. package/plugins/pbr/scripts/lib/gates/build-executor.js +104 -0
  387. package/plugins/pbr/scripts/lib/gates/doc-existence.js +46 -0
  388. package/plugins/pbr/scripts/lib/gates/helpers.js +93 -0
  389. package/plugins/pbr/scripts/lib/gates/inline-execution.js +185 -0
  390. package/plugins/pbr/scripts/lib/gates/milestone-complete.js +136 -0
  391. package/plugins/pbr/scripts/lib/gates/milestone-summary.js +119 -0
  392. package/plugins/pbr/scripts/lib/gates/multi-phase-loader.js +147 -0
  393. package/plugins/pbr/scripts/lib/gates/plan-executor.js +36 -0
  394. package/plugins/pbr/scripts/lib/gates/plan-validation.js +114 -0
  395. package/plugins/pbr/scripts/lib/gates/quick-executor.js +76 -0
  396. package/plugins/pbr/scripts/lib/gates/review-planner.js +61 -0
  397. package/plugins/pbr/scripts/lib/gates/review-verifier.js +69 -0
  398. package/plugins/pbr/scripts/lib/gates/rich-agent-context.js +143 -0
  399. package/plugins/pbr/scripts/lib/gates/user-confirmation.js +93 -0
  400. package/plugins/pbr/scripts/lib/graph-cli.js +89 -0
  401. package/plugins/pbr/scripts/lib/graph.js +553 -0
  402. package/plugins/pbr/scripts/lib/health-checks.js +107 -0
  403. package/plugins/pbr/scripts/lib/health-phase06.js +120 -0
  404. package/plugins/pbr/scripts/lib/health.js +133 -0
  405. package/plugins/pbr/scripts/lib/help.js +151 -0
  406. package/plugins/pbr/scripts/lib/history.js +150 -0
  407. package/plugins/pbr/scripts/lib/hypothesis-runner.js +127 -0
  408. package/plugins/pbr/scripts/lib/impact-analysis.js +319 -0
  409. package/plugins/pbr/scripts/lib/incidents.js +190 -0
  410. package/plugins/pbr/scripts/lib/init.js +643 -0
  411. package/plugins/pbr/scripts/lib/insights-parser.js +320 -0
  412. package/plugins/pbr/scripts/lib/intel.js +653 -0
  413. package/plugins/pbr/scripts/lib/learnings.js +511 -0
  414. package/plugins/pbr/scripts/lib/local-llm/client.js +237 -0
  415. package/plugins/pbr/scripts/lib/local-llm/health.js +12 -0
  416. package/plugins/pbr/scripts/lib/local-llm/index.js +89 -0
  417. package/plugins/pbr/scripts/lib/local-llm/metrics.js +20 -0
  418. package/plugins/pbr/scripts/lib/local-llm/operations/classify-artifact.js +4 -0
  419. package/plugins/pbr/scripts/lib/local-llm/operations/classify-commit.js +4 -0
  420. package/plugins/pbr/scripts/lib/local-llm/operations/classify-error.js +4 -0
  421. package/plugins/pbr/scripts/lib/local-llm/operations/classify-file-intent.js +4 -0
  422. package/plugins/pbr/scripts/lib/local-llm/operations/score-source.js +72 -0
  423. package/plugins/pbr/scripts/lib/local-llm/operations/summarize-context.js +62 -0
  424. package/plugins/pbr/scripts/lib/local-llm/operations/triage-test-output.js +12 -0
  425. package/plugins/pbr/scripts/lib/local-llm/operations/validate-task.js +4 -0
  426. package/plugins/pbr/scripts/lib/local-llm/router.js +101 -0
  427. package/plugins/pbr/scripts/lib/local-llm/shadow.js +60 -0
  428. package/plugins/pbr/scripts/lib/local-llm/threshold-tuner.js +118 -0
  429. package/plugins/pbr/scripts/lib/migrate.js +298 -0
  430. package/plugins/pbr/scripts/lib/milestone.js +306 -0
  431. package/plugins/pbr/scripts/lib/negative-knowledge.js +194 -0
  432. package/plugins/pbr/scripts/lib/notification-throttle.js +141 -0
  433. package/plugins/pbr/scripts/lib/onboarding-generator.js +288 -0
  434. package/plugins/pbr/scripts/lib/parse-args.js +134 -0
  435. package/plugins/pbr/scripts/lib/pattern-routing.js +55 -0
  436. package/plugins/pbr/scripts/lib/patterns.js +272 -0
  437. package/plugins/pbr/scripts/lib/perf.js +190 -0
  438. package/plugins/pbr/scripts/lib/phase.js +1027 -0
  439. package/plugins/pbr/scripts/lib/pid-lock.js +154 -0
  440. package/plugins/pbr/scripts/lib/post-hoc.js +160 -0
  441. package/plugins/pbr/scripts/lib/pre-commit-checks.js +220 -0
  442. package/plugins/pbr/scripts/lib/pre-research.js +133 -0
  443. package/plugins/pbr/scripts/lib/preview.js +174 -0
  444. package/plugins/pbr/scripts/lib/progress-visualization.js +296 -0
  445. package/plugins/pbr/scripts/lib/quick-init.js +131 -0
  446. package/plugins/pbr/scripts/lib/reference.js +236 -0
  447. package/plugins/pbr/scripts/lib/requirements.js +153 -0
  448. package/plugins/pbr/scripts/lib/resolve-root.js +66 -0
  449. package/plugins/pbr/scripts/lib/reverse-spec.js +259 -0
  450. package/plugins/pbr/scripts/lib/roadmap.js +1113 -0
  451. package/plugins/pbr/scripts/lib/security-scan.js +200 -0
  452. package/plugins/pbr/scripts/lib/session-briefing.js +895 -0
  453. package/plugins/pbr/scripts/lib/skill-section.js +99 -0
  454. package/plugins/pbr/scripts/lib/smart-next-task.js +207 -0
  455. package/plugins/pbr/scripts/lib/snapshot-manager.js +232 -0
  456. package/plugins/pbr/scripts/lib/spec-diff.js +209 -0
  457. package/plugins/pbr/scripts/lib/spec-engine.js +189 -0
  458. package/plugins/pbr/scripts/lib/spot-check.js +642 -0
  459. package/plugins/pbr/scripts/lib/state-queue.js +171 -0
  460. package/plugins/pbr/scripts/lib/state.js +1187 -0
  461. package/plugins/pbr/scripts/lib/status-render.js +511 -0
  462. package/plugins/pbr/scripts/lib/step-verify.js +149 -0
  463. package/plugins/pbr/scripts/lib/subagent-validators.js +1059 -0
  464. package/plugins/pbr/scripts/lib/suggest-next.js +435 -0
  465. package/plugins/pbr/scripts/lib/team-composer.js +87 -0
  466. package/plugins/pbr/scripts/lib/team-coordinator.js +153 -0
  467. package/plugins/pbr/scripts/lib/tech-debt-scanner.js +116 -0
  468. package/plugins/pbr/scripts/lib/template.js +222 -0
  469. package/plugins/pbr/scripts/lib/templates.js +362 -0
  470. package/plugins/pbr/scripts/lib/test-cache.js +54 -0
  471. package/plugins/pbr/scripts/lib/test-selection.js +163 -0
  472. package/plugins/pbr/scripts/lib/todo.js +300 -0
  473. package/plugins/pbr/scripts/lib/trust-gate.js +84 -0
  474. package/plugins/pbr/scripts/lib/verify.js +1473 -0
  475. package/plugins/pbr/scripts/lib/wiring-check.js +196 -0
  476. package/plugins/pbr/scripts/log-notification.js +131 -0
  477. package/plugins/pbr/scripts/log-subagent.js +203 -18
  478. package/plugins/pbr/scripts/log-tool-failure.js +60 -8
  479. package/plugins/pbr/scripts/milestone-learnings.js +569 -0
  480. package/plugins/pbr/scripts/package.json +1 -0
  481. package/plugins/pbr/scripts/pbr-tools.js +1833 -1167
  482. package/plugins/pbr/scripts/post-bash-triage.js +154 -0
  483. package/plugins/pbr/scripts/post-compact.js +135 -0
  484. package/plugins/pbr/scripts/post-hoc.js +286 -0
  485. package/plugins/pbr/scripts/post-write-dispatch.js +237 -31
  486. package/plugins/pbr/scripts/post-write-quality.js +4 -3
  487. package/plugins/pbr/scripts/pre-bash-dispatch.js +155 -23
  488. package/plugins/pbr/scripts/pre-skill-dispatch.js +114 -0
  489. package/plugins/pbr/scripts/pre-task-dispatch.js +297 -0
  490. package/plugins/pbr/scripts/pre-write-dispatch.js +171 -47
  491. package/plugins/pbr/scripts/progress-tracker.js +144 -307
  492. package/plugins/pbr/scripts/prompt-guard.js +114 -0
  493. package/plugins/pbr/scripts/prompt-routing.js +209 -0
  494. package/plugins/pbr/scripts/quick-status.js +179 -0
  495. package/plugins/pbr/scripts/record-incident.js +37 -0
  496. package/plugins/pbr/scripts/risk-classifier.cjs +123 -0
  497. package/plugins/pbr/scripts/run-hook.js +62 -10
  498. package/plugins/pbr/scripts/session-cleanup.js +458 -29
  499. package/plugins/pbr/scripts/session-tracker.js +124 -0
  500. package/plugins/pbr/scripts/status-line.js +591 -32
  501. package/plugins/pbr/scripts/suggest-compact.js +203 -7
  502. package/plugins/pbr/scripts/sync-context-to-claude.js +100 -0
  503. package/plugins/pbr/scripts/task-completed.js +165 -4
  504. package/plugins/pbr/scripts/test/config.test.js +126 -0
  505. package/plugins/pbr/scripts/test/cross-platform.test.js +131 -0
  506. package/plugins/pbr/scripts/test/fixtures/config.json +20 -0
  507. package/plugins/pbr/scripts/test/fixtures/plan.md +54 -0
  508. package/plugins/pbr/scripts/test/fixtures/project.md +30 -0
  509. package/plugins/pbr/scripts/test/fixtures/roadmap.md +55 -0
  510. package/plugins/pbr/scripts/test/fixtures/state.md +60 -0
  511. package/plugins/pbr/scripts/test/fixtures/summary.md +35 -0
  512. package/plugins/pbr/scripts/test/fixtures.test.js +184 -0
  513. package/plugins/pbr/scripts/test/phase.test.js +142 -0
  514. package/plugins/pbr/scripts/test/roadmap.test.js +96 -0
  515. package/plugins/pbr/scripts/test/state.test.js +163 -0
  516. package/plugins/pbr/scripts/track-context-budget.js +368 -99
  517. package/plugins/pbr/scripts/track-user-gates.js +88 -0
  518. package/plugins/pbr/scripts/trust-tracker.js +193 -0
  519. package/plugins/pbr/scripts/validate-commit.js +97 -26
  520. package/plugins/pbr/scripts/validate-skill-args.js +87 -15
  521. package/plugins/pbr/scripts/validate-task.js +112 -626
  522. package/plugins/pbr/scripts/worktree-create.js +144 -0
  523. package/plugins/pbr/scripts/worktree-remove.js +147 -0
  524. package/plugins/pbr/skills/audit/SKILL.md +195 -24
  525. package/plugins/pbr/skills/audit-fix/SKILL.md +326 -0
  526. package/plugins/pbr/skills/autonomous/SKILL.md +545 -0
  527. package/plugins/pbr/skills/backlog/SKILL.md +56 -0
  528. package/plugins/pbr/skills/begin/SKILL.md +507 -153
  529. package/plugins/pbr/skills/begin/templates/STATE.md.tmpl +1 -2
  530. package/plugins/pbr/skills/begin/templates/config.json.tmpl +415 -36
  531. package/plugins/pbr/skills/begin/templates/researcher-prompt.md.tmpl +28 -0
  532. package/plugins/pbr/skills/begin/templates/roadmap-prompt.md.tmpl +28 -3
  533. package/plugins/pbr/skills/begin/templates/synthesis-prompt.md.tmpl +33 -5
  534. package/plugins/pbr/skills/build/SKILL.md +1040 -354
  535. package/plugins/pbr/skills/build/templates/continuation-prompt.md.tmpl +26 -0
  536. package/plugins/pbr/skills/build/templates/executor-prompt.md.tmpl +77 -0
  537. package/plugins/pbr/skills/build/templates/inline-verifier-prompt.md.tmpl +33 -0
  538. package/plugins/pbr/skills/config/SKILL.md +111 -9
  539. package/plugins/pbr/skills/continue/SKILL.md +113 -33
  540. package/plugins/pbr/skills/dashboard/SKILL.md +21 -9
  541. package/plugins/pbr/skills/debug/SKILL.md +70 -12
  542. package/plugins/pbr/skills/debug/templates/continuation-prompt.md.tmpl +12 -1
  543. package/plugins/pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +12 -5
  544. package/plugins/pbr/skills/discuss/SKILL.md +206 -25
  545. package/plugins/pbr/skills/discuss/templates/CONTEXT.md.tmpl +21 -1
  546. package/plugins/pbr/skills/do/SKILL.md +119 -24
  547. package/plugins/pbr/skills/explore/SKILL.md +95 -20
  548. package/plugins/pbr/skills/fast/SKILL.md +94 -0
  549. package/plugins/pbr/skills/forensics/SKILL.md +144 -0
  550. package/plugins/pbr/skills/health/SKILL.md +44 -117
  551. package/plugins/pbr/skills/help/SKILL.md +83 -101
  552. package/plugins/pbr/skills/import/SKILL.md +332 -13
  553. package/plugins/pbr/skills/intel/SKILL.md +131 -0
  554. package/plugins/pbr/skills/list-phase-assumptions/SKILL.md +231 -0
  555. package/plugins/pbr/skills/milestone/SKILL.md +421 -263
  556. package/plugins/pbr/skills/milestone/templates/audit-output.md.tmpl +76 -0
  557. package/plugins/pbr/skills/milestone/templates/complete-output.md.tmpl +32 -0
  558. package/plugins/pbr/skills/milestone/templates/edge-cases.md +54 -0
  559. package/plugins/pbr/skills/milestone/templates/gaps-output.md.tmpl +25 -0
  560. package/plugins/pbr/skills/milestone/templates/integration-checker-prompt.md.tmpl +25 -0
  561. package/plugins/pbr/skills/milestone/templates/new-output.md.tmpl +29 -0
  562. package/plugins/pbr/skills/milestone-summary/SKILL.md +86 -0
  563. package/plugins/pbr/skills/note/SKILL.md +20 -4
  564. package/plugins/pbr/skills/pause/SKILL.md +53 -14
  565. package/plugins/pbr/skills/pause/templates/continue-here.md.tmpl +33 -52
  566. package/plugins/pbr/skills/plan/SKILL.md +526 -280
  567. package/plugins/pbr/skills/plan/templates/checker-prompt.md.tmpl +5 -2
  568. package/plugins/pbr/skills/plan/templates/completion-output.md.tmpl +27 -0
  569. package/plugins/pbr/skills/plan/templates/planner-prompt.md.tmpl +27 -1
  570. package/plugins/pbr/skills/plan/templates/revision-prompt.md.tmpl +21 -5
  571. package/plugins/pbr/skills/profile/SKILL.md +185 -0
  572. package/plugins/pbr/skills/profile-user/SKILL.md +226 -0
  573. package/plugins/pbr/skills/quick/SKILL.md +434 -100
  574. package/plugins/pbr/skills/release/SKILL.md +206 -0
  575. package/plugins/pbr/skills/resume/SKILL.md +169 -46
  576. package/plugins/pbr/skills/review/SKILL.md +217 -164
  577. package/plugins/pbr/skills/review/templates/verifier-prompt.md.tmpl +7 -0
  578. package/plugins/pbr/skills/scan/SKILL.md +151 -106
  579. package/plugins/pbr/skills/scan/templates/mapper-prompt.md.tmpl +5 -56
  580. package/plugins/pbr/skills/seed/SKILL.md +87 -0
  581. package/plugins/pbr/skills/session-report/SKILL.md +130 -0
  582. package/plugins/pbr/skills/setup/SKILL.md +149 -202
  583. package/plugins/pbr/skills/shared/agent-context-enrichment.md +21 -0
  584. package/plugins/pbr/skills/shared/agent-type-resolution.md +32 -0
  585. package/plugins/pbr/skills/shared/commit-planning-docs.md +8 -0
  586. package/plugins/pbr/skills/shared/context-budget.md +66 -1
  587. package/plugins/pbr/skills/shared/context-loader-task.md +18 -11
  588. package/plugins/pbr/skills/shared/digest-select.md +2 -2
  589. package/plugins/pbr/skills/shared/domain-probes.md +1 -1
  590. package/plugins/pbr/skills/shared/error-reporting.md +38 -60
  591. package/plugins/pbr/skills/shared/gate-prompts.md +4 -2
  592. package/plugins/pbr/skills/shared/memory-capture.md +48 -0
  593. package/plugins/pbr/skills/shared/phase-argument-parsing.md +4 -4
  594. package/plugins/pbr/skills/shared/revision-loop.md +24 -6
  595. package/plugins/pbr/skills/shared/state-update.md +47 -54
  596. package/plugins/pbr/skills/shared/universal-anti-patterns.md +27 -4
  597. package/plugins/pbr/skills/ship/SKILL.md +155 -0
  598. package/plugins/pbr/skills/stats/SKILL.md +80 -0
  599. package/plugins/pbr/skills/status/SKILL.md +184 -119
  600. package/plugins/pbr/skills/test/SKILL.md +254 -0
  601. package/plugins/pbr/skills/thread/SKILL.md +73 -0
  602. package/plugins/pbr/skills/todo/SKILL.md +28 -72
  603. package/plugins/pbr/skills/ui-phase/SKILL.md +180 -0
  604. package/plugins/pbr/skills/ui-review/SKILL.md +206 -0
  605. package/plugins/pbr/skills/undo/SKILL.md +221 -0
  606. package/plugins/pbr/skills/validate-phase/SKILL.md +362 -0
  607. package/plugins/pbr/templates/CONTEXT.md.tmpl +45 -20
  608. package/plugins/pbr/templates/DISCOVERY.md.tmpl +29 -0
  609. package/plugins/pbr/templates/DISCUSSION-LOG.md.tmpl +49 -0
  610. package/plugins/pbr/templates/HANDOFF.json.tmpl +30 -0
  611. package/plugins/pbr/templates/INTEGRATION-REPORT.md.tmpl +18 -2
  612. package/plugins/pbr/templates/MILESTONE-AUDIT.md.tmpl +44 -0
  613. package/plugins/pbr/templates/PROJECT.md.tmpl +126 -0
  614. package/plugins/pbr/templates/REQUIREMENTS.md.tmpl +96 -0
  615. package/plugins/pbr/templates/RETROSPECTIVE.md.tmpl +43 -0
  616. package/plugins/pbr/templates/ROADMAP.md.tmpl +108 -14
  617. package/plugins/pbr/templates/SUMMARY-complex.md.tmpl +133 -0
  618. package/plugins/pbr/templates/SUMMARY-minimal.md.tmpl +55 -0
  619. package/plugins/pbr/templates/SUMMARY.md.tmpl +21 -0
  620. package/plugins/pbr/templates/UAT.md.tmpl +94 -0
  621. package/plugins/pbr/templates/UI-SPEC.md.tmpl +144 -0
  622. package/plugins/pbr/templates/VALIDATION.md.tmpl +94 -0
  623. package/plugins/pbr/templates/VERIFICATION-DETAIL.md.tmpl +49 -13
  624. package/plugins/pbr/templates/project-CONTEXT.md.tmpl +59 -0
  625. package/plugins/pbr/templates/research-outputs/ARCHITECTURE.md.tmpl +91 -0
  626. package/plugins/pbr/templates/research-outputs/FEATURES.md.tmpl +64 -0
  627. package/plugins/pbr/templates/research-outputs/PITFALLS.md.tmpl +50 -0
  628. package/plugins/pbr/templates/research-outputs/STACK.md.tmpl +63 -0
  629. package/plugins/pbr/templates/research-outputs/SUMMARY.md.tmpl +98 -0
  630. package/scripts/build-hooks.js +61 -0
  631. package/scripts/check-ci.js +100 -0
  632. package/scripts/clean-changelog.js +364 -0
  633. package/scripts/generate-derivatives.js +581 -0
  634. package/scripts/posttest.js +93 -0
  635. package/scripts/release.js +262 -0
  636. package/scripts/run-tests.cjs +29 -0
  637. package/scripts/test-wrapper.js +43 -0
  638. package/dashboard/bin/cli.js +0 -25
  639. package/dashboard/public/css/layout.css +0 -636
  640. package/dashboard/public/css/status-colors.css +0 -98
  641. package/dashboard/public/css/tokens.css +0 -59
  642. package/dashboard/public/js/htmx-title.js +0 -5
  643. package/dashboard/public/js/sidebar-toggle.js +0 -34
  644. package/dashboard/public/js/sse-client.js +0 -100
  645. package/dashboard/public/js/theme-toggle.js +0 -46
  646. package/dashboard/src/app.js +0 -91
  647. package/dashboard/src/middleware/current-phase.js +0 -24
  648. package/dashboard/src/middleware/errorHandler.js +0 -52
  649. package/dashboard/src/middleware/notFoundHandler.js +0 -9
  650. package/dashboard/src/repositories/planning.repository.js +0 -130
  651. package/dashboard/src/routes/events.routes.js +0 -45
  652. package/dashboard/src/routes/index.routes.js +0 -35
  653. package/dashboard/src/routes/pages.routes.js +0 -426
  654. package/dashboard/src/server.js +0 -42
  655. package/dashboard/src/services/analytics.service.js +0 -141
  656. package/dashboard/src/services/dashboard.service.js +0 -309
  657. package/dashboard/src/services/milestone.service.js +0 -222
  658. package/dashboard/src/services/notes.service.js +0 -50
  659. package/dashboard/src/services/phase.service.js +0 -232
  660. package/dashboard/src/services/project.service.js +0 -57
  661. package/dashboard/src/services/roadmap.service.js +0 -244
  662. package/dashboard/src/services/sse.service.js +0 -58
  663. package/dashboard/src/services/todo.service.js +0 -263
  664. package/dashboard/src/services/watcher.service.js +0 -48
  665. package/dashboard/src/utils/cache.js +0 -55
  666. package/dashboard/src/views/analytics.ejs +0 -5
  667. package/dashboard/src/views/coming-soon.ejs +0 -11
  668. package/dashboard/src/views/dependencies.ejs +0 -5
  669. package/dashboard/src/views/error.ejs +0 -20
  670. package/dashboard/src/views/index.ejs +0 -5
  671. package/dashboard/src/views/milestone-detail.ejs +0 -5
  672. package/dashboard/src/views/milestones.ejs +0 -5
  673. package/dashboard/src/views/notes.ejs +0 -5
  674. package/dashboard/src/views/partials/analytics-content.ejs +0 -90
  675. package/dashboard/src/views/partials/breadcrumbs.ejs +0 -14
  676. package/dashboard/src/views/partials/dashboard-content.ejs +0 -84
  677. package/dashboard/src/views/partials/dependencies-content.ejs +0 -48
  678. package/dashboard/src/views/partials/empty-state.ejs +0 -7
  679. package/dashboard/src/views/partials/footer.ejs +0 -3
  680. package/dashboard/src/views/partials/head.ejs +0 -30
  681. package/dashboard/src/views/partials/header.ejs +0 -21
  682. package/dashboard/src/views/partials/layout-bottom.ejs +0 -6
  683. package/dashboard/src/views/partials/layout-top.ejs +0 -15
  684. package/dashboard/src/views/partials/milestone-detail-content.ejs +0 -20
  685. package/dashboard/src/views/partials/milestones-content.ejs +0 -88
  686. package/dashboard/src/views/partials/notes-content.ejs +0 -23
  687. package/dashboard/src/views/partials/phase-content.ejs +0 -193
  688. package/dashboard/src/views/partials/phase-doc-content.ejs +0 -38
  689. package/dashboard/src/views/partials/phases-content.ejs +0 -124
  690. package/dashboard/src/views/partials/roadmap-content.ejs +0 -155
  691. package/dashboard/src/views/partials/sidebar.ejs +0 -99
  692. package/dashboard/src/views/partials/todo-create-content.ejs +0 -54
  693. package/dashboard/src/views/partials/todo-detail-content.ejs +0 -42
  694. package/dashboard/src/views/partials/todos-content.ejs +0 -94
  695. package/dashboard/src/views/phase-detail.ejs +0 -5
  696. package/dashboard/src/views/phase-doc.ejs +0 -5
  697. package/dashboard/src/views/phases.ejs +0 -5
  698. package/dashboard/src/views/roadmap.ejs +0 -5
  699. package/dashboard/src/views/todo-create.ejs +0 -5
  700. package/dashboard/src/views/todo-detail.ejs +0 -5
  701. package/dashboard/src/views/todos.ejs +0 -5
  702. package/plugins/copilot-pbr/CHANGELOG.md +0 -19
  703. package/plugins/copilot-pbr/README.md +0 -139
  704. package/plugins/copilot-pbr/agents/audit.agent.md +0 -113
  705. package/plugins/copilot-pbr/agents/codebase-mapper.agent.md +0 -151
  706. package/plugins/copilot-pbr/agents/debugger.agent.md +0 -172
  707. package/plugins/copilot-pbr/agents/executor.agent.md +0 -267
  708. package/plugins/copilot-pbr/agents/general.agent.md +0 -88
  709. package/plugins/copilot-pbr/agents/integration-checker.agent.md +0 -119
  710. package/plugins/copilot-pbr/agents/plan-checker.agent.md +0 -199
  711. package/plugins/copilot-pbr/agents/planner.agent.md +0 -238
  712. package/plugins/copilot-pbr/agents/researcher.agent.md +0 -186
  713. package/plugins/copilot-pbr/agents/synthesizer.agent.md +0 -126
  714. package/plugins/copilot-pbr/agents/verifier.agent.md +0 -228
  715. package/plugins/copilot-pbr/hooks/hooks.json +0 -156
  716. package/plugins/copilot-pbr/plugin.json +0 -30
  717. package/plugins/copilot-pbr/references/agent-anti-patterns.md +0 -25
  718. package/plugins/copilot-pbr/references/agent-contracts.md +0 -297
  719. package/plugins/copilot-pbr/references/agent-interactions.md +0 -135
  720. package/plugins/copilot-pbr/references/agent-teams.md +0 -55
  721. package/plugins/copilot-pbr/references/checkpoints.md +0 -158
  722. package/plugins/copilot-pbr/references/common-bug-patterns.md +0 -14
  723. package/plugins/copilot-pbr/references/config-reference.md +0 -442
  724. package/plugins/copilot-pbr/references/continuation-format.md +0 -213
  725. package/plugins/copilot-pbr/references/deviation-rules.md +0 -113
  726. package/plugins/copilot-pbr/references/git-integration.md +0 -227
  727. package/plugins/copilot-pbr/references/integration-patterns.md +0 -118
  728. package/plugins/copilot-pbr/references/model-profiles.md +0 -100
  729. package/plugins/copilot-pbr/references/model-selection.md +0 -32
  730. package/plugins/copilot-pbr/references/pbr-rules.md +0 -195
  731. package/plugins/copilot-pbr/references/pbr-tools-cli.md +0 -285
  732. package/plugins/copilot-pbr/references/plan-authoring.md +0 -182
  733. package/plugins/copilot-pbr/references/plan-format.md +0 -288
  734. package/plugins/copilot-pbr/references/planning-config.md +0 -214
  735. package/plugins/copilot-pbr/references/questioning.md +0 -215
  736. package/plugins/copilot-pbr/references/reading-verification.md +0 -128
  737. package/plugins/copilot-pbr/references/stub-patterns.md +0 -161
  738. package/plugins/copilot-pbr/references/subagent-coordination.md +0 -120
  739. package/plugins/copilot-pbr/references/ui-formatting.md +0 -444
  740. package/plugins/copilot-pbr/references/verification-patterns.md +0 -199
  741. package/plugins/copilot-pbr/references/wave-execution.md +0 -96
  742. package/plugins/copilot-pbr/rules/pbr-workflow.mdc +0 -48
  743. package/plugins/copilot-pbr/setup.ps1 +0 -93
  744. package/plugins/copilot-pbr/setup.sh +0 -93
  745. package/plugins/copilot-pbr/skills/audit/SKILL.md +0 -330
  746. package/plugins/copilot-pbr/skills/begin/SKILL.md +0 -589
  747. package/plugins/copilot-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  748. package/plugins/copilot-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  749. package/plugins/copilot-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  750. package/plugins/copilot-pbr/skills/begin/templates/config.json.tmpl +0 -64
  751. package/plugins/copilot-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  752. package/plugins/copilot-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  753. package/plugins/copilot-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  754. package/plugins/copilot-pbr/skills/build/SKILL.md +0 -960
  755. package/plugins/copilot-pbr/skills/config/SKILL.md +0 -250
  756. package/plugins/copilot-pbr/skills/continue/SKILL.md +0 -159
  757. package/plugins/copilot-pbr/skills/dashboard/SKILL.md +0 -43
  758. package/plugins/copilot-pbr/skills/debug/SKILL.md +0 -508
  759. package/plugins/copilot-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  760. package/plugins/copilot-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  761. package/plugins/copilot-pbr/skills/discuss/SKILL.md +0 -353
  762. package/plugins/copilot-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  763. package/plugins/copilot-pbr/skills/discuss/templates/decision-categories.md +0 -10
  764. package/plugins/copilot-pbr/skills/do/SKILL.md +0 -66
  765. package/plugins/copilot-pbr/skills/explore/SKILL.md +0 -373
  766. package/plugins/copilot-pbr/skills/health/SKILL.md +0 -274
  767. package/plugins/copilot-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  768. package/plugins/copilot-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  769. package/plugins/copilot-pbr/skills/help/SKILL.md +0 -170
  770. package/plugins/copilot-pbr/skills/import/SKILL.md +0 -502
  771. package/plugins/copilot-pbr/skills/milestone/SKILL.md +0 -745
  772. package/plugins/copilot-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  773. package/plugins/copilot-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  774. package/plugins/copilot-pbr/skills/note/SKILL.md +0 -213
  775. package/plugins/copilot-pbr/skills/pause/SKILL.md +0 -247
  776. package/plugins/copilot-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  777. package/plugins/copilot-pbr/skills/plan/SKILL.md +0 -662
  778. package/plugins/copilot-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  779. package/plugins/copilot-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  780. package/plugins/copilot-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  781. package/plugins/copilot-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  782. package/plugins/copilot-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  783. package/plugins/copilot-pbr/skills/quick/SKILL.md +0 -376
  784. package/plugins/copilot-pbr/skills/resume/SKILL.md +0 -399
  785. package/plugins/copilot-pbr/skills/review/SKILL.md +0 -653
  786. package/plugins/copilot-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  787. package/plugins/copilot-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  788. package/plugins/copilot-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  789. package/plugins/copilot-pbr/skills/scan/SKILL.md +0 -299
  790. package/plugins/copilot-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  791. package/plugins/copilot-pbr/skills/setup/SKILL.md +0 -296
  792. package/plugins/copilot-pbr/skills/shared/commit-planning-docs.md +0 -36
  793. package/plugins/copilot-pbr/skills/shared/config-loading.md +0 -103
  794. package/plugins/copilot-pbr/skills/shared/context-budget.md +0 -41
  795. package/plugins/copilot-pbr/skills/shared/context-loader-task.md +0 -87
  796. package/plugins/copilot-pbr/skills/shared/digest-select.md +0 -80
  797. package/plugins/copilot-pbr/skills/shared/domain-probes.md +0 -126
  798. package/plugins/copilot-pbr/skills/shared/error-reporting.md +0 -81
  799. package/plugins/copilot-pbr/skills/shared/gate-prompts.md +0 -389
  800. package/plugins/copilot-pbr/skills/shared/phase-argument-parsing.md +0 -46
  801. package/plugins/copilot-pbr/skills/shared/progress-display.md +0 -53
  802. package/plugins/copilot-pbr/skills/shared/revision-loop.md +0 -82
  803. package/plugins/copilot-pbr/skills/shared/state-loading.md +0 -63
  804. package/plugins/copilot-pbr/skills/shared/state-update.md +0 -162
  805. package/plugins/copilot-pbr/skills/shared/universal-anti-patterns.md +0 -38
  806. package/plugins/copilot-pbr/skills/status/SKILL.md +0 -362
  807. package/plugins/copilot-pbr/skills/statusline/SKILL.md +0 -149
  808. package/plugins/copilot-pbr/skills/todo/SKILL.md +0 -279
  809. package/plugins/copilot-pbr/templates/CONTEXT.md.tmpl +0 -53
  810. package/plugins/copilot-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  811. package/plugins/copilot-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  812. package/plugins/copilot-pbr/templates/ROADMAP.md.tmpl +0 -41
  813. package/plugins/copilot-pbr/templates/SUMMARY.md.tmpl +0 -82
  814. package/plugins/copilot-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  815. package/plugins/copilot-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  816. package/plugins/copilot-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  817. package/plugins/copilot-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  818. package/plugins/copilot-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  819. package/plugins/copilot-pbr/templates/codebase/STACK.md.tmpl +0 -78
  820. package/plugins/copilot-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  821. package/plugins/copilot-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  822. package/plugins/copilot-pbr/templates/continue-here.md.tmpl +0 -74
  823. package/plugins/copilot-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  824. package/plugins/copilot-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  825. package/plugins/copilot-pbr/templates/research/STACK.md.tmpl +0 -71
  826. package/plugins/copilot-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  827. package/plugins/copilot-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  828. package/plugins/copilot-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  829. package/plugins/copilot-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  830. package/plugins/cursor-pbr/.cursor-plugin/plugin.json +0 -32
  831. package/plugins/cursor-pbr/CHANGELOG.md +0 -15
  832. package/plugins/cursor-pbr/README.md +0 -123
  833. package/plugins/cursor-pbr/agents/audit.md +0 -178
  834. package/plugins/cursor-pbr/agents/codebase-mapper.md +0 -150
  835. package/plugins/cursor-pbr/agents/debugger.md +0 -171
  836. package/plugins/cursor-pbr/agents/executor.md +0 -266
  837. package/plugins/cursor-pbr/agents/general.md +0 -87
  838. package/plugins/cursor-pbr/agents/integration-checker.md +0 -118
  839. package/plugins/cursor-pbr/agents/plan-checker.md +0 -198
  840. package/plugins/cursor-pbr/agents/planner.md +0 -237
  841. package/plugins/cursor-pbr/agents/researcher.md +0 -185
  842. package/plugins/cursor-pbr/agents/synthesizer.md +0 -125
  843. package/plugins/cursor-pbr/agents/verifier.md +0 -227
  844. package/plugins/cursor-pbr/assets/.gitkeep +0 -0
  845. package/plugins/cursor-pbr/assets/logo.svg +0 -21
  846. package/plugins/cursor-pbr/hooks/hooks.json +0 -213
  847. package/plugins/cursor-pbr/references/agent-anti-patterns.md +0 -25
  848. package/plugins/cursor-pbr/references/agent-contracts.md +0 -297
  849. package/plugins/cursor-pbr/references/agent-interactions.md +0 -135
  850. package/plugins/cursor-pbr/references/agent-teams.md +0 -55
  851. package/plugins/cursor-pbr/references/checkpoints.md +0 -158
  852. package/plugins/cursor-pbr/references/common-bug-patterns.md +0 -14
  853. package/plugins/cursor-pbr/references/config-reference.md +0 -442
  854. package/plugins/cursor-pbr/references/continuation-format.md +0 -213
  855. package/plugins/cursor-pbr/references/deviation-rules.md +0 -113
  856. package/plugins/cursor-pbr/references/git-integration.md +0 -227
  857. package/plugins/cursor-pbr/references/integration-patterns.md +0 -118
  858. package/plugins/cursor-pbr/references/model-profiles.md +0 -100
  859. package/plugins/cursor-pbr/references/model-selection.md +0 -32
  860. package/plugins/cursor-pbr/references/pbr-rules.md +0 -195
  861. package/plugins/cursor-pbr/references/pbr-tools-cli.md +0 -285
  862. package/plugins/cursor-pbr/references/plan-authoring.md +0 -182
  863. package/plugins/cursor-pbr/references/plan-format.md +0 -288
  864. package/plugins/cursor-pbr/references/planning-config.md +0 -214
  865. package/plugins/cursor-pbr/references/questioning.md +0 -215
  866. package/plugins/cursor-pbr/references/reading-verification.md +0 -128
  867. package/plugins/cursor-pbr/references/stub-patterns.md +0 -161
  868. package/plugins/cursor-pbr/references/subagent-coordination.md +0 -120
  869. package/plugins/cursor-pbr/references/ui-formatting.md +0 -444
  870. package/plugins/cursor-pbr/references/verification-patterns.md +0 -199
  871. package/plugins/cursor-pbr/references/wave-execution.md +0 -96
  872. package/plugins/cursor-pbr/rules/pbr-workflow.mdc +0 -48
  873. package/plugins/cursor-pbr/setup.ps1 +0 -78
  874. package/plugins/cursor-pbr/setup.sh +0 -83
  875. package/plugins/cursor-pbr/skills/audit/SKILL.md +0 -331
  876. package/plugins/cursor-pbr/skills/begin/SKILL.md +0 -589
  877. package/plugins/cursor-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  878. package/plugins/cursor-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  879. package/plugins/cursor-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  880. package/plugins/cursor-pbr/skills/begin/templates/config.json.tmpl +0 -64
  881. package/plugins/cursor-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  882. package/plugins/cursor-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  883. package/plugins/cursor-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  884. package/plugins/cursor-pbr/skills/build/SKILL.md +0 -961
  885. package/plugins/cursor-pbr/skills/config/SKILL.md +0 -252
  886. package/plugins/cursor-pbr/skills/continue/SKILL.md +0 -159
  887. package/plugins/cursor-pbr/skills/dashboard/SKILL.md +0 -44
  888. package/plugins/cursor-pbr/skills/debug/SKILL.md +0 -512
  889. package/plugins/cursor-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  890. package/plugins/cursor-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  891. package/plugins/cursor-pbr/skills/discuss/SKILL.md +0 -354
  892. package/plugins/cursor-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  893. package/plugins/cursor-pbr/skills/discuss/templates/decision-categories.md +0 -10
  894. package/plugins/cursor-pbr/skills/do/SKILL.md +0 -67
  895. package/plugins/cursor-pbr/skills/explore/SKILL.md +0 -376
  896. package/plugins/cursor-pbr/skills/health/SKILL.md +0 -274
  897. package/plugins/cursor-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  898. package/plugins/cursor-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  899. package/plugins/cursor-pbr/skills/help/SKILL.md +0 -170
  900. package/plugins/cursor-pbr/skills/import/SKILL.md +0 -505
  901. package/plugins/cursor-pbr/skills/milestone/SKILL.md +0 -746
  902. package/plugins/cursor-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  903. package/plugins/cursor-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  904. package/plugins/cursor-pbr/skills/note/SKILL.md +0 -214
  905. package/plugins/cursor-pbr/skills/pause/SKILL.md +0 -248
  906. package/plugins/cursor-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  907. package/plugins/cursor-pbr/skills/plan/SKILL.md +0 -663
  908. package/plugins/cursor-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  909. package/plugins/cursor-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  910. package/plugins/cursor-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  911. package/plugins/cursor-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  912. package/plugins/cursor-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  913. package/plugins/cursor-pbr/skills/quick/SKILL.md +0 -376
  914. package/plugins/cursor-pbr/skills/resume/SKILL.md +0 -399
  915. package/plugins/cursor-pbr/skills/review/SKILL.md +0 -654
  916. package/plugins/cursor-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  917. package/plugins/cursor-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  918. package/plugins/cursor-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  919. package/plugins/cursor-pbr/skills/scan/SKILL.md +0 -300
  920. package/plugins/cursor-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  921. package/plugins/cursor-pbr/skills/setup/SKILL.md +0 -296
  922. package/plugins/cursor-pbr/skills/shared/commit-planning-docs.md +0 -36
  923. package/plugins/cursor-pbr/skills/shared/config-loading.md +0 -103
  924. package/plugins/cursor-pbr/skills/shared/context-budget.md +0 -41
  925. package/plugins/cursor-pbr/skills/shared/context-loader-task.md +0 -87
  926. package/plugins/cursor-pbr/skills/shared/digest-select.md +0 -80
  927. package/plugins/cursor-pbr/skills/shared/domain-probes.md +0 -126
  928. package/plugins/cursor-pbr/skills/shared/error-reporting.md +0 -81
  929. package/plugins/cursor-pbr/skills/shared/gate-prompts.md +0 -389
  930. package/plugins/cursor-pbr/skills/shared/phase-argument-parsing.md +0 -46
  931. package/plugins/cursor-pbr/skills/shared/progress-display.md +0 -53
  932. package/plugins/cursor-pbr/skills/shared/revision-loop.md +0 -82
  933. package/plugins/cursor-pbr/skills/shared/state-loading.md +0 -63
  934. package/plugins/cursor-pbr/skills/shared/state-update.md +0 -162
  935. package/plugins/cursor-pbr/skills/shared/universal-anti-patterns.md +0 -38
  936. package/plugins/cursor-pbr/skills/status/SKILL.md +0 -362
  937. package/plugins/cursor-pbr/skills/statusline/SKILL.md +0 -150
  938. package/plugins/cursor-pbr/skills/todo/SKILL.md +0 -280
  939. package/plugins/cursor-pbr/templates/CONTEXT.md.tmpl +0 -53
  940. package/plugins/cursor-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  941. package/plugins/cursor-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  942. package/plugins/cursor-pbr/templates/ROADMAP.md.tmpl +0 -41
  943. package/plugins/cursor-pbr/templates/SUMMARY.md.tmpl +0 -82
  944. package/plugins/cursor-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  945. package/plugins/cursor-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  946. package/plugins/cursor-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  947. package/plugins/cursor-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  948. package/plugins/cursor-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  949. package/plugins/cursor-pbr/templates/codebase/STACK.md.tmpl +0 -78
  950. package/plugins/cursor-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  951. package/plugins/cursor-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  952. package/plugins/cursor-pbr/templates/continue-here.md.tmpl +0 -74
  953. package/plugins/cursor-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  954. package/plugins/cursor-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  955. package/plugins/cursor-pbr/templates/research/STACK.md.tmpl +0 -71
  956. package/plugins/cursor-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  957. package/plugins/cursor-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  958. package/plugins/cursor-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  959. package/plugins/cursor-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  960. package/plugins/pbr/references/agent-interactions.md +0 -134
  961. package/plugins/pbr/references/pbr-rules.md +0 -194
  962. package/plugins/pbr/references/pbr-tools-cli.md +0 -285
  963. package/plugins/pbr/references/planning-config.md +0 -213
  964. package/plugins/pbr/references/subagent-coordination.md +0 -119
  965. package/plugins/pbr/references/ui-formatting.md +0 -444
  966. package/plugins/pbr/scripts/validate-plugin-structure.js +0 -183
  967. package/plugins/pbr/skills/milestone/templates/audit-report.md.tmpl +0 -48
  968. package/plugins/pbr/skills/shared/progress-display.md +0 -53
  969. package/plugins/pbr/skills/shared/state-loading.md +0 -62
  970. package/plugins/pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -97
  971. package/plugins/pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  972. package/plugins/pbr/templates/research/STACK.md.tmpl +0 -71
  973. package/plugins/pbr/templates/research/SUMMARY.md.tmpl +0 -112
  974. package/plugins/pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  975. package/plugins/pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  976. package/plugins/pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  977. /package/plugins/pbr/references/{agent-anti-patterns.md → archive/agent-anti-patterns.md} +0 -0
@@ -0,0 +1,1211 @@
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 _projectRoot = path.resolve(planningDir, '..');
905
+ const log = execSync('git log --oneline -20', {
906
+ cwd: _projectRoot,
907
+ timeout: 10000,
908
+ encoding: 'utf8',
909
+ });
910
+
911
+ const commits = log.trim().split('\n');
912
+ for (const commit of commits) {
913
+ // Strip SHA prefix
914
+ const msg = commit.replace(/^[a-f0-9]+\s+/, '');
915
+ // Skip merge commits
916
+ if (msg.startsWith('Merge')) continue;
917
+ if (!conventionPattern.test(msg)) {
918
+ evidence.push(`Non-conventional commit: "${msg.substring(0, 120)}"`);
919
+ }
920
+ }
921
+ } catch (_e) {
922
+ return result('WC-09', 'pass', 'No session logs available for analysis');
923
+ }
924
+
925
+ if (evidence.length === 0) {
926
+ return result('WC-09', 'pass', 'All recent commits follow convention format');
927
+ }
928
+
929
+ return result('WC-09', 'warn',
930
+ `${evidence.length} non-conventional commit(s) in recent history`,
931
+ evidence
932
+ );
933
+ }
934
+
935
+ // ---------------------------------------------------------------------------
936
+ // WC-12: Test Health Baseline
937
+ // ---------------------------------------------------------------------------
938
+
939
+ /**
940
+ * Compare current test failures against a known baseline.
941
+ * Detects new test failures that were not previously known.
942
+ *
943
+ * @param {string} planningDir - Path to .planning/ directory
944
+ * @param {object} _config - Parsed config.json (unused)
945
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
946
+ */
947
+ function checkTestHealthBaseline(planningDir, _config) {
948
+ const projectRoot = path.resolve(planningDir, '..');
949
+
950
+ // Run tests and detect pass/fail
951
+ let testOutput = '';
952
+ let hasFailures = false;
953
+
954
+ try {
955
+ testOutput = execSync('npm test -- --ci --silent 2>&1', {
956
+ cwd: projectRoot,
957
+ timeout: 60000,
958
+ encoding: 'utf8',
959
+ });
960
+ hasFailures = testOutput.includes('FAIL');
961
+ } catch (_e) {
962
+ // Non-zero exit = test failures
963
+ hasFailures = true;
964
+ if (_e.stdout) testOutput = _e.stdout.toString();
965
+ }
966
+
967
+ const currentStatus = hasFailures ? 'HAS_FAILURES' : 'ALL_PASS';
968
+
969
+ // Read baseline file
970
+ const baselinePath = path.join(planningDir, 'test-baseline.json');
971
+ let baseline = null;
972
+
973
+ try {
974
+ const raw = fs.readFileSync(baselinePath, 'utf8');
975
+ baseline = JSON.parse(raw);
976
+ } catch (_e) {
977
+ // No baseline file
978
+ }
979
+
980
+ if (!baseline) {
981
+ return result('WC-12', 'info',
982
+ 'No test baseline established yet',
983
+ [`Current test status: ${currentStatus}`]
984
+ );
985
+ }
986
+
987
+ // Compare against baseline
988
+ const evidence = [];
989
+ const knownFailures = baseline.known_failures || [];
990
+
991
+ if (hasFailures && knownFailures.length === 0) {
992
+ evidence.push('Tests have failures but baseline shows no known failures — new regressions detected');
993
+ }
994
+
995
+ // Extract failing test names if possible
996
+ const failLines = testOutput.split('\n').filter(l => /FAIL\s/.test(l));
997
+ for (const fl of failLines) {
998
+ const trimmed = fl.trim().substring(0, 120);
999
+ const isKnown = knownFailures.some(kf => trimmed.includes(kf));
1000
+ if (!isKnown) {
1001
+ evidence.push(`New failure: ${trimmed}`);
1002
+ }
1003
+ }
1004
+
1005
+ if (evidence.length === 0) {
1006
+ return result('WC-12', 'pass',
1007
+ `Test health matches baseline (${currentStatus})`,
1008
+ [`Known failures: ${knownFailures.length}`]
1009
+ );
1010
+ }
1011
+
1012
+ return result('WC-12', 'warn',
1013
+ `${evidence.length} new test issue(s) beyond baseline`,
1014
+ evidence
1015
+ );
1016
+ }
1017
+
1018
+ // ---------------------------------------------------------------------------
1019
+ // WC-10: Model Selection Compliance
1020
+ // ---------------------------------------------------------------------------
1021
+
1022
+ /**
1023
+ * Cross-reference agent spawns in session logs against config.models settings.
1024
+ * Detects agents using models that differ from configured preferences.
1025
+ *
1026
+ * @param {string} planningDir - Path to .planning/ directory
1027
+ * @param {object} config - Parsed config.json
1028
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
1029
+ */
1030
+ function checkModelSelectionCompliance(planningDir, config) {
1031
+ const models = (config && config.models) || {};
1032
+ const logFiles = findSessionLogs(planningDir);
1033
+
1034
+ if (logFiles.length === 0) {
1035
+ return result('WC-10', 'pass', 'No session logs available for model verification');
1036
+ }
1037
+
1038
+ const entries = parseSessionEntries(logFiles);
1039
+ const evidence = [];
1040
+ let totalSpawns = 0;
1041
+ let compliant = 0;
1042
+
1043
+ for (const entry of entries) {
1044
+ // Look for Task tool_use entries with subagent_type or model fields
1045
+ if (entry.type !== 'tool_use' && entry.type !== 'assistant') continue;
1046
+
1047
+ const input = entry.input || {};
1048
+ const subagentType = input.subagent_type || input.agent_type || '';
1049
+ const usedModel = input.model || '';
1050
+
1051
+ // Only care about pbr agent spawns
1052
+ if (!subagentType.startsWith('pbr:')) continue;
1053
+
1054
+ totalSpawns++;
1055
+ const agentName = subagentType.replace('pbr:', '');
1056
+
1057
+ // Check if config has a model preference for this agent type
1058
+ const configuredModel = models[agentName];
1059
+ if (!configuredModel || configuredModel === 'inherit') {
1060
+ // No specific model configured or set to inherit — always compliant
1061
+ compliant++;
1062
+ continue;
1063
+ }
1064
+
1065
+ if (usedModel && usedModel !== configuredModel) {
1066
+ evidence.push(
1067
+ `Agent "${agentName}" used model "${usedModel}" but config specifies "${configuredModel}"`
1068
+ );
1069
+ } else {
1070
+ compliant++;
1071
+ }
1072
+ }
1073
+
1074
+ if (totalSpawns === 0) {
1075
+ return result('WC-10', 'pass', 'No agent spawns detected for model verification');
1076
+ }
1077
+
1078
+ const pct = Math.round((compliant / totalSpawns) * 100);
1079
+
1080
+ if (evidence.length === 0) {
1081
+ return result('WC-10', 'pass',
1082
+ `${totalSpawns} agent spawn(s), ${pct}% model-compliant`);
1083
+ }
1084
+
1085
+ return result('WC-10', 'info',
1086
+ `${evidence.length} model mismatch(es) across ${totalSpawns} spawns (${pct}% compliant)`,
1087
+ evidence
1088
+ );
1089
+ }
1090
+
1091
+ // ---------------------------------------------------------------------------
1092
+ // WC-11: Git Branching Compliance
1093
+ // ---------------------------------------------------------------------------
1094
+
1095
+ /**
1096
+ * Verify phase branches exist when git.branching is set to "phase".
1097
+ * Reads config.json git settings and checks git branch list.
1098
+ *
1099
+ * @param {string} planningDir - Path to .planning/ directory
1100
+ * @param {object} config - Parsed config.json
1101
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
1102
+ */
1103
+ function checkGitBranchingCompliance(planningDir, config) {
1104
+ const gitConfig = (config && config.git) || {};
1105
+ const branching = gitConfig.branching || 'none';
1106
+
1107
+ if (branching === 'none' || branching === 'disabled') {
1108
+ return result('WC-11', 'pass', 'Git branching not configured');
1109
+ }
1110
+
1111
+ if (branching !== 'phase') {
1112
+ return result('WC-11', 'pass',
1113
+ `Git branching mode "${branching}" — phase branch check not applicable`);
1114
+ }
1115
+
1116
+ const projectRoot = path.resolve(planningDir, '..');
1117
+ const template = gitConfig.phase_branch_template ||
1118
+ 'plan-build-run/phase-{phase}-{slug}';
1119
+
1120
+ // Get list of git branches
1121
+ let branches;
1122
+ try {
1123
+ const branchOutput = execSync('git branch --list --all', {
1124
+ cwd: projectRoot,
1125
+ timeout: 10000,
1126
+ encoding: 'utf8',
1127
+ });
1128
+ branches = branchOutput
1129
+ .split('\n')
1130
+ .map(b => b.replace(/^\*?\s+/, '').trim())
1131
+ .filter(b => b.length > 0);
1132
+ } catch (_e) {
1133
+ return result('WC-11', 'pass', 'Git not available');
1134
+ }
1135
+
1136
+ // Get active phase directories
1137
+ const phasesDir = path.join(planningDir, 'phases');
1138
+ let phaseDirs;
1139
+ try {
1140
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
1141
+ phaseDirs = entries
1142
+ .filter(e => e.isDirectory() && /^\d{2}-/.test(e.name))
1143
+ .map(e => e.name)
1144
+ .sort();
1145
+ } catch (_e) {
1146
+ return result('WC-11', 'pass', 'No phases/ directory');
1147
+ }
1148
+
1149
+ const evidence = [];
1150
+
1151
+ for (const dir of phaseDirs) {
1152
+ // Check if this phase has PLAN files (indicates active work)
1153
+ const dirPath = path.join(phasesDir, dir);
1154
+ let hasPlan = false;
1155
+ try {
1156
+ const files = fs.readdirSync(dirPath);
1157
+ hasPlan = files.some(f => /^PLAN.*\.md$/i.test(f));
1158
+ } catch (_e) {
1159
+ continue;
1160
+ }
1161
+
1162
+ if (!hasPlan) continue;
1163
+
1164
+ // Build expected branch name from template
1165
+ const phaseNum = dir.substring(0, 2);
1166
+ const slug = dir.substring(3); // everything after "NN-"
1167
+ const expectedBranch = template
1168
+ .replace('{phase}', phaseNum)
1169
+ .replace('{slug}', slug);
1170
+
1171
+ // Check if any branch matches (local or remote)
1172
+ const hasBranch = branches.some(b =>
1173
+ b === expectedBranch ||
1174
+ b.endsWith('/' + expectedBranch) ||
1175
+ b.includes(expectedBranch)
1176
+ );
1177
+
1178
+ if (!hasBranch) {
1179
+ evidence.push(`Phase "${dir}" missing expected branch "${expectedBranch}"`);
1180
+ }
1181
+ }
1182
+
1183
+ if (evidence.length === 0) {
1184
+ return result('WC-11', 'pass',
1185
+ `All active phases have corresponding git branches`);
1186
+ }
1187
+
1188
+ return result('WC-11', 'info',
1189
+ `${evidence.length} phase(s) missing expected git branches`,
1190
+ evidence
1191
+ );
1192
+ }
1193
+
1194
+ // ---------------------------------------------------------------------------
1195
+ // Exports
1196
+ // ---------------------------------------------------------------------------
1197
+
1198
+ module.exports = {
1199
+ checkCiVerifyAfterPush,
1200
+ checkStateFileIntegrity,
1201
+ checkStateFrontmatterIntegrity,
1202
+ checkRoadmapSyncValidation,
1203
+ checkPlanningArtifactCompleteness,
1204
+ checkArtifactFormatValidation,
1205
+ checkCompactionQuality,
1206
+ checkNamingConventionCompliance,
1207
+ checkCommitPatternValidation,
1208
+ checkModelSelectionCompliance,
1209
+ checkGitBranchingCompliance,
1210
+ checkTestHealthBaseline,
1211
+ };