@sienklogic/plan-build-run 2.18.1 → 2.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (977) hide show
  1. package/CHANGELOG.md +1265 -296
  2. package/CLAUDE.md +56 -34
  3. package/LICENSE +2 -1
  4. package/README.md +412 -177
  5. package/bin/install.js +2752 -0
  6. package/dashboard/bin/cli.cjs +96 -0
  7. package/dashboard/bin/stop.cjs +129 -0
  8. package/dashboard/eslint.config.js +37 -0
  9. package/dashboard/index.html +20 -0
  10. package/dashboard/package.json +27 -25
  11. package/dashboard/server/index.js +142 -0
  12. package/dashboard/server/lib/frontmatter.js +92 -0
  13. package/dashboard/server/middleware/static.js +35 -0
  14. package/dashboard/server/package.json +16 -0
  15. package/dashboard/server/routes/agents.js +213 -0
  16. package/dashboard/server/routes/config.js +64 -0
  17. package/dashboard/server/routes/health.js +95 -0
  18. package/dashboard/server/routes/incidents.js +78 -0
  19. package/dashboard/server/routes/intel.js +69 -0
  20. package/dashboard/server/routes/memory.js +107 -0
  21. package/dashboard/server/routes/planning.js +234 -0
  22. package/dashboard/server/routes/progress.js +77 -0
  23. package/dashboard/server/routes/projects.js +36 -0
  24. package/dashboard/server/routes/requirements.js +40 -0
  25. package/dashboard/server/routes/roadmap.js +69 -0
  26. package/dashboard/server/routes/sessions.js +70 -0
  27. package/dashboard/server/routes/status.js +25 -0
  28. package/dashboard/server/routes/telemetry.js +214 -0
  29. package/dashboard/server/services/file-watcher.js +105 -0
  30. package/dashboard/server/services/planning-reader.js +741 -0
  31. package/dashboard/server/test/cli.test.js +34 -0
  32. package/dashboard/server/test/frontmatter.test.js +104 -0
  33. package/dashboard/server/test/isolation.test.js +32 -0
  34. package/dashboard/server/test/planning-reader.test.js +151 -0
  35. package/dashboard/server/test/routes.test.js +91 -0
  36. package/dashboard/server/test/ws.test.js +81 -0
  37. package/dashboard/server/ws.js +96 -0
  38. package/dashboard/src/App.jsx +165 -0
  39. package/dashboard/src/components/charts/BudgetBars.jsx +42 -0
  40. package/dashboard/src/components/charts/ContextRadar.jsx +34 -0
  41. package/dashboard/src/components/charts/PhaseDonut.jsx +66 -0
  42. package/dashboard/src/components/charts/SuccessTrend.jsx +45 -0
  43. package/dashboard/src/components/charts/TokenChart.jsx +55 -0
  44. package/dashboard/src/components/charts/index.js +5 -0
  45. package/dashboard/src/components/config/CfgSection.jsx +93 -0
  46. package/dashboard/src/components/layout/Header.jsx +89 -0
  47. package/dashboard/src/components/layout/ProjectSwitcher.jsx +160 -0
  48. package/dashboard/src/components/layout/Sidebar.jsx +161 -0
  49. package/dashboard/src/components/ui/AutoModeBanner.jsx +138 -0
  50. package/dashboard/src/components/ui/BackButton.jsx +27 -0
  51. package/dashboard/src/components/ui/Badge.jsx +27 -0
  52. package/dashboard/src/components/ui/Card.jsx +23 -0
  53. package/dashboard/src/components/ui/ChartTooltip.jsx +48 -0
  54. package/dashboard/src/components/ui/CheckpointBox.jsx +110 -0
  55. package/dashboard/src/components/ui/CodeBlock.jsx +27 -0
  56. package/dashboard/src/components/ui/ConfidenceBadge.jsx +20 -0
  57. package/dashboard/src/components/ui/ConfirmModal.jsx +161 -0
  58. package/dashboard/src/components/ui/ConnectionBanner.jsx +60 -0
  59. package/dashboard/src/components/ui/ErrorBoundary.jsx +106 -0
  60. package/dashboard/src/components/ui/ErrorBox.jsx +107 -0
  61. package/dashboard/src/components/ui/KeyValue.jsx +33 -0
  62. package/dashboard/src/components/ui/LoadingSkeleton.jsx +84 -0
  63. package/dashboard/src/components/ui/MetricCard.jsx +58 -0
  64. package/dashboard/src/components/ui/NextUpBlock.jsx +92 -0
  65. package/dashboard/src/components/ui/NumberInput.jsx +44 -0
  66. package/dashboard/src/components/ui/PBRBanner.jsx +47 -0
  67. package/dashboard/src/components/ui/PipelineView.jsx +130 -0
  68. package/dashboard/src/components/ui/ProgressBar.jsx +28 -0
  69. package/dashboard/src/components/ui/ProgressDisplay.jsx +47 -0
  70. package/dashboard/src/components/ui/QualityGateBadge.jsx +15 -0
  71. package/dashboard/src/components/ui/SectionTitle.jsx +35 -0
  72. package/dashboard/src/components/ui/SelectInput.jsx +45 -0
  73. package/dashboard/src/components/ui/StatusDot.jsx +51 -0
  74. package/dashboard/src/components/ui/StatusSymbol.jsx +49 -0
  75. package/dashboard/src/components/ui/TabBar.jsx +41 -0
  76. package/dashboard/src/components/ui/TextInput.jsx +42 -0
  77. package/dashboard/src/components/ui/Toast.jsx +117 -0
  78. package/dashboard/src/components/ui/Toggle.jsx +70 -0
  79. package/dashboard/src/components/ui/index.js +29 -0
  80. package/dashboard/src/hooks/useDocumentTitle.js +16 -0
  81. package/dashboard/src/hooks/useFetch.js +50 -0
  82. package/dashboard/src/hooks/useToast.jsx +43 -0
  83. package/dashboard/src/hooks/useWebSocket.js +103 -0
  84. package/dashboard/src/lib/api.js +112 -0
  85. package/dashboard/src/lib/configSchema.js +189 -0
  86. package/dashboard/src/lib/constants.js +22 -0
  87. package/dashboard/src/main.jsx +15 -0
  88. package/dashboard/src/pages/AgentsPage.jsx +191 -0
  89. package/dashboard/src/pages/ConfigPage.jsx +298 -0
  90. package/dashboard/src/pages/HooksPage.jsx +412 -0
  91. package/dashboard/src/pages/IncidentsPage.jsx +135 -0
  92. package/dashboard/src/pages/IntelPage.jsx +193 -0
  93. package/dashboard/src/pages/LiveFeed.jsx +274 -0
  94. package/dashboard/src/pages/MemoryPage.jsx +107 -0
  95. package/dashboard/src/pages/OnboardingPage.jsx +117 -0
  96. package/dashboard/src/pages/Overview.jsx +360 -0
  97. package/dashboard/src/pages/PhaseDetailView.jsx +216 -0
  98. package/dashboard/src/pages/PlanningPage.jsx +181 -0
  99. package/dashboard/src/pages/ProgressPage.jsx +249 -0
  100. package/dashboard/src/pages/ResearchPage.jsx +129 -0
  101. package/dashboard/src/pages/RoadmapPage.jsx +251 -0
  102. package/dashboard/src/pages/SessionsPage.jsx +117 -0
  103. package/dashboard/src/pages/Telemetry.jsx +166 -0
  104. package/dashboard/src/pages/planning/DecisionsTab.jsx +153 -0
  105. package/dashboard/src/pages/planning/FilesTab.jsx +420 -0
  106. package/dashboard/src/pages/planning/MilestoneDetail.jsx +319 -0
  107. package/dashboard/src/pages/planning/MilestonesTab.jsx +151 -0
  108. package/dashboard/src/pages/planning/NotesTab.jsx +251 -0
  109. package/dashboard/src/pages/planning/PhasesTab.jsx +218 -0
  110. package/dashboard/src/pages/planning/QuickTab.jsx +50 -0
  111. package/dashboard/src/pages/planning/ResearchTab.jsx +103 -0
  112. package/dashboard/src/pages/planning/TodosTab.jsx +297 -0
  113. package/dashboard/src/theme/ThemeProvider.jsx +38 -0
  114. package/dashboard/src/theme/tokens.js +17 -0
  115. package/dashboard/tests/components/ConfirmModal.test.jsx +179 -0
  116. package/dashboard/tests/components/ConnectionBanner.test.jsx +37 -0
  117. package/dashboard/tests/components/ErrorBoundary.test.jsx +59 -0
  118. package/dashboard/tests/components/LoadingSkeleton.test.jsx +46 -0
  119. package/dashboard/tests/components/ToastContainer.test.jsx +47 -0
  120. package/dashboard/tests/components/Toggle.test.jsx +61 -0
  121. package/dashboard/tests/hooks/useFetch.test.jsx +77 -0
  122. package/dashboard/tests/hooks/useToast.test.jsx +78 -0
  123. package/dashboard/tests/hooks/useWebSocket.test.jsx +128 -0
  124. package/dashboard/tests/pages/ConfigPage.test.jsx +199 -0
  125. package/dashboard/tests/pages/PlanningPage.test.jsx +119 -0
  126. package/dashboard/tests/pages/planning/FilesTab.test.jsx +198 -0
  127. package/dashboard/tests/pages/planning/NotesTab.test.jsx +178 -0
  128. package/dashboard/tests/pages/planning/TodosTab.test.jsx +188 -0
  129. package/dashboard/tests/performance.test.jsx +46 -0
  130. package/dashboard/tests/routes/config.test.js +98 -0
  131. package/dashboard/tests/routes/health.test.js +40 -0
  132. package/dashboard/tests/routes/planning.test.js +112 -0
  133. package/dashboard/tests/routes/roadmap.test.js +91 -0
  134. package/dashboard/tests/routes/status.test.js +131 -0
  135. package/dashboard/tests/server/planning-reader.test.js +153 -0
  136. package/dashboard/tests/setup.js +7 -0
  137. package/dashboard/vite.config.js +41 -0
  138. package/package.json +55 -40
  139. package/plan-build-run/bin/config-schema.json +1420 -0
  140. package/plugins/pbr/.claude-plugin/plugin.json +1 -1
  141. package/plugins/pbr/CLAUDE.md +19 -0
  142. package/plugins/pbr/UI-CONSISTENCY-GAPS.md +1 -1
  143. package/plugins/pbr/agents/advisor-researcher.md +100 -0
  144. package/plugins/pbr/agents/audit.md +205 -89
  145. package/plugins/pbr/agents/codebase-mapper.md +158 -23
  146. package/plugins/pbr/agents/debugger.md +222 -30
  147. package/plugins/pbr/agents/dev-sync.md +206 -0
  148. package/plugins/pbr/agents/executor.md +717 -39
  149. package/plugins/pbr/agents/general.md +71 -6
  150. package/plugins/pbr/agents/integration-checker.md +146 -30
  151. package/plugins/pbr/agents/intel-updater.md +332 -0
  152. package/plugins/pbr/agents/nyquist-auditor.md +253 -0
  153. package/plugins/pbr/agents/plan-checker.md +270 -61
  154. package/plugins/pbr/agents/planner.md +440 -42
  155. package/plugins/pbr/agents/researcher.md +223 -36
  156. package/plugins/pbr/agents/roadmapper.md +397 -0
  157. package/plugins/pbr/agents/synthesizer.md +170 -26
  158. package/plugins/pbr/agents/ui-checker.md +203 -0
  159. package/plugins/pbr/agents/ui-researcher.md +224 -0
  160. package/plugins/pbr/agents/verifier.md +495 -47
  161. package/plugins/pbr/commands/add-phase.md +75 -0
  162. package/plugins/pbr/commands/add-todo.md +8 -0
  163. package/plugins/pbr/commands/audit-fix.md +5 -0
  164. package/plugins/pbr/commands/audit-milestone.md +8 -0
  165. package/plugins/pbr/commands/autonomous.md +5 -0
  166. package/plugins/pbr/commands/backlog.md +6 -0
  167. package/plugins/pbr/commands/check-todos.md +8 -0
  168. package/plugins/pbr/commands/complete-milestone.md +8 -0
  169. package/plugins/pbr/commands/config.md +1 -1
  170. package/plugins/pbr/commands/discuss-phase.md +6 -0
  171. package/plugins/pbr/commands/do.md +5 -0
  172. package/plugins/pbr/commands/execute-phase.md +6 -0
  173. package/plugins/pbr/commands/fast.md +6 -0
  174. package/plugins/pbr/commands/forensics.md +6 -0
  175. package/plugins/pbr/commands/import.md +1 -1
  176. package/plugins/pbr/commands/insert-phase.md +65 -0
  177. package/plugins/pbr/commands/intel.md +5 -0
  178. package/plugins/pbr/commands/join-discord.md +11 -0
  179. package/plugins/pbr/commands/list-phase-assumptions.md +5 -0
  180. package/plugins/pbr/commands/map-codebase.md +6 -0
  181. package/plugins/pbr/commands/milestone-summary.md +6 -0
  182. package/plugins/pbr/commands/new-milestone.md +8 -0
  183. package/plugins/pbr/commands/new-project.md +6 -0
  184. package/plugins/pbr/commands/pause-work.md +5 -0
  185. package/plugins/pbr/commands/plan-milestone-gaps.md +7 -0
  186. package/plugins/pbr/commands/plan-phase.md +6 -0
  187. package/plugins/pbr/commands/plant-seed.md +6 -0
  188. package/plugins/pbr/commands/profile-user.md +5 -0
  189. package/plugins/pbr/commands/profile.md +5 -0
  190. package/plugins/pbr/commands/progress.md +6 -0
  191. package/plugins/pbr/commands/quick.md +1 -1
  192. package/plugins/pbr/commands/reapply-patches.md +47 -0
  193. package/plugins/pbr/commands/release.md +6 -0
  194. package/plugins/pbr/commands/remove-phase.md +66 -0
  195. package/plugins/pbr/commands/research-phase.md +59 -0
  196. package/plugins/pbr/commands/resume-work.md +5 -0
  197. package/plugins/pbr/commands/seed.md +6 -0
  198. package/plugins/pbr/commands/session-report.md +5 -0
  199. package/plugins/pbr/commands/set-profile.md +6 -0
  200. package/plugins/pbr/commands/settings.md +5 -0
  201. package/plugins/pbr/commands/setup.md +1 -1
  202. package/plugins/pbr/commands/ship.md +5 -0
  203. package/plugins/pbr/commands/stats.md +6 -0
  204. package/plugins/pbr/commands/test.md +5 -0
  205. package/plugins/pbr/commands/thread.md +6 -0
  206. package/plugins/pbr/commands/todo.md +1 -1
  207. package/plugins/pbr/commands/ui-phase.md +5 -0
  208. package/plugins/pbr/commands/ui-review.md +5 -0
  209. package/plugins/pbr/commands/undo.md +5 -0
  210. package/plugins/pbr/commands/update.md +37 -0
  211. package/plugins/pbr/commands/validate-phase.md +5 -0
  212. package/plugins/pbr/commands/verify-work.md +6 -0
  213. package/plugins/pbr/dashboard/package-lock.json +6 -0
  214. package/plugins/pbr/dist/architecture-guard.js +59 -0
  215. package/plugins/pbr/dist/audit-dimensions.js +556 -0
  216. package/plugins/pbr/dist/auto-continue.js +277 -0
  217. package/plugins/pbr/dist/block-skill-self-read.js +124 -0
  218. package/plugins/pbr/dist/check-agent-state-write.js +63 -0
  219. package/plugins/pbr/dist/check-config-change.js +162 -0
  220. package/plugins/pbr/dist/check-cross-plugin-sync.js +93 -0
  221. package/plugins/pbr/dist/check-dangerous-commands.js +193 -0
  222. package/plugins/pbr/dist/check-direct-state-write.js +37 -0
  223. package/plugins/pbr/dist/check-doc-sprawl.js +102 -0
  224. package/plugins/pbr/dist/check-phase-boundary.js +191 -0
  225. package/plugins/pbr/dist/check-plan-format.js +241 -0
  226. package/plugins/pbr/dist/check-read-first.js +345 -0
  227. package/plugins/pbr/dist/check-roadmap-sync.js +503 -0
  228. package/plugins/pbr/dist/check-skill-workflow.js +354 -0
  229. package/plugins/pbr/dist/check-state-sync.js +658 -0
  230. package/plugins/pbr/dist/check-subagent-output.js +452 -0
  231. package/plugins/pbr/dist/check-summary-gate.js +199 -0
  232. package/plugins/pbr/dist/context-bridge.js +425 -0
  233. package/plugins/pbr/dist/context-budget-check.js +442 -0
  234. package/plugins/pbr/dist/context-quality.js +271 -0
  235. package/plugins/pbr/dist/enforce-context-budget.js +138 -0
  236. package/plugins/pbr/dist/enforce-pbr-workflow.js +277 -0
  237. package/plugins/pbr/dist/event-handler.js +202 -0
  238. package/plugins/pbr/dist/event-logger.js +125 -0
  239. package/plugins/pbr/dist/feedback-loop.js +172 -0
  240. package/plugins/pbr/dist/graph-update.js +422 -0
  241. package/plugins/pbr/dist/hook-logger.js +114 -0
  242. package/plugins/pbr/dist/hook-server-client.js +361 -0
  243. package/plugins/pbr/dist/hook-server.js +606 -0
  244. package/plugins/pbr/dist/hooks-schema.json +87 -0
  245. package/plugins/pbr/dist/instructions-loaded.js +173 -0
  246. package/plugins/pbr/dist/intercept-plan-mode.js +81 -0
  247. package/plugins/pbr/dist/log-notification.js +131 -0
  248. package/plugins/pbr/dist/log-subagent.js +349 -0
  249. package/plugins/pbr/dist/log-tool-failure.js +140 -0
  250. package/plugins/pbr/dist/milestone-learnings.js +569 -0
  251. package/plugins/pbr/dist/pbr-tools.js +2044 -0
  252. package/plugins/pbr/dist/post-bash-triage.js +154 -0
  253. package/plugins/pbr/dist/post-compact.js +135 -0
  254. package/plugins/pbr/dist/post-hoc.js +286 -0
  255. package/plugins/pbr/dist/post-write-dispatch.js +279 -0
  256. package/plugins/pbr/dist/post-write-quality.js +208 -0
  257. package/plugins/pbr/dist/pre-bash-dispatch.js +218 -0
  258. package/plugins/pbr/dist/pre-skill-dispatch.js +114 -0
  259. package/plugins/pbr/dist/pre-task-dispatch.js +297 -0
  260. package/plugins/pbr/dist/pre-write-dispatch.js +234 -0
  261. package/plugins/pbr/dist/progress-tracker.js +198 -0
  262. package/plugins/pbr/dist/prompt-guard.js +114 -0
  263. package/plugins/pbr/dist/prompt-routing.js +209 -0
  264. package/plugins/pbr/dist/quick-status.js +179 -0
  265. package/plugins/pbr/dist/record-incident.js +37 -0
  266. package/plugins/pbr/dist/run-hook.js +144 -0
  267. package/plugins/pbr/dist/session-cleanup.js +683 -0
  268. package/plugins/pbr/dist/session-tracker.js +124 -0
  269. package/plugins/pbr/dist/status-line.js +847 -0
  270. package/plugins/pbr/dist/suggest-compact.js +315 -0
  271. package/plugins/pbr/dist/sync-context-to-claude.js +100 -0
  272. package/plugins/pbr/dist/task-completed.js +206 -0
  273. package/plugins/pbr/dist/track-context-budget.js +432 -0
  274. package/plugins/pbr/dist/track-user-gates.js +88 -0
  275. package/plugins/pbr/dist/trust-tracker.js +193 -0
  276. package/plugins/pbr/dist/validate-commit.js +271 -0
  277. package/plugins/pbr/dist/validate-skill-args.js +222 -0
  278. package/plugins/pbr/dist/validate-task.js +301 -0
  279. package/plugins/pbr/dist/worktree-create.js +144 -0
  280. package/plugins/pbr/dist/worktree-remove.js +147 -0
  281. package/plugins/pbr/hooks/hooks.json +143 -60
  282. package/plugins/pbr/references/agent-contracts.md +40 -9
  283. package/plugins/pbr/references/agent-teams.md +3 -3
  284. package/plugins/pbr/references/archive/checkpoints.md +189 -0
  285. package/plugins/pbr/references/archive/context-quality-tiers.md +45 -0
  286. package/plugins/pbr/references/archive/hook-ordering.md +89 -0
  287. package/plugins/pbr/references/archive/limitations.md +106 -0
  288. package/plugins/pbr/references/archive/pbr-rules.md +194 -0
  289. package/plugins/pbr/references/archive/pbr-tools-cli.md +415 -0
  290. package/plugins/pbr/references/archive/pretooluse-jsonl-behavior.md +58 -0
  291. package/plugins/pbr/references/archive/signal-files.md +41 -0
  292. package/plugins/pbr/references/archive/tmux-setup.md +288 -0
  293. package/plugins/pbr/references/archive/verification-matrix.md +34 -0
  294. package/plugins/pbr/references/archive/verification-patterns.md +277 -0
  295. package/plugins/pbr/references/archive/worktree-sparse-checkout.md +86 -0
  296. package/plugins/pbr/references/behavioral-contexts.md +53 -0
  297. package/plugins/pbr/references/checkpoints.md +723 -104
  298. package/plugins/pbr/references/config-reference.md +472 -10
  299. package/plugins/pbr/references/continuation-format.md +1 -0
  300. package/plugins/pbr/references/decimal-phase-calculation.md +65 -0
  301. package/plugins/pbr/references/deviation-rules.md +12 -0
  302. package/plugins/pbr/references/git-integration.md +110 -27
  303. package/plugins/pbr/references/git-planning-commit.md +35 -0
  304. package/plugins/pbr/references/model-profile-resolution.md +34 -0
  305. package/plugins/pbr/references/model-profiles.md +90 -7
  306. package/plugins/pbr/references/model-selection.md +1 -1
  307. package/plugins/pbr/references/node-repair.md +48 -0
  308. package/plugins/pbr/references/plan-authoring.md +65 -0
  309. package/plugins/pbr/references/plan-format.md +161 -10
  310. package/plugins/pbr/references/questioning.md +138 -49
  311. package/plugins/pbr/references/reading-verification.md +4 -4
  312. package/plugins/pbr/references/tdd.md +263 -0
  313. package/plugins/pbr/references/ui-brand.md +449 -0
  314. package/plugins/pbr/references/verification-overrides.md +39 -0
  315. package/plugins/pbr/references/verification-patterns.md +529 -113
  316. package/plugins/pbr/scripts/architecture-guard.js +59 -0
  317. package/plugins/pbr/scripts/audit-checks/behavioral-compliance.js +2098 -0
  318. package/plugins/pbr/scripts/audit-checks/error-analysis.js +989 -0
  319. package/plugins/pbr/scripts/audit-checks/feature-verification.js +723 -0
  320. package/plugins/pbr/scripts/audit-checks/index.js +433 -0
  321. package/plugins/pbr/scripts/audit-checks/infrastructure.js +816 -0
  322. package/plugins/pbr/scripts/audit-checks/quality-metrics.js +452 -0
  323. package/plugins/pbr/scripts/audit-checks/session-quality.js +980 -0
  324. package/plugins/pbr/scripts/audit-checks/si-agent-hook-config-checks.js +466 -0
  325. package/plugins/pbr/scripts/audit-checks/si-cross-cutting-checks.js +272 -0
  326. package/plugins/pbr/scripts/audit-checks/si-skill-checks.js +424 -0
  327. package/plugins/pbr/scripts/audit-checks/workflow-compliance.js +1211 -0
  328. package/plugins/pbr/scripts/audit-dimensions.js +556 -0
  329. package/plugins/pbr/scripts/auto-continue.js +198 -31
  330. package/plugins/pbr/scripts/block-skill-self-read.js +124 -0
  331. package/plugins/pbr/scripts/check-agent-state-write.js +63 -0
  332. package/plugins/pbr/scripts/check-config-change.js +162 -0
  333. package/plugins/pbr/scripts/check-cross-plugin-sync.js +93 -0
  334. package/plugins/pbr/scripts/check-dangerous-commands.js +18 -5
  335. package/plugins/pbr/scripts/check-direct-state-write.js +37 -0
  336. package/plugins/pbr/scripts/check-phase-boundary.js +3 -8
  337. package/plugins/pbr/scripts/check-plan-format.js +166 -277
  338. package/plugins/pbr/scripts/check-read-first.js +345 -0
  339. package/plugins/pbr/scripts/check-roadmap-sync.js +167 -10
  340. package/plugins/pbr/scripts/check-skill-workflow.js +24 -27
  341. package/plugins/pbr/scripts/check-state-sync.js +339 -215
  342. package/plugins/pbr/scripts/check-subagent-output.js +338 -276
  343. package/plugins/pbr/scripts/check-summary-gate.js +2 -1
  344. package/plugins/pbr/scripts/config-schema.json +1247 -95
  345. package/plugins/pbr/scripts/context-bridge.js +425 -0
  346. package/plugins/pbr/scripts/context-budget-check.js +169 -14
  347. package/plugins/pbr/scripts/context-quality.js +271 -0
  348. package/plugins/pbr/scripts/enforce-context-budget.js +138 -0
  349. package/plugins/pbr/scripts/enforce-pbr-workflow.js +277 -0
  350. package/plugins/pbr/scripts/event-handler.js +128 -77
  351. package/plugins/pbr/scripts/event-logger.js +58 -25
  352. package/plugins/pbr/scripts/feedback-loop.js +172 -0
  353. package/plugins/pbr/scripts/graph-update.js +422 -0
  354. package/plugins/pbr/scripts/hook-logger.js +69 -35
  355. package/plugins/pbr/scripts/hook-server-client.js +361 -0
  356. package/plugins/pbr/scripts/hook-server.js +606 -0
  357. package/plugins/pbr/scripts/hooks-schema.json +13 -5
  358. package/plugins/pbr/scripts/instructions-loaded.js +173 -0
  359. package/plugins/pbr/scripts/intent-router.cjs +147 -0
  360. package/plugins/pbr/scripts/intercept-plan-mode.js +52 -18
  361. package/plugins/pbr/scripts/lib/alternatives.js +203 -0
  362. package/plugins/pbr/scripts/lib/audit.js +65 -0
  363. package/plugins/pbr/scripts/lib/auto-cleanup.js +221 -0
  364. package/plugins/pbr/scripts/lib/auto-verify.js +103 -0
  365. package/plugins/pbr/scripts/lib/autonomy.js +91 -0
  366. package/plugins/pbr/scripts/lib/build.js +719 -0
  367. package/plugins/pbr/scripts/lib/ci-fix-loop.js +228 -0
  368. package/plugins/pbr/scripts/lib/circuit-state.js +133 -0
  369. package/plugins/pbr/scripts/lib/commands.js +483 -0
  370. package/plugins/pbr/scripts/lib/completion.js +377 -0
  371. package/plugins/pbr/scripts/lib/compound.js +216 -0
  372. package/plugins/pbr/scripts/lib/config.js +1315 -0
  373. package/plugins/pbr/scripts/lib/context.js +254 -0
  374. package/plugins/pbr/scripts/lib/contextual-help.js +207 -0
  375. package/plugins/pbr/scripts/lib/convention-detector.js +413 -0
  376. package/plugins/pbr/scripts/lib/core.js +1569 -0
  377. package/plugins/pbr/scripts/lib/dashboard-launch.js +364 -0
  378. package/plugins/pbr/scripts/lib/data-hygiene.js +179 -0
  379. package/plugins/pbr/scripts/lib/decision-extraction.js +183 -0
  380. package/plugins/pbr/scripts/lib/decisions.js +194 -0
  381. package/plugins/pbr/scripts/lib/dependency-break.js +147 -0
  382. package/plugins/pbr/scripts/lib/format-validators.js +1050 -0
  383. package/plugins/pbr/scripts/lib/frontmatter.js +302 -0
  384. package/plugins/pbr/scripts/lib/gates/advisories.js +129 -0
  385. package/plugins/pbr/scripts/lib/gates/build-dependency.js +115 -0
  386. package/plugins/pbr/scripts/lib/gates/build-executor.js +104 -0
  387. package/plugins/pbr/scripts/lib/gates/doc-existence.js +46 -0
  388. package/plugins/pbr/scripts/lib/gates/helpers.js +93 -0
  389. package/plugins/pbr/scripts/lib/gates/inline-execution.js +185 -0
  390. package/plugins/pbr/scripts/lib/gates/milestone-complete.js +136 -0
  391. package/plugins/pbr/scripts/lib/gates/milestone-summary.js +119 -0
  392. package/plugins/pbr/scripts/lib/gates/multi-phase-loader.js +147 -0
  393. package/plugins/pbr/scripts/lib/gates/plan-executor.js +36 -0
  394. package/plugins/pbr/scripts/lib/gates/plan-validation.js +114 -0
  395. package/plugins/pbr/scripts/lib/gates/quick-executor.js +76 -0
  396. package/plugins/pbr/scripts/lib/gates/review-planner.js +61 -0
  397. package/plugins/pbr/scripts/lib/gates/review-verifier.js +69 -0
  398. package/plugins/pbr/scripts/lib/gates/rich-agent-context.js +143 -0
  399. package/plugins/pbr/scripts/lib/gates/user-confirmation.js +93 -0
  400. package/plugins/pbr/scripts/lib/graph-cli.js +89 -0
  401. package/plugins/pbr/scripts/lib/graph.js +553 -0
  402. package/plugins/pbr/scripts/lib/health-checks.js +107 -0
  403. package/plugins/pbr/scripts/lib/health-phase06.js +120 -0
  404. package/plugins/pbr/scripts/lib/health.js +133 -0
  405. package/plugins/pbr/scripts/lib/help.js +151 -0
  406. package/plugins/pbr/scripts/lib/history.js +150 -0
  407. package/plugins/pbr/scripts/lib/hypothesis-runner.js +127 -0
  408. package/plugins/pbr/scripts/lib/impact-analysis.js +319 -0
  409. package/plugins/pbr/scripts/lib/incidents.js +190 -0
  410. package/plugins/pbr/scripts/lib/init.js +643 -0
  411. package/plugins/pbr/scripts/lib/insights-parser.js +320 -0
  412. package/plugins/pbr/scripts/lib/intel.js +653 -0
  413. package/plugins/pbr/scripts/lib/learnings.js +511 -0
  414. package/plugins/pbr/scripts/lib/local-llm/client.js +237 -0
  415. package/plugins/pbr/scripts/lib/local-llm/health.js +12 -0
  416. package/plugins/pbr/scripts/lib/local-llm/index.js +89 -0
  417. package/plugins/pbr/scripts/lib/local-llm/metrics.js +20 -0
  418. package/plugins/pbr/scripts/lib/local-llm/operations/classify-artifact.js +4 -0
  419. package/plugins/pbr/scripts/lib/local-llm/operations/classify-commit.js +4 -0
  420. package/plugins/pbr/scripts/lib/local-llm/operations/classify-error.js +4 -0
  421. package/plugins/pbr/scripts/lib/local-llm/operations/classify-file-intent.js +4 -0
  422. package/plugins/pbr/scripts/lib/local-llm/operations/score-source.js +72 -0
  423. package/plugins/pbr/scripts/lib/local-llm/operations/summarize-context.js +62 -0
  424. package/plugins/pbr/scripts/lib/local-llm/operations/triage-test-output.js +12 -0
  425. package/plugins/pbr/scripts/lib/local-llm/operations/validate-task.js +4 -0
  426. package/plugins/pbr/scripts/lib/local-llm/router.js +101 -0
  427. package/plugins/pbr/scripts/lib/local-llm/shadow.js +60 -0
  428. package/plugins/pbr/scripts/lib/local-llm/threshold-tuner.js +118 -0
  429. package/plugins/pbr/scripts/lib/migrate.js +298 -0
  430. package/plugins/pbr/scripts/lib/milestone.js +306 -0
  431. package/plugins/pbr/scripts/lib/negative-knowledge.js +194 -0
  432. package/plugins/pbr/scripts/lib/notification-throttle.js +141 -0
  433. package/plugins/pbr/scripts/lib/onboarding-generator.js +288 -0
  434. package/plugins/pbr/scripts/lib/parse-args.js +134 -0
  435. package/plugins/pbr/scripts/lib/pattern-routing.js +55 -0
  436. package/plugins/pbr/scripts/lib/patterns.js +272 -0
  437. package/plugins/pbr/scripts/lib/perf.js +190 -0
  438. package/plugins/pbr/scripts/lib/phase.js +1027 -0
  439. package/plugins/pbr/scripts/lib/pid-lock.js +154 -0
  440. package/plugins/pbr/scripts/lib/post-hoc.js +160 -0
  441. package/plugins/pbr/scripts/lib/pre-commit-checks.js +220 -0
  442. package/plugins/pbr/scripts/lib/pre-research.js +133 -0
  443. package/plugins/pbr/scripts/lib/preview.js +174 -0
  444. package/plugins/pbr/scripts/lib/progress-visualization.js +296 -0
  445. package/plugins/pbr/scripts/lib/quick-init.js +131 -0
  446. package/plugins/pbr/scripts/lib/reference.js +236 -0
  447. package/plugins/pbr/scripts/lib/requirements.js +153 -0
  448. package/plugins/pbr/scripts/lib/resolve-root.js +66 -0
  449. package/plugins/pbr/scripts/lib/reverse-spec.js +259 -0
  450. package/plugins/pbr/scripts/lib/roadmap.js +1113 -0
  451. package/plugins/pbr/scripts/lib/security-scan.js +200 -0
  452. package/plugins/pbr/scripts/lib/session-briefing.js +895 -0
  453. package/plugins/pbr/scripts/lib/skill-section.js +99 -0
  454. package/plugins/pbr/scripts/lib/smart-next-task.js +207 -0
  455. package/plugins/pbr/scripts/lib/snapshot-manager.js +232 -0
  456. package/plugins/pbr/scripts/lib/spec-diff.js +209 -0
  457. package/plugins/pbr/scripts/lib/spec-engine.js +189 -0
  458. package/plugins/pbr/scripts/lib/spot-check.js +642 -0
  459. package/plugins/pbr/scripts/lib/state-queue.js +171 -0
  460. package/plugins/pbr/scripts/lib/state.js +1187 -0
  461. package/plugins/pbr/scripts/lib/status-render.js +511 -0
  462. package/plugins/pbr/scripts/lib/step-verify.js +149 -0
  463. package/plugins/pbr/scripts/lib/subagent-validators.js +1059 -0
  464. package/plugins/pbr/scripts/lib/suggest-next.js +435 -0
  465. package/plugins/pbr/scripts/lib/team-composer.js +87 -0
  466. package/plugins/pbr/scripts/lib/team-coordinator.js +153 -0
  467. package/plugins/pbr/scripts/lib/tech-debt-scanner.js +116 -0
  468. package/plugins/pbr/scripts/lib/template.js +222 -0
  469. package/plugins/pbr/scripts/lib/templates.js +362 -0
  470. package/plugins/pbr/scripts/lib/test-cache.js +54 -0
  471. package/plugins/pbr/scripts/lib/test-selection.js +163 -0
  472. package/plugins/pbr/scripts/lib/todo.js +300 -0
  473. package/plugins/pbr/scripts/lib/trust-gate.js +84 -0
  474. package/plugins/pbr/scripts/lib/verify.js +1473 -0
  475. package/plugins/pbr/scripts/lib/wiring-check.js +196 -0
  476. package/plugins/pbr/scripts/log-notification.js +131 -0
  477. package/plugins/pbr/scripts/log-subagent.js +203 -18
  478. package/plugins/pbr/scripts/log-tool-failure.js +60 -8
  479. package/plugins/pbr/scripts/milestone-learnings.js +569 -0
  480. package/plugins/pbr/scripts/package.json +1 -0
  481. package/plugins/pbr/scripts/pbr-tools.js +1833 -1167
  482. package/plugins/pbr/scripts/post-bash-triage.js +154 -0
  483. package/plugins/pbr/scripts/post-compact.js +135 -0
  484. package/plugins/pbr/scripts/post-hoc.js +286 -0
  485. package/plugins/pbr/scripts/post-write-dispatch.js +237 -31
  486. package/plugins/pbr/scripts/post-write-quality.js +4 -3
  487. package/plugins/pbr/scripts/pre-bash-dispatch.js +155 -23
  488. package/plugins/pbr/scripts/pre-skill-dispatch.js +114 -0
  489. package/plugins/pbr/scripts/pre-task-dispatch.js +297 -0
  490. package/plugins/pbr/scripts/pre-write-dispatch.js +171 -47
  491. package/plugins/pbr/scripts/progress-tracker.js +144 -307
  492. package/plugins/pbr/scripts/prompt-guard.js +114 -0
  493. package/plugins/pbr/scripts/prompt-routing.js +209 -0
  494. package/plugins/pbr/scripts/quick-status.js +179 -0
  495. package/plugins/pbr/scripts/record-incident.js +37 -0
  496. package/plugins/pbr/scripts/risk-classifier.cjs +123 -0
  497. package/plugins/pbr/scripts/run-hook.js +62 -10
  498. package/plugins/pbr/scripts/session-cleanup.js +458 -29
  499. package/plugins/pbr/scripts/session-tracker.js +124 -0
  500. package/plugins/pbr/scripts/status-line.js +591 -32
  501. package/plugins/pbr/scripts/suggest-compact.js +203 -7
  502. package/plugins/pbr/scripts/sync-context-to-claude.js +100 -0
  503. package/plugins/pbr/scripts/task-completed.js +165 -4
  504. package/plugins/pbr/scripts/test/config.test.js +126 -0
  505. package/plugins/pbr/scripts/test/cross-platform.test.js +131 -0
  506. package/plugins/pbr/scripts/test/fixtures/config.json +20 -0
  507. package/plugins/pbr/scripts/test/fixtures/plan.md +54 -0
  508. package/plugins/pbr/scripts/test/fixtures/project.md +30 -0
  509. package/plugins/pbr/scripts/test/fixtures/roadmap.md +55 -0
  510. package/plugins/pbr/scripts/test/fixtures/state.md +60 -0
  511. package/plugins/pbr/scripts/test/fixtures/summary.md +35 -0
  512. package/plugins/pbr/scripts/test/fixtures.test.js +184 -0
  513. package/plugins/pbr/scripts/test/phase.test.js +142 -0
  514. package/plugins/pbr/scripts/test/roadmap.test.js +96 -0
  515. package/plugins/pbr/scripts/test/state.test.js +163 -0
  516. package/plugins/pbr/scripts/track-context-budget.js +368 -99
  517. package/plugins/pbr/scripts/track-user-gates.js +88 -0
  518. package/plugins/pbr/scripts/trust-tracker.js +193 -0
  519. package/plugins/pbr/scripts/validate-commit.js +97 -26
  520. package/plugins/pbr/scripts/validate-skill-args.js +87 -15
  521. package/plugins/pbr/scripts/validate-task.js +112 -626
  522. package/plugins/pbr/scripts/worktree-create.js +144 -0
  523. package/plugins/pbr/scripts/worktree-remove.js +147 -0
  524. package/plugins/pbr/skills/audit/SKILL.md +195 -24
  525. package/plugins/pbr/skills/audit-fix/SKILL.md +326 -0
  526. package/plugins/pbr/skills/autonomous/SKILL.md +545 -0
  527. package/plugins/pbr/skills/backlog/SKILL.md +56 -0
  528. package/plugins/pbr/skills/begin/SKILL.md +507 -153
  529. package/plugins/pbr/skills/begin/templates/STATE.md.tmpl +1 -2
  530. package/plugins/pbr/skills/begin/templates/config.json.tmpl +415 -36
  531. package/plugins/pbr/skills/begin/templates/researcher-prompt.md.tmpl +28 -0
  532. package/plugins/pbr/skills/begin/templates/roadmap-prompt.md.tmpl +28 -3
  533. package/plugins/pbr/skills/begin/templates/synthesis-prompt.md.tmpl +33 -5
  534. package/plugins/pbr/skills/build/SKILL.md +1040 -354
  535. package/plugins/pbr/skills/build/templates/continuation-prompt.md.tmpl +26 -0
  536. package/plugins/pbr/skills/build/templates/executor-prompt.md.tmpl +77 -0
  537. package/plugins/pbr/skills/build/templates/inline-verifier-prompt.md.tmpl +33 -0
  538. package/plugins/pbr/skills/config/SKILL.md +111 -9
  539. package/plugins/pbr/skills/continue/SKILL.md +113 -33
  540. package/plugins/pbr/skills/dashboard/SKILL.md +21 -9
  541. package/plugins/pbr/skills/debug/SKILL.md +70 -12
  542. package/plugins/pbr/skills/debug/templates/continuation-prompt.md.tmpl +12 -1
  543. package/plugins/pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +12 -5
  544. package/plugins/pbr/skills/discuss/SKILL.md +206 -25
  545. package/plugins/pbr/skills/discuss/templates/CONTEXT.md.tmpl +21 -1
  546. package/plugins/pbr/skills/do/SKILL.md +119 -24
  547. package/plugins/pbr/skills/explore/SKILL.md +95 -20
  548. package/plugins/pbr/skills/fast/SKILL.md +94 -0
  549. package/plugins/pbr/skills/forensics/SKILL.md +144 -0
  550. package/plugins/pbr/skills/health/SKILL.md +44 -117
  551. package/plugins/pbr/skills/help/SKILL.md +83 -101
  552. package/plugins/pbr/skills/import/SKILL.md +332 -13
  553. package/plugins/pbr/skills/intel/SKILL.md +131 -0
  554. package/plugins/pbr/skills/list-phase-assumptions/SKILL.md +231 -0
  555. package/plugins/pbr/skills/milestone/SKILL.md +421 -263
  556. package/plugins/pbr/skills/milestone/templates/audit-output.md.tmpl +76 -0
  557. package/plugins/pbr/skills/milestone/templates/complete-output.md.tmpl +32 -0
  558. package/plugins/pbr/skills/milestone/templates/edge-cases.md +54 -0
  559. package/plugins/pbr/skills/milestone/templates/gaps-output.md.tmpl +25 -0
  560. package/plugins/pbr/skills/milestone/templates/integration-checker-prompt.md.tmpl +25 -0
  561. package/plugins/pbr/skills/milestone/templates/new-output.md.tmpl +29 -0
  562. package/plugins/pbr/skills/milestone-summary/SKILL.md +86 -0
  563. package/plugins/pbr/skills/note/SKILL.md +20 -4
  564. package/plugins/pbr/skills/pause/SKILL.md +53 -14
  565. package/plugins/pbr/skills/pause/templates/continue-here.md.tmpl +33 -52
  566. package/plugins/pbr/skills/plan/SKILL.md +526 -280
  567. package/plugins/pbr/skills/plan/templates/checker-prompt.md.tmpl +5 -2
  568. package/plugins/pbr/skills/plan/templates/completion-output.md.tmpl +27 -0
  569. package/plugins/pbr/skills/plan/templates/planner-prompt.md.tmpl +27 -1
  570. package/plugins/pbr/skills/plan/templates/revision-prompt.md.tmpl +21 -5
  571. package/plugins/pbr/skills/profile/SKILL.md +185 -0
  572. package/plugins/pbr/skills/profile-user/SKILL.md +226 -0
  573. package/plugins/pbr/skills/quick/SKILL.md +434 -100
  574. package/plugins/pbr/skills/release/SKILL.md +206 -0
  575. package/plugins/pbr/skills/resume/SKILL.md +169 -46
  576. package/plugins/pbr/skills/review/SKILL.md +217 -164
  577. package/plugins/pbr/skills/review/templates/verifier-prompt.md.tmpl +7 -0
  578. package/plugins/pbr/skills/scan/SKILL.md +151 -106
  579. package/plugins/pbr/skills/scan/templates/mapper-prompt.md.tmpl +5 -56
  580. package/plugins/pbr/skills/seed/SKILL.md +87 -0
  581. package/plugins/pbr/skills/session-report/SKILL.md +130 -0
  582. package/plugins/pbr/skills/setup/SKILL.md +149 -202
  583. package/plugins/pbr/skills/shared/agent-context-enrichment.md +21 -0
  584. package/plugins/pbr/skills/shared/agent-type-resolution.md +32 -0
  585. package/plugins/pbr/skills/shared/commit-planning-docs.md +8 -0
  586. package/plugins/pbr/skills/shared/context-budget.md +66 -1
  587. package/plugins/pbr/skills/shared/context-loader-task.md +18 -11
  588. package/plugins/pbr/skills/shared/digest-select.md +2 -2
  589. package/plugins/pbr/skills/shared/domain-probes.md +1 -1
  590. package/plugins/pbr/skills/shared/error-reporting.md +38 -60
  591. package/plugins/pbr/skills/shared/gate-prompts.md +4 -2
  592. package/plugins/pbr/skills/shared/memory-capture.md +48 -0
  593. package/plugins/pbr/skills/shared/phase-argument-parsing.md +4 -4
  594. package/plugins/pbr/skills/shared/revision-loop.md +24 -6
  595. package/plugins/pbr/skills/shared/state-update.md +47 -54
  596. package/plugins/pbr/skills/shared/universal-anti-patterns.md +27 -4
  597. package/plugins/pbr/skills/ship/SKILL.md +155 -0
  598. package/plugins/pbr/skills/stats/SKILL.md +80 -0
  599. package/plugins/pbr/skills/status/SKILL.md +184 -119
  600. package/plugins/pbr/skills/test/SKILL.md +254 -0
  601. package/plugins/pbr/skills/thread/SKILL.md +73 -0
  602. package/plugins/pbr/skills/todo/SKILL.md +28 -72
  603. package/plugins/pbr/skills/ui-phase/SKILL.md +180 -0
  604. package/plugins/pbr/skills/ui-review/SKILL.md +206 -0
  605. package/plugins/pbr/skills/undo/SKILL.md +221 -0
  606. package/plugins/pbr/skills/validate-phase/SKILL.md +362 -0
  607. package/plugins/pbr/templates/CONTEXT.md.tmpl +45 -20
  608. package/plugins/pbr/templates/DISCOVERY.md.tmpl +29 -0
  609. package/plugins/pbr/templates/DISCUSSION-LOG.md.tmpl +49 -0
  610. package/plugins/pbr/templates/HANDOFF.json.tmpl +30 -0
  611. package/plugins/pbr/templates/INTEGRATION-REPORT.md.tmpl +18 -2
  612. package/plugins/pbr/templates/MILESTONE-AUDIT.md.tmpl +44 -0
  613. package/plugins/pbr/templates/PROJECT.md.tmpl +126 -0
  614. package/plugins/pbr/templates/REQUIREMENTS.md.tmpl +96 -0
  615. package/plugins/pbr/templates/RETROSPECTIVE.md.tmpl +43 -0
  616. package/plugins/pbr/templates/ROADMAP.md.tmpl +108 -14
  617. package/plugins/pbr/templates/SUMMARY-complex.md.tmpl +133 -0
  618. package/plugins/pbr/templates/SUMMARY-minimal.md.tmpl +55 -0
  619. package/plugins/pbr/templates/SUMMARY.md.tmpl +21 -0
  620. package/plugins/pbr/templates/UAT.md.tmpl +94 -0
  621. package/plugins/pbr/templates/UI-SPEC.md.tmpl +144 -0
  622. package/plugins/pbr/templates/VALIDATION.md.tmpl +94 -0
  623. package/plugins/pbr/templates/VERIFICATION-DETAIL.md.tmpl +49 -13
  624. package/plugins/pbr/templates/project-CONTEXT.md.tmpl +59 -0
  625. package/plugins/pbr/templates/research-outputs/ARCHITECTURE.md.tmpl +91 -0
  626. package/plugins/pbr/templates/research-outputs/FEATURES.md.tmpl +64 -0
  627. package/plugins/pbr/templates/research-outputs/PITFALLS.md.tmpl +50 -0
  628. package/plugins/pbr/templates/research-outputs/STACK.md.tmpl +63 -0
  629. package/plugins/pbr/templates/research-outputs/SUMMARY.md.tmpl +98 -0
  630. package/scripts/build-hooks.js +61 -0
  631. package/scripts/check-ci.js +100 -0
  632. package/scripts/clean-changelog.js +364 -0
  633. package/scripts/generate-derivatives.js +581 -0
  634. package/scripts/posttest.js +93 -0
  635. package/scripts/release.js +262 -0
  636. package/scripts/run-tests.cjs +29 -0
  637. package/scripts/test-wrapper.js +43 -0
  638. package/dashboard/bin/cli.js +0 -25
  639. package/dashboard/public/css/layout.css +0 -636
  640. package/dashboard/public/css/status-colors.css +0 -98
  641. package/dashboard/public/css/tokens.css +0 -59
  642. package/dashboard/public/js/htmx-title.js +0 -5
  643. package/dashboard/public/js/sidebar-toggle.js +0 -34
  644. package/dashboard/public/js/sse-client.js +0 -100
  645. package/dashboard/public/js/theme-toggle.js +0 -46
  646. package/dashboard/src/app.js +0 -91
  647. package/dashboard/src/middleware/current-phase.js +0 -24
  648. package/dashboard/src/middleware/errorHandler.js +0 -52
  649. package/dashboard/src/middleware/notFoundHandler.js +0 -9
  650. package/dashboard/src/repositories/planning.repository.js +0 -130
  651. package/dashboard/src/routes/events.routes.js +0 -45
  652. package/dashboard/src/routes/index.routes.js +0 -35
  653. package/dashboard/src/routes/pages.routes.js +0 -426
  654. package/dashboard/src/server.js +0 -42
  655. package/dashboard/src/services/analytics.service.js +0 -141
  656. package/dashboard/src/services/dashboard.service.js +0 -309
  657. package/dashboard/src/services/milestone.service.js +0 -222
  658. package/dashboard/src/services/notes.service.js +0 -50
  659. package/dashboard/src/services/phase.service.js +0 -232
  660. package/dashboard/src/services/project.service.js +0 -57
  661. package/dashboard/src/services/roadmap.service.js +0 -244
  662. package/dashboard/src/services/sse.service.js +0 -58
  663. package/dashboard/src/services/todo.service.js +0 -263
  664. package/dashboard/src/services/watcher.service.js +0 -48
  665. package/dashboard/src/utils/cache.js +0 -55
  666. package/dashboard/src/views/analytics.ejs +0 -5
  667. package/dashboard/src/views/coming-soon.ejs +0 -11
  668. package/dashboard/src/views/dependencies.ejs +0 -5
  669. package/dashboard/src/views/error.ejs +0 -20
  670. package/dashboard/src/views/index.ejs +0 -5
  671. package/dashboard/src/views/milestone-detail.ejs +0 -5
  672. package/dashboard/src/views/milestones.ejs +0 -5
  673. package/dashboard/src/views/notes.ejs +0 -5
  674. package/dashboard/src/views/partials/analytics-content.ejs +0 -90
  675. package/dashboard/src/views/partials/breadcrumbs.ejs +0 -14
  676. package/dashboard/src/views/partials/dashboard-content.ejs +0 -84
  677. package/dashboard/src/views/partials/dependencies-content.ejs +0 -48
  678. package/dashboard/src/views/partials/empty-state.ejs +0 -7
  679. package/dashboard/src/views/partials/footer.ejs +0 -3
  680. package/dashboard/src/views/partials/head.ejs +0 -30
  681. package/dashboard/src/views/partials/header.ejs +0 -21
  682. package/dashboard/src/views/partials/layout-bottom.ejs +0 -6
  683. package/dashboard/src/views/partials/layout-top.ejs +0 -15
  684. package/dashboard/src/views/partials/milestone-detail-content.ejs +0 -20
  685. package/dashboard/src/views/partials/milestones-content.ejs +0 -88
  686. package/dashboard/src/views/partials/notes-content.ejs +0 -23
  687. package/dashboard/src/views/partials/phase-content.ejs +0 -193
  688. package/dashboard/src/views/partials/phase-doc-content.ejs +0 -38
  689. package/dashboard/src/views/partials/phases-content.ejs +0 -124
  690. package/dashboard/src/views/partials/roadmap-content.ejs +0 -155
  691. package/dashboard/src/views/partials/sidebar.ejs +0 -99
  692. package/dashboard/src/views/partials/todo-create-content.ejs +0 -54
  693. package/dashboard/src/views/partials/todo-detail-content.ejs +0 -42
  694. package/dashboard/src/views/partials/todos-content.ejs +0 -94
  695. package/dashboard/src/views/phase-detail.ejs +0 -5
  696. package/dashboard/src/views/phase-doc.ejs +0 -5
  697. package/dashboard/src/views/phases.ejs +0 -5
  698. package/dashboard/src/views/roadmap.ejs +0 -5
  699. package/dashboard/src/views/todo-create.ejs +0 -5
  700. package/dashboard/src/views/todo-detail.ejs +0 -5
  701. package/dashboard/src/views/todos.ejs +0 -5
  702. package/plugins/copilot-pbr/CHANGELOG.md +0 -19
  703. package/plugins/copilot-pbr/README.md +0 -139
  704. package/plugins/copilot-pbr/agents/audit.agent.md +0 -113
  705. package/plugins/copilot-pbr/agents/codebase-mapper.agent.md +0 -151
  706. package/plugins/copilot-pbr/agents/debugger.agent.md +0 -172
  707. package/plugins/copilot-pbr/agents/executor.agent.md +0 -267
  708. package/plugins/copilot-pbr/agents/general.agent.md +0 -88
  709. package/plugins/copilot-pbr/agents/integration-checker.agent.md +0 -119
  710. package/plugins/copilot-pbr/agents/plan-checker.agent.md +0 -199
  711. package/plugins/copilot-pbr/agents/planner.agent.md +0 -238
  712. package/plugins/copilot-pbr/agents/researcher.agent.md +0 -186
  713. package/plugins/copilot-pbr/agents/synthesizer.agent.md +0 -126
  714. package/plugins/copilot-pbr/agents/verifier.agent.md +0 -228
  715. package/plugins/copilot-pbr/hooks/hooks.json +0 -156
  716. package/plugins/copilot-pbr/plugin.json +0 -30
  717. package/plugins/copilot-pbr/references/agent-anti-patterns.md +0 -25
  718. package/plugins/copilot-pbr/references/agent-contracts.md +0 -297
  719. package/plugins/copilot-pbr/references/agent-interactions.md +0 -135
  720. package/plugins/copilot-pbr/references/agent-teams.md +0 -55
  721. package/plugins/copilot-pbr/references/checkpoints.md +0 -158
  722. package/plugins/copilot-pbr/references/common-bug-patterns.md +0 -14
  723. package/plugins/copilot-pbr/references/config-reference.md +0 -442
  724. package/plugins/copilot-pbr/references/continuation-format.md +0 -213
  725. package/plugins/copilot-pbr/references/deviation-rules.md +0 -113
  726. package/plugins/copilot-pbr/references/git-integration.md +0 -227
  727. package/plugins/copilot-pbr/references/integration-patterns.md +0 -118
  728. package/plugins/copilot-pbr/references/model-profiles.md +0 -100
  729. package/plugins/copilot-pbr/references/model-selection.md +0 -32
  730. package/plugins/copilot-pbr/references/pbr-rules.md +0 -195
  731. package/plugins/copilot-pbr/references/pbr-tools-cli.md +0 -285
  732. package/plugins/copilot-pbr/references/plan-authoring.md +0 -182
  733. package/plugins/copilot-pbr/references/plan-format.md +0 -288
  734. package/plugins/copilot-pbr/references/planning-config.md +0 -214
  735. package/plugins/copilot-pbr/references/questioning.md +0 -215
  736. package/plugins/copilot-pbr/references/reading-verification.md +0 -128
  737. package/plugins/copilot-pbr/references/stub-patterns.md +0 -161
  738. package/plugins/copilot-pbr/references/subagent-coordination.md +0 -120
  739. package/plugins/copilot-pbr/references/ui-formatting.md +0 -444
  740. package/plugins/copilot-pbr/references/verification-patterns.md +0 -199
  741. package/plugins/copilot-pbr/references/wave-execution.md +0 -96
  742. package/plugins/copilot-pbr/rules/pbr-workflow.mdc +0 -48
  743. package/plugins/copilot-pbr/setup.ps1 +0 -93
  744. package/plugins/copilot-pbr/setup.sh +0 -93
  745. package/plugins/copilot-pbr/skills/audit/SKILL.md +0 -330
  746. package/plugins/copilot-pbr/skills/begin/SKILL.md +0 -589
  747. package/plugins/copilot-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  748. package/plugins/copilot-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  749. package/plugins/copilot-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  750. package/plugins/copilot-pbr/skills/begin/templates/config.json.tmpl +0 -64
  751. package/plugins/copilot-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  752. package/plugins/copilot-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  753. package/plugins/copilot-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  754. package/plugins/copilot-pbr/skills/build/SKILL.md +0 -960
  755. package/plugins/copilot-pbr/skills/config/SKILL.md +0 -250
  756. package/plugins/copilot-pbr/skills/continue/SKILL.md +0 -159
  757. package/plugins/copilot-pbr/skills/dashboard/SKILL.md +0 -43
  758. package/plugins/copilot-pbr/skills/debug/SKILL.md +0 -508
  759. package/plugins/copilot-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  760. package/plugins/copilot-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  761. package/plugins/copilot-pbr/skills/discuss/SKILL.md +0 -353
  762. package/plugins/copilot-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  763. package/plugins/copilot-pbr/skills/discuss/templates/decision-categories.md +0 -10
  764. package/plugins/copilot-pbr/skills/do/SKILL.md +0 -66
  765. package/plugins/copilot-pbr/skills/explore/SKILL.md +0 -373
  766. package/plugins/copilot-pbr/skills/health/SKILL.md +0 -274
  767. package/plugins/copilot-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  768. package/plugins/copilot-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  769. package/plugins/copilot-pbr/skills/help/SKILL.md +0 -170
  770. package/plugins/copilot-pbr/skills/import/SKILL.md +0 -502
  771. package/plugins/copilot-pbr/skills/milestone/SKILL.md +0 -745
  772. package/plugins/copilot-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  773. package/plugins/copilot-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  774. package/plugins/copilot-pbr/skills/note/SKILL.md +0 -213
  775. package/plugins/copilot-pbr/skills/pause/SKILL.md +0 -247
  776. package/plugins/copilot-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  777. package/plugins/copilot-pbr/skills/plan/SKILL.md +0 -662
  778. package/plugins/copilot-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  779. package/plugins/copilot-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  780. package/plugins/copilot-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  781. package/plugins/copilot-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  782. package/plugins/copilot-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  783. package/plugins/copilot-pbr/skills/quick/SKILL.md +0 -376
  784. package/plugins/copilot-pbr/skills/resume/SKILL.md +0 -399
  785. package/plugins/copilot-pbr/skills/review/SKILL.md +0 -653
  786. package/plugins/copilot-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  787. package/plugins/copilot-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  788. package/plugins/copilot-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  789. package/plugins/copilot-pbr/skills/scan/SKILL.md +0 -299
  790. package/plugins/copilot-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  791. package/plugins/copilot-pbr/skills/setup/SKILL.md +0 -296
  792. package/plugins/copilot-pbr/skills/shared/commit-planning-docs.md +0 -36
  793. package/plugins/copilot-pbr/skills/shared/config-loading.md +0 -103
  794. package/plugins/copilot-pbr/skills/shared/context-budget.md +0 -41
  795. package/plugins/copilot-pbr/skills/shared/context-loader-task.md +0 -87
  796. package/plugins/copilot-pbr/skills/shared/digest-select.md +0 -80
  797. package/plugins/copilot-pbr/skills/shared/domain-probes.md +0 -126
  798. package/plugins/copilot-pbr/skills/shared/error-reporting.md +0 -81
  799. package/plugins/copilot-pbr/skills/shared/gate-prompts.md +0 -389
  800. package/plugins/copilot-pbr/skills/shared/phase-argument-parsing.md +0 -46
  801. package/plugins/copilot-pbr/skills/shared/progress-display.md +0 -53
  802. package/plugins/copilot-pbr/skills/shared/revision-loop.md +0 -82
  803. package/plugins/copilot-pbr/skills/shared/state-loading.md +0 -63
  804. package/plugins/copilot-pbr/skills/shared/state-update.md +0 -162
  805. package/plugins/copilot-pbr/skills/shared/universal-anti-patterns.md +0 -38
  806. package/plugins/copilot-pbr/skills/status/SKILL.md +0 -362
  807. package/plugins/copilot-pbr/skills/statusline/SKILL.md +0 -149
  808. package/plugins/copilot-pbr/skills/todo/SKILL.md +0 -279
  809. package/plugins/copilot-pbr/templates/CONTEXT.md.tmpl +0 -53
  810. package/plugins/copilot-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  811. package/plugins/copilot-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  812. package/plugins/copilot-pbr/templates/ROADMAP.md.tmpl +0 -41
  813. package/plugins/copilot-pbr/templates/SUMMARY.md.tmpl +0 -82
  814. package/plugins/copilot-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  815. package/plugins/copilot-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  816. package/plugins/copilot-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  817. package/plugins/copilot-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  818. package/plugins/copilot-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  819. package/plugins/copilot-pbr/templates/codebase/STACK.md.tmpl +0 -78
  820. package/plugins/copilot-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  821. package/plugins/copilot-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  822. package/plugins/copilot-pbr/templates/continue-here.md.tmpl +0 -74
  823. package/plugins/copilot-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  824. package/plugins/copilot-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  825. package/plugins/copilot-pbr/templates/research/STACK.md.tmpl +0 -71
  826. package/plugins/copilot-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  827. package/plugins/copilot-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  828. package/plugins/copilot-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  829. package/plugins/copilot-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  830. package/plugins/cursor-pbr/.cursor-plugin/plugin.json +0 -32
  831. package/plugins/cursor-pbr/CHANGELOG.md +0 -15
  832. package/plugins/cursor-pbr/README.md +0 -123
  833. package/plugins/cursor-pbr/agents/audit.md +0 -178
  834. package/plugins/cursor-pbr/agents/codebase-mapper.md +0 -150
  835. package/plugins/cursor-pbr/agents/debugger.md +0 -171
  836. package/plugins/cursor-pbr/agents/executor.md +0 -266
  837. package/plugins/cursor-pbr/agents/general.md +0 -87
  838. package/plugins/cursor-pbr/agents/integration-checker.md +0 -118
  839. package/plugins/cursor-pbr/agents/plan-checker.md +0 -198
  840. package/plugins/cursor-pbr/agents/planner.md +0 -237
  841. package/plugins/cursor-pbr/agents/researcher.md +0 -185
  842. package/plugins/cursor-pbr/agents/synthesizer.md +0 -125
  843. package/plugins/cursor-pbr/agents/verifier.md +0 -227
  844. package/plugins/cursor-pbr/assets/.gitkeep +0 -0
  845. package/plugins/cursor-pbr/assets/logo.svg +0 -21
  846. package/plugins/cursor-pbr/hooks/hooks.json +0 -213
  847. package/plugins/cursor-pbr/references/agent-anti-patterns.md +0 -25
  848. package/plugins/cursor-pbr/references/agent-contracts.md +0 -297
  849. package/plugins/cursor-pbr/references/agent-interactions.md +0 -135
  850. package/plugins/cursor-pbr/references/agent-teams.md +0 -55
  851. package/plugins/cursor-pbr/references/checkpoints.md +0 -158
  852. package/plugins/cursor-pbr/references/common-bug-patterns.md +0 -14
  853. package/plugins/cursor-pbr/references/config-reference.md +0 -442
  854. package/plugins/cursor-pbr/references/continuation-format.md +0 -213
  855. package/plugins/cursor-pbr/references/deviation-rules.md +0 -113
  856. package/plugins/cursor-pbr/references/git-integration.md +0 -227
  857. package/plugins/cursor-pbr/references/integration-patterns.md +0 -118
  858. package/plugins/cursor-pbr/references/model-profiles.md +0 -100
  859. package/plugins/cursor-pbr/references/model-selection.md +0 -32
  860. package/plugins/cursor-pbr/references/pbr-rules.md +0 -195
  861. package/plugins/cursor-pbr/references/pbr-tools-cli.md +0 -285
  862. package/plugins/cursor-pbr/references/plan-authoring.md +0 -182
  863. package/plugins/cursor-pbr/references/plan-format.md +0 -288
  864. package/plugins/cursor-pbr/references/planning-config.md +0 -214
  865. package/plugins/cursor-pbr/references/questioning.md +0 -215
  866. package/plugins/cursor-pbr/references/reading-verification.md +0 -128
  867. package/plugins/cursor-pbr/references/stub-patterns.md +0 -161
  868. package/plugins/cursor-pbr/references/subagent-coordination.md +0 -120
  869. package/plugins/cursor-pbr/references/ui-formatting.md +0 -444
  870. package/plugins/cursor-pbr/references/verification-patterns.md +0 -199
  871. package/plugins/cursor-pbr/references/wave-execution.md +0 -96
  872. package/plugins/cursor-pbr/rules/pbr-workflow.mdc +0 -48
  873. package/plugins/cursor-pbr/setup.ps1 +0 -78
  874. package/plugins/cursor-pbr/setup.sh +0 -83
  875. package/plugins/cursor-pbr/skills/audit/SKILL.md +0 -331
  876. package/plugins/cursor-pbr/skills/begin/SKILL.md +0 -589
  877. package/plugins/cursor-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
  878. package/plugins/cursor-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
  879. package/plugins/cursor-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
  880. package/plugins/cursor-pbr/skills/begin/templates/config.json.tmpl +0 -64
  881. package/plugins/cursor-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  882. package/plugins/cursor-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  883. package/plugins/cursor-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  884. package/plugins/cursor-pbr/skills/build/SKILL.md +0 -961
  885. package/plugins/cursor-pbr/skills/config/SKILL.md +0 -252
  886. package/plugins/cursor-pbr/skills/continue/SKILL.md +0 -159
  887. package/plugins/cursor-pbr/skills/dashboard/SKILL.md +0 -44
  888. package/plugins/cursor-pbr/skills/debug/SKILL.md +0 -512
  889. package/plugins/cursor-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  890. package/plugins/cursor-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  891. package/plugins/cursor-pbr/skills/discuss/SKILL.md +0 -354
  892. package/plugins/cursor-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
  893. package/plugins/cursor-pbr/skills/discuss/templates/decision-categories.md +0 -10
  894. package/plugins/cursor-pbr/skills/do/SKILL.md +0 -67
  895. package/plugins/cursor-pbr/skills/explore/SKILL.md +0 -376
  896. package/plugins/cursor-pbr/skills/health/SKILL.md +0 -274
  897. package/plugins/cursor-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
  898. package/plugins/cursor-pbr/skills/health/templates/output-format.md.tmpl +0 -64
  899. package/plugins/cursor-pbr/skills/help/SKILL.md +0 -170
  900. package/plugins/cursor-pbr/skills/import/SKILL.md +0 -505
  901. package/plugins/cursor-pbr/skills/milestone/SKILL.md +0 -746
  902. package/plugins/cursor-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
  903. package/plugins/cursor-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
  904. package/plugins/cursor-pbr/skills/note/SKILL.md +0 -214
  905. package/plugins/cursor-pbr/skills/pause/SKILL.md +0 -248
  906. package/plugins/cursor-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
  907. package/plugins/cursor-pbr/skills/plan/SKILL.md +0 -663
  908. package/plugins/cursor-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
  909. package/plugins/cursor-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
  910. package/plugins/cursor-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
  911. package/plugins/cursor-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
  912. package/plugins/cursor-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
  913. package/plugins/cursor-pbr/skills/quick/SKILL.md +0 -376
  914. package/plugins/cursor-pbr/skills/resume/SKILL.md +0 -399
  915. package/plugins/cursor-pbr/skills/review/SKILL.md +0 -654
  916. package/plugins/cursor-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
  917. package/plugins/cursor-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
  918. package/plugins/cursor-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
  919. package/plugins/cursor-pbr/skills/scan/SKILL.md +0 -300
  920. package/plugins/cursor-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
  921. package/plugins/cursor-pbr/skills/setup/SKILL.md +0 -296
  922. package/plugins/cursor-pbr/skills/shared/commit-planning-docs.md +0 -36
  923. package/plugins/cursor-pbr/skills/shared/config-loading.md +0 -103
  924. package/plugins/cursor-pbr/skills/shared/context-budget.md +0 -41
  925. package/plugins/cursor-pbr/skills/shared/context-loader-task.md +0 -87
  926. package/plugins/cursor-pbr/skills/shared/digest-select.md +0 -80
  927. package/plugins/cursor-pbr/skills/shared/domain-probes.md +0 -126
  928. package/plugins/cursor-pbr/skills/shared/error-reporting.md +0 -81
  929. package/plugins/cursor-pbr/skills/shared/gate-prompts.md +0 -389
  930. package/plugins/cursor-pbr/skills/shared/phase-argument-parsing.md +0 -46
  931. package/plugins/cursor-pbr/skills/shared/progress-display.md +0 -53
  932. package/plugins/cursor-pbr/skills/shared/revision-loop.md +0 -82
  933. package/plugins/cursor-pbr/skills/shared/state-loading.md +0 -63
  934. package/plugins/cursor-pbr/skills/shared/state-update.md +0 -162
  935. package/plugins/cursor-pbr/skills/shared/universal-anti-patterns.md +0 -38
  936. package/plugins/cursor-pbr/skills/status/SKILL.md +0 -362
  937. package/plugins/cursor-pbr/skills/statusline/SKILL.md +0 -150
  938. package/plugins/cursor-pbr/skills/todo/SKILL.md +0 -280
  939. package/plugins/cursor-pbr/templates/CONTEXT.md.tmpl +0 -53
  940. package/plugins/cursor-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
  941. package/plugins/cursor-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  942. package/plugins/cursor-pbr/templates/ROADMAP.md.tmpl +0 -41
  943. package/plugins/cursor-pbr/templates/SUMMARY.md.tmpl +0 -82
  944. package/plugins/cursor-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
  945. package/plugins/cursor-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
  946. package/plugins/cursor-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
  947. package/plugins/cursor-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
  948. package/plugins/cursor-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
  949. package/plugins/cursor-pbr/templates/codebase/STACK.md.tmpl +0 -78
  950. package/plugins/cursor-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
  951. package/plugins/cursor-pbr/templates/codebase/TESTING.md.tmpl +0 -107
  952. package/plugins/cursor-pbr/templates/continue-here.md.tmpl +0 -74
  953. package/plugins/cursor-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
  954. package/plugins/cursor-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  955. package/plugins/cursor-pbr/templates/research/STACK.md.tmpl +0 -71
  956. package/plugins/cursor-pbr/templates/research/SUMMARY.md.tmpl +0 -112
  957. package/plugins/cursor-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  958. package/plugins/cursor-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  959. package/plugins/cursor-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  960. package/plugins/pbr/references/agent-interactions.md +0 -134
  961. package/plugins/pbr/references/pbr-rules.md +0 -194
  962. package/plugins/pbr/references/pbr-tools-cli.md +0 -285
  963. package/plugins/pbr/references/planning-config.md +0 -213
  964. package/plugins/pbr/references/subagent-coordination.md +0 -119
  965. package/plugins/pbr/references/ui-formatting.md +0 -444
  966. package/plugins/pbr/scripts/validate-plugin-structure.js +0 -183
  967. package/plugins/pbr/skills/milestone/templates/audit-report.md.tmpl +0 -48
  968. package/plugins/pbr/skills/shared/progress-display.md +0 -53
  969. package/plugins/pbr/skills/shared/state-loading.md +0 -62
  970. package/plugins/pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -97
  971. package/plugins/pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  972. package/plugins/pbr/templates/research/STACK.md.tmpl +0 -71
  973. package/plugins/pbr/templates/research/SUMMARY.md.tmpl +0 -112
  974. package/plugins/pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  975. package/plugins/pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  976. package/plugins/pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  977. /package/plugins/pbr/references/{agent-anti-patterns.md → archive/agent-anti-patterns.md} +0 -0
@@ -0,0 +1,847 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Status line: Updates Claude Code status bar with phase progress and
5
+ * context usage bar.
6
+ *
7
+ * Reads STATE.md for project position. Receives session JSON on stdin
8
+ * from Claude Code (context_window, model, cost, etc.).
9
+ *
10
+ * Output: plain text with ANSI color codes to stdout.
11
+ */
12
+
13
+ const fs = require('fs');
14
+ const path = require('path');
15
+ const cp = require('child_process');
16
+ const { logHook } = require('./hook-logger');
17
+ const { configLoad } = require('./pbr-tools');
18
+ const { resolveSessionPath } = require('./lib/core');
19
+ // ANSI color codes
20
+ const c = {
21
+ reset: '\x1b[0m',
22
+ bold: '\x1b[1m',
23
+ dim: '\x1b[2m',
24
+ cyan: '\x1b[36m',
25
+ green: '\x1b[32m',
26
+ yellow: '\x1b[33m',
27
+ red: '\x1b[31m',
28
+ blue: '\x1b[34m',
29
+ magenta: '\x1b[35m',
30
+ white: '\x1b[37m',
31
+ boldCyan: '\x1b[1;36m',
32
+ boldGreen: '\x1b[1;32m',
33
+ boldYellow: '\x1b[1;33m',
34
+ boldRed: '\x1b[1;31m',
35
+ };
36
+
37
+ // Default status_line config — works out of the box with zero config
38
+ const DEFAULTS = {
39
+ sections: ['phase', 'plan', 'status', 'agent', 'git', 'hooks', 'context', 'llm'],
40
+ brand_text: '\u25C6 PBR',
41
+ max_status_length: 50,
42
+ context_bar: {
43
+ width: 10,
44
+ thresholds: { green: 70, yellow: 90 },
45
+ chars: { filled: '\u2588', empty: '\u2591' }
46
+ }
47
+ };
48
+
49
+ /**
50
+ * Load status_line config from .planning/config.json, merged with defaults.
51
+ * Returns DEFAULTS if no config exists or no status_line section is present.
52
+ */
53
+ function loadStatusLineConfig(planningDir) {
54
+ const config = configLoad(planningDir);
55
+ if (!config || !config.status_line) return DEFAULTS;
56
+
57
+ const sl = config.status_line;
58
+ return {
59
+ sections: Array.isArray(sl.sections) ? sl.sections : DEFAULTS.sections,
60
+ brand_text: typeof sl.brand_text === 'string' ? sl.brand_text : DEFAULTS.brand_text,
61
+ max_status_length: typeof sl.max_status_length === 'number' ? sl.max_status_length : DEFAULTS.max_status_length,
62
+ context_bar: {
63
+ width: (sl.context_bar && typeof sl.context_bar.width === 'number') ? sl.context_bar.width : DEFAULTS.context_bar.width,
64
+ thresholds: {
65
+ green: (sl.context_bar && sl.context_bar.thresholds && typeof sl.context_bar.thresholds.green === 'number') ? sl.context_bar.thresholds.green : DEFAULTS.context_bar.thresholds.green,
66
+ yellow: (sl.context_bar && sl.context_bar.thresholds && typeof sl.context_bar.thresholds.yellow === 'number') ? sl.context_bar.thresholds.yellow : DEFAULTS.context_bar.thresholds.yellow
67
+ },
68
+ chars: {
69
+ filled: (sl.context_bar && sl.context_bar.chars && typeof sl.context_bar.chars.filled === 'string') ? sl.context_bar.chars.filled : DEFAULTS.context_bar.chars.filled,
70
+ empty: (sl.context_bar && sl.context_bar.chars && typeof sl.context_bar.chars.empty === 'string') ? sl.context_bar.chars.empty : DEFAULTS.context_bar.chars.empty
71
+ }
72
+ }
73
+ };
74
+ }
75
+
76
+ function readStdin() {
77
+ try {
78
+ const input = fs.readFileSync(0, 'utf8').trim();
79
+ if (input) return JSON.parse(input);
80
+ } catch (_e) {
81
+ // stdin may be empty or not JSON — that's fine
82
+ }
83
+ return {};
84
+ }
85
+
86
+ function getContextPercent(stdinData) {
87
+ // Claude Code statusLine sends context_window.used_percentage (0-100)
88
+ if (stdinData.context_window && stdinData.context_window.used_percentage != null) {
89
+ return Math.round(stdinData.context_window.used_percentage);
90
+ }
91
+ // Legacy field name
92
+ if (stdinData.context_usage_fraction != null) {
93
+ return Math.round(stdinData.context_usage_fraction * 100);
94
+ }
95
+ return null;
96
+ }
97
+
98
+ /**
99
+ * Build a horizontal bar using Unicode block characters.
100
+ * Width is in character cells. Color shifts green -> yellow -> red.
101
+ *
102
+ * @param {number} percent - Usage percentage (0-100)
103
+ * @param {number} width - Bar width in characters
104
+ * @param {object} [opts] - Optional config overrides
105
+ * @param {object} [opts.thresholds] - { green: number, yellow: number }
106
+ * @param {object} [opts.chars] - { filled: string, empty: string }
107
+ */
108
+ function buildContextBar(percent, width, opts) {
109
+ if (width < 1) return '';
110
+ const thresholds = (opts && opts.thresholds) || DEFAULTS.context_bar.thresholds;
111
+ const chars = (opts && opts.chars) || DEFAULTS.context_bar.chars;
112
+
113
+ const filled = Math.round((percent / 100) * width);
114
+ const empty = width - filled;
115
+
116
+ // Color based on usage threshold
117
+ let barColor;
118
+ if (percent >= thresholds.yellow) barColor = c.boldRed;
119
+ else if (percent >= thresholds.green) barColor = c.boldYellow;
120
+ else barColor = c.boldGreen;
121
+
122
+ const filledStr = chars.filled.repeat(filled);
123
+ const emptyStr = chars.empty.repeat(empty);
124
+
125
+ return `${barColor}${filledStr}${c.dim}${emptyStr}${c.reset}`;
126
+ }
127
+
128
+ /**
129
+ * Pick a color for the phase status keyword.
130
+ */
131
+ function statusColor(statusText) {
132
+ const lower = statusText.toLowerCase();
133
+ if (lower.includes('complete') || lower.includes('verified')) return c.green;
134
+ if (lower.includes('needs_fixes') || lower.includes('partial')) return c.yellow;
135
+ if (lower.includes('progress') || lower.includes('building') || lower.includes('executing') || lower.includes('planning')) return c.yellow;
136
+ if (lower.includes('discussing') || lower.includes('researching')) return c.magenta;
137
+ if (lower.includes('verifying')) return c.blue;
138
+ if (lower.includes('planned') || lower.includes('ready')) return c.cyan;
139
+ if (lower.includes('blocked') || lower.includes('failed')) return c.red;
140
+ if (lower.includes('pending')) return c.dim;
141
+ return c.white;
142
+ }
143
+
144
+ /**
145
+ * Get current git branch and dirty status.
146
+ * Returns null if not in a git repo or git is unavailable.
147
+ */
148
+ function getGitInfo() {
149
+ try {
150
+ const branch = cp.execSync('git branch --show-current', {
151
+ timeout: 500, encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe']
152
+ }).trim();
153
+ if (!branch) return null;
154
+ const porcelain = cp.execSync('git status --porcelain', {
155
+ timeout: 500, encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe']
156
+ }).trim();
157
+ return { branch, dirty: porcelain.length > 0 };
158
+ } catch (_e) {
159
+ return null;
160
+ }
161
+ }
162
+
163
+ /**
164
+ * Format milliseconds into human-readable duration (e.g. "12m", "1h23m").
165
+ */
166
+ function formatDuration(ms) {
167
+ const totalSeconds = Math.floor(ms / 1000);
168
+ const hours = Math.floor(totalSeconds / 3600);
169
+ const minutes = Math.floor((totalSeconds % 3600) / 60);
170
+ if (hours > 0) return `${hours}h${minutes > 0 ? minutes + 'm' : ''}`;
171
+ return `${minutes}m`;
172
+ }
173
+
174
+ /**
175
+ * Format a token count with K/M suffixes for compact display.
176
+ * @param {number} tokens
177
+ * @returns {string}
178
+ */
179
+ function formatTokens(tokens) {
180
+ if (tokens >= 1_000_000) return (tokens / 1_000_000).toFixed(1) + 'M';
181
+ if (tokens >= 1_000) return (tokens / 1_000).toFixed(1) + 'K';
182
+ return String(tokens);
183
+ }
184
+
185
+ /**
186
+ * Count phase directories in .planning/phases/ as a fallback for total phases.
187
+ * Returns the count as a string, or null if the directory doesn't exist.
188
+ */
189
+ function countPhaseDirs(planningDir) {
190
+ try {
191
+ const phasesDir = path.join(planningDir, 'phases');
192
+ if (!fs.existsSync(phasesDir)) return null;
193
+ const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
194
+ const count = entries.filter(e => e.isDirectory() && /^\d+/.test(e.name)).length;
195
+ return count > 0 ? String(count) : null;
196
+ } catch (_e) {
197
+ return null;
198
+ }
199
+ }
200
+
201
+ /**
202
+ * Read the current milestone name from ROADMAP.md.
203
+ * Looks for `## Milestone: {name}` headers, returns the first non-completed one.
204
+ * Returns null if no ROADMAP.md or no milestone header found.
205
+ */
206
+ function getMilestone(planningDir) {
207
+ try {
208
+ const roadmapPath = path.join(planningDir, 'ROADMAP.md');
209
+ if (!fs.existsSync(roadmapPath)) return null;
210
+ const content = fs.readFileSync(roadmapPath, 'utf8');
211
+ // Match "## Milestone: Name (version)" or "## Milestone: Name"
212
+ // Skip completed milestones (ending with "-- COMPLETED")
213
+ const matches = content.matchAll(/^##\s*Milestone:\s*(.+?)(?:\s*--\s*COMPLETED)?$/gm);
214
+ let lastActive = null;
215
+ for (const m of matches) {
216
+ const line = m[0];
217
+ if (!line.includes('COMPLETED')) {
218
+ lastActive = m[1].trim();
219
+ break;
220
+ }
221
+ }
222
+ return lastActive;
223
+ } catch (_e) {
224
+ return null;
225
+ }
226
+ }
227
+
228
+ /**
229
+ * Get the last completed (SHIPPED) milestone from ROADMAP.md milestone table.
230
+ * Reads the table at the top of ROADMAP.md looking for SHIPPED entries.
231
+ * Returns { version, name } (e.g., { version: "v15.0", name: "CLI Enforcement Completion" }) or null.
232
+ */
233
+ function getLastCompletedMilestone(planningDir) {
234
+ try {
235
+ const roadmapPath = path.join(planningDir, 'ROADMAP.md');
236
+ if (!fs.existsSync(roadmapPath)) return null;
237
+ const content = fs.readFileSync(roadmapPath, 'utf8');
238
+ // Match table rows: | vN.N | Name | SHIPPED | date |
239
+ const rows = content.matchAll(/\|\s*(v[\d.]+)\s*\|\s*([^|]+?)\s*\|\s*SHIPPED\s*\|[^|]*\|/gi);
240
+ let last = null;
241
+ for (const m of rows) {
242
+ last = { version: m[1], name: m[2].trim() };
243
+ }
244
+ return last;
245
+ } catch (_e) {
246
+ return null;
247
+ }
248
+ }
249
+
250
+ /**
251
+ * Synchronous TCP probe — checks if hook server port is open.
252
+ * Uses cp.execSync with a tiny node script to avoid async in status line.
253
+ * Returns true if port is accepting connections, false otherwise.
254
+ */
255
+ function isHookServerRunning(port) {
256
+ try {
257
+ const result = cp.execSync(
258
+ `node -e "var s=require('net').createConnection(${port || 19836},'127.0.0.1');s.setTimeout(100);s.on('connect',()=>{process.stdout.write('1');s.destroy()});s.on('error',()=>process.stdout.write('0'));s.on('timeout',()=>{process.stdout.write('0');s.destroy()})"`,
259
+ { timeout: 300, encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }
260
+ ).trim();
261
+ return result === '1';
262
+ } catch (_e) {
263
+ return false;
264
+ }
265
+ }
266
+
267
+ // ---------------------------------------------------------------------------
268
+ // Dev line helpers — PBR development stats from local files
269
+ // ---------------------------------------------------------------------------
270
+
271
+ /**
272
+ * Read project version from package.json in cwd.
273
+ * @returns {string|null}
274
+ */
275
+ function getVersion() {
276
+ try {
277
+ const pkg = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf8'));
278
+ return pkg.version || null;
279
+ } catch (_e) {
280
+ return null;
281
+ }
282
+ }
283
+
284
+ /**
285
+ * Count pending todos in .planning/todos/pending/.
286
+ * @param {string} planningDir
287
+ * @returns {number}
288
+ */
289
+ function countTodos(planningDir) {
290
+ try {
291
+ const dir = path.join(planningDir, 'todos', 'pending');
292
+ if (!fs.existsSync(dir)) return 0;
293
+ return fs.readdirSync(dir).filter(f => f.endsWith('.md')).length;
294
+ } catch (_e) {
295
+ return 0;
296
+ }
297
+ }
298
+
299
+ /**
300
+ * Count quick tasks in .planning/quick/.
301
+ * Returns { total, open } where open = dirs without SUMMARY.md.
302
+ * @param {string} planningDir
303
+ * @returns {{ total: number, open: number }}
304
+ */
305
+ function countQuickTasks(planningDir) {
306
+ try {
307
+ const dir = path.join(planningDir, 'quick');
308
+ if (!fs.existsSync(dir)) return { total: 0, open: 0 };
309
+ const entries = fs.readdirSync(dir, { withFileTypes: true })
310
+ .filter(e => e.isDirectory() && /^\d+/.test(e.name));
311
+ let open = 0;
312
+ for (const e of entries) {
313
+ if (!fs.existsSync(path.join(dir, e.name, 'SUMMARY.md'))) open++;
314
+ }
315
+ return { total: entries.length, open };
316
+ } catch (_e) {
317
+ return { total: 0, open: 0 };
318
+ }
319
+ }
320
+
321
+ /**
322
+ * Count skill directories in plugins/pbr/skills/.
323
+ * @returns {number}
324
+ */
325
+ function countSkills() {
326
+ try {
327
+ const dir = path.join(process.cwd(), 'plugins', 'pbr', 'skills');
328
+ if (!fs.existsSync(dir)) return 0;
329
+ return fs.readdirSync(dir, { withFileTypes: true })
330
+ .filter(e => e.isDirectory() && e.name !== 'shared').length;
331
+ } catch (_e) {
332
+ return 0;
333
+ }
334
+ }
335
+
336
+ /**
337
+ * Count hook entries in hooks/hooks.json.
338
+ * @returns {number}
339
+ */
340
+ function countHookEntries() {
341
+ try {
342
+ const hooksFile = path.join(process.cwd(), 'plugins', 'pbr', 'hooks', 'hooks.json');
343
+ const data = JSON.parse(fs.readFileSync(hooksFile, 'utf8'));
344
+ let count = 0;
345
+ if (data.hooks) {
346
+ for (const groups of Object.values(data.hooks)) {
347
+ for (const group of groups) {
348
+ if (group.hooks) count += group.hooks.length;
349
+ }
350
+ }
351
+ }
352
+ return count;
353
+ } catch (_e) {
354
+ return 0;
355
+ }
356
+ }
357
+
358
+ /**
359
+ * Read test coverage percentage.
360
+ * Priority: .last-test.json cache > bin/lib aggregate from coverage-summary > global total.
361
+ * The bin/lib slice (~75%) is the enforced threshold; global (~25%) includes untested hooks.
362
+ * @param {string} [planningDir] - Path to .planning/ for .last-test.json
363
+ * @returns {number|null}
364
+ */
365
+ function getCoverage(planningDir) {
366
+ // Prefer .last-test.json — written by posttest with fresh aggregated data
367
+ if (planningDir) {
368
+ try {
369
+ const testFile = path.join(planningDir, '.last-test.json');
370
+ const data = JSON.parse(fs.readFileSync(testFile, 'utf8'));
371
+ if (data.coverage != null) return Math.round(data.coverage);
372
+ } catch (_e) { /* fall through */ }
373
+ }
374
+ // Fallback: read coverage-final.json (always fresh after jest --coverage).
375
+ // coverage-summary.json is stale — Jest doesn't regenerate without json-summary reporter.
376
+ try {
377
+ const covFile = path.join(process.cwd(), 'coverage', 'coverage-final.json');
378
+ const data = JSON.parse(fs.readFileSync(covFile, 'utf8'));
379
+ let totalStmts = 0;
380
+ let coveredStmts = 0;
381
+ for (const file of Object.keys(data)) {
382
+ const stmtMap = data[file].s;
383
+ for (const key of Object.keys(stmtMap)) {
384
+ totalStmts++;
385
+ if (stmtMap[key] > 0) coveredStmts++;
386
+ }
387
+ }
388
+ return totalStmts > 0 ? Math.round((coveredStmts / totalStmts) * 100) : null;
389
+ } catch (_e) {
390
+ return null;
391
+ }
392
+ }
393
+
394
+ /**
395
+ * Read last test result from .planning/.last-test.json.
396
+ * Written by scripts/posttest.js after each npm test run.
397
+ * Format: { passed, failed, total, coverage, suites, timestamp }
398
+ * @param {string} planningDir
399
+ * @returns {{ passed: number, failed: number, total: number, coverage?: number }|null}
400
+ */
401
+ function getLastTestResult(planningDir) {
402
+ try {
403
+ const testFile = path.join(planningDir, '.last-test.json');
404
+ return JSON.parse(fs.readFileSync(testFile, 'utf8'));
405
+ } catch (_e) {
406
+ return null;
407
+ }
408
+ }
409
+
410
+ /**
411
+ * Read CI status from .planning/.ci-status.json.
412
+ * Expected format: { status: "pass"|"fail"|"pending", branch: string, timestamp: string }
413
+ * @param {string} planningDir
414
+ * @returns {{ status: string }|null}
415
+ */
416
+ function getCiStatus(planningDir) {
417
+ try {
418
+ const ciFile = path.join(planningDir, '.ci-status.json');
419
+ return JSON.parse(fs.readFileSync(ciFile, 'utf8'));
420
+ } catch (_e) {
421
+ return null;
422
+ }
423
+ }
424
+
425
+ /**
426
+ * Get hook server status with circuit breaker awareness.
427
+ * Returns one of: 'running', 'failed', 'stopped'.
428
+ *
429
+ * - 'running': TCP probe succeeds (server is responsive)
430
+ * - 'failed': Circuit breaker is open (5+ consecutive failures, cooldown active)
431
+ * - 'stopped': Server not running, no circuit breaker issues (normal idle)
432
+ *
433
+ * @param {number} [port=19836] - Hook server port
434
+ * @param {string} [planningDir] - Path to .planning/ directory
435
+ * @returns {'running'|'failed'|'stopped'}
436
+ */
437
+ function getHookServerStatus(port, planningDir) {
438
+ if (isHookServerRunning(port)) return 'running';
439
+
440
+ // Check circuit breaker state for failure detection
441
+ if (planningDir) {
442
+ try {
443
+ const circuitPath = path.join(planningDir, '.hook-server-circuit.json');
444
+ const data = JSON.parse(fs.readFileSync(circuitPath, 'utf8'));
445
+ if (data.failures >= 5) {
446
+ const elapsed = Date.now() - (data.openedAt || 0);
447
+ if (elapsed < 30000) return 'failed';
448
+ }
449
+ } catch (_e) { /* no circuit file — server is simply stopped */ }
450
+ }
451
+
452
+ return 'stopped';
453
+ }
454
+
455
+ /**
456
+ * Read recent hook dispatch timing from .hook-events.jsonl.
457
+ * Returns the total cumulative duration_ms for dispatch events in the last 60 seconds.
458
+ * Used to detect when a single tool-call event window has high hook overhead.
459
+ * @param {string} planningDir
460
+ * @returns {number} cumulative ms, or 0 if not measurable
461
+ */
462
+ function getRecentHookOverhead(planningDir) {
463
+ if (!planningDir) return 0;
464
+ try {
465
+ const logPath = path.join(planningDir, '.hook-events.jsonl');
466
+ if (!fs.existsSync(logPath)) return 0;
467
+ const content = fs.readFileSync(logPath, 'utf8');
468
+ const lines = content.split('\n').filter(l => l.trim().length > 0);
469
+ const cutoff = Date.now() - 60000; // last 60 seconds
470
+ let total = 0;
471
+ for (const line of lines.slice(-200)) {
472
+ try {
473
+ const entry = JSON.parse(line);
474
+ if (entry.type === 'dispatch' && typeof entry.duration_ms === 'number') {
475
+ const ts = entry.ts ? new Date(entry.ts).getTime() : 0;
476
+ if (ts >= cutoff) total += entry.duration_ms;
477
+ }
478
+ } catch (_e) { /* skip malformed */ }
479
+ }
480
+ return total;
481
+ } catch (_e) {
482
+ return 0;
483
+ }
484
+ }
485
+
486
+ function main() {
487
+ const stdinData = readStdin();
488
+ const cwd = process.cwd();
489
+ const planningDir = path.join(cwd, '.planning');
490
+ const stateFile = path.join(planningDir, 'STATE.md');
491
+
492
+ if (!fs.existsSync(stateFile)) {
493
+ process.exit(0);
494
+ }
495
+
496
+ try {
497
+ const slConfig = loadStatusLineConfig(planningDir);
498
+ const content = fs.readFileSync(stateFile, 'utf8');
499
+ const ctxPercent = getContextPercent(stdinData);
500
+
501
+ // Bridge real context data to .context-budget.json for TMUX status bar
502
+ if (ctxPercent != null) {
503
+ try {
504
+ const { saveBridge } = require('./context-bridge');
505
+ const bridgePath = path.join(planningDir, '.context-budget.json');
506
+ const bridge = {
507
+ timestamp: new Date().toISOString(),
508
+ estimated_percent: ctxPercent,
509
+ source: 'claude-code',
510
+ tool_calls: 0,
511
+ chars_read: 0
512
+ };
513
+ // Preserve existing bridge fields (warnings, tier, etc.)
514
+ try {
515
+ const existing = JSON.parse(fs.readFileSync(bridgePath, 'utf8'));
516
+ bridge.tool_calls = existing.tool_calls || 0;
517
+ bridge.chars_read = existing.chars_read || 0;
518
+ bridge.warnings_issued = existing.warnings_issued || [];
519
+ bridge.last_warned_tier = existing.last_warned_tier || 'PEAK';
520
+ bridge.calls_since_warn = existing.calls_since_warn || 0;
521
+ bridge.thresholds = existing.thresholds;
522
+ } catch (_e) { /* no existing bridge */ }
523
+ saveBridge(bridgePath, bridge);
524
+ } catch (_e) {
525
+ // Best-effort — never fail the status line
526
+ }
527
+ }
528
+
529
+ const status = buildStatusLine(content, ctxPercent, slConfig, stdinData, planningDir);
530
+
531
+ if (status) {
532
+ process.stdout.write(status);
533
+ logHook('status-line', 'StatusLine', 'updated', { ctxPercent });
534
+ }
535
+ } catch (_e) {
536
+ logHook('status-line', 'StatusLine', 'error', { error: _e.message });
537
+ process.stdout.write(JSON.stringify({ additionalContext: '⚠ [PBR] status-line failed: ' + _e.message }));
538
+ }
539
+
540
+ process.exit(0);
541
+ }
542
+
543
+ /**
544
+ * Parse YAML frontmatter from STATE.md content.
545
+ * Returns an object with frontmatter fields, or null if no frontmatter.
546
+ */
547
+ function parseFrontmatter(content) {
548
+ if (!content.startsWith('---')) return null;
549
+ const endIdx = content.indexOf('---', 3);
550
+ if (endIdx === -1) return null;
551
+ const fm = content.substring(3, endIdx);
552
+ const result = {};
553
+ for (const line of fm.split(/\r?\n/)) {
554
+ const m = line.match(/^(\w[\w_]*):\s*"?([^"]*)"?\s*$/);
555
+ if (m) {
556
+ const val = m[2].trim();
557
+ // Skip YAML nulls and empty values — they'd render as literal "null"
558
+ if (val && val !== 'null' && val !== 'undefined') {
559
+ result[m[1]] = val;
560
+ }
561
+ }
562
+ }
563
+ return result;
564
+ }
565
+
566
+ function buildStatusLine(content, ctxPercent, cfg, stdinData, planningDir) {
567
+ const config = cfg || DEFAULTS;
568
+ const sections = config.sections || DEFAULTS.sections;
569
+ const brandText = config.brand_text || DEFAULTS.brand_text;
570
+ const maxLen = config.max_status_length || DEFAULTS.max_status_length;
571
+ const barCfg = config.context_bar || DEFAULTS.context_bar;
572
+ const sd = stdinData || {};
573
+
574
+ // Prefer frontmatter (always up-to-date) over body text (may be stale)
575
+ const fm = parseFrontmatter(content);
576
+
577
+ // Line 1: project state (milestone, phase, plan, status)
578
+ // Line 2: environment info (git, hooks, model, cost, duration, context)
579
+ const line1 = [];
580
+ const line2 = [];
581
+
582
+ // Milestone section — show active milestone from ROADMAP.md
583
+ if (sections.includes('milestone') && planningDir) {
584
+ const milestone = getMilestone(planningDir);
585
+ if (milestone) {
586
+ line1.push(`${c.boldCyan}${brandText}${c.reset} ${c.magenta}${milestone}${c.reset}`);
587
+ } else {
588
+ line1.push(`${c.boldCyan}${brandText}${c.reset}`);
589
+ }
590
+ }
591
+
592
+ // Phase section (always includes brand text)
593
+ if (sections.includes('phase')) {
594
+ const fmStatus = fm && fm.status;
595
+
596
+ // When milestone is complete, show celebration with version + name instead of stale phase info
597
+ if (fmStatus === 'milestone-complete') {
598
+ const lastMilestone = getLastCompletedMilestone(planningDir);
599
+ if (lastMilestone) {
600
+ line1.push(`${c.boldCyan}${brandText}${c.reset} ${c.green}✓ ${lastMilestone.version} ${lastMilestone.name} — Complete${c.reset}`);
601
+ } else {
602
+ line1.push(`${c.boldCyan}${brandText}${c.reset} ${c.green}✓ Milestone Complete${c.reset}`);
603
+ }
604
+ } else {
605
+ const fmPhase = fm && fm.current_phase;
606
+ // phase_slug is the canonical field; phase_name is a legacy alias
607
+ const fmSlug = fm && fm.phase_slug;
608
+ const fmName = fm && fm.phase_name;
609
+ const phaseMatch = content.match(/Phase:\s*(\d+)\s*of\s*(\d+)\s*(?:\(([^)]+)\))?/);
610
+
611
+ const phaseNum = fmPhase || (phaseMatch && phaseMatch[1]);
612
+ const fmPhasesTotal = fm && fm.phases_total;
613
+ // Sanity check: if phases_total < current_phase, it's stale — fall through to countPhaseDirs
614
+ const phaseNumInt = phaseNum ? parseInt(String(phaseNum), 10) : 0;
615
+ const phasesTotalInt = fmPhasesTotal ? parseInt(String(fmPhasesTotal), 10) : 0;
616
+ const isTotalStale = phasesTotalInt > 0 && phasesTotalInt < phaseNumInt;
617
+ const phaseTotal = (!isTotalStale && fmPhasesTotal && fmPhasesTotal !== '0' && fmPhasesTotal !== 'null')
618
+ ? fmPhasesTotal
619
+ : (phaseMatch && phaseMatch[2]) || countPhaseDirs(planningDir);
620
+ // Format phase_slug from "foo-bar" to "Foo Bar" for display
621
+ const formattedSlug = fmSlug ? String(fmSlug).replace(/-/g, ' ').replace(/\b\w/g, ch => ch.toUpperCase()) : null;
622
+ const phaseName = fmName || formattedSlug || (phaseMatch && phaseMatch[3]);
623
+
624
+ if (phaseNum && phaseTotal) {
625
+ line1.push(`${c.boldCyan}${brandText}${c.reset} ${c.bold}Phase ${phaseNum}/${phaseTotal}${c.reset}`);
626
+ if (phaseName) {
627
+ line1.push(`${c.magenta}${phaseName}${c.reset}`);
628
+ }
629
+ } else {
630
+ line1.push(`${c.boldCyan}${brandText}${c.reset}`);
631
+ }
632
+ }
633
+ }
634
+
635
+ // Plan section — shows current plan progress within the phase (hidden when milestone complete)
636
+ if (sections.includes('plan') && !(fm && fm.status === 'milestone-complete')) {
637
+ const fmComplete = fm && fm.plans_complete;
638
+ const fmPlansTotal = fm && fm.plans_total;
639
+ const planMatch = content.match(/Plan:\s*(\d+)\s*of\s*(\d+)/);
640
+
641
+ const done = fmComplete != null ? parseInt(fmComplete, 10) : (planMatch ? parseInt(planMatch[1], 10) : null);
642
+ const total = fmPlansTotal != null ? parseInt(fmPlansTotal, 10) : (planMatch ? parseInt(planMatch[2], 10) : null);
643
+
644
+ if (done != null && total != null && total > 0) {
645
+ const planColor = done === total ? c.green : c.white;
646
+ line1.push(`${planColor}Plan ${done}/${total}${c.reset}`);
647
+ }
648
+ }
649
+
650
+ // Status section (hidden when milestone-complete — already shown in phase section)
651
+ if (sections.includes('status') && !(fm && fm.status === 'milestone-complete')) {
652
+ const fmStatus = fm && fm.status;
653
+ const statusMatch = content.match(/^Status:\s*(.+)/m);
654
+ const text = fmStatus || (statusMatch && statusMatch[1].trim());
655
+ if (text) {
656
+ const short = text.length > maxLen ? text.slice(0, maxLen - 3) + '...' : text;
657
+ line1.push(`${statusColor(text)}${short}${c.reset}`);
658
+ }
659
+ }
660
+
661
+ // Agent section — active subagent name from .active-agent signal file
662
+ // Try session-scoped path first, fall back to global
663
+ if (sections.includes('agent') && planningDir) {
664
+ try {
665
+ const agentSessionId = sd.session_id || null;
666
+ let agentName = null;
667
+ if (agentSessionId) {
668
+ const sessionAgentFile = resolveSessionPath(planningDir, '.active-agent', agentSessionId);
669
+ if (fs.existsSync(sessionAgentFile)) {
670
+ agentName = fs.readFileSync(sessionAgentFile, 'utf8').trim();
671
+ }
672
+ }
673
+ if (!agentName) {
674
+ const globalAgentFile = path.join(planningDir, '.active-agent');
675
+ if (fs.existsSync(globalAgentFile)) {
676
+ agentName = fs.readFileSync(globalAgentFile, 'utf8').trim();
677
+ }
678
+ }
679
+ if (agentName) {
680
+ // Strip pbr- prefix for brevity
681
+ agentName = agentName.replace(/^pbr-/, '');
682
+ line1.push(`${c.magenta}\u25C6 ${agentName}${c.reset}`);
683
+ }
684
+ } catch (_e) {
685
+ // Graceful fallback — skip if unreadable
686
+ }
687
+ }
688
+
689
+ // Git section — branch name + dirty indicator
690
+ if (sections.includes('git')) {
691
+ const gitInfo = getGitInfo();
692
+ if (gitInfo) {
693
+ const dirtyMark = gitInfo.dirty ? `${c.yellow}*${c.reset}` : '';
694
+ line2.push(`${c.cyan}${gitInfo.branch}${c.reset}${dirtyMark}`);
695
+ }
696
+ }
697
+
698
+ // Hooks section — hook server status indicator (3 states) + overhead display
699
+ if (sections.includes('hooks')) {
700
+ const hsStatus = getHookServerStatus(19836, planningDir);
701
+ let hookLabel = 'hooks';
702
+ let hookColor = c.dim;
703
+ if (hsStatus === 'running') {
704
+ hookColor = c.green;
705
+ // Check for high cumulative overhead in last 60 seconds
706
+ const overhead = getRecentHookOverhead(planningDir);
707
+ if (overhead > 500) {
708
+ hookLabel = `hooks \u26A1${overhead}ms`;
709
+ hookColor = c.yellow;
710
+ }
711
+ } else if (hsStatus === 'failed') {
712
+ hookColor = c.red;
713
+ }
714
+ const dot = hsStatus === 'running' ? '\u25CF' : '\u25CB';
715
+ line2.push(`${hookColor}${dot} ${hookLabel}${c.reset}`);
716
+ }
717
+
718
+ // Model section — current model display name from stdin
719
+ if (sections.includes('model') && sd.model && sd.model.display_name) {
720
+ line2.push(`${c.dim}${sd.model.display_name}${c.reset}`);
721
+ }
722
+
723
+ // Cost section — session cost from stdin
724
+ if (sections.includes('cost') && sd.cost && sd.cost.total_cost_usd != null) {
725
+ const cost = sd.cost.total_cost_usd;
726
+ const costStr = `$${cost.toFixed(2)}`;
727
+ let costColor = c.dim;
728
+ if (cost > 5) costColor = c.red;
729
+ else if (cost > 1) costColor = c.yellow;
730
+ line2.push(`${costColor}${costStr}${c.reset}`);
731
+ }
732
+
733
+ // Duration section — session wall-clock time from stdin
734
+ if (sections.includes('duration') && sd.cost && sd.cost.total_duration_ms != null) {
735
+ line2.push(`${c.dim}${formatDuration(sd.cost.total_duration_ms)}${c.reset}`);
736
+ }
737
+
738
+ // Context bar section
739
+ if (sections.includes('context') && ctxPercent != null) {
740
+ const bar = buildContextBar(ctxPercent, barCfg.width || DEFAULTS.context_bar.width, {
741
+ thresholds: barCfg.thresholds || DEFAULTS.context_bar.thresholds,
742
+ chars: barCfg.chars || DEFAULTS.context_bar.chars
743
+ });
744
+ let ctxSuffix = '';
745
+ // Append tier label only when current context % warrants it
746
+ // (budget file may have stale last_warned_tier from a previous session)
747
+ try {
748
+ const budgetPath = path.join(planningDir, '.context-budget.json');
749
+ if (fs.existsSync(budgetPath)) {
750
+ const budget = JSON.parse(fs.readFileSync(budgetPath, 'utf8'));
751
+ const thresholds = budget.thresholds || { degrading: 50, poor: 70, critical: 85 };
752
+ if (ctxPercent >= thresholds.critical) ctxSuffix = ` ${c.boldRed}CRITICAL${c.reset}`;
753
+ else if (ctxPercent >= thresholds.poor) ctxSuffix = ` ${c.red}POOR${c.reset}`;
754
+ else if (ctxPercent >= thresholds.degrading) ctxSuffix = ` ${c.yellow}DEGRADING${c.reset}`;
755
+ }
756
+ } catch (_e) {
757
+ // Skip silently if file missing or malformed
758
+ }
759
+ line2.push(`${bar} ${c.dim}${ctxPercent}%${c.reset}${ctxSuffix}`);
760
+ }
761
+
762
+ if (line1.length === 0 && line2.length === 0) return null;
763
+
764
+ const sep = ` ${c.dim}\u2502${c.reset} `;
765
+ let output = line1.join(sep);
766
+ if (line2.length > 0) {
767
+ output += '\n' + line2.join(sep);
768
+ }
769
+
770
+ // Dev line — PBR development stats (version, skills, hooks, coverage, todos, quick, tests, ci)
771
+ // Only renders when at least one dev section is enabled
772
+ if (sections.includes('dev') && planningDir) {
773
+ const devParts = [];
774
+
775
+ // Version from package.json
776
+ const ver = getVersion();
777
+ if (ver) {
778
+ devParts.push(`${c.boldCyan}\u25C6 dev${c.reset} ${c.dim}v${ver}${c.reset}`);
779
+ }
780
+
781
+ // Skill count
782
+ const skillCount = countSkills();
783
+ if (skillCount > 0) {
784
+ devParts.push(`${c.dim}${skillCount} skills${c.reset}`);
785
+ }
786
+
787
+ // Hook entry count
788
+ const hookCount = countHookEntries();
789
+ if (hookCount > 0) {
790
+ devParts.push(`${c.dim}${hookCount} hooks${c.reset}`);
791
+ }
792
+
793
+ // Test coverage — prefers .last-test.json, falls back to coverage-summary.json
794
+ const cov = getCoverage(planningDir);
795
+ if (cov != null) {
796
+ const covColor = cov >= 70 ? c.green : cov >= 50 ? c.yellow : c.red;
797
+ devParts.push(`${covColor}${cov}% cov${c.reset}`);
798
+ }
799
+
800
+ // Last test result from .planning/.last-test.json
801
+ const testResult = getLastTestResult(planningDir);
802
+ if (testResult) {
803
+ if (testResult.failed > 0) {
804
+ devParts.push(`${c.red}\u2717 ${testResult.failed} fail${c.reset}`);
805
+ } else {
806
+ devParts.push(`${c.green}\u2713 ${testResult.total} pass${c.reset}`);
807
+ }
808
+ }
809
+
810
+ // CI status from .planning/.ci-status.json
811
+ const ciResult = getCiStatus(planningDir);
812
+ if (ciResult) {
813
+ if (ciResult.status === 'pass') {
814
+ devParts.push(`${c.green}\u2713 CI${c.reset}`);
815
+ } else if (ciResult.status === 'fail') {
816
+ devParts.push(`${c.red}\u2717 CI${c.reset}`);
817
+ } else if (ciResult.status === 'pending') {
818
+ devParts.push(`${c.yellow}\u25CB CI${c.reset}`);
819
+ }
820
+ }
821
+
822
+ // Pending todos
823
+ const todoCount = countTodos(planningDir);
824
+ if (todoCount > 0) {
825
+ devParts.push(`${c.yellow}${todoCount} todo${todoCount !== 1 ? 's' : ''}${c.reset}`);
826
+ }
827
+
828
+ // Quick tasks
829
+ const quick = countQuickTasks(planningDir);
830
+ if (quick.total > 0) {
831
+ if (quick.open > 0) {
832
+ devParts.push(`${c.yellow}Q:${quick.total} (${quick.open} open)${c.reset}`);
833
+ } else {
834
+ devParts.push(`${c.dim}Q:${quick.total}${c.reset}`);
835
+ }
836
+ }
837
+
838
+ if (devParts.length > 0) {
839
+ output += '\n' + devParts.join(sep);
840
+ }
841
+ }
842
+
843
+ return output;
844
+ }
845
+
846
+ if (require.main === module || process.argv[1] === __filename) { main(); }
847
+ module.exports = { buildStatusLine, buildContextBar, getContextPercent, getGitInfo, getMilestone, getLastCompletedMilestone, countPhaseDirs, isHookServerRunning, getHookServerStatus, getRecentHookOverhead, getVersion, countTodos, countQuickTasks, countSkills, countHookEntries, getCoverage, getLastTestResult, getCiStatus, formatDuration, formatTokens, loadStatusLineConfig, parseFrontmatter, DEFAULTS };