@sienklogic/plan-build-run 2.21.1 → 2.21.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (982) hide show
  1. package/CHANGELOG.md +1331 -323
  2. package/CLAUDE.md +75 -40
  3. package/LICENSE +2 -1
  4. package/README.md +412 -177
  5. package/bin/install.js +2752 -0
  6. package/dashboard/bin/cli.cjs +96 -0
  7. package/dashboard/bin/stop.cjs +129 -0
  8. package/dashboard/eslint.config.js +37 -0
  9. package/dashboard/index.html +20 -0
  10. package/dashboard/package.json +27 -25
  11. package/dashboard/server/index.js +151 -0
  12. package/dashboard/server/lib/frontmatter.js +92 -0
  13. package/dashboard/server/middleware/static.js +35 -0
  14. package/dashboard/server/package.json +16 -0
  15. package/dashboard/server/routes/agents.js +234 -0
  16. package/dashboard/server/routes/config.js +64 -0
  17. package/dashboard/server/routes/health.js +98 -0
  18. package/dashboard/server/routes/incidents.js +78 -0
  19. package/dashboard/server/routes/intel.js +69 -0
  20. package/dashboard/server/routes/memory.js +107 -0
  21. package/dashboard/server/routes/planning.js +234 -0
  22. package/dashboard/server/routes/progress.js +77 -0
  23. package/dashboard/server/routes/projects.js +36 -0
  24. package/dashboard/server/routes/requirements.js +40 -0
  25. package/dashboard/server/routes/roadmap.js +69 -0
  26. package/dashboard/server/routes/sessions.js +70 -0
  27. package/dashboard/server/routes/status.js +25 -0
  28. package/dashboard/server/routes/telemetry.js +233 -0
  29. package/dashboard/server/services/file-watcher.js +105 -0
  30. package/dashboard/server/services/planning-reader.js +727 -0
  31. package/dashboard/server/test/cli.test.js +34 -0
  32. package/dashboard/server/test/frontmatter.test.js +104 -0
  33. package/dashboard/server/test/isolation.test.js +32 -0
  34. package/dashboard/server/test/planning-reader.test.js +151 -0
  35. package/dashboard/server/test/routes.test.js +91 -0
  36. package/dashboard/server/test/ws.test.js +81 -0
  37. package/dashboard/server/ws.js +96 -0
  38. package/dashboard/src/App.jsx +165 -0
  39. package/dashboard/src/components/charts/BudgetBars.jsx +42 -0
  40. package/dashboard/src/components/charts/ContextRadar.jsx +34 -0
  41. package/dashboard/src/components/charts/PhaseDonut.jsx +66 -0
  42. package/dashboard/src/components/charts/SuccessTrend.jsx +45 -0
  43. package/dashboard/src/components/charts/TokenChart.jsx +55 -0
  44. package/dashboard/src/components/charts/index.js +5 -0
  45. package/dashboard/src/components/config/CfgSection.jsx +93 -0
  46. package/dashboard/src/components/layout/Header.jsx +89 -0
  47. package/dashboard/src/components/layout/ProjectSwitcher.jsx +160 -0
  48. package/dashboard/src/components/layout/Sidebar.jsx +161 -0
  49. package/dashboard/src/components/ui/AutoModeBanner.jsx +138 -0
  50. package/dashboard/src/components/ui/BackButton.jsx +27 -0
  51. package/dashboard/src/components/ui/Badge.jsx +27 -0
  52. package/dashboard/src/components/ui/Card.jsx +23 -0
  53. package/dashboard/src/components/ui/ChartTooltip.jsx +48 -0
  54. package/dashboard/src/components/ui/CheckpointBox.jsx +110 -0
  55. package/dashboard/src/components/ui/CodeBlock.jsx +27 -0
  56. package/dashboard/src/components/ui/ConfidenceBadge.jsx +20 -0
  57. package/dashboard/src/components/ui/ConfirmModal.jsx +161 -0
  58. package/dashboard/src/components/ui/ConnectionBanner.jsx +60 -0
  59. package/dashboard/src/components/ui/ErrorBoundary.jsx +106 -0
  60. package/dashboard/src/components/ui/ErrorBox.jsx +107 -0
  61. package/dashboard/src/components/ui/KeyValue.jsx +33 -0
  62. package/dashboard/src/components/ui/LoadingSkeleton.jsx +84 -0
  63. package/dashboard/src/components/ui/MetricCard.jsx +58 -0
  64. package/dashboard/src/components/ui/NextUpBlock.jsx +92 -0
  65. package/dashboard/src/components/ui/NumberInput.jsx +44 -0
  66. package/dashboard/src/components/ui/PBRBanner.jsx +47 -0
  67. package/dashboard/src/components/ui/PipelineView.jsx +130 -0
  68. package/dashboard/src/components/ui/ProgressBar.jsx +28 -0
  69. package/dashboard/src/components/ui/ProgressDisplay.jsx +47 -0
  70. package/dashboard/src/components/ui/QualityGateBadge.jsx +15 -0
  71. package/dashboard/src/components/ui/SectionTitle.jsx +35 -0
  72. package/dashboard/src/components/ui/SelectInput.jsx +45 -0
  73. package/dashboard/src/components/ui/StatusDot.jsx +51 -0
  74. package/dashboard/src/components/ui/StatusSymbol.jsx +49 -0
  75. package/dashboard/src/components/ui/TabBar.jsx +41 -0
  76. package/dashboard/src/components/ui/TextInput.jsx +42 -0
  77. package/dashboard/src/components/ui/Toast.jsx +117 -0
  78. package/dashboard/src/components/ui/Toggle.jsx +70 -0
  79. package/dashboard/src/components/ui/index.js +29 -0
  80. package/dashboard/src/hooks/useDocumentTitle.js +16 -0
  81. package/dashboard/src/hooks/useFetch.js +50 -0
  82. package/dashboard/src/hooks/useToast.jsx +43 -0
  83. package/dashboard/src/hooks/useWebSocket.js +103 -0
  84. package/dashboard/src/lib/api.js +112 -0
  85. package/dashboard/src/lib/configSchema.js +189 -0
  86. package/dashboard/src/lib/constants.js +22 -0
  87. package/dashboard/src/main.jsx +15 -0
  88. package/dashboard/src/pages/AgentsPage.jsx +191 -0
  89. package/dashboard/src/pages/ConfigPage.jsx +298 -0
  90. package/dashboard/src/pages/HooksPage.jsx +412 -0
  91. package/dashboard/src/pages/IncidentsPage.jsx +135 -0
  92. package/dashboard/src/pages/IntelPage.jsx +193 -0
  93. package/dashboard/src/pages/LiveFeed.jsx +274 -0
  94. package/dashboard/src/pages/MemoryPage.jsx +107 -0
  95. package/dashboard/src/pages/OnboardingPage.jsx +117 -0
  96. package/dashboard/src/pages/Overview.jsx +360 -0
  97. package/dashboard/src/pages/PhaseDetailView.jsx +216 -0
  98. package/dashboard/src/pages/PlanningPage.jsx +181 -0
  99. package/dashboard/src/pages/ProgressPage.jsx +249 -0
  100. package/dashboard/src/pages/ResearchPage.jsx +129 -0
  101. package/dashboard/src/pages/RoadmapPage.jsx +251 -0
  102. package/dashboard/src/pages/SessionsPage.jsx +117 -0
  103. package/dashboard/src/pages/Telemetry.jsx +166 -0
  104. package/dashboard/src/pages/planning/DecisionsTab.jsx +153 -0
  105. package/dashboard/src/pages/planning/FilesTab.jsx +420 -0
  106. package/dashboard/src/pages/planning/MilestoneDetail.jsx +319 -0
  107. package/dashboard/src/pages/planning/MilestonesTab.jsx +151 -0
  108. package/dashboard/src/pages/planning/NotesTab.jsx +251 -0
  109. package/dashboard/src/pages/planning/PhasesTab.jsx +218 -0
  110. package/dashboard/src/pages/planning/QuickTab.jsx +50 -0
  111. package/dashboard/src/pages/planning/ResearchTab.jsx +103 -0
  112. package/dashboard/src/pages/planning/TodosTab.jsx +297 -0
  113. package/dashboard/src/theme/ThemeProvider.jsx +38 -0
  114. package/dashboard/src/theme/tokens.js +17 -0
  115. package/dashboard/tests/components/ConfirmModal.test.jsx +179 -0
  116. package/dashboard/tests/components/ConnectionBanner.test.jsx +37 -0
  117. package/dashboard/tests/components/ErrorBoundary.test.jsx +59 -0
  118. package/dashboard/tests/components/LoadingSkeleton.test.jsx +46 -0
  119. package/dashboard/tests/components/ToastContainer.test.jsx +47 -0
  120. package/dashboard/tests/components/Toggle.test.jsx +61 -0
  121. package/dashboard/tests/hooks/useFetch.test.jsx +77 -0
  122. package/dashboard/tests/hooks/useToast.test.jsx +78 -0
  123. package/dashboard/tests/hooks/useWebSocket.test.jsx +128 -0
  124. package/dashboard/tests/pages/ConfigPage.test.jsx +199 -0
  125. package/dashboard/tests/pages/PlanningPage.test.jsx +119 -0
  126. package/dashboard/tests/pages/planning/FilesTab.test.jsx +198 -0
  127. package/dashboard/tests/pages/planning/NotesTab.test.jsx +178 -0
  128. package/dashboard/tests/pages/planning/TodosTab.test.jsx +188 -0
  129. package/dashboard/tests/performance.test.jsx +46 -0
  130. package/dashboard/tests/routes/config.test.js +98 -0
  131. package/dashboard/tests/routes/health.test.js +40 -0
  132. package/dashboard/tests/routes/planning.test.js +112 -0
  133. package/dashboard/tests/routes/roadmap.test.js +91 -0
  134. package/dashboard/tests/routes/status.test.js +131 -0
  135. package/dashboard/tests/server/planning-reader.test.js +153 -0
  136. package/dashboard/tests/setup.js +7 -0
  137. package/dashboard/vite.config.js +41 -0
  138. package/package.json +56 -41
  139. package/plan-build-run/bin/config-schema.json +1298 -0
  140. package/plugins/pbr/.claude-plugin/plugin.json +1 -1
  141. package/plugins/pbr/CLAUDE.md +19 -0
  142. package/plugins/pbr/UI-CONSISTENCY-GAPS.md +1 -1
  143. package/plugins/pbr/agents/advisor-researcher.md +101 -0
  144. package/plugins/pbr/agents/audit.md +207 -89
  145. package/plugins/pbr/agents/codebase-mapper.md +158 -23
  146. package/plugins/pbr/agents/debugger.md +210 -34
  147. package/plugins/pbr/agents/dev-sync.md +206 -0
  148. package/plugins/pbr/agents/executor.md +734 -38
  149. package/plugins/pbr/agents/general.md +69 -5
  150. package/plugins/pbr/agents/integration-checker.md +147 -31
  151. package/plugins/pbr/agents/intel-updater.md +332 -0
  152. package/plugins/pbr/agents/nyquist-auditor.md +254 -0
  153. package/plugins/pbr/agents/plan-checker.md +268 -65
  154. package/plugins/pbr/agents/planner.md +449 -41
  155. package/plugins/pbr/agents/researcher.md +218 -37
  156. package/plugins/pbr/agents/roadmapper.md +398 -0
  157. package/plugins/pbr/agents/synthesizer.md +166 -25
  158. package/plugins/pbr/agents/ui-checker.md +204 -0
  159. package/plugins/pbr/agents/ui-researcher.md +224 -0
  160. package/plugins/pbr/agents/verifier.md +570 -46
  161. package/plugins/pbr/commands/add-phase.md +75 -0
  162. package/plugins/pbr/commands/add-todo.md +8 -0
  163. package/plugins/pbr/commands/audit-fix.md +5 -0
  164. package/plugins/pbr/commands/audit-milestone.md +8 -0
  165. package/plugins/pbr/commands/autonomous.md +5 -0
  166. package/plugins/pbr/commands/backlog.md +6 -0
  167. package/plugins/pbr/commands/check-todos.md +8 -0
  168. package/plugins/pbr/commands/complete-milestone.md +8 -0
  169. package/plugins/pbr/commands/config.md +1 -1
  170. package/plugins/pbr/commands/discuss-phase.md +6 -0
  171. package/plugins/pbr/commands/execute-phase.md +6 -0
  172. package/plugins/pbr/commands/fast.md +6 -0
  173. package/plugins/pbr/commands/forensics.md +6 -0
  174. package/plugins/pbr/commands/import.md +1 -1
  175. package/plugins/pbr/commands/insert-phase.md +65 -0
  176. package/plugins/pbr/commands/intel.md +5 -0
  177. package/plugins/pbr/commands/join-discord.md +11 -0
  178. package/plugins/pbr/commands/list-phase-assumptions.md +5 -0
  179. package/plugins/pbr/commands/map-codebase.md +6 -0
  180. package/plugins/pbr/commands/milestone-summary.md +6 -0
  181. package/plugins/pbr/commands/new-milestone.md +8 -0
  182. package/plugins/pbr/commands/new-project.md +6 -0
  183. package/plugins/pbr/commands/pause-work.md +5 -0
  184. package/plugins/pbr/commands/plan-milestone-gaps.md +7 -0
  185. package/plugins/pbr/commands/plan-phase.md +6 -0
  186. package/plugins/pbr/commands/plant-seed.md +6 -0
  187. package/plugins/pbr/commands/profile-user.md +5 -0
  188. package/plugins/pbr/commands/profile.md +5 -0
  189. package/plugins/pbr/commands/progress.md +6 -0
  190. package/plugins/pbr/commands/quick.md +1 -1
  191. package/plugins/pbr/commands/reapply-patches.md +47 -0
  192. package/plugins/pbr/commands/release.md +6 -0
  193. package/plugins/pbr/commands/remove-phase.md +66 -0
  194. package/plugins/pbr/commands/research-phase.md +59 -0
  195. package/plugins/pbr/commands/resume-work.md +5 -0
  196. package/plugins/pbr/commands/seed.md +6 -0
  197. package/plugins/pbr/commands/session-report.md +5 -0
  198. package/plugins/pbr/commands/set-profile.md +6 -0
  199. package/plugins/pbr/commands/settings.md +5 -0
  200. package/plugins/pbr/commands/setup.md +1 -1
  201. package/plugins/pbr/commands/ship.md +5 -0
  202. package/plugins/pbr/commands/stats.md +6 -0
  203. package/plugins/pbr/commands/test.md +5 -0
  204. package/plugins/pbr/commands/thread.md +6 -0
  205. package/plugins/pbr/commands/todo.md +1 -1
  206. package/plugins/pbr/commands/ui-phase.md +5 -0
  207. package/plugins/pbr/commands/ui-review.md +5 -0
  208. package/plugins/pbr/commands/undo.md +5 -0
  209. package/plugins/pbr/commands/update.md +37 -0
  210. package/plugins/pbr/commands/validate-phase.md +5 -0
  211. package/plugins/pbr/commands/verify-work.md +6 -0
  212. package/plugins/pbr/dashboard/package-lock.json +6 -0
  213. package/plugins/pbr/dist/architecture-guard.js +76 -0
  214. package/plugins/pbr/dist/audit-dimensions.js +556 -0
  215. package/plugins/pbr/dist/auto-continue.js +277 -0
  216. package/plugins/pbr/dist/block-skill-self-read.js +124 -0
  217. package/plugins/pbr/dist/check-agent-state-write.js +63 -0
  218. package/plugins/pbr/dist/check-config-change.js +213 -0
  219. package/plugins/pbr/dist/check-cross-plugin-sync.js +93 -0
  220. package/plugins/pbr/dist/check-dangerous-commands.js +193 -0
  221. package/plugins/pbr/dist/check-direct-state-write.js +37 -0
  222. package/plugins/pbr/dist/check-doc-sprawl.js +102 -0
  223. package/plugins/pbr/dist/check-phase-boundary.js +191 -0
  224. package/plugins/pbr/dist/check-plan-format.js +227 -0
  225. package/plugins/pbr/dist/check-read-first.js +345 -0
  226. package/plugins/pbr/dist/check-roadmap-sync.js +507 -0
  227. package/plugins/pbr/dist/check-skill-workflow.js +354 -0
  228. package/plugins/pbr/dist/check-state-sync.js +676 -0
  229. package/plugins/pbr/dist/check-subagent-output.js +425 -0
  230. package/plugins/pbr/dist/check-summary-gate.js +188 -0
  231. package/plugins/pbr/dist/context-bridge.js +425 -0
  232. package/plugins/pbr/dist/context-budget-check.js +442 -0
  233. package/plugins/pbr/dist/context-quality.js +271 -0
  234. package/plugins/pbr/dist/enforce-context-budget.js +138 -0
  235. package/plugins/pbr/dist/enforce-pbr-workflow.js +277 -0
  236. package/plugins/pbr/dist/event-handler.js +212 -0
  237. package/plugins/pbr/dist/event-logger.js +125 -0
  238. package/plugins/pbr/dist/feedback-loop.js +155 -0
  239. package/plugins/pbr/dist/graph-update.js +422 -0
  240. package/plugins/pbr/dist/hook-logger.js +114 -0
  241. package/plugins/pbr/dist/hook-server-client.js +361 -0
  242. package/plugins/pbr/dist/hook-server.js +664 -0
  243. package/plugins/pbr/dist/hooks-schema.json +87 -0
  244. package/plugins/pbr/dist/instructions-loaded.js +173 -0
  245. package/plugins/pbr/dist/intercept-plan-mode.js +81 -0
  246. package/plugins/pbr/dist/log-notification.js +131 -0
  247. package/plugins/pbr/dist/log-subagent.js +367 -0
  248. package/plugins/pbr/dist/log-tool-failure.js +140 -0
  249. package/plugins/pbr/dist/milestone-learnings.js +519 -0
  250. package/plugins/pbr/dist/pbr-tools.js +493 -0
  251. package/plugins/pbr/dist/post-bash-triage.js +96 -0
  252. package/plugins/pbr/dist/post-compact.js +135 -0
  253. package/plugins/pbr/dist/post-hoc.js +237 -0
  254. package/plugins/pbr/dist/post-write-dispatch.js +243 -0
  255. package/plugins/pbr/dist/post-write-quality.js +208 -0
  256. package/plugins/pbr/dist/pre-bash-dispatch.js +212 -0
  257. package/plugins/pbr/dist/pre-skill-dispatch.js +114 -0
  258. package/plugins/pbr/dist/pre-task-dispatch.js +269 -0
  259. package/plugins/pbr/dist/pre-write-dispatch.js +234 -0
  260. package/plugins/pbr/dist/progress-tracker.js +173 -0
  261. package/plugins/pbr/dist/prompt-guard.js +114 -0
  262. package/plugins/pbr/dist/prompt-routing.js +209 -0
  263. package/plugins/pbr/dist/quick-status.js +179 -0
  264. package/plugins/pbr/dist/record-incident.js +37 -0
  265. package/plugins/pbr/dist/run-hook.js +132 -0
  266. package/plugins/pbr/dist/session-cleanup.js +653 -0
  267. package/plugins/pbr/dist/session-tracker.js +124 -0
  268. package/plugins/pbr/dist/status-line.js +849 -0
  269. package/plugins/pbr/dist/suggest-compact.js +307 -0
  270. package/plugins/pbr/dist/sync-context-to-claude.js +100 -0
  271. package/plugins/pbr/dist/task-completed.js +206 -0
  272. package/plugins/pbr/dist/track-context-budget.js +432 -0
  273. package/plugins/pbr/dist/track-user-gates.js +88 -0
  274. package/plugins/pbr/dist/trust-tracker.js +193 -0
  275. package/plugins/pbr/dist/validate-commit.js +233 -0
  276. package/plugins/pbr/dist/validate-skill-args.js +222 -0
  277. package/plugins/pbr/dist/validate-task.js +271 -0
  278. package/plugins/pbr/dist/worktree-create.js +144 -0
  279. package/plugins/pbr/dist/worktree-remove.js +147 -0
  280. package/plugins/pbr/hooks/hooks.json +137 -65
  281. package/plugins/pbr/references/agent-contracts.md +39 -8
  282. package/plugins/pbr/references/agent-teams.md +3 -3
  283. package/plugins/pbr/references/archive/checkpoints.md +189 -0
  284. package/plugins/pbr/references/archive/context-quality-tiers.md +45 -0
  285. package/plugins/pbr/references/archive/hook-ordering.md +89 -0
  286. package/plugins/pbr/references/archive/limitations.md +106 -0
  287. package/plugins/pbr/references/archive/pbr-rules.md +194 -0
  288. package/plugins/pbr/references/archive/pbr-tools-cli.md +415 -0
  289. package/plugins/pbr/references/archive/pretooluse-jsonl-behavior.md +58 -0
  290. package/plugins/pbr/references/archive/signal-files.md +41 -0
  291. package/plugins/pbr/references/archive/tmux-setup.md +288 -0
  292. package/plugins/pbr/references/archive/verification-matrix.md +34 -0
  293. package/plugins/pbr/references/archive/verification-patterns.md +277 -0
  294. package/plugins/pbr/references/archive/worktree-sparse-checkout.md +86 -0
  295. package/plugins/pbr/references/assumptions.md +42 -0
  296. package/plugins/pbr/references/checkpoints.md +723 -104
  297. package/plugins/pbr/references/config-reference.md +387 -10
  298. package/plugins/pbr/references/continuation-format.md +1 -0
  299. package/plugins/pbr/references/decimal-phase-calculation.md +65 -0
  300. package/plugins/pbr/references/deviation-rules.md +12 -0
  301. package/plugins/pbr/references/few-shot-examples/audit.md +77 -0
  302. package/plugins/pbr/references/few-shot-examples/check-plan-format.md +172 -0
  303. package/plugins/pbr/references/few-shot-examples/check-subagent-output.md +118 -0
  304. package/plugins/pbr/references/few-shot-examples/integration-checker.md +70 -0
  305. package/plugins/pbr/references/few-shot-examples/nyquist-auditor.md +83 -0
  306. package/plugins/pbr/references/few-shot-examples/plan-checker.md +73 -0
  307. package/plugins/pbr/references/few-shot-examples/ui-checker.md +71 -0
  308. package/plugins/pbr/references/few-shot-examples/verifier.md +109 -0
  309. package/plugins/pbr/references/git-integration.md +110 -27
  310. package/plugins/pbr/references/git-planning-commit.md +35 -0
  311. package/plugins/pbr/references/model-profile-resolution.md +34 -0
  312. package/plugins/pbr/references/model-profiles.md +90 -7
  313. package/plugins/pbr/references/model-selection.md +1 -1
  314. package/plugins/pbr/references/node-repair.md +48 -0
  315. package/plugins/pbr/references/plan-authoring.md +65 -0
  316. package/plugins/pbr/references/plan-format.md +184 -10
  317. package/plugins/pbr/references/questioning.md +138 -49
  318. package/plugins/pbr/references/reading-verification.md +4 -4
  319. package/plugins/pbr/references/tdd.md +263 -0
  320. package/plugins/pbr/references/thinking-models-planning.md +47 -0
  321. package/plugins/pbr/references/thinking-models-verification.md +44 -0
  322. package/plugins/pbr/references/ui-brand.md +449 -0
  323. package/plugins/pbr/references/verification-overrides.md +39 -0
  324. package/plugins/pbr/references/verification-patterns.md +529 -113
  325. package/plugins/pbr/scripts/architecture-guard.js +76 -0
  326. package/plugins/pbr/scripts/audit-checks/behavioral-compliance.js +2098 -0
  327. package/plugins/pbr/scripts/audit-checks/error-analysis.js +989 -0
  328. package/plugins/pbr/scripts/audit-checks/feature-verification.js +723 -0
  329. package/plugins/pbr/scripts/audit-checks/index.js +433 -0
  330. package/plugins/pbr/scripts/audit-checks/infrastructure.js +816 -0
  331. package/plugins/pbr/scripts/audit-checks/quality-metrics.js +455 -0
  332. package/plugins/pbr/scripts/audit-checks/session-quality.js +980 -0
  333. package/plugins/pbr/scripts/audit-checks/si-agent-hook-config-checks.js +396 -0
  334. package/plugins/pbr/scripts/audit-checks/si-cross-cutting-checks.js +272 -0
  335. package/plugins/pbr/scripts/audit-checks/si-skill-checks.js +424 -0
  336. package/plugins/pbr/scripts/audit-checks/workflow-compliance.js +1175 -0
  337. package/plugins/pbr/scripts/audit-dimensions.js +556 -0
  338. package/plugins/pbr/scripts/auto-continue.js +192 -37
  339. package/plugins/pbr/scripts/block-skill-self-read.js +124 -0
  340. package/plugins/pbr/scripts/check-agent-state-write.js +63 -0
  341. package/plugins/pbr/scripts/check-config-change.js +84 -1
  342. package/plugins/pbr/scripts/check-cross-plugin-sync.js +93 -0
  343. package/plugins/pbr/scripts/check-dangerous-commands.js +18 -5
  344. package/plugins/pbr/scripts/check-direct-state-write.js +37 -0
  345. package/plugins/pbr/scripts/check-phase-boundary.js +3 -2
  346. package/plugins/pbr/scripts/check-plan-format.js +153 -354
  347. package/plugins/pbr/scripts/check-read-first.js +345 -0
  348. package/plugins/pbr/scripts/check-roadmap-sync.js +174 -19
  349. package/plugins/pbr/scripts/check-skill-workflow.js +21 -16
  350. package/plugins/pbr/scripts/check-state-sync.js +352 -220
  351. package/plugins/pbr/scripts/check-subagent-output.js +296 -333
  352. package/plugins/pbr/scripts/check-summary-gate.js +5 -15
  353. package/plugins/pbr/scripts/commands/benchmarks.js +195 -0
  354. package/plugins/pbr/scripts/commands/calibrate.js +530 -0
  355. package/plugins/pbr/scripts/commands/config.js +72 -0
  356. package/plugins/pbr/scripts/commands/misc.js +779 -0
  357. package/plugins/pbr/scripts/commands/phase.js +293 -0
  358. package/plugins/pbr/scripts/commands/roadmap.js +75 -0
  359. package/plugins/pbr/scripts/commands/state.js +84 -0
  360. package/plugins/pbr/scripts/commands/stress-test.js +349 -0
  361. package/plugins/pbr/scripts/commands/todo.js +191 -0
  362. package/plugins/pbr/scripts/commands/verify.js +169 -0
  363. package/plugins/pbr/scripts/config-schema.json +1183 -95
  364. package/plugins/pbr/scripts/context-bridge.js +425 -0
  365. package/plugins/pbr/scripts/context-budget-check.js +171 -16
  366. package/plugins/pbr/scripts/context-quality.js +271 -0
  367. package/plugins/pbr/scripts/enforce-context-budget.js +138 -0
  368. package/plugins/pbr/scripts/enforce-pbr-workflow.js +277 -0
  369. package/plugins/pbr/scripts/event-handler.js +137 -87
  370. package/plugins/pbr/scripts/event-logger.js +58 -25
  371. package/plugins/pbr/scripts/feedback-loop.js +155 -0
  372. package/plugins/pbr/scripts/graph-update.js +422 -0
  373. package/plugins/pbr/scripts/hook-logger.js +69 -35
  374. package/plugins/pbr/scripts/hook-server-client.js +361 -0
  375. package/plugins/pbr/scripts/hook-server.js +664 -0
  376. package/plugins/pbr/scripts/hooks-schema.json +12 -5
  377. package/plugins/pbr/scripts/instructions-loaded.js +173 -0
  378. package/plugins/pbr/scripts/intent-router.cjs +147 -0
  379. package/plugins/pbr/scripts/intercept-plan-mode.js +52 -18
  380. package/plugins/pbr/scripts/lib/alternatives.js +203 -0
  381. package/plugins/pbr/scripts/lib/audit.js +65 -0
  382. package/plugins/pbr/scripts/lib/auto-cleanup.js +221 -0
  383. package/plugins/pbr/scripts/lib/auto-verify.js +123 -0
  384. package/plugins/pbr/scripts/lib/benchmark.js +190 -0
  385. package/plugins/pbr/scripts/lib/build.js +719 -0
  386. package/plugins/pbr/scripts/lib/ci-fix-loop.js +228 -0
  387. package/plugins/pbr/scripts/lib/commands.js +483 -0
  388. package/plugins/pbr/scripts/lib/compound.js +222 -0
  389. package/plugins/pbr/scripts/lib/config-cache.js +83 -0
  390. package/plugins/pbr/scripts/lib/config.js +1469 -0
  391. package/plugins/pbr/scripts/lib/context.js +254 -0
  392. package/plugins/pbr/scripts/lib/contextual-help.js +183 -0
  393. package/plugins/pbr/scripts/lib/convention-detector.js +413 -0
  394. package/plugins/pbr/scripts/lib/core.js +1585 -0
  395. package/plugins/pbr/scripts/lib/dashboard-launch.js +364 -0
  396. package/plugins/pbr/scripts/lib/data-hygiene.js +179 -0
  397. package/plugins/pbr/scripts/lib/decision-extraction.js +183 -0
  398. package/plugins/pbr/scripts/lib/decisions.js +194 -0
  399. package/plugins/pbr/scripts/lib/dependency-break.js +147 -0
  400. package/plugins/pbr/scripts/lib/format-validators.js +1049 -0
  401. package/plugins/pbr/scripts/lib/frontmatter.js +302 -0
  402. package/plugins/pbr/scripts/lib/gates/advisories.js +133 -0
  403. package/plugins/pbr/scripts/lib/gates/build-dependency.js +118 -0
  404. package/plugins/pbr/scripts/lib/gates/build-executor.js +106 -0
  405. package/plugins/pbr/scripts/lib/gates/doc-existence.js +46 -0
  406. package/plugins/pbr/scripts/lib/gates/helpers.js +98 -0
  407. package/plugins/pbr/scripts/lib/gates/inline-execution.js +187 -0
  408. package/plugins/pbr/scripts/lib/gates/milestone-complete.js +139 -0
  409. package/plugins/pbr/scripts/lib/gates/milestone-summary.js +121 -0
  410. package/plugins/pbr/scripts/lib/gates/multi-phase-loader.js +149 -0
  411. package/plugins/pbr/scripts/lib/gates/plan-executor.js +36 -0
  412. package/plugins/pbr/scripts/lib/gates/plan-validation.js +115 -0
  413. package/plugins/pbr/scripts/lib/gates/quick-executor.js +78 -0
  414. package/plugins/pbr/scripts/lib/gates/review-planner.js +63 -0
  415. package/plugins/pbr/scripts/lib/gates/review-verifier.js +71 -0
  416. package/plugins/pbr/scripts/lib/gates/rich-agent-context.js +148 -0
  417. package/plugins/pbr/scripts/lib/gates/sprint-preflight.js +30 -0
  418. package/plugins/pbr/scripts/lib/gates/user-confirmation.js +95 -0
  419. package/plugins/pbr/scripts/lib/graph-cli.js +89 -0
  420. package/plugins/pbr/scripts/lib/graph.js +553 -0
  421. package/plugins/pbr/scripts/lib/handoff-validators.js +224 -0
  422. package/plugins/pbr/scripts/lib/health-checks.js +107 -0
  423. package/plugins/pbr/scripts/lib/health-phase06.js +120 -0
  424. package/plugins/pbr/scripts/lib/health.js +132 -0
  425. package/plugins/pbr/scripts/lib/help.js +100 -0
  426. package/plugins/pbr/scripts/lib/history.js +150 -0
  427. package/plugins/pbr/scripts/lib/impact-analysis.js +319 -0
  428. package/plugins/pbr/scripts/lib/incidents.js +190 -0
  429. package/plugins/pbr/scripts/lib/init.js +643 -0
  430. package/plugins/pbr/scripts/lib/insights-parser.js +320 -0
  431. package/plugins/pbr/scripts/lib/intel.js +653 -0
  432. package/plugins/pbr/scripts/lib/learnings.js +511 -0
  433. package/plugins/pbr/scripts/lib/migrate.js +309 -0
  434. package/plugins/pbr/scripts/lib/milestone.js +306 -0
  435. package/plugins/pbr/scripts/lib/msys-path.js +20 -0
  436. package/plugins/pbr/scripts/lib/negative-knowledge.js +194 -0
  437. package/plugins/pbr/scripts/lib/notification-throttle.js +141 -0
  438. package/plugins/pbr/scripts/lib/onboarding-generator.js +288 -0
  439. package/plugins/pbr/scripts/lib/parse-args.js +134 -0
  440. package/plugins/pbr/scripts/lib/pattern-routing.js +55 -0
  441. package/plugins/pbr/scripts/lib/patterns.js +272 -0
  442. package/plugins/pbr/scripts/lib/perf.js +190 -0
  443. package/plugins/pbr/scripts/lib/phase.js +1043 -0
  444. package/plugins/pbr/scripts/lib/pid-lock.js +156 -0
  445. package/plugins/pbr/scripts/lib/post-hoc.js +160 -0
  446. package/plugins/pbr/scripts/lib/pre-commit-checks.js +220 -0
  447. package/plugins/pbr/scripts/lib/pre-research.js +126 -0
  448. package/plugins/pbr/scripts/lib/premature-completion.js +312 -0
  449. package/plugins/pbr/scripts/lib/preview.js +174 -0
  450. package/plugins/pbr/scripts/lib/progress-visualization.js +296 -0
  451. package/plugins/pbr/scripts/lib/quick-init.js +131 -0
  452. package/plugins/pbr/scripts/lib/reference.js +236 -0
  453. package/plugins/pbr/scripts/lib/requirements.js +153 -0
  454. package/plugins/pbr/scripts/lib/resolve-root.js +66 -0
  455. package/plugins/pbr/scripts/lib/reverse-spec.js +259 -0
  456. package/plugins/pbr/scripts/lib/roadmap.js +1089 -0
  457. package/plugins/pbr/scripts/lib/security-scan.js +200 -0
  458. package/plugins/pbr/scripts/lib/session-briefing.js +918 -0
  459. package/plugins/pbr/scripts/lib/skill-section.js +99 -0
  460. package/plugins/pbr/scripts/lib/smart-next-task.js +198 -0
  461. package/plugins/pbr/scripts/lib/snapshot-manager.js +232 -0
  462. package/plugins/pbr/scripts/lib/spec-diff.js +209 -0
  463. package/plugins/pbr/scripts/lib/spec-engine.js +189 -0
  464. package/plugins/pbr/scripts/lib/spot-check.js +539 -0
  465. package/plugins/pbr/scripts/lib/state-queue.js +171 -0
  466. package/plugins/pbr/scripts/lib/state.js +1082 -0
  467. package/plugins/pbr/scripts/lib/status-render.js +511 -0
  468. package/plugins/pbr/scripts/lib/step-verify.js +149 -0
  469. package/plugins/pbr/scripts/lib/subagent-validators.js +1119 -0
  470. package/plugins/pbr/scripts/lib/suggest-next.js +435 -0
  471. package/plugins/pbr/scripts/lib/tech-debt-scanner.js +116 -0
  472. package/plugins/pbr/scripts/lib/templates.js +362 -0
  473. package/plugins/pbr/scripts/lib/test-selection.js +163 -0
  474. package/plugins/pbr/scripts/lib/todo.js +300 -0
  475. package/plugins/pbr/scripts/lib/verify.js +1561 -0
  476. package/plugins/pbr/scripts/log-notification.js +131 -0
  477. package/plugins/pbr/scripts/log-subagent.js +221 -18
  478. package/plugins/pbr/scripts/log-tool-failure.js +60 -5
  479. package/plugins/pbr/scripts/milestone-learnings.js +519 -0
  480. package/plugins/pbr/scripts/package.json +1 -1
  481. package/plugins/pbr/scripts/pbr-tools.js +362 -1247
  482. package/plugins/pbr/scripts/post-bash-triage.js +96 -0
  483. package/plugins/pbr/scripts/post-compact.js +135 -0
  484. package/plugins/pbr/scripts/post-hoc.js +237 -0
  485. package/plugins/pbr/scripts/post-write-dispatch.js +201 -31
  486. package/plugins/pbr/scripts/post-write-quality.js +4 -3
  487. package/plugins/pbr/scripts/pre-bash-dispatch.js +147 -51
  488. package/plugins/pbr/scripts/pre-skill-dispatch.js +114 -0
  489. package/plugins/pbr/scripts/pre-task-dispatch.js +269 -0
  490. package/plugins/pbr/scripts/pre-write-dispatch.js +170 -72
  491. package/plugins/pbr/scripts/progress-tracker.js +121 -324
  492. package/plugins/pbr/scripts/prompt-guard.js +114 -0
  493. package/plugins/pbr/scripts/prompt-routing.js +209 -0
  494. package/plugins/pbr/scripts/quick-status.js +179 -0
  495. package/plugins/pbr/scripts/record-incident.js +37 -0
  496. package/plugins/pbr/scripts/risk-classifier.cjs +123 -0
  497. package/plugins/pbr/scripts/run-hook.js +63 -23
  498. package/plugins/pbr/scripts/session-cleanup.js +428 -29
  499. package/plugins/pbr/scripts/session-tracker.js +124 -0
  500. package/plugins/pbr/scripts/status-line.js +571 -43
  501. package/plugins/pbr/scripts/suggest-compact.js +201 -13
  502. package/plugins/pbr/scripts/sync-context-to-claude.js +100 -0
  503. package/plugins/pbr/scripts/task-completed.js +165 -4
  504. package/plugins/pbr/scripts/test/config.test.js +126 -0
  505. package/plugins/pbr/scripts/test/cross-platform.test.js +120 -0
  506. package/plugins/pbr/scripts/test/fixtures/config.json +20 -0
  507. package/plugins/pbr/scripts/test/fixtures/plan.md +54 -0
  508. package/plugins/pbr/scripts/test/fixtures/project.md +30 -0
  509. package/plugins/pbr/scripts/test/fixtures/roadmap.md +55 -0
  510. package/plugins/pbr/scripts/test/fixtures/state.md +60 -0
  511. package/plugins/pbr/scripts/test/fixtures/summary.md +35 -0
  512. package/plugins/pbr/scripts/test/fixtures.test.js +184 -0
  513. package/plugins/pbr/scripts/test/phase.test.js +142 -0
  514. package/plugins/pbr/scripts/test/roadmap.test.js +96 -0
  515. package/plugins/pbr/scripts/test/state.test.js +155 -0
  516. package/plugins/pbr/scripts/track-context-budget.js +368 -104
  517. package/plugins/pbr/scripts/track-user-gates.js +88 -0
  518. package/plugins/pbr/scripts/trust-tracker.js +193 -0
  519. package/plugins/pbr/scripts/validate-commit.js +51 -19
  520. package/plugins/pbr/scripts/validate-skill-args.js +85 -14
  521. package/plugins/pbr/scripts/validate-task.js +83 -622
  522. package/plugins/pbr/scripts/worktree-create.js +144 -0
  523. package/plugins/pbr/scripts/worktree-remove.js +147 -0
  524. package/plugins/pbr/skills/audit/SKILL.md +195 -24
  525. package/plugins/pbr/skills/audit-fix/SKILL.md +326 -0
  526. package/plugins/pbr/skills/autonomous/SKILL.md +551 -0
  527. package/plugins/pbr/skills/backlog/SKILL.md +56 -0
  528. package/plugins/pbr/skills/begin/SKILL.md +508 -153
  529. package/plugins/pbr/skills/begin/templates/STATE.md.tmpl +1 -2
  530. package/plugins/pbr/skills/begin/templates/config.json.tmpl +419 -36
  531. package/plugins/pbr/skills/begin/templates/researcher-prompt.md.tmpl +28 -0
  532. package/plugins/pbr/skills/begin/templates/roadmap-prompt.md.tmpl +28 -3
  533. package/plugins/pbr/skills/begin/templates/synthesis-prompt.md.tmpl +33 -5
  534. package/plugins/pbr/skills/build/SKILL.md +1180 -357
  535. package/plugins/pbr/skills/build/templates/continuation-prompt.md.tmpl +26 -0
  536. package/plugins/pbr/skills/build/templates/executor-prompt.md.tmpl +77 -0
  537. package/plugins/pbr/skills/build/templates/inline-verifier-prompt.md.tmpl +33 -0
  538. package/plugins/pbr/skills/build/templates/qa-round-context.md.tmpl +16 -0
  539. package/plugins/pbr/skills/config/SKILL.md +112 -9
  540. package/plugins/pbr/skills/continue/SKILL.md +113 -33
  541. package/plugins/pbr/skills/dashboard/SKILL.md +21 -9
  542. package/plugins/pbr/skills/debug/SKILL.md +70 -12
  543. package/plugins/pbr/skills/debug/templates/continuation-prompt.md.tmpl +12 -1
  544. package/plugins/pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +12 -5
  545. package/plugins/pbr/skills/discuss/SKILL.md +205 -24
  546. package/plugins/pbr/skills/discuss/templates/CONTEXT.md.tmpl +21 -1
  547. package/plugins/pbr/skills/do/SKILL.md +119 -24
  548. package/plugins/pbr/skills/explore/SKILL.md +95 -20
  549. package/plugins/pbr/skills/fast/SKILL.md +94 -0
  550. package/plugins/pbr/skills/forensics/SKILL.md +144 -0
  551. package/plugins/pbr/skills/health/SKILL.md +35 -115
  552. package/plugins/pbr/skills/help/SKILL.md +83 -123
  553. package/plugins/pbr/skills/import/SKILL.md +332 -13
  554. package/plugins/pbr/skills/intel/SKILL.md +131 -0
  555. package/plugins/pbr/skills/list-phase-assumptions/SKILL.md +231 -0
  556. package/plugins/pbr/skills/milestone/SKILL.md +383 -274
  557. package/plugins/pbr/skills/milestone/templates/audit-output.md.tmpl +76 -0
  558. package/plugins/pbr/skills/milestone/templates/complete-output.md.tmpl +32 -0
  559. package/plugins/pbr/skills/milestone/templates/edge-cases.md +54 -0
  560. package/plugins/pbr/skills/milestone/templates/gaps-output.md.tmpl +25 -0
  561. package/plugins/pbr/skills/milestone/templates/integration-checker-prompt.md.tmpl +25 -0
  562. package/plugins/pbr/skills/milestone/templates/new-output.md.tmpl +29 -0
  563. package/plugins/pbr/skills/milestone-summary/SKILL.md +86 -0
  564. package/plugins/pbr/skills/note/SKILL.md +20 -4
  565. package/plugins/pbr/skills/pause/SKILL.md +54 -14
  566. package/plugins/pbr/skills/pause/templates/continue-here.md.tmpl +33 -52
  567. package/plugins/pbr/skills/plan/SKILL.md +526 -280
  568. package/plugins/pbr/skills/plan/templates/checker-prompt.md.tmpl +20 -2
  569. package/plugins/pbr/skills/plan/templates/completion-output.md.tmpl +27 -0
  570. package/plugins/pbr/skills/plan/templates/planner-prompt.md.tmpl +43 -1
  571. package/plugins/pbr/skills/plan/templates/revision-prompt.md.tmpl +21 -5
  572. package/plugins/pbr/skills/profile/SKILL.md +185 -0
  573. package/plugins/pbr/skills/profile-user/SKILL.md +227 -0
  574. package/plugins/pbr/skills/quick/SKILL.md +435 -100
  575. package/plugins/pbr/skills/release/SKILL.md +206 -0
  576. package/plugins/pbr/skills/resume/SKILL.md +170 -46
  577. package/plugins/pbr/skills/review/SKILL.md +233 -165
  578. package/plugins/pbr/skills/review/templates/verifier-prompt.md.tmpl +7 -0
  579. package/plugins/pbr/skills/scan/SKILL.md +152 -106
  580. package/plugins/pbr/skills/scan/templates/mapper-prompt.md.tmpl +5 -56
  581. package/plugins/pbr/skills/seed/SKILL.md +87 -0
  582. package/plugins/pbr/skills/session-report/SKILL.md +130 -0
  583. package/plugins/pbr/skills/setup/SKILL.md +150 -202
  584. package/plugins/pbr/skills/shared/agent-context-enrichment.md +21 -0
  585. package/plugins/pbr/skills/shared/agent-type-resolution.md +32 -0
  586. package/plugins/pbr/skills/shared/commit-planning-docs.md +8 -0
  587. package/plugins/pbr/skills/shared/context-budget.md +66 -1
  588. package/plugins/pbr/skills/shared/context-loader-task.md +18 -11
  589. package/plugins/pbr/skills/shared/criterion-writing.md +58 -0
  590. package/plugins/pbr/skills/shared/digest-select.md +2 -2
  591. package/plugins/pbr/skills/shared/domain-probes.md +1 -1
  592. package/plugins/pbr/skills/shared/error-reporting.md +38 -60
  593. package/plugins/pbr/skills/shared/gate-prompts.md +4 -2
  594. package/plugins/pbr/skills/shared/memory-capture.md +48 -0
  595. package/plugins/pbr/skills/shared/phase-argument-parsing.md +4 -4
  596. package/plugins/pbr/skills/shared/revision-loop.md +24 -6
  597. package/plugins/pbr/skills/shared/state-update.md +46 -61
  598. package/plugins/pbr/skills/shared/universal-anti-patterns.md +27 -4
  599. package/plugins/pbr/skills/ship/SKILL.md +155 -0
  600. package/plugins/pbr/skills/stats/SKILL.md +110 -0
  601. package/plugins/pbr/skills/status/SKILL.md +185 -119
  602. package/plugins/pbr/skills/test/SKILL.md +254 -0
  603. package/plugins/pbr/skills/thread/SKILL.md +73 -0
  604. package/plugins/pbr/skills/todo/SKILL.md +28 -72
  605. package/plugins/pbr/skills/ui-phase/SKILL.md +180 -0
  606. package/plugins/pbr/skills/ui-review/SKILL.md +206 -0
  607. package/plugins/pbr/skills/undo/SKILL.md +221 -0
  608. package/plugins/pbr/skills/validate-phase/SKILL.md +362 -0
  609. package/plugins/pbr/templates/CONTEXT.md.tmpl +45 -20
  610. package/plugins/pbr/templates/DISCOVERY.md.tmpl +29 -0
  611. package/plugins/pbr/templates/DISCUSSION-LOG.md.tmpl +49 -0
  612. package/plugins/pbr/templates/HANDOFF.json.tmpl +30 -0
  613. package/plugins/pbr/templates/INTEGRATION-REPORT.md.tmpl +18 -2
  614. package/plugins/pbr/templates/MILESTONE-AUDIT.md.tmpl +44 -0
  615. package/plugins/pbr/templates/PROJECT.md.tmpl +126 -0
  616. package/plugins/pbr/templates/REQUIREMENTS.md.tmpl +96 -0
  617. package/plugins/pbr/templates/RETROSPECTIVE.md.tmpl +43 -0
  618. package/plugins/pbr/templates/ROADMAP.md.tmpl +106 -14
  619. package/plugins/pbr/templates/SUMMARY-complex.md.tmpl +133 -0
  620. package/plugins/pbr/templates/SUMMARY-minimal.md.tmpl +55 -0
  621. package/plugins/pbr/templates/SUMMARY.md.tmpl +21 -0
  622. package/plugins/pbr/templates/UAT.md.tmpl +94 -0
  623. package/plugins/pbr/templates/UI-SPEC.md.tmpl +144 -0
  624. package/plugins/pbr/templates/VALIDATION.md.tmpl +94 -0
  625. package/plugins/pbr/templates/VERIFICATION-DETAIL.md.tmpl +54 -13
  626. package/plugins/pbr/templates/project-CONTEXT.md.tmpl +59 -0
  627. package/plugins/pbr/templates/research-outputs/ARCHITECTURE.md.tmpl +91 -0
  628. package/plugins/pbr/templates/research-outputs/FEATURES.md.tmpl +64 -0
  629. package/plugins/pbr/templates/research-outputs/PITFALLS.md.tmpl +50 -0
  630. package/plugins/pbr/templates/research-outputs/STACK.md.tmpl +63 -0
  631. package/plugins/pbr/templates/research-outputs/SUMMARY.md.tmpl +98 -0
  632. package/scripts/build-hooks.js +61 -0
  633. package/scripts/check-ci.js +100 -0
  634. package/scripts/clean-changelog.js +364 -0
  635. package/scripts/generate-derivatives.js +581 -0
  636. package/scripts/posttest.js +93 -0
  637. package/scripts/release.js +262 -0
  638. package/scripts/run-tests.cjs +29 -0
  639. package/scripts/test-wrapper.js +43 -0
  640. package/dashboard/bin/cli.js +0 -25
  641. package/dashboard/public/css/layout.css +0 -704
  642. package/dashboard/public/css/status-colors.css +0 -98
  643. package/dashboard/public/css/tokens.css +0 -59
  644. package/dashboard/public/js/htmx-title.js +0 -5
  645. package/dashboard/public/js/sidebar-toggle.js +0 -34
  646. package/dashboard/public/js/sse-client.js +0 -100
  647. package/dashboard/public/js/theme-toggle.js +0 -46
  648. package/dashboard/src/app.js +0 -91
  649. package/dashboard/src/middleware/current-phase.js +0 -24
  650. package/dashboard/src/middleware/errorHandler.js +0 -52
  651. package/dashboard/src/middleware/notFoundHandler.js +0 -9
  652. package/dashboard/src/repositories/planning.repository.js +0 -130
  653. package/dashboard/src/routes/events.routes.js +0 -45
  654. package/dashboard/src/routes/index.routes.js +0 -35
  655. package/dashboard/src/routes/pages.routes.js +0 -426
  656. package/dashboard/src/server.js +0 -42
  657. package/dashboard/src/services/analytics.service.js +0 -141
  658. package/dashboard/src/services/dashboard.service.js +0 -309
  659. package/dashboard/src/services/milestone.service.js +0 -222
  660. package/dashboard/src/services/notes.service.js +0 -50
  661. package/dashboard/src/services/phase.service.js +0 -232
  662. package/dashboard/src/services/project.service.js +0 -57
  663. package/dashboard/src/services/roadmap.service.js +0 -258
  664. package/dashboard/src/services/sse.service.js +0 -58
  665. package/dashboard/src/services/todo.service.js +0 -272
  666. package/dashboard/src/services/watcher.service.js +0 -48
  667. package/dashboard/src/utils/cache.js +0 -55
  668. package/dashboard/src/views/analytics.ejs +0 -5
  669. package/dashboard/src/views/coming-soon.ejs +0 -11
  670. package/dashboard/src/views/dependencies.ejs +0 -5
  671. package/dashboard/src/views/error.ejs +0 -20
  672. package/dashboard/src/views/index.ejs +0 -5
  673. package/dashboard/src/views/milestone-detail.ejs +0 -5
  674. package/dashboard/src/views/milestones.ejs +0 -5
  675. package/dashboard/src/views/notes.ejs +0 -5
  676. package/dashboard/src/views/partials/analytics-content.ejs +0 -90
  677. package/dashboard/src/views/partials/breadcrumbs.ejs +0 -14
  678. package/dashboard/src/views/partials/dashboard-content.ejs +0 -84
  679. package/dashboard/src/views/partials/dependencies-content.ejs +0 -48
  680. package/dashboard/src/views/partials/empty-state.ejs +0 -7
  681. package/dashboard/src/views/partials/footer.ejs +0 -3
  682. package/dashboard/src/views/partials/head.ejs +0 -30
  683. package/dashboard/src/views/partials/header.ejs +0 -21
  684. package/dashboard/src/views/partials/layout-bottom.ejs +0 -43
  685. package/dashboard/src/views/partials/layout-top.ejs +0 -16
  686. package/dashboard/src/views/partials/milestone-detail-content.ejs +0 -20
  687. package/dashboard/src/views/partials/milestones-content.ejs +0 -88
  688. package/dashboard/src/views/partials/notes-content.ejs +0 -23
  689. package/dashboard/src/views/partials/phase-content.ejs +0 -193
  690. package/dashboard/src/views/partials/phase-doc-content.ejs +0 -38
  691. package/dashboard/src/views/partials/phases-content.ejs +0 -124
  692. package/dashboard/src/views/partials/roadmap-content.ejs +0 -180
  693. package/dashboard/src/views/partials/sidebar.ejs +0 -99
  694. package/dashboard/src/views/partials/todo-create-content.ejs +0 -54
  695. package/dashboard/src/views/partials/todo-detail-content.ejs +0 -42
  696. package/dashboard/src/views/partials/todos-content.ejs +0 -97
  697. package/dashboard/src/views/phase-detail.ejs +0 -5
  698. package/dashboard/src/views/phase-doc.ejs +0 -5
  699. package/dashboard/src/views/phases.ejs +0 -5
  700. package/dashboard/src/views/roadmap.ejs +0 -5
  701. package/dashboard/src/views/todo-create.ejs +0 -5
  702. package/dashboard/src/views/todo-detail.ejs +0 -5
  703. package/dashboard/src/views/todos.ejs +0 -5
  704. package/plugins/copilot-pbr/CHANGELOG.md +0 -19
  705. package/plugins/copilot-pbr/README.md +0 -139
  706. package/plugins/copilot-pbr/agents/audit.agent.md +0 -113
  707. package/plugins/copilot-pbr/agents/codebase-mapper.agent.md +0 -151
  708. package/plugins/copilot-pbr/agents/debugger.agent.md +0 -184
  709. package/plugins/copilot-pbr/agents/executor.agent.md +0 -269
  710. package/plugins/copilot-pbr/agents/general.agent.md +0 -89
  711. package/plugins/copilot-pbr/agents/integration-checker.agent.md +0 -121
  712. package/plugins/copilot-pbr/agents/plan-checker.agent.md +0 -208
  713. package/plugins/copilot-pbr/agents/planner.agent.md +0 -240
  714. package/plugins/copilot-pbr/agents/researcher.agent.md +0 -188
  715. package/plugins/copilot-pbr/agents/synthesizer.agent.md +0 -126
  716. package/plugins/copilot-pbr/agents/verifier.agent.md +0 -228
  717. package/plugins/copilot-pbr/hooks/hooks.json +0 -258
  718. package/plugins/copilot-pbr/plugin.json +0 -30
  719. package/plugins/copilot-pbr/references/agent-anti-patterns.md +0 -25
  720. package/plugins/copilot-pbr/references/agent-contracts.md +0 -297
  721. package/plugins/copilot-pbr/references/agent-interactions.md +0 -135
  722. package/plugins/copilot-pbr/references/agent-teams.md +0 -55
  723. package/plugins/copilot-pbr/references/checkpoints.md +0 -158
  724. package/plugins/copilot-pbr/references/common-bug-patterns.md +0 -14
  725. package/plugins/copilot-pbr/references/config-reference.md +0 -442
  726. package/plugins/copilot-pbr/references/continuation-format.md +0 -213
  727. package/plugins/copilot-pbr/references/deviation-rules.md +0 -113
  728. package/plugins/copilot-pbr/references/git-integration.md +0 -227
  729. package/plugins/copilot-pbr/references/integration-patterns.md +0 -118
  730. package/plugins/copilot-pbr/references/model-profiles.md +0 -100
  731. package/plugins/copilot-pbr/references/model-selection.md +0 -32
  732. package/plugins/copilot-pbr/references/pbr-rules.md +0 -195
  733. package/plugins/copilot-pbr/references/pbr-tools-cli.md +0 -285
  734. package/plugins/copilot-pbr/references/plan-authoring.md +0 -182
  735. package/plugins/copilot-pbr/references/plan-format.md +0 -288
  736. package/plugins/copilot-pbr/references/planning-config.md +0 -214
  737. package/plugins/copilot-pbr/references/questioning.md +0 -215
  738. package/plugins/copilot-pbr/references/reading-verification.md +0 -128
  739. package/plugins/copilot-pbr/references/stub-patterns.md +0 -161
  740. package/plugins/copilot-pbr/references/subagent-coordination.md +0 -120
  741. package/plugins/copilot-pbr/references/ui-formatting.md +0 -444
  742. package/plugins/copilot-pbr/references/verification-patterns.md +0 -199
  743. package/plugins/copilot-pbr/references/wave-execution.md +0 -96
  744. package/plugins/copilot-pbr/rules/pbr-workflow.mdc +0 -48
  745. package/plugins/copilot-pbr/setup.ps1 +0 -93
  746. package/plugins/copilot-pbr/setup.sh +0 -93
  747. package/plugins/copilot-pbr/skills/audit/SKILL.md +0 -330
  748. package/plugins/copilot-pbr/skills/begin/SKILL.md +0 -589
  749. package/plugins/copilot-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  750. package/plugins/copilot-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  751. package/plugins/copilot-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  752. package/plugins/copilot-pbr/skills/begin/templates/config.json.tmpl +0 -64
  753. package/plugins/copilot-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  754. package/plugins/copilot-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  755. package/plugins/copilot-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  756. package/plugins/copilot-pbr/skills/build/SKILL.md +0 -959
  757. package/plugins/copilot-pbr/skills/config/SKILL.md +0 -250
  758. package/plugins/copilot-pbr/skills/continue/SKILL.md +0 -159
  759. package/plugins/copilot-pbr/skills/dashboard/SKILL.md +0 -43
  760. package/plugins/copilot-pbr/skills/debug/SKILL.md +0 -508
  761. package/plugins/copilot-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  762. package/plugins/copilot-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  763. package/plugins/copilot-pbr/skills/discuss/SKILL.md +0 -353
  764. package/plugins/copilot-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  765. package/plugins/copilot-pbr/skills/discuss/templates/decision-categories.md +0 -10
  766. package/plugins/copilot-pbr/skills/do/SKILL.md +0 -66
  767. package/plugins/copilot-pbr/skills/explore/SKILL.md +0 -373
  768. package/plugins/copilot-pbr/skills/health/SKILL.md +0 -283
  769. package/plugins/copilot-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  770. package/plugins/copilot-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  771. package/plugins/copilot-pbr/skills/help/SKILL.md +0 -193
  772. package/plugins/copilot-pbr/skills/import/SKILL.md +0 -502
  773. package/plugins/copilot-pbr/skills/milestone/SKILL.md +0 -806
  774. package/plugins/copilot-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  775. package/plugins/copilot-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  776. package/plugins/copilot-pbr/skills/note/SKILL.md +0 -213
  777. package/plugins/copilot-pbr/skills/pause/SKILL.md +0 -247
  778. package/plugins/copilot-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  779. package/plugins/copilot-pbr/skills/plan/SKILL.md +0 -662
  780. package/plugins/copilot-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  781. package/plugins/copilot-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  782. package/plugins/copilot-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  783. package/plugins/copilot-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  784. package/plugins/copilot-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  785. package/plugins/copilot-pbr/skills/quick/SKILL.md +0 -376
  786. package/plugins/copilot-pbr/skills/resume/SKILL.md +0 -399
  787. package/plugins/copilot-pbr/skills/review/SKILL.md +0 -653
  788. package/plugins/copilot-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  789. package/plugins/copilot-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  790. package/plugins/copilot-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  791. package/plugins/copilot-pbr/skills/scan/SKILL.md +0 -299
  792. package/plugins/copilot-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  793. package/plugins/copilot-pbr/skills/setup/SKILL.md +0 -296
  794. package/plugins/copilot-pbr/skills/shared/commit-planning-docs.md +0 -36
  795. package/plugins/copilot-pbr/skills/shared/config-loading.md +0 -103
  796. package/plugins/copilot-pbr/skills/shared/context-budget.md +0 -41
  797. package/plugins/copilot-pbr/skills/shared/context-loader-task.md +0 -87
  798. package/plugins/copilot-pbr/skills/shared/digest-select.md +0 -80
  799. package/plugins/copilot-pbr/skills/shared/domain-probes.md +0 -126
  800. package/plugins/copilot-pbr/skills/shared/error-recovery-strategies.md +0 -51
  801. package/plugins/copilot-pbr/skills/shared/error-reporting.md +0 -81
  802. package/plugins/copilot-pbr/skills/shared/gate-prompts.md +0 -389
  803. package/plugins/copilot-pbr/skills/shared/phase-argument-parsing.md +0 -46
  804. package/plugins/copilot-pbr/skills/shared/progress-display.md +0 -53
  805. package/plugins/copilot-pbr/skills/shared/revision-loop.md +0 -82
  806. package/plugins/copilot-pbr/skills/shared/state-loading.md +0 -63
  807. package/plugins/copilot-pbr/skills/shared/state-update.md +0 -170
  808. package/plugins/copilot-pbr/skills/shared/universal-anti-patterns.md +0 -38
  809. package/plugins/copilot-pbr/skills/status/SKILL.md +0 -362
  810. package/plugins/copilot-pbr/skills/statusline/SKILL.md +0 -149
  811. package/plugins/copilot-pbr/skills/todo/SKILL.md +0 -279
  812. package/plugins/copilot-pbr/templates/CONTEXT.md.tmpl +0 -53
  813. package/plugins/copilot-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  814. package/plugins/copilot-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  815. package/plugins/copilot-pbr/templates/ROADMAP.md.tmpl +0 -48
  816. package/plugins/copilot-pbr/templates/SUMMARY.md.tmpl +0 -82
  817. package/plugins/copilot-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  818. package/plugins/copilot-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  819. package/plugins/copilot-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  820. package/plugins/copilot-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  821. package/plugins/copilot-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  822. package/plugins/copilot-pbr/templates/codebase/STACK.md.tmpl +0 -78
  823. package/plugins/copilot-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  824. package/plugins/copilot-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  825. package/plugins/copilot-pbr/templates/continue-here.md.tmpl +0 -74
  826. package/plugins/copilot-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  827. package/plugins/copilot-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  828. package/plugins/copilot-pbr/templates/research/STACK.md.tmpl +0 -71
  829. package/plugins/copilot-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  830. package/plugins/copilot-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  831. package/plugins/copilot-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  832. package/plugins/copilot-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  833. package/plugins/cursor-pbr/.cursor-plugin/plugin.json +0 -32
  834. package/plugins/cursor-pbr/CHANGELOG.md +0 -15
  835. package/plugins/cursor-pbr/README.md +0 -123
  836. package/plugins/cursor-pbr/agents/audit.md +0 -178
  837. package/plugins/cursor-pbr/agents/codebase-mapper.md +0 -150
  838. package/plugins/cursor-pbr/agents/debugger.md +0 -183
  839. package/plugins/cursor-pbr/agents/executor.md +0 -268
  840. package/plugins/cursor-pbr/agents/general.md +0 -88
  841. package/plugins/cursor-pbr/agents/integration-checker.md +0 -120
  842. package/plugins/cursor-pbr/agents/plan-checker.md +0 -207
  843. package/plugins/cursor-pbr/agents/planner.md +0 -239
  844. package/plugins/cursor-pbr/agents/researcher.md +0 -187
  845. package/plugins/cursor-pbr/agents/synthesizer.md +0 -125
  846. package/plugins/cursor-pbr/agents/verifier.md +0 -227
  847. package/plugins/cursor-pbr/assets/.gitkeep +0 -0
  848. package/plugins/cursor-pbr/assets/logo.svg +0 -21
  849. package/plugins/cursor-pbr/hooks/hooks.json +0 -224
  850. package/plugins/cursor-pbr/references/agent-anti-patterns.md +0 -25
  851. package/plugins/cursor-pbr/references/agent-contracts.md +0 -297
  852. package/plugins/cursor-pbr/references/agent-interactions.md +0 -135
  853. package/plugins/cursor-pbr/references/agent-teams.md +0 -55
  854. package/plugins/cursor-pbr/references/checkpoints.md +0 -158
  855. package/plugins/cursor-pbr/references/common-bug-patterns.md +0 -14
  856. package/plugins/cursor-pbr/references/config-reference.md +0 -442
  857. package/plugins/cursor-pbr/references/continuation-format.md +0 -213
  858. package/plugins/cursor-pbr/references/deviation-rules.md +0 -113
  859. package/plugins/cursor-pbr/references/git-integration.md +0 -227
  860. package/plugins/cursor-pbr/references/integration-patterns.md +0 -118
  861. package/plugins/cursor-pbr/references/model-profiles.md +0 -100
  862. package/plugins/cursor-pbr/references/model-selection.md +0 -32
  863. package/plugins/cursor-pbr/references/pbr-rules.md +0 -195
  864. package/plugins/cursor-pbr/references/pbr-tools-cli.md +0 -285
  865. package/plugins/cursor-pbr/references/plan-authoring.md +0 -182
  866. package/plugins/cursor-pbr/references/plan-format.md +0 -288
  867. package/plugins/cursor-pbr/references/planning-config.md +0 -214
  868. package/plugins/cursor-pbr/references/questioning.md +0 -215
  869. package/plugins/cursor-pbr/references/reading-verification.md +0 -128
  870. package/plugins/cursor-pbr/references/stub-patterns.md +0 -161
  871. package/plugins/cursor-pbr/references/subagent-coordination.md +0 -120
  872. package/plugins/cursor-pbr/references/ui-formatting.md +0 -444
  873. package/plugins/cursor-pbr/references/verification-patterns.md +0 -199
  874. package/plugins/cursor-pbr/references/wave-execution.md +0 -96
  875. package/plugins/cursor-pbr/rules/pbr-workflow.mdc +0 -48
  876. package/plugins/cursor-pbr/setup.ps1 +0 -78
  877. package/plugins/cursor-pbr/setup.sh +0 -83
  878. package/plugins/cursor-pbr/skills/audit/SKILL.md +0 -331
  879. package/plugins/cursor-pbr/skills/begin/SKILL.md +0 -589
  880. package/plugins/cursor-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  881. package/plugins/cursor-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  882. package/plugins/cursor-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  883. package/plugins/cursor-pbr/skills/begin/templates/config.json.tmpl +0 -64
  884. package/plugins/cursor-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  885. package/plugins/cursor-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  886. package/plugins/cursor-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  887. package/plugins/cursor-pbr/skills/build/SKILL.md +0 -960
  888. package/plugins/cursor-pbr/skills/config/SKILL.md +0 -252
  889. package/plugins/cursor-pbr/skills/continue/SKILL.md +0 -159
  890. package/plugins/cursor-pbr/skills/dashboard/SKILL.md +0 -44
  891. package/plugins/cursor-pbr/skills/debug/SKILL.md +0 -512
  892. package/plugins/cursor-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  893. package/plugins/cursor-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  894. package/plugins/cursor-pbr/skills/discuss/SKILL.md +0 -354
  895. package/plugins/cursor-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  896. package/plugins/cursor-pbr/skills/discuss/templates/decision-categories.md +0 -10
  897. package/plugins/cursor-pbr/skills/do/SKILL.md +0 -67
  898. package/plugins/cursor-pbr/skills/explore/SKILL.md +0 -376
  899. package/plugins/cursor-pbr/skills/health/SKILL.md +0 -283
  900. package/plugins/cursor-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  901. package/plugins/cursor-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  902. package/plugins/cursor-pbr/skills/help/SKILL.md +0 -193
  903. package/plugins/cursor-pbr/skills/import/SKILL.md +0 -505
  904. package/plugins/cursor-pbr/skills/milestone/SKILL.md +0 -807
  905. package/plugins/cursor-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  906. package/plugins/cursor-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  907. package/plugins/cursor-pbr/skills/note/SKILL.md +0 -214
  908. package/plugins/cursor-pbr/skills/pause/SKILL.md +0 -248
  909. package/plugins/cursor-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  910. package/plugins/cursor-pbr/skills/plan/SKILL.md +0 -663
  911. package/plugins/cursor-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  912. package/plugins/cursor-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  913. package/plugins/cursor-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  914. package/plugins/cursor-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  915. package/plugins/cursor-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  916. package/plugins/cursor-pbr/skills/quick/SKILL.md +0 -376
  917. package/plugins/cursor-pbr/skills/resume/SKILL.md +0 -399
  918. package/plugins/cursor-pbr/skills/review/SKILL.md +0 -654
  919. package/plugins/cursor-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  920. package/plugins/cursor-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  921. package/plugins/cursor-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  922. package/plugins/cursor-pbr/skills/scan/SKILL.md +0 -300
  923. package/plugins/cursor-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  924. package/plugins/cursor-pbr/skills/setup/SKILL.md +0 -296
  925. package/plugins/cursor-pbr/skills/shared/commit-planning-docs.md +0 -36
  926. package/plugins/cursor-pbr/skills/shared/config-loading.md +0 -103
  927. package/plugins/cursor-pbr/skills/shared/context-budget.md +0 -41
  928. package/plugins/cursor-pbr/skills/shared/context-loader-task.md +0 -87
  929. package/plugins/cursor-pbr/skills/shared/digest-select.md +0 -80
  930. package/plugins/cursor-pbr/skills/shared/domain-probes.md +0 -126
  931. package/plugins/cursor-pbr/skills/shared/error-recovery-strategies.md +0 -51
  932. package/plugins/cursor-pbr/skills/shared/error-reporting.md +0 -81
  933. package/plugins/cursor-pbr/skills/shared/gate-prompts.md +0 -389
  934. package/plugins/cursor-pbr/skills/shared/phase-argument-parsing.md +0 -46
  935. package/plugins/cursor-pbr/skills/shared/progress-display.md +0 -53
  936. package/plugins/cursor-pbr/skills/shared/revision-loop.md +0 -82
  937. package/plugins/cursor-pbr/skills/shared/state-loading.md +0 -63
  938. package/plugins/cursor-pbr/skills/shared/state-update.md +0 -170
  939. package/plugins/cursor-pbr/skills/shared/universal-anti-patterns.md +0 -38
  940. package/plugins/cursor-pbr/skills/status/SKILL.md +0 -362
  941. package/plugins/cursor-pbr/skills/statusline/SKILL.md +0 -150
  942. package/plugins/cursor-pbr/skills/todo/SKILL.md +0 -280
  943. package/plugins/cursor-pbr/templates/CONTEXT.md.tmpl +0 -53
  944. package/plugins/cursor-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  945. package/plugins/cursor-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  946. package/plugins/cursor-pbr/templates/ROADMAP.md.tmpl +0 -48
  947. package/plugins/cursor-pbr/templates/SUMMARY.md.tmpl +0 -82
  948. package/plugins/cursor-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  949. package/plugins/cursor-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  950. package/plugins/cursor-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  951. package/plugins/cursor-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  952. package/plugins/cursor-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  953. package/plugins/cursor-pbr/templates/codebase/STACK.md.tmpl +0 -78
  954. package/plugins/cursor-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  955. package/plugins/cursor-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  956. package/plugins/cursor-pbr/templates/continue-here.md.tmpl +0 -74
  957. package/plugins/cursor-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  958. package/plugins/cursor-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  959. package/plugins/cursor-pbr/templates/research/STACK.md.tmpl +0 -71
  960. package/plugins/cursor-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  961. package/plugins/cursor-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  962. package/plugins/cursor-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  963. package/plugins/cursor-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  964. package/plugins/pbr/references/agent-interactions.md +0 -134
  965. package/plugins/pbr/references/pbr-rules.md +0 -194
  966. package/plugins/pbr/references/pbr-tools-cli.md +0 -285
  967. package/plugins/pbr/references/planning-config.md +0 -213
  968. package/plugins/pbr/references/subagent-coordination.md +0 -119
  969. package/plugins/pbr/references/ui-formatting.md +0 -444
  970. package/plugins/pbr/scripts/validate-plugin-structure.js +0 -183
  971. package/plugins/pbr/skills/milestone/templates/audit-report.md.tmpl +0 -48
  972. package/plugins/pbr/skills/shared/error-recovery-strategies.md +0 -51
  973. package/plugins/pbr/skills/shared/progress-display.md +0 -53
  974. package/plugins/pbr/skills/shared/state-loading.md +0 -62
  975. package/plugins/pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -97
  976. package/plugins/pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  977. package/plugins/pbr/templates/research/STACK.md.tmpl +0 -71
  978. package/plugins/pbr/templates/research/SUMMARY.md.tmpl +0 -112
  979. package/plugins/pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  980. package/plugins/pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  981. package/plugins/pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  982. /package/plugins/pbr/references/{agent-anti-patterns.md → archive/agent-anti-patterns.md} +0 -0
@@ -0,0 +1,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
+ };