@sienklogic/plan-build-run 2.21.0 → 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 (983) hide show
  1. package/CHANGELOG.md +1331 -299
  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 +212 -34
  147. package/plugins/pbr/agents/dev-sync.md +206 -0
  148. package/plugins/pbr/agents/executor.md +737 -39
  149. package/plugins/pbr/agents/general.md +71 -6
  150. package/plugins/pbr/agents/integration-checker.md +148 -30
  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 -66
  154. package/plugins/pbr/agents/planner.md +451 -42
  155. package/plugins/pbr/agents/researcher.md +219 -36
  156. package/plugins/pbr/agents/roadmapper.md +398 -0
  157. package/plugins/pbr/agents/synthesizer.md +166 -26
  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 +571 -47
  161. package/plugins/pbr/commands/add-phase.md +75 -0
  162. package/plugins/pbr/commands/add-todo.md +8 -0
  163. package/plugins/pbr/commands/audit-fix.md +5 -0
  164. package/plugins/pbr/commands/audit-milestone.md +8 -0
  165. package/plugins/pbr/commands/autonomous.md +5 -0
  166. package/plugins/pbr/commands/backlog.md +6 -0
  167. package/plugins/pbr/commands/check-todos.md +8 -0
  168. package/plugins/pbr/commands/complete-milestone.md +8 -0
  169. package/plugins/pbr/commands/config.md +1 -1
  170. package/plugins/pbr/commands/discuss-phase.md +6 -0
  171. package/plugins/pbr/commands/do.md +5 -0
  172. package/plugins/pbr/commands/execute-phase.md +6 -0
  173. package/plugins/pbr/commands/fast.md +6 -0
  174. package/plugins/pbr/commands/forensics.md +6 -0
  175. package/plugins/pbr/commands/import.md +1 -1
  176. package/plugins/pbr/commands/insert-phase.md +65 -0
  177. package/plugins/pbr/commands/intel.md +5 -0
  178. package/plugins/pbr/commands/join-discord.md +11 -0
  179. package/plugins/pbr/commands/list-phase-assumptions.md +5 -0
  180. package/plugins/pbr/commands/map-codebase.md +6 -0
  181. package/plugins/pbr/commands/milestone-summary.md +6 -0
  182. package/plugins/pbr/commands/new-milestone.md +8 -0
  183. package/plugins/pbr/commands/new-project.md +6 -0
  184. package/plugins/pbr/commands/pause-work.md +5 -0
  185. package/plugins/pbr/commands/plan-milestone-gaps.md +7 -0
  186. package/plugins/pbr/commands/plan-phase.md +6 -0
  187. package/plugins/pbr/commands/plant-seed.md +6 -0
  188. package/plugins/pbr/commands/profile-user.md +5 -0
  189. package/plugins/pbr/commands/profile.md +5 -0
  190. package/plugins/pbr/commands/progress.md +6 -0
  191. package/plugins/pbr/commands/quick.md +1 -1
  192. package/plugins/pbr/commands/reapply-patches.md +47 -0
  193. package/plugins/pbr/commands/release.md +6 -0
  194. package/plugins/pbr/commands/remove-phase.md +66 -0
  195. package/plugins/pbr/commands/research-phase.md +59 -0
  196. package/plugins/pbr/commands/resume-work.md +5 -0
  197. package/plugins/pbr/commands/seed.md +6 -0
  198. package/plugins/pbr/commands/session-report.md +5 -0
  199. package/plugins/pbr/commands/set-profile.md +6 -0
  200. package/plugins/pbr/commands/settings.md +5 -0
  201. package/plugins/pbr/commands/setup.md +1 -1
  202. package/plugins/pbr/commands/ship.md +5 -0
  203. package/plugins/pbr/commands/stats.md +6 -0
  204. package/plugins/pbr/commands/test.md +5 -0
  205. package/plugins/pbr/commands/thread.md +6 -0
  206. package/plugins/pbr/commands/todo.md +1 -1
  207. package/plugins/pbr/commands/ui-phase.md +5 -0
  208. package/plugins/pbr/commands/ui-review.md +5 -0
  209. package/plugins/pbr/commands/undo.md +5 -0
  210. package/plugins/pbr/commands/update.md +37 -0
  211. package/plugins/pbr/commands/validate-phase.md +5 -0
  212. package/plugins/pbr/commands/verify-work.md +6 -0
  213. package/plugins/pbr/dashboard/package-lock.json +6 -0
  214. package/plugins/pbr/dist/architecture-guard.js +76 -0
  215. package/plugins/pbr/dist/audit-dimensions.js +556 -0
  216. package/plugins/pbr/dist/auto-continue.js +277 -0
  217. package/plugins/pbr/dist/block-skill-self-read.js +124 -0
  218. package/plugins/pbr/dist/check-agent-state-write.js +63 -0
  219. package/plugins/pbr/dist/check-config-change.js +213 -0
  220. package/plugins/pbr/dist/check-cross-plugin-sync.js +93 -0
  221. package/plugins/pbr/dist/check-dangerous-commands.js +193 -0
  222. package/plugins/pbr/dist/check-direct-state-write.js +37 -0
  223. package/plugins/pbr/dist/check-doc-sprawl.js +102 -0
  224. package/plugins/pbr/dist/check-phase-boundary.js +191 -0
  225. package/plugins/pbr/dist/check-plan-format.js +227 -0
  226. package/plugins/pbr/dist/check-read-first.js +345 -0
  227. package/plugins/pbr/dist/check-roadmap-sync.js +507 -0
  228. package/plugins/pbr/dist/check-skill-workflow.js +354 -0
  229. package/plugins/pbr/dist/check-state-sync.js +676 -0
  230. package/plugins/pbr/dist/check-subagent-output.js +425 -0
  231. package/plugins/pbr/dist/check-summary-gate.js +188 -0
  232. package/plugins/pbr/dist/context-bridge.js +425 -0
  233. package/plugins/pbr/dist/context-budget-check.js +442 -0
  234. package/plugins/pbr/dist/context-quality.js +271 -0
  235. package/plugins/pbr/dist/enforce-context-budget.js +138 -0
  236. package/plugins/pbr/dist/enforce-pbr-workflow.js +277 -0
  237. package/plugins/pbr/dist/event-handler.js +212 -0
  238. package/plugins/pbr/dist/event-logger.js +125 -0
  239. package/plugins/pbr/dist/feedback-loop.js +155 -0
  240. package/plugins/pbr/dist/graph-update.js +422 -0
  241. package/plugins/pbr/dist/hook-logger.js +114 -0
  242. package/plugins/pbr/dist/hook-server-client.js +361 -0
  243. package/plugins/pbr/dist/hook-server.js +664 -0
  244. package/plugins/pbr/dist/hooks-schema.json +87 -0
  245. package/plugins/pbr/dist/instructions-loaded.js +173 -0
  246. package/plugins/pbr/dist/intercept-plan-mode.js +81 -0
  247. package/plugins/pbr/dist/log-notification.js +131 -0
  248. package/plugins/pbr/dist/log-subagent.js +367 -0
  249. package/plugins/pbr/dist/log-tool-failure.js +140 -0
  250. package/plugins/pbr/dist/milestone-learnings.js +519 -0
  251. package/plugins/pbr/dist/pbr-tools.js +493 -0
  252. package/plugins/pbr/dist/post-bash-triage.js +96 -0
  253. package/plugins/pbr/dist/post-compact.js +135 -0
  254. package/plugins/pbr/dist/post-hoc.js +237 -0
  255. package/plugins/pbr/dist/post-write-dispatch.js +243 -0
  256. package/plugins/pbr/dist/post-write-quality.js +208 -0
  257. package/plugins/pbr/dist/pre-bash-dispatch.js +212 -0
  258. package/plugins/pbr/dist/pre-skill-dispatch.js +114 -0
  259. package/plugins/pbr/dist/pre-task-dispatch.js +269 -0
  260. package/plugins/pbr/dist/pre-write-dispatch.js +234 -0
  261. package/plugins/pbr/dist/progress-tracker.js +173 -0
  262. package/plugins/pbr/dist/prompt-guard.js +114 -0
  263. package/plugins/pbr/dist/prompt-routing.js +209 -0
  264. package/plugins/pbr/dist/quick-status.js +179 -0
  265. package/plugins/pbr/dist/record-incident.js +37 -0
  266. package/plugins/pbr/dist/run-hook.js +132 -0
  267. package/plugins/pbr/dist/session-cleanup.js +653 -0
  268. package/plugins/pbr/dist/session-tracker.js +124 -0
  269. package/plugins/pbr/dist/status-line.js +849 -0
  270. package/plugins/pbr/dist/suggest-compact.js +307 -0
  271. package/plugins/pbr/dist/sync-context-to-claude.js +100 -0
  272. package/plugins/pbr/dist/task-completed.js +206 -0
  273. package/plugins/pbr/dist/track-context-budget.js +432 -0
  274. package/plugins/pbr/dist/track-user-gates.js +88 -0
  275. package/plugins/pbr/dist/trust-tracker.js +193 -0
  276. package/plugins/pbr/dist/validate-commit.js +233 -0
  277. package/plugins/pbr/dist/validate-skill-args.js +222 -0
  278. package/plugins/pbr/dist/validate-task.js +271 -0
  279. package/plugins/pbr/dist/worktree-create.js +144 -0
  280. package/plugins/pbr/dist/worktree-remove.js +147 -0
  281. package/plugins/pbr/hooks/hooks.json +137 -65
  282. package/plugins/pbr/references/agent-contracts.md +39 -8
  283. package/plugins/pbr/references/agent-teams.md +3 -3
  284. package/plugins/pbr/references/archive/checkpoints.md +189 -0
  285. package/plugins/pbr/references/archive/context-quality-tiers.md +45 -0
  286. package/plugins/pbr/references/archive/hook-ordering.md +89 -0
  287. package/plugins/pbr/references/archive/limitations.md +106 -0
  288. package/plugins/pbr/references/archive/pbr-rules.md +194 -0
  289. package/plugins/pbr/references/archive/pbr-tools-cli.md +415 -0
  290. package/plugins/pbr/references/archive/pretooluse-jsonl-behavior.md +58 -0
  291. package/plugins/pbr/references/archive/signal-files.md +41 -0
  292. package/plugins/pbr/references/archive/tmux-setup.md +288 -0
  293. package/plugins/pbr/references/archive/verification-matrix.md +34 -0
  294. package/plugins/pbr/references/archive/verification-patterns.md +277 -0
  295. package/plugins/pbr/references/archive/worktree-sparse-checkout.md +86 -0
  296. package/plugins/pbr/references/assumptions.md +42 -0
  297. package/plugins/pbr/references/checkpoints.md +723 -104
  298. package/plugins/pbr/references/config-reference.md +387 -10
  299. package/plugins/pbr/references/continuation-format.md +1 -0
  300. package/plugins/pbr/references/decimal-phase-calculation.md +65 -0
  301. package/plugins/pbr/references/deviation-rules.md +12 -0
  302. package/plugins/pbr/references/few-shot-examples/audit.md +77 -0
  303. package/plugins/pbr/references/few-shot-examples/check-plan-format.md +172 -0
  304. package/plugins/pbr/references/few-shot-examples/check-subagent-output.md +118 -0
  305. package/plugins/pbr/references/few-shot-examples/integration-checker.md +70 -0
  306. package/plugins/pbr/references/few-shot-examples/nyquist-auditor.md +83 -0
  307. package/plugins/pbr/references/few-shot-examples/plan-checker.md +73 -0
  308. package/plugins/pbr/references/few-shot-examples/ui-checker.md +71 -0
  309. package/plugins/pbr/references/few-shot-examples/verifier.md +109 -0
  310. package/plugins/pbr/references/git-integration.md +110 -27
  311. package/plugins/pbr/references/git-planning-commit.md +35 -0
  312. package/plugins/pbr/references/model-profile-resolution.md +34 -0
  313. package/plugins/pbr/references/model-profiles.md +90 -7
  314. package/plugins/pbr/references/model-selection.md +1 -1
  315. package/plugins/pbr/references/node-repair.md +48 -0
  316. package/plugins/pbr/references/plan-authoring.md +65 -0
  317. package/plugins/pbr/references/plan-format.md +184 -10
  318. package/plugins/pbr/references/questioning.md +138 -49
  319. package/plugins/pbr/references/reading-verification.md +4 -4
  320. package/plugins/pbr/references/tdd.md +263 -0
  321. package/plugins/pbr/references/thinking-models-planning.md +47 -0
  322. package/plugins/pbr/references/thinking-models-verification.md +44 -0
  323. package/plugins/pbr/references/ui-brand.md +449 -0
  324. package/plugins/pbr/references/verification-overrides.md +39 -0
  325. package/plugins/pbr/references/verification-patterns.md +529 -113
  326. package/plugins/pbr/scripts/architecture-guard.js +76 -0
  327. package/plugins/pbr/scripts/audit-checks/behavioral-compliance.js +2098 -0
  328. package/plugins/pbr/scripts/audit-checks/error-analysis.js +989 -0
  329. package/plugins/pbr/scripts/audit-checks/feature-verification.js +723 -0
  330. package/plugins/pbr/scripts/audit-checks/index.js +433 -0
  331. package/plugins/pbr/scripts/audit-checks/infrastructure.js +816 -0
  332. package/plugins/pbr/scripts/audit-checks/quality-metrics.js +455 -0
  333. package/plugins/pbr/scripts/audit-checks/session-quality.js +980 -0
  334. package/plugins/pbr/scripts/audit-checks/si-agent-hook-config-checks.js +396 -0
  335. package/plugins/pbr/scripts/audit-checks/si-cross-cutting-checks.js +272 -0
  336. package/plugins/pbr/scripts/audit-checks/si-skill-checks.js +424 -0
  337. package/plugins/pbr/scripts/audit-checks/workflow-compliance.js +1175 -0
  338. package/plugins/pbr/scripts/audit-dimensions.js +556 -0
  339. package/plugins/pbr/scripts/auto-continue.js +192 -37
  340. package/plugins/pbr/scripts/block-skill-self-read.js +124 -0
  341. package/plugins/pbr/scripts/check-agent-state-write.js +63 -0
  342. package/plugins/pbr/scripts/check-config-change.js +84 -1
  343. package/plugins/pbr/scripts/check-cross-plugin-sync.js +93 -0
  344. package/plugins/pbr/scripts/check-dangerous-commands.js +18 -5
  345. package/plugins/pbr/scripts/check-direct-state-write.js +37 -0
  346. package/plugins/pbr/scripts/check-phase-boundary.js +3 -8
  347. package/plugins/pbr/scripts/check-plan-format.js +153 -278
  348. package/plugins/pbr/scripts/check-read-first.js +345 -0
  349. package/plugins/pbr/scripts/check-roadmap-sync.js +174 -19
  350. package/plugins/pbr/scripts/check-skill-workflow.js +24 -27
  351. package/plugins/pbr/scripts/check-state-sync.js +360 -218
  352. package/plugins/pbr/scripts/check-subagent-output.js +308 -273
  353. package/plugins/pbr/scripts/check-summary-gate.js +5 -15
  354. package/plugins/pbr/scripts/commands/benchmarks.js +195 -0
  355. package/plugins/pbr/scripts/commands/calibrate.js +530 -0
  356. package/plugins/pbr/scripts/commands/config.js +72 -0
  357. package/plugins/pbr/scripts/commands/misc.js +779 -0
  358. package/plugins/pbr/scripts/commands/phase.js +293 -0
  359. package/plugins/pbr/scripts/commands/roadmap.js +75 -0
  360. package/plugins/pbr/scripts/commands/state.js +84 -0
  361. package/plugins/pbr/scripts/commands/stress-test.js +349 -0
  362. package/plugins/pbr/scripts/commands/todo.js +191 -0
  363. package/plugins/pbr/scripts/commands/verify.js +169 -0
  364. package/plugins/pbr/scripts/config-schema.json +1183 -95
  365. package/plugins/pbr/scripts/context-bridge.js +425 -0
  366. package/plugins/pbr/scripts/context-budget-check.js +171 -16
  367. package/plugins/pbr/scripts/context-quality.js +271 -0
  368. package/plugins/pbr/scripts/enforce-context-budget.js +138 -0
  369. package/plugins/pbr/scripts/enforce-pbr-workflow.js +277 -0
  370. package/plugins/pbr/scripts/event-handler.js +137 -87
  371. package/plugins/pbr/scripts/event-logger.js +58 -25
  372. package/plugins/pbr/scripts/feedback-loop.js +155 -0
  373. package/plugins/pbr/scripts/graph-update.js +422 -0
  374. package/plugins/pbr/scripts/hook-logger.js +69 -35
  375. package/plugins/pbr/scripts/hook-server-client.js +361 -0
  376. package/plugins/pbr/scripts/hook-server.js +664 -0
  377. package/plugins/pbr/scripts/hooks-schema.json +12 -5
  378. package/plugins/pbr/scripts/instructions-loaded.js +173 -0
  379. package/plugins/pbr/scripts/intent-router.cjs +147 -0
  380. package/plugins/pbr/scripts/intercept-plan-mode.js +52 -18
  381. package/plugins/pbr/scripts/lib/alternatives.js +203 -0
  382. package/plugins/pbr/scripts/lib/audit.js +65 -0
  383. package/plugins/pbr/scripts/lib/auto-cleanup.js +221 -0
  384. package/plugins/pbr/scripts/lib/auto-verify.js +123 -0
  385. package/plugins/pbr/scripts/lib/benchmark.js +190 -0
  386. package/plugins/pbr/scripts/lib/build.js +719 -0
  387. package/plugins/pbr/scripts/lib/ci-fix-loop.js +228 -0
  388. package/plugins/pbr/scripts/lib/commands.js +483 -0
  389. package/plugins/pbr/scripts/lib/compound.js +222 -0
  390. package/plugins/pbr/scripts/lib/config-cache.js +83 -0
  391. package/plugins/pbr/scripts/lib/config.js +1469 -0
  392. package/plugins/pbr/scripts/lib/context.js +254 -0
  393. package/plugins/pbr/scripts/lib/contextual-help.js +183 -0
  394. package/plugins/pbr/scripts/lib/convention-detector.js +413 -0
  395. package/plugins/pbr/scripts/lib/core.js +1585 -0
  396. package/plugins/pbr/scripts/lib/dashboard-launch.js +364 -0
  397. package/plugins/pbr/scripts/lib/data-hygiene.js +179 -0
  398. package/plugins/pbr/scripts/lib/decision-extraction.js +183 -0
  399. package/plugins/pbr/scripts/lib/decisions.js +194 -0
  400. package/plugins/pbr/scripts/lib/dependency-break.js +147 -0
  401. package/plugins/pbr/scripts/lib/format-validators.js +1049 -0
  402. package/plugins/pbr/scripts/lib/frontmatter.js +302 -0
  403. package/plugins/pbr/scripts/lib/gates/advisories.js +133 -0
  404. package/plugins/pbr/scripts/lib/gates/build-dependency.js +118 -0
  405. package/plugins/pbr/scripts/lib/gates/build-executor.js +106 -0
  406. package/plugins/pbr/scripts/lib/gates/doc-existence.js +46 -0
  407. package/plugins/pbr/scripts/lib/gates/helpers.js +98 -0
  408. package/plugins/pbr/scripts/lib/gates/inline-execution.js +187 -0
  409. package/plugins/pbr/scripts/lib/gates/milestone-complete.js +139 -0
  410. package/plugins/pbr/scripts/lib/gates/milestone-summary.js +121 -0
  411. package/plugins/pbr/scripts/lib/gates/multi-phase-loader.js +149 -0
  412. package/plugins/pbr/scripts/lib/gates/plan-executor.js +36 -0
  413. package/plugins/pbr/scripts/lib/gates/plan-validation.js +115 -0
  414. package/plugins/pbr/scripts/lib/gates/quick-executor.js +78 -0
  415. package/plugins/pbr/scripts/lib/gates/review-planner.js +63 -0
  416. package/plugins/pbr/scripts/lib/gates/review-verifier.js +71 -0
  417. package/plugins/pbr/scripts/lib/gates/rich-agent-context.js +148 -0
  418. package/plugins/pbr/scripts/lib/gates/sprint-preflight.js +30 -0
  419. package/plugins/pbr/scripts/lib/gates/user-confirmation.js +95 -0
  420. package/plugins/pbr/scripts/lib/graph-cli.js +89 -0
  421. package/plugins/pbr/scripts/lib/graph.js +553 -0
  422. package/plugins/pbr/scripts/lib/handoff-validators.js +224 -0
  423. package/plugins/pbr/scripts/lib/health-checks.js +107 -0
  424. package/plugins/pbr/scripts/lib/health-phase06.js +120 -0
  425. package/plugins/pbr/scripts/lib/health.js +132 -0
  426. package/plugins/pbr/scripts/lib/help.js +100 -0
  427. package/plugins/pbr/scripts/lib/history.js +150 -0
  428. package/plugins/pbr/scripts/lib/impact-analysis.js +319 -0
  429. package/plugins/pbr/scripts/lib/incidents.js +190 -0
  430. package/plugins/pbr/scripts/lib/init.js +643 -0
  431. package/plugins/pbr/scripts/lib/insights-parser.js +320 -0
  432. package/plugins/pbr/scripts/lib/intel.js +653 -0
  433. package/plugins/pbr/scripts/lib/learnings.js +511 -0
  434. package/plugins/pbr/scripts/lib/migrate.js +309 -0
  435. package/plugins/pbr/scripts/lib/milestone.js +306 -0
  436. package/plugins/pbr/scripts/lib/msys-path.js +20 -0
  437. package/plugins/pbr/scripts/lib/negative-knowledge.js +194 -0
  438. package/plugins/pbr/scripts/lib/notification-throttle.js +141 -0
  439. package/plugins/pbr/scripts/lib/onboarding-generator.js +288 -0
  440. package/plugins/pbr/scripts/lib/parse-args.js +134 -0
  441. package/plugins/pbr/scripts/lib/pattern-routing.js +55 -0
  442. package/plugins/pbr/scripts/lib/patterns.js +272 -0
  443. package/plugins/pbr/scripts/lib/perf.js +190 -0
  444. package/plugins/pbr/scripts/lib/phase.js +1043 -0
  445. package/plugins/pbr/scripts/lib/pid-lock.js +156 -0
  446. package/plugins/pbr/scripts/lib/post-hoc.js +160 -0
  447. package/plugins/pbr/scripts/lib/pre-commit-checks.js +220 -0
  448. package/plugins/pbr/scripts/lib/pre-research.js +126 -0
  449. package/plugins/pbr/scripts/lib/premature-completion.js +312 -0
  450. package/plugins/pbr/scripts/lib/preview.js +174 -0
  451. package/plugins/pbr/scripts/lib/progress-visualization.js +296 -0
  452. package/plugins/pbr/scripts/lib/quick-init.js +131 -0
  453. package/plugins/pbr/scripts/lib/reference.js +236 -0
  454. package/plugins/pbr/scripts/lib/requirements.js +153 -0
  455. package/plugins/pbr/scripts/lib/resolve-root.js +66 -0
  456. package/plugins/pbr/scripts/lib/reverse-spec.js +259 -0
  457. package/plugins/pbr/scripts/lib/roadmap.js +1089 -0
  458. package/plugins/pbr/scripts/lib/security-scan.js +200 -0
  459. package/plugins/pbr/scripts/lib/session-briefing.js +918 -0
  460. package/plugins/pbr/scripts/lib/skill-section.js +99 -0
  461. package/plugins/pbr/scripts/lib/smart-next-task.js +198 -0
  462. package/plugins/pbr/scripts/lib/snapshot-manager.js +232 -0
  463. package/plugins/pbr/scripts/lib/spec-diff.js +209 -0
  464. package/plugins/pbr/scripts/lib/spec-engine.js +189 -0
  465. package/plugins/pbr/scripts/lib/spot-check.js +539 -0
  466. package/plugins/pbr/scripts/lib/state-queue.js +171 -0
  467. package/plugins/pbr/scripts/lib/state.js +1082 -0
  468. package/plugins/pbr/scripts/lib/status-render.js +511 -0
  469. package/plugins/pbr/scripts/lib/step-verify.js +149 -0
  470. package/plugins/pbr/scripts/lib/subagent-validators.js +1119 -0
  471. package/plugins/pbr/scripts/lib/suggest-next.js +435 -0
  472. package/plugins/pbr/scripts/lib/tech-debt-scanner.js +116 -0
  473. package/plugins/pbr/scripts/lib/templates.js +362 -0
  474. package/plugins/pbr/scripts/lib/test-selection.js +163 -0
  475. package/plugins/pbr/scripts/lib/todo.js +300 -0
  476. package/plugins/pbr/scripts/lib/verify.js +1561 -0
  477. package/plugins/pbr/scripts/log-notification.js +131 -0
  478. package/plugins/pbr/scripts/log-subagent.js +221 -18
  479. package/plugins/pbr/scripts/log-tool-failure.js +60 -8
  480. package/plugins/pbr/scripts/milestone-learnings.js +519 -0
  481. package/plugins/pbr/scripts/package.json +1 -1
  482. package/plugins/pbr/scripts/pbr-tools.js +362 -1247
  483. package/plugins/pbr/scripts/post-bash-triage.js +96 -0
  484. package/plugins/pbr/scripts/post-compact.js +135 -0
  485. package/plugins/pbr/scripts/post-hoc.js +237 -0
  486. package/plugins/pbr/scripts/post-write-dispatch.js +201 -31
  487. package/plugins/pbr/scripts/post-write-quality.js +4 -3
  488. package/plugins/pbr/scripts/pre-bash-dispatch.js +147 -51
  489. package/plugins/pbr/scripts/pre-skill-dispatch.js +114 -0
  490. package/plugins/pbr/scripts/pre-task-dispatch.js +269 -0
  491. package/plugins/pbr/scripts/pre-write-dispatch.js +170 -73
  492. package/plugins/pbr/scripts/progress-tracker.js +121 -324
  493. package/plugins/pbr/scripts/prompt-guard.js +114 -0
  494. package/plugins/pbr/scripts/prompt-routing.js +209 -0
  495. package/plugins/pbr/scripts/quick-status.js +179 -0
  496. package/plugins/pbr/scripts/record-incident.js +37 -0
  497. package/plugins/pbr/scripts/risk-classifier.cjs +123 -0
  498. package/plugins/pbr/scripts/run-hook.js +63 -23
  499. package/plugins/pbr/scripts/session-cleanup.js +428 -29
  500. package/plugins/pbr/scripts/session-tracker.js +124 -0
  501. package/plugins/pbr/scripts/status-line.js +593 -32
  502. package/plugins/pbr/scripts/suggest-compact.js +201 -13
  503. package/plugins/pbr/scripts/sync-context-to-claude.js +100 -0
  504. package/plugins/pbr/scripts/task-completed.js +165 -4
  505. package/plugins/pbr/scripts/test/config.test.js +126 -0
  506. package/plugins/pbr/scripts/test/cross-platform.test.js +120 -0
  507. package/plugins/pbr/scripts/test/fixtures/config.json +20 -0
  508. package/plugins/pbr/scripts/test/fixtures/plan.md +54 -0
  509. package/plugins/pbr/scripts/test/fixtures/project.md +30 -0
  510. package/plugins/pbr/scripts/test/fixtures/roadmap.md +55 -0
  511. package/plugins/pbr/scripts/test/fixtures/state.md +60 -0
  512. package/plugins/pbr/scripts/test/fixtures/summary.md +35 -0
  513. package/plugins/pbr/scripts/test/fixtures.test.js +184 -0
  514. package/plugins/pbr/scripts/test/phase.test.js +142 -0
  515. package/plugins/pbr/scripts/test/roadmap.test.js +96 -0
  516. package/plugins/pbr/scripts/test/state.test.js +155 -0
  517. package/plugins/pbr/scripts/track-context-budget.js +368 -104
  518. package/plugins/pbr/scripts/track-user-gates.js +88 -0
  519. package/plugins/pbr/scripts/trust-tracker.js +193 -0
  520. package/plugins/pbr/scripts/validate-commit.js +59 -26
  521. package/plugins/pbr/scripts/validate-skill-args.js +87 -15
  522. package/plugins/pbr/scripts/validate-task.js +83 -627
  523. package/plugins/pbr/scripts/worktree-create.js +144 -0
  524. package/plugins/pbr/scripts/worktree-remove.js +147 -0
  525. package/plugins/pbr/skills/audit/SKILL.md +195 -24
  526. package/plugins/pbr/skills/audit-fix/SKILL.md +326 -0
  527. package/plugins/pbr/skills/autonomous/SKILL.md +551 -0
  528. package/plugins/pbr/skills/backlog/SKILL.md +56 -0
  529. package/plugins/pbr/skills/begin/SKILL.md +508 -153
  530. package/plugins/pbr/skills/begin/templates/STATE.md.tmpl +1 -2
  531. package/plugins/pbr/skills/begin/templates/config.json.tmpl +419 -36
  532. package/plugins/pbr/skills/begin/templates/researcher-prompt.md.tmpl +28 -0
  533. package/plugins/pbr/skills/begin/templates/roadmap-prompt.md.tmpl +28 -3
  534. package/plugins/pbr/skills/begin/templates/synthesis-prompt.md.tmpl +33 -5
  535. package/plugins/pbr/skills/build/SKILL.md +1180 -358
  536. package/plugins/pbr/skills/build/templates/continuation-prompt.md.tmpl +26 -0
  537. package/plugins/pbr/skills/build/templates/executor-prompt.md.tmpl +77 -0
  538. package/plugins/pbr/skills/build/templates/inline-verifier-prompt.md.tmpl +33 -0
  539. package/plugins/pbr/skills/build/templates/qa-round-context.md.tmpl +16 -0
  540. package/plugins/pbr/skills/config/SKILL.md +112 -9
  541. package/plugins/pbr/skills/continue/SKILL.md +113 -33
  542. package/plugins/pbr/skills/dashboard/SKILL.md +21 -9
  543. package/plugins/pbr/skills/debug/SKILL.md +70 -12
  544. package/plugins/pbr/skills/debug/templates/continuation-prompt.md.tmpl +12 -1
  545. package/plugins/pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +12 -5
  546. package/plugins/pbr/skills/discuss/SKILL.md +205 -24
  547. package/plugins/pbr/skills/discuss/templates/CONTEXT.md.tmpl +21 -1
  548. package/plugins/pbr/skills/do/SKILL.md +119 -24
  549. package/plugins/pbr/skills/explore/SKILL.md +95 -20
  550. package/plugins/pbr/skills/fast/SKILL.md +94 -0
  551. package/plugins/pbr/skills/forensics/SKILL.md +144 -0
  552. package/plugins/pbr/skills/health/SKILL.md +35 -117
  553. package/plugins/pbr/skills/help/SKILL.md +83 -123
  554. package/plugins/pbr/skills/import/SKILL.md +332 -13
  555. package/plugins/pbr/skills/intel/SKILL.md +131 -0
  556. package/plugins/pbr/skills/list-phase-assumptions/SKILL.md +231 -0
  557. package/plugins/pbr/skills/milestone/SKILL.md +383 -274
  558. package/plugins/pbr/skills/milestone/templates/audit-output.md.tmpl +76 -0
  559. package/plugins/pbr/skills/milestone/templates/complete-output.md.tmpl +32 -0
  560. package/plugins/pbr/skills/milestone/templates/edge-cases.md +54 -0
  561. package/plugins/pbr/skills/milestone/templates/gaps-output.md.tmpl +25 -0
  562. package/plugins/pbr/skills/milestone/templates/integration-checker-prompt.md.tmpl +25 -0
  563. package/plugins/pbr/skills/milestone/templates/new-output.md.tmpl +29 -0
  564. package/plugins/pbr/skills/milestone-summary/SKILL.md +86 -0
  565. package/plugins/pbr/skills/note/SKILL.md +20 -4
  566. package/plugins/pbr/skills/pause/SKILL.md +54 -14
  567. package/plugins/pbr/skills/pause/templates/continue-here.md.tmpl +33 -52
  568. package/plugins/pbr/skills/plan/SKILL.md +526 -280
  569. package/plugins/pbr/skills/plan/templates/checker-prompt.md.tmpl +20 -2
  570. package/plugins/pbr/skills/plan/templates/completion-output.md.tmpl +27 -0
  571. package/plugins/pbr/skills/plan/templates/planner-prompt.md.tmpl +43 -1
  572. package/plugins/pbr/skills/plan/templates/revision-prompt.md.tmpl +21 -5
  573. package/plugins/pbr/skills/profile/SKILL.md +185 -0
  574. package/plugins/pbr/skills/profile-user/SKILL.md +227 -0
  575. package/plugins/pbr/skills/quick/SKILL.md +435 -100
  576. package/plugins/pbr/skills/release/SKILL.md +206 -0
  577. package/plugins/pbr/skills/resume/SKILL.md +170 -46
  578. package/plugins/pbr/skills/review/SKILL.md +233 -165
  579. package/plugins/pbr/skills/review/templates/verifier-prompt.md.tmpl +7 -0
  580. package/plugins/pbr/skills/scan/SKILL.md +152 -106
  581. package/plugins/pbr/skills/scan/templates/mapper-prompt.md.tmpl +5 -56
  582. package/plugins/pbr/skills/seed/SKILL.md +87 -0
  583. package/plugins/pbr/skills/session-report/SKILL.md +130 -0
  584. package/plugins/pbr/skills/setup/SKILL.md +150 -202
  585. package/plugins/pbr/skills/shared/agent-context-enrichment.md +21 -0
  586. package/plugins/pbr/skills/shared/agent-type-resolution.md +32 -0
  587. package/plugins/pbr/skills/shared/commit-planning-docs.md +8 -0
  588. package/plugins/pbr/skills/shared/context-budget.md +66 -1
  589. package/plugins/pbr/skills/shared/context-loader-task.md +18 -11
  590. package/plugins/pbr/skills/shared/criterion-writing.md +58 -0
  591. package/plugins/pbr/skills/shared/digest-select.md +2 -2
  592. package/plugins/pbr/skills/shared/domain-probes.md +1 -1
  593. package/plugins/pbr/skills/shared/error-reporting.md +38 -60
  594. package/plugins/pbr/skills/shared/gate-prompts.md +4 -2
  595. package/plugins/pbr/skills/shared/memory-capture.md +48 -0
  596. package/plugins/pbr/skills/shared/phase-argument-parsing.md +4 -4
  597. package/plugins/pbr/skills/shared/revision-loop.md +24 -6
  598. package/plugins/pbr/skills/shared/state-update.md +49 -56
  599. package/plugins/pbr/skills/shared/universal-anti-patterns.md +27 -4
  600. package/plugins/pbr/skills/ship/SKILL.md +155 -0
  601. package/plugins/pbr/skills/stats/SKILL.md +110 -0
  602. package/plugins/pbr/skills/status/SKILL.md +185 -119
  603. package/plugins/pbr/skills/test/SKILL.md +254 -0
  604. package/plugins/pbr/skills/thread/SKILL.md +73 -0
  605. package/plugins/pbr/skills/todo/SKILL.md +28 -72
  606. package/plugins/pbr/skills/ui-phase/SKILL.md +180 -0
  607. package/plugins/pbr/skills/ui-review/SKILL.md +206 -0
  608. package/plugins/pbr/skills/undo/SKILL.md +221 -0
  609. package/plugins/pbr/skills/validate-phase/SKILL.md +362 -0
  610. package/plugins/pbr/templates/CONTEXT.md.tmpl +45 -20
  611. package/plugins/pbr/templates/DISCOVERY.md.tmpl +29 -0
  612. package/plugins/pbr/templates/DISCUSSION-LOG.md.tmpl +49 -0
  613. package/plugins/pbr/templates/HANDOFF.json.tmpl +30 -0
  614. package/plugins/pbr/templates/INTEGRATION-REPORT.md.tmpl +18 -2
  615. package/plugins/pbr/templates/MILESTONE-AUDIT.md.tmpl +44 -0
  616. package/plugins/pbr/templates/PROJECT.md.tmpl +126 -0
  617. package/plugins/pbr/templates/REQUIREMENTS.md.tmpl +96 -0
  618. package/plugins/pbr/templates/RETROSPECTIVE.md.tmpl +43 -0
  619. package/plugins/pbr/templates/ROADMAP.md.tmpl +108 -14
  620. package/plugins/pbr/templates/SUMMARY-complex.md.tmpl +133 -0
  621. package/plugins/pbr/templates/SUMMARY-minimal.md.tmpl +55 -0
  622. package/plugins/pbr/templates/SUMMARY.md.tmpl +21 -0
  623. package/plugins/pbr/templates/UAT.md.tmpl +94 -0
  624. package/plugins/pbr/templates/UI-SPEC.md.tmpl +144 -0
  625. package/plugins/pbr/templates/VALIDATION.md.tmpl +94 -0
  626. package/plugins/pbr/templates/VERIFICATION-DETAIL.md.tmpl +54 -13
  627. package/plugins/pbr/templates/project-CONTEXT.md.tmpl +59 -0
  628. package/plugins/pbr/templates/research-outputs/ARCHITECTURE.md.tmpl +91 -0
  629. package/plugins/pbr/templates/research-outputs/FEATURES.md.tmpl +64 -0
  630. package/plugins/pbr/templates/research-outputs/PITFALLS.md.tmpl +50 -0
  631. package/plugins/pbr/templates/research-outputs/STACK.md.tmpl +63 -0
  632. package/plugins/pbr/templates/research-outputs/SUMMARY.md.tmpl +98 -0
  633. package/scripts/build-hooks.js +61 -0
  634. package/scripts/check-ci.js +100 -0
  635. package/scripts/clean-changelog.js +364 -0
  636. package/scripts/generate-derivatives.js +581 -0
  637. package/scripts/posttest.js +93 -0
  638. package/scripts/release.js +262 -0
  639. package/scripts/run-tests.cjs +29 -0
  640. package/scripts/test-wrapper.js +43 -0
  641. package/dashboard/bin/cli.js +0 -25
  642. package/dashboard/public/css/layout.css +0 -704
  643. package/dashboard/public/css/status-colors.css +0 -98
  644. package/dashboard/public/css/tokens.css +0 -59
  645. package/dashboard/public/js/htmx-title.js +0 -5
  646. package/dashboard/public/js/sidebar-toggle.js +0 -34
  647. package/dashboard/public/js/sse-client.js +0 -100
  648. package/dashboard/public/js/theme-toggle.js +0 -46
  649. package/dashboard/src/app.js +0 -91
  650. package/dashboard/src/middleware/current-phase.js +0 -24
  651. package/dashboard/src/middleware/errorHandler.js +0 -52
  652. package/dashboard/src/middleware/notFoundHandler.js +0 -9
  653. package/dashboard/src/repositories/planning.repository.js +0 -130
  654. package/dashboard/src/routes/events.routes.js +0 -45
  655. package/dashboard/src/routes/index.routes.js +0 -35
  656. package/dashboard/src/routes/pages.routes.js +0 -426
  657. package/dashboard/src/server.js +0 -42
  658. package/dashboard/src/services/analytics.service.js +0 -141
  659. package/dashboard/src/services/dashboard.service.js +0 -309
  660. package/dashboard/src/services/milestone.service.js +0 -222
  661. package/dashboard/src/services/notes.service.js +0 -50
  662. package/dashboard/src/services/phase.service.js +0 -232
  663. package/dashboard/src/services/project.service.js +0 -57
  664. package/dashboard/src/services/roadmap.service.js +0 -258
  665. package/dashboard/src/services/sse.service.js +0 -58
  666. package/dashboard/src/services/todo.service.js +0 -272
  667. package/dashboard/src/services/watcher.service.js +0 -48
  668. package/dashboard/src/utils/cache.js +0 -55
  669. package/dashboard/src/views/analytics.ejs +0 -5
  670. package/dashboard/src/views/coming-soon.ejs +0 -11
  671. package/dashboard/src/views/dependencies.ejs +0 -5
  672. package/dashboard/src/views/error.ejs +0 -20
  673. package/dashboard/src/views/index.ejs +0 -5
  674. package/dashboard/src/views/milestone-detail.ejs +0 -5
  675. package/dashboard/src/views/milestones.ejs +0 -5
  676. package/dashboard/src/views/notes.ejs +0 -5
  677. package/dashboard/src/views/partials/analytics-content.ejs +0 -90
  678. package/dashboard/src/views/partials/breadcrumbs.ejs +0 -14
  679. package/dashboard/src/views/partials/dashboard-content.ejs +0 -84
  680. package/dashboard/src/views/partials/dependencies-content.ejs +0 -48
  681. package/dashboard/src/views/partials/empty-state.ejs +0 -7
  682. package/dashboard/src/views/partials/footer.ejs +0 -3
  683. package/dashboard/src/views/partials/head.ejs +0 -30
  684. package/dashboard/src/views/partials/header.ejs +0 -21
  685. package/dashboard/src/views/partials/layout-bottom.ejs +0 -43
  686. package/dashboard/src/views/partials/layout-top.ejs +0 -16
  687. package/dashboard/src/views/partials/milestone-detail-content.ejs +0 -20
  688. package/dashboard/src/views/partials/milestones-content.ejs +0 -88
  689. package/dashboard/src/views/partials/notes-content.ejs +0 -23
  690. package/dashboard/src/views/partials/phase-content.ejs +0 -193
  691. package/dashboard/src/views/partials/phase-doc-content.ejs +0 -38
  692. package/dashboard/src/views/partials/phases-content.ejs +0 -124
  693. package/dashboard/src/views/partials/roadmap-content.ejs +0 -180
  694. package/dashboard/src/views/partials/sidebar.ejs +0 -99
  695. package/dashboard/src/views/partials/todo-create-content.ejs +0 -54
  696. package/dashboard/src/views/partials/todo-detail-content.ejs +0 -42
  697. package/dashboard/src/views/partials/todos-content.ejs +0 -97
  698. package/dashboard/src/views/phase-detail.ejs +0 -5
  699. package/dashboard/src/views/phase-doc.ejs +0 -5
  700. package/dashboard/src/views/phases.ejs +0 -5
  701. package/dashboard/src/views/roadmap.ejs +0 -5
  702. package/dashboard/src/views/todo-create.ejs +0 -5
  703. package/dashboard/src/views/todo-detail.ejs +0 -5
  704. package/dashboard/src/views/todos.ejs +0 -5
  705. package/plugins/copilot-pbr/CHANGELOG.md +0 -19
  706. package/plugins/copilot-pbr/README.md +0 -139
  707. package/plugins/copilot-pbr/agents/audit.agent.md +0 -113
  708. package/plugins/copilot-pbr/agents/codebase-mapper.agent.md +0 -151
  709. package/plugins/copilot-pbr/agents/debugger.agent.md +0 -182
  710. package/plugins/copilot-pbr/agents/executor.agent.md +0 -267
  711. package/plugins/copilot-pbr/agents/general.agent.md +0 -88
  712. package/plugins/copilot-pbr/agents/integration-checker.agent.md +0 -119
  713. package/plugins/copilot-pbr/agents/plan-checker.agent.md +0 -208
  714. package/plugins/copilot-pbr/agents/planner.agent.md +0 -238
  715. package/plugins/copilot-pbr/agents/researcher.agent.md +0 -186
  716. package/plugins/copilot-pbr/agents/synthesizer.agent.md +0 -126
  717. package/plugins/copilot-pbr/agents/verifier.agent.md +0 -228
  718. package/plugins/copilot-pbr/hooks/hooks.json +0 -258
  719. package/plugins/copilot-pbr/plugin.json +0 -30
  720. package/plugins/copilot-pbr/references/agent-anti-patterns.md +0 -25
  721. package/plugins/copilot-pbr/references/agent-contracts.md +0 -297
  722. package/plugins/copilot-pbr/references/agent-interactions.md +0 -135
  723. package/plugins/copilot-pbr/references/agent-teams.md +0 -55
  724. package/plugins/copilot-pbr/references/checkpoints.md +0 -158
  725. package/plugins/copilot-pbr/references/common-bug-patterns.md +0 -14
  726. package/plugins/copilot-pbr/references/config-reference.md +0 -442
  727. package/plugins/copilot-pbr/references/continuation-format.md +0 -213
  728. package/plugins/copilot-pbr/references/deviation-rules.md +0 -113
  729. package/plugins/copilot-pbr/references/git-integration.md +0 -227
  730. package/plugins/copilot-pbr/references/integration-patterns.md +0 -118
  731. package/plugins/copilot-pbr/references/model-profiles.md +0 -100
  732. package/plugins/copilot-pbr/references/model-selection.md +0 -32
  733. package/plugins/copilot-pbr/references/pbr-rules.md +0 -195
  734. package/plugins/copilot-pbr/references/pbr-tools-cli.md +0 -285
  735. package/plugins/copilot-pbr/references/plan-authoring.md +0 -182
  736. package/plugins/copilot-pbr/references/plan-format.md +0 -288
  737. package/plugins/copilot-pbr/references/planning-config.md +0 -214
  738. package/plugins/copilot-pbr/references/questioning.md +0 -215
  739. package/plugins/copilot-pbr/references/reading-verification.md +0 -128
  740. package/plugins/copilot-pbr/references/stub-patterns.md +0 -161
  741. package/plugins/copilot-pbr/references/subagent-coordination.md +0 -120
  742. package/plugins/copilot-pbr/references/ui-formatting.md +0 -444
  743. package/plugins/copilot-pbr/references/verification-patterns.md +0 -199
  744. package/plugins/copilot-pbr/references/wave-execution.md +0 -96
  745. package/plugins/copilot-pbr/rules/pbr-workflow.mdc +0 -48
  746. package/plugins/copilot-pbr/setup.ps1 +0 -93
  747. package/plugins/copilot-pbr/setup.sh +0 -93
  748. package/plugins/copilot-pbr/skills/audit/SKILL.md +0 -330
  749. package/plugins/copilot-pbr/skills/begin/SKILL.md +0 -589
  750. package/plugins/copilot-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  751. package/plugins/copilot-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  752. package/plugins/copilot-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  753. package/plugins/copilot-pbr/skills/begin/templates/config.json.tmpl +0 -64
  754. package/plugins/copilot-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  755. package/plugins/copilot-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  756. package/plugins/copilot-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  757. package/plugins/copilot-pbr/skills/build/SKILL.md +0 -960
  758. package/plugins/copilot-pbr/skills/config/SKILL.md +0 -250
  759. package/plugins/copilot-pbr/skills/continue/SKILL.md +0 -159
  760. package/plugins/copilot-pbr/skills/dashboard/SKILL.md +0 -43
  761. package/plugins/copilot-pbr/skills/debug/SKILL.md +0 -508
  762. package/plugins/copilot-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  763. package/plugins/copilot-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  764. package/plugins/copilot-pbr/skills/discuss/SKILL.md +0 -353
  765. package/plugins/copilot-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  766. package/plugins/copilot-pbr/skills/discuss/templates/decision-categories.md +0 -10
  767. package/plugins/copilot-pbr/skills/do/SKILL.md +0 -66
  768. package/plugins/copilot-pbr/skills/explore/SKILL.md +0 -373
  769. package/plugins/copilot-pbr/skills/health/SKILL.md +0 -283
  770. package/plugins/copilot-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  771. package/plugins/copilot-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  772. package/plugins/copilot-pbr/skills/help/SKILL.md +0 -193
  773. package/plugins/copilot-pbr/skills/import/SKILL.md +0 -502
  774. package/plugins/copilot-pbr/skills/milestone/SKILL.md +0 -806
  775. package/plugins/copilot-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  776. package/plugins/copilot-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  777. package/plugins/copilot-pbr/skills/note/SKILL.md +0 -213
  778. package/plugins/copilot-pbr/skills/pause/SKILL.md +0 -247
  779. package/plugins/copilot-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  780. package/plugins/copilot-pbr/skills/plan/SKILL.md +0 -662
  781. package/plugins/copilot-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  782. package/plugins/copilot-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  783. package/plugins/copilot-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  784. package/plugins/copilot-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  785. package/plugins/copilot-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  786. package/plugins/copilot-pbr/skills/quick/SKILL.md +0 -376
  787. package/plugins/copilot-pbr/skills/resume/SKILL.md +0 -399
  788. package/plugins/copilot-pbr/skills/review/SKILL.md +0 -653
  789. package/plugins/copilot-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  790. package/plugins/copilot-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  791. package/plugins/copilot-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  792. package/plugins/copilot-pbr/skills/scan/SKILL.md +0 -299
  793. package/plugins/copilot-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  794. package/plugins/copilot-pbr/skills/setup/SKILL.md +0 -296
  795. package/plugins/copilot-pbr/skills/shared/commit-planning-docs.md +0 -36
  796. package/plugins/copilot-pbr/skills/shared/config-loading.md +0 -103
  797. package/plugins/copilot-pbr/skills/shared/context-budget.md +0 -41
  798. package/plugins/copilot-pbr/skills/shared/context-loader-task.md +0 -87
  799. package/plugins/copilot-pbr/skills/shared/digest-select.md +0 -80
  800. package/plugins/copilot-pbr/skills/shared/domain-probes.md +0 -126
  801. package/plugins/copilot-pbr/skills/shared/error-recovery-strategies.md +0 -51
  802. package/plugins/copilot-pbr/skills/shared/error-reporting.md +0 -81
  803. package/plugins/copilot-pbr/skills/shared/gate-prompts.md +0 -389
  804. package/plugins/copilot-pbr/skills/shared/phase-argument-parsing.md +0 -46
  805. package/plugins/copilot-pbr/skills/shared/progress-display.md +0 -53
  806. package/plugins/copilot-pbr/skills/shared/revision-loop.md +0 -82
  807. package/plugins/copilot-pbr/skills/shared/state-loading.md +0 -63
  808. package/plugins/copilot-pbr/skills/shared/state-update.md +0 -162
  809. package/plugins/copilot-pbr/skills/shared/universal-anti-patterns.md +0 -38
  810. package/plugins/copilot-pbr/skills/status/SKILL.md +0 -362
  811. package/plugins/copilot-pbr/skills/statusline/SKILL.md +0 -149
  812. package/plugins/copilot-pbr/skills/todo/SKILL.md +0 -279
  813. package/plugins/copilot-pbr/templates/CONTEXT.md.tmpl +0 -53
  814. package/plugins/copilot-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  815. package/plugins/copilot-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  816. package/plugins/copilot-pbr/templates/ROADMAP.md.tmpl +0 -41
  817. package/plugins/copilot-pbr/templates/SUMMARY.md.tmpl +0 -82
  818. package/plugins/copilot-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  819. package/plugins/copilot-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  820. package/plugins/copilot-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  821. package/plugins/copilot-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  822. package/plugins/copilot-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  823. package/plugins/copilot-pbr/templates/codebase/STACK.md.tmpl +0 -78
  824. package/plugins/copilot-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  825. package/plugins/copilot-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  826. package/plugins/copilot-pbr/templates/continue-here.md.tmpl +0 -74
  827. package/plugins/copilot-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  828. package/plugins/copilot-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  829. package/plugins/copilot-pbr/templates/research/STACK.md.tmpl +0 -71
  830. package/plugins/copilot-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  831. package/plugins/copilot-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  832. package/plugins/copilot-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  833. package/plugins/copilot-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  834. package/plugins/cursor-pbr/.cursor-plugin/plugin.json +0 -32
  835. package/plugins/cursor-pbr/CHANGELOG.md +0 -15
  836. package/plugins/cursor-pbr/README.md +0 -123
  837. package/plugins/cursor-pbr/agents/audit.md +0 -178
  838. package/plugins/cursor-pbr/agents/codebase-mapper.md +0 -150
  839. package/plugins/cursor-pbr/agents/debugger.md +0 -181
  840. package/plugins/cursor-pbr/agents/executor.md +0 -266
  841. package/plugins/cursor-pbr/agents/general.md +0 -87
  842. package/plugins/cursor-pbr/agents/integration-checker.md +0 -118
  843. package/plugins/cursor-pbr/agents/plan-checker.md +0 -207
  844. package/plugins/cursor-pbr/agents/planner.md +0 -237
  845. package/plugins/cursor-pbr/agents/researcher.md +0 -185
  846. package/plugins/cursor-pbr/agents/synthesizer.md +0 -125
  847. package/plugins/cursor-pbr/agents/verifier.md +0 -227
  848. package/plugins/cursor-pbr/assets/.gitkeep +0 -0
  849. package/plugins/cursor-pbr/assets/logo.svg +0 -21
  850. package/plugins/cursor-pbr/hooks/hooks.json +0 -224
  851. package/plugins/cursor-pbr/references/agent-anti-patterns.md +0 -25
  852. package/plugins/cursor-pbr/references/agent-contracts.md +0 -297
  853. package/plugins/cursor-pbr/references/agent-interactions.md +0 -135
  854. package/plugins/cursor-pbr/references/agent-teams.md +0 -55
  855. package/plugins/cursor-pbr/references/checkpoints.md +0 -158
  856. package/plugins/cursor-pbr/references/common-bug-patterns.md +0 -14
  857. package/plugins/cursor-pbr/references/config-reference.md +0 -442
  858. package/plugins/cursor-pbr/references/continuation-format.md +0 -213
  859. package/plugins/cursor-pbr/references/deviation-rules.md +0 -113
  860. package/plugins/cursor-pbr/references/git-integration.md +0 -227
  861. package/plugins/cursor-pbr/references/integration-patterns.md +0 -118
  862. package/plugins/cursor-pbr/references/model-profiles.md +0 -100
  863. package/plugins/cursor-pbr/references/model-selection.md +0 -32
  864. package/plugins/cursor-pbr/references/pbr-rules.md +0 -195
  865. package/plugins/cursor-pbr/references/pbr-tools-cli.md +0 -285
  866. package/plugins/cursor-pbr/references/plan-authoring.md +0 -182
  867. package/plugins/cursor-pbr/references/plan-format.md +0 -288
  868. package/plugins/cursor-pbr/references/planning-config.md +0 -214
  869. package/plugins/cursor-pbr/references/questioning.md +0 -215
  870. package/plugins/cursor-pbr/references/reading-verification.md +0 -128
  871. package/plugins/cursor-pbr/references/stub-patterns.md +0 -161
  872. package/plugins/cursor-pbr/references/subagent-coordination.md +0 -120
  873. package/plugins/cursor-pbr/references/ui-formatting.md +0 -444
  874. package/plugins/cursor-pbr/references/verification-patterns.md +0 -199
  875. package/plugins/cursor-pbr/references/wave-execution.md +0 -96
  876. package/plugins/cursor-pbr/rules/pbr-workflow.mdc +0 -48
  877. package/plugins/cursor-pbr/setup.ps1 +0 -78
  878. package/plugins/cursor-pbr/setup.sh +0 -83
  879. package/plugins/cursor-pbr/skills/audit/SKILL.md +0 -331
  880. package/plugins/cursor-pbr/skills/begin/SKILL.md +0 -589
  881. package/plugins/cursor-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  882. package/plugins/cursor-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  883. package/plugins/cursor-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  884. package/plugins/cursor-pbr/skills/begin/templates/config.json.tmpl +0 -64
  885. package/plugins/cursor-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  886. package/plugins/cursor-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  887. package/plugins/cursor-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  888. package/plugins/cursor-pbr/skills/build/SKILL.md +0 -961
  889. package/plugins/cursor-pbr/skills/config/SKILL.md +0 -252
  890. package/plugins/cursor-pbr/skills/continue/SKILL.md +0 -159
  891. package/plugins/cursor-pbr/skills/dashboard/SKILL.md +0 -44
  892. package/plugins/cursor-pbr/skills/debug/SKILL.md +0 -512
  893. package/plugins/cursor-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  894. package/plugins/cursor-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  895. package/plugins/cursor-pbr/skills/discuss/SKILL.md +0 -354
  896. package/plugins/cursor-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  897. package/plugins/cursor-pbr/skills/discuss/templates/decision-categories.md +0 -10
  898. package/plugins/cursor-pbr/skills/do/SKILL.md +0 -67
  899. package/plugins/cursor-pbr/skills/explore/SKILL.md +0 -376
  900. package/plugins/cursor-pbr/skills/health/SKILL.md +0 -283
  901. package/plugins/cursor-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  902. package/plugins/cursor-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  903. package/plugins/cursor-pbr/skills/help/SKILL.md +0 -193
  904. package/plugins/cursor-pbr/skills/import/SKILL.md +0 -505
  905. package/plugins/cursor-pbr/skills/milestone/SKILL.md +0 -807
  906. package/plugins/cursor-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  907. package/plugins/cursor-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  908. package/plugins/cursor-pbr/skills/note/SKILL.md +0 -214
  909. package/plugins/cursor-pbr/skills/pause/SKILL.md +0 -248
  910. package/plugins/cursor-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  911. package/plugins/cursor-pbr/skills/plan/SKILL.md +0 -663
  912. package/plugins/cursor-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  913. package/plugins/cursor-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  914. package/plugins/cursor-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  915. package/plugins/cursor-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  916. package/plugins/cursor-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  917. package/plugins/cursor-pbr/skills/quick/SKILL.md +0 -376
  918. package/plugins/cursor-pbr/skills/resume/SKILL.md +0 -399
  919. package/plugins/cursor-pbr/skills/review/SKILL.md +0 -654
  920. package/plugins/cursor-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  921. package/plugins/cursor-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  922. package/plugins/cursor-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  923. package/plugins/cursor-pbr/skills/scan/SKILL.md +0 -300
  924. package/plugins/cursor-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  925. package/plugins/cursor-pbr/skills/setup/SKILL.md +0 -296
  926. package/plugins/cursor-pbr/skills/shared/commit-planning-docs.md +0 -36
  927. package/plugins/cursor-pbr/skills/shared/config-loading.md +0 -103
  928. package/plugins/cursor-pbr/skills/shared/context-budget.md +0 -41
  929. package/plugins/cursor-pbr/skills/shared/context-loader-task.md +0 -87
  930. package/plugins/cursor-pbr/skills/shared/digest-select.md +0 -80
  931. package/plugins/cursor-pbr/skills/shared/domain-probes.md +0 -126
  932. package/plugins/cursor-pbr/skills/shared/error-recovery-strategies.md +0 -51
  933. package/plugins/cursor-pbr/skills/shared/error-reporting.md +0 -81
  934. package/plugins/cursor-pbr/skills/shared/gate-prompts.md +0 -389
  935. package/plugins/cursor-pbr/skills/shared/phase-argument-parsing.md +0 -46
  936. package/plugins/cursor-pbr/skills/shared/progress-display.md +0 -53
  937. package/plugins/cursor-pbr/skills/shared/revision-loop.md +0 -82
  938. package/plugins/cursor-pbr/skills/shared/state-loading.md +0 -63
  939. package/plugins/cursor-pbr/skills/shared/state-update.md +0 -162
  940. package/plugins/cursor-pbr/skills/shared/universal-anti-patterns.md +0 -38
  941. package/plugins/cursor-pbr/skills/status/SKILL.md +0 -362
  942. package/plugins/cursor-pbr/skills/statusline/SKILL.md +0 -150
  943. package/plugins/cursor-pbr/skills/todo/SKILL.md +0 -280
  944. package/plugins/cursor-pbr/templates/CONTEXT.md.tmpl +0 -53
  945. package/plugins/cursor-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  946. package/plugins/cursor-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  947. package/plugins/cursor-pbr/templates/ROADMAP.md.tmpl +0 -41
  948. package/plugins/cursor-pbr/templates/SUMMARY.md.tmpl +0 -82
  949. package/plugins/cursor-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  950. package/plugins/cursor-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  951. package/plugins/cursor-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  952. package/plugins/cursor-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  953. package/plugins/cursor-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  954. package/plugins/cursor-pbr/templates/codebase/STACK.md.tmpl +0 -78
  955. package/plugins/cursor-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  956. package/plugins/cursor-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  957. package/plugins/cursor-pbr/templates/continue-here.md.tmpl +0 -74
  958. package/plugins/cursor-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  959. package/plugins/cursor-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  960. package/plugins/cursor-pbr/templates/research/STACK.md.tmpl +0 -71
  961. package/plugins/cursor-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  962. package/plugins/cursor-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  963. package/plugins/cursor-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  964. package/plugins/cursor-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  965. package/plugins/pbr/references/agent-interactions.md +0 -134
  966. package/plugins/pbr/references/pbr-rules.md +0 -194
  967. package/plugins/pbr/references/pbr-tools-cli.md +0 -285
  968. package/plugins/pbr/references/planning-config.md +0 -213
  969. package/plugins/pbr/references/subagent-coordination.md +0 -119
  970. package/plugins/pbr/references/ui-formatting.md +0 -444
  971. package/plugins/pbr/scripts/validate-plugin-structure.js +0 -183
  972. package/plugins/pbr/skills/milestone/templates/audit-report.md.tmpl +0 -48
  973. package/plugins/pbr/skills/shared/error-recovery-strategies.md +0 -51
  974. package/plugins/pbr/skills/shared/progress-display.md +0 -53
  975. package/plugins/pbr/skills/shared/state-loading.md +0 -62
  976. package/plugins/pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -97
  977. package/plugins/pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  978. package/plugins/pbr/templates/research/STACK.md.tmpl +0 -71
  979. package/plugins/pbr/templates/research/SUMMARY.md.tmpl +0 -112
  980. package/plugins/pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  981. package/plugins/pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  982. package/plugins/pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  983. /package/plugins/pbr/references/{agent-anti-patterns.md → archive/agent-anti-patterns.md} +0 -0
@@ -0,0 +1,980 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Session Quality & UX Check Module
5
+ *
6
+ * Implements SQ-01 through SQ-03 session quality dimensions for the PBR audit system.
7
+ * Each check returns a structured result: { dimension, status, message, evidence }.
8
+ *
9
+ * Checks:
10
+ * SQ-01: Session start quality (progress-tracker briefing injection)
11
+ * SQ-02: Briefing freshness (STATE.md staleness and size)
12
+ * SQ-03: Session duration/cost analysis (duration and tool call volume)
13
+ *
14
+ * Shared helpers:
15
+ * readJsonlFiles(logsDir, prefix) — reads all {prefix}-*.jsonl files
16
+ * readHookLogs(logsDir) — reads hook logs
17
+ * readEventLogs(logsDir) — reads event logs
18
+ * getLogsDir(planningDir) — resolves logs directory path
19
+ */
20
+
21
+ const fs = require('fs');
22
+ const path = require('path');
23
+
24
+ // ---------------------------------------------------------------------------
25
+ // Result helper
26
+ // ---------------------------------------------------------------------------
27
+
28
+ /**
29
+ * Build a structured check result.
30
+ * @param {string} dimCode - Dimension code (e.g. "SQ-01")
31
+ * @param {'pass'|'warn'|'fail'|'info'} status
32
+ * @param {string} message
33
+ * @param {string[]} [evidence]
34
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
35
+ */
36
+ function result(dimCode, status, message, evidence) {
37
+ return {
38
+ dimension: dimCode,
39
+ status,
40
+ message,
41
+ evidence: evidence || [],
42
+ };
43
+ }
44
+
45
+ // ---------------------------------------------------------------------------
46
+ // Shared JSONL helpers
47
+ // ---------------------------------------------------------------------------
48
+
49
+ /**
50
+ * Return the logs directory path for a planning directory.
51
+ * @param {string} planningDir
52
+ * @returns {string}
53
+ */
54
+ function getLogsDir(planningDir) {
55
+ return path.join(planningDir, 'logs');
56
+ }
57
+
58
+ /**
59
+ * Read all {prefix}-*.jsonl files in logsDir, parse each line as JSON.
60
+ * Returns a flat array of parsed entries. Skips unparseable lines.
61
+ * Returns empty array if directory is missing.
62
+ * @param {string} logsDir
63
+ * @param {string} prefix
64
+ * @returns {object[]}
65
+ */
66
+ function readJsonlFiles(logsDir, prefix) {
67
+ if (!fs.existsSync(logsDir)) return [];
68
+
69
+ const entries = [];
70
+ let files;
71
+ try {
72
+ files = fs.readdirSync(logsDir).filter(f => f.startsWith(prefix + '-') && f.endsWith('.jsonl'));
73
+ } catch (_e) {
74
+ return [];
75
+ }
76
+
77
+ for (const file of files) {
78
+ try {
79
+ const content = fs.readFileSync(path.join(logsDir, file), 'utf8');
80
+ const lines = content.split('\n');
81
+ for (const line of lines) {
82
+ const trimmed = line.trim();
83
+ if (!trimmed) continue;
84
+ try {
85
+ entries.push(JSON.parse(trimmed));
86
+ } catch (_e) {
87
+ // intentionally silent: skip malformed JSONL lines
88
+ }
89
+ }
90
+ } catch (_e) {
91
+ // intentionally silent: file may not exist or be unreadable
92
+ }
93
+ }
94
+
95
+ return entries;
96
+ }
97
+
98
+ /**
99
+ * Read all hook log entries from logsDir.
100
+ * @param {string} logsDir
101
+ * @returns {object[]}
102
+ */
103
+ function readHookLogs(logsDir) {
104
+ return readJsonlFiles(logsDir, 'hooks');
105
+ }
106
+
107
+ /**
108
+ * Read all event log entries from logsDir.
109
+ * @param {string} logsDir
110
+ * @returns {object[]}
111
+ */
112
+ function readEventLogs(logsDir) {
113
+ return readJsonlFiles(logsDir, 'events');
114
+ }
115
+
116
+ // ---------------------------------------------------------------------------
117
+ // SQ-01: Session Start Quality
118
+ // ---------------------------------------------------------------------------
119
+
120
+ /**
121
+ * Check whether progress-tracker injected a session-start briefing.
122
+ * Examines hook logs for progress-tracker SessionStart entries and
123
+ * event logs for workflow/session-start entries.
124
+ *
125
+ * @param {string} planningDir - Path to .planning directory
126
+ * @param {object} _config - Audit config (unused for this check)
127
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
128
+ */
129
+ function checkSessionStartQuality(planningDir, _config) {
130
+ const logsDir = getLogsDir(planningDir);
131
+ const hookLogs = readHookLogs(logsDir);
132
+ const eventLogs = readEventLogs(logsDir);
133
+
134
+ // Find progress-tracker SessionStart entries in hook logs
135
+ const hookStarts = hookLogs.filter(
136
+ e => e.hook === 'progress-tracker' && e.event === 'SessionStart'
137
+ );
138
+
139
+ // Find session-start entries in event logs
140
+ const eventStarts = eventLogs.filter(
141
+ e => e.cat === 'workflow' && e.event === 'session-start'
142
+ );
143
+
144
+ const allStarts = [...hookStarts, ...eventStarts];
145
+
146
+ if (allStarts.length === 0) {
147
+ return result('SQ-01', 'warn', 'No session start events found in logs', [
148
+ 'No session start events found in logs',
149
+ ]);
150
+ }
151
+
152
+ // Check how many sessions had briefing injection
153
+ // Hook logs: decision === 'injected' or presence of output/additionalContext
154
+ // Event logs: details might contain hasState or injected fields
155
+ let injectedCount = 0;
156
+ let totalCount = allStarts.length;
157
+ const evidence = [];
158
+
159
+ for (const entry of hookStarts) {
160
+ const injected = entry.decision === 'injected' || entry.decision === 'inject' ||
161
+ (entry.detail && typeof entry.detail === 'string' && entry.detail.includes('inject'));
162
+ const hasState = entry.hasState !== undefined ? entry.hasState : 'unknown';
163
+ if (injected) injectedCount++;
164
+ evidence.push(`Session start: briefing ${injected ? 'injected' : 'not injected'} (hasState: ${hasState})`);
165
+ }
166
+
167
+ for (const entry of eventStarts) {
168
+ const injected = entry.injected === true || entry.hasState === true;
169
+ if (injected) injectedCount++;
170
+ evidence.push(`Session start event: briefing ${injected ? 'injected' : 'not detected'} (ts: ${entry.ts || 'unknown'})`);
171
+ }
172
+
173
+ let status;
174
+ let message;
175
+ if (injectedCount === totalCount) {
176
+ status = 'pass';
177
+ message = `All ${totalCount} sessions had briefing injection`;
178
+ } else if (injectedCount > 0) {
179
+ status = 'warn';
180
+ message = `${injectedCount}/${totalCount} sessions had briefing injection`;
181
+ } else {
182
+ status = 'fail';
183
+ message = `No sessions had briefing injection (${totalCount} sessions checked)`;
184
+ }
185
+
186
+ return result('SQ-01', status, message, evidence);
187
+ }
188
+
189
+ // ---------------------------------------------------------------------------
190
+ // SQ-02: Briefing Freshness
191
+ // ---------------------------------------------------------------------------
192
+
193
+ /**
194
+ * Measure STATE.md staleness and size relative to the most recent session start.
195
+ * Fresh = STATE.md modified within 1 hour of session start. Bloated = over 5000 chars.
196
+ *
197
+ * @param {string} planningDir - Path to .planning directory
198
+ * @param {object} _config - Audit config (unused for this check)
199
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
200
+ */
201
+ function checkBriefingFreshness(planningDir, _config) {
202
+ const stateFile = path.join(planningDir, 'STATE.md');
203
+
204
+ // Check STATE.md existence
205
+ if (!fs.existsSync(stateFile)) {
206
+ return result('SQ-02', 'info', 'No STATE.md found', ['STATE.md does not exist']);
207
+ }
208
+
209
+ let stateMtime;
210
+ let stateContent;
211
+ try {
212
+ const stat = fs.statSync(stateFile);
213
+ stateMtime = stat.mtime;
214
+ stateContent = fs.readFileSync(stateFile, 'utf8');
215
+ } catch (_e) {
216
+ return result('SQ-02', 'warn', 'Could not read STATE.md', ['Error reading STATE.md']);
217
+ }
218
+
219
+ const stateSize = stateContent.length;
220
+ const evidence = [];
221
+
222
+ // Find most recent session-start from event logs
223
+ const logsDir = getLogsDir(planningDir);
224
+ const eventLogs = readEventLogs(logsDir);
225
+ const sessionStarts = eventLogs
226
+ .filter(e => e.cat === 'workflow' && e.event === 'session-start' && e.ts)
227
+ .sort((a, b) => new Date(b.ts).getTime() - new Date(a.ts).getTime());
228
+
229
+ if (sessionStarts.length === 0) {
230
+ // No session data — report size only
231
+ const sizeAssessment = stateSize > 5000 ? 'bloated' : 'reasonable';
232
+ evidence.push(`STATE.md: ${stateSize} chars (${sizeAssessment}), no session data to compare staleness`);
233
+ if (stateSize > 5000) {
234
+ return result('SQ-02', 'warn', `STATE.md is bloated (${stateSize} chars) — no session timing data`, evidence);
235
+ }
236
+ return result('SQ-02', 'info', 'No session data to measure staleness', evidence);
237
+ }
238
+
239
+ // Compare most recent session start to STATE.md mtime
240
+ const latestStart = new Date(sessionStarts[0].ts);
241
+ const stalenessMs = latestStart.getTime() - stateMtime.getTime();
242
+ const stalenessMin = Math.round(stalenessMs / 60000);
243
+ const isStale = stalenessMs > 3600000; // >1 hour
244
+ const isBloated = stateSize > 5000;
245
+
246
+ const ageStr = stalenessMs >= 0
247
+ ? `${stalenessMin}min before session start`
248
+ : `${Math.abs(stalenessMin)}min after session start`;
249
+
250
+ evidence.push(`STATE.md: ${stateSize} chars, last modified ${ageStr}`);
251
+ evidence.push(`Size assessment: ${isBloated ? 'bloated (>5000 chars)' : 'reasonable'}`);
252
+ evidence.push(`Freshness: ${isStale ? 'stale (>1h)' : 'fresh'}`);
253
+
254
+ let status;
255
+ let message;
256
+ if (!isStale && !isBloated) {
257
+ status = 'pass';
258
+ message = `STATE.md is fresh and ${stateSize} chars`;
259
+ } else {
260
+ status = 'warn';
261
+ const issues = [];
262
+ if (isStale) issues.push(`stale (${ageStr})`);
263
+ if (isBloated) issues.push(`bloated (${stateSize} chars)`);
264
+ message = `STATE.md: ${issues.join(', ')}`;
265
+ }
266
+
267
+ return result('SQ-02', status, message, evidence);
268
+ }
269
+
270
+ // ---------------------------------------------------------------------------
271
+ // SQ-03: Session Duration & Cost Analysis
272
+ // ---------------------------------------------------------------------------
273
+
274
+ /**
275
+ * Measure session durations and tool call volumes. Flags sessions exceeding
276
+ * the configured duration threshold.
277
+ *
278
+ * @param {string} planningDir - Path to .planning directory
279
+ * @param {object} config - Audit config (uses config.audit.thresholds.session_duration_warn_ms)
280
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
281
+ */
282
+ function checkSessionDurationCost(planningDir, config) {
283
+ const logsDir = getLogsDir(planningDir);
284
+ const eventLogs = readEventLogs(logsDir);
285
+
286
+ // Get duration threshold from config (default 1 hour)
287
+ const thresholds = (config && config.audit && config.audit.thresholds) || {};
288
+ const session_duration_warn_ms = thresholds.session_duration_warn_ms || 3600000;
289
+
290
+ // Find all session-start events
291
+ const sessionStarts = eventLogs
292
+ .filter(e => e.cat === 'workflow' && e.event === 'session-start' && e.ts)
293
+ .sort((a, b) => new Date(a.ts).getTime() - new Date(b.ts).getTime());
294
+
295
+ if (sessionStarts.length === 0) {
296
+ return result('SQ-03', 'info', 'No session data', ['No session-start events found in logs']);
297
+ }
298
+
299
+ // Find session-end events
300
+ const sessionEnds = eventLogs
301
+ .filter(e => e.cat === 'workflow' && (e.event === 'session-end' || e.event === 'session-stop') && e.ts)
302
+ .sort((a, b) => new Date(a.ts).getTime() - new Date(b.ts).getTime());
303
+
304
+ // Count all tool-use events for cost proxy
305
+ const toolUseEvents = eventLogs.filter(
306
+ e => e.cat === 'tool' || e.event === 'tool-use' || e.event === 'PostToolUse'
307
+ );
308
+
309
+ // Also check hook logs for tool-use events as a supplementary source
310
+ const hookLogs = readHookLogs(logsDir);
311
+ const hookToolEvents = hookLogs.filter(e => e.event === 'PostToolUse' || e.event === 'PreToolUse');
312
+
313
+ const evidence = [];
314
+ let anyExceeded = false;
315
+
316
+ for (let i = 0; i < sessionStarts.length; i++) {
317
+ const startTs = new Date(sessionStarts[i].ts).getTime();
318
+ const startDate = new Date(sessionStarts[i].ts).toISOString().slice(0, 16);
319
+
320
+ // Find the matching end: next session-end after this start but before next start
321
+ const nextStartTs = i + 1 < sessionStarts.length
322
+ ? new Date(sessionStarts[i + 1].ts).getTime()
323
+ : Infinity;
324
+
325
+ const matchingEnd = sessionEnds.find(e => {
326
+ const endTs = new Date(e.ts).getTime();
327
+ return endTs > startTs && endTs <= nextStartTs;
328
+ });
329
+
330
+ let endTs;
331
+ if (matchingEnd) {
332
+ endTs = new Date(matchingEnd.ts).getTime();
333
+ } else {
334
+ // Use last event before next session start as approximate end
335
+ const eventsInRange = eventLogs
336
+ .filter(e => e.ts && new Date(e.ts).getTime() > startTs && new Date(e.ts).getTime() < nextStartTs)
337
+ .map(e => new Date(e.ts).getTime());
338
+ endTs = eventsInRange.length > 0 ? Math.max(...eventsInRange) : startTs;
339
+ }
340
+
341
+ const durationMs = endTs - startTs;
342
+ const durationMin = Math.round(durationMs / 60000);
343
+
344
+ // Count tool calls within this session's time range
345
+ const sessionToolCalls = toolUseEvents.filter(e => {
346
+ if (!e.ts) return false;
347
+ const t = new Date(e.ts).getTime();
348
+ return t >= startTs && t < nextStartTs;
349
+ }).length;
350
+
351
+ const sessionHookCalls = hookToolEvents.filter(e => {
352
+ if (!e.ts) return false;
353
+ const t = new Date(e.ts).getTime();
354
+ return t >= startTs && t < nextStartTs;
355
+ }).length;
356
+
357
+ const totalCalls = sessionToolCalls + sessionHookCalls;
358
+
359
+ if (durationMs > session_duration_warn_ms) {
360
+ anyExceeded = true;
361
+ }
362
+
363
+ evidence.push(`Session ${startDate}: ${durationMin}min, ${totalCalls} tool calls`);
364
+ }
365
+
366
+ let status;
367
+ let message;
368
+ if (anyExceeded) {
369
+ status = 'warn';
370
+ message = `${sessionStarts.length} session(s) analyzed — some exceeded ${Math.round(session_duration_warn_ms / 60000)}min threshold`;
371
+ } else {
372
+ status = 'pass';
373
+ message = `${sessionStarts.length} session(s) analyzed — all within duration threshold`;
374
+ }
375
+
376
+ return result('SQ-03', status, message, evidence);
377
+ }
378
+
379
+ // ---------------------------------------------------------------------------
380
+ // SQ-04: Skill Routing Accuracy
381
+ // ---------------------------------------------------------------------------
382
+
383
+ /**
384
+ * Evaluate whether /pbr:do routing events matched user intent.
385
+ * Scans hook logs for check-skill-workflow entries (blocks = misroutes)
386
+ * and event logs for skill-workflow-block events.
387
+ *
388
+ * @param {string} planningDir - Path to .planning directory
389
+ * @param {object} _config - Audit config (unused for this check)
390
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
391
+ */
392
+ function checkSkillRoutingAccuracy(planningDir, _config) {
393
+ const logsDir = getLogsDir(planningDir);
394
+ const hookLogs = readHookLogs(logsDir);
395
+ const eventLogs = readEventLogs(logsDir);
396
+
397
+ // Find skill-workflow hook entries (routing enforcement events)
398
+ const skillWorkflowHooks = hookLogs.filter(
399
+ e => e.hook === 'check-skill-workflow'
400
+ );
401
+
402
+ // Find skill-workflow-block events in event logs
403
+ const routingBlocks = eventLogs.filter(
404
+ e => e.cat === 'workflow' && e.event === 'skill-workflow-block'
405
+ );
406
+
407
+ // Find /pbr:do usage — event log entries mentioning "do" skill or routing
408
+ const doSkillEvents = eventLogs.filter(
409
+ e => (e.skill === 'do' || e.event === 'natural-language-routing' ||
410
+ (e.detail && typeof e.detail === 'string' && e.detail.includes('pbr:do')))
411
+ );
412
+
413
+ const evidence = [];
414
+
415
+ // Count routing events
416
+ let blocked = 0;
417
+ let successful = 0;
418
+
419
+ for (const entry of skillWorkflowHooks) {
420
+ if (entry.decision === 'block') {
421
+ blocked++;
422
+ const detail = entry.file || entry.skill || 'unknown';
423
+ evidence.push(`Routing block: skill=${entry.skill || 'unknown'}, file=${detail}`);
424
+ } else {
425
+ successful++;
426
+ }
427
+ }
428
+
429
+ // Count event-log blocks
430
+ for (const entry of routingBlocks) {
431
+ blocked++;
432
+ evidence.push(`Workflow block event: ${entry.detail || entry.reason || 'no detail'}`);
433
+ }
434
+
435
+ // Count /pbr:do events as successful routes (unless already counted as blocks)
436
+ for (const entry of doSkillEvents) {
437
+ successful++;
438
+ evidence.push(`/pbr:do routing: ${entry.detail || entry.event || 'routed'}`);
439
+ }
440
+
441
+ const total = successful + blocked;
442
+
443
+ if (total === 0) {
444
+ return result('SQ-04', 'info', 'No skill routing events found in logs', [
445
+ 'No routing events detected in hook or event logs',
446
+ ]);
447
+ }
448
+
449
+ evidence.unshift(`Skill routing: ${successful}/${total} successful, ${blocked} blocked`);
450
+
451
+ let status;
452
+ if (blocked === 0 || (successful / total) > 0.9) {
453
+ status = 'pass';
454
+ } else {
455
+ status = 'warn';
456
+ }
457
+
458
+ const message = `Skill routing: ${successful}/${total} successful, ${blocked} blocked`;
459
+ return result('SQ-04', status, message, evidence);
460
+ }
461
+
462
+ // ---------------------------------------------------------------------------
463
+ // SQ-05: Memory Update Tracking
464
+ // ---------------------------------------------------------------------------
465
+
466
+ /**
467
+ * Detect auto-memory save events (writes to MEMORY.md, agent-memory/, notes/).
468
+ * Scans event logs and hook logs for write events targeting memory-related paths.
469
+ *
470
+ * @param {string} planningDir - Path to .planning directory
471
+ * @param {object} _config - Audit config (unused for this check)
472
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
473
+ */
474
+ function checkMemoryUpdateTracking(planningDir, _config) {
475
+ const logsDir = getLogsDir(planningDir);
476
+ const hookLogs = readHookLogs(logsDir);
477
+ const eventLogs = readEventLogs(logsDir);
478
+
479
+ const evidence = [];
480
+ const memoryPaths = [];
481
+
482
+ // Scan hook logs for writes to memory-related paths
483
+ const memoryPatterns = ['MEMORY.md', 'agent-memory', '.claude/memory', '.claude/notes'];
484
+ for (const entry of hookLogs) {
485
+ const filePath = entry.file || entry.path || '';
486
+ if (memoryPatterns.some(p => filePath.includes(p))) {
487
+ memoryPaths.push(filePath);
488
+ evidence.push(`Hook log: memory write to ${path.basename(filePath)}`);
489
+ }
490
+ }
491
+
492
+ // Scan event logs for memory-related writes
493
+ for (const entry of eventLogs) {
494
+ const filePath = entry.file || entry.path || entry.detail || '';
495
+ if (typeof filePath === 'string' && memoryPatterns.some(p => filePath.includes(p))) {
496
+ memoryPaths.push(filePath);
497
+ evidence.push(`Event log: memory activity at ${path.basename(filePath)}`);
498
+ }
499
+ }
500
+
501
+ // Check for recent notes in .planning/notes/
502
+ const notesDir = path.join(planningDir, 'notes');
503
+ if (fs.existsSync(notesDir)) {
504
+ try {
505
+ const noteFiles = fs.readdirSync(notesDir).filter(f => f.endsWith('.md'));
506
+ const now = Date.now();
507
+ const recentThreshold = 24 * 60 * 60 * 1000; // 24 hours
508
+ for (const noteFile of noteFiles) {
509
+ try {
510
+ const stat = fs.statSync(path.join(notesDir, noteFile));
511
+ if (now - stat.mtime.getTime() < recentThreshold) {
512
+ memoryPaths.push(noteFile);
513
+ evidence.push(`Recent note: ${noteFile}`);
514
+ }
515
+ } catch (_e) {
516
+ // intentionally silent: note file may not exist or be unreadable
517
+ }
518
+ }
519
+ } catch (_e) {
520
+ // intentionally silent: directory may not exist
521
+ }
522
+ }
523
+
524
+ const count = memoryPaths.length;
525
+ evidence.unshift(`Memory updates: ${count} saves detected`);
526
+
527
+ let status;
528
+ let message;
529
+ if (count > 0) {
530
+ status = 'pass';
531
+ message = `${count} memory update(s) detected during session`;
532
+ } else {
533
+ status = 'info';
534
+ message = 'No memory updates detected (session may not have had new learnings)';
535
+ }
536
+
537
+ return result('SQ-05', status, message, evidence);
538
+ }
539
+
540
+ // ---------------------------------------------------------------------------
541
+ // SQ-06: Convention Detection Monitoring
542
+ // ---------------------------------------------------------------------------
543
+
544
+ /**
545
+ * Check whether the convention_memory feature is active and capturing conventions.
546
+ * Examines config, conventions storage, and log entries for convention-detector activity.
547
+ *
548
+ * @param {string} planningDir - Path to .planning directory
549
+ * @param {object} config - Audit config (uses config.features.convention_memory)
550
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
551
+ */
552
+ function checkConventionDetectionMonitoring(planningDir, config) {
553
+ const features = (config && config.features) || {};
554
+ const conventionMemoryEnabled = features.convention_memory === true;
555
+
556
+ if (!conventionMemoryEnabled) {
557
+ return result('SQ-06', 'info', 'convention_memory feature disabled', [
558
+ 'config.features.convention_memory is not enabled',
559
+ ]);
560
+ }
561
+
562
+ const evidence = [];
563
+
564
+ // Check if conventions storage exists
565
+ const conventionsJson = path.join(planningDir, 'conventions.json');
566
+ const conventionsDir = path.join(planningDir, 'conventions');
567
+ let conventionsCount = 0;
568
+
569
+ if (fs.existsSync(conventionsJson)) {
570
+ try {
571
+ const content = fs.readFileSync(conventionsJson, 'utf8');
572
+ const parsed = JSON.parse(content);
573
+ if (Array.isArray(parsed)) {
574
+ conventionsCount = parsed.length;
575
+ } else if (typeof parsed === 'object' && parsed !== null) {
576
+ conventionsCount = Object.keys(parsed).length;
577
+ }
578
+ evidence.push(`conventions.json: ${conventionsCount} entries`);
579
+ } catch (_e) {
580
+ evidence.push('conventions.json: exists but could not be parsed');
581
+ }
582
+ } else if (fs.existsSync(conventionsDir)) {
583
+ try {
584
+ const files = fs.readdirSync(conventionsDir);
585
+ conventionsCount = files.length;
586
+ evidence.push(`conventions/: ${conventionsCount} files`);
587
+ } catch (_e) {
588
+ evidence.push('conventions/: exists but could not be read');
589
+ }
590
+ } else {
591
+ evidence.push('No conventions.json or conventions/ directory found');
592
+ }
593
+
594
+ // Check logs for convention-detector activity
595
+ const logsDir = getLogsDir(planningDir);
596
+ const hookLogs = readHookLogs(logsDir);
597
+ const eventLogs = readEventLogs(logsDir);
598
+
599
+ const conventionHookEntries = hookLogs.filter(
600
+ e => e.hook === 'convention-detector' || (e.detail && typeof e.detail === 'string' && e.detail.includes('convention'))
601
+ );
602
+ const conventionEventEntries = eventLogs.filter(
603
+ e => (e.event && typeof e.event === 'string' && e.event.includes('convention')) ||
604
+ (e.detail && typeof e.detail === 'string' && e.detail.includes('convention'))
605
+ );
606
+
607
+ const logActivity = conventionHookEntries.length + conventionEventEntries.length;
608
+ evidence.push(`Convention detector activity: ${logActivity} log entries`);
609
+
610
+ let status;
611
+ let message;
612
+ if (conventionsCount > 0) {
613
+ status = 'pass';
614
+ message = `Convention detection active: ${conventionsCount} conventions captured`;
615
+ } else if (logActivity > 0) {
616
+ status = 'pass';
617
+ message = `Convention detector ran (${logActivity} log entries) but no conventions captured yet`;
618
+ } else {
619
+ status = 'warn';
620
+ message = 'convention_memory enabled but no conventions captured and no detector activity';
621
+ }
622
+
623
+ return result('SQ-06', status, message, evidence);
624
+ }
625
+
626
+ // ---------------------------------------------------------------------------
627
+ // SQ-07: User Frustration Signals
628
+ // ---------------------------------------------------------------------------
629
+
630
+ /**
631
+ * Scan session JSONL for user messages containing frustration keywords.
632
+ * Counts frustration signals vs total user messages.
633
+ * Pass if <10% frustration rate, warn if 10-25%, fail if >25%.
634
+ *
635
+ * @param {string} planningDir - Path to .planning directory
636
+ * @param {object} _config - Audit config (unused for this check)
637
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
638
+ */
639
+ function checkUserFrustrationSignals(planningDir, _config) {
640
+ const logsDir = getLogsDir(planningDir);
641
+ const eventLogs = readEventLogs(logsDir);
642
+ const hookLogs = readHookLogs(logsDir);
643
+ const allEntries = [...eventLogs, ...hookLogs];
644
+
645
+ // Find user messages from event logs
646
+ const userMessages = allEntries.filter(e =>
647
+ e.role === 'user' ||
648
+ e.cat === 'user' ||
649
+ e.event === 'user-message' ||
650
+ e.event === 'UserPromptSubmit' ||
651
+ (e.details && e.details.role === 'user')
652
+ );
653
+
654
+ if (userMessages.length === 0) {
655
+ return result('SQ-07', 'info', 'No user messages found in logs', [
656
+ 'No user message events detected in session logs',
657
+ ]);
658
+ }
659
+
660
+ // Frustration keywords and patterns
661
+ const frustrationPatterns = [
662
+ /\bno\b(?:\s*,|\s*\.|\s*!|\s+that|n't)/i,
663
+ /\bstop\b/i,
664
+ /\bwrong\b/i,
665
+ /\bthat's not\b/i,
666
+ /\bundo\b/i,
667
+ /\brevert\b/i,
668
+ /\bdon't\b/i,
669
+ /\bshouldn't\b/i,
670
+ /\bwhy did you\b/i,
671
+ /\bthat broke\b/i,
672
+ /\btry again\b/i,
673
+ /\bnot what I\b/i,
674
+ ];
675
+
676
+ let frustrationCount = 0;
677
+ const evidence = [];
678
+
679
+ for (const entry of userMessages) {
680
+ const content = entry.content || entry.message || entry.text ||
681
+ (entry.details && (entry.details.content || entry.details.message)) || '';
682
+ const contentStr = typeof content === 'string' ? content : JSON.stringify(content);
683
+
684
+ if (contentStr.length < 2) continue;
685
+
686
+ const hasFrustration = frustrationPatterns.some(p => p.test(contentStr));
687
+ if (hasFrustration) {
688
+ frustrationCount++;
689
+ if (evidence.length < 3) {
690
+ const snippet = contentStr.substring(0, 80).replace(/\n/g, ' ');
691
+ evidence.push(`Frustration signal: "${snippet}..."`);
692
+ }
693
+ }
694
+ }
695
+
696
+ const total = userMessages.length;
697
+ const rate = total > 0 ? Math.round((frustrationCount / total) * 100) : 0;
698
+ evidence.unshift(`${frustrationCount}/${total} user messages contain frustration signals (${rate}%)`);
699
+
700
+ let status;
701
+ if (rate < 10) {
702
+ status = 'pass';
703
+ } else if (rate <= 25) {
704
+ status = 'warn';
705
+ } else {
706
+ status = 'fail';
707
+ }
708
+
709
+ return result('SQ-07', status, `Frustration rate: ${rate}% (${frustrationCount}/${total} messages)`, evidence);
710
+ }
711
+
712
+ // ---------------------------------------------------------------------------
713
+ // SQ-08: Satisfaction Signals
714
+ // ---------------------------------------------------------------------------
715
+
716
+ /**
717
+ * Scan session JSONL for positive signals vs negative signals.
718
+ * Pass if positive/negative ratio >2:1, warn if 1:1-2:1, fail if <1:1.
719
+ *
720
+ * @param {string} planningDir - Path to .planning directory
721
+ * @param {object} _config - Audit config (unused for this check)
722
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
723
+ */
724
+ function checkSatisfactionSignals(planningDir, _config) {
725
+ const logsDir = getLogsDir(planningDir);
726
+ const eventLogs = readEventLogs(logsDir);
727
+ const hookLogs = readHookLogs(logsDir);
728
+ const allEntries = [...eventLogs, ...hookLogs];
729
+
730
+ const userMessages = allEntries.filter(e =>
731
+ e.role === 'user' ||
732
+ e.cat === 'user' ||
733
+ e.event === 'user-message' ||
734
+ e.event === 'UserPromptSubmit' ||
735
+ (e.details && e.details.role === 'user')
736
+ );
737
+
738
+ if (userMessages.length === 0) {
739
+ return result('SQ-08', 'info', 'No user messages found in logs', [
740
+ 'No user message events detected in session logs',
741
+ ]);
742
+ }
743
+
744
+ const positivePatterns = [
745
+ /\bperfect\b/i,
746
+ /\bgreat\b/i,
747
+ /\bexactly\b/i,
748
+ /\byes\b/i,
749
+ /\bthanks?\b/i,
750
+ /\bthank you\b/i,
751
+ /\bawesome\b/i,
752
+ /\blooks good\b/i,
753
+ /\bnice\b/i,
754
+ /\bcorrect\b/i,
755
+ /\bgood job\b/i,
756
+ /\bwell done\b/i,
757
+ ];
758
+
759
+ const negativePatterns = [
760
+ /\bno\b(?:\s*[,\.!]|\s+that)/i,
761
+ /\bwrong\b/i,
762
+ /\bstop\b/i,
763
+ /\bundo\b/i,
764
+ /\bbroke\b/i,
765
+ /\bfailed\b/i,
766
+ /\bnot right\b/i,
767
+ /\bnot what\b/i,
768
+ /\btry again\b/i,
769
+ ];
770
+
771
+ let positiveCount = 0;
772
+ let negativeCount = 0;
773
+
774
+ for (const entry of userMessages) {
775
+ const content = entry.content || entry.message || entry.text ||
776
+ (entry.details && (entry.details.content || entry.details.message)) || '';
777
+ const contentStr = typeof content === 'string' ? content : JSON.stringify(content);
778
+ if (contentStr.length < 2) continue;
779
+
780
+ if (positivePatterns.some(p => p.test(contentStr))) positiveCount++;
781
+ if (negativePatterns.some(p => p.test(contentStr))) negativeCount++;
782
+ }
783
+
784
+ const evidence = [
785
+ `Positive signals: ${positiveCount}, Negative signals: ${negativeCount}`,
786
+ ];
787
+
788
+ let status;
789
+ let ratioStr;
790
+ if (negativeCount === 0) {
791
+ status = 'pass';
792
+ ratioStr = positiveCount > 0 ? `${positiveCount}:0 (all positive)` : 'no signals detected';
793
+ } else {
794
+ const ratio = positiveCount / negativeCount;
795
+ ratioStr = `${positiveCount}:${negativeCount} (${ratio.toFixed(1)}:1)`;
796
+ if (ratio > 2) {
797
+ status = 'pass';
798
+ } else if (ratio >= 1) {
799
+ status = 'warn';
800
+ } else {
801
+ status = 'fail';
802
+ }
803
+ }
804
+
805
+ return result('SQ-08', status, `Satisfaction ratio: ${ratioStr}`, evidence);
806
+ }
807
+
808
+ // ---------------------------------------------------------------------------
809
+ // SQ-09: Skill Escalation Patterns
810
+ // ---------------------------------------------------------------------------
811
+
812
+ /**
813
+ * Detect skill transitions that indicate task was harder than expected.
814
+ * E.g., quick -> debug, quick -> plan. Informational only (not pass/fail).
815
+ *
816
+ * @param {string} planningDir - Path to .planning directory
817
+ * @param {object} _config - Audit config (unused for this check)
818
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
819
+ */
820
+ function checkSkillEscalationPatterns(planningDir, _config) {
821
+ const logsDir = getLogsDir(planningDir);
822
+ const eventLogs = readEventLogs(logsDir);
823
+ const hookLogs = readHookLogs(logsDir);
824
+ const allEntries = [...eventLogs, ...hookLogs].sort((a, b) => {
825
+ const ta = a.ts || a.timestamp || '';
826
+ const tb = b.ts || b.timestamp || '';
827
+ return ta < tb ? -1 : ta > tb ? 1 : 0;
828
+ });
829
+
830
+ // Escalation transitions: lightweight skill followed by heavier skill
831
+ const ESCALATION_PAIRS = {
832
+ 'quick': ['debug', 'plan', 'build'],
833
+ 'do': ['debug', 'plan', 'build'],
834
+ 'scan': ['debug', 'plan'],
835
+ 'test': ['debug'],
836
+ };
837
+
838
+ // Extract skill invocations in order
839
+ const skillInvocations = [];
840
+ for (const entry of allEntries) {
841
+ const skill = entry.skill ||
842
+ (entry.event && entry.event.startsWith('pbr:') ? entry.event.replace('pbr:', '').split('-')[0] : null) ||
843
+ (entry.cat === 'skill' ? entry.event : null) ||
844
+ (entry.details && entry.details.skill) || null;
845
+
846
+ if (skill) {
847
+ skillInvocations.push({
848
+ skill,
849
+ ts: entry.ts || entry.timestamp || '',
850
+ });
851
+ }
852
+ }
853
+
854
+ if (skillInvocations.length < 2) {
855
+ return result('SQ-09', 'info', 'Fewer than 2 skill invocations — no transitions to analyze', [
856
+ `Found ${skillInvocations.length} skill invocation(s)`,
857
+ ]);
858
+ }
859
+
860
+ const escalations = [];
861
+ for (let i = 0; i < skillInvocations.length - 1; i++) {
862
+ const from = skillInvocations[i].skill;
863
+ const to = skillInvocations[i + 1].skill;
864
+ if (ESCALATION_PAIRS[from] && ESCALATION_PAIRS[from].includes(to)) {
865
+ escalations.push(`${from} -> ${to}`);
866
+ }
867
+ }
868
+
869
+ const evidence = [
870
+ `${skillInvocations.length} skill invocations, ${escalations.length} escalation(s) detected`,
871
+ ];
872
+
873
+ if (escalations.length > 0) {
874
+ const unique = [...new Set(escalations)];
875
+ for (const esc of unique.slice(0, 5)) {
876
+ evidence.push(`Escalation: ${esc}`);
877
+ }
878
+ }
879
+
880
+ return result('SQ-09', 'info',
881
+ `${escalations.length} skill escalation(s) detected across ${skillInvocations.length} invocations`,
882
+ evidence
883
+ );
884
+ }
885
+
886
+ // ---------------------------------------------------------------------------
887
+ // SQ-10: Notification Quality
888
+ // ---------------------------------------------------------------------------
889
+
890
+ /**
891
+ * Check notification frequency from hook log entries.
892
+ * Pass if <10 per session, warn if 10-30, fail if >30.
893
+ *
894
+ * @param {string} planningDir - Path to .planning directory
895
+ * @param {object} _config - Audit config (unused for this check)
896
+ * @returns {{ dimension: string, status: string, message: string, evidence: string[] }}
897
+ */
898
+ function checkNotificationQuality(planningDir, _config) {
899
+ const logsDir = getLogsDir(planningDir);
900
+ const hookLogs = readHookLogs(logsDir);
901
+ const eventLogs = readEventLogs(logsDir);
902
+
903
+ // Find notification entries from hook logs and event logs
904
+ const notifications = [];
905
+
906
+ for (const entry of hookLogs) {
907
+ if (entry.event === 'Notification' ||
908
+ entry.hook === 'log-notification' ||
909
+ (entry.details && entry.details.type === 'notification')) {
910
+ notifications.push({
911
+ hook: entry.hook || 'unknown',
912
+ ts: entry.ts || entry.timestamp || '',
913
+ message: (entry.details && entry.details.message) || '',
914
+ });
915
+ }
916
+ }
917
+
918
+ for (const entry of eventLogs) {
919
+ if (entry.event === 'notification' ||
920
+ entry.cat === 'notification' ||
921
+ (entry.details && entry.details.type === 'notification')) {
922
+ notifications.push({
923
+ source: 'event',
924
+ ts: entry.ts || entry.timestamp || '',
925
+ message: entry.message || (entry.details && entry.details.message) || '',
926
+ });
927
+ }
928
+ }
929
+
930
+ const count = notifications.length;
931
+ const evidence = [`${count} notification(s) found in session logs`];
932
+
933
+ // Show a sample of notification sources if many
934
+ if (count > 0) {
935
+ const hookCounts = {};
936
+ for (const n of notifications) {
937
+ const src = n.hook || n.source || 'unknown';
938
+ hookCounts[src] = (hookCounts[src] || 0) + 1;
939
+ }
940
+ const breakdown = Object.entries(hookCounts)
941
+ .sort((a, b) => b[1] - a[1])
942
+ .slice(0, 5)
943
+ .map(([src, cnt]) => `${src}: ${cnt}`)
944
+ .join(', ');
945
+ evidence.push(`Sources: ${breakdown}`);
946
+ }
947
+
948
+ let status;
949
+ if (count < 10) {
950
+ status = 'pass';
951
+ } else if (count <= 30) {
952
+ status = 'warn';
953
+ } else {
954
+ status = 'fail';
955
+ }
956
+
957
+ return result('SQ-10', status, `${count} notification(s) in session (threshold: <10 pass, 10-30 warn, >30 fail)`, evidence);
958
+ }
959
+
960
+ // ---------------------------------------------------------------------------
961
+ // Exports
962
+ // ---------------------------------------------------------------------------
963
+
964
+ module.exports = {
965
+ checkSessionStartQuality,
966
+ checkBriefingFreshness,
967
+ checkSessionDurationCost,
968
+ checkSkillRoutingAccuracy,
969
+ checkMemoryUpdateTracking,
970
+ checkConventionDetectionMonitoring,
971
+ checkUserFrustrationSignals,
972
+ checkSatisfactionSignals,
973
+ checkSkillEscalationPatterns,
974
+ checkNotificationQuality,
975
+ // Shared helpers exported for reuse by other SQ checks and tests
976
+ readJsonlFiles,
977
+ readHookLogs,
978
+ readEventLogs,
979
+ getLogsDir,
980
+ };