@sienklogic/plan-build-run 2.11.0 → 2.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1222) hide show
  1. package/CHANGELOG.md +1102 -220
  2. package/CLAUDE.md +54 -34
  3. package/LICENSE +2 -1
  4. package/README.md +261 -182
  5. package/agents/pbr-audit.md +266 -0
  6. package/agents/pbr-codebase-mapper.md +236 -0
  7. package/agents/pbr-debugger.md +312 -0
  8. package/agents/pbr-dev-sync.md +220 -0
  9. package/agents/pbr-executor.md +591 -0
  10. package/agents/pbr-general.md +191 -0
  11. package/agents/pbr-integration-checker.md +237 -0
  12. package/agents/pbr-intel-updater.md +296 -0
  13. package/agents/pbr-nyquist-auditor.md +252 -0
  14. package/agents/pbr-plan-checker.md +312 -0
  15. package/agents/pbr-planner.md +539 -0
  16. package/agents/pbr-researcher.md +314 -0
  17. package/agents/pbr-roadmapper.md +346 -0
  18. package/agents/pbr-synthesizer.md +271 -0
  19. package/agents/pbr-ui-checker.md +202 -0
  20. package/agents/pbr-ui-researcher.md +223 -0
  21. package/agents/pbr-verifier.md +495 -0
  22. package/bin/install.js +2752 -0
  23. package/commands/pbr/add-phase.md +75 -0
  24. package/commands/pbr/add-todo.md +8 -0
  25. package/commands/pbr/audit-milestone.md +8 -0
  26. package/commands/pbr/audit.md +5 -0
  27. package/commands/pbr/autonomous.md +5 -0
  28. package/commands/pbr/begin.md +5 -0
  29. package/commands/pbr/build.md +5 -0
  30. package/commands/pbr/check-todos.md +8 -0
  31. package/commands/pbr/complete-milestone.md +8 -0
  32. package/commands/pbr/config.md +5 -0
  33. package/commands/pbr/continue.md +5 -0
  34. package/commands/pbr/dashboard.md +5 -0
  35. package/commands/pbr/debug.md +5 -0
  36. package/commands/pbr/discuss-phase.md +6 -0
  37. package/commands/pbr/discuss.md +5 -0
  38. package/commands/pbr/do.md +5 -0
  39. package/commands/pbr/execute-phase.md +6 -0
  40. package/commands/pbr/explore.md +5 -0
  41. package/commands/pbr/health.md +5 -0
  42. package/commands/pbr/help.md +5 -0
  43. package/commands/pbr/import.md +5 -0
  44. package/commands/pbr/insert-phase.md +65 -0
  45. package/commands/pbr/intel.md +5 -0
  46. package/commands/pbr/join-discord.md +11 -0
  47. package/commands/pbr/list-phase-assumptions.md +69 -0
  48. package/commands/pbr/map-codebase.md +6 -0
  49. package/commands/pbr/milestone.md +5 -0
  50. package/commands/pbr/new-milestone.md +8 -0
  51. package/commands/pbr/new-project.md +6 -0
  52. package/commands/pbr/note.md +5 -0
  53. package/commands/pbr/pause-work.md +5 -0
  54. package/commands/pbr/pause.md +5 -0
  55. package/commands/pbr/plan-milestone-gaps.md +7 -0
  56. package/commands/pbr/plan-phase.md +6 -0
  57. package/commands/pbr/plan.md +5 -0
  58. package/commands/pbr/profile-user.md +5 -0
  59. package/commands/pbr/profile.md +5 -0
  60. package/commands/pbr/progress.md +6 -0
  61. package/commands/pbr/quick.md +5 -0
  62. package/commands/pbr/reapply-patches.md +47 -0
  63. package/commands/pbr/release.md +6 -0
  64. package/commands/pbr/remove-phase.md +66 -0
  65. package/commands/pbr/research-phase.md +59 -0
  66. package/commands/pbr/resume-work.md +5 -0
  67. package/commands/pbr/resume.md +5 -0
  68. package/commands/pbr/review.md +5 -0
  69. package/commands/pbr/scan.md +5 -0
  70. package/commands/pbr/session-report.md +5 -0
  71. package/commands/pbr/set-profile.md +6 -0
  72. package/commands/pbr/settings.md +5 -0
  73. package/commands/pbr/setup.md +5 -0
  74. package/commands/pbr/ship.md +5 -0
  75. package/commands/pbr/status.md +5 -0
  76. package/commands/pbr/statusline.md +5 -0
  77. package/commands/pbr/test.md +5 -0
  78. package/commands/pbr/todo.md +5 -0
  79. package/commands/pbr/ui-phase.md +5 -0
  80. package/commands/pbr/ui-review.md +5 -0
  81. package/commands/pbr/undo.md +5 -0
  82. package/commands/pbr/update.md +37 -0
  83. package/commands/pbr/validate-phase.md +5 -0
  84. package/commands/pbr/verify-work.md +6 -0
  85. package/dashboard/bin/cli.cjs +96 -0
  86. package/dashboard/bin/stop.cjs +129 -0
  87. package/dashboard/eslint.config.js +37 -0
  88. package/dashboard/index.html +20 -0
  89. package/dashboard/package.json +28 -23
  90. package/dashboard/server/index.js +136 -0
  91. package/dashboard/server/lib/frontmatter.js +92 -0
  92. package/dashboard/server/middleware/static.js +35 -0
  93. package/dashboard/server/package.json +16 -0
  94. package/dashboard/server/routes/agents.js +213 -0
  95. package/dashboard/server/routes/config.js +64 -0
  96. package/dashboard/server/routes/health.js +95 -0
  97. package/dashboard/server/routes/memory.js +107 -0
  98. package/dashboard/server/routes/planning.js +234 -0
  99. package/dashboard/server/routes/progress.js +77 -0
  100. package/dashboard/server/routes/projects.js +36 -0
  101. package/dashboard/server/routes/requirements.js +40 -0
  102. package/dashboard/server/routes/roadmap.js +69 -0
  103. package/dashboard/server/routes/status.js +25 -0
  104. package/dashboard/server/routes/telemetry.js +171 -0
  105. package/dashboard/server/services/file-watcher.js +105 -0
  106. package/dashboard/server/services/planning-reader.js +741 -0
  107. package/dashboard/server/test/cli.test.js +34 -0
  108. package/dashboard/server/test/frontmatter.test.js +104 -0
  109. package/dashboard/server/test/isolation.test.js +32 -0
  110. package/dashboard/server/test/planning-reader.test.js +151 -0
  111. package/dashboard/server/test/routes.test.js +91 -0
  112. package/dashboard/server/test/ws.test.js +81 -0
  113. package/dashboard/server/ws.js +96 -0
  114. package/dashboard/src/App.jsx +154 -0
  115. package/dashboard/src/components/charts/BudgetBars.jsx +42 -0
  116. package/dashboard/src/components/charts/ContextRadar.jsx +34 -0
  117. package/dashboard/src/components/charts/PhaseDonut.jsx +66 -0
  118. package/dashboard/src/components/charts/SuccessTrend.jsx +45 -0
  119. package/dashboard/src/components/charts/TokenChart.jsx +55 -0
  120. package/dashboard/src/components/charts/index.js +5 -0
  121. package/dashboard/src/components/config/CfgSection.jsx +93 -0
  122. package/dashboard/src/components/layout/Header.jsx +89 -0
  123. package/dashboard/src/components/layout/ProjectSwitcher.jsx +160 -0
  124. package/dashboard/src/components/layout/Sidebar.jsx +161 -0
  125. package/dashboard/src/components/ui/AutoModeBanner.jsx +138 -0
  126. package/dashboard/src/components/ui/BackButton.jsx +27 -0
  127. package/dashboard/src/components/ui/Badge.jsx +27 -0
  128. package/dashboard/src/components/ui/Card.jsx +23 -0
  129. package/dashboard/src/components/ui/ChartTooltip.jsx +48 -0
  130. package/dashboard/src/components/ui/CheckpointBox.jsx +110 -0
  131. package/dashboard/src/components/ui/CodeBlock.jsx +27 -0
  132. package/dashboard/src/components/ui/ConfidenceBadge.jsx +20 -0
  133. package/dashboard/src/components/ui/ConfirmModal.jsx +161 -0
  134. package/dashboard/src/components/ui/ConnectionBanner.jsx +60 -0
  135. package/dashboard/src/components/ui/ErrorBoundary.jsx +106 -0
  136. package/dashboard/src/components/ui/ErrorBox.jsx +107 -0
  137. package/dashboard/src/components/ui/KeyValue.jsx +33 -0
  138. package/dashboard/src/components/ui/LoadingSkeleton.jsx +84 -0
  139. package/dashboard/src/components/ui/MetricCard.jsx +58 -0
  140. package/dashboard/src/components/ui/NextUpBlock.jsx +92 -0
  141. package/dashboard/src/components/ui/NumberInput.jsx +44 -0
  142. package/dashboard/src/components/ui/PBRBanner.jsx +47 -0
  143. package/dashboard/src/components/ui/PipelineView.jsx +130 -0
  144. package/dashboard/src/components/ui/ProgressBar.jsx +28 -0
  145. package/dashboard/src/components/ui/ProgressDisplay.jsx +47 -0
  146. package/dashboard/src/components/ui/QualityGateBadge.jsx +15 -0
  147. package/dashboard/src/components/ui/SectionTitle.jsx +35 -0
  148. package/dashboard/src/components/ui/SelectInput.jsx +45 -0
  149. package/dashboard/src/components/ui/StatusDot.jsx +51 -0
  150. package/dashboard/src/components/ui/StatusSymbol.jsx +49 -0
  151. package/dashboard/src/components/ui/TabBar.jsx +41 -0
  152. package/dashboard/src/components/ui/TextInput.jsx +42 -0
  153. package/dashboard/src/components/ui/Toast.jsx +117 -0
  154. package/dashboard/src/components/ui/Toggle.jsx +70 -0
  155. package/dashboard/src/components/ui/index.js +29 -0
  156. package/dashboard/src/hooks/useDocumentTitle.js +16 -0
  157. package/dashboard/src/hooks/useFetch.js +50 -0
  158. package/dashboard/src/hooks/useToast.jsx +43 -0
  159. package/dashboard/src/hooks/useWebSocket.js +103 -0
  160. package/dashboard/src/lib/api.js +112 -0
  161. package/dashboard/src/lib/configSchema.js +189 -0
  162. package/dashboard/src/lib/constants.js +18 -0
  163. package/dashboard/src/main.jsx +15 -0
  164. package/dashboard/src/pages/AgentsPage.jsx +191 -0
  165. package/dashboard/src/pages/ConfigPage.jsx +298 -0
  166. package/dashboard/src/pages/HooksPage.jsx +412 -0
  167. package/dashboard/src/pages/LiveFeed.jsx +274 -0
  168. package/dashboard/src/pages/MemoryPage.jsx +107 -0
  169. package/dashboard/src/pages/OnboardingPage.jsx +117 -0
  170. package/dashboard/src/pages/Overview.jsx +360 -0
  171. package/dashboard/src/pages/PhaseDetailView.jsx +216 -0
  172. package/dashboard/src/pages/PlanningPage.jsx +181 -0
  173. package/dashboard/src/pages/ProgressPage.jsx +249 -0
  174. package/dashboard/src/pages/RoadmapPage.jsx +251 -0
  175. package/dashboard/src/pages/Telemetry.jsx +113 -0
  176. package/dashboard/src/pages/planning/DecisionsTab.jsx +153 -0
  177. package/dashboard/src/pages/planning/FilesTab.jsx +420 -0
  178. package/dashboard/src/pages/planning/MilestoneDetail.jsx +319 -0
  179. package/dashboard/src/pages/planning/MilestonesTab.jsx +151 -0
  180. package/dashboard/src/pages/planning/NotesTab.jsx +251 -0
  181. package/dashboard/src/pages/planning/PhasesTab.jsx +218 -0
  182. package/dashboard/src/pages/planning/QuickTab.jsx +50 -0
  183. package/dashboard/src/pages/planning/ResearchTab.jsx +103 -0
  184. package/dashboard/src/pages/planning/TodosTab.jsx +297 -0
  185. package/dashboard/src/theme/ThemeProvider.jsx +38 -0
  186. package/dashboard/src/theme/tokens.js +17 -0
  187. package/dashboard/tests/components/ConfirmModal.test.jsx +179 -0
  188. package/dashboard/tests/components/ConnectionBanner.test.jsx +37 -0
  189. package/dashboard/tests/components/ErrorBoundary.test.jsx +59 -0
  190. package/dashboard/tests/components/LoadingSkeleton.test.jsx +46 -0
  191. package/dashboard/tests/components/ToastContainer.test.jsx +47 -0
  192. package/dashboard/tests/components/Toggle.test.jsx +61 -0
  193. package/dashboard/tests/hooks/useFetch.test.jsx +77 -0
  194. package/dashboard/tests/hooks/useToast.test.jsx +78 -0
  195. package/dashboard/tests/hooks/useWebSocket.test.jsx +128 -0
  196. package/dashboard/tests/pages/ConfigPage.test.jsx +199 -0
  197. package/dashboard/tests/pages/PlanningPage.test.jsx +119 -0
  198. package/dashboard/tests/pages/planning/FilesTab.test.jsx +198 -0
  199. package/dashboard/tests/pages/planning/NotesTab.test.jsx +178 -0
  200. package/dashboard/tests/pages/planning/TodosTab.test.jsx +188 -0
  201. package/dashboard/tests/performance.test.jsx +46 -0
  202. package/dashboard/tests/routes/config.test.js +98 -0
  203. package/dashboard/tests/routes/health.test.js +40 -0
  204. package/dashboard/tests/routes/planning.test.js +112 -0
  205. package/dashboard/tests/routes/roadmap.test.js +91 -0
  206. package/dashboard/tests/routes/status.test.js +131 -0
  207. package/dashboard/tests/server/planning-reader.test.js +153 -0
  208. package/dashboard/tests/setup.js +7 -0
  209. package/dashboard/vite.config.js +41 -0
  210. package/hooks/dist/auto-continue.js +277 -0
  211. package/hooks/dist/block-skill-self-read.js +80 -0
  212. package/hooks/dist/check-agent-state-write.js +63 -0
  213. package/hooks/dist/check-config-change.js +188 -0
  214. package/hooks/dist/check-dangerous-commands.js +185 -0
  215. package/hooks/dist/check-doc-sprawl.js +102 -0
  216. package/hooks/dist/check-phase-boundary.js +191 -0
  217. package/hooks/dist/check-plan-format.js +227 -0
  218. package/hooks/dist/check-roadmap-sync.js +503 -0
  219. package/hooks/dist/check-skill-workflow.js +354 -0
  220. package/hooks/dist/check-state-sync.js +637 -0
  221. package/hooks/dist/check-subagent-output.js +401 -0
  222. package/hooks/dist/check-summary-gate.js +199 -0
  223. package/hooks/dist/context-bridge.js +406 -0
  224. package/hooks/dist/context-budget-check.js +442 -0
  225. package/hooks/dist/context-quality.js +271 -0
  226. package/hooks/dist/enforce-pbr-workflow.js +277 -0
  227. package/hooks/dist/event-handler.js +203 -0
  228. package/hooks/dist/event-logger.js +125 -0
  229. package/hooks/dist/hook-logger.js +112 -0
  230. package/hooks/dist/hook-server-client.js +342 -0
  231. package/hooks/dist/hook-server.js +352 -0
  232. package/hooks/dist/hooks-schema.json +85 -0
  233. package/hooks/dist/hooks.json +309 -0
  234. package/hooks/dist/instructions-loaded.js +107 -0
  235. package/hooks/dist/intel-queue.js +152 -0
  236. package/hooks/dist/intercept-plan-mode.js +50 -0
  237. package/hooks/dist/log-notification.js +125 -0
  238. package/hooks/dist/log-subagent.js +306 -0
  239. package/hooks/dist/log-tool-failure.js +140 -0
  240. package/hooks/dist/milestone-learnings.js +569 -0
  241. package/hooks/dist/pbr-tools.js +5 -0
  242. package/hooks/dist/post-bash-triage.js +152 -0
  243. package/hooks/dist/post-compact.js +135 -0
  244. package/hooks/dist/post-write-dispatch.js +277 -0
  245. package/hooks/dist/post-write-quality.js +208 -0
  246. package/hooks/dist/pre-bash-dispatch.js +158 -0
  247. package/hooks/dist/pre-write-dispatch.js +165 -0
  248. package/hooks/dist/progress-tracker.js +198 -0
  249. package/hooks/dist/prompt-routing.js +209 -0
  250. package/hooks/dist/run-hook.js +144 -0
  251. package/hooks/dist/session-cleanup.js +617 -0
  252. package/hooks/dist/session-tracker.js +124 -0
  253. package/hooks/dist/status-line.js +793 -0
  254. package/hooks/dist/suggest-compact.js +296 -0
  255. package/hooks/dist/sync-context-to-claude.js +100 -0
  256. package/hooks/dist/task-completed.js +206 -0
  257. package/hooks/dist/track-context-budget.js +405 -0
  258. package/hooks/dist/trust-tracker.js +193 -0
  259. package/hooks/dist/validate-commit.js +270 -0
  260. package/hooks/dist/validate-skill-args.js +222 -0
  261. package/hooks/dist/validate-task.js +272 -0
  262. package/hooks/dist/worktree-create.js +144 -0
  263. package/hooks/dist/worktree-remove.js +147 -0
  264. package/package.json +59 -40
  265. package/plan-build-run/bin/config-schema.json +1416 -0
  266. package/plan-build-run/bin/dashboard-launch.cjs +114 -0
  267. package/plan-build-run/bin/event-logger.cjs +92 -0
  268. package/plan-build-run/bin/lib/alternatives.cjs +198 -0
  269. package/plan-build-run/bin/lib/auto-cleanup.cjs +7 -0
  270. package/plan-build-run/bin/lib/build.cjs +717 -0
  271. package/plan-build-run/bin/lib/circuit-state.cjs +133 -0
  272. package/plan-build-run/bin/lib/commands.cjs +482 -0
  273. package/plan-build-run/bin/lib/config.cjs +770 -0
  274. package/plan-build-run/bin/lib/context.cjs +216 -0
  275. package/plan-build-run/bin/lib/contextual-help.cjs +207 -0
  276. package/plan-build-run/bin/lib/core.cjs +1563 -0
  277. package/plan-build-run/bin/lib/decisions.cjs +194 -0
  278. package/plan-build-run/bin/lib/frontmatter.cjs +299 -0
  279. package/plan-build-run/bin/lib/gates/advisories.cjs +129 -0
  280. package/plan-build-run/bin/lib/gates/build-dependency.cjs +115 -0
  281. package/plan-build-run/bin/lib/gates/build-executor.cjs +104 -0
  282. package/plan-build-run/bin/lib/gates/doc-existence.cjs +46 -0
  283. package/plan-build-run/bin/lib/gates/helpers.cjs +93 -0
  284. package/plan-build-run/bin/lib/gates/inline-execution.cjs +185 -0
  285. package/plan-build-run/bin/lib/gates/milestone-complete.cjs +136 -0
  286. package/plan-build-run/bin/lib/gates/milestone-summary.cjs +119 -0
  287. package/plan-build-run/bin/lib/gates/plan-executor.cjs +36 -0
  288. package/plan-build-run/bin/lib/gates/quick-executor.cjs +76 -0
  289. package/plan-build-run/bin/lib/gates/review-planner.cjs +61 -0
  290. package/plan-build-run/bin/lib/gates/review-verifier.cjs +69 -0
  291. package/plan-build-run/bin/lib/graph-cli.cjs +89 -0
  292. package/plan-build-run/bin/lib/graph.cjs +554 -0
  293. package/plan-build-run/bin/lib/health-phase06.cjs +120 -0
  294. package/plan-build-run/bin/lib/health.cjs +133 -0
  295. package/plan-build-run/bin/lib/history.cjs +147 -0
  296. package/plan-build-run/bin/lib/hypothesis-runner.cjs +127 -0
  297. package/plan-build-run/bin/lib/impact-analysis.cjs +319 -0
  298. package/plan-build-run/bin/lib/incidents.cjs +190 -0
  299. package/plan-build-run/bin/lib/init.cjs +367 -0
  300. package/plan-build-run/bin/lib/intel.cjs +653 -0
  301. package/plan-build-run/bin/lib/learnings.cjs +511 -0
  302. package/plan-build-run/bin/lib/local-llm/health.cjs +12 -0
  303. package/plan-build-run/bin/lib/local-llm/index.cjs +89 -0
  304. package/plan-build-run/bin/lib/local-llm/metrics.cjs +20 -0
  305. package/plan-build-run/bin/lib/local-llm/operations/classify-artifact.cjs +4 -0
  306. package/plan-build-run/bin/lib/local-llm/operations/classify-commit.cjs +4 -0
  307. package/plan-build-run/bin/lib/local-llm/operations/classify-error.cjs +4 -0
  308. package/plan-build-run/bin/lib/local-llm/operations/classify-file-intent.cjs +4 -0
  309. package/plan-build-run/bin/lib/local-llm/operations/triage-test-output.cjs +12 -0
  310. package/plan-build-run/bin/lib/local-llm/operations/validate-task.cjs +4 -0
  311. package/plan-build-run/bin/lib/migrate.cjs +298 -0
  312. package/plan-build-run/bin/lib/milestone.cjs +306 -0
  313. package/plan-build-run/bin/lib/negative-knowledge.cjs +194 -0
  314. package/plan-build-run/bin/lib/onboarding-generator.cjs +288 -0
  315. package/plan-build-run/bin/lib/parse-args.cjs +134 -0
  316. package/plan-build-run/bin/lib/patterns.cjs +272 -0
  317. package/plan-build-run/bin/lib/phase.cjs +1021 -0
  318. package/plan-build-run/bin/lib/post-hoc.cjs +160 -0
  319. package/plan-build-run/bin/lib/preview.cjs +174 -0
  320. package/plan-build-run/bin/lib/progress-visualization.cjs +296 -0
  321. package/plan-build-run/bin/lib/quick-init.cjs +131 -0
  322. package/plan-build-run/bin/lib/reference.cjs +234 -0
  323. package/plan-build-run/bin/lib/requirements.cjs +153 -0
  324. package/plan-build-run/bin/lib/reverse-spec.cjs +259 -0
  325. package/plan-build-run/bin/lib/roadmap.cjs +1097 -0
  326. package/plan-build-run/bin/lib/security-scan.cjs +200 -0
  327. package/plan-build-run/bin/lib/skill-section.cjs +98 -0
  328. package/plan-build-run/bin/lib/spec-diff.cjs +209 -0
  329. package/plan-build-run/bin/lib/spec-engine.cjs +189 -0
  330. package/plan-build-run/bin/lib/spot-check.cjs +510 -0
  331. package/plan-build-run/bin/lib/state.cjs +1050 -0
  332. package/plan-build-run/bin/lib/status-render.cjs +527 -0
  333. package/plan-build-run/bin/lib/step-verify.cjs +149 -0
  334. package/plan-build-run/bin/lib/suggest-next.cjs +316 -0
  335. package/plan-build-run/bin/lib/team-composer.cjs +85 -0
  336. package/plan-build-run/bin/lib/team-coordinator.cjs +151 -0
  337. package/plan-build-run/bin/lib/template.cjs +222 -0
  338. package/plan-build-run/bin/lib/templates.cjs +362 -0
  339. package/plan-build-run/bin/lib/test-selection.cjs +163 -0
  340. package/plan-build-run/bin/lib/todo.cjs +300 -0
  341. package/plan-build-run/bin/lib/validation.cjs +187 -0
  342. package/plan-build-run/bin/lib/verify.cjs +1451 -0
  343. package/plan-build-run/bin/pbr-tools.cjs +1877 -0
  344. package/plan-build-run/references/CLAUDE.md +7 -0
  345. package/plan-build-run/references/agent-contracts.md +326 -0
  346. package/plan-build-run/references/agent-teams.md +54 -0
  347. package/plan-build-run/references/behavioral-contexts.md +53 -0
  348. package/plan-build-run/references/checkpoints.md +776 -0
  349. package/plan-build-run/references/config-reference.md +613 -0
  350. package/plan-build-run/references/continuation-format.md +249 -0
  351. package/plan-build-run/references/debugging/CLAUDE.md +7 -0
  352. package/plan-build-run/references/decimal-phase-calculation.md +65 -0
  353. package/plan-build-run/references/git-integration.md +309 -0
  354. package/plan-build-run/references/git-planning-commit.md +38 -0
  355. package/plan-build-run/references/model-profile-resolution.md +34 -0
  356. package/plan-build-run/references/model-profiles.md +182 -0
  357. package/plan-build-run/references/model-selection.md +53 -0
  358. package/plan-build-run/references/phase-argument-parsing.md +61 -0
  359. package/plan-build-run/references/plan-authoring.md +246 -0
  360. package/plan-build-run/references/plan-format.md +351 -0
  361. package/plan-build-run/references/planning-config.md +200 -0
  362. package/plan-build-run/references/questioning.md +162 -0
  363. package/plan-build-run/references/reading-verification.md +127 -0
  364. package/plan-build-run/references/stub-patterns.md +160 -0
  365. package/plan-build-run/references/tdd.md +263 -0
  366. package/plan-build-run/references/ui-brand.md +187 -0
  367. package/plan-build-run/references/verification-overrides.md +38 -0
  368. package/plan-build-run/references/verification-patterns.md +612 -0
  369. package/plan-build-run/references/wave-execution.md +52 -0
  370. package/plan-build-run/skills/audit/SKILL.md +347 -0
  371. package/plan-build-run/skills/autonomous/SKILL.md +460 -0
  372. package/plan-build-run/skills/begin/SKILL.md +926 -0
  373. package/plan-build-run/skills/begin/templates/PROJECT.md.tmpl +33 -0
  374. package/plan-build-run/skills/begin/templates/REQUIREMENTS.md.tmpl +18 -0
  375. package/plan-build-run/skills/begin/templates/STATE.md.tmpl +48 -0
  376. package/plan-build-run/skills/begin/templates/config.json.tmpl +451 -0
  377. package/plan-build-run/skills/begin/templates/project-CONTEXT.md.tmpl +19 -0
  378. package/plan-build-run/skills/begin/templates/researcher-prompt.md.tmpl +47 -0
  379. package/plan-build-run/skills/begin/templates/roadmap-prompt.md.tmpl +49 -0
  380. package/plan-build-run/skills/begin/templates/synthesis-prompt.md.tmpl +44 -0
  381. package/plan-build-run/skills/build/SKILL.md +1655 -0
  382. package/plan-build-run/skills/build/templates/continuation-prompt.md.tmpl +26 -0
  383. package/plan-build-run/skills/build/templates/executor-prompt.md.tmpl +70 -0
  384. package/plan-build-run/skills/build/templates/inline-verifier-prompt.md.tmpl +33 -0
  385. package/plan-build-run/skills/config/SKILL.md +357 -0
  386. package/plan-build-run/skills/continue/SKILL.md +266 -0
  387. package/plan-build-run/skills/dashboard/SKILL.md +12 -0
  388. package/plan-build-run/skills/debug/SKILL.md +573 -0
  389. package/plan-build-run/skills/debug/templates/continuation-prompt.md.tmpl +27 -0
  390. package/plan-build-run/skills/debug/templates/initial-investigation-prompt.md.tmpl +34 -0
  391. package/plan-build-run/skills/discuss/SKILL.md +489 -0
  392. package/plan-build-run/skills/discuss/templates/CONTEXT.md.tmpl +61 -0
  393. package/plan-build-run/skills/discuss/templates/decision-categories.md +9 -0
  394. package/plan-build-run/skills/discuss/templates/project-CONTEXT.md.tmpl +19 -0
  395. package/plan-build-run/skills/do/SKILL.md +165 -0
  396. package/plan-build-run/skills/explore/SKILL.md +449 -0
  397. package/plan-build-run/skills/health/SKILL.md +332 -0
  398. package/plan-build-run/skills/health/templates/check-pattern.md.tmpl +30 -0
  399. package/plan-build-run/skills/health/templates/output-format.md.tmpl +63 -0
  400. package/plan-build-run/skills/help/SKILL.md +236 -0
  401. package/plan-build-run/skills/import/SKILL.md +827 -0
  402. package/plan-build-run/skills/intel/SKILL.md +131 -0
  403. package/plan-build-run/skills/milestone/SKILL.md +825 -0
  404. package/plan-build-run/skills/milestone/templates/audit-output.md.tmpl +76 -0
  405. package/plan-build-run/skills/milestone/templates/complete-output.md.tmpl +32 -0
  406. package/plan-build-run/skills/milestone/templates/edge-cases.md +54 -0
  407. package/plan-build-run/skills/milestone/templates/gaps-output.md.tmpl +25 -0
  408. package/plan-build-run/skills/milestone/templates/integration-checker-prompt.md.tmpl +25 -0
  409. package/plan-build-run/skills/milestone/templates/new-output.md.tmpl +29 -0
  410. package/plan-build-run/skills/milestone/templates/stats-file.md.tmpl +30 -0
  411. package/plan-build-run/skills/note/SKILL.md +221 -0
  412. package/plan-build-run/skills/pause/SKILL.md +259 -0
  413. package/plan-build-run/skills/pause/templates/continue-here.md.tmpl +71 -0
  414. package/plan-build-run/skills/plan/SKILL.md +852 -0
  415. package/plan-build-run/skills/plan/decimal-phase-calc.md +98 -0
  416. package/plan-build-run/skills/plan/templates/checker-prompt.md.tmpl +21 -0
  417. package/plan-build-run/skills/plan/templates/completion-output.md.tmpl +27 -0
  418. package/plan-build-run/skills/plan/templates/gap-closure-prompt.md.tmpl +32 -0
  419. package/plan-build-run/skills/plan/templates/planner-prompt.md.tmpl +38 -0
  420. package/plan-build-run/skills/plan/templates/prompt-partials/phase-project-context.md.tmpl +21 -0
  421. package/plan-build-run/skills/plan/templates/researcher-prompt.md.tmpl +19 -0
  422. package/plan-build-run/skills/plan/templates/revision-prompt.md.tmpl +23 -0
  423. package/plan-build-run/skills/profile/SKILL.md +173 -0
  424. package/plan-build-run/skills/profile-user/SKILL.md +220 -0
  425. package/plan-build-run/skills/quick/SKILL.md +727 -0
  426. package/plan-build-run/skills/release/SKILL.md +206 -0
  427. package/plan-build-run/skills/resume/SKILL.md +499 -0
  428. package/plan-build-run/skills/review/SKILL.md +763 -0
  429. package/plan-build-run/skills/review/templates/debugger-prompt.md.tmpl +60 -0
  430. package/plan-build-run/skills/review/templates/gap-planner-prompt.md.tmpl +40 -0
  431. package/plan-build-run/skills/review/templates/verifier-prompt.md.tmpl +115 -0
  432. package/plan-build-run/skills/scan/SKILL.md +330 -0
  433. package/plan-build-run/skills/scan/templates/mapper-prompt.md.tmpl +201 -0
  434. package/plan-build-run/skills/session-report/SKILL.md +128 -0
  435. package/plan-build-run/skills/setup/SKILL.md +246 -0
  436. package/plan-build-run/skills/shared/agent-type-resolution.md +20 -0
  437. package/plan-build-run/skills/shared/commit-planning-docs.md +43 -0
  438. package/plan-build-run/skills/shared/config-loading.md +102 -0
  439. package/plan-build-run/skills/shared/context-budget.md +105 -0
  440. package/plan-build-run/skills/shared/context-loader-task.md +91 -0
  441. package/plan-build-run/skills/shared/digest-select.md +79 -0
  442. package/plan-build-run/skills/shared/domain-probes.md +125 -0
  443. package/plan-build-run/skills/shared/error-reporting.md +59 -0
  444. package/plan-build-run/skills/shared/gate-prompts.md +390 -0
  445. package/plan-build-run/skills/shared/phase-argument-parsing.md +45 -0
  446. package/plan-build-run/skills/shared/revision-loop.md +81 -0
  447. package/plan-build-run/skills/shared/state-update.md +154 -0
  448. package/plan-build-run/skills/shared/universal-anti-patterns.md +59 -0
  449. package/plan-build-run/skills/ship/SKILL.md +154 -0
  450. package/plan-build-run/skills/status/SKILL.md +520 -0
  451. package/plan-build-run/skills/statusline/SKILL.md +151 -0
  452. package/plan-build-run/skills/test/SKILL.md +254 -0
  453. package/plan-build-run/skills/todo/SKILL.md +285 -0
  454. package/plan-build-run/skills/ui-phase/SKILL.md +177 -0
  455. package/plan-build-run/skills/ui-review/SKILL.md +204 -0
  456. package/plan-build-run/skills/undo/SKILL.md +216 -0
  457. package/plan-build-run/skills/validate-phase/SKILL.md +358 -0
  458. package/plan-build-run/templates/CLAUDE.md +7 -0
  459. package/plan-build-run/templates/DEBUG.md +164 -0
  460. package/plan-build-run/templates/UAT.md +247 -0
  461. package/plan-build-run/templates/VALIDATION.md +76 -0
  462. package/plan-build-run/templates/codebase/architecture.md +255 -0
  463. package/plan-build-run/templates/codebase/concerns.md +310 -0
  464. package/plan-build-run/templates/codebase/conventions.md +307 -0
  465. package/plan-build-run/templates/codebase/integrations.md +280 -0
  466. package/plan-build-run/templates/codebase/stack.md +186 -0
  467. package/plan-build-run/templates/codebase/structure.md +285 -0
  468. package/plan-build-run/templates/codebase/testing.md +480 -0
  469. package/plan-build-run/templates/config.json +37 -0
  470. package/plan-build-run/templates/context.md +297 -0
  471. package/plan-build-run/templates/continue-here.md +78 -0
  472. package/plan-build-run/templates/crud-flow-verification.md +277 -0
  473. package/plan-build-run/templates/debug-subagent-prompt.md +91 -0
  474. package/plan-build-run/templates/deferred-items.md +19 -0
  475. package/plan-build-run/templates/discovery.md +146 -0
  476. package/plan-build-run/templates/milestone-archive.md +123 -0
  477. package/plan-build-run/templates/milestone.md +115 -0
  478. package/plan-build-run/templates/phase-prompt.md +569 -0
  479. package/plan-build-run/templates/planner-subagent-prompt.md +117 -0
  480. package/plan-build-run/templates/project.md +184 -0
  481. package/plan-build-run/templates/requirements.md +231 -0
  482. package/plan-build-run/templates/research-outputs/ARCHITECTURE.md.tmpl +86 -0
  483. package/plan-build-run/templates/research-outputs/FEATURES.md.tmpl +77 -0
  484. package/plan-build-run/templates/research-outputs/PITFALLS.md.tmpl +65 -0
  485. package/plan-build-run/templates/research-outputs/STACK.md.tmpl +80 -0
  486. package/plan-build-run/templates/research-project/ARCHITECTURE.md +204 -0
  487. package/plan-build-run/templates/research-project/FEATURES.md +147 -0
  488. package/plan-build-run/templates/research-project/PITFALLS.md +200 -0
  489. package/plan-build-run/templates/research-project/STACK.md +120 -0
  490. package/plan-build-run/templates/research-project/SUMMARY.md +170 -0
  491. package/plan-build-run/templates/research.md +552 -0
  492. package/plan-build-run/templates/retrospective.md +54 -0
  493. package/plan-build-run/templates/roadmap.md +202 -0
  494. package/plan-build-run/templates/seed.md +16 -0
  495. package/plan-build-run/templates/state.md +176 -0
  496. package/plan-build-run/templates/summary-complex.md +59 -0
  497. package/plan-build-run/templates/summary-minimal.md +41 -0
  498. package/plan-build-run/templates/summary-standard.md +48 -0
  499. package/plan-build-run/templates/summary.md +248 -0
  500. package/plan-build-run/templates/user-setup.md +311 -0
  501. package/plan-build-run/templates/verification-report.md +322 -0
  502. package/plan-build-run/workflows/add-phase.md +111 -0
  503. package/plan-build-run/workflows/add-todo.md +157 -0
  504. package/plan-build-run/workflows/audit-milestone.md +241 -0
  505. package/plan-build-run/workflows/check-todos.md +176 -0
  506. package/plan-build-run/workflows/complete-milestone.md +644 -0
  507. package/plan-build-run/workflows/diagnose-issues.md +219 -0
  508. package/plan-build-run/workflows/discovery-phase.md +289 -0
  509. package/plan-build-run/workflows/discuss-phase.md +429 -0
  510. package/plan-build-run/workflows/execute-phase.md +439 -0
  511. package/plan-build-run/workflows/execute-plan.md +437 -0
  512. package/plan-build-run/workflows/explore.md +150 -0
  513. package/plan-build-run/workflows/help.md +470 -0
  514. package/plan-build-run/workflows/insert-phase.md +129 -0
  515. package/plan-build-run/workflows/list-phase-assumptions.md +178 -0
  516. package/plan-build-run/workflows/map-codebase.md +327 -0
  517. package/plan-build-run/workflows/new-milestone.md +373 -0
  518. package/plan-build-run/workflows/new-project.md +1009 -0
  519. package/plan-build-run/workflows/note.md +90 -0
  520. package/plan-build-run/workflows/pause-work.md +122 -0
  521. package/plan-build-run/workflows/plan-milestone-gaps.md +256 -0
  522. package/plan-build-run/workflows/plan-phase.md +376 -0
  523. package/plan-build-run/workflows/progress.md +431 -0
  524. package/plan-build-run/workflows/quick.md +230 -0
  525. package/plan-build-run/workflows/remove-phase.md +154 -0
  526. package/plan-build-run/workflows/research-phase.md +74 -0
  527. package/plan-build-run/workflows/resume-project.md +306 -0
  528. package/plan-build-run/workflows/set-profile.md +80 -0
  529. package/plan-build-run/workflows/settings.md +145 -0
  530. package/plan-build-run/workflows/transition.md +539 -0
  531. package/plan-build-run/workflows/update.md +212 -0
  532. package/plan-build-run/workflows/verify-phase.md +226 -0
  533. package/plan-build-run/workflows/verify-work.md +465 -0
  534. package/plugins/pbr/.claude-plugin/plugin.json +1 -1
  535. package/plugins/pbr/CLAUDE.md +19 -0
  536. package/plugins/pbr/UI-CONSISTENCY-GAPS.md +1 -1
  537. package/plugins/pbr/agents/audit.md +285 -0
  538. package/plugins/pbr/agents/codebase-mapper.md +110 -18
  539. package/plugins/pbr/agents/debugger.md +231 -29
  540. package/plugins/pbr/agents/dev-sync.md +206 -0
  541. package/plugins/pbr/agents/executor.md +601 -39
  542. package/plugins/pbr/agents/general.md +71 -6
  543. package/plugins/pbr/agents/integration-checker.md +146 -30
  544. package/plugins/pbr/agents/intel-updater.md +333 -0
  545. package/plugins/pbr/agents/nyquist-auditor.md +253 -0
  546. package/plugins/pbr/agents/plan-checker.md +177 -60
  547. package/plugins/pbr/agents/planner.md +404 -42
  548. package/plugins/pbr/agents/researcher.md +239 -36
  549. package/plugins/pbr/agents/roadmapper.md +384 -0
  550. package/plugins/pbr/agents/synthesizer.md +169 -26
  551. package/plugins/pbr/agents/ui-checker.md +203 -0
  552. package/plugins/pbr/agents/ui-researcher.md +224 -0
  553. package/plugins/pbr/agents/verifier.md +452 -48
  554. package/plugins/pbr/commands/add-phase.md +75 -0
  555. package/plugins/pbr/commands/add-todo.md +8 -0
  556. package/plugins/pbr/commands/audit-milestone.md +8 -0
  557. package/plugins/pbr/commands/audit.md +5 -0
  558. package/plugins/pbr/commands/autonomous.md +5 -0
  559. package/plugins/pbr/commands/begin.md +1 -1
  560. package/plugins/pbr/commands/build.md +1 -1
  561. package/plugins/pbr/commands/check-todos.md +8 -0
  562. package/plugins/pbr/commands/complete-milestone.md +8 -0
  563. package/plugins/pbr/commands/config.md +2 -2
  564. package/plugins/pbr/commands/continue.md +1 -1
  565. package/plugins/pbr/commands/dashboard.md +1 -1
  566. package/plugins/pbr/commands/debug.md +1 -1
  567. package/plugins/pbr/commands/discuss-phase.md +6 -0
  568. package/plugins/pbr/commands/discuss.md +1 -1
  569. package/plugins/pbr/commands/do.md +5 -0
  570. package/plugins/pbr/commands/execute-phase.md +6 -0
  571. package/plugins/pbr/commands/explore.md +1 -1
  572. package/plugins/pbr/commands/health.md +1 -1
  573. package/plugins/pbr/commands/help.md +1 -1
  574. package/plugins/pbr/commands/import.md +2 -2
  575. package/plugins/pbr/commands/insert-phase.md +65 -0
  576. package/plugins/pbr/commands/intel.md +5 -0
  577. package/plugins/pbr/commands/join-discord.md +11 -0
  578. package/plugins/pbr/commands/list-phase-assumptions.md +69 -0
  579. package/plugins/pbr/commands/map-codebase.md +6 -0
  580. package/plugins/pbr/commands/milestone.md +1 -1
  581. package/plugins/pbr/commands/new-milestone.md +8 -0
  582. package/plugins/pbr/commands/new-project.md +6 -0
  583. package/plugins/pbr/commands/note.md +1 -1
  584. package/plugins/pbr/commands/pause-work.md +5 -0
  585. package/plugins/pbr/commands/pause.md +1 -1
  586. package/plugins/pbr/commands/plan-milestone-gaps.md +7 -0
  587. package/plugins/pbr/commands/plan-phase.md +6 -0
  588. package/plugins/pbr/commands/plan.md +1 -1
  589. package/plugins/pbr/commands/profile-user.md +5 -0
  590. package/plugins/pbr/commands/profile.md +5 -0
  591. package/plugins/pbr/commands/progress.md +6 -0
  592. package/plugins/pbr/commands/quick.md +2 -2
  593. package/plugins/pbr/commands/reapply-patches.md +47 -0
  594. package/plugins/pbr/commands/release.md +6 -0
  595. package/plugins/pbr/commands/remove-phase.md +66 -0
  596. package/plugins/pbr/commands/research-phase.md +59 -0
  597. package/plugins/pbr/commands/resume-work.md +5 -0
  598. package/plugins/pbr/commands/resume.md +1 -1
  599. package/plugins/pbr/commands/review.md +1 -1
  600. package/plugins/pbr/commands/scan.md +1 -1
  601. package/plugins/pbr/commands/session-report.md +5 -0
  602. package/plugins/pbr/commands/set-profile.md +6 -0
  603. package/plugins/pbr/commands/settings.md +5 -0
  604. package/plugins/pbr/commands/setup.md +2 -2
  605. package/plugins/pbr/commands/ship.md +5 -0
  606. package/plugins/pbr/commands/status.md +1 -1
  607. package/plugins/pbr/commands/statusline.md +1 -1
  608. package/plugins/pbr/commands/test.md +5 -0
  609. package/plugins/pbr/commands/todo.md +2 -2
  610. package/plugins/pbr/commands/ui-phase.md +5 -0
  611. package/plugins/pbr/commands/ui-review.md +5 -0
  612. package/plugins/pbr/commands/undo.md +5 -0
  613. package/plugins/pbr/commands/update.md +37 -0
  614. package/plugins/pbr/commands/validate-phase.md +5 -0
  615. package/plugins/pbr/commands/verify-work.md +6 -0
  616. package/plugins/pbr/dashboard/package-lock.json +6 -0
  617. package/plugins/pbr/hooks/hooks.json +102 -13
  618. package/plugins/pbr/references/agent-contracts.md +37 -8
  619. package/plugins/pbr/references/agent-teams.md +3 -3
  620. package/plugins/pbr/references/archive/checkpoints.md +189 -0
  621. package/plugins/pbr/references/archive/context-quality-tiers.md +45 -0
  622. package/plugins/pbr/references/archive/pbr-rules.md +194 -0
  623. package/plugins/pbr/references/archive/verification-patterns.md +277 -0
  624. package/plugins/pbr/references/config-reference.md +182 -10
  625. package/plugins/pbr/references/continuation-format.md +1 -0
  626. package/plugins/pbr/references/deviation-rules.md +12 -0
  627. package/plugins/pbr/references/git-integration.md +110 -27
  628. package/plugins/pbr/references/hook-ordering.md +89 -0
  629. package/plugins/pbr/references/limitations.md +106 -0
  630. package/plugins/pbr/references/model-profiles.md +90 -7
  631. package/plugins/pbr/references/model-selection.md +1 -1
  632. package/plugins/pbr/references/node-repair.md +48 -0
  633. package/plugins/pbr/references/pbr-tools-cli.md +132 -2
  634. package/plugins/pbr/references/plan-authoring.md +65 -0
  635. package/plugins/pbr/references/plan-format.md +161 -10
  636. package/plugins/pbr/references/pretooluse-jsonl-behavior.md +58 -0
  637. package/plugins/pbr/references/questioning.md +138 -49
  638. package/plugins/pbr/references/reading-verification.md +4 -4
  639. package/plugins/pbr/references/signal-files.md +41 -0
  640. package/plugins/pbr/references/tmux-setup.md +288 -0
  641. package/plugins/pbr/references/ui-brand.md +449 -0
  642. package/plugins/pbr/references/worktree-sparse-checkout.md +86 -0
  643. package/plugins/pbr/scripts/architecture-guard.js +257 -0
  644. package/plugins/pbr/scripts/audit-checks/behavioral-compliance.js +2098 -0
  645. package/plugins/pbr/scripts/audit-checks/error-analysis.js +895 -0
  646. package/plugins/pbr/scripts/audit-checks/feature-verification.js +723 -0
  647. package/plugins/pbr/scripts/audit-checks/index.js +433 -0
  648. package/plugins/pbr/scripts/audit-checks/infrastructure.js +816 -0
  649. package/plugins/pbr/scripts/audit-checks/quality-metrics.js +452 -0
  650. package/plugins/pbr/scripts/audit-checks/session-quality.js +980 -0
  651. package/plugins/pbr/scripts/audit-checks/si-agent-hook-config-checks.js +467 -0
  652. package/plugins/pbr/scripts/audit-checks/si-cross-cutting-checks.js +272 -0
  653. package/plugins/pbr/scripts/audit-checks/si-skill-checks.js +424 -0
  654. package/plugins/pbr/scripts/audit-checks/workflow-compliance.js +1210 -0
  655. package/plugins/pbr/scripts/audit-dimensions.js +552 -0
  656. package/plugins/pbr/scripts/auto-continue.js +211 -32
  657. package/plugins/pbr/scripts/block-skill-self-read.js +85 -0
  658. package/plugins/pbr/scripts/check-agent-state-write.js +74 -0
  659. package/plugins/pbr/scripts/check-config-change.js +188 -0
  660. package/plugins/pbr/scripts/check-cross-plugin-sync.js +93 -0
  661. package/plugins/pbr/scripts/check-dangerous-commands.js +9 -5
  662. package/plugins/pbr/scripts/check-direct-state-write.js +37 -0
  663. package/plugins/pbr/scripts/check-phase-boundary.js +2 -8
  664. package/plugins/pbr/scripts/check-plan-format.js +149 -274
  665. package/plugins/pbr/scripts/check-roadmap-sync.js +175 -10
  666. package/plugins/pbr/scripts/check-skill-workflow.js +38 -34
  667. package/plugins/pbr/scripts/check-state-sync.js +344 -216
  668. package/plugins/pbr/scripts/check-subagent-output.js +297 -256
  669. package/plugins/pbr/scripts/check-summary-gate.js +1 -1
  670. package/plugins/pbr/scripts/config-schema.json +1252 -95
  671. package/plugins/pbr/scripts/context-bridge.js +439 -0
  672. package/plugins/pbr/scripts/context-budget-check.js +89 -9
  673. package/plugins/pbr/scripts/context-quality.js +272 -0
  674. package/plugins/pbr/scripts/enforce-pbr-workflow.js +277 -0
  675. package/plugins/pbr/scripts/event-handler.js +129 -77
  676. package/plugins/pbr/scripts/event-logger.js +61 -26
  677. package/plugins/pbr/scripts/feedback-loop.js +172 -0
  678. package/plugins/pbr/scripts/graph-update.js +199 -0
  679. package/plugins/pbr/scripts/hook-logger.js +76 -35
  680. package/plugins/pbr/scripts/hook-server-client.js +258 -0
  681. package/plugins/pbr/scripts/hook-server.js +334 -0
  682. package/plugins/pbr/scripts/hooks-schema.json +5 -1
  683. package/plugins/pbr/scripts/instructions-loaded.js +107 -0
  684. package/plugins/pbr/scripts/intel-queue.js +152 -0
  685. package/plugins/pbr/scripts/intent-router.cjs +147 -0
  686. package/plugins/pbr/scripts/intercept-plan-mode.js +52 -0
  687. package/plugins/pbr/scripts/lib/alternatives.js +203 -0
  688. package/plugins/pbr/scripts/lib/auto-cleanup.js +221 -0
  689. package/plugins/pbr/scripts/lib/auto-verify.js +103 -0
  690. package/plugins/pbr/scripts/lib/autonomy.js +91 -0
  691. package/plugins/pbr/scripts/lib/build.js +719 -0
  692. package/plugins/pbr/scripts/lib/ci-fix-loop.js +228 -0
  693. package/plugins/pbr/scripts/lib/circuit-state.js +133 -0
  694. package/plugins/pbr/scripts/lib/config.js +901 -0
  695. package/plugins/pbr/scripts/lib/context.js +254 -0
  696. package/plugins/pbr/scripts/lib/convention-detector.js +413 -0
  697. package/plugins/pbr/scripts/lib/core.js +939 -0
  698. package/plugins/pbr/scripts/lib/dashboard-launch.js +170 -0
  699. package/plugins/pbr/scripts/lib/decision-extraction.js +267 -0
  700. package/plugins/pbr/scripts/lib/dependency-break.js +147 -0
  701. package/plugins/pbr/scripts/lib/format-validators.js +947 -0
  702. package/plugins/pbr/scripts/lib/gates/advisories.js +129 -0
  703. package/plugins/pbr/scripts/lib/gates/build-dependency.js +115 -0
  704. package/plugins/pbr/scripts/lib/gates/build-executor.js +104 -0
  705. package/plugins/pbr/scripts/lib/gates/doc-existence.js +46 -0
  706. package/plugins/pbr/scripts/lib/gates/helpers.js +141 -0
  707. package/plugins/pbr/scripts/lib/gates/inline-execution.js +185 -0
  708. package/plugins/pbr/scripts/lib/gates/milestone-complete.js +136 -0
  709. package/plugins/pbr/scripts/lib/gates/milestone-summary.js +119 -0
  710. package/plugins/pbr/scripts/lib/gates/multi-phase-loader.js +147 -0
  711. package/plugins/pbr/scripts/lib/gates/plan-executor.js +36 -0
  712. package/plugins/pbr/scripts/lib/gates/quick-executor.js +76 -0
  713. package/plugins/pbr/scripts/lib/gates/review-planner.js +61 -0
  714. package/plugins/pbr/scripts/lib/gates/review-verifier.js +69 -0
  715. package/plugins/pbr/scripts/lib/gates/rich-agent-context.js +143 -0
  716. package/plugins/pbr/scripts/lib/health-checks.js +215 -0
  717. package/plugins/pbr/scripts/lib/history.js +150 -0
  718. package/plugins/pbr/scripts/lib/init.js +302 -0
  719. package/plugins/pbr/scripts/lib/learnings.js +432 -0
  720. package/plugins/pbr/scripts/lib/migrate.js +169 -0
  721. package/plugins/pbr/scripts/lib/parse-args.js +134 -0
  722. package/plugins/pbr/scripts/lib/pattern-routing.js +55 -0
  723. package/plugins/pbr/scripts/lib/phase.js +935 -0
  724. package/plugins/pbr/scripts/lib/pre-research.js +133 -0
  725. package/plugins/pbr/scripts/lib/preview.js +174 -0
  726. package/plugins/pbr/scripts/lib/quick-init.js +131 -0
  727. package/plugins/pbr/scripts/lib/reference.js +236 -0
  728. package/plugins/pbr/scripts/lib/resolve-root.js +66 -0
  729. package/plugins/pbr/scripts/lib/roadmap.js +784 -0
  730. package/plugins/pbr/scripts/lib/session-briefing.js +879 -0
  731. package/plugins/pbr/scripts/lib/skill-section.js +99 -0
  732. package/plugins/pbr/scripts/lib/smart-next-task.js +225 -0
  733. package/plugins/pbr/scripts/lib/snapshot-manager.js +225 -0
  734. package/plugins/pbr/scripts/lib/spot-check.js +509 -0
  735. package/plugins/pbr/scripts/lib/state.js +565 -0
  736. package/plugins/pbr/scripts/lib/status-render.js +511 -0
  737. package/plugins/pbr/scripts/lib/step-verify.js +149 -0
  738. package/plugins/pbr/scripts/lib/subagent-validators.js +1010 -0
  739. package/plugins/pbr/scripts/lib/suggest-next.js +316 -0
  740. package/plugins/pbr/scripts/lib/tech-debt-scanner.js +116 -0
  741. package/plugins/pbr/scripts/lib/test-cache.js +54 -0
  742. package/plugins/pbr/scripts/lib/todo.js +300 -0
  743. package/plugins/pbr/scripts/lib/trust-gate.js +84 -0
  744. package/plugins/pbr/scripts/local-llm/client.js +237 -0
  745. package/plugins/pbr/scripts/local-llm/health.js +220 -0
  746. package/plugins/pbr/scripts/local-llm/metrics.js +340 -0
  747. package/plugins/pbr/scripts/local-llm/operations/classify-artifact.js +76 -0
  748. package/plugins/pbr/scripts/local-llm/operations/classify-commit.js +137 -0
  749. package/plugins/pbr/scripts/local-llm/operations/classify-error.js +75 -0
  750. package/plugins/pbr/scripts/local-llm/operations/classify-file-intent.js +171 -0
  751. package/plugins/pbr/scripts/local-llm/operations/score-source.js +72 -0
  752. package/plugins/pbr/scripts/local-llm/operations/summarize-context.js +62 -0
  753. package/plugins/pbr/scripts/local-llm/operations/triage-test-output.js +72 -0
  754. package/plugins/pbr/scripts/local-llm/operations/validate-task.js +59 -0
  755. package/plugins/pbr/scripts/local-llm/router.js +101 -0
  756. package/plugins/pbr/scripts/local-llm/shadow.js +60 -0
  757. package/plugins/pbr/scripts/local-llm/threshold-tuner.js +118 -0
  758. package/plugins/pbr/scripts/log-subagent.js +129 -26
  759. package/plugins/pbr/scripts/log-tool-failure.js +58 -5
  760. package/plugins/pbr/scripts/milestone-learnings.js +569 -0
  761. package/plugins/pbr/scripts/package.json +1 -0
  762. package/plugins/pbr/scripts/pbr-tools.js +1361 -1214
  763. package/plugins/pbr/scripts/post-bash-triage.js +163 -0
  764. package/plugins/pbr/scripts/post-compact.js +135 -0
  765. package/plugins/pbr/scripts/post-hoc.js +286 -0
  766. package/plugins/pbr/scripts/post-write-dispatch.js +315 -30
  767. package/plugins/pbr/scripts/post-write-quality.js +3 -3
  768. package/plugins/pbr/scripts/pre-bash-dispatch.js +81 -4
  769. package/plugins/pbr/scripts/pre-write-dispatch.js +76 -20
  770. package/plugins/pbr/scripts/progress-tracker.js +145 -277
  771. package/plugins/pbr/scripts/quick-status.js +179 -0
  772. package/plugins/pbr/scripts/record-incident.js +37 -0
  773. package/plugins/pbr/scripts/risk-classifier.cjs +123 -0
  774. package/plugins/pbr/scripts/run-hook.js +49 -8
  775. package/plugins/pbr/scripts/session-cleanup.js +379 -7
  776. package/plugins/pbr/scripts/session-tracker.js +124 -0
  777. package/plugins/pbr/scripts/status-line.js +540 -27
  778. package/plugins/pbr/scripts/suggest-compact.js +183 -7
  779. package/plugins/pbr/scripts/sync-context-to-claude.js +100 -0
  780. package/plugins/pbr/scripts/task-completed.js +125 -3
  781. package/plugins/pbr/scripts/test/config.test.js +126 -0
  782. package/plugins/pbr/scripts/test/cross-platform.test.js +131 -0
  783. package/plugins/pbr/scripts/test/fixtures/config.json +20 -0
  784. package/plugins/pbr/scripts/test/fixtures/plan.md +54 -0
  785. package/plugins/pbr/scripts/test/fixtures/project.md +30 -0
  786. package/plugins/pbr/scripts/test/fixtures/roadmap.md +55 -0
  787. package/plugins/pbr/scripts/test/fixtures/state.md +60 -0
  788. package/plugins/pbr/scripts/test/fixtures/summary.md +35 -0
  789. package/plugins/pbr/scripts/test/fixtures.test.js +184 -0
  790. package/plugins/pbr/scripts/test/phase.test.js +142 -0
  791. package/plugins/pbr/scripts/test/roadmap.test.js +96 -0
  792. package/plugins/pbr/scripts/test/state.test.js +163 -0
  793. package/plugins/pbr/scripts/track-context-budget.js +323 -88
  794. package/plugins/pbr/scripts/trust-tracker.js +193 -0
  795. package/plugins/pbr/scripts/validate-commit.js +76 -11
  796. package/plugins/pbr/scripts/validate-skill-args.js +18 -14
  797. package/plugins/pbr/scripts/validate-task.js +93 -614
  798. package/plugins/pbr/scripts/worktree-create.js +144 -0
  799. package/plugins/pbr/scripts/worktree-remove.js +147 -0
  800. package/plugins/pbr/skills/audit/SKILL.md +478 -0
  801. package/plugins/pbr/skills/autonomous/SKILL.md +460 -0
  802. package/plugins/pbr/skills/begin/SKILL.md +447 -142
  803. package/plugins/pbr/skills/begin/templates/STATE.md.tmpl +1 -2
  804. package/plugins/pbr/skills/begin/templates/config.json.tmpl +423 -36
  805. package/plugins/pbr/skills/begin/templates/researcher-prompt.md.tmpl +28 -0
  806. package/plugins/pbr/skills/begin/templates/roadmap-prompt.md.tmpl +26 -3
  807. package/plugins/pbr/skills/begin/templates/synthesis-prompt.md.tmpl +33 -5
  808. package/plugins/pbr/skills/build/SKILL.md +1010 -327
  809. package/plugins/pbr/skills/build/templates/continuation-prompt.md.tmpl +26 -0
  810. package/plugins/pbr/skills/build/templates/executor-prompt.md.tmpl +77 -0
  811. package/plugins/pbr/skills/build/templates/inline-verifier-prompt.md.tmpl +33 -0
  812. package/plugins/pbr/skills/config/SKILL.md +108 -9
  813. package/plugins/pbr/skills/continue/SKILL.md +118 -19
  814. package/plugins/pbr/skills/dashboard/SKILL.md +21 -9
  815. package/plugins/pbr/skills/debug/SKILL.md +62 -10
  816. package/plugins/pbr/skills/debug/templates/continuation-prompt.md.tmpl +12 -1
  817. package/plugins/pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +12 -5
  818. package/plugins/pbr/skills/discuss/SKILL.md +155 -23
  819. package/plugins/pbr/skills/discuss/templates/CONTEXT.md.tmpl +21 -1
  820. package/plugins/pbr/skills/do/SKILL.md +119 -24
  821. package/plugins/pbr/skills/explore/SKILL.md +83 -16
  822. package/plugins/pbr/skills/health/SKILL.md +74 -17
  823. package/plugins/pbr/skills/help/SKILL.md +123 -39
  824. package/plugins/pbr/skills/import/SKILL.md +327 -13
  825. package/plugins/pbr/skills/intel/SKILL.md +131 -0
  826. package/plugins/pbr/skills/milestone/SKILL.md +342 -260
  827. package/plugins/pbr/skills/milestone/templates/audit-output.md.tmpl +76 -0
  828. package/plugins/pbr/skills/milestone/templates/complete-output.md.tmpl +32 -0
  829. package/plugins/pbr/skills/milestone/templates/edge-cases.md +54 -0
  830. package/plugins/pbr/skills/milestone/templates/gaps-output.md.tmpl +25 -0
  831. package/plugins/pbr/skills/milestone/templates/integration-checker-prompt.md.tmpl +25 -0
  832. package/plugins/pbr/skills/milestone/templates/new-output.md.tmpl +29 -0
  833. package/plugins/pbr/skills/note/SKILL.md +10 -2
  834. package/plugins/pbr/skills/pause/SKILL.md +51 -7
  835. package/plugins/pbr/skills/pause/templates/continue-here.md.tmpl +33 -52
  836. package/plugins/pbr/skills/plan/SKILL.md +418 -268
  837. package/plugins/pbr/skills/plan/templates/checker-prompt.md.tmpl +5 -2
  838. package/plugins/pbr/skills/plan/templates/completion-output.md.tmpl +27 -0
  839. package/plugins/pbr/skills/plan/templates/revision-prompt.md.tmpl +21 -5
  840. package/plugins/pbr/skills/profile/SKILL.md +183 -0
  841. package/plugins/pbr/skills/profile-user/SKILL.md +224 -0
  842. package/plugins/pbr/skills/quick/SKILL.md +440 -95
  843. package/plugins/pbr/skills/release/SKILL.md +206 -0
  844. package/plugins/pbr/skills/resume/SKILL.md +122 -27
  845. package/plugins/pbr/skills/review/SKILL.md +219 -154
  846. package/plugins/pbr/skills/review/templates/verifier-prompt.md.tmpl +7 -0
  847. package/plugins/pbr/skills/scan/SKILL.md +36 -12
  848. package/plugins/pbr/skills/scan/templates/mapper-prompt.md.tmpl +1 -1
  849. package/plugins/pbr/skills/session-report/SKILL.md +128 -0
  850. package/plugins/pbr/skills/setup/SKILL.md +149 -202
  851. package/plugins/pbr/skills/shared/agent-context-enrichment.md +21 -0
  852. package/plugins/pbr/skills/shared/agent-type-resolution.md +20 -0
  853. package/plugins/pbr/skills/shared/commit-planning-docs.md +8 -0
  854. package/plugins/pbr/skills/shared/context-budget.md +66 -1
  855. package/plugins/pbr/skills/shared/context-loader-task.md +15 -8
  856. package/plugins/pbr/skills/shared/digest-select.md +2 -2
  857. package/plugins/pbr/skills/shared/domain-probes.md +1 -1
  858. package/plugins/pbr/skills/shared/error-reporting.md +38 -60
  859. package/plugins/pbr/skills/shared/gate-prompts.md +4 -2
  860. package/plugins/pbr/skills/shared/memory-capture.md +48 -0
  861. package/plugins/pbr/skills/shared/phase-argument-parsing.md +4 -4
  862. package/plugins/pbr/skills/shared/revision-loop.md +24 -6
  863. package/plugins/pbr/skills/shared/state-update.md +47 -54
  864. package/plugins/pbr/skills/shared/universal-anti-patterns.md +27 -4
  865. package/plugins/pbr/skills/ship/SKILL.md +154 -0
  866. package/plugins/pbr/skills/status/SKILL.md +201 -53
  867. package/plugins/pbr/skills/test/SKILL.md +254 -0
  868. package/plugins/pbr/skills/todo/SKILL.md +13 -11
  869. package/plugins/pbr/skills/ui-phase/SKILL.md +179 -0
  870. package/plugins/pbr/skills/ui-review/SKILL.md +206 -0
  871. package/plugins/pbr/skills/undo/SKILL.md +218 -0
  872. package/plugins/pbr/skills/validate-phase/SKILL.md +358 -0
  873. package/plugins/pbr/templates/CONTEXT.md.tmpl +45 -20
  874. package/plugins/pbr/templates/DISCOVERY.md.tmpl +29 -0
  875. package/plugins/pbr/templates/HANDOFF.json.tmpl +30 -0
  876. package/plugins/pbr/templates/INTEGRATION-REPORT.md.tmpl +18 -2
  877. package/plugins/pbr/templates/KNOWLEDGE.md.tmpl +39 -0
  878. package/plugins/pbr/templates/MILESTONE-AUDIT.md.tmpl +44 -0
  879. package/plugins/pbr/templates/PROJECT.md.tmpl +126 -0
  880. package/plugins/pbr/templates/REQUIREMENTS.md.tmpl +96 -0
  881. package/plugins/pbr/templates/RETROSPECTIVE.md.tmpl +43 -0
  882. package/plugins/pbr/templates/ROADMAP.md.tmpl +108 -14
  883. package/plugins/pbr/templates/SUMMARY-complex.md.tmpl +133 -0
  884. package/plugins/pbr/templates/SUMMARY-minimal.md.tmpl +55 -0
  885. package/plugins/pbr/templates/SUMMARY.md.tmpl +21 -0
  886. package/plugins/pbr/templates/VERIFICATION-DETAIL.md.tmpl +49 -13
  887. package/plugins/pbr/templates/project-CONTEXT.md.tmpl +59 -0
  888. package/plugins/pbr/templates/research-outputs/ARCHITECTURE.md.tmpl +91 -0
  889. package/plugins/pbr/templates/research-outputs/FEATURES.md.tmpl +64 -0
  890. package/plugins/pbr/templates/research-outputs/PITFALLS.md.tmpl +50 -0
  891. package/plugins/pbr/templates/research-outputs/STACK.md.tmpl +63 -0
  892. package/plugins/pbr/templates/research-outputs/SUMMARY.md.tmpl +98 -0
  893. package/scripts/build-hooks.js +61 -0
  894. package/scripts/check-ci.js +100 -0
  895. package/scripts/clean-changelog.js +362 -0
  896. package/scripts/generate-derivatives.js +581 -0
  897. package/scripts/posttest.js +93 -0
  898. package/scripts/release.js +196 -0
  899. package/scripts/run-tests.cjs +29 -0
  900. package/dashboard/bin/cli.js +0 -25
  901. package/dashboard/public/css/layout.css +0 -472
  902. package/dashboard/public/css/status-colors.css +0 -98
  903. package/dashboard/public/js/htmx-title.js +0 -5
  904. package/dashboard/public/js/sidebar-toggle.js +0 -20
  905. package/dashboard/src/app.js +0 -78
  906. package/dashboard/src/middleware/errorHandler.js +0 -52
  907. package/dashboard/src/middleware/notFoundHandler.js +0 -9
  908. package/dashboard/src/repositories/planning.repository.js +0 -130
  909. package/dashboard/src/routes/events.routes.js +0 -40
  910. package/dashboard/src/routes/index.routes.js +0 -31
  911. package/dashboard/src/routes/pages.routes.js +0 -308
  912. package/dashboard/src/server.js +0 -42
  913. package/dashboard/src/services/dashboard.service.js +0 -309
  914. package/dashboard/src/services/milestone.service.js +0 -154
  915. package/dashboard/src/services/phase.service.js +0 -226
  916. package/dashboard/src/services/project.service.js +0 -57
  917. package/dashboard/src/services/roadmap.service.js +0 -171
  918. package/dashboard/src/services/sse.service.js +0 -58
  919. package/dashboard/src/services/todo.service.js +0 -254
  920. package/dashboard/src/services/watcher.service.js +0 -48
  921. package/dashboard/src/views/coming-soon.ejs +0 -11
  922. package/dashboard/src/views/error.ejs +0 -13
  923. package/dashboard/src/views/index.ejs +0 -5
  924. package/dashboard/src/views/layout.ejs +0 -1
  925. package/dashboard/src/views/milestone-detail.ejs +0 -5
  926. package/dashboard/src/views/milestones.ejs +0 -5
  927. package/dashboard/src/views/partials/dashboard-content.ejs +0 -77
  928. package/dashboard/src/views/partials/footer.ejs +0 -3
  929. package/dashboard/src/views/partials/head.ejs +0 -27
  930. package/dashboard/src/views/partials/header.ejs +0 -12
  931. package/dashboard/src/views/partials/layout-bottom.ejs +0 -15
  932. package/dashboard/src/views/partials/layout-top.ejs +0 -8
  933. package/dashboard/src/views/partials/milestone-detail-content.ejs +0 -19
  934. package/dashboard/src/views/partials/milestones-content.ejs +0 -44
  935. package/dashboard/src/views/partials/phase-content.ejs +0 -189
  936. package/dashboard/src/views/partials/phase-doc-content.ejs +0 -38
  937. package/dashboard/src/views/partials/phases-content.ejs +0 -117
  938. package/dashboard/src/views/partials/roadmap-content.ejs +0 -142
  939. package/dashboard/src/views/partials/sidebar.ejs +0 -46
  940. package/dashboard/src/views/partials/todo-create-content.ejs +0 -53
  941. package/dashboard/src/views/partials/todo-detail-content.ejs +0 -38
  942. package/dashboard/src/views/partials/todos-content.ejs +0 -53
  943. package/dashboard/src/views/phase-detail.ejs +0 -5
  944. package/dashboard/src/views/phase-doc.ejs +0 -5
  945. package/dashboard/src/views/phases.ejs +0 -5
  946. package/dashboard/src/views/roadmap.ejs +0 -5
  947. package/dashboard/src/views/todo-create.ejs +0 -5
  948. package/dashboard/src/views/todo-detail.ejs +0 -5
  949. package/dashboard/src/views/todos.ejs +0 -5
  950. package/plugins/copilot-pbr/CHANGELOG.md +0 -19
  951. package/plugins/copilot-pbr/README.md +0 -129
  952. package/plugins/copilot-pbr/agents/codebase-mapper.agent.md +0 -151
  953. package/plugins/copilot-pbr/agents/debugger.agent.md +0 -172
  954. package/plugins/copilot-pbr/agents/executor.agent.md +0 -267
  955. package/plugins/copilot-pbr/agents/general.agent.md +0 -88
  956. package/plugins/copilot-pbr/agents/integration-checker.agent.md +0 -119
  957. package/plugins/copilot-pbr/agents/plan-checker.agent.md +0 -199
  958. package/plugins/copilot-pbr/agents/planner.agent.md +0 -238
  959. package/plugins/copilot-pbr/agents/researcher.agent.md +0 -186
  960. package/plugins/copilot-pbr/agents/synthesizer.agent.md +0 -126
  961. package/plugins/copilot-pbr/agents/verifier.agent.md +0 -228
  962. package/plugins/copilot-pbr/hooks/hooks.json +0 -144
  963. package/plugins/copilot-pbr/plugin.json +0 -30
  964. package/plugins/copilot-pbr/references/agent-anti-patterns.md +0 -25
  965. package/plugins/copilot-pbr/references/agent-contracts.md +0 -297
  966. package/plugins/copilot-pbr/references/agent-interactions.md +0 -135
  967. package/plugins/copilot-pbr/references/agent-teams.md +0 -55
  968. package/plugins/copilot-pbr/references/checkpoints.md +0 -158
  969. package/plugins/copilot-pbr/references/common-bug-patterns.md +0 -14
  970. package/plugins/copilot-pbr/references/config-reference.md +0 -442
  971. package/plugins/copilot-pbr/references/continuation-format.md +0 -213
  972. package/plugins/copilot-pbr/references/deviation-rules.md +0 -113
  973. package/plugins/copilot-pbr/references/git-integration.md +0 -227
  974. package/plugins/copilot-pbr/references/integration-patterns.md +0 -118
  975. package/plugins/copilot-pbr/references/model-profiles.md +0 -100
  976. package/plugins/copilot-pbr/references/model-selection.md +0 -32
  977. package/plugins/copilot-pbr/references/pbr-rules.md +0 -195
  978. package/plugins/copilot-pbr/references/pbr-tools-cli.md +0 -285
  979. package/plugins/copilot-pbr/references/plan-authoring.md +0 -182
  980. package/plugins/copilot-pbr/references/plan-format.md +0 -288
  981. package/plugins/copilot-pbr/references/planning-config.md +0 -214
  982. package/plugins/copilot-pbr/references/questioning.md +0 -215
  983. package/plugins/copilot-pbr/references/reading-verification.md +0 -128
  984. package/plugins/copilot-pbr/references/stub-patterns.md +0 -161
  985. package/plugins/copilot-pbr/references/subagent-coordination.md +0 -120
  986. package/plugins/copilot-pbr/references/ui-formatting.md +0 -444
  987. package/plugins/copilot-pbr/references/verification-patterns.md +0 -199
  988. package/plugins/copilot-pbr/references/wave-execution.md +0 -96
  989. package/plugins/copilot-pbr/rules/pbr-workflow.mdc +0 -48
  990. package/plugins/copilot-pbr/setup.ps1 +0 -93
  991. package/plugins/copilot-pbr/setup.sh +0 -93
  992. package/plugins/copilot-pbr/skills/begin/SKILL.md +0 -589
  993. package/plugins/copilot-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  994. package/plugins/copilot-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  995. package/plugins/copilot-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  996. package/plugins/copilot-pbr/skills/begin/templates/config.json.tmpl +0 -64
  997. package/plugins/copilot-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  998. package/plugins/copilot-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  999. package/plugins/copilot-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  1000. package/plugins/copilot-pbr/skills/build/SKILL.md +0 -955
  1001. package/plugins/copilot-pbr/skills/config/SKILL.md +0 -250
  1002. package/plugins/copilot-pbr/skills/continue/SKILL.md +0 -159
  1003. package/plugins/copilot-pbr/skills/dashboard/SKILL.md +0 -43
  1004. package/plugins/copilot-pbr/skills/debug/SKILL.md +0 -508
  1005. package/plugins/copilot-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  1006. package/plugins/copilot-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  1007. package/plugins/copilot-pbr/skills/discuss/SKILL.md +0 -353
  1008. package/plugins/copilot-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  1009. package/plugins/copilot-pbr/skills/discuss/templates/decision-categories.md +0 -10
  1010. package/plugins/copilot-pbr/skills/do/SKILL.md +0 -66
  1011. package/plugins/copilot-pbr/skills/explore/SKILL.md +0 -373
  1012. package/plugins/copilot-pbr/skills/health/SKILL.md +0 -274
  1013. package/plugins/copilot-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  1014. package/plugins/copilot-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  1015. package/plugins/copilot-pbr/skills/help/SKILL.md +0 -152
  1016. package/plugins/copilot-pbr/skills/import/SKILL.md +0 -502
  1017. package/plugins/copilot-pbr/skills/milestone/SKILL.md +0 -745
  1018. package/plugins/copilot-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  1019. package/plugins/copilot-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  1020. package/plugins/copilot-pbr/skills/note/SKILL.md +0 -213
  1021. package/plugins/copilot-pbr/skills/pause/SKILL.md +0 -247
  1022. package/plugins/copilot-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  1023. package/plugins/copilot-pbr/skills/plan/SKILL.md +0 -662
  1024. package/plugins/copilot-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  1025. package/plugins/copilot-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  1026. package/plugins/copilot-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  1027. package/plugins/copilot-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  1028. package/plugins/copilot-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  1029. package/plugins/copilot-pbr/skills/quick/SKILL.md +0 -376
  1030. package/plugins/copilot-pbr/skills/resume/SKILL.md +0 -399
  1031. package/plugins/copilot-pbr/skills/review/SKILL.md +0 -653
  1032. package/plugins/copilot-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  1033. package/plugins/copilot-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  1034. package/plugins/copilot-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  1035. package/plugins/copilot-pbr/skills/scan/SKILL.md +0 -299
  1036. package/plugins/copilot-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  1037. package/plugins/copilot-pbr/skills/setup/SKILL.md +0 -296
  1038. package/plugins/copilot-pbr/skills/shared/commit-planning-docs.md +0 -36
  1039. package/plugins/copilot-pbr/skills/shared/config-loading.md +0 -103
  1040. package/plugins/copilot-pbr/skills/shared/context-budget.md +0 -41
  1041. package/plugins/copilot-pbr/skills/shared/context-loader-task.md +0 -87
  1042. package/plugins/copilot-pbr/skills/shared/digest-select.md +0 -80
  1043. package/plugins/copilot-pbr/skills/shared/domain-probes.md +0 -126
  1044. package/plugins/copilot-pbr/skills/shared/error-reporting.md +0 -81
  1045. package/plugins/copilot-pbr/skills/shared/gate-prompts.md +0 -389
  1046. package/plugins/copilot-pbr/skills/shared/phase-argument-parsing.md +0 -46
  1047. package/plugins/copilot-pbr/skills/shared/progress-display.md +0 -53
  1048. package/plugins/copilot-pbr/skills/shared/revision-loop.md +0 -82
  1049. package/plugins/copilot-pbr/skills/shared/state-loading.md +0 -63
  1050. package/plugins/copilot-pbr/skills/shared/state-update.md +0 -162
  1051. package/plugins/copilot-pbr/skills/shared/universal-anti-patterns.md +0 -38
  1052. package/plugins/copilot-pbr/skills/status/SKILL.md +0 -362
  1053. package/plugins/copilot-pbr/skills/statusline/SKILL.md +0 -149
  1054. package/plugins/copilot-pbr/skills/todo/SKILL.md +0 -279
  1055. package/plugins/copilot-pbr/templates/CONTEXT.md.tmpl +0 -53
  1056. package/plugins/copilot-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  1057. package/plugins/copilot-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  1058. package/plugins/copilot-pbr/templates/ROADMAP.md.tmpl +0 -41
  1059. package/plugins/copilot-pbr/templates/SUMMARY.md.tmpl +0 -82
  1060. package/plugins/copilot-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  1061. package/plugins/copilot-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  1062. package/plugins/copilot-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  1063. package/plugins/copilot-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  1064. package/plugins/copilot-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  1065. package/plugins/copilot-pbr/templates/codebase/STACK.md.tmpl +0 -78
  1066. package/plugins/copilot-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  1067. package/plugins/copilot-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  1068. package/plugins/copilot-pbr/templates/continue-here.md.tmpl +0 -74
  1069. package/plugins/copilot-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  1070. package/plugins/copilot-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  1071. package/plugins/copilot-pbr/templates/research/STACK.md.tmpl +0 -71
  1072. package/plugins/copilot-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  1073. package/plugins/copilot-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  1074. package/plugins/copilot-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  1075. package/plugins/copilot-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  1076. package/plugins/cursor-pbr/.cursor-plugin/plugin.json +0 -32
  1077. package/plugins/cursor-pbr/CHANGELOG.md +0 -15
  1078. package/plugins/cursor-pbr/README.md +0 -118
  1079. package/plugins/cursor-pbr/agents/codebase-mapper.md +0 -150
  1080. package/plugins/cursor-pbr/agents/debugger.md +0 -171
  1081. package/plugins/cursor-pbr/agents/executor.md +0 -266
  1082. package/plugins/cursor-pbr/agents/general.md +0 -87
  1083. package/plugins/cursor-pbr/agents/integration-checker.md +0 -118
  1084. package/plugins/cursor-pbr/agents/plan-checker.md +0 -198
  1085. package/plugins/cursor-pbr/agents/planner.md +0 -237
  1086. package/plugins/cursor-pbr/agents/researcher.md +0 -185
  1087. package/plugins/cursor-pbr/agents/synthesizer.md +0 -125
  1088. package/plugins/cursor-pbr/agents/verifier.md +0 -227
  1089. package/plugins/cursor-pbr/assets/.gitkeep +0 -0
  1090. package/plugins/cursor-pbr/assets/logo.svg +0 -21
  1091. package/plugins/cursor-pbr/hooks/hooks.json +0 -203
  1092. package/plugins/cursor-pbr/references/agent-anti-patterns.md +0 -25
  1093. package/plugins/cursor-pbr/references/agent-contracts.md +0 -297
  1094. package/plugins/cursor-pbr/references/agent-interactions.md +0 -135
  1095. package/plugins/cursor-pbr/references/agent-teams.md +0 -55
  1096. package/plugins/cursor-pbr/references/checkpoints.md +0 -158
  1097. package/plugins/cursor-pbr/references/common-bug-patterns.md +0 -14
  1098. package/plugins/cursor-pbr/references/config-reference.md +0 -442
  1099. package/plugins/cursor-pbr/references/continuation-format.md +0 -213
  1100. package/plugins/cursor-pbr/references/deviation-rules.md +0 -113
  1101. package/plugins/cursor-pbr/references/git-integration.md +0 -227
  1102. package/plugins/cursor-pbr/references/integration-patterns.md +0 -118
  1103. package/plugins/cursor-pbr/references/model-profiles.md +0 -100
  1104. package/plugins/cursor-pbr/references/model-selection.md +0 -32
  1105. package/plugins/cursor-pbr/references/pbr-rules.md +0 -195
  1106. package/plugins/cursor-pbr/references/pbr-tools-cli.md +0 -285
  1107. package/plugins/cursor-pbr/references/plan-authoring.md +0 -182
  1108. package/plugins/cursor-pbr/references/plan-format.md +0 -288
  1109. package/plugins/cursor-pbr/references/planning-config.md +0 -214
  1110. package/plugins/cursor-pbr/references/questioning.md +0 -215
  1111. package/plugins/cursor-pbr/references/reading-verification.md +0 -128
  1112. package/plugins/cursor-pbr/references/stub-patterns.md +0 -161
  1113. package/plugins/cursor-pbr/references/subagent-coordination.md +0 -120
  1114. package/plugins/cursor-pbr/references/ui-formatting.md +0 -444
  1115. package/plugins/cursor-pbr/references/verification-patterns.md +0 -199
  1116. package/plugins/cursor-pbr/references/wave-execution.md +0 -96
  1117. package/plugins/cursor-pbr/rules/pbr-workflow.mdc +0 -48
  1118. package/plugins/cursor-pbr/setup.ps1 +0 -78
  1119. package/plugins/cursor-pbr/setup.sh +0 -83
  1120. package/plugins/cursor-pbr/skills/begin/SKILL.md +0 -589
  1121. package/plugins/cursor-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  1122. package/plugins/cursor-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  1123. package/plugins/cursor-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  1124. package/plugins/cursor-pbr/skills/begin/templates/config.json.tmpl +0 -64
  1125. package/plugins/cursor-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  1126. package/plugins/cursor-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  1127. package/plugins/cursor-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  1128. package/plugins/cursor-pbr/skills/build/SKILL.md +0 -956
  1129. package/plugins/cursor-pbr/skills/config/SKILL.md +0 -252
  1130. package/plugins/cursor-pbr/skills/continue/SKILL.md +0 -159
  1131. package/plugins/cursor-pbr/skills/dashboard/SKILL.md +0 -44
  1132. package/plugins/cursor-pbr/skills/debug/SKILL.md +0 -512
  1133. package/plugins/cursor-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  1134. package/plugins/cursor-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  1135. package/plugins/cursor-pbr/skills/discuss/SKILL.md +0 -354
  1136. package/plugins/cursor-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  1137. package/plugins/cursor-pbr/skills/discuss/templates/decision-categories.md +0 -10
  1138. package/plugins/cursor-pbr/skills/do/SKILL.md +0 -67
  1139. package/plugins/cursor-pbr/skills/explore/SKILL.md +0 -376
  1140. package/plugins/cursor-pbr/skills/health/SKILL.md +0 -274
  1141. package/plugins/cursor-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  1142. package/plugins/cursor-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  1143. package/plugins/cursor-pbr/skills/help/SKILL.md +0 -152
  1144. package/plugins/cursor-pbr/skills/import/SKILL.md +0 -505
  1145. package/plugins/cursor-pbr/skills/milestone/SKILL.md +0 -746
  1146. package/plugins/cursor-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  1147. package/plugins/cursor-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  1148. package/plugins/cursor-pbr/skills/note/SKILL.md +0 -214
  1149. package/plugins/cursor-pbr/skills/pause/SKILL.md +0 -248
  1150. package/plugins/cursor-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  1151. package/plugins/cursor-pbr/skills/plan/SKILL.md +0 -663
  1152. package/plugins/cursor-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  1153. package/plugins/cursor-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  1154. package/plugins/cursor-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  1155. package/plugins/cursor-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  1156. package/plugins/cursor-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  1157. package/plugins/cursor-pbr/skills/quick/SKILL.md +0 -376
  1158. package/plugins/cursor-pbr/skills/resume/SKILL.md +0 -399
  1159. package/plugins/cursor-pbr/skills/review/SKILL.md +0 -654
  1160. package/plugins/cursor-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  1161. package/plugins/cursor-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  1162. package/plugins/cursor-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  1163. package/plugins/cursor-pbr/skills/scan/SKILL.md +0 -300
  1164. package/plugins/cursor-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  1165. package/plugins/cursor-pbr/skills/setup/SKILL.md +0 -296
  1166. package/plugins/cursor-pbr/skills/shared/commit-planning-docs.md +0 -36
  1167. package/plugins/cursor-pbr/skills/shared/config-loading.md +0 -103
  1168. package/plugins/cursor-pbr/skills/shared/context-budget.md +0 -41
  1169. package/plugins/cursor-pbr/skills/shared/context-loader-task.md +0 -87
  1170. package/plugins/cursor-pbr/skills/shared/digest-select.md +0 -80
  1171. package/plugins/cursor-pbr/skills/shared/domain-probes.md +0 -126
  1172. package/plugins/cursor-pbr/skills/shared/error-reporting.md +0 -81
  1173. package/plugins/cursor-pbr/skills/shared/gate-prompts.md +0 -389
  1174. package/plugins/cursor-pbr/skills/shared/phase-argument-parsing.md +0 -46
  1175. package/plugins/cursor-pbr/skills/shared/progress-display.md +0 -53
  1176. package/plugins/cursor-pbr/skills/shared/revision-loop.md +0 -82
  1177. package/plugins/cursor-pbr/skills/shared/state-loading.md +0 -63
  1178. package/plugins/cursor-pbr/skills/shared/state-update.md +0 -162
  1179. package/plugins/cursor-pbr/skills/shared/universal-anti-patterns.md +0 -38
  1180. package/plugins/cursor-pbr/skills/status/SKILL.md +0 -362
  1181. package/plugins/cursor-pbr/skills/statusline/SKILL.md +0 -150
  1182. package/plugins/cursor-pbr/skills/todo/SKILL.md +0 -280
  1183. package/plugins/cursor-pbr/templates/CONTEXT.md.tmpl +0 -53
  1184. package/plugins/cursor-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  1185. package/plugins/cursor-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  1186. package/plugins/cursor-pbr/templates/ROADMAP.md.tmpl +0 -41
  1187. package/plugins/cursor-pbr/templates/SUMMARY.md.tmpl +0 -82
  1188. package/plugins/cursor-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  1189. package/plugins/cursor-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  1190. package/plugins/cursor-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  1191. package/plugins/cursor-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  1192. package/plugins/cursor-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  1193. package/plugins/cursor-pbr/templates/codebase/STACK.md.tmpl +0 -78
  1194. package/plugins/cursor-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  1195. package/plugins/cursor-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  1196. package/plugins/cursor-pbr/templates/continue-here.md.tmpl +0 -74
  1197. package/plugins/cursor-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  1198. package/plugins/cursor-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  1199. package/plugins/cursor-pbr/templates/research/STACK.md.tmpl +0 -71
  1200. package/plugins/cursor-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  1201. package/plugins/cursor-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  1202. package/plugins/cursor-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  1203. package/plugins/cursor-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  1204. package/plugins/pbr/references/agent-interactions.md +0 -134
  1205. package/plugins/pbr/references/checkpoints.md +0 -157
  1206. package/plugins/pbr/references/pbr-rules.md +0 -194
  1207. package/plugins/pbr/references/planning-config.md +0 -213
  1208. package/plugins/pbr/references/subagent-coordination.md +0 -119
  1209. package/plugins/pbr/references/ui-formatting.md +0 -444
  1210. package/plugins/pbr/references/verification-patterns.md +0 -198
  1211. package/plugins/pbr/scripts/validate-plugin-structure.js +0 -183
  1212. package/plugins/pbr/skills/milestone/templates/audit-report.md.tmpl +0 -48
  1213. package/plugins/pbr/skills/shared/progress-display.md +0 -53
  1214. package/plugins/pbr/skills/shared/state-loading.md +0 -62
  1215. package/plugins/pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -97
  1216. package/plugins/pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  1217. package/plugins/pbr/templates/research/STACK.md.tmpl +0 -71
  1218. package/plugins/pbr/templates/research/SUMMARY.md.tmpl +0 -112
  1219. package/plugins/pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  1220. package/plugins/pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  1221. package/plugins/pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  1222. /package/plugins/pbr/references/{agent-anti-patterns.md → archive/agent-anti-patterns.md} +0 -0
@@ -0,0 +1,1451 @@
1
+ /**
2
+ * Verify — Verification suite, consistency, and health validation
3
+ */
4
+
5
+ const fs = require('fs');
6
+ const path = require('path');
7
+ const { safeReadFile, normalizePhaseName, execGit, findPhaseInternal, getMilestoneInfo, output, error } = require('./core.cjs');
8
+ const { extractFrontmatter, parseMustHavesBlock } = require('./frontmatter.cjs');
9
+ // writeStateMd was never exported from state.cjs — use fs.writeFileSync directly
10
+
11
+ function cmdVerifySummary(cwd, summaryPath, checkFileCount, raw) {
12
+ if (!summaryPath) {
13
+ error('summary-path required');
14
+ }
15
+
16
+ const fullPath = path.join(cwd, summaryPath);
17
+ const checkCount = checkFileCount || 2;
18
+
19
+ // Check 1: Summary exists
20
+ if (!fs.existsSync(fullPath)) {
21
+ const result = {
22
+ passed: false,
23
+ checks: {
24
+ summary_exists: false,
25
+ files_created: { checked: 0, found: 0, missing: [] },
26
+ commits_exist: false,
27
+ self_check: 'not_found',
28
+ },
29
+ errors: ['SUMMARY.md not found'],
30
+ };
31
+ output(result, raw, 'failed');
32
+ return;
33
+ }
34
+
35
+ const content = fs.readFileSync(fullPath, 'utf-8');
36
+ const errors = [];
37
+
38
+ // Check 2: Spot-check files mentioned in summary
39
+ const mentionedFiles = new Set();
40
+ const patterns = [
41
+ /`([^`]+\.[a-zA-Z]+)`/g,
42
+ /(?:Created|Modified|Added|Updated|Edited):\s*`?([^\s`]+\.[a-zA-Z]+)`?/gi,
43
+ ];
44
+
45
+ for (const pattern of patterns) {
46
+ let m;
47
+ while ((m = pattern.exec(content)) !== null) {
48
+ const filePath = m[1];
49
+ if (filePath && !filePath.startsWith('http') && filePath.includes('/')) {
50
+ mentionedFiles.add(filePath);
51
+ }
52
+ }
53
+ }
54
+
55
+ const filesToCheck = Array.from(mentionedFiles).slice(0, checkCount);
56
+ const missing = [];
57
+ for (const file of filesToCheck) {
58
+ if (!fs.existsSync(path.join(cwd, file))) {
59
+ missing.push(file);
60
+ }
61
+ }
62
+
63
+ // Check 3: Commits exist
64
+ const commitHashPattern = /\b[0-9a-f]{7,40}\b/g;
65
+ const hashes = content.match(commitHashPattern) || [];
66
+ let commitsExist = false;
67
+ if (hashes.length > 0) {
68
+ for (const hash of hashes.slice(0, 3)) {
69
+ const result = execGit(cwd, ['cat-file', '-t', hash]);
70
+ if (result.exitCode === 0 && result.stdout === 'commit') {
71
+ commitsExist = true;
72
+ break;
73
+ }
74
+ }
75
+ }
76
+
77
+ // Check 4: Self-check section
78
+ let selfCheck = 'not_found';
79
+ const selfCheckPattern = /##\s*(?:Self[- ]?Check|Verification|Quality Check)/i;
80
+ if (selfCheckPattern.test(content)) {
81
+ const passPattern = /(?:all\s+)?(?:pass|✓|✅|complete|succeeded)/i;
82
+ const failPattern = /(?:fail|✗|❌|incomplete|blocked)/i;
83
+ const checkSection = content.slice(content.search(selfCheckPattern));
84
+ if (failPattern.test(checkSection)) {
85
+ selfCheck = 'failed';
86
+ } else if (passPattern.test(checkSection)) {
87
+ selfCheck = 'passed';
88
+ }
89
+ }
90
+
91
+ if (missing.length > 0) errors.push('Missing files: ' + missing.join(', '));
92
+ if (!commitsExist && hashes.length > 0) errors.push('Referenced commit hashes not found in git history');
93
+ if (selfCheck === 'failed') errors.push('Self-check section indicates failure');
94
+
95
+ const checks = {
96
+ summary_exists: true,
97
+ files_created: { checked: filesToCheck.length, found: filesToCheck.length - missing.length, missing },
98
+ commits_exist: commitsExist,
99
+ self_check: selfCheck,
100
+ };
101
+
102
+ const passed = missing.length === 0 && selfCheck !== 'failed';
103
+ const result = { passed, checks, errors };
104
+ output(result, raw, passed ? 'passed' : 'failed');
105
+ }
106
+
107
+ function cmdVerifyPlanStructure(cwd, filePath, raw) {
108
+ if (!filePath) { error('file path required'); }
109
+ const fullPath = path.isAbsolute(filePath) ? filePath : path.join(cwd, filePath);
110
+ const content = safeReadFile(fullPath);
111
+ if (!content) { output({ error: 'File not found', path: filePath }, raw); return; }
112
+
113
+ const fm = extractFrontmatter(content);
114
+ const errors = [];
115
+ const warnings = [];
116
+
117
+ // Check required frontmatter fields
118
+ const required = ['phase', 'plan', 'type', 'wave', 'depends_on', 'files_modified', 'autonomous', 'must_haves'];
119
+ for (const field of required) {
120
+ if (fm[field] === undefined) errors.push(`Missing required frontmatter field: ${field}`);
121
+ }
122
+
123
+ // Parse and check task elements
124
+ const taskPattern = /<task[^>]*>([\s\S]*?)<\/task>/g;
125
+ const tasks = [];
126
+ let taskMatch;
127
+ while ((taskMatch = taskPattern.exec(content)) !== null) {
128
+ const taskContent = taskMatch[1];
129
+ const nameMatch = taskContent.match(/<name>([\s\S]*?)<\/name>/);
130
+ const taskName = nameMatch ? nameMatch[1].trim() : 'unnamed';
131
+ const hasFiles = /<files>/.test(taskContent);
132
+ const hasAction = /<action>/.test(taskContent);
133
+ const hasVerify = /<verify>/.test(taskContent);
134
+ const hasDone = /<done>/.test(taskContent);
135
+
136
+ if (!nameMatch) errors.push('Task missing <name> element');
137
+ if (!hasAction) errors.push(`Task '${taskName}' missing <action>`);
138
+ if (!hasVerify) warnings.push(`Task '${taskName}' missing <verify>`);
139
+ if (!hasDone) warnings.push(`Task '${taskName}' missing <done>`);
140
+ if (!hasFiles) warnings.push(`Task '${taskName}' missing <files>`);
141
+
142
+ tasks.push({ name: taskName, hasFiles, hasAction, hasVerify, hasDone });
143
+ }
144
+
145
+ if (tasks.length === 0) warnings.push('No <task> elements found');
146
+
147
+ // Wave/depends_on consistency
148
+ if (fm.wave && parseInt(fm.wave) > 1 && (!fm.depends_on || (Array.isArray(fm.depends_on) && fm.depends_on.length === 0))) {
149
+ warnings.push('Wave > 1 but depends_on is empty');
150
+ }
151
+
152
+ // Autonomous/checkpoint consistency
153
+ const hasCheckpoints = /<task\s+type=["']?checkpoint/.test(content);
154
+ if (hasCheckpoints && fm.autonomous !== 'false' && fm.autonomous !== false) {
155
+ errors.push('Has checkpoint tasks but autonomous is not false');
156
+ }
157
+
158
+ output({
159
+ valid: errors.length === 0,
160
+ errors,
161
+ warnings,
162
+ task_count: tasks.length,
163
+ tasks,
164
+ frontmatter_fields: Object.keys(fm),
165
+ }, raw, errors.length === 0 ? 'valid' : 'invalid');
166
+ }
167
+
168
+ function cmdVerifyPhaseCompleteness(cwd, phase, raw) {
169
+ if (!phase) { error('phase required'); }
170
+ const phaseInfo = findPhaseInternal(cwd, phase);
171
+ if (!phaseInfo || !phaseInfo.found) {
172
+ output({ error: 'Phase not found', phase }, raw);
173
+ return;
174
+ }
175
+
176
+ const errors = [];
177
+ const warnings = [];
178
+ const phaseDir = path.join(cwd, phaseInfo.directory);
179
+
180
+ // List plans and summaries
181
+ let files;
182
+ try { files = fs.readdirSync(phaseDir); } catch { output({ error: 'Cannot read phase directory' }, raw); return; }
183
+
184
+ const plans = files.filter(f => f.match(/-PLAN\.md$/i));
185
+ const summaries = files.filter(f => f.match(/-SUMMARY\.md$/i));
186
+
187
+ // Extract plan IDs (everything before -PLAN.md)
188
+ const planIds = new Set(plans.map(p => p.replace(/-PLAN\.md$/i, '')));
189
+ const summaryIds = new Set(summaries.map(s => s.replace(/-SUMMARY\.md$/i, '')));
190
+
191
+ // Plans without summaries
192
+ const incompletePlans = [...planIds].filter(id => !summaryIds.has(id));
193
+ if (incompletePlans.length > 0) {
194
+ errors.push(`Plans without summaries: ${incompletePlans.join(', ')}`);
195
+ }
196
+
197
+ // Summaries without plans (orphans)
198
+ const orphanSummaries = [...summaryIds].filter(id => !planIds.has(id));
199
+ if (orphanSummaries.length > 0) {
200
+ warnings.push(`Summaries without plans: ${orphanSummaries.join(', ')}`);
201
+ }
202
+
203
+ output({
204
+ complete: errors.length === 0,
205
+ phase: phaseInfo.phase_number,
206
+ plan_count: plans.length,
207
+ summary_count: summaries.length,
208
+ incomplete_plans: incompletePlans,
209
+ orphan_summaries: orphanSummaries,
210
+ errors,
211
+ warnings,
212
+ }, raw, errors.length === 0 ? 'complete' : 'incomplete');
213
+ }
214
+
215
+ function cmdVerifyReferences(cwd, filePath, raw) {
216
+ if (!filePath) { error('file path required'); }
217
+ const fullPath = path.isAbsolute(filePath) ? filePath : path.join(cwd, filePath);
218
+ const content = safeReadFile(fullPath);
219
+ if (!content) { output({ error: 'File not found', path: filePath }, raw); return; }
220
+
221
+ const found = [];
222
+ const missing = [];
223
+
224
+ // Find @-references: @path/to/file (must contain / to be a file path)
225
+ const atRefs = content.match(/@([^\s\n,)]+\/[^\s\n,)]+)/g) || [];
226
+ for (const ref of atRefs) {
227
+ const cleanRef = ref.slice(1); // remove @
228
+ const resolved = cleanRef.startsWith('~/')
229
+ ? path.join(process.env.HOME || '', cleanRef.slice(2))
230
+ : path.join(cwd, cleanRef);
231
+ if (fs.existsSync(resolved)) {
232
+ found.push(cleanRef);
233
+ } else {
234
+ missing.push(cleanRef);
235
+ }
236
+ }
237
+
238
+ // Find backtick file paths that look like real paths (contain / and have extension)
239
+ const backtickRefs = content.match(/`([^`]+\/[^`]+\.[a-zA-Z]{1,10})`/g) || [];
240
+ for (const ref of backtickRefs) {
241
+ const cleanRef = ref.slice(1, -1); // remove backticks
242
+ if (cleanRef.startsWith('http') || cleanRef.includes('${') || cleanRef.includes('{{')) continue;
243
+ if (found.includes(cleanRef) || missing.includes(cleanRef)) continue; // dedup
244
+ const resolved = path.join(cwd, cleanRef);
245
+ if (fs.existsSync(resolved)) {
246
+ found.push(cleanRef);
247
+ } else {
248
+ missing.push(cleanRef);
249
+ }
250
+ }
251
+
252
+ output({
253
+ valid: missing.length === 0,
254
+ found: found.length,
255
+ missing,
256
+ total: found.length + missing.length,
257
+ }, raw, missing.length === 0 ? 'valid' : 'invalid');
258
+ }
259
+
260
+ function cmdVerifyCommits(cwd, hashes, raw) {
261
+ if (!hashes || hashes.length === 0) { error('At least one commit hash required'); }
262
+
263
+ const valid = [];
264
+ const invalid = [];
265
+ for (const hash of hashes) {
266
+ const result = execGit(cwd, ['cat-file', '-t', hash]);
267
+ if (result.exitCode === 0 && result.stdout.trim() === 'commit') {
268
+ valid.push(hash);
269
+ } else {
270
+ invalid.push(hash);
271
+ }
272
+ }
273
+
274
+ output({
275
+ all_valid: invalid.length === 0,
276
+ valid,
277
+ invalid,
278
+ total: hashes.length,
279
+ }, raw, invalid.length === 0 ? 'valid' : 'invalid');
280
+ }
281
+
282
+ function cmdVerifyArtifacts(cwd, planFilePath, raw) {
283
+ if (!planFilePath) { error('plan file path required'); }
284
+ const fullPath = path.isAbsolute(planFilePath) ? planFilePath : path.join(cwd, planFilePath);
285
+ const content = safeReadFile(fullPath);
286
+ if (!content) { output({ error: 'File not found', path: planFilePath }, raw); return; }
287
+
288
+ const artifacts = parseMustHavesBlock(content, 'artifacts');
289
+ if (artifacts.length === 0) {
290
+ output({ error: 'No must_haves.artifacts found in frontmatter', path: planFilePath }, raw);
291
+ return;
292
+ }
293
+
294
+ const results = [];
295
+ for (const artifact of artifacts) {
296
+ if (typeof artifact === 'string') continue; // skip simple string items
297
+ const artPath = artifact.path;
298
+ if (!artPath) continue;
299
+
300
+ const artFullPath = path.join(cwd, artPath);
301
+ const exists = fs.existsSync(artFullPath);
302
+ const check = { path: artPath, exists, issues: [], passed: false };
303
+
304
+ if (exists) {
305
+ const fileContent = safeReadFile(artFullPath) || '';
306
+ const lineCount = fileContent.split('\n').length;
307
+
308
+ if (artifact.min_lines && lineCount < artifact.min_lines) {
309
+ check.issues.push(`Only ${lineCount} lines, need ${artifact.min_lines}`);
310
+ }
311
+ if (artifact.contains && !fileContent.includes(artifact.contains)) {
312
+ check.issues.push(`Missing pattern: ${artifact.contains}`);
313
+ }
314
+ if (artifact.exports) {
315
+ const exports = Array.isArray(artifact.exports) ? artifact.exports : [artifact.exports];
316
+ for (const exp of exports) {
317
+ if (!fileContent.includes(exp)) check.issues.push(`Missing export: ${exp}`);
318
+ }
319
+ }
320
+ check.passed = check.issues.length === 0;
321
+ } else {
322
+ check.issues.push('File not found');
323
+ }
324
+
325
+ results.push(check);
326
+ }
327
+
328
+ const passed = results.filter(r => r.passed).length;
329
+ output({
330
+ all_passed: passed === results.length,
331
+ passed,
332
+ total: results.length,
333
+ artifacts: results,
334
+ }, raw, passed === results.length ? 'valid' : 'invalid');
335
+ }
336
+
337
+ function cmdVerifyKeyLinks(cwd, planFilePath, raw) {
338
+ if (!planFilePath) { error('plan file path required'); }
339
+ const fullPath = path.isAbsolute(planFilePath) ? planFilePath : path.join(cwd, planFilePath);
340
+ const content = safeReadFile(fullPath);
341
+ if (!content) { output({ error: 'File not found', path: planFilePath }, raw); return; }
342
+
343
+ const keyLinks = parseMustHavesBlock(content, 'key_links');
344
+ if (keyLinks.length === 0) {
345
+ output({ error: 'No must_haves.key_links found in frontmatter', path: planFilePath }, raw);
346
+ return;
347
+ }
348
+
349
+ const results = [];
350
+ for (const link of keyLinks) {
351
+ if (typeof link === 'string') continue;
352
+ const check = { from: link.from, to: link.to, via: link.via || '', verified: false, detail: '' };
353
+
354
+ const sourceContent = safeReadFile(path.join(cwd, link.from || ''));
355
+ if (!sourceContent) {
356
+ check.detail = 'Source file not found';
357
+ } else if (link.pattern) {
358
+ try {
359
+ const regex = new RegExp(link.pattern);
360
+ if (regex.test(sourceContent)) {
361
+ check.verified = true;
362
+ check.detail = 'Pattern found in source';
363
+ } else {
364
+ const targetContent = safeReadFile(path.join(cwd, link.to || ''));
365
+ if (targetContent && regex.test(targetContent)) {
366
+ check.verified = true;
367
+ check.detail = 'Pattern found in target';
368
+ } else {
369
+ check.detail = `Pattern "${link.pattern}" not found in source or target`;
370
+ }
371
+ }
372
+ } catch {
373
+ check.detail = `Invalid regex pattern: ${link.pattern}`;
374
+ }
375
+ } else {
376
+ // No pattern: just check source references target
377
+ if (sourceContent.includes(link.to || '')) {
378
+ check.verified = true;
379
+ check.detail = 'Target referenced in source';
380
+ } else {
381
+ check.detail = 'Target not referenced in source';
382
+ }
383
+ }
384
+
385
+ results.push(check);
386
+ }
387
+
388
+ const verified = results.filter(r => r.verified).length;
389
+ output({
390
+ all_verified: verified === results.length,
391
+ verified,
392
+ total: results.length,
393
+ links: results,
394
+ }, raw, verified === results.length ? 'valid' : 'invalid');
395
+ }
396
+
397
+ function cmdValidateConsistency(cwd, raw) {
398
+ const roadmapPath = path.join(cwd, '.planning', 'ROADMAP.md');
399
+ const phasesDir = path.join(cwd, '.planning', 'phases');
400
+ const errors = [];
401
+ const warnings = [];
402
+
403
+ // Check for ROADMAP
404
+ if (!fs.existsSync(roadmapPath)) {
405
+ errors.push('ROADMAP.md not found');
406
+ output({ passed: false, errors, warnings }, raw, 'failed');
407
+ return;
408
+ }
409
+
410
+ const roadmapContent = fs.readFileSync(roadmapPath, 'utf-8');
411
+
412
+ // Extract phases from ROADMAP
413
+ const roadmapPhases = new Set();
414
+ const phasePattern = /#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:/gi;
415
+ let m;
416
+ while ((m = phasePattern.exec(roadmapContent)) !== null) {
417
+ roadmapPhases.add(m[1]);
418
+ }
419
+
420
+ // Get phases on disk
421
+ const diskPhases = new Set();
422
+ try {
423
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
424
+ const dirs = entries.filter(e => e.isDirectory()).map(e => e.name);
425
+ for (const dir of dirs) {
426
+ const dm = dir.match(/^(\d+[A-Z]?(?:\.\d+)*)/i);
427
+ if (dm) diskPhases.add(dm[1]);
428
+ }
429
+ } catch {}
430
+
431
+ // Check: phases in ROADMAP but not on disk
432
+ for (const p of roadmapPhases) {
433
+ if (!diskPhases.has(p) && !diskPhases.has(normalizePhaseName(p))) {
434
+ warnings.push(`Phase ${p} in ROADMAP.md but no directory on disk`);
435
+ }
436
+ }
437
+
438
+ // Check: phases on disk but not in ROADMAP
439
+ for (const p of diskPhases) {
440
+ const unpadded = String(parseInt(p, 10));
441
+ if (!roadmapPhases.has(p) && !roadmapPhases.has(unpadded)) {
442
+ warnings.push(`Phase ${p} exists on disk but not in ROADMAP.md`);
443
+ }
444
+ }
445
+
446
+ // Check: sequential phase numbers (integers only)
447
+ const integerPhases = [...diskPhases]
448
+ .filter(p => !p.includes('.'))
449
+ .map(p => parseInt(p, 10))
450
+ .sort((a, b) => a - b);
451
+
452
+ for (let i = 1; i < integerPhases.length; i++) {
453
+ if (integerPhases[i] !== integerPhases[i - 1] + 1) {
454
+ warnings.push(`Gap in phase numbering: ${integerPhases[i - 1]} → ${integerPhases[i]}`);
455
+ }
456
+ }
457
+
458
+ // Check: plan numbering within phases
459
+ try {
460
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
461
+ const dirs = entries.filter(e => e.isDirectory()).map(e => e.name).sort();
462
+
463
+ for (const dir of dirs) {
464
+ const phaseFiles = fs.readdirSync(path.join(phasesDir, dir));
465
+ const plans = phaseFiles.filter(f => f.endsWith('-PLAN.md')).sort();
466
+
467
+ // Extract plan numbers
468
+ const planNums = plans.map(p => {
469
+ const pm = p.match(/-(\d{2})-PLAN\.md$/);
470
+ return pm ? parseInt(pm[1], 10) : null;
471
+ }).filter(n => n !== null);
472
+
473
+ for (let i = 1; i < planNums.length; i++) {
474
+ if (planNums[i] !== planNums[i - 1] + 1) {
475
+ warnings.push(`Gap in plan numbering in ${dir}: plan ${planNums[i - 1]} → ${planNums[i]}`);
476
+ }
477
+ }
478
+
479
+ // Check: plans without summaries (completed plans)
480
+ const summaries = phaseFiles.filter(f => f.endsWith('-SUMMARY.md'));
481
+ const planIds = new Set(plans.map(p => p.replace('-PLAN.md', '')));
482
+ const summaryIds = new Set(summaries.map(s => s.replace('-SUMMARY.md', '')));
483
+
484
+ // Summary without matching plan is suspicious
485
+ for (const sid of summaryIds) {
486
+ if (!planIds.has(sid)) {
487
+ warnings.push(`Summary ${sid}-SUMMARY.md in ${dir} has no matching PLAN.md`);
488
+ }
489
+ }
490
+ }
491
+ } catch {}
492
+
493
+ // Check: frontmatter in plans has required fields
494
+ try {
495
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
496
+ const dirs = entries.filter(e => e.isDirectory()).map(e => e.name);
497
+
498
+ for (const dir of dirs) {
499
+ const phaseFiles = fs.readdirSync(path.join(phasesDir, dir));
500
+ const plans = phaseFiles.filter(f => f.endsWith('-PLAN.md'));
501
+
502
+ for (const plan of plans) {
503
+ const content = fs.readFileSync(path.join(phasesDir, dir, plan), 'utf-8');
504
+ const fm = extractFrontmatter(content);
505
+
506
+ if (!fm.wave) {
507
+ warnings.push(`${dir}/${plan}: missing 'wave' in frontmatter`);
508
+ }
509
+ }
510
+ }
511
+ } catch {}
512
+
513
+ const passed = errors.length === 0;
514
+ output({ passed, errors, warnings, warning_count: warnings.length }, raw, passed ? 'passed' : 'failed');
515
+ }
516
+
517
+ /**
518
+ * Check Phase 05 features: decision_journal, negative_knowledge, living_requirements.
519
+ * @param {string} planningDir - Path to .planning directory
520
+ * @param {object} config - Parsed config.json
521
+ * @returns {object} Per-feature status object
522
+ */
523
+ function checkPhase05Features(planningDir, config) {
524
+ const features = config.features || {};
525
+ const result = {};
526
+
527
+ // decision_journal
528
+ if (features.decision_journal === false) {
529
+ result.decision_journal = { enabled: false, status: 'disabled' };
530
+ } else if (features.decision_journal) {
531
+ const decisionsDir = path.join(planningDir, 'decisions');
532
+ if (fs.existsSync(decisionsDir)) {
533
+ result.decision_journal = { enabled: true, status: 'healthy' };
534
+ } else {
535
+ result.decision_journal = { enabled: true, status: 'degraded', reason: 'decisions directory not found' };
536
+ }
537
+ }
538
+
539
+ // negative_knowledge
540
+ if (features.negative_knowledge === false) {
541
+ result.negative_knowledge = { enabled: false, status: 'disabled' };
542
+ } else if (features.negative_knowledge) {
543
+ const nkDir = path.join(planningDir, 'negative-knowledge');
544
+ if (fs.existsSync(nkDir)) {
545
+ result.negative_knowledge = { enabled: true, status: 'healthy' };
546
+ } else {
547
+ result.negative_knowledge = { enabled: true, status: 'degraded', reason: 'negative-knowledge directory not found' };
548
+ }
549
+ }
550
+
551
+ // living_requirements
552
+ if (features.living_requirements === false) {
553
+ result.living_requirements = { enabled: false, status: 'disabled' };
554
+ } else if (features.living_requirements) {
555
+ const reqPath = path.join(planningDir, 'REQUIREMENTS.md');
556
+ if (fs.existsSync(reqPath)) {
557
+ const content = fs.readFileSync(reqPath, 'utf-8');
558
+ if (/REQ-/.test(content)) {
559
+ result.living_requirements = { enabled: true, status: 'healthy' };
560
+ } else {
561
+ result.living_requirements = { enabled: true, status: 'degraded', reason: 'REQUIREMENTS.md not found or has no REQ-IDs' };
562
+ }
563
+ } else {
564
+ result.living_requirements = { enabled: true, status: 'degraded', reason: 'REQUIREMENTS.md not found or has no REQ-IDs' };
565
+ }
566
+ }
567
+
568
+ return Object.keys(result).length > 0 ? result : null;
569
+ }
570
+
571
+ function cmdValidateHealth(cwd, options, raw) {
572
+ const planningDir = path.join(cwd, '.planning');
573
+ const projectPath = path.join(planningDir, 'PROJECT.md');
574
+ const roadmapPath = path.join(planningDir, 'ROADMAP.md');
575
+ const statePath = path.join(planningDir, 'STATE.md');
576
+ const configPath = path.join(planningDir, 'config.json');
577
+ const phasesDir = path.join(planningDir, 'phases');
578
+
579
+ const errors = [];
580
+ const warnings = [];
581
+ const info = [];
582
+ const repairs = [];
583
+
584
+ // Helper to add issue
585
+ const addIssue = (severity, code, message, fix, repairable = false) => {
586
+ const issue = { code, message, fix, repairable };
587
+ if (severity === 'error') errors.push(issue);
588
+ else if (severity === 'warning') warnings.push(issue);
589
+ else info.push(issue);
590
+ };
591
+
592
+ // ─── Check 1: .planning/ exists ───────────────────────────────────────────
593
+ if (!fs.existsSync(planningDir)) {
594
+ addIssue('error', 'E001', '.planning/ directory not found', 'Run /pbr:new-project to initialize');
595
+ output({
596
+ status: 'broken',
597
+ errors,
598
+ warnings,
599
+ info,
600
+ repairable_count: 0,
601
+ }, raw);
602
+ return;
603
+ }
604
+
605
+ // ─── Check 2: PROJECT.md exists and has required sections ─────────────────
606
+ if (!fs.existsSync(projectPath)) {
607
+ addIssue('error', 'E002', 'PROJECT.md not found', 'Run /pbr:new-project to create');
608
+ } else {
609
+ const content = fs.readFileSync(projectPath, 'utf-8');
610
+ const requiredSections = ['## What This Is', '## Core Value', '## Requirements'];
611
+ for (const section of requiredSections) {
612
+ if (!content.includes(section)) {
613
+ addIssue('warning', 'W001', `PROJECT.md missing section: ${section}`, 'Add section manually');
614
+ }
615
+ }
616
+ }
617
+
618
+ // ─── Check 3: ROADMAP.md exists ───────────────────────────────────────────
619
+ if (!fs.existsSync(roadmapPath)) {
620
+ addIssue('error', 'E003', 'ROADMAP.md not found', 'Run /pbr:new-milestone to create roadmap');
621
+ }
622
+
623
+ // ─── Check 4: STATE.md exists and references valid phases ─────────────────
624
+ if (!fs.existsSync(statePath)) {
625
+ addIssue('error', 'E004', 'STATE.md not found', 'Run /pbr:health --repair to regenerate', true);
626
+ repairs.push('regenerateState');
627
+ } else {
628
+ const stateContent = fs.readFileSync(statePath, 'utf-8');
629
+ // Extract phase references from STATE.md
630
+ const phaseRefs = [...stateContent.matchAll(/[Pp]hase\s+(\d+(?:\.\d+)*)/g)].map(m => m[1]);
631
+ // Get disk phases
632
+ const diskPhases = new Set();
633
+ try {
634
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
635
+ for (const e of entries) {
636
+ if (e.isDirectory()) {
637
+ const m = e.name.match(/^(\d+(?:\.\d+)*)/);
638
+ if (m) diskPhases.add(m[1]);
639
+ }
640
+ }
641
+ } catch {}
642
+ // Check for invalid references
643
+ for (const ref of phaseRefs) {
644
+ const normalizedRef = String(parseInt(ref, 10)).padStart(2, '0');
645
+ if (!diskPhases.has(ref) && !diskPhases.has(normalizedRef) && !diskPhases.has(String(parseInt(ref, 10)))) {
646
+ // Only warn if phases dir has any content (not just an empty project)
647
+ if (diskPhases.size > 0) {
648
+ addIssue('warning', 'W002', `STATE.md references phase ${ref}, but only phases ${[...diskPhases].sort().join(', ')} exist`, 'Run /pbr:health --repair to regenerate STATE.md', true);
649
+ if (!repairs.includes('regenerateState')) repairs.push('regenerateState');
650
+ }
651
+ }
652
+ }
653
+ }
654
+
655
+ // ─── Check 5: config.json valid JSON + valid schema ───────────────────────
656
+ if (!fs.existsSync(configPath)) {
657
+ addIssue('warning', 'W003', 'config.json not found', 'Run /pbr:health --repair to create with defaults', true);
658
+ repairs.push('createConfig');
659
+ } else {
660
+ try {
661
+ const raw = fs.readFileSync(configPath, 'utf-8');
662
+ const parsed = JSON.parse(raw);
663
+ // Validate known fields
664
+ const validProfiles = ['quality', 'balanced', 'budget'];
665
+ if (parsed.model_profile && !validProfiles.includes(parsed.model_profile)) {
666
+ addIssue('warning', 'W004', `config.json: invalid model_profile "${parsed.model_profile}"`, `Valid values: ${validProfiles.join(', ')}`);
667
+ }
668
+ } catch (err) {
669
+ addIssue('error', 'E005', `config.json: JSON parse error - ${err.message}`, 'Run /pbr:health --repair to reset to defaults', true);
670
+ repairs.push('resetConfig');
671
+ }
672
+ }
673
+
674
+ // ─── Check 5b: Nyquist validation key presence ──────────────────────────
675
+ if (fs.existsSync(configPath)) {
676
+ try {
677
+ const configRaw = fs.readFileSync(configPath, 'utf-8');
678
+ const configParsed = JSON.parse(configRaw);
679
+ if (configParsed.workflow && configParsed.workflow.nyquist_validation === undefined) {
680
+ addIssue('warning', 'W008', 'config.json: workflow.nyquist_validation absent (defaults to enabled but agents may skip)', 'Run /pbr:health --repair to add key', true);
681
+ if (!repairs.includes('addNyquistKey')) repairs.push('addNyquistKey');
682
+ }
683
+ } catch {}
684
+ }
685
+
686
+ // ─── Check 6: Phase directory naming (NN-name format) ─────────────────────
687
+ try {
688
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
689
+ for (const e of entries) {
690
+ if (e.isDirectory() && !e.name.match(/^\d{2}(?:\.\d+)*-[\w-]+$/)) {
691
+ addIssue('warning', 'W005', `Phase directory "${e.name}" doesn't follow NN-name format`, 'Rename to match pattern (e.g., 01-setup)');
692
+ }
693
+ }
694
+ } catch {}
695
+
696
+ // ─── Check 7: Orphaned plans (PLAN without SUMMARY) ───────────────────────
697
+ try {
698
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
699
+ for (const e of entries) {
700
+ if (!e.isDirectory()) continue;
701
+ const phaseFiles = fs.readdirSync(path.join(phasesDir, e.name));
702
+ const plans = phaseFiles.filter(f => f.endsWith('-PLAN.md') || f === 'PLAN.md');
703
+ const summaries = phaseFiles.filter(f => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md');
704
+ const summaryBases = new Set(summaries.map(s => s.replace('-SUMMARY.md', '').replace('SUMMARY.md', '')));
705
+
706
+ for (const plan of plans) {
707
+ const planBase = plan.replace('-PLAN.md', '').replace('PLAN.md', '');
708
+ if (!summaryBases.has(planBase)) {
709
+ addIssue('info', 'I001', `${e.name}/${plan} has no SUMMARY.md`, 'May be in progress');
710
+ }
711
+ }
712
+ }
713
+ } catch {}
714
+
715
+ // ─── Check 7b: Nyquist VALIDATION.md consistency ────────────────────────
716
+ try {
717
+ const phaseEntries = fs.readdirSync(phasesDir, { withFileTypes: true });
718
+ for (const e of phaseEntries) {
719
+ if (!e.isDirectory()) continue;
720
+ const phaseFiles = fs.readdirSync(path.join(phasesDir, e.name));
721
+ const hasResearch = phaseFiles.some(f => f.endsWith('-RESEARCH.md'));
722
+ const hasValidation = phaseFiles.some(f => f.endsWith('-VALIDATION.md'));
723
+ if (hasResearch && !hasValidation) {
724
+ const researchFile = phaseFiles.find(f => f.endsWith('-RESEARCH.md'));
725
+ const researchContent = fs.readFileSync(path.join(phasesDir, e.name, researchFile), 'utf-8');
726
+ if (researchContent.includes('## Validation Architecture')) {
727
+ addIssue('warning', 'W009', `Phase ${e.name}: has Validation Architecture in RESEARCH.md but no VALIDATION.md`, 'Re-run /pbr:plan-phase with --research to regenerate');
728
+ }
729
+ }
730
+ }
731
+ } catch {}
732
+
733
+ // ─── Check 8: Run existing consistency checks ─────────────────────────────
734
+ // Inline subset of cmdValidateConsistency
735
+ if (fs.existsSync(roadmapPath)) {
736
+ const roadmapContent = fs.readFileSync(roadmapPath, 'utf-8');
737
+ const roadmapPhases = new Set();
738
+ const phasePattern = /#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:/gi;
739
+ let m;
740
+ while ((m = phasePattern.exec(roadmapContent)) !== null) {
741
+ roadmapPhases.add(m[1]);
742
+ }
743
+
744
+ const diskPhases = new Set();
745
+ try {
746
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
747
+ for (const e of entries) {
748
+ if (e.isDirectory()) {
749
+ const dm = e.name.match(/^(\d+[A-Z]?(?:\.\d+)*)/i);
750
+ if (dm) diskPhases.add(dm[1]);
751
+ }
752
+ }
753
+ } catch {}
754
+
755
+ // Phases in ROADMAP but not on disk
756
+ for (const p of roadmapPhases) {
757
+ const padded = String(parseInt(p, 10)).padStart(2, '0');
758
+ if (!diskPhases.has(p) && !diskPhases.has(padded)) {
759
+ addIssue('warning', 'W006', `Phase ${p} in ROADMAP.md but no directory on disk`, 'Create phase directory or remove from roadmap');
760
+ }
761
+ }
762
+
763
+ // Phases on disk but not in ROADMAP
764
+ for (const p of diskPhases) {
765
+ const unpadded = String(parseInt(p, 10));
766
+ if (!roadmapPhases.has(p) && !roadmapPhases.has(unpadded)) {
767
+ addIssue('warning', 'W007', `Phase ${p} exists on disk but not in ROADMAP.md`, 'Add to roadmap or remove directory');
768
+ }
769
+ }
770
+ }
771
+
772
+ // ─── Check 9: Phase 1 feature status ────────────────────────────────────────
773
+ const feature_status = {};
774
+ if (fs.existsSync(configPath)) {
775
+ try {
776
+ const configRaw = fs.readFileSync(configPath, 'utf-8');
777
+ const configParsed = JSON.parse(configRaw);
778
+ const features = configParsed.features || {};
779
+ const workflow = configParsed.workflow || {};
780
+
781
+ // enhanced_session_start: default true (enabled unless explicitly false)
782
+ const essEnabled = features.enhanced_session_start !== false;
783
+ feature_status.enhanced_session_start = { enabled: essEnabled, status: essEnabled ? 'healthy' : 'disabled' };
784
+
785
+ // context_quality_scoring: default true (enabled unless explicitly false)
786
+ const cqsEnabled = features.context_quality_scoring !== false;
787
+ feature_status.context_quality_scoring = { enabled: cqsEnabled, status: cqsEnabled ? 'healthy' : 'disabled' };
788
+
789
+ // skip_rag: default false (enabled only if explicitly true)
790
+ const srEnabled = features.skip_rag === true;
791
+ feature_status.skip_rag = { enabled: srEnabled, status: srEnabled ? 'healthy' : 'disabled' };
792
+
793
+ // ─── Phase 8 feature checks ──────────────────────────────────────────
794
+
795
+ // graduated_verification: default true; degraded if enabled but no trust data
796
+ const gvEnabled = features.graduated_verification !== false;
797
+ if (!gvEnabled) {
798
+ feature_status.graduated_verification = { enabled: false, status: 'disabled' };
799
+ } else {
800
+ const trustScoresPath = path.join(planningDir, 'trust', 'scores.json');
801
+ const hasTrustData = fs.existsSync(trustScoresPath);
802
+ feature_status.graduated_verification = {
803
+ enabled: true,
804
+ status: hasTrustData ? 'healthy' : 'degraded'
805
+ };
806
+ }
807
+
808
+ // self_verification: default true; healthy if enabled, disabled otherwise
809
+ const svEnabled = features.self_verification !== false;
810
+ feature_status.self_verification = {
811
+ enabled: svEnabled,
812
+ status: svEnabled ? 'healthy' : 'disabled'
813
+ };
814
+
815
+ // autonomy: check autonomy.level config property
816
+ const autonomyConfig = configParsed.autonomy || {};
817
+ const autonomyLevel = autonomyConfig.level || 'supervised';
818
+ const autonomyExplicit = !!(configParsed.autonomy && configParsed.autonomy.level);
819
+ feature_status.autonomy = {
820
+ enabled: true,
821
+ status: autonomyExplicit ? 'healthy' : 'degraded',
822
+ level: autonomyLevel
823
+ };
824
+
825
+ // Validate orchestrator_budget_pct range (15-50)
826
+ const budgetPct = configParsed.orchestrator_budget_pct;
827
+ if (budgetPct !== undefined) {
828
+ if (budgetPct < 15 || budgetPct > 50) {
829
+ addIssue('warning', 'W010', `orchestrator_budget_pct is ${budgetPct}, outside valid range 15-50`, 'Set to a value between 15 and 50 in config.json');
830
+ }
831
+ }
832
+
833
+ // ─── Check 10: Phase 2 feature status ──────────────────────────────────────
834
+ // inline_simple_tasks: default true, degraded if enabled but inline_max_files/inline_max_lines missing
835
+ const istEnabled = features.inline_simple_tasks !== false;
836
+ if (istEnabled) {
837
+ const hasMaxFiles = workflow.inline_max_files !== undefined &&
838
+ typeof workflow.inline_max_files === 'number' &&
839
+ workflow.inline_max_files >= 1 && workflow.inline_max_files <= 20;
840
+ const hasMaxLines = workflow.inline_max_lines !== undefined &&
841
+ typeof workflow.inline_max_lines === 'number' &&
842
+ workflow.inline_max_lines >= 10 && workflow.inline_max_lines <= 500;
843
+ if (!hasMaxFiles || !hasMaxLines) {
844
+ feature_status.inline_simple_tasks = { enabled: true, status: 'degraded' };
845
+ addIssue('warning', 'W012', 'inline_simple_tasks enabled but inline_max_files/inline_max_lines not configured or invalid', 'Add workflow.inline_max_files (1-20) and workflow.inline_max_lines (10-500) to config.json');
846
+ } else {
847
+ feature_status.inline_simple_tasks = { enabled: true, status: 'enabled' };
848
+ }
849
+ } else {
850
+ feature_status.inline_simple_tasks = { enabled: false, status: 'disabled' };
851
+ }
852
+
853
+ // rich_agent_prompts: default true, no extra validation needed
854
+ const rapEnabled = features.rich_agent_prompts !== false;
855
+ feature_status.rich_agent_prompts = { enabled: rapEnabled, status: rapEnabled ? 'enabled' : 'disabled' };
856
+
857
+ // multi_phase_awareness: default true, degraded if enabled but max_phases_in_context missing
858
+ const mpaEnabled = features.multi_phase_awareness !== false;
859
+ if (mpaEnabled) {
860
+ const hasMaxPhases = workflow.max_phases_in_context !== undefined &&
861
+ typeof workflow.max_phases_in_context === 'number' &&
862
+ workflow.max_phases_in_context >= 1 && workflow.max_phases_in_context <= 10;
863
+ if (!hasMaxPhases) {
864
+ feature_status.multi_phase_awareness = { enabled: true, status: 'degraded' };
865
+ addIssue('warning', 'W013', 'multi_phase_awareness enabled but max_phases_in_context not configured or invalid', 'Add workflow.max_phases_in_context (1-10) to config.json');
866
+ } else {
867
+ feature_status.multi_phase_awareness = { enabled: true, status: 'enabled' };
868
+ }
869
+ } else {
870
+ feature_status.multi_phase_awareness = { enabled: false, status: 'disabled' };
871
+ }
872
+ } catch (_e) { /* config parse errors handled in Check 5 */ }
873
+ }
874
+
875
+ // ─── Check 11: Phase 05 feature status ────────────────────────────────────
876
+ {
877
+ let p05Config = {};
878
+ try { p05Config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); } catch (_) {}
879
+ var phase05_features = checkPhase05Features(planningDir, p05Config);
880
+ }
881
+
882
+ // ─── Check 12: Trust tracking health ──────────────────────────────────────
883
+ {
884
+ let config = {};
885
+ try { config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); } catch (_) {}
886
+
887
+ if (config.features && config.features.trust_tracking === false) {
888
+ addIssue('info', 'I-TRUST-DISABLED', 'trust_tracking is disabled in config', 'Enable features.trust_tracking in config.json if desired');
889
+ } else {
890
+ const trustFile = path.join(planningDir, 'trust', 'agent-scores.json');
891
+ if (!fs.existsSync(trustFile)) {
892
+ addIssue('info', 'I-TRUST-DEGRADED', 'trust_tracking: degraded — agent-scores.json missing. Will populate after first verification.', 'Run a build cycle to generate trust data');
893
+ } else {
894
+ try {
895
+ const scores = JSON.parse(fs.readFileSync(trustFile, 'utf-8'));
896
+ const agents = Object.keys(scores);
897
+ let totalOutcomes = 0;
898
+ for (const agent of agents) {
899
+ for (const cat of Object.values(scores[agent])) {
900
+ totalOutcomes += (cat.pass || 0) + (cat.fail || 0);
901
+ }
902
+ }
903
+ addIssue('info', 'I-TRUST-HEALTHY', `trust_tracking: healthy — ${agents.length} agents, ${totalOutcomes} outcomes tracked`, '');
904
+ } catch (_) {
905
+ addIssue('info', 'I-TRUST-DEGRADED', 'trust_tracking: degraded — agent-scores.json exists but is malformed', 'Delete .planning/trust/agent-scores.json to reset');
906
+ }
907
+ }
908
+ }
909
+
910
+ if (config.features && config.features.confidence_calibration === false) {
911
+ addIssue('info', 'I-CONFIDENCE-DISABLED', 'confidence_calibration is disabled in config', 'Enable features.confidence_calibration in config.json if desired');
912
+ } else {
913
+ const trustFile = path.join(planningDir, 'trust', 'agent-scores.json');
914
+ if (!fs.existsSync(trustFile)) {
915
+ addIssue('info', 'I-CONFIDENCE-DEGRADED', 'confidence_calibration: degraded — no trust data available', 'Run a build cycle to generate trust data');
916
+ } else {
917
+ try {
918
+ JSON.parse(fs.readFileSync(trustFile, 'utf-8'));
919
+ addIssue('info', 'I-CONFIDENCE-HEALTHY', 'confidence_calibration: healthy — trust data available for calibration', '');
920
+ } catch (_) {
921
+ addIssue('info', 'I-CONFIDENCE-DEGRADED', 'confidence_calibration: degraded — trust data malformed', 'Delete .planning/trust/agent-scores.json to reset');
922
+ }
923
+ }
924
+ }
925
+ }
926
+
927
+ // ─── Check 13: Architecture graph feature health ──────────────────────────
928
+ try {
929
+ const graph = require('./graph.cjs');
930
+ const graphHealth = graph.graphHealthCheck(planningDir);
931
+ const guardHealth = graph.guardHealthCheck(planningDir);
932
+ feature_status.architecture_graph = graphHealth;
933
+ feature_status.architecture_guard = guardHealth;
934
+ } catch (_e) { /* graph module not available — skip */ }
935
+
936
+ // ─── Check 14: Phase 15 DX feature health ────────────────────────────────
937
+ {
938
+ let p15Config = {};
939
+ try { p15Config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); } catch (_) {}
940
+ const p15Features = (p15Config && p15Config.features) || {};
941
+
942
+ const checkDxFeature = (featureName, modulePath, exportName) => {
943
+ const enabled = p15Features[featureName] !== false; // default true
944
+ if (!enabled) {
945
+ return { enabled: false, status: 'disabled', detail: 'Feature disabled in config' };
946
+ }
947
+ try {
948
+ const mod = require(modulePath);
949
+ if (typeof mod[exportName] === 'function') {
950
+ // Attempt a lightweight invocation to confirm operational
951
+ const result = mod[exportName](planningDir, p15Config);
952
+ const operational = result && result.enabled !== false;
953
+ return {
954
+ enabled: true,
955
+ status: operational ? 'healthy' : 'degraded',
956
+ detail: operational ? `${exportName} returned data` : 'Module returned disabled stub',
957
+ };
958
+ }
959
+ return { enabled: true, status: 'degraded', detail: `${exportName} not a function` };
960
+ } catch (err) {
961
+ return { enabled: true, status: 'degraded', detail: `Error: ${err.message}` };
962
+ }
963
+ };
964
+
965
+ feature_status.progress_visualization = checkDxFeature(
966
+ 'progress_visualization',
967
+ path.join(__dirname, 'progress-visualization.cjs'),
968
+ 'getProgressData'
969
+ );
970
+ feature_status.contextual_help = checkDxFeature(
971
+ 'contextual_help',
972
+ path.join(__dirname, 'contextual-help.cjs'),
973
+ 'getContextualHelp'
974
+ );
975
+ feature_status.team_onboarding = checkDxFeature(
976
+ 'team_onboarding',
977
+ path.join(__dirname, 'onboarding-generator.cjs'),
978
+ 'generateOnboardingGuide'
979
+ );
980
+ }
981
+
982
+ // ─── Check 15: Phase 14 Quality & Safety feature health ───────────────────
983
+ {
984
+ let p14Config = {};
985
+ try { p14Config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); } catch (_) {}
986
+
987
+ const p14Features = p14Config.features || {};
988
+
989
+ // Helper: check a feature module loads correctly
990
+ const checkFeatureHealth = (featureName, configEnabled, modulePath, validationFn) => {
991
+ if (!configEnabled) {
992
+ addIssue('info', `I-${featureName.toUpperCase()}-DISABLED`, `${featureName}: disabled`, `Enable features.${featureName} in config.json if desired`);
993
+ return { enabled: false, status: 'disabled' };
994
+ }
995
+ try {
996
+ const mod = require(modulePath);
997
+ const isValid = validationFn(mod);
998
+ if (isValid) {
999
+ return { enabled: true, status: 'healthy' };
1000
+ }
1001
+ addIssue('warning', `W-${featureName.toUpperCase()}-DEGRADED`, `${featureName}: degraded (module validation failed)`, `Check ${modulePath} exports`);
1002
+ return { enabled: true, status: 'degraded' };
1003
+ } catch (_e) {
1004
+ addIssue('warning', `W-${featureName.toUpperCase()}-DEGRADED`, `${featureName}: degraded (module load failed)`, `Ensure ${modulePath} exists and is valid`);
1005
+ return { enabled: true, status: 'degraded' };
1006
+ }
1007
+ };
1008
+
1009
+ // multi_layer_validation: default false
1010
+ const mlvEnabled = p14Features.multi_layer_validation === true;
1011
+ const mlvModPath = path.join(__dirname, 'validation.cjs');
1012
+ const mlvHealth = checkFeatureHealth(
1013
+ 'multi_layer_validation',
1014
+ mlvEnabled,
1015
+ mlvModPath,
1016
+ (mod) => mod.PASS_DEFINITIONS && Object.keys(mod.PASS_DEFINITIONS).length > 0
1017
+ );
1018
+ if (mlvHealth.status === 'healthy') {
1019
+ try {
1020
+ const vlMod = require(mlvModPath);
1021
+ const passCount = Object.keys(vlMod.PASS_DEFINITIONS).length;
1022
+ addIssue('info', 'I-MLV-HEALTHY', `multi_layer_validation: healthy (${passCount} passes configured)`, '');
1023
+ } catch (_) {}
1024
+ }
1025
+ feature_status.multi_layer_validation = mlvHealth;
1026
+
1027
+ // regression_prevention: default true
1028
+ const rpEnabled = p14Features.regression_prevention !== false;
1029
+ const rpModPath = path.join(__dirname, 'test-selection.cjs');
1030
+ const rpHealth = checkFeatureHealth(
1031
+ 'regression_prevention',
1032
+ rpEnabled,
1033
+ rpModPath,
1034
+ (mod) => typeof mod.selectTests === 'function'
1035
+ );
1036
+ if (rpHealth.status === 'healthy') {
1037
+ addIssue('info', 'I-RP-HEALTHY', 'regression_prevention: healthy', '');
1038
+ }
1039
+ feature_status.regression_prevention = rpHealth;
1040
+
1041
+ // security_scanning: default true
1042
+ const ssEnabled = p14Features.security_scanning !== false;
1043
+ const ssModPath = path.join(__dirname, 'security-scan.cjs');
1044
+ const ssHealth = checkFeatureHealth(
1045
+ 'security_scanning',
1046
+ ssEnabled,
1047
+ ssModPath,
1048
+ (mod) => Array.isArray(mod.SECURITY_RULES) && mod.SECURITY_RULES.length > 0
1049
+ );
1050
+ if (ssHealth.status === 'healthy') {
1051
+ try {
1052
+ const ssMod = require(ssModPath);
1053
+ const ruleCount = ssMod.SECURITY_RULES.length;
1054
+ addIssue('info', 'I-SS-HEALTHY', `security_scanning: healthy (${ruleCount} rules loaded)`, '');
1055
+ } catch (_) {}
1056
+ }
1057
+ feature_status.security_scanning = ssHealth;
1058
+ }
1059
+
1060
+ // ─── Check 16: Phase 11 Spec-Driven Development feature health ───────────
1061
+ {
1062
+ let p11Config = {};
1063
+ try { p11Config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); } catch (_) {}
1064
+ const p11Features = p11Config.features || {};
1065
+
1066
+ const checkSpecFeatureHealth = (featureName, defaultEnabled, modulePath, exportName) => {
1067
+ const isEnabled = p11Features[featureName] === undefined ? defaultEnabled : p11Features[featureName];
1068
+ if (!isEnabled) {
1069
+ return { status: 'disabled', enabled: false, details: 'Feature toggle off' };
1070
+ }
1071
+ try {
1072
+ const mod = require(modulePath);
1073
+ if (typeof mod[exportName] === 'function') {
1074
+ return { status: 'healthy', enabled: true, details: `${exportName} loaded` };
1075
+ }
1076
+ return { status: 'degraded', enabled: true, details: `${exportName} not a function` };
1077
+ } catch (_e) {
1078
+ return { status: 'degraded', enabled: true, details: `Cannot load module: ${_e.message}` };
1079
+ }
1080
+ };
1081
+
1082
+ feature_status.machine_executable_plans = checkSpecFeatureHealth(
1083
+ 'machine_executable_plans', false, path.join(__dirname, 'spec-engine.cjs'), 'parsePlanToSpec'
1084
+ );
1085
+ feature_status.spec_diffing = checkSpecFeatureHealth(
1086
+ 'spec_diffing', true, path.join(__dirname, 'spec-diff.cjs'), 'diffSpecs'
1087
+ );
1088
+ feature_status.reverse_spec = checkSpecFeatureHealth(
1089
+ 'reverse_spec', true, path.join(__dirname, 'reverse-spec.cjs'), 'generateReverseSpec'
1090
+ );
1091
+ feature_status.predictive_impact = checkSpecFeatureHealth(
1092
+ 'predictive_impact', true, path.join(__dirname, 'impact-analysis.cjs'), 'analyzeImpact'
1093
+ );
1094
+ }
1095
+
1096
+ // ─── Check 17: Phase 16 cross-project intelligence feature health ────────
1097
+ {
1098
+ let p16Config = {};
1099
+ try { p16Config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); } catch (_) {}
1100
+ const p16Features = p16Config.features || {};
1101
+
1102
+ // Helper: check if a feature is enabled (default true unless explicitly false)
1103
+ const checkFeatureToggle = (key, healthCheck) => {
1104
+ const enabled = p16Features[key] !== false;
1105
+ if (!enabled) {
1106
+ return { enabled: false, status: 'disabled' };
1107
+ }
1108
+ return { enabled: true, status: healthCheck() ? 'healthy' : 'degraded' };
1109
+ };
1110
+
1111
+ // cross_project_patterns: healthy if ~/.claude/patterns/ exists and has .json files
1112
+ feature_status.cross_project_patterns = checkFeatureToggle(
1113
+ 'cross_project_patterns',
1114
+ () => {
1115
+ try {
1116
+ const patternsDir = require('path').join(require('os').homedir(), '.claude', 'patterns');
1117
+ return fs.existsSync(patternsDir) &&
1118
+ fs.readdirSync(patternsDir).some(f => f.endsWith('.json'));
1119
+ } catch (_) { return false; }
1120
+ }
1121
+ );
1122
+
1123
+ // spec_templates: always healthy when enabled (built-in templates always available)
1124
+ feature_status.spec_templates = checkFeatureToggle(
1125
+ 'spec_templates',
1126
+ () => true
1127
+ );
1128
+
1129
+ // global_learnings: healthy if ~/.claude/learnings.jsonl exists
1130
+ feature_status.global_learnings = checkFeatureToggle(
1131
+ 'global_learnings',
1132
+ () => {
1133
+ try {
1134
+ const learningsPath = require('path').join(require('os').homedir(), '.claude', 'learnings.jsonl');
1135
+ return fs.existsSync(learningsPath);
1136
+ } catch (_) { return false; }
1137
+ }
1138
+ );
1139
+ }
1140
+
1141
+ // ─── Check 18: Phase 3 (zero-friction) feature status ────────────────────
1142
+ {
1143
+ let p3Config = {};
1144
+ try { p3Config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); } catch (_) {}
1145
+ const p3Features = p3Config.features || {};
1146
+
1147
+ const zfqEnabled = p3Features.zero_friction_quick !== false;
1148
+ feature_status.zero_friction_quick = {
1149
+ enabled: zfqEnabled,
1150
+ status: zfqEnabled ? 'healthy' : 'disabled',
1151
+ };
1152
+ }
1153
+
1154
+ // ─── Check 19: Phase 4 (NL routing) feature status ───────────────────────
1155
+ {
1156
+ let p4Config = {};
1157
+ try { p4Config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); } catch (_) {}
1158
+ const p4Features = p4Config.features || {};
1159
+ const pluginRoot = path.resolve(__dirname, '..', '..', '..', 'plugins', 'pbr');
1160
+
1161
+ // natural_language_routing: default true; try to load module
1162
+ const nlrEnabled = p4Features.natural_language_routing !== false;
1163
+ if (!nlrEnabled) {
1164
+ feature_status.natural_language_routing = { enabled: false, status: 'disabled' };
1165
+ } else {
1166
+ try {
1167
+ require(path.join(pluginRoot, 'scripts', 'lib', 'alternatives.js'));
1168
+ feature_status.natural_language_routing = { enabled: true, status: 'healthy' };
1169
+ } catch (_e) {
1170
+ feature_status.natural_language_routing = { enabled: true, status: 'degraded' };
1171
+ }
1172
+ }
1173
+
1174
+ // adaptive_ceremony: default true; workflow-only feature, no module
1175
+ const acEnabled = p4Features.adaptive_ceremony !== false;
1176
+ feature_status.adaptive_ceremony = {
1177
+ enabled: acEnabled,
1178
+ status: acEnabled ? 'healthy' : 'disabled',
1179
+ };
1180
+ }
1181
+
1182
+ // ─── Check 20: Phase 6 (convention memory) feature status ────────────────
1183
+ {
1184
+ let p6Config = {};
1185
+ try { p6Config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); } catch (_) {}
1186
+ const p6Features = p6Config.features || {};
1187
+ const pluginRoot = path.resolve(__dirname, '..', '..', '..', 'plugins', 'pbr');
1188
+
1189
+ // convention_memory: default true; try to load module
1190
+ const cmEnabled = p6Features.convention_memory !== false;
1191
+ if (!cmEnabled) {
1192
+ feature_status.convention_memory = { enabled: false, status: 'disabled' };
1193
+ } else {
1194
+ try {
1195
+ require(path.join(pluginRoot, 'scripts', 'lib', 'convention-detector.js'));
1196
+ feature_status.convention_memory = { enabled: true, status: 'healthy' };
1197
+ } catch (_e) {
1198
+ feature_status.convention_memory = { enabled: true, status: 'degraded' };
1199
+ }
1200
+ }
1201
+
1202
+ // mental_model_snapshots: default true; try to load module
1203
+ const mmsEnabled = p6Features.mental_model_snapshots !== false;
1204
+ if (!mmsEnabled) {
1205
+ feature_status.mental_model_snapshots = { enabled: false, status: 'disabled' };
1206
+ } else {
1207
+ try {
1208
+ require(path.join(pluginRoot, 'scripts', 'lib', 'snapshot-manager.js'));
1209
+ feature_status.mental_model_snapshots = { enabled: true, status: 'healthy' };
1210
+ } catch (_e) {
1211
+ feature_status.mental_model_snapshots = { enabled: true, status: 'degraded' };
1212
+ }
1213
+ }
1214
+ }
1215
+
1216
+ // ─── Check 21: Phase 9 (proactive intelligence) feature status ───────────
1217
+ {
1218
+ let p9Config = {};
1219
+ try { p9Config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); } catch (_) {}
1220
+ const scriptsDir = path.resolve(__dirname, '..', '..', '..', 'plugins', 'pbr', 'scripts');
1221
+ const { checkFeatureHealth: checkPhase9FeatureHealth } = require('./health.cjs');
1222
+ const phase9Features = [
1223
+ 'smart_next_task',
1224
+ 'dependency_break_detection',
1225
+ 'pre_research',
1226
+ 'pattern_routing',
1227
+ 'tech_debt_surfacing',
1228
+ ];
1229
+ for (const name of phase9Features) {
1230
+ const result = checkPhase9FeatureHealth(name, p9Config, scriptsDir);
1231
+ feature_status[name] = { enabled: result.status !== 'disabled', status: result.status };
1232
+ }
1233
+ }
1234
+
1235
+ // ─── Check 22: Phase 10 (post-hoc) feature status ────────────────────────
1236
+ {
1237
+ const p10ModPath = path.resolve(__dirname, '..', '..', '..', 'plugins', 'pbr', 'scripts', 'lib', 'health-checks.js');
1238
+ try {
1239
+ const p10Checks = require(p10ModPath);
1240
+ const postHocResult = p10Checks.checkPostHocArtifacts(planningDir);
1241
+ feature_status.post_hoc_artifacts = {
1242
+ enabled: postHocResult.enabled,
1243
+ status: postHocResult.status,
1244
+ };
1245
+ const feedbackResult = p10Checks.checkAgentFeedbackLoop(planningDir);
1246
+ feature_status.agent_feedback_loop = {
1247
+ enabled: feedbackResult.enabled,
1248
+ status: feedbackResult.status,
1249
+ };
1250
+ const metricsResult = p10Checks.checkSessionMetrics(planningDir);
1251
+ feature_status.session_metrics = {
1252
+ enabled: metricsResult.enabled,
1253
+ status: metricsResult.status,
1254
+ };
1255
+ } catch (_e) {
1256
+ // health-checks.js not available — mark all as degraded
1257
+ feature_status.post_hoc_artifacts = { enabled: true, status: 'degraded' };
1258
+ feature_status.agent_feedback_loop = { enabled: true, status: 'degraded' };
1259
+ feature_status.session_metrics = { enabled: true, status: 'degraded' };
1260
+ }
1261
+ }
1262
+
1263
+ // ─── Check 23: Phase 13 (multi-agent) feature status ─────────────────────
1264
+ {
1265
+ let p13Config = {};
1266
+ try { p13Config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); } catch (_) {}
1267
+ const { checkMultiAgentHealth } = require('./health.cjs');
1268
+ const multiAgentResults = checkMultiAgentHealth(p13Config);
1269
+ for (const result of multiAgentResults) {
1270
+ feature_status[result.feature] = {
1271
+ enabled: result.status !== 'disabled',
1272
+ status: result.status,
1273
+ };
1274
+ }
1275
+ }
1276
+
1277
+ // ─── Perform repairs if requested ─────────────────────────────────────────
1278
+ const repairActions = [];
1279
+ if (options.repair && repairs.length > 0) {
1280
+ for (const repair of repairs) {
1281
+ try {
1282
+ switch (repair) {
1283
+ case 'createConfig':
1284
+ case 'resetConfig': {
1285
+ const defaults = {
1286
+ model_profile: 'balanced',
1287
+ commit_docs: true,
1288
+ search_gitignored: false,
1289
+ branching_strategy: 'none',
1290
+ research: true,
1291
+ plan_checker: true,
1292
+ verifier: true,
1293
+ parallelization: true,
1294
+ };
1295
+ fs.writeFileSync(configPath, JSON.stringify(defaults, null, 2), 'utf-8');
1296
+ repairActions.push({ action: repair, success: true, path: 'config.json' });
1297
+ break;
1298
+ }
1299
+ case 'regenerateState': {
1300
+ // Create timestamped backup before overwriting
1301
+ if (fs.existsSync(statePath)) {
1302
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
1303
+ const backupPath = `${statePath}.bak-${timestamp}`;
1304
+ fs.copyFileSync(statePath, backupPath);
1305
+ repairActions.push({ action: 'backupState', success: true, path: backupPath });
1306
+ }
1307
+ // Generate minimal STATE.md from ROADMAP.md structure
1308
+ const milestone = getMilestoneInfo(cwd);
1309
+ let stateContent = `# Session State\n\n`;
1310
+ stateContent += `## Project Reference\n\n`;
1311
+ stateContent += `See: .planning/PROJECT.md\n\n`;
1312
+ stateContent += `## Position\n\n`;
1313
+ stateContent += `**Milestone:** ${milestone.version} ${milestone.name}\n`;
1314
+ stateContent += `**Current phase:** (determining...)\n`;
1315
+ stateContent += `**Status:** Resuming\n\n`;
1316
+ stateContent += `## Session Log\n\n`;
1317
+ stateContent += `- ${new Date().toISOString().split('T')[0]}: STATE.md regenerated by /pbr:health --repair\n`;
1318
+ fs.writeFileSync(statePath, stateContent, 'utf-8');
1319
+ repairActions.push({ action: repair, success: true, path: 'STATE.md' });
1320
+ break;
1321
+ }
1322
+ case 'addNyquistKey': {
1323
+ if (fs.existsSync(configPath)) {
1324
+ try {
1325
+ const configRaw = fs.readFileSync(configPath, 'utf-8');
1326
+ const configParsed = JSON.parse(configRaw);
1327
+ if (!configParsed.workflow) configParsed.workflow = {};
1328
+ if (configParsed.workflow.nyquist_validation === undefined) {
1329
+ configParsed.workflow.nyquist_validation = true;
1330
+ fs.writeFileSync(configPath, JSON.stringify(configParsed, null, 2), 'utf-8');
1331
+ }
1332
+ repairActions.push({ action: repair, success: true, path: 'config.json' });
1333
+ } catch (err) {
1334
+ repairActions.push({ action: repair, success: false, error: err.message });
1335
+ }
1336
+ }
1337
+ break;
1338
+ }
1339
+ }
1340
+ } catch (err) {
1341
+ repairActions.push({ action: repair, success: false, error: err.message });
1342
+ }
1343
+ }
1344
+ }
1345
+
1346
+ // ─── Determine overall status ─────────────────────────────────────────────
1347
+ let status;
1348
+ if (errors.length > 0) {
1349
+ status = 'broken';
1350
+ } else if (warnings.length > 0) {
1351
+ status = 'degraded';
1352
+ } else {
1353
+ status = 'healthy';
1354
+ }
1355
+
1356
+ const repairableCount = errors.filter(e => e.repairable).length +
1357
+ warnings.filter(w => w.repairable).length;
1358
+
1359
+ output({
1360
+ status,
1361
+ errors,
1362
+ warnings,
1363
+ info,
1364
+ repairable_count: repairableCount,
1365
+ repairs_performed: repairActions.length > 0 ? repairActions : undefined,
1366
+ feature_status: Object.keys(feature_status).length > 0 ? feature_status : undefined,
1367
+ phase05_features: phase05_features || undefined,
1368
+ }, raw);
1369
+ }
1370
+
1371
+ /**
1372
+ * Generic health check for a feature backed by a loadable module.
1373
+ * @param {string} featureName - Feature name (e.g. 'natural_language_routing')
1374
+ * @param {string} planningDir - Path to .planning directory
1375
+ * @param {string} pluginRoot - Path to plugin root (plugins/pbr)
1376
+ * @param {string} togglePath - Dot path in config.features (same as featureName)
1377
+ * @param {string} modulePath - Relative path under pluginRoot to the module
1378
+ * @param {string} exportName - Name of the expected export function
1379
+ * @returns {{ feature: string, status: string, details: string }}
1380
+ */
1381
+ function checkFeatureModuleHealth(featureName, planningDir, pluginRoot, modulePath, exportName) {
1382
+ const configPath = path.join(planningDir, 'config.json');
1383
+ let config = {};
1384
+ try {
1385
+ if (fs.existsSync(configPath)) {
1386
+ config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
1387
+ }
1388
+ } catch (_e) {
1389
+ // Config unreadable — treat as defaults
1390
+ }
1391
+
1392
+ const features = config.features || {};
1393
+
1394
+ // Check toggle (default true)
1395
+ if (features[featureName] === false) {
1396
+ return { feature: featureName, status: 'disabled', details: 'Feature toggle off' };
1397
+ }
1398
+
1399
+ // Try to load the module
1400
+ const fullModulePath = path.join(pluginRoot, modulePath);
1401
+ try {
1402
+ const mod = require(fullModulePath);
1403
+ if (typeof mod[exportName] === 'function') {
1404
+ return { feature: featureName, status: 'healthy', details: `${exportName} loaded from ${modulePath}` };
1405
+ }
1406
+ return { feature: featureName, status: 'degraded', details: `${exportName} not a function in ${modulePath}` };
1407
+ } catch (err) {
1408
+ return { feature: featureName, status: 'degraded', details: `Cannot load ${modulePath}: ${err.message}` };
1409
+ }
1410
+ }
1411
+
1412
+ /**
1413
+ * Health check for natural_language_routing feature.
1414
+ * @param {string} planningDir - Path to .planning directory
1415
+ * @param {string} pluginRoot - Path to plugin root (plugins/pbr)
1416
+ * @returns {{ feature: string, status: string, details: string }}
1417
+ */
1418
+ function checkNLRoutingHealth(planningDir, pluginRoot) {
1419
+ return checkFeatureModuleHealth(
1420
+ 'natural_language_routing', planningDir, pluginRoot,
1421
+ path.join('scripts', 'intent-router.cjs'), 'classifyIntent'
1422
+ );
1423
+ }
1424
+
1425
+ /**
1426
+ * Health check for adaptive_ceremony feature.
1427
+ * @param {string} planningDir - Path to .planning directory
1428
+ * @param {string} pluginRoot - Path to plugin root (plugins/pbr)
1429
+ * @returns {{ feature: string, status: string, details: string }}
1430
+ */
1431
+ function checkAdaptiveCeremonyHealth(planningDir, pluginRoot) {
1432
+ return checkFeatureModuleHealth(
1433
+ 'adaptive_ceremony', planningDir, pluginRoot,
1434
+ path.join('scripts', 'risk-classifier.cjs'), 'classifyRisk'
1435
+ );
1436
+ }
1437
+
1438
+ module.exports = {
1439
+ cmdVerifySummary,
1440
+ cmdVerifyPlanStructure,
1441
+ cmdVerifyPhaseCompleteness,
1442
+ cmdVerifyReferences,
1443
+ cmdVerifyCommits,
1444
+ cmdVerifyArtifacts,
1445
+ cmdVerifyKeyLinks,
1446
+ cmdValidateConsistency,
1447
+ cmdValidateHealth,
1448
+ checkNLRoutingHealth,
1449
+ checkAdaptiveCeremonyHealth,
1450
+ checkFeatureModuleHealth,
1451
+ };