@sienklogic/plan-build-run 2.21.1 → 2.21.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (982) hide show
  1. package/CHANGELOG.md +1331 -323
  2. package/CLAUDE.md +75 -40
  3. package/LICENSE +2 -1
  4. package/README.md +412 -177
  5. package/bin/install.js +2752 -0
  6. package/dashboard/bin/cli.cjs +96 -0
  7. package/dashboard/bin/stop.cjs +129 -0
  8. package/dashboard/eslint.config.js +37 -0
  9. package/dashboard/index.html +20 -0
  10. package/dashboard/package.json +27 -25
  11. package/dashboard/server/index.js +151 -0
  12. package/dashboard/server/lib/frontmatter.js +92 -0
  13. package/dashboard/server/middleware/static.js +35 -0
  14. package/dashboard/server/package.json +16 -0
  15. package/dashboard/server/routes/agents.js +234 -0
  16. package/dashboard/server/routes/config.js +64 -0
  17. package/dashboard/server/routes/health.js +98 -0
  18. package/dashboard/server/routes/incidents.js +78 -0
  19. package/dashboard/server/routes/intel.js +69 -0
  20. package/dashboard/server/routes/memory.js +107 -0
  21. package/dashboard/server/routes/planning.js +234 -0
  22. package/dashboard/server/routes/progress.js +77 -0
  23. package/dashboard/server/routes/projects.js +36 -0
  24. package/dashboard/server/routes/requirements.js +40 -0
  25. package/dashboard/server/routes/roadmap.js +69 -0
  26. package/dashboard/server/routes/sessions.js +70 -0
  27. package/dashboard/server/routes/status.js +25 -0
  28. package/dashboard/server/routes/telemetry.js +233 -0
  29. package/dashboard/server/services/file-watcher.js +105 -0
  30. package/dashboard/server/services/planning-reader.js +727 -0
  31. package/dashboard/server/test/cli.test.js +34 -0
  32. package/dashboard/server/test/frontmatter.test.js +104 -0
  33. package/dashboard/server/test/isolation.test.js +32 -0
  34. package/dashboard/server/test/planning-reader.test.js +151 -0
  35. package/dashboard/server/test/routes.test.js +91 -0
  36. package/dashboard/server/test/ws.test.js +81 -0
  37. package/dashboard/server/ws.js +96 -0
  38. package/dashboard/src/App.jsx +165 -0
  39. package/dashboard/src/components/charts/BudgetBars.jsx +42 -0
  40. package/dashboard/src/components/charts/ContextRadar.jsx +34 -0
  41. package/dashboard/src/components/charts/PhaseDonut.jsx +66 -0
  42. package/dashboard/src/components/charts/SuccessTrend.jsx +45 -0
  43. package/dashboard/src/components/charts/TokenChart.jsx +55 -0
  44. package/dashboard/src/components/charts/index.js +5 -0
  45. package/dashboard/src/components/config/CfgSection.jsx +93 -0
  46. package/dashboard/src/components/layout/Header.jsx +89 -0
  47. package/dashboard/src/components/layout/ProjectSwitcher.jsx +160 -0
  48. package/dashboard/src/components/layout/Sidebar.jsx +161 -0
  49. package/dashboard/src/components/ui/AutoModeBanner.jsx +138 -0
  50. package/dashboard/src/components/ui/BackButton.jsx +27 -0
  51. package/dashboard/src/components/ui/Badge.jsx +27 -0
  52. package/dashboard/src/components/ui/Card.jsx +23 -0
  53. package/dashboard/src/components/ui/ChartTooltip.jsx +48 -0
  54. package/dashboard/src/components/ui/CheckpointBox.jsx +110 -0
  55. package/dashboard/src/components/ui/CodeBlock.jsx +27 -0
  56. package/dashboard/src/components/ui/ConfidenceBadge.jsx +20 -0
  57. package/dashboard/src/components/ui/ConfirmModal.jsx +161 -0
  58. package/dashboard/src/components/ui/ConnectionBanner.jsx +60 -0
  59. package/dashboard/src/components/ui/ErrorBoundary.jsx +106 -0
  60. package/dashboard/src/components/ui/ErrorBox.jsx +107 -0
  61. package/dashboard/src/components/ui/KeyValue.jsx +33 -0
  62. package/dashboard/src/components/ui/LoadingSkeleton.jsx +84 -0
  63. package/dashboard/src/components/ui/MetricCard.jsx +58 -0
  64. package/dashboard/src/components/ui/NextUpBlock.jsx +92 -0
  65. package/dashboard/src/components/ui/NumberInput.jsx +44 -0
  66. package/dashboard/src/components/ui/PBRBanner.jsx +47 -0
  67. package/dashboard/src/components/ui/PipelineView.jsx +130 -0
  68. package/dashboard/src/components/ui/ProgressBar.jsx +28 -0
  69. package/dashboard/src/components/ui/ProgressDisplay.jsx +47 -0
  70. package/dashboard/src/components/ui/QualityGateBadge.jsx +15 -0
  71. package/dashboard/src/components/ui/SectionTitle.jsx +35 -0
  72. package/dashboard/src/components/ui/SelectInput.jsx +45 -0
  73. package/dashboard/src/components/ui/StatusDot.jsx +51 -0
  74. package/dashboard/src/components/ui/StatusSymbol.jsx +49 -0
  75. package/dashboard/src/components/ui/TabBar.jsx +41 -0
  76. package/dashboard/src/components/ui/TextInput.jsx +42 -0
  77. package/dashboard/src/components/ui/Toast.jsx +117 -0
  78. package/dashboard/src/components/ui/Toggle.jsx +70 -0
  79. package/dashboard/src/components/ui/index.js +29 -0
  80. package/dashboard/src/hooks/useDocumentTitle.js +16 -0
  81. package/dashboard/src/hooks/useFetch.js +50 -0
  82. package/dashboard/src/hooks/useToast.jsx +43 -0
  83. package/dashboard/src/hooks/useWebSocket.js +103 -0
  84. package/dashboard/src/lib/api.js +112 -0
  85. package/dashboard/src/lib/configSchema.js +189 -0
  86. package/dashboard/src/lib/constants.js +22 -0
  87. package/dashboard/src/main.jsx +15 -0
  88. package/dashboard/src/pages/AgentsPage.jsx +191 -0
  89. package/dashboard/src/pages/ConfigPage.jsx +298 -0
  90. package/dashboard/src/pages/HooksPage.jsx +412 -0
  91. package/dashboard/src/pages/IncidentsPage.jsx +135 -0
  92. package/dashboard/src/pages/IntelPage.jsx +193 -0
  93. package/dashboard/src/pages/LiveFeed.jsx +274 -0
  94. package/dashboard/src/pages/MemoryPage.jsx +107 -0
  95. package/dashboard/src/pages/OnboardingPage.jsx +117 -0
  96. package/dashboard/src/pages/Overview.jsx +360 -0
  97. package/dashboard/src/pages/PhaseDetailView.jsx +216 -0
  98. package/dashboard/src/pages/PlanningPage.jsx +181 -0
  99. package/dashboard/src/pages/ProgressPage.jsx +249 -0
  100. package/dashboard/src/pages/ResearchPage.jsx +129 -0
  101. package/dashboard/src/pages/RoadmapPage.jsx +251 -0
  102. package/dashboard/src/pages/SessionsPage.jsx +117 -0
  103. package/dashboard/src/pages/Telemetry.jsx +166 -0
  104. package/dashboard/src/pages/planning/DecisionsTab.jsx +153 -0
  105. package/dashboard/src/pages/planning/FilesTab.jsx +420 -0
  106. package/dashboard/src/pages/planning/MilestoneDetail.jsx +319 -0
  107. package/dashboard/src/pages/planning/MilestonesTab.jsx +151 -0
  108. package/dashboard/src/pages/planning/NotesTab.jsx +251 -0
  109. package/dashboard/src/pages/planning/PhasesTab.jsx +218 -0
  110. package/dashboard/src/pages/planning/QuickTab.jsx +50 -0
  111. package/dashboard/src/pages/planning/ResearchTab.jsx +103 -0
  112. package/dashboard/src/pages/planning/TodosTab.jsx +297 -0
  113. package/dashboard/src/theme/ThemeProvider.jsx +38 -0
  114. package/dashboard/src/theme/tokens.js +17 -0
  115. package/dashboard/tests/components/ConfirmModal.test.jsx +179 -0
  116. package/dashboard/tests/components/ConnectionBanner.test.jsx +37 -0
  117. package/dashboard/tests/components/ErrorBoundary.test.jsx +59 -0
  118. package/dashboard/tests/components/LoadingSkeleton.test.jsx +46 -0
  119. package/dashboard/tests/components/ToastContainer.test.jsx +47 -0
  120. package/dashboard/tests/components/Toggle.test.jsx +61 -0
  121. package/dashboard/tests/hooks/useFetch.test.jsx +77 -0
  122. package/dashboard/tests/hooks/useToast.test.jsx +78 -0
  123. package/dashboard/tests/hooks/useWebSocket.test.jsx +128 -0
  124. package/dashboard/tests/pages/ConfigPage.test.jsx +199 -0
  125. package/dashboard/tests/pages/PlanningPage.test.jsx +119 -0
  126. package/dashboard/tests/pages/planning/FilesTab.test.jsx +198 -0
  127. package/dashboard/tests/pages/planning/NotesTab.test.jsx +178 -0
  128. package/dashboard/tests/pages/planning/TodosTab.test.jsx +188 -0
  129. package/dashboard/tests/performance.test.jsx +46 -0
  130. package/dashboard/tests/routes/config.test.js +98 -0
  131. package/dashboard/tests/routes/health.test.js +40 -0
  132. package/dashboard/tests/routes/planning.test.js +112 -0
  133. package/dashboard/tests/routes/roadmap.test.js +91 -0
  134. package/dashboard/tests/routes/status.test.js +131 -0
  135. package/dashboard/tests/server/planning-reader.test.js +153 -0
  136. package/dashboard/tests/setup.js +7 -0
  137. package/dashboard/vite.config.js +41 -0
  138. package/package.json +56 -41
  139. package/plan-build-run/bin/config-schema.json +1298 -0
  140. package/plugins/pbr/.claude-plugin/plugin.json +1 -1
  141. package/plugins/pbr/CLAUDE.md +19 -0
  142. package/plugins/pbr/UI-CONSISTENCY-GAPS.md +1 -1
  143. package/plugins/pbr/agents/advisor-researcher.md +101 -0
  144. package/plugins/pbr/agents/audit.md +207 -89
  145. package/plugins/pbr/agents/codebase-mapper.md +158 -23
  146. package/plugins/pbr/agents/debugger.md +210 -34
  147. package/plugins/pbr/agents/dev-sync.md +206 -0
  148. package/plugins/pbr/agents/executor.md +734 -38
  149. package/plugins/pbr/agents/general.md +69 -5
  150. package/plugins/pbr/agents/integration-checker.md +147 -31
  151. package/plugins/pbr/agents/intel-updater.md +332 -0
  152. package/plugins/pbr/agents/nyquist-auditor.md +254 -0
  153. package/plugins/pbr/agents/plan-checker.md +268 -65
  154. package/plugins/pbr/agents/planner.md +449 -41
  155. package/plugins/pbr/agents/researcher.md +218 -37
  156. package/plugins/pbr/agents/roadmapper.md +398 -0
  157. package/plugins/pbr/agents/synthesizer.md +166 -25
  158. package/plugins/pbr/agents/ui-checker.md +204 -0
  159. package/plugins/pbr/agents/ui-researcher.md +224 -0
  160. package/plugins/pbr/agents/verifier.md +570 -46
  161. package/plugins/pbr/commands/add-phase.md +75 -0
  162. package/plugins/pbr/commands/add-todo.md +8 -0
  163. package/plugins/pbr/commands/audit-fix.md +5 -0
  164. package/plugins/pbr/commands/audit-milestone.md +8 -0
  165. package/plugins/pbr/commands/autonomous.md +5 -0
  166. package/plugins/pbr/commands/backlog.md +6 -0
  167. package/plugins/pbr/commands/check-todos.md +8 -0
  168. package/plugins/pbr/commands/complete-milestone.md +8 -0
  169. package/plugins/pbr/commands/config.md +1 -1
  170. package/plugins/pbr/commands/discuss-phase.md +6 -0
  171. package/plugins/pbr/commands/execute-phase.md +6 -0
  172. package/plugins/pbr/commands/fast.md +6 -0
  173. package/plugins/pbr/commands/forensics.md +6 -0
  174. package/plugins/pbr/commands/import.md +1 -1
  175. package/plugins/pbr/commands/insert-phase.md +65 -0
  176. package/plugins/pbr/commands/intel.md +5 -0
  177. package/plugins/pbr/commands/join-discord.md +11 -0
  178. package/plugins/pbr/commands/list-phase-assumptions.md +5 -0
  179. package/plugins/pbr/commands/map-codebase.md +6 -0
  180. package/plugins/pbr/commands/milestone-summary.md +6 -0
  181. package/plugins/pbr/commands/new-milestone.md +8 -0
  182. package/plugins/pbr/commands/new-project.md +6 -0
  183. package/plugins/pbr/commands/pause-work.md +5 -0
  184. package/plugins/pbr/commands/plan-milestone-gaps.md +7 -0
  185. package/plugins/pbr/commands/plan-phase.md +6 -0
  186. package/plugins/pbr/commands/plant-seed.md +6 -0
  187. package/plugins/pbr/commands/profile-user.md +5 -0
  188. package/plugins/pbr/commands/profile.md +5 -0
  189. package/plugins/pbr/commands/progress.md +6 -0
  190. package/plugins/pbr/commands/quick.md +1 -1
  191. package/plugins/pbr/commands/reapply-patches.md +47 -0
  192. package/plugins/pbr/commands/release.md +6 -0
  193. package/plugins/pbr/commands/remove-phase.md +66 -0
  194. package/plugins/pbr/commands/research-phase.md +59 -0
  195. package/plugins/pbr/commands/resume-work.md +5 -0
  196. package/plugins/pbr/commands/seed.md +6 -0
  197. package/plugins/pbr/commands/session-report.md +5 -0
  198. package/plugins/pbr/commands/set-profile.md +6 -0
  199. package/plugins/pbr/commands/settings.md +5 -0
  200. package/plugins/pbr/commands/setup.md +1 -1
  201. package/plugins/pbr/commands/ship.md +5 -0
  202. package/plugins/pbr/commands/stats.md +6 -0
  203. package/plugins/pbr/commands/test.md +5 -0
  204. package/plugins/pbr/commands/thread.md +6 -0
  205. package/plugins/pbr/commands/todo.md +1 -1
  206. package/plugins/pbr/commands/ui-phase.md +5 -0
  207. package/plugins/pbr/commands/ui-review.md +5 -0
  208. package/plugins/pbr/commands/undo.md +5 -0
  209. package/plugins/pbr/commands/update.md +37 -0
  210. package/plugins/pbr/commands/validate-phase.md +5 -0
  211. package/plugins/pbr/commands/verify-work.md +6 -0
  212. package/plugins/pbr/dashboard/package-lock.json +6 -0
  213. package/plugins/pbr/dist/architecture-guard.js +76 -0
  214. package/plugins/pbr/dist/audit-dimensions.js +556 -0
  215. package/plugins/pbr/dist/auto-continue.js +277 -0
  216. package/plugins/pbr/dist/block-skill-self-read.js +124 -0
  217. package/plugins/pbr/dist/check-agent-state-write.js +63 -0
  218. package/plugins/pbr/dist/check-config-change.js +213 -0
  219. package/plugins/pbr/dist/check-cross-plugin-sync.js +93 -0
  220. package/plugins/pbr/dist/check-dangerous-commands.js +193 -0
  221. package/plugins/pbr/dist/check-direct-state-write.js +37 -0
  222. package/plugins/pbr/dist/check-doc-sprawl.js +102 -0
  223. package/plugins/pbr/dist/check-phase-boundary.js +191 -0
  224. package/plugins/pbr/dist/check-plan-format.js +227 -0
  225. package/plugins/pbr/dist/check-read-first.js +345 -0
  226. package/plugins/pbr/dist/check-roadmap-sync.js +507 -0
  227. package/plugins/pbr/dist/check-skill-workflow.js +354 -0
  228. package/plugins/pbr/dist/check-state-sync.js +676 -0
  229. package/plugins/pbr/dist/check-subagent-output.js +425 -0
  230. package/plugins/pbr/dist/check-summary-gate.js +188 -0
  231. package/plugins/pbr/dist/context-bridge.js +425 -0
  232. package/plugins/pbr/dist/context-budget-check.js +442 -0
  233. package/plugins/pbr/dist/context-quality.js +271 -0
  234. package/plugins/pbr/dist/enforce-context-budget.js +138 -0
  235. package/plugins/pbr/dist/enforce-pbr-workflow.js +277 -0
  236. package/plugins/pbr/dist/event-handler.js +212 -0
  237. package/plugins/pbr/dist/event-logger.js +125 -0
  238. package/plugins/pbr/dist/feedback-loop.js +155 -0
  239. package/plugins/pbr/dist/graph-update.js +422 -0
  240. package/plugins/pbr/dist/hook-logger.js +114 -0
  241. package/plugins/pbr/dist/hook-server-client.js +361 -0
  242. package/plugins/pbr/dist/hook-server.js +664 -0
  243. package/plugins/pbr/dist/hooks-schema.json +87 -0
  244. package/plugins/pbr/dist/instructions-loaded.js +173 -0
  245. package/plugins/pbr/dist/intercept-plan-mode.js +81 -0
  246. package/plugins/pbr/dist/log-notification.js +131 -0
  247. package/plugins/pbr/dist/log-subagent.js +367 -0
  248. package/plugins/pbr/dist/log-tool-failure.js +140 -0
  249. package/plugins/pbr/dist/milestone-learnings.js +519 -0
  250. package/plugins/pbr/dist/pbr-tools.js +493 -0
  251. package/plugins/pbr/dist/post-bash-triage.js +96 -0
  252. package/plugins/pbr/dist/post-compact.js +135 -0
  253. package/plugins/pbr/dist/post-hoc.js +237 -0
  254. package/plugins/pbr/dist/post-write-dispatch.js +243 -0
  255. package/plugins/pbr/dist/post-write-quality.js +208 -0
  256. package/plugins/pbr/dist/pre-bash-dispatch.js +212 -0
  257. package/plugins/pbr/dist/pre-skill-dispatch.js +114 -0
  258. package/plugins/pbr/dist/pre-task-dispatch.js +269 -0
  259. package/plugins/pbr/dist/pre-write-dispatch.js +234 -0
  260. package/plugins/pbr/dist/progress-tracker.js +173 -0
  261. package/plugins/pbr/dist/prompt-guard.js +114 -0
  262. package/plugins/pbr/dist/prompt-routing.js +209 -0
  263. package/plugins/pbr/dist/quick-status.js +179 -0
  264. package/plugins/pbr/dist/record-incident.js +37 -0
  265. package/plugins/pbr/dist/run-hook.js +132 -0
  266. package/plugins/pbr/dist/session-cleanup.js +653 -0
  267. package/plugins/pbr/dist/session-tracker.js +124 -0
  268. package/plugins/pbr/dist/status-line.js +849 -0
  269. package/plugins/pbr/dist/suggest-compact.js +307 -0
  270. package/plugins/pbr/dist/sync-context-to-claude.js +100 -0
  271. package/plugins/pbr/dist/task-completed.js +206 -0
  272. package/plugins/pbr/dist/track-context-budget.js +432 -0
  273. package/plugins/pbr/dist/track-user-gates.js +88 -0
  274. package/plugins/pbr/dist/trust-tracker.js +193 -0
  275. package/plugins/pbr/dist/validate-commit.js +233 -0
  276. package/plugins/pbr/dist/validate-skill-args.js +222 -0
  277. package/plugins/pbr/dist/validate-task.js +271 -0
  278. package/plugins/pbr/dist/worktree-create.js +144 -0
  279. package/plugins/pbr/dist/worktree-remove.js +147 -0
  280. package/plugins/pbr/hooks/hooks.json +137 -65
  281. package/plugins/pbr/references/agent-contracts.md +39 -8
  282. package/plugins/pbr/references/agent-teams.md +3 -3
  283. package/plugins/pbr/references/archive/checkpoints.md +189 -0
  284. package/plugins/pbr/references/archive/context-quality-tiers.md +45 -0
  285. package/plugins/pbr/references/archive/hook-ordering.md +89 -0
  286. package/plugins/pbr/references/archive/limitations.md +106 -0
  287. package/plugins/pbr/references/archive/pbr-rules.md +194 -0
  288. package/plugins/pbr/references/archive/pbr-tools-cli.md +415 -0
  289. package/plugins/pbr/references/archive/pretooluse-jsonl-behavior.md +58 -0
  290. package/plugins/pbr/references/archive/signal-files.md +41 -0
  291. package/plugins/pbr/references/archive/tmux-setup.md +288 -0
  292. package/plugins/pbr/references/archive/verification-matrix.md +34 -0
  293. package/plugins/pbr/references/archive/verification-patterns.md +277 -0
  294. package/plugins/pbr/references/archive/worktree-sparse-checkout.md +86 -0
  295. package/plugins/pbr/references/assumptions.md +42 -0
  296. package/plugins/pbr/references/checkpoints.md +723 -104
  297. package/plugins/pbr/references/config-reference.md +387 -10
  298. package/plugins/pbr/references/continuation-format.md +1 -0
  299. package/plugins/pbr/references/decimal-phase-calculation.md +65 -0
  300. package/plugins/pbr/references/deviation-rules.md +12 -0
  301. package/plugins/pbr/references/few-shot-examples/audit.md +77 -0
  302. package/plugins/pbr/references/few-shot-examples/check-plan-format.md +172 -0
  303. package/plugins/pbr/references/few-shot-examples/check-subagent-output.md +118 -0
  304. package/plugins/pbr/references/few-shot-examples/integration-checker.md +70 -0
  305. package/plugins/pbr/references/few-shot-examples/nyquist-auditor.md +83 -0
  306. package/plugins/pbr/references/few-shot-examples/plan-checker.md +73 -0
  307. package/plugins/pbr/references/few-shot-examples/ui-checker.md +71 -0
  308. package/plugins/pbr/references/few-shot-examples/verifier.md +109 -0
  309. package/plugins/pbr/references/git-integration.md +110 -27
  310. package/plugins/pbr/references/git-planning-commit.md +35 -0
  311. package/plugins/pbr/references/model-profile-resolution.md +34 -0
  312. package/plugins/pbr/references/model-profiles.md +90 -7
  313. package/plugins/pbr/references/model-selection.md +1 -1
  314. package/plugins/pbr/references/node-repair.md +48 -0
  315. package/plugins/pbr/references/plan-authoring.md +65 -0
  316. package/plugins/pbr/references/plan-format.md +184 -10
  317. package/plugins/pbr/references/questioning.md +138 -49
  318. package/plugins/pbr/references/reading-verification.md +4 -4
  319. package/plugins/pbr/references/tdd.md +263 -0
  320. package/plugins/pbr/references/thinking-models-planning.md +47 -0
  321. package/plugins/pbr/references/thinking-models-verification.md +44 -0
  322. package/plugins/pbr/references/ui-brand.md +449 -0
  323. package/plugins/pbr/references/verification-overrides.md +39 -0
  324. package/plugins/pbr/references/verification-patterns.md +529 -113
  325. package/plugins/pbr/scripts/architecture-guard.js +76 -0
  326. package/plugins/pbr/scripts/audit-checks/behavioral-compliance.js +2098 -0
  327. package/plugins/pbr/scripts/audit-checks/error-analysis.js +989 -0
  328. package/plugins/pbr/scripts/audit-checks/feature-verification.js +723 -0
  329. package/plugins/pbr/scripts/audit-checks/index.js +433 -0
  330. package/plugins/pbr/scripts/audit-checks/infrastructure.js +816 -0
  331. package/plugins/pbr/scripts/audit-checks/quality-metrics.js +455 -0
  332. package/plugins/pbr/scripts/audit-checks/session-quality.js +980 -0
  333. package/plugins/pbr/scripts/audit-checks/si-agent-hook-config-checks.js +396 -0
  334. package/plugins/pbr/scripts/audit-checks/si-cross-cutting-checks.js +272 -0
  335. package/plugins/pbr/scripts/audit-checks/si-skill-checks.js +424 -0
  336. package/plugins/pbr/scripts/audit-checks/workflow-compliance.js +1175 -0
  337. package/plugins/pbr/scripts/audit-dimensions.js +556 -0
  338. package/plugins/pbr/scripts/auto-continue.js +192 -37
  339. package/plugins/pbr/scripts/block-skill-self-read.js +124 -0
  340. package/plugins/pbr/scripts/check-agent-state-write.js +63 -0
  341. package/plugins/pbr/scripts/check-config-change.js +84 -1
  342. package/plugins/pbr/scripts/check-cross-plugin-sync.js +93 -0
  343. package/plugins/pbr/scripts/check-dangerous-commands.js +18 -5
  344. package/plugins/pbr/scripts/check-direct-state-write.js +37 -0
  345. package/plugins/pbr/scripts/check-phase-boundary.js +3 -2
  346. package/plugins/pbr/scripts/check-plan-format.js +153 -354
  347. package/plugins/pbr/scripts/check-read-first.js +345 -0
  348. package/plugins/pbr/scripts/check-roadmap-sync.js +174 -19
  349. package/plugins/pbr/scripts/check-skill-workflow.js +21 -16
  350. package/plugins/pbr/scripts/check-state-sync.js +352 -220
  351. package/plugins/pbr/scripts/check-subagent-output.js +296 -333
  352. package/plugins/pbr/scripts/check-summary-gate.js +5 -15
  353. package/plugins/pbr/scripts/commands/benchmarks.js +195 -0
  354. package/plugins/pbr/scripts/commands/calibrate.js +530 -0
  355. package/plugins/pbr/scripts/commands/config.js +72 -0
  356. package/plugins/pbr/scripts/commands/misc.js +779 -0
  357. package/plugins/pbr/scripts/commands/phase.js +293 -0
  358. package/plugins/pbr/scripts/commands/roadmap.js +75 -0
  359. package/plugins/pbr/scripts/commands/state.js +84 -0
  360. package/plugins/pbr/scripts/commands/stress-test.js +349 -0
  361. package/plugins/pbr/scripts/commands/todo.js +191 -0
  362. package/plugins/pbr/scripts/commands/verify.js +169 -0
  363. package/plugins/pbr/scripts/config-schema.json +1183 -95
  364. package/plugins/pbr/scripts/context-bridge.js +425 -0
  365. package/plugins/pbr/scripts/context-budget-check.js +171 -16
  366. package/plugins/pbr/scripts/context-quality.js +271 -0
  367. package/plugins/pbr/scripts/enforce-context-budget.js +138 -0
  368. package/plugins/pbr/scripts/enforce-pbr-workflow.js +277 -0
  369. package/plugins/pbr/scripts/event-handler.js +137 -87
  370. package/plugins/pbr/scripts/event-logger.js +58 -25
  371. package/plugins/pbr/scripts/feedback-loop.js +155 -0
  372. package/plugins/pbr/scripts/graph-update.js +422 -0
  373. package/plugins/pbr/scripts/hook-logger.js +69 -35
  374. package/plugins/pbr/scripts/hook-server-client.js +361 -0
  375. package/plugins/pbr/scripts/hook-server.js +664 -0
  376. package/plugins/pbr/scripts/hooks-schema.json +12 -5
  377. package/plugins/pbr/scripts/instructions-loaded.js +173 -0
  378. package/plugins/pbr/scripts/intent-router.cjs +147 -0
  379. package/plugins/pbr/scripts/intercept-plan-mode.js +52 -18
  380. package/plugins/pbr/scripts/lib/alternatives.js +203 -0
  381. package/plugins/pbr/scripts/lib/audit.js +65 -0
  382. package/plugins/pbr/scripts/lib/auto-cleanup.js +221 -0
  383. package/plugins/pbr/scripts/lib/auto-verify.js +123 -0
  384. package/plugins/pbr/scripts/lib/benchmark.js +190 -0
  385. package/plugins/pbr/scripts/lib/build.js +719 -0
  386. package/plugins/pbr/scripts/lib/ci-fix-loop.js +228 -0
  387. package/plugins/pbr/scripts/lib/commands.js +483 -0
  388. package/plugins/pbr/scripts/lib/compound.js +222 -0
  389. package/plugins/pbr/scripts/lib/config-cache.js +83 -0
  390. package/plugins/pbr/scripts/lib/config.js +1469 -0
  391. package/plugins/pbr/scripts/lib/context.js +254 -0
  392. package/plugins/pbr/scripts/lib/contextual-help.js +183 -0
  393. package/plugins/pbr/scripts/lib/convention-detector.js +413 -0
  394. package/plugins/pbr/scripts/lib/core.js +1585 -0
  395. package/plugins/pbr/scripts/lib/dashboard-launch.js +364 -0
  396. package/plugins/pbr/scripts/lib/data-hygiene.js +179 -0
  397. package/plugins/pbr/scripts/lib/decision-extraction.js +183 -0
  398. package/plugins/pbr/scripts/lib/decisions.js +194 -0
  399. package/plugins/pbr/scripts/lib/dependency-break.js +147 -0
  400. package/plugins/pbr/scripts/lib/format-validators.js +1049 -0
  401. package/plugins/pbr/scripts/lib/frontmatter.js +302 -0
  402. package/plugins/pbr/scripts/lib/gates/advisories.js +133 -0
  403. package/plugins/pbr/scripts/lib/gates/build-dependency.js +118 -0
  404. package/plugins/pbr/scripts/lib/gates/build-executor.js +106 -0
  405. package/plugins/pbr/scripts/lib/gates/doc-existence.js +46 -0
  406. package/plugins/pbr/scripts/lib/gates/helpers.js +98 -0
  407. package/plugins/pbr/scripts/lib/gates/inline-execution.js +187 -0
  408. package/plugins/pbr/scripts/lib/gates/milestone-complete.js +139 -0
  409. package/plugins/pbr/scripts/lib/gates/milestone-summary.js +121 -0
  410. package/plugins/pbr/scripts/lib/gates/multi-phase-loader.js +149 -0
  411. package/plugins/pbr/scripts/lib/gates/plan-executor.js +36 -0
  412. package/plugins/pbr/scripts/lib/gates/plan-validation.js +115 -0
  413. package/plugins/pbr/scripts/lib/gates/quick-executor.js +78 -0
  414. package/plugins/pbr/scripts/lib/gates/review-planner.js +63 -0
  415. package/plugins/pbr/scripts/lib/gates/review-verifier.js +71 -0
  416. package/plugins/pbr/scripts/lib/gates/rich-agent-context.js +148 -0
  417. package/plugins/pbr/scripts/lib/gates/sprint-preflight.js +30 -0
  418. package/plugins/pbr/scripts/lib/gates/user-confirmation.js +95 -0
  419. package/plugins/pbr/scripts/lib/graph-cli.js +89 -0
  420. package/plugins/pbr/scripts/lib/graph.js +553 -0
  421. package/plugins/pbr/scripts/lib/handoff-validators.js +224 -0
  422. package/plugins/pbr/scripts/lib/health-checks.js +107 -0
  423. package/plugins/pbr/scripts/lib/health-phase06.js +120 -0
  424. package/plugins/pbr/scripts/lib/health.js +132 -0
  425. package/plugins/pbr/scripts/lib/help.js +100 -0
  426. package/plugins/pbr/scripts/lib/history.js +150 -0
  427. package/plugins/pbr/scripts/lib/impact-analysis.js +319 -0
  428. package/plugins/pbr/scripts/lib/incidents.js +190 -0
  429. package/plugins/pbr/scripts/lib/init.js +643 -0
  430. package/plugins/pbr/scripts/lib/insights-parser.js +320 -0
  431. package/plugins/pbr/scripts/lib/intel.js +653 -0
  432. package/plugins/pbr/scripts/lib/learnings.js +511 -0
  433. package/plugins/pbr/scripts/lib/migrate.js +309 -0
  434. package/plugins/pbr/scripts/lib/milestone.js +306 -0
  435. package/plugins/pbr/scripts/lib/msys-path.js +20 -0
  436. package/plugins/pbr/scripts/lib/negative-knowledge.js +194 -0
  437. package/plugins/pbr/scripts/lib/notification-throttle.js +141 -0
  438. package/plugins/pbr/scripts/lib/onboarding-generator.js +288 -0
  439. package/plugins/pbr/scripts/lib/parse-args.js +134 -0
  440. package/plugins/pbr/scripts/lib/pattern-routing.js +55 -0
  441. package/plugins/pbr/scripts/lib/patterns.js +272 -0
  442. package/plugins/pbr/scripts/lib/perf.js +190 -0
  443. package/plugins/pbr/scripts/lib/phase.js +1043 -0
  444. package/plugins/pbr/scripts/lib/pid-lock.js +156 -0
  445. package/plugins/pbr/scripts/lib/post-hoc.js +160 -0
  446. package/plugins/pbr/scripts/lib/pre-commit-checks.js +220 -0
  447. package/plugins/pbr/scripts/lib/pre-research.js +126 -0
  448. package/plugins/pbr/scripts/lib/premature-completion.js +312 -0
  449. package/plugins/pbr/scripts/lib/preview.js +174 -0
  450. package/plugins/pbr/scripts/lib/progress-visualization.js +296 -0
  451. package/plugins/pbr/scripts/lib/quick-init.js +131 -0
  452. package/plugins/pbr/scripts/lib/reference.js +236 -0
  453. package/plugins/pbr/scripts/lib/requirements.js +153 -0
  454. package/plugins/pbr/scripts/lib/resolve-root.js +66 -0
  455. package/plugins/pbr/scripts/lib/reverse-spec.js +259 -0
  456. package/plugins/pbr/scripts/lib/roadmap.js +1089 -0
  457. package/plugins/pbr/scripts/lib/security-scan.js +200 -0
  458. package/plugins/pbr/scripts/lib/session-briefing.js +918 -0
  459. package/plugins/pbr/scripts/lib/skill-section.js +99 -0
  460. package/plugins/pbr/scripts/lib/smart-next-task.js +198 -0
  461. package/plugins/pbr/scripts/lib/snapshot-manager.js +232 -0
  462. package/plugins/pbr/scripts/lib/spec-diff.js +209 -0
  463. package/plugins/pbr/scripts/lib/spec-engine.js +189 -0
  464. package/plugins/pbr/scripts/lib/spot-check.js +539 -0
  465. package/plugins/pbr/scripts/lib/state-queue.js +171 -0
  466. package/plugins/pbr/scripts/lib/state.js +1082 -0
  467. package/plugins/pbr/scripts/lib/status-render.js +511 -0
  468. package/plugins/pbr/scripts/lib/step-verify.js +149 -0
  469. package/plugins/pbr/scripts/lib/subagent-validators.js +1119 -0
  470. package/plugins/pbr/scripts/lib/suggest-next.js +435 -0
  471. package/plugins/pbr/scripts/lib/tech-debt-scanner.js +116 -0
  472. package/plugins/pbr/scripts/lib/templates.js +362 -0
  473. package/plugins/pbr/scripts/lib/test-selection.js +163 -0
  474. package/plugins/pbr/scripts/lib/todo.js +300 -0
  475. package/plugins/pbr/scripts/lib/verify.js +1561 -0
  476. package/plugins/pbr/scripts/log-notification.js +131 -0
  477. package/plugins/pbr/scripts/log-subagent.js +221 -18
  478. package/plugins/pbr/scripts/log-tool-failure.js +60 -5
  479. package/plugins/pbr/scripts/milestone-learnings.js +519 -0
  480. package/plugins/pbr/scripts/package.json +1 -1
  481. package/plugins/pbr/scripts/pbr-tools.js +362 -1247
  482. package/plugins/pbr/scripts/post-bash-triage.js +96 -0
  483. package/plugins/pbr/scripts/post-compact.js +135 -0
  484. package/plugins/pbr/scripts/post-hoc.js +237 -0
  485. package/plugins/pbr/scripts/post-write-dispatch.js +201 -31
  486. package/plugins/pbr/scripts/post-write-quality.js +4 -3
  487. package/plugins/pbr/scripts/pre-bash-dispatch.js +147 -51
  488. package/plugins/pbr/scripts/pre-skill-dispatch.js +114 -0
  489. package/plugins/pbr/scripts/pre-task-dispatch.js +269 -0
  490. package/plugins/pbr/scripts/pre-write-dispatch.js +170 -72
  491. package/plugins/pbr/scripts/progress-tracker.js +121 -324
  492. package/plugins/pbr/scripts/prompt-guard.js +114 -0
  493. package/plugins/pbr/scripts/prompt-routing.js +209 -0
  494. package/plugins/pbr/scripts/quick-status.js +179 -0
  495. package/plugins/pbr/scripts/record-incident.js +37 -0
  496. package/plugins/pbr/scripts/risk-classifier.cjs +123 -0
  497. package/plugins/pbr/scripts/run-hook.js +63 -23
  498. package/plugins/pbr/scripts/session-cleanup.js +428 -29
  499. package/plugins/pbr/scripts/session-tracker.js +124 -0
  500. package/plugins/pbr/scripts/status-line.js +571 -43
  501. package/plugins/pbr/scripts/suggest-compact.js +201 -13
  502. package/plugins/pbr/scripts/sync-context-to-claude.js +100 -0
  503. package/plugins/pbr/scripts/task-completed.js +165 -4
  504. package/plugins/pbr/scripts/test/config.test.js +126 -0
  505. package/plugins/pbr/scripts/test/cross-platform.test.js +120 -0
  506. package/plugins/pbr/scripts/test/fixtures/config.json +20 -0
  507. package/plugins/pbr/scripts/test/fixtures/plan.md +54 -0
  508. package/plugins/pbr/scripts/test/fixtures/project.md +30 -0
  509. package/plugins/pbr/scripts/test/fixtures/roadmap.md +55 -0
  510. package/plugins/pbr/scripts/test/fixtures/state.md +60 -0
  511. package/plugins/pbr/scripts/test/fixtures/summary.md +35 -0
  512. package/plugins/pbr/scripts/test/fixtures.test.js +184 -0
  513. package/plugins/pbr/scripts/test/phase.test.js +142 -0
  514. package/plugins/pbr/scripts/test/roadmap.test.js +96 -0
  515. package/plugins/pbr/scripts/test/state.test.js +155 -0
  516. package/plugins/pbr/scripts/track-context-budget.js +368 -104
  517. package/plugins/pbr/scripts/track-user-gates.js +88 -0
  518. package/plugins/pbr/scripts/trust-tracker.js +193 -0
  519. package/plugins/pbr/scripts/validate-commit.js +51 -19
  520. package/plugins/pbr/scripts/validate-skill-args.js +85 -14
  521. package/plugins/pbr/scripts/validate-task.js +83 -622
  522. package/plugins/pbr/scripts/worktree-create.js +144 -0
  523. package/plugins/pbr/scripts/worktree-remove.js +147 -0
  524. package/plugins/pbr/skills/audit/SKILL.md +195 -24
  525. package/plugins/pbr/skills/audit-fix/SKILL.md +326 -0
  526. package/plugins/pbr/skills/autonomous/SKILL.md +551 -0
  527. package/plugins/pbr/skills/backlog/SKILL.md +56 -0
  528. package/plugins/pbr/skills/begin/SKILL.md +508 -153
  529. package/plugins/pbr/skills/begin/templates/STATE.md.tmpl +1 -2
  530. package/plugins/pbr/skills/begin/templates/config.json.tmpl +419 -36
  531. package/plugins/pbr/skills/begin/templates/researcher-prompt.md.tmpl +28 -0
  532. package/plugins/pbr/skills/begin/templates/roadmap-prompt.md.tmpl +28 -3
  533. package/plugins/pbr/skills/begin/templates/synthesis-prompt.md.tmpl +33 -5
  534. package/plugins/pbr/skills/build/SKILL.md +1180 -357
  535. package/plugins/pbr/skills/build/templates/continuation-prompt.md.tmpl +26 -0
  536. package/plugins/pbr/skills/build/templates/executor-prompt.md.tmpl +77 -0
  537. package/plugins/pbr/skills/build/templates/inline-verifier-prompt.md.tmpl +33 -0
  538. package/plugins/pbr/skills/build/templates/qa-round-context.md.tmpl +16 -0
  539. package/plugins/pbr/skills/config/SKILL.md +112 -9
  540. package/plugins/pbr/skills/continue/SKILL.md +113 -33
  541. package/plugins/pbr/skills/dashboard/SKILL.md +21 -9
  542. package/plugins/pbr/skills/debug/SKILL.md +70 -12
  543. package/plugins/pbr/skills/debug/templates/continuation-prompt.md.tmpl +12 -1
  544. package/plugins/pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +12 -5
  545. package/plugins/pbr/skills/discuss/SKILL.md +205 -24
  546. package/plugins/pbr/skills/discuss/templates/CONTEXT.md.tmpl +21 -1
  547. package/plugins/pbr/skills/do/SKILL.md +119 -24
  548. package/plugins/pbr/skills/explore/SKILL.md +95 -20
  549. package/plugins/pbr/skills/fast/SKILL.md +94 -0
  550. package/plugins/pbr/skills/forensics/SKILL.md +144 -0
  551. package/plugins/pbr/skills/health/SKILL.md +35 -115
  552. package/plugins/pbr/skills/help/SKILL.md +83 -123
  553. package/plugins/pbr/skills/import/SKILL.md +332 -13
  554. package/plugins/pbr/skills/intel/SKILL.md +131 -0
  555. package/plugins/pbr/skills/list-phase-assumptions/SKILL.md +231 -0
  556. package/plugins/pbr/skills/milestone/SKILL.md +383 -274
  557. package/plugins/pbr/skills/milestone/templates/audit-output.md.tmpl +76 -0
  558. package/plugins/pbr/skills/milestone/templates/complete-output.md.tmpl +32 -0
  559. package/plugins/pbr/skills/milestone/templates/edge-cases.md +54 -0
  560. package/plugins/pbr/skills/milestone/templates/gaps-output.md.tmpl +25 -0
  561. package/plugins/pbr/skills/milestone/templates/integration-checker-prompt.md.tmpl +25 -0
  562. package/plugins/pbr/skills/milestone/templates/new-output.md.tmpl +29 -0
  563. package/plugins/pbr/skills/milestone-summary/SKILL.md +86 -0
  564. package/plugins/pbr/skills/note/SKILL.md +20 -4
  565. package/plugins/pbr/skills/pause/SKILL.md +54 -14
  566. package/plugins/pbr/skills/pause/templates/continue-here.md.tmpl +33 -52
  567. package/plugins/pbr/skills/plan/SKILL.md +526 -280
  568. package/plugins/pbr/skills/plan/templates/checker-prompt.md.tmpl +20 -2
  569. package/plugins/pbr/skills/plan/templates/completion-output.md.tmpl +27 -0
  570. package/plugins/pbr/skills/plan/templates/planner-prompt.md.tmpl +43 -1
  571. package/plugins/pbr/skills/plan/templates/revision-prompt.md.tmpl +21 -5
  572. package/plugins/pbr/skills/profile/SKILL.md +185 -0
  573. package/plugins/pbr/skills/profile-user/SKILL.md +227 -0
  574. package/plugins/pbr/skills/quick/SKILL.md +435 -100
  575. package/plugins/pbr/skills/release/SKILL.md +206 -0
  576. package/plugins/pbr/skills/resume/SKILL.md +170 -46
  577. package/plugins/pbr/skills/review/SKILL.md +233 -165
  578. package/plugins/pbr/skills/review/templates/verifier-prompt.md.tmpl +7 -0
  579. package/plugins/pbr/skills/scan/SKILL.md +152 -106
  580. package/plugins/pbr/skills/scan/templates/mapper-prompt.md.tmpl +5 -56
  581. package/plugins/pbr/skills/seed/SKILL.md +87 -0
  582. package/plugins/pbr/skills/session-report/SKILL.md +130 -0
  583. package/plugins/pbr/skills/setup/SKILL.md +150 -202
  584. package/plugins/pbr/skills/shared/agent-context-enrichment.md +21 -0
  585. package/plugins/pbr/skills/shared/agent-type-resolution.md +32 -0
  586. package/plugins/pbr/skills/shared/commit-planning-docs.md +8 -0
  587. package/plugins/pbr/skills/shared/context-budget.md +66 -1
  588. package/plugins/pbr/skills/shared/context-loader-task.md +18 -11
  589. package/plugins/pbr/skills/shared/criterion-writing.md +58 -0
  590. package/plugins/pbr/skills/shared/digest-select.md +2 -2
  591. package/plugins/pbr/skills/shared/domain-probes.md +1 -1
  592. package/plugins/pbr/skills/shared/error-reporting.md +38 -60
  593. package/plugins/pbr/skills/shared/gate-prompts.md +4 -2
  594. package/plugins/pbr/skills/shared/memory-capture.md +48 -0
  595. package/plugins/pbr/skills/shared/phase-argument-parsing.md +4 -4
  596. package/plugins/pbr/skills/shared/revision-loop.md +24 -6
  597. package/plugins/pbr/skills/shared/state-update.md +46 -61
  598. package/plugins/pbr/skills/shared/universal-anti-patterns.md +27 -4
  599. package/plugins/pbr/skills/ship/SKILL.md +155 -0
  600. package/plugins/pbr/skills/stats/SKILL.md +110 -0
  601. package/plugins/pbr/skills/status/SKILL.md +185 -119
  602. package/plugins/pbr/skills/test/SKILL.md +254 -0
  603. package/plugins/pbr/skills/thread/SKILL.md +73 -0
  604. package/plugins/pbr/skills/todo/SKILL.md +28 -72
  605. package/plugins/pbr/skills/ui-phase/SKILL.md +180 -0
  606. package/plugins/pbr/skills/ui-review/SKILL.md +206 -0
  607. package/plugins/pbr/skills/undo/SKILL.md +221 -0
  608. package/plugins/pbr/skills/validate-phase/SKILL.md +362 -0
  609. package/plugins/pbr/templates/CONTEXT.md.tmpl +45 -20
  610. package/plugins/pbr/templates/DISCOVERY.md.tmpl +29 -0
  611. package/plugins/pbr/templates/DISCUSSION-LOG.md.tmpl +49 -0
  612. package/plugins/pbr/templates/HANDOFF.json.tmpl +30 -0
  613. package/plugins/pbr/templates/INTEGRATION-REPORT.md.tmpl +18 -2
  614. package/plugins/pbr/templates/MILESTONE-AUDIT.md.tmpl +44 -0
  615. package/plugins/pbr/templates/PROJECT.md.tmpl +126 -0
  616. package/plugins/pbr/templates/REQUIREMENTS.md.tmpl +96 -0
  617. package/plugins/pbr/templates/RETROSPECTIVE.md.tmpl +43 -0
  618. package/plugins/pbr/templates/ROADMAP.md.tmpl +106 -14
  619. package/plugins/pbr/templates/SUMMARY-complex.md.tmpl +133 -0
  620. package/plugins/pbr/templates/SUMMARY-minimal.md.tmpl +55 -0
  621. package/plugins/pbr/templates/SUMMARY.md.tmpl +21 -0
  622. package/plugins/pbr/templates/UAT.md.tmpl +94 -0
  623. package/plugins/pbr/templates/UI-SPEC.md.tmpl +144 -0
  624. package/plugins/pbr/templates/VALIDATION.md.tmpl +94 -0
  625. package/plugins/pbr/templates/VERIFICATION-DETAIL.md.tmpl +54 -13
  626. package/plugins/pbr/templates/project-CONTEXT.md.tmpl +59 -0
  627. package/plugins/pbr/templates/research-outputs/ARCHITECTURE.md.tmpl +91 -0
  628. package/plugins/pbr/templates/research-outputs/FEATURES.md.tmpl +64 -0
  629. package/plugins/pbr/templates/research-outputs/PITFALLS.md.tmpl +50 -0
  630. package/plugins/pbr/templates/research-outputs/STACK.md.tmpl +63 -0
  631. package/plugins/pbr/templates/research-outputs/SUMMARY.md.tmpl +98 -0
  632. package/scripts/build-hooks.js +61 -0
  633. package/scripts/check-ci.js +100 -0
  634. package/scripts/clean-changelog.js +364 -0
  635. package/scripts/generate-derivatives.js +581 -0
  636. package/scripts/posttest.js +93 -0
  637. package/scripts/release.js +262 -0
  638. package/scripts/run-tests.cjs +29 -0
  639. package/scripts/test-wrapper.js +43 -0
  640. package/dashboard/bin/cli.js +0 -25
  641. package/dashboard/public/css/layout.css +0 -704
  642. package/dashboard/public/css/status-colors.css +0 -98
  643. package/dashboard/public/css/tokens.css +0 -59
  644. package/dashboard/public/js/htmx-title.js +0 -5
  645. package/dashboard/public/js/sidebar-toggle.js +0 -34
  646. package/dashboard/public/js/sse-client.js +0 -100
  647. package/dashboard/public/js/theme-toggle.js +0 -46
  648. package/dashboard/src/app.js +0 -91
  649. package/dashboard/src/middleware/current-phase.js +0 -24
  650. package/dashboard/src/middleware/errorHandler.js +0 -52
  651. package/dashboard/src/middleware/notFoundHandler.js +0 -9
  652. package/dashboard/src/repositories/planning.repository.js +0 -130
  653. package/dashboard/src/routes/events.routes.js +0 -45
  654. package/dashboard/src/routes/index.routes.js +0 -35
  655. package/dashboard/src/routes/pages.routes.js +0 -426
  656. package/dashboard/src/server.js +0 -42
  657. package/dashboard/src/services/analytics.service.js +0 -141
  658. package/dashboard/src/services/dashboard.service.js +0 -309
  659. package/dashboard/src/services/milestone.service.js +0 -222
  660. package/dashboard/src/services/notes.service.js +0 -50
  661. package/dashboard/src/services/phase.service.js +0 -232
  662. package/dashboard/src/services/project.service.js +0 -57
  663. package/dashboard/src/services/roadmap.service.js +0 -258
  664. package/dashboard/src/services/sse.service.js +0 -58
  665. package/dashboard/src/services/todo.service.js +0 -272
  666. package/dashboard/src/services/watcher.service.js +0 -48
  667. package/dashboard/src/utils/cache.js +0 -55
  668. package/dashboard/src/views/analytics.ejs +0 -5
  669. package/dashboard/src/views/coming-soon.ejs +0 -11
  670. package/dashboard/src/views/dependencies.ejs +0 -5
  671. package/dashboard/src/views/error.ejs +0 -20
  672. package/dashboard/src/views/index.ejs +0 -5
  673. package/dashboard/src/views/milestone-detail.ejs +0 -5
  674. package/dashboard/src/views/milestones.ejs +0 -5
  675. package/dashboard/src/views/notes.ejs +0 -5
  676. package/dashboard/src/views/partials/analytics-content.ejs +0 -90
  677. package/dashboard/src/views/partials/breadcrumbs.ejs +0 -14
  678. package/dashboard/src/views/partials/dashboard-content.ejs +0 -84
  679. package/dashboard/src/views/partials/dependencies-content.ejs +0 -48
  680. package/dashboard/src/views/partials/empty-state.ejs +0 -7
  681. package/dashboard/src/views/partials/footer.ejs +0 -3
  682. package/dashboard/src/views/partials/head.ejs +0 -30
  683. package/dashboard/src/views/partials/header.ejs +0 -21
  684. package/dashboard/src/views/partials/layout-bottom.ejs +0 -43
  685. package/dashboard/src/views/partials/layout-top.ejs +0 -16
  686. package/dashboard/src/views/partials/milestone-detail-content.ejs +0 -20
  687. package/dashboard/src/views/partials/milestones-content.ejs +0 -88
  688. package/dashboard/src/views/partials/notes-content.ejs +0 -23
  689. package/dashboard/src/views/partials/phase-content.ejs +0 -193
  690. package/dashboard/src/views/partials/phase-doc-content.ejs +0 -38
  691. package/dashboard/src/views/partials/phases-content.ejs +0 -124
  692. package/dashboard/src/views/partials/roadmap-content.ejs +0 -180
  693. package/dashboard/src/views/partials/sidebar.ejs +0 -99
  694. package/dashboard/src/views/partials/todo-create-content.ejs +0 -54
  695. package/dashboard/src/views/partials/todo-detail-content.ejs +0 -42
  696. package/dashboard/src/views/partials/todos-content.ejs +0 -97
  697. package/dashboard/src/views/phase-detail.ejs +0 -5
  698. package/dashboard/src/views/phase-doc.ejs +0 -5
  699. package/dashboard/src/views/phases.ejs +0 -5
  700. package/dashboard/src/views/roadmap.ejs +0 -5
  701. package/dashboard/src/views/todo-create.ejs +0 -5
  702. package/dashboard/src/views/todo-detail.ejs +0 -5
  703. package/dashboard/src/views/todos.ejs +0 -5
  704. package/plugins/copilot-pbr/CHANGELOG.md +0 -19
  705. package/plugins/copilot-pbr/README.md +0 -139
  706. package/plugins/copilot-pbr/agents/audit.agent.md +0 -113
  707. package/plugins/copilot-pbr/agents/codebase-mapper.agent.md +0 -151
  708. package/plugins/copilot-pbr/agents/debugger.agent.md +0 -184
  709. package/plugins/copilot-pbr/agents/executor.agent.md +0 -269
  710. package/plugins/copilot-pbr/agents/general.agent.md +0 -89
  711. package/plugins/copilot-pbr/agents/integration-checker.agent.md +0 -121
  712. package/plugins/copilot-pbr/agents/plan-checker.agent.md +0 -208
  713. package/plugins/copilot-pbr/agents/planner.agent.md +0 -240
  714. package/plugins/copilot-pbr/agents/researcher.agent.md +0 -188
  715. package/plugins/copilot-pbr/agents/synthesizer.agent.md +0 -126
  716. package/plugins/copilot-pbr/agents/verifier.agent.md +0 -228
  717. package/plugins/copilot-pbr/hooks/hooks.json +0 -258
  718. package/plugins/copilot-pbr/plugin.json +0 -30
  719. package/plugins/copilot-pbr/references/agent-anti-patterns.md +0 -25
  720. package/plugins/copilot-pbr/references/agent-contracts.md +0 -297
  721. package/plugins/copilot-pbr/references/agent-interactions.md +0 -135
  722. package/plugins/copilot-pbr/references/agent-teams.md +0 -55
  723. package/plugins/copilot-pbr/references/checkpoints.md +0 -158
  724. package/plugins/copilot-pbr/references/common-bug-patterns.md +0 -14
  725. package/plugins/copilot-pbr/references/config-reference.md +0 -442
  726. package/plugins/copilot-pbr/references/continuation-format.md +0 -213
  727. package/plugins/copilot-pbr/references/deviation-rules.md +0 -113
  728. package/plugins/copilot-pbr/references/git-integration.md +0 -227
  729. package/plugins/copilot-pbr/references/integration-patterns.md +0 -118
  730. package/plugins/copilot-pbr/references/model-profiles.md +0 -100
  731. package/plugins/copilot-pbr/references/model-selection.md +0 -32
  732. package/plugins/copilot-pbr/references/pbr-rules.md +0 -195
  733. package/plugins/copilot-pbr/references/pbr-tools-cli.md +0 -285
  734. package/plugins/copilot-pbr/references/plan-authoring.md +0 -182
  735. package/plugins/copilot-pbr/references/plan-format.md +0 -288
  736. package/plugins/copilot-pbr/references/planning-config.md +0 -214
  737. package/plugins/copilot-pbr/references/questioning.md +0 -215
  738. package/plugins/copilot-pbr/references/reading-verification.md +0 -128
  739. package/plugins/copilot-pbr/references/stub-patterns.md +0 -161
  740. package/plugins/copilot-pbr/references/subagent-coordination.md +0 -120
  741. package/plugins/copilot-pbr/references/ui-formatting.md +0 -444
  742. package/plugins/copilot-pbr/references/verification-patterns.md +0 -199
  743. package/plugins/copilot-pbr/references/wave-execution.md +0 -96
  744. package/plugins/copilot-pbr/rules/pbr-workflow.mdc +0 -48
  745. package/plugins/copilot-pbr/setup.ps1 +0 -93
  746. package/plugins/copilot-pbr/setup.sh +0 -93
  747. package/plugins/copilot-pbr/skills/audit/SKILL.md +0 -330
  748. package/plugins/copilot-pbr/skills/begin/SKILL.md +0 -589
  749. package/plugins/copilot-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  750. package/plugins/copilot-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  751. package/plugins/copilot-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  752. package/plugins/copilot-pbr/skills/begin/templates/config.json.tmpl +0 -64
  753. package/plugins/copilot-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  754. package/plugins/copilot-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  755. package/plugins/copilot-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  756. package/plugins/copilot-pbr/skills/build/SKILL.md +0 -959
  757. package/plugins/copilot-pbr/skills/config/SKILL.md +0 -250
  758. package/plugins/copilot-pbr/skills/continue/SKILL.md +0 -159
  759. package/plugins/copilot-pbr/skills/dashboard/SKILL.md +0 -43
  760. package/plugins/copilot-pbr/skills/debug/SKILL.md +0 -508
  761. package/plugins/copilot-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  762. package/plugins/copilot-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  763. package/plugins/copilot-pbr/skills/discuss/SKILL.md +0 -353
  764. package/plugins/copilot-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  765. package/plugins/copilot-pbr/skills/discuss/templates/decision-categories.md +0 -10
  766. package/plugins/copilot-pbr/skills/do/SKILL.md +0 -66
  767. package/plugins/copilot-pbr/skills/explore/SKILL.md +0 -373
  768. package/plugins/copilot-pbr/skills/health/SKILL.md +0 -283
  769. package/plugins/copilot-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  770. package/plugins/copilot-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  771. package/plugins/copilot-pbr/skills/help/SKILL.md +0 -193
  772. package/plugins/copilot-pbr/skills/import/SKILL.md +0 -502
  773. package/plugins/copilot-pbr/skills/milestone/SKILL.md +0 -806
  774. package/plugins/copilot-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  775. package/plugins/copilot-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  776. package/plugins/copilot-pbr/skills/note/SKILL.md +0 -213
  777. package/plugins/copilot-pbr/skills/pause/SKILL.md +0 -247
  778. package/plugins/copilot-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  779. package/plugins/copilot-pbr/skills/plan/SKILL.md +0 -662
  780. package/plugins/copilot-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  781. package/plugins/copilot-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  782. package/plugins/copilot-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  783. package/plugins/copilot-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  784. package/plugins/copilot-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  785. package/plugins/copilot-pbr/skills/quick/SKILL.md +0 -376
  786. package/plugins/copilot-pbr/skills/resume/SKILL.md +0 -399
  787. package/plugins/copilot-pbr/skills/review/SKILL.md +0 -653
  788. package/plugins/copilot-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  789. package/plugins/copilot-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  790. package/plugins/copilot-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  791. package/plugins/copilot-pbr/skills/scan/SKILL.md +0 -299
  792. package/plugins/copilot-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  793. package/plugins/copilot-pbr/skills/setup/SKILL.md +0 -296
  794. package/plugins/copilot-pbr/skills/shared/commit-planning-docs.md +0 -36
  795. package/plugins/copilot-pbr/skills/shared/config-loading.md +0 -103
  796. package/plugins/copilot-pbr/skills/shared/context-budget.md +0 -41
  797. package/plugins/copilot-pbr/skills/shared/context-loader-task.md +0 -87
  798. package/plugins/copilot-pbr/skills/shared/digest-select.md +0 -80
  799. package/plugins/copilot-pbr/skills/shared/domain-probes.md +0 -126
  800. package/plugins/copilot-pbr/skills/shared/error-recovery-strategies.md +0 -51
  801. package/plugins/copilot-pbr/skills/shared/error-reporting.md +0 -81
  802. package/plugins/copilot-pbr/skills/shared/gate-prompts.md +0 -389
  803. package/plugins/copilot-pbr/skills/shared/phase-argument-parsing.md +0 -46
  804. package/plugins/copilot-pbr/skills/shared/progress-display.md +0 -53
  805. package/plugins/copilot-pbr/skills/shared/revision-loop.md +0 -82
  806. package/plugins/copilot-pbr/skills/shared/state-loading.md +0 -63
  807. package/plugins/copilot-pbr/skills/shared/state-update.md +0 -170
  808. package/plugins/copilot-pbr/skills/shared/universal-anti-patterns.md +0 -38
  809. package/plugins/copilot-pbr/skills/status/SKILL.md +0 -362
  810. package/plugins/copilot-pbr/skills/statusline/SKILL.md +0 -149
  811. package/plugins/copilot-pbr/skills/todo/SKILL.md +0 -279
  812. package/plugins/copilot-pbr/templates/CONTEXT.md.tmpl +0 -53
  813. package/plugins/copilot-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  814. package/plugins/copilot-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  815. package/plugins/copilot-pbr/templates/ROADMAP.md.tmpl +0 -48
  816. package/plugins/copilot-pbr/templates/SUMMARY.md.tmpl +0 -82
  817. package/plugins/copilot-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  818. package/plugins/copilot-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  819. package/plugins/copilot-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  820. package/plugins/copilot-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  821. package/plugins/copilot-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  822. package/plugins/copilot-pbr/templates/codebase/STACK.md.tmpl +0 -78
  823. package/plugins/copilot-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  824. package/plugins/copilot-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  825. package/plugins/copilot-pbr/templates/continue-here.md.tmpl +0 -74
  826. package/plugins/copilot-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  827. package/plugins/copilot-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  828. package/plugins/copilot-pbr/templates/research/STACK.md.tmpl +0 -71
  829. package/plugins/copilot-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  830. package/plugins/copilot-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  831. package/plugins/copilot-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  832. package/plugins/copilot-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  833. package/plugins/cursor-pbr/.cursor-plugin/plugin.json +0 -32
  834. package/plugins/cursor-pbr/CHANGELOG.md +0 -15
  835. package/plugins/cursor-pbr/README.md +0 -123
  836. package/plugins/cursor-pbr/agents/audit.md +0 -178
  837. package/plugins/cursor-pbr/agents/codebase-mapper.md +0 -150
  838. package/plugins/cursor-pbr/agents/debugger.md +0 -183
  839. package/plugins/cursor-pbr/agents/executor.md +0 -268
  840. package/plugins/cursor-pbr/agents/general.md +0 -88
  841. package/plugins/cursor-pbr/agents/integration-checker.md +0 -120
  842. package/plugins/cursor-pbr/agents/plan-checker.md +0 -207
  843. package/plugins/cursor-pbr/agents/planner.md +0 -239
  844. package/plugins/cursor-pbr/agents/researcher.md +0 -187
  845. package/plugins/cursor-pbr/agents/synthesizer.md +0 -125
  846. package/plugins/cursor-pbr/agents/verifier.md +0 -227
  847. package/plugins/cursor-pbr/assets/.gitkeep +0 -0
  848. package/plugins/cursor-pbr/assets/logo.svg +0 -21
  849. package/plugins/cursor-pbr/hooks/hooks.json +0 -224
  850. package/plugins/cursor-pbr/references/agent-anti-patterns.md +0 -25
  851. package/plugins/cursor-pbr/references/agent-contracts.md +0 -297
  852. package/plugins/cursor-pbr/references/agent-interactions.md +0 -135
  853. package/plugins/cursor-pbr/references/agent-teams.md +0 -55
  854. package/plugins/cursor-pbr/references/checkpoints.md +0 -158
  855. package/plugins/cursor-pbr/references/common-bug-patterns.md +0 -14
  856. package/plugins/cursor-pbr/references/config-reference.md +0 -442
  857. package/plugins/cursor-pbr/references/continuation-format.md +0 -213
  858. package/plugins/cursor-pbr/references/deviation-rules.md +0 -113
  859. package/plugins/cursor-pbr/references/git-integration.md +0 -227
  860. package/plugins/cursor-pbr/references/integration-patterns.md +0 -118
  861. package/plugins/cursor-pbr/references/model-profiles.md +0 -100
  862. package/plugins/cursor-pbr/references/model-selection.md +0 -32
  863. package/plugins/cursor-pbr/references/pbr-rules.md +0 -195
  864. package/plugins/cursor-pbr/references/pbr-tools-cli.md +0 -285
  865. package/plugins/cursor-pbr/references/plan-authoring.md +0 -182
  866. package/plugins/cursor-pbr/references/plan-format.md +0 -288
  867. package/plugins/cursor-pbr/references/planning-config.md +0 -214
  868. package/plugins/cursor-pbr/references/questioning.md +0 -215
  869. package/plugins/cursor-pbr/references/reading-verification.md +0 -128
  870. package/plugins/cursor-pbr/references/stub-patterns.md +0 -161
  871. package/plugins/cursor-pbr/references/subagent-coordination.md +0 -120
  872. package/plugins/cursor-pbr/references/ui-formatting.md +0 -444
  873. package/plugins/cursor-pbr/references/verification-patterns.md +0 -199
  874. package/plugins/cursor-pbr/references/wave-execution.md +0 -96
  875. package/plugins/cursor-pbr/rules/pbr-workflow.mdc +0 -48
  876. package/plugins/cursor-pbr/setup.ps1 +0 -78
  877. package/plugins/cursor-pbr/setup.sh +0 -83
  878. package/plugins/cursor-pbr/skills/audit/SKILL.md +0 -331
  879. package/plugins/cursor-pbr/skills/begin/SKILL.md +0 -589
  880. package/plugins/cursor-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  881. package/plugins/cursor-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  882. package/plugins/cursor-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  883. package/plugins/cursor-pbr/skills/begin/templates/config.json.tmpl +0 -64
  884. package/plugins/cursor-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  885. package/plugins/cursor-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  886. package/plugins/cursor-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  887. package/plugins/cursor-pbr/skills/build/SKILL.md +0 -960
  888. package/plugins/cursor-pbr/skills/config/SKILL.md +0 -252
  889. package/plugins/cursor-pbr/skills/continue/SKILL.md +0 -159
  890. package/plugins/cursor-pbr/skills/dashboard/SKILL.md +0 -44
  891. package/plugins/cursor-pbr/skills/debug/SKILL.md +0 -512
  892. package/plugins/cursor-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  893. package/plugins/cursor-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  894. package/plugins/cursor-pbr/skills/discuss/SKILL.md +0 -354
  895. package/plugins/cursor-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  896. package/plugins/cursor-pbr/skills/discuss/templates/decision-categories.md +0 -10
  897. package/plugins/cursor-pbr/skills/do/SKILL.md +0 -67
  898. package/plugins/cursor-pbr/skills/explore/SKILL.md +0 -376
  899. package/plugins/cursor-pbr/skills/health/SKILL.md +0 -283
  900. package/plugins/cursor-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  901. package/plugins/cursor-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  902. package/plugins/cursor-pbr/skills/help/SKILL.md +0 -193
  903. package/plugins/cursor-pbr/skills/import/SKILL.md +0 -505
  904. package/plugins/cursor-pbr/skills/milestone/SKILL.md +0 -807
  905. package/plugins/cursor-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  906. package/plugins/cursor-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  907. package/plugins/cursor-pbr/skills/note/SKILL.md +0 -214
  908. package/plugins/cursor-pbr/skills/pause/SKILL.md +0 -248
  909. package/plugins/cursor-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  910. package/plugins/cursor-pbr/skills/plan/SKILL.md +0 -663
  911. package/plugins/cursor-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  912. package/plugins/cursor-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  913. package/plugins/cursor-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  914. package/plugins/cursor-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  915. package/plugins/cursor-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  916. package/plugins/cursor-pbr/skills/quick/SKILL.md +0 -376
  917. package/plugins/cursor-pbr/skills/resume/SKILL.md +0 -399
  918. package/plugins/cursor-pbr/skills/review/SKILL.md +0 -654
  919. package/plugins/cursor-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  920. package/plugins/cursor-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  921. package/plugins/cursor-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  922. package/plugins/cursor-pbr/skills/scan/SKILL.md +0 -300
  923. package/plugins/cursor-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  924. package/plugins/cursor-pbr/skills/setup/SKILL.md +0 -296
  925. package/plugins/cursor-pbr/skills/shared/commit-planning-docs.md +0 -36
  926. package/plugins/cursor-pbr/skills/shared/config-loading.md +0 -103
  927. package/plugins/cursor-pbr/skills/shared/context-budget.md +0 -41
  928. package/plugins/cursor-pbr/skills/shared/context-loader-task.md +0 -87
  929. package/plugins/cursor-pbr/skills/shared/digest-select.md +0 -80
  930. package/plugins/cursor-pbr/skills/shared/domain-probes.md +0 -126
  931. package/plugins/cursor-pbr/skills/shared/error-recovery-strategies.md +0 -51
  932. package/plugins/cursor-pbr/skills/shared/error-reporting.md +0 -81
  933. package/plugins/cursor-pbr/skills/shared/gate-prompts.md +0 -389
  934. package/plugins/cursor-pbr/skills/shared/phase-argument-parsing.md +0 -46
  935. package/plugins/cursor-pbr/skills/shared/progress-display.md +0 -53
  936. package/plugins/cursor-pbr/skills/shared/revision-loop.md +0 -82
  937. package/plugins/cursor-pbr/skills/shared/state-loading.md +0 -63
  938. package/plugins/cursor-pbr/skills/shared/state-update.md +0 -170
  939. package/plugins/cursor-pbr/skills/shared/universal-anti-patterns.md +0 -38
  940. package/plugins/cursor-pbr/skills/status/SKILL.md +0 -362
  941. package/plugins/cursor-pbr/skills/statusline/SKILL.md +0 -150
  942. package/plugins/cursor-pbr/skills/todo/SKILL.md +0 -280
  943. package/plugins/cursor-pbr/templates/CONTEXT.md.tmpl +0 -53
  944. package/plugins/cursor-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  945. package/plugins/cursor-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  946. package/plugins/cursor-pbr/templates/ROADMAP.md.tmpl +0 -48
  947. package/plugins/cursor-pbr/templates/SUMMARY.md.tmpl +0 -82
  948. package/plugins/cursor-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  949. package/plugins/cursor-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  950. package/plugins/cursor-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  951. package/plugins/cursor-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  952. package/plugins/cursor-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  953. package/plugins/cursor-pbr/templates/codebase/STACK.md.tmpl +0 -78
  954. package/plugins/cursor-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  955. package/plugins/cursor-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  956. package/plugins/cursor-pbr/templates/continue-here.md.tmpl +0 -74
  957. package/plugins/cursor-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  958. package/plugins/cursor-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  959. package/plugins/cursor-pbr/templates/research/STACK.md.tmpl +0 -71
  960. package/plugins/cursor-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  961. package/plugins/cursor-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  962. package/plugins/cursor-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  963. package/plugins/cursor-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  964. package/plugins/pbr/references/agent-interactions.md +0 -134
  965. package/plugins/pbr/references/pbr-rules.md +0 -194
  966. package/plugins/pbr/references/pbr-tools-cli.md +0 -285
  967. package/plugins/pbr/references/planning-config.md +0 -213
  968. package/plugins/pbr/references/subagent-coordination.md +0 -119
  969. package/plugins/pbr/references/ui-formatting.md +0 -444
  970. package/plugins/pbr/scripts/validate-plugin-structure.js +0 -183
  971. package/plugins/pbr/skills/milestone/templates/audit-report.md.tmpl +0 -48
  972. package/plugins/pbr/skills/shared/error-recovery-strategies.md +0 -51
  973. package/plugins/pbr/skills/shared/progress-display.md +0 -53
  974. package/plugins/pbr/skills/shared/state-loading.md +0 -62
  975. package/plugins/pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -97
  976. package/plugins/pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  977. package/plugins/pbr/templates/research/STACK.md.tmpl +0 -71
  978. package/plugins/pbr/templates/research/SUMMARY.md.tmpl +0 -112
  979. package/plugins/pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  980. package/plugins/pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  981. package/plugins/pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  982. /package/plugins/pbr/references/{agent-anti-patterns.md → archive/agent-anti-patterns.md} +0 -0
@@ -0,0 +1,1469 @@
1
+ /**
2
+ * lib/config.cjs — Config operations for Plan-Build-Run tools.
3
+ *
4
+ * Handles loading, caching, validating, and resolving depth profiles
5
+ * for .planning/config.json. Provides user-level defaults support
6
+ * via ~/.pbr/defaults.json.
7
+ */
8
+
9
+ const fs = require('fs');
10
+ const path = require('path');
11
+ const { safeReadFile, atomicWrite, ensureDir, validateObject, lockedFileUpdate } = require('./core');
12
+
13
+ // ─── Cached config loader ─────────────────────────────────────────────────────
14
+
15
+ let _configCache = null;
16
+ let _configMtime = 0;
17
+ let _configPath = null;
18
+
19
+ /**
20
+ * Load config.json with in-process mtime-based caching.
21
+ * Returns the parsed config object, or null if not found / parse error.
22
+ * Cache invalidates when file mtime changes or path differs.
23
+ *
24
+ * @param {string} [planningDir] - Path to .planning directory
25
+ * @returns {object|null} Parsed config or null
26
+ */
27
+ function configLoad(planningDir) {
28
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
29
+ const configPath = path.join(dir, 'config.json');
30
+ try {
31
+ if (!fs.existsSync(configPath)) return null;
32
+ const stat = fs.statSync(configPath);
33
+ const mtime = stat.mtimeMs;
34
+ if (_configCache && mtime === _configMtime && configPath === _configPath) {
35
+ return _configCache;
36
+ }
37
+ _configCache = JSON.parse(fs.readFileSync(configPath, 'utf8'));
38
+ _configMtime = mtime;
39
+ _configPath = configPath;
40
+ return _configCache;
41
+ } catch (_e) {
42
+ return null;
43
+ }
44
+ }
45
+
46
+ /**
47
+ * Clear the configLoad() in-process cache.
48
+ * Useful in tests where multiple temp directories are used.
49
+ */
50
+ function configClearCache() {
51
+ _configCache = null;
52
+ _configMtime = 0;
53
+ _configPath = null;
54
+ }
55
+
56
+ // ─── Config validation ────────────────────────────────────────────────────────
57
+
58
+ /**
59
+ * Validate config.json against schema. Accepts a preloaded config object
60
+ * or reads from the default planningDir.
61
+ *
62
+ * @param {object|string} configOrDir - Pre-parsed config object or planningDir path
63
+ * @param {string} [planningDir] - Path to .planning directory (used when first arg is config)
64
+ * @returns {{ valid: boolean, errors: string[], warnings: string[] }}
65
+ */
66
+ function configValidate(configOrDir, planningDir) {
67
+ let config;
68
+
69
+ if (typeof configOrDir === 'string') {
70
+ // Called as configValidate(planningDir)
71
+ const dir = configOrDir;
72
+ const configPath = path.join(dir, 'config.json');
73
+ if (!fs.existsSync(configPath)) {
74
+ return { valid: false, errors: ['config.json not found'], warnings: [] };
75
+ }
76
+ try {
77
+ config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
78
+ } catch (e) {
79
+ return { valid: false, errors: [`config.json is not valid JSON: ${e.message}`], warnings: [] };
80
+ }
81
+ } else if (configOrDir && typeof configOrDir === 'object') {
82
+ // Called as configValidate(configObject, planningDir?)
83
+ config = configOrDir;
84
+ } else {
85
+ // Called with no args — use default location
86
+ const dir = planningDir || path.join(process.env.PBR_PROJECT_ROOT || process.cwd(), '.planning');
87
+ const configPath = path.join(dir, 'config.json');
88
+ if (!fs.existsSync(configPath)) {
89
+ return { valid: false, errors: ['config.json not found'], warnings: [] };
90
+ }
91
+ try {
92
+ config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
93
+ } catch (e) {
94
+ return { valid: false, errors: [`config.json is not valid JSON: ${e.message}`], warnings: [] };
95
+ }
96
+ }
97
+
98
+ // Try loading the config schema from the bin directory
99
+ const warnings = [];
100
+ const errors = [];
101
+
102
+ const schemaPath = path.join(__dirname, '..', 'config-schema.json');
103
+ if (fs.existsSync(schemaPath)) {
104
+ try {
105
+ const schema = JSON.parse(fs.readFileSync(schemaPath, 'utf8'));
106
+ validateObject(config, schema, '', errors, warnings);
107
+ } catch (_e) {
108
+ // intentionally silent: schema file may be unloadable — skip validationalidation
109
+ warnings.push('Could not load config-schema.json for validation');
110
+ }
111
+ }
112
+
113
+ // Check schema_version for migration needs (lazy require to avoid circular deps)
114
+ const { CURRENT_SCHEMA_VERSION } = require('./migrate');
115
+ if (config.schema_version !== undefined && config.schema_version < CURRENT_SCHEMA_VERSION) {
116
+ warnings.push(`config.json schema_version (${config.schema_version}) is behind current (${CURRENT_SCHEMA_VERSION}) — run "pbr-tools migrate" to update`);
117
+ }
118
+
119
+ // Semantic conflict detection
120
+ if (config.mode === 'autonomous' && config.gates) {
121
+ const activeGates = Object.entries(config.gates || {}).filter(([, v]) => v === true).map(([k]) => k);
122
+ if (activeGates.length > 0) {
123
+ errors.push(`mode=autonomous with active gates (${activeGates.join(', ')}): gates are unreachable in autonomous mode`);
124
+ }
125
+ }
126
+ if (config.features && config.features.auto_continue && config.mode === 'interactive') {
127
+ warnings.push('features.auto_continue=true with mode=interactive: auto_continue only fires in autonomous mode');
128
+ }
129
+ if (config.parallelization) {
130
+ if (config.parallelization.enabled === false && config.parallelization.plan_level === true) {
131
+ warnings.push('parallelization.enabled=false with plan_level=true: plan_level is ignored when parallelization is disabled');
132
+ }
133
+ if (config.parallelization.max_concurrent_agents === 1 && config.teams && config.teams.coordination) {
134
+ errors.push('parallelization.max_concurrent_agents=1 with teams.coordination set: teams require concurrent agents to be useful');
135
+ }
136
+ }
137
+
138
+ return {
139
+ valid: errors.length === 0,
140
+ errors,
141
+ warnings
142
+ };
143
+ }
144
+
145
+ // ─── Depth profiles ───────────────────────────────────────────────────────────
146
+
147
+ /**
148
+ * Built-in depth profile defaults. These define the effective settings
149
+ * for each depth level. User config.depth_profiles overrides these.
150
+ */
151
+ const DEPTH_PROFILE_DEFAULTS = {
152
+ quick: {
153
+ 'features.research_phase': false,
154
+ 'features.plan_checking': true,
155
+ 'features.goal_verification': 'advisory',
156
+ 'features.inline_verify': false,
157
+ 'features.decision_journal': false,
158
+ 'features.negative_knowledge': false,
159
+ 'features.living_requirements': false,
160
+ 'features.agent_teams': false,
161
+ 'features.competing_hypotheses': false,
162
+ 'features.dynamic_teams': false,
163
+ 'features.progress_visualization': false,
164
+ 'features.contextual_help': false,
165
+ 'features.team_onboarding': false,
166
+ 'features.cross_project_patterns': false,
167
+ 'features.spec_templates': false,
168
+ 'features.global_learnings': false,
169
+ 'features.architecture_graph': false,
170
+ 'features.architecture_guard': false,
171
+ 'scan.mapper_count': 2,
172
+ 'scan.mapper_areas': ['tech', 'arch'],
173
+ 'debug.max_hypothesis_rounds': 3,
174
+ 'planning.plan_depth': 'high-level'
175
+ },
176
+ standard: {
177
+ 'features.research_phase': true,
178
+ 'features.plan_checking': true,
179
+ 'features.goal_verification': true,
180
+ 'features.inline_verify': false,
181
+ 'features.decision_journal': true,
182
+ 'features.negative_knowledge': true,
183
+ 'features.living_requirements': true,
184
+ 'features.agent_teams': false,
185
+ 'features.competing_hypotheses': false,
186
+ 'features.dynamic_teams': false,
187
+ 'features.progress_visualization': true,
188
+ 'features.contextual_help': true,
189
+ 'features.team_onboarding': true,
190
+ 'features.cross_project_patterns': true,
191
+ 'features.spec_templates': true,
192
+ 'features.global_learnings': true,
193
+ 'features.architecture_graph': true,
194
+ 'features.architecture_guard': true,
195
+ 'scan.mapper_count': 4,
196
+ 'scan.mapper_areas': ['tech', 'arch', 'quality', 'concerns'],
197
+ 'debug.max_hypothesis_rounds': 5,
198
+ 'planning.plan_depth': 'detailed'
199
+ },
200
+ comprehensive: {
201
+ 'features.research_phase': true,
202
+ 'features.plan_checking': true,
203
+ 'features.goal_verification': true,
204
+ 'features.inline_verify': true,
205
+ 'features.decision_journal': true,
206
+ 'features.negative_knowledge': true,
207
+ 'features.living_requirements': true,
208
+ 'features.agent_teams': false,
209
+ 'features.competing_hypotheses': false,
210
+ 'features.dynamic_teams': false,
211
+ 'features.progress_visualization': true,
212
+ 'features.contextual_help': true,
213
+ 'features.team_onboarding': true,
214
+ 'features.cross_project_patterns': true,
215
+ 'features.spec_templates': true,
216
+ 'features.global_learnings': true,
217
+ 'features.architecture_graph': true,
218
+ 'features.architecture_guard': true,
219
+ 'scan.mapper_count': 4,
220
+ 'scan.mapper_areas': ['tech', 'arch', 'quality', 'concerns'],
221
+ 'debug.max_hypothesis_rounds': 10,
222
+ 'planning.plan_depth': 'detailed'
223
+ },
224
+ 'research-heavy': {
225
+ 'features.research_phase': true,
226
+ 'features.plan_checking': true,
227
+ 'features.goal_verification': true,
228
+ 'features.inline_verify': true,
229
+ 'features.decision_journal': true,
230
+ 'features.negative_knowledge': true,
231
+ 'features.living_requirements': true,
232
+ 'features.agent_teams': false,
233
+ 'features.competing_hypotheses': false,
234
+ 'features.dynamic_teams': false,
235
+ 'features.progress_visualization': true,
236
+ 'features.contextual_help': true,
237
+ 'features.team_onboarding': true,
238
+ 'scan.mapper_count': 6,
239
+ 'scan.mapper_areas': ['tech', 'arch', 'quality', 'concerns', 'risks', 'opportunities'],
240
+ 'debug.max_hypothesis_rounds': 15
241
+ }
242
+ };
243
+
244
+ // ─── Harness profiles ─────────────────────────────────────────────────────────
245
+
246
+ /**
247
+ * Built-in harness profile defaults. These define the effective harness
248
+ * settings for each profile level. User config.harness_profiles overrides these.
249
+ */
250
+ const HARNESS_PROFILE_DEFAULTS = {
251
+ full: {
252
+ 'features.sprint_contracts': true,
253
+ 'features.live_verification': true,
254
+ 'features.goal_verification': true,
255
+ 'features.plan_checking': true,
256
+ 'features.self_verification': true,
257
+ 'features.graduated_verification': true,
258
+ 'features.inline_verify': true,
259
+ 'verification.qa_rounds': 3,
260
+ 'planning.plan_depth': 'detailed',
261
+ 'vague_criteria_action': 'block'
262
+ },
263
+ standard: {
264
+ 'features.sprint_contracts': true,
265
+ 'features.live_verification': false,
266
+ 'features.goal_verification': true,
267
+ 'features.plan_checking': true,
268
+ 'features.self_verification': true,
269
+ 'features.graduated_verification': true,
270
+ 'features.inline_verify': false,
271
+ 'verification.qa_rounds': 1,
272
+ 'planning.plan_depth': 'detailed',
273
+ 'vague_criteria_action': 'warn'
274
+ },
275
+ lean: {
276
+ 'features.sprint_contracts': false,
277
+ 'features.live_verification': false,
278
+ 'features.goal_verification': 'advisory',
279
+ 'features.plan_checking': false,
280
+ 'features.self_verification': false,
281
+ 'features.graduated_verification': false,
282
+ 'features.inline_verify': false,
283
+ 'verification.qa_rounds': 1,
284
+ 'planning.plan_depth': 'high-level',
285
+ 'vague_criteria_action': 'off'
286
+ }
287
+ };
288
+
289
+ /**
290
+ * Map model identifiers to recommended harness profiles.
291
+ * Strong models (opus) need less scaffolding; weaker models (haiku) need more.
292
+ */
293
+ const MODEL_CAPABILITY_MAP = {
294
+ 'opus': 'lean',
295
+ 'claude-opus-4-6': 'lean',
296
+ 'claude-opus-4-0': 'lean',
297
+ 'sonnet': 'standard',
298
+ 'claude-sonnet-4-5': 'standard',
299
+ 'claude-sonnet-4-0': 'standard',
300
+ 'haiku': 'full',
301
+ 'claude-haiku-3-5': 'full',
302
+ 'inherit': 'standard'
303
+ };
304
+
305
+ /**
306
+ * Resolve the effective harness profile for the current config.
307
+ * Merges built-in defaults with any user overrides from config.harness_profiles.
308
+ *
309
+ * @param {string|object} dirOrConfig - planningDir path or parsed config object
310
+ * @returns {{ profile: string, settings: object }}
311
+ */
312
+ function configResolveHarness(dirOrConfig) {
313
+ let config;
314
+ if (typeof dirOrConfig === 'string') {
315
+ config = configLoad(dirOrConfig);
316
+ } else {
317
+ config = dirOrConfig;
318
+ }
319
+ const profile = (config && config.harness_profile) || 'standard';
320
+ const defaults = HARNESS_PROFILE_DEFAULTS[profile] || HARNESS_PROFILE_DEFAULTS.standard;
321
+ const userOverrides = (config && config.harness_profiles && config.harness_profiles[profile]) || {};
322
+ return { profile, settings: { ...defaults, ...userOverrides } };
323
+ }
324
+
325
+ /**
326
+ * Recommend a harness profile based on the model configuration.
327
+ * Uses the executor model if set, otherwise scans all models for the strongest.
328
+ *
329
+ * @param {object} config - Parsed config object
330
+ * @returns {string} Recommended profile name ('full', 'standard', or 'lean')
331
+ */
332
+ function recommendedHarnessProfile(config) {
333
+ if (!config || !config.models) return 'standard';
334
+ const executor = config.models.executor;
335
+ if (executor && MODEL_CAPABILITY_MAP[executor]) return MODEL_CAPABILITY_MAP[executor];
336
+ const allModels = Object.values(config.models).filter(v => typeof v === 'string');
337
+ const priority = ['opus', 'sonnet', 'haiku'];
338
+ for (const p of priority) {
339
+ if (allModels.some(m => m === p || m.includes(p))) {
340
+ return MODEL_CAPABILITY_MAP[p] || 'standard';
341
+ }
342
+ }
343
+ return 'standard';
344
+ }
345
+
346
+ /**
347
+ * Get effective value for a config path, respecting precedence:
348
+ * explicit config > harness profile > depth profile > hardcoded default.
349
+ *
350
+ * @param {object} config - Parsed config object
351
+ * @param {string} dotPath - Dot-separated path like 'features.sprint_contracts'
352
+ * @returns {*} Resolved value
353
+ */
354
+ function configGetEffective(config, dotPath) {
355
+ if (!config) return undefined;
356
+
357
+ // 1. Check explicit config value
358
+ const parts = dotPath.split('.');
359
+ let explicit = config;
360
+ for (const p of parts) {
361
+ if (explicit && typeof explicit === 'object' && p in explicit) {
362
+ explicit = explicit[p];
363
+ } else {
364
+ explicit = undefined;
365
+ break;
366
+ }
367
+ }
368
+ if (explicit !== undefined) return explicit;
369
+
370
+ // 2. Check harness profile
371
+ const { settings: harnessSettings } = configResolveHarness(config);
372
+ if (dotPath in harnessSettings) return harnessSettings[dotPath];
373
+
374
+ // 3. Check depth profile
375
+ const { profile: depthSettings } = configResolveDepth(config);
376
+ if (dotPath in depthSettings) return depthSettings[dotPath];
377
+
378
+ return undefined;
379
+ }
380
+
381
+ /**
382
+ * Resolve the effective depth profile for the current config.
383
+ * Merges built-in defaults with any user overrides from config.depth_profiles.
384
+ *
385
+ * @param {string|object} dirOrConfig - planningDir path or parsed config object
386
+ * @returns {{ depth: string, profile: object }}
387
+ */
388
+ function configResolveDepth(dirOrConfig) {
389
+ let config;
390
+ if (typeof dirOrConfig === 'string') {
391
+ config = configLoad(dirOrConfig);
392
+ } else {
393
+ config = dirOrConfig;
394
+ }
395
+
396
+ const depth = (config && config.depth) || 'standard';
397
+ const defaults = DEPTH_PROFILE_DEFAULTS[depth] || DEPTH_PROFILE_DEFAULTS.standard;
398
+
399
+ // Merge user overrides if present
400
+ const userOverrides = (config && config.depth_profiles && config.depth_profiles[depth]) || {};
401
+ const profile = { ...defaults, ...userOverrides };
402
+
403
+ return { depth, profile };
404
+ }
405
+
406
+ // ─── Config load with defaults ────────────────────────────────────────────────
407
+
408
+ /**
409
+ * Load config.json with defaults applied. Creates default config if none exists.
410
+ *
411
+ * @param {string} planningDir - Path to .planning directory
412
+ * @returns {object} Merged config with defaults
413
+ */
414
+ function configLoadDefaults(planningDir) {
415
+ const config = configLoad(planningDir);
416
+ if (config) {
417
+ // Merge with user defaults
418
+ const userDefaults = loadUserDefaults();
419
+ if (userDefaults) {
420
+ return mergeUserDefaults(config, userDefaults);
421
+ }
422
+ return config;
423
+ }
424
+
425
+ // No config found — return hardcoded defaults
426
+ return {
427
+ version: 2,
428
+ schema_version: 4,
429
+ mode: 'interactive',
430
+ depth: 'standard',
431
+ harness_profile: 'standard',
432
+ features: {
433
+ structured_planning: true,
434
+ goal_verification: true,
435
+ research_phase: true,
436
+ plan_checking: true,
437
+ sprint_contracts: false,
438
+ },
439
+ planning: {
440
+ commit_docs: false,
441
+ search_gitignored: false,
442
+ plan_depth: 'detailed',
443
+ },
444
+ git: {
445
+ branching: 'none',
446
+ },
447
+ parallelization: {
448
+ enabled: false,
449
+ },
450
+ };
451
+ }
452
+
453
+ /**
454
+ * Save config to .planning/config.json using atomic write.
455
+ *
456
+ * @param {string} planningDir - Path to .planning directory
457
+ * @param {object} config - Config object to save
458
+ * @returns {{ success: boolean, error?: string }}
459
+ */
460
+ function configSaveDefaults(planningDir, config) {
461
+ const configPath = path.join(planningDir, 'config.json');
462
+ ensureDir(planningDir);
463
+ return atomicWrite(configPath, JSON.stringify(config, null, 2));
464
+ }
465
+
466
+ // ─── Config get/set ───────────────────────────────────────────────────────────
467
+
468
+ /**
469
+ * Get a specific config value by dot-notation key path.
470
+ *
471
+ * @param {string} planningDir - Path to .planning directory
472
+ * @param {string} keyPath - Dot-notation key path (e.g., 'workflow.research')
473
+ * @returns {*} Config value or undefined
474
+ */
475
+ function configGet(planningDir, keyPath) {
476
+ const config = configLoad(planningDir);
477
+ if (!config || !keyPath) return undefined;
478
+
479
+ const keys = keyPath.split('.');
480
+ let current = config;
481
+ for (const key of keys) {
482
+ if (current === undefined || current === null || typeof current !== 'object') {
483
+ return undefined;
484
+ }
485
+ current = current[key];
486
+ }
487
+ return current;
488
+ }
489
+
490
+ /**
491
+ * Set a config value by dot-notation key path.
492
+ *
493
+ * @param {string} planningDir - Path to .planning directory
494
+ * @param {string} keyPath - Dot-notation key path
495
+ * @param {*} value - Value to set
496
+ * @returns {{ success: boolean, error?: string }}
497
+ */
498
+ function configSet(planningDir, keyPath, value) {
499
+ const configPath = path.join(planningDir, 'config.json');
500
+
501
+ let config = {};
502
+ try {
503
+ if (fs.existsSync(configPath)) {
504
+ config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
505
+ }
506
+ } catch (e) {
507
+ return { success: false, error: `Failed to read config.json: ${e.message}` };
508
+ }
509
+
510
+ // Parse value (handle booleans and numbers)
511
+ let parsedValue = value;
512
+ if (typeof value === 'string') {
513
+ if (value === 'true') parsedValue = true;
514
+ else if (value === 'false') parsedValue = false;
515
+ else if (!isNaN(value) && value !== '') parsedValue = Number(value);
516
+ }
517
+
518
+ // Set nested value using dot notation
519
+ const keys = keyPath.split('.');
520
+ let current = config;
521
+ for (let i = 0; i < keys.length - 1; i++) {
522
+ const key = keys[i];
523
+ if (current[key] === undefined || typeof current[key] !== 'object') {
524
+ current[key] = {};
525
+ }
526
+ current = current[key];
527
+ }
528
+ current[keys[keys.length - 1]] = parsedValue;
529
+
530
+ return atomicWrite(configPath, JSON.stringify(config, null, 2));
531
+ }
532
+
533
+ /**
534
+ * Ensure a config section exists with defaults.
535
+ * If the section already exists, missing keys from defaults are added.
536
+ * If the section does not exist, it is created with all defaults.
537
+ *
538
+ * @param {string} planningDir - Path to .planning directory
539
+ * @param {string} section - Section name (e.g., 'workflow', 'git')
540
+ * @param {object} defaults - Default values for the section
541
+ * @returns {{ success: boolean, created: boolean, error?: string }}
542
+ */
543
+ function configEnsureSection(planningDir, section, defaults) {
544
+ const configPath = path.join(planningDir, 'config.json');
545
+ ensureDir(planningDir);
546
+
547
+ let config = {};
548
+ let created = false;
549
+
550
+ try {
551
+ if (fs.existsSync(configPath)) {
552
+ config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
553
+ } else {
554
+ created = true;
555
+ }
556
+ } catch (_e) {
557
+ created = true;
558
+ }
559
+
560
+ if (!config[section]) {
561
+ config[section] = { ...defaults };
562
+ created = true;
563
+ } else {
564
+ // Merge missing keys from defaults
565
+ for (const [key, val] of Object.entries(defaults)) {
566
+ if (config[section][key] === undefined) {
567
+ config[section][key] = val;
568
+ created = true;
569
+ }
570
+ }
571
+ }
572
+
573
+ if (created) {
574
+ const result = atomicWrite(configPath, JSON.stringify(config, null, 2));
575
+ return { success: result.success, created: true, error: result.error };
576
+ }
577
+
578
+ return { success: true, created: false };
579
+ }
580
+
581
+ // ─── Global defaults (cross-project) ─────────────────────────────────────────
582
+
583
+ const os = require('os');
584
+
585
+ /**
586
+ * Load global defaults from ~/.pbr/defaults.json.
587
+ * Returns empty object if file doesn't exist or is invalid.
588
+ * This is the plan-specified API; loadUserDefaults() returns null on missing.
589
+ *
590
+ * @returns {object} Global defaults (never null)
591
+ */
592
+ function loadGlobalDefaults() {
593
+ const defaultsPath = path.join(os.homedir(), '.pbr', 'defaults.json');
594
+ if (!fs.existsSync(defaultsPath)) return {};
595
+ try {
596
+ return JSON.parse(fs.readFileSync(defaultsPath, 'utf-8'));
597
+ } catch (_e) { return {}; }
598
+ }
599
+
600
+ /**
601
+ * Save arbitrary data as global defaults to ~/.pbr/defaults.json.
602
+ * Unlike saveUserDefaults(), this saves the full data object without filtering.
603
+ *
604
+ * @param {object} data - Data to save as global defaults
605
+ * @returns {{ saved: boolean, path: string }}
606
+ */
607
+ function saveGlobalDefaults(data) {
608
+ const dir = path.join(os.homedir(), '.pbr');
609
+ fs.mkdirSync(dir, { recursive: true });
610
+ const defaultsPath = path.join(dir, 'defaults.json');
611
+ fs.writeFileSync(defaultsPath, JSON.stringify(data, null, 2), 'utf-8');
612
+ return { saved: true, path: defaultsPath };
613
+ }
614
+
615
+ // ─── User-level defaults ──────────────────────────────────────────────────────
616
+
617
+ const USER_DEFAULTS_DIR = path.join(
618
+ process.env.HOME || process.env.USERPROFILE || '',
619
+ '.pbr'
620
+ );
621
+
622
+ const USER_DEFAULTS_PATH = path.join(USER_DEFAULTS_DIR, 'defaults.json');
623
+
624
+ /**
625
+ * Load user-level defaults from ~/.pbr/defaults.json.
626
+ * Returns null if file doesn't exist or is invalid.
627
+ *
628
+ * @returns {object|null} User defaults or null
629
+ */
630
+ function loadUserDefaults() {
631
+ try {
632
+ if (!fs.existsSync(USER_DEFAULTS_PATH)) return null;
633
+ return JSON.parse(fs.readFileSync(USER_DEFAULTS_PATH, 'utf8'));
634
+ } catch (_e) {
635
+ return null;
636
+ }
637
+ }
638
+
639
+ /**
640
+ * Save current project config as user-level defaults.
641
+ * Only saves portable keys (excludes project-specific state).
642
+ *
643
+ * @param {object} config - Current project config.json contents
644
+ * @returns {{ saved: boolean, path: string, keys: string[] }}
645
+ */
646
+ function saveUserDefaults(config) {
647
+ const portableKeys = [
648
+ 'mode', 'depth', 'context_strategy', 'context_window_tokens',
649
+ 'features', 'models', 'parallelization',
650
+ 'planning', 'git', 'gates', 'safety',
651
+ 'hooks', 'dashboard', 'status_line'
652
+ ];
653
+
654
+ const defaults = {};
655
+ for (const key of portableKeys) {
656
+ if (config[key] !== undefined) {
657
+ defaults[key] = config[key];
658
+ }
659
+ }
660
+
661
+ ensureDir(USER_DEFAULTS_DIR);
662
+ fs.writeFileSync(USER_DEFAULTS_PATH, JSON.stringify(defaults, null, 2), 'utf8');
663
+
664
+ return {
665
+ saved: true,
666
+ path: USER_DEFAULTS_PATH,
667
+ keys: Object.keys(defaults)
668
+ };
669
+ }
670
+
671
+ /**
672
+ * Deep-merge user defaults into a base config.
673
+ * User defaults provide values only where the base config doesn't already set them.
674
+ *
675
+ * @param {object} base - The base config
676
+ * @param {object} userDefaults - User-level defaults
677
+ * @returns {object} Merged config
678
+ */
679
+ function mergeUserDefaults(base, userDefaults) {
680
+ if (!userDefaults) return base;
681
+
682
+ const result = { ...base };
683
+ for (const [key, value] of Object.entries(userDefaults)) {
684
+ if (result[key] === undefined) {
685
+ result[key] = value;
686
+ } else if (
687
+ typeof value === 'object' && value !== null && !Array.isArray(value) &&
688
+ typeof result[key] === 'object' && result[key] !== null && !Array.isArray(result[key])
689
+ ) {
690
+ result[key] = mergeUserDefaults(result[key], value);
691
+ }
692
+ }
693
+ return result;
694
+ }
695
+
696
+ // ─── GSD-compatible command wrappers ──────────────────────────────────────────
697
+
698
+ /**
699
+ * Command handler: ensure config section exists (creates default config if needed).
700
+ * Compatible with GSD pbr-tools command dispatch.
701
+ *
702
+ * @param {string} cwdArg - Working directory
703
+ * @param {boolean} raw - Whether to output raw value
704
+ */
705
+ function cmdConfigEnsureSection(cwdArg, raw) {
706
+ const { output, error: errorFn } = require('./core');
707
+ const configPath = path.join(cwdArg, '.planning', 'config.json');
708
+ const pDir = path.join(cwdArg, '.planning');
709
+
710
+ try {
711
+ if (!fs.existsSync(pDir)) {
712
+ fs.mkdirSync(pDir, { recursive: true });
713
+ }
714
+ } catch (err) {
715
+ errorFn('Failed to create .planning directory: ' + err.message);
716
+ }
717
+
718
+ if (fs.existsSync(configPath)) {
719
+ const result = { created: false, reason: 'already_exists' };
720
+ output(result, raw, 'exists');
721
+ return;
722
+ }
723
+
724
+ // Detect Brave Search API key availability
725
+ const homedir = require('os').homedir();
726
+ const braveKeyFile = path.join(homedir, '.pbr', 'brave_api_key');
727
+ const hasBraveSearch = !!(process.env.BRAVE_API_KEY || fs.existsSync(braveKeyFile));
728
+
729
+ // Load user-level defaults
730
+ const userDefaults = loadUserDefaults() || {};
731
+
732
+ const hardcoded = {
733
+ version: 2,
734
+ schema_version: 4,
735
+ mode: 'interactive',
736
+ depth: 'standard',
737
+ harness_profile: 'standard',
738
+ features: {
739
+ structured_planning: true,
740
+ goal_verification: true,
741
+ research_phase: true,
742
+ plan_checking: true,
743
+ sprint_contracts: false,
744
+ },
745
+ planning: {
746
+ commit_docs: false,
747
+ search_gitignored: false,
748
+ plan_depth: 'detailed',
749
+ },
750
+ git: {
751
+ branching: 'none',
752
+ },
753
+ parallelization: {
754
+ enabled: false,
755
+ },
756
+ };
757
+ const defaults = {
758
+ ...hardcoded,
759
+ ...userDefaults,
760
+ features: { ...hardcoded.features, ...(userDefaults.features || {}) },
761
+ planning: { ...hardcoded.planning, ...(userDefaults.planning || {}) },
762
+ git: { ...hardcoded.git, ...(userDefaults.git || {}) },
763
+ parallelization: { ...hardcoded.parallelization, ...(userDefaults.parallelization || {}) },
764
+ };
765
+
766
+ try {
767
+ fs.writeFileSync(configPath, JSON.stringify(defaults, null, 2), 'utf8');
768
+ const result = { created: true, path: '.planning/config.json' };
769
+ output(result, raw, 'created');
770
+ } catch (err) {
771
+ errorFn('Failed to create config.json: ' + err.message);
772
+ }
773
+ }
774
+
775
+ /**
776
+ * Command handler: set a config value.
777
+ *
778
+ * @param {string} cwdArg - Working directory
779
+ * @param {string} keyPath - Dot-notation key
780
+ * @param {*} value - Value to set
781
+ * @param {boolean} raw - Whether to output raw value
782
+ */
783
+ function cmdConfigSet(cwdArg, keyPath, value, raw) {
784
+ const { output, error: errorFn } = require('./core');
785
+ const configPath = path.join(cwdArg, '.planning', 'config.json');
786
+
787
+ if (!keyPath) {
788
+ errorFn('Usage: config-set <key.path> <value>');
789
+ }
790
+
791
+ let parsedValue = value;
792
+ if (value === 'true') parsedValue = true;
793
+ else if (value === 'false') parsedValue = false;
794
+ else if (!isNaN(value) && value !== '') parsedValue = Number(value);
795
+
796
+ let config = {};
797
+ try {
798
+ if (fs.existsSync(configPath)) {
799
+ config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
800
+ }
801
+ } catch (err) {
802
+ errorFn('Failed to read config.json: ' + err.message);
803
+ }
804
+
805
+ const keys = keyPath.split('.');
806
+ let current = config;
807
+ for (let i = 0; i < keys.length - 1; i++) {
808
+ const key = keys[i];
809
+ if (current[key] === undefined || typeof current[key] !== 'object') {
810
+ current[key] = {};
811
+ }
812
+ current = current[key];
813
+ }
814
+ current[keys[keys.length - 1]] = parsedValue;
815
+
816
+ try {
817
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf8');
818
+ const result = { updated: true, key: keyPath, value: parsedValue };
819
+ output(result, raw, `${keyPath}=${parsedValue}`);
820
+ } catch (err) {
821
+ errorFn('Failed to write config.json: ' + err.message);
822
+ }
823
+ }
824
+
825
+ /**
826
+ * Command handler: get a config value.
827
+ *
828
+ * @param {string} cwdArg - Working directory
829
+ * @param {string} keyPath - Dot-notation key
830
+ * @param {boolean} raw - Whether to output raw value
831
+ */
832
+ function cmdConfigGet(cwdArg, keyPath, raw) {
833
+ const { output, error: errorFn } = require('./core');
834
+ const configPath = path.join(cwdArg, '.planning', 'config.json');
835
+
836
+ if (!keyPath) {
837
+ errorFn('Usage: config-get <key.path>');
838
+ }
839
+
840
+ let config = {};
841
+ try {
842
+ if (fs.existsSync(configPath)) {
843
+ config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
844
+ } else {
845
+ errorFn('No config.json found at ' + configPath);
846
+ }
847
+ } catch (err) {
848
+ if (err.message.startsWith('No config.json')) throw err;
849
+ errorFn('Failed to read config.json: ' + err.message);
850
+ }
851
+
852
+ const keys = keyPath.split('.');
853
+ let current = config;
854
+ for (const key of keys) {
855
+ if (current === undefined || current === null || typeof current !== 'object') {
856
+ errorFn(`Key not found: ${keyPath}`);
857
+ }
858
+ current = current[key];
859
+ }
860
+
861
+ if (current === undefined) {
862
+ errorFn(`Key not found: ${keyPath}`);
863
+ }
864
+
865
+ output(current, raw, String(current));
866
+ }
867
+
868
+ // ─── Exports ──────────────────────────────────────────────────────────────────
869
+
870
+
871
+ // ─── hooks/lib additions (superset merge) ──────────────────────────────────
872
+
873
+ const CONFIG_DEFAULTS = {
874
+ version: 2,
875
+ schema_version: 4,
876
+ context_strategy: 'aggressive',
877
+ mode: 'interactive',
878
+ depth: 'standard',
879
+ harness_profile: 'standard',
880
+ session_phase_limit: 3,
881
+ session_cycling: 'compact',
882
+ context_window_tokens: 200000,
883
+ agent_checkpoint_pct: 50,
884
+ ceremony_level: 'auto',
885
+ orchestrator_budget_pct: 25,
886
+ skip_rag_max_lines: 50000,
887
+ features: {
888
+ structured_planning: true,
889
+ goal_verification: true,
890
+ integration_verification: true,
891
+ context_isolation: true,
892
+ atomic_commits: true,
893
+ session_persistence: true,
894
+ research_phase: true,
895
+ plan_checking: true,
896
+ tdd_mode: false,
897
+ status_line: true,
898
+ auto_continue: false,
899
+ auto_advance: false,
900
+ team_discussions: false,
901
+ inline_verify: false,
902
+ enhanced_session_start: true,
903
+ extended_context: false,
904
+ context_quality_scoring: true,
905
+ skip_rag: false,
906
+ zero_friction_quick: true,
907
+ post_hoc_artifacts: true,
908
+ inline_simple_tasks: true,
909
+ rich_agent_prompts: true,
910
+ multi_phase_awareness: true,
911
+ decision_journal: true,
912
+ negative_knowledge: true,
913
+ living_requirements: true,
914
+ trust_tracking: true,
915
+ confidence_calibration: true,
916
+ natural_language_routing: true,
917
+ adaptive_ceremony: true,
918
+ graduated_verification: true,
919
+ self_verification: true,
920
+ agent_feedback_loop: true,
921
+ session_metrics: true,
922
+ convention_memory: true,
923
+ mental_model_snapshots: true,
924
+ smart_next_task: true,
925
+ dependency_break_detection: true,
926
+ pre_research: true,
927
+ pattern_routing: true,
928
+ tech_debt_surfacing: true,
929
+ agent_teams: false,
930
+ competing_hypotheses: false,
931
+ dynamic_teams: false,
932
+ machine_executable_plans: false,
933
+ spec_diffing: true,
934
+ reverse_spec: false,
935
+ predictive_impact: true,
936
+ progress_visualization: true,
937
+ contextual_help: true,
938
+ team_onboarding: false,
939
+ regression_prevention: true,
940
+ security_scanning: true,
941
+ architecture_graph: true,
942
+ architecture_guard: true,
943
+ incident_journal: true,
944
+ live_verification: false,
945
+ sprint_contracts: false
946
+ },
947
+ autonomy: { level: 'supervised', max_retries: 2, error_strategy: 'retry' },
948
+ models: {
949
+ researcher: 'sonnet',
950
+ planner: 'sonnet',
951
+ executor: 'sonnet',
952
+ verifier: 'sonnet',
953
+ integration_checker: 'sonnet',
954
+ debugger: 'inherit',
955
+ mapper: 'sonnet',
956
+ synthesizer: 'haiku',
957
+ complexity_map: { simple: 'haiku', medium: 'sonnet', complex: 'inherit' }
958
+ },
959
+ model_profiles: {},
960
+ parallelization: {
961
+ enabled: false,
962
+ plan_level: false,
963
+ task_level: false,
964
+ max_concurrent_agents: 3,
965
+ min_plans_for_parallel: 2,
966
+ use_teams: false
967
+ },
968
+ teams: {
969
+ planning_roles: ['architect', 'security-reviewer', 'test-designer'],
970
+ review_roles: ['functional-reviewer', 'security-auditor', 'performance-analyst'],
971
+ synthesis_model: 'sonnet',
972
+ coordination: 'file-based'
973
+ },
974
+ planning: {
975
+ commit_docs: false,
976
+ max_tasks_per_plan: 3,
977
+ search_gitignored: false,
978
+ multi_phase: false,
979
+ plan_depth: 'detailed'
980
+ },
981
+ git: {
982
+ branching: 'none',
983
+ commit_format: '{type}({phase}-{plan}): {description}',
984
+ phase_branch_template: 'pbr/phase-{phase}-{slug}',
985
+ milestone_branch_template: 'pbr/{milestone}-{slug}',
986
+ mode: 'enabled',
987
+ auto_pr: false
988
+ },
989
+ ci: { gate_enabled: false, wait_timeout_seconds: 120 },
990
+ gates: {
991
+ confirm_project: true,
992
+ confirm_roadmap: true,
993
+ confirm_plan: true,
994
+ confirm_execute: false,
995
+ confirm_transition: true,
996
+ issues_review: false,
997
+ confirm_research: false,
998
+ confirm_seeds: false,
999
+ confirm_deferred: false,
1000
+ confirm_commit_docs: false,
1001
+ auto_checkpoints: false,
1002
+ checkpoint_auto_resolve: 'none'
1003
+ },
1004
+ safety: {
1005
+ always_confirm_destructive: true,
1006
+ always_confirm_external_services: true,
1007
+ enforce_phase_boundaries: true
1008
+ },
1009
+ timeouts: {
1010
+ task_default_ms: 300000,
1011
+ build_max_ms: 600000,
1012
+ verify_max_ms: 300000
1013
+ },
1014
+ hooks: {
1015
+ autoFormat: false,
1016
+ typeCheck: false,
1017
+ detectConsoleLogs: true,
1018
+ blockDocSprawl: true,
1019
+ compactThreshold: 50
1020
+ },
1021
+ prd: { auto_extract: false },
1022
+ depth_profiles: {},
1023
+ debug: { max_hypothesis_rounds: 5 },
1024
+ developer_profile: { enabled: false, inject_prompts: false },
1025
+ spinner_tips: { tips: [], exclude_defaults: false },
1026
+ dashboard: { auto_launch: false, port: 3141 },
1027
+ status_line: {
1028
+ sections: ['phase', 'plan', 'status', 'context'],
1029
+ brand_text: 'PBR',
1030
+ max_status_length: 80,
1031
+ context_bar: {
1032
+ width: 20,
1033
+ thresholds: { green: 50, yellow: 75 },
1034
+ chars: { filled: '\u2588', empty: '\u2591' }
1035
+ }
1036
+ },
1037
+ workflow: {
1038
+ enforce_pbr_skills: 'advisory',
1039
+ inline_execution: false,
1040
+ inline_max_tasks: 2,
1041
+ inline_context_cap_pct: 40,
1042
+ phase_boundary_clear: 'off',
1043
+ autonomous: false,
1044
+ speculative_planning: false,
1045
+ phase_replay: false,
1046
+ inline_max_files: 5,
1047
+ inline_max_lines: 50,
1048
+ max_phases_in_context: 3
1049
+ },
1050
+ hook_server: { enabled: false, port: 19836, event_log: true },
1051
+ intel: { enabled: false, auto_update: false, inject_on_start: false },
1052
+ context_ledger: { enabled: false, stale_after_minutes: 60 },
1053
+ learnings: { enabled: false, read_depth: 3, cross_project_knowledge: false },
1054
+ verification: { confidence_gate: false, confidence_threshold: 1, qa_rounds: 1, live_tools: ['chrome-mcp'], live_timeout_ms: 60000 },
1055
+ context_budget: { threshold_curve: 'linear' },
1056
+ ui: { enabled: false },
1057
+ worktree: { sparse_paths: [] }
1058
+ };
1059
+
1060
+ const CONFIG_SECTIONS = [
1061
+ {
1062
+ guide: '_guide_meta',
1063
+ lines: [
1064
+ 'schema_version: config schema version for migration detection',
1065
+ 'version: planning format version (v2 is current)'
1066
+ ],
1067
+ keys: ['schema_version', 'version']
1068
+ },
1069
+ {
1070
+ guide: '_guide_core',
1071
+ lines: [
1072
+ 'ceremony_level: auto|low|medium|high — override risk-based ceremony (auto = classifier decides)',
1073
+ 'context_strategy: aggressive|balanced|conservative — how aggressively PBR manages context budget',
1074
+ 'depth: quick|standard|comprehensive — thoroughness of research, planning, and verification',
1075
+ 'mode: interactive|autonomous — interactive pauses at gates, autonomous runs hands-free'
1076
+ ],
1077
+ keys: ['ceremony_level', 'context_strategy', 'depth', 'mode']
1078
+ },
1079
+ {
1080
+ guide: '_guide_context_window',
1081
+ lines: [
1082
+ 'agent_checkpoint_pct: 40-80 — context % where agents checkpoint and return',
1083
+ 'context_window_tokens: 100k-2M — your model\'s context size, scales all thresholds',
1084
+ 'orchestrator_budget_pct: 15-50 — % of context reserved for orchestrator (higher = more inline work)',
1085
+ 'session_cycling: tmux|compact-first|compact|manual — what happens when phase limit is reached',
1086
+ 'session_phase_limit: 0-20 — max phases per session before auto-pause (0 = disabled)',
1087
+ 'skip_rag_max_lines: projects under this LOC can load entire codebase into context',
1088
+ '',
1089
+ '--- 1M CONTEXT (Opus 4.6) RECOMMENDED VALUES ---',
1090
+ 'context_window_tokens: 1000000',
1091
+ 'agent_checkpoint_pct: 70 (default 50 for 200k models)',
1092
+ 'orchestrator_budget_pct: 35 (default 25 for 200k models)',
1093
+ 'session_phase_limit: 10 (default 3 for 200k, scales: 3@200k, 6@500k, 10@1M)',
1094
+ 'session_cycling: compact-first (try /compact before cycling sessions)',
1095
+ 'context_budget.threshold_curve: adaptive (shifts warnings up: 60/75/85 vs 50/70/85)',
1096
+ 'workflow.inline_context_cap_pct: 50 (500k tokens before forcing subagent delegation)',
1097
+ 'workflow.inline_max_files: 10, inline_max_lines: 100, inline_max_tasks: 3',
1098
+ 'workflow.max_phases_in_context: 6 (hold 6 phase plans simultaneously)',
1099
+ 'debug.max_hypothesis_rounds: 8 (longer investigation chains)'
1100
+ ],
1101
+ keys: ['agent_checkpoint_pct', 'context_window_tokens', 'orchestrator_budget_pct', 'session_cycling', 'session_phase_limit', 'skip_rag_max_lines']
1102
+ },
1103
+ {
1104
+ guide: '_guide_autonomy',
1105
+ lines: [
1106
+ 'autonomy.level: supervised|guided|collaborative|adaptive — progressive autonomy control',
1107
+ 'gates.confirm_*: pause for user confirmation (all false in autonomous mode)',
1108
+ 'gates.auto_checkpoints: auto-resolve checkpoint:human-verify tasks during build',
1109
+ 'gates.checkpoint_auto_resolve: none|verify-only|verify-and-decision|all',
1110
+ 'safety.always_confirm_destructive: always ask before destructive git ops',
1111
+ 'safety.always_confirm_external_services: always ask before calling external APIs',
1112
+ 'safety.enforce_phase_boundaries: prevent agents from working outside assigned phase'
1113
+ ],
1114
+ keys: ['autonomy', 'gates', 'safety']
1115
+ },
1116
+ {
1117
+ guide: '_guide_features',
1118
+ lines: [
1119
+ '--- CORE WORKFLOW ---',
1120
+ 'atomic_commits: one commit per task (not batched)',
1121
+ 'context_isolation: heavy work delegated to subagents to protect main context',
1122
+ 'session_persistence: persist state across sessions via STATE.md',
1123
+ 'structured_planning: use phased planning with ROADMAP + plan files',
1124
+ '',
1125
+ '--- RESEARCH & PLANNING ---',
1126
+ 'machine_executable_plans: programmatic task execution from parsed plans',
1127
+ 'plan_checking: validate plans via plan-checker agent before execution',
1128
+ 'pre_research: speculatively research upcoming phases at 70%+ completion',
1129
+ 'research_phase: run researcher agent before planning',
1130
+ 'reverse_spec: generate specs from existing code',
1131
+ 'spec_diffing: semantic diff when plans change',
1132
+ '',
1133
+ '--- EXECUTION ---',
1134
+ 'inline_simple_tasks: simple tasks (<N files, <N lines) run inline without subagent',
1135
+ 'post_hoc_artifacts: auto-generate SUMMARY.md from git history after execution',
1136
+ 'tdd_mode: red-green-refactor (3 commits per task instead of 1)',
1137
+ 'zero_friction_quick: skip pre-execution ceremony for quick tasks',
1138
+ '',
1139
+ '--- VERIFICATION ---',
1140
+ 'agent_feedback_loop: verification results feed back into executor prompts',
1141
+ 'confidence_calibration: confidence scores based on historical agent accuracy',
1142
+ 'goal_verification: run verifier agent after builds to check goals met',
1143
+ 'graduated_verification: trust-based verification depth (light/standard/thorough)',
1144
+ 'inline_verify: per-task verification after each commit (+10-20s per plan)',
1145
+ 'integration_verification: cross-phase integration checks',
1146
+ 'self_verification: executor self-checks before presenting output',
1147
+ 'trust_tracking: trust scores per agent type and task category',
1148
+ 'live_verification: live interaction testing for UI/API phases via browser automation',
1149
+ '',
1150
+ '--- AUTOMATION ---',
1151
+ 'auto_advance: chain build, review, plan automatically (requires autonomous mode)',
1152
+ 'auto_continue: write .auto-next signal on phase completion for chaining',
1153
+ '',
1154
+ '--- CONTEXT & SESSION ---',
1155
+ 'context_quality_scoring: track signal-to-noise ratio in context',
1156
+ 'enhanced_session_start: structured context injection at session start (~500 tokens)',
1157
+ 'mental_model_snapshots: capture working context at session end for instant resume',
1158
+ 'multi_phase_awareness: hold multiple phase plans simultaneously in context',
1159
+ 'rich_agent_prompts: enrich agent prompts with full project context',
1160
+ 'session_metrics: show metrics dashboard at session end',
1161
+ 'skip_rag: load entire codebase for small projects (under skip_rag_max_lines)',
1162
+ 'status_line: show PBR status bar in session UI',
1163
+ '',
1164
+ '--- KNOWLEDGE & INTELLIGENCE ---',
1165
+ 'adaptive_ceremony: risk-based ceremony adjustment per task',
1166
+ 'convention_memory: auto-detect and store project conventions',
1167
+ 'decision_journal: record WHY decisions were made in .planning/decisions/',
1168
+ 'dependency_break_detection: warn when upstream changes invalidate downstream plans',
1169
+ 'living_requirements: auto-update requirement status as phases complete',
1170
+ 'natural_language_routing: intent detection in /pbr:do',
1171
+ 'negative_knowledge: track what failed and why in .planning/negative-knowledge/',
1172
+ 'pattern_routing: file modification patterns trigger specialized agents',
1173
+ 'smart_next_task: dependency graph analysis for auto-continue suggestions',
1174
+ 'tech_debt_surfacing: surface tech debt in status dashboard',
1175
+ '',
1176
+ '--- QUALITY & SECURITY ---',
1177
+ 'architecture_graph: live module dependency tracking',
1178
+ 'architecture_guard: warn on dependency violations',
1179
+ 'predictive_impact: impact analysis using architecture graph',
1180
+ 'regression_prevention: smart test selection from changed files',
1181
+ 'security_scanning: OWASP-style scanning of changed files during build',
1182
+ '',
1183
+ '--- UI & VISUALIZATION ---',
1184
+ 'contextual_help: activity-specific suggestions based on current state',
1185
+ 'progress_visualization: phase dependency graph and timeline in dashboard',
1186
+ '',
1187
+ '--- TEAMS (disabled by default) ---',
1188
+ 'agent_teams: parallel worktree-based agent teams',
1189
+ 'competing_hypotheses: multiple approaches for complex problems',
1190
+ 'dynamic_teams: dynamic team composition per task',
1191
+ 'team_discussions: multi-perspective planning discussions',
1192
+ 'team_onboarding: generate onboarding guide from project docs'
1193
+ ],
1194
+ keys: ['features']
1195
+ },
1196
+ {
1197
+ guide: '_guide_models',
1198
+ lines: [
1199
+ 'Per-agent model: sonnet|opus|haiku|inherit',
1200
+ 'complexity_map: auto-select model by task difficulty',
1201
+ 'model_profiles: custom named presets (e.g. \'budget\' using haiku everywhere)'
1202
+ ],
1203
+ keys: ['models', 'model_profiles']
1204
+ },
1205
+ {
1206
+ guide: '_guide_parallelization',
1207
+ lines: [
1208
+ 'enabled: allow parallel plan execution within a wave',
1209
+ 'max_concurrent_agents: 1-10 — max simultaneous executor subagents',
1210
+ 'min_plans_for_parallel: minimum plans in a wave to trigger parallel execution',
1211
+ 'plan_level: parallelize at plan level (multiple plans in same wave)',
1212
+ 'task_level: parallelize at task level within a plan (not currently used)',
1213
+ 'use_teams: use Agent Teams for coordination (discussion only, never execution)',
1214
+ 'teams.*: roles and coordination strategy for team discussions'
1215
+ ],
1216
+ keys: ['parallelization', 'teams']
1217
+ },
1218
+ {
1219
+ guide: '_guide_workflow',
1220
+ lines: [
1221
+ 'autonomous: enable /pbr:autonomous for hands-free multi-phase execution',
1222
+ 'enforce_pbr_skills: advisory|block|off — PBR workflow compliance enforcement',
1223
+ 'inline_context_cap_pct: context % above which always spawn subagent',
1224
+ 'inline_execution: trivial plans execute inline without subagent',
1225
+ 'inline_max_files: max files for inline execution eligibility',
1226
+ 'inline_max_lines: max estimated lines of change for inline execution',
1227
+ 'inline_max_tasks: max tasks for inline execution eligibility',
1228
+ 'max_phases_in_context: max phase plans held simultaneously by orchestrator',
1229
+ 'phase_boundary_clear: recommend|enforce|off — /clear at phase boundaries',
1230
+ 'phase_replay: failed verification triggers replay with enriched context',
1231
+ 'speculative_planning: plan phase N+1 while executor runs phase N'
1232
+ ],
1233
+ keys: ['workflow']
1234
+ },
1235
+ {
1236
+ guide: '_guide_git',
1237
+ lines: [
1238
+ 'git.auto_pr: create GitHub PR after successful phase verification',
1239
+ 'git.branching: none|phase|milestone|disabled — branching strategy',
1240
+ 'git.commit_format: commit message template with {type}, {phase}, {plan}, {description}',
1241
+ 'git.mode: enabled|disabled — disabled skips all git operations',
1242
+ 'ci.gate_enabled: block wave advancement until CI passes',
1243
+ 'ci.wait_timeout_seconds: max seconds to wait for CI completion',
1244
+ 'planning.commit_docs: commit SUMMARY/VERIFICATION after builds',
1245
+ 'planning.max_tasks_per_plan: 1-10 — keeps plans focused and atomic',
1246
+ 'planning.multi_phase: enable --through flag for multi-phase planning',
1247
+ 'planning.plan_depth: detailed|high-level — plan specificity level',
1248
+ 'planning.search_gitignored: include gitignored files in codebase scanning'
1249
+ ],
1250
+ keys: ['ci', 'git', 'planning']
1251
+ },
1252
+ {
1253
+ guide: '_guide_verification',
1254
+ lines: [
1255
+ 'verification.confidence_gate: skip verification if executor reports 100% completion + tests pass',
1256
+ 'verification.confidence_threshold: 0.5-1.0 — minimum confidence to skip verification',
1257
+ 'verification.qa_rounds: 1-5 — number of build-QA-build iteration rounds (1 = current behavior)',
1258
+ 'verification.live_tools: MCP tool providers for live verification (default: chrome-mcp)',
1259
+ 'verification.live_timeout_ms: timeout for live interaction checks (default: 60000)'
1260
+ ],
1261
+ keys: ['verification']
1262
+ },
1263
+ {
1264
+ guide: '_guide_context_budget',
1265
+ lines: [
1266
+ 'context_budget.threshold_curve: linear|adaptive — warning threshold scaling',
1267
+ ' linear = fixed 50/70/85%, adaptive = shifts up for 1M context (60/75/85%)',
1268
+ 'context_ledger.enabled: track what files are in context and when they go stale',
1269
+ 'context_ledger.stale_after_minutes: 5-1440 — minutes before a read is considered stale'
1270
+ ],
1271
+ keys: ['context_budget', 'context_ledger']
1272
+ },
1273
+ {
1274
+ guide: '_guide_hooks',
1275
+ lines: [
1276
+ 'hook_server.enabled: route hooks through persistent HTTP server (faster than per-hook processes)',
1277
+ 'hook_server.port: TCP port for hook server (localhost only)',
1278
+ 'hooks.autoFormat: run auto-formatting after file writes',
1279
+ 'hooks.blockDocSprawl: block creation of excessive documentation files',
1280
+ 'hooks.compactThreshold: 10-200 — context % at which to suggest compaction',
1281
+ 'hooks.detectConsoleLogs: warn when console.log statements are added',
1282
+ 'hooks.typeCheck: run type checking after file writes'
1283
+ ],
1284
+ keys: ['hook_server', 'hooks']
1285
+ },
1286
+ {
1287
+ guide: '_guide_intelligence',
1288
+ lines: [
1289
+ 'intel.enabled: persistent codebase intelligence (architecture maps, file graph)',
1290
+ 'intel.auto_update: PostToolUse hooks queue intel updates on code changes',
1291
+ 'intel.inject_on_start: inject architecture summary into session context at start',
1292
+ 'learnings.enabled: cross-phase knowledge transfer via LEARNINGS.md',
1293
+ 'learnings.read_depth: 1-20 — how many prior phases\' learnings the planner reads',
1294
+ 'learnings.cross_project_knowledge: copy learnings to ~/.claude/pbr-knowledge/ for reuse'
1295
+ ],
1296
+ keys: ['intel', 'learnings']
1297
+ },
1298
+ {
1299
+ guide: '_guide_tools',
1300
+ lines: [
1301
+ 'dashboard: web UI for browsing .planning/ state (default port 3141)',
1302
+ 'debug.max_hypothesis_rounds: 1-20 — max hypothesis cycles for /pbr:debug',
1303
+ 'depth_profiles: override built-in quick/standard/comprehensive defaults',
1304
+ 'developer_profile: behavioral profiling from session history + prompt injection',
1305
+ 'prd.auto_extract: skip confirmation gate during PRD import',
1306
+ 'spinner_tips: custom messages shown during agent execution',
1307
+ 'status_line: status bar appearance (sections, branding, context bar)',
1308
+ 'timeouts: task/build/verify timeout limits in milliseconds',
1309
+ 'ui.enabled: enable UI design pipeline (/pbr:ui-phase, /pbr:ui-review)',
1310
+ 'worktree.sparse_paths: glob patterns for sparse checkout in agent worktrees'
1311
+ ],
1312
+ keys: ['dashboard', 'debug', 'depth_profiles', 'developer_profile', 'prd', 'spinner_tips', 'status_line', 'timeouts', 'ui', 'worktree']
1313
+ }
1314
+ ];
1315
+
1316
+ function sortKeys(obj) {
1317
+ if (obj === null || typeof obj !== 'object' || Array.isArray(obj)) return obj;
1318
+ const sorted = {};
1319
+ for (const key of Object.keys(obj).sort()) {
1320
+ sorted[key] = sortKeys(obj[key]);
1321
+ }
1322
+ return sorted;
1323
+ }
1324
+
1325
+ function configEnsureComplete(config, defaults) {
1326
+ if (!defaults) defaults = CONFIG_DEFAULTS;
1327
+ const result = { ...config };
1328
+ for (const [key, defaultValue] of Object.entries(defaults)) {
1329
+ if (result[key] === undefined) {
1330
+ // Key not in config — use default (deep clone objects/arrays)
1331
+ result[key] = (typeof defaultValue === 'object' && defaultValue !== null)
1332
+ ? JSON.parse(JSON.stringify(defaultValue))
1333
+ : defaultValue;
1334
+ } else if (
1335
+ typeof defaultValue === 'object' && defaultValue !== null && !Array.isArray(defaultValue) &&
1336
+ typeof result[key] === 'object' && result[key] !== null && !Array.isArray(result[key])
1337
+ ) {
1338
+ // Both are objects — merge recursively (config values take precedence)
1339
+ result[key] = configEnsureComplete(result[key], defaultValue);
1340
+ }
1341
+ // Scalar or array in config already set — config wins
1342
+ }
1343
+ return result;
1344
+ }
1345
+
1346
+ function resolveConfig(dir) {
1347
+ const config = configLoad(dir) || {};
1348
+
1349
+ // Apply feature defaults
1350
+ if (!config.features) config.features = {};
1351
+ if (config.features.graduated_verification === undefined) config.features.graduated_verification = true;
1352
+ if (config.features.self_verification === undefined) config.features.self_verification = true;
1353
+
1354
+ // Apply autonomy defaults
1355
+ if (!config.autonomy) config.autonomy = {};
1356
+ if (config.autonomy.level === undefined) config.autonomy.level = 'supervised';
1357
+
1358
+ return config;
1359
+ }
1360
+
1361
+ function resolveDepthProfile(config) {
1362
+ const depth = (config && config.depth) || 'standard';
1363
+ const defaults = DEPTH_PROFILE_DEFAULTS[depth] || DEPTH_PROFILE_DEFAULTS.standard;
1364
+
1365
+ // Merge user overrides if present
1366
+ const userOverrides = (config && config.depth_profiles && config.depth_profiles[depth]) || {};
1367
+ const profile = { ...defaults, ...userOverrides };
1368
+
1369
+ return { depth, profile };
1370
+ }
1371
+
1372
+ function configFormat(config) {
1373
+ // 1. Strip guide/comment keys and ensure all defaults present
1374
+ const clean = {};
1375
+ for (const [k, v] of Object.entries(config)) {
1376
+ if (!k.startsWith('_guide') && !k.startsWith('_comment')) {
1377
+ clean[k] = v;
1378
+ }
1379
+ }
1380
+ // Also strip _comment keys from features if present
1381
+ if (clean.features) {
1382
+ const cleanFeatures = {};
1383
+ for (const [k, v] of Object.entries(clean.features)) {
1384
+ if (!k.startsWith('_comment')) cleanFeatures[k] = v;
1385
+ }
1386
+ clean.features = cleanFeatures;
1387
+ }
1388
+ const full = configEnsureComplete(clean);
1389
+
1390
+ // 2. Build ordered output object
1391
+ const output = {};
1392
+ const placed = new Set();
1393
+
1394
+ for (const section of CONFIG_SECTIONS) {
1395
+ // Add guide comment
1396
+ output[section.guide] = section.lines;
1397
+
1398
+ // Add config keys in alphabetical order
1399
+ for (const key of section.keys) {
1400
+ if (full[key] !== undefined) {
1401
+ output[key] = sortKeys(full[key]);
1402
+ placed.add(key);
1403
+ }
1404
+ }
1405
+ }
1406
+
1407
+ // 3. Add any remaining keys not covered by sections (future-proofing)
1408
+ const remaining = Object.keys(full).filter(k => !placed.has(k) && !k.startsWith('_'));
1409
+ if (remaining.length > 0) {
1410
+ for (const key of remaining.sort()) {
1411
+ output[key] = sortKeys(full[key]);
1412
+ }
1413
+ }
1414
+
1415
+ return JSON.stringify(output, null, 2) + '\n';
1416
+ }
1417
+
1418
+ async function configWrite(planningDir, config) {
1419
+ const configPath = path.join(planningDir, 'config.json');
1420
+ const formatted = configFormat(config);
1421
+ const result = await lockedFileUpdate(configPath, () => formatted);
1422
+ if (!result.success) {
1423
+ // Fallback: write without lock (availability over consistency)
1424
+ fs.writeFileSync(configPath, formatted, 'utf8');
1425
+ }
1426
+ // Invalidate cache so next configLoad() picks up changes
1427
+ configClearCache();
1428
+ }
1429
+
1430
+ module.exports = {
1431
+ // Core config operations (from .cjs)
1432
+ configLoad,
1433
+ configClearCache,
1434
+ configValidate,
1435
+ configLoadDefaults,
1436
+ configSaveDefaults,
1437
+ configResolveDepth,
1438
+ configGet,
1439
+ configSet,
1440
+ configEnsureSection,
1441
+ // Hooks additions
1442
+ configEnsureComplete,
1443
+ configFormat,
1444
+ configWrite,
1445
+ resolveConfig,
1446
+ resolveDepthProfile,
1447
+ CONFIG_DEFAULTS,
1448
+ CONFIG_SECTIONS,
1449
+ // Depth profiles
1450
+ DEPTH_PROFILE_DEFAULTS,
1451
+ // Harness profiles
1452
+ HARNESS_PROFILE_DEFAULTS,
1453
+ MODEL_CAPABILITY_MAP,
1454
+ configResolveHarness,
1455
+ configGetEffective,
1456
+ recommendedHarnessProfile,
1457
+ // Global defaults
1458
+ loadGlobalDefaults,
1459
+ saveGlobalDefaults,
1460
+ // User defaults
1461
+ loadUserDefaults,
1462
+ saveUserDefaults,
1463
+ mergeUserDefaults,
1464
+ USER_DEFAULTS_PATH,
1465
+ // CLI command handlers
1466
+ cmdConfigEnsureSection,
1467
+ cmdConfigSet,
1468
+ cmdConfigGet,
1469
+ };