@sienklogic/plan-build-run 2.1.0 → 2.1.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 (1238) hide show
  1. package/CHANGELOG.md +51 -49
  2. package/CLAUDE.md +48 -32
  3. package/LICENSE +2 -1
  4. package/README.md +771 -87
  5. package/agents/pbr-audit.md +266 -0
  6. package/agents/pbr-codebase-mapper.md +236 -0
  7. package/agents/pbr-debugger.md +312 -0
  8. package/agents/pbr-dev-sync.md +220 -0
  9. package/agents/pbr-executor.md +559 -0
  10. package/agents/pbr-general.md +191 -0
  11. package/agents/pbr-integration-checker.md +237 -0
  12. package/agents/pbr-nyquist-auditor.md +252 -0
  13. package/agents/pbr-plan-checker.md +312 -0
  14. package/agents/pbr-planner.md +495 -0
  15. package/agents/pbr-researcher.md +314 -0
  16. package/agents/pbr-roadmapper.md +346 -0
  17. package/agents/pbr-synthesizer.md +271 -0
  18. package/agents/pbr-verifier.md +495 -0
  19. package/bin/install.js +2752 -0
  20. package/commands/pbr/add-phase.md +75 -0
  21. package/commands/pbr/add-todo.md +8 -0
  22. package/commands/pbr/audit-milestone.md +8 -0
  23. package/commands/pbr/audit.md +5 -0
  24. package/commands/pbr/check-todos.md +8 -0
  25. package/commands/pbr/complete-milestone.md +8 -0
  26. package/commands/pbr/config.md +5 -0
  27. package/commands/pbr/continue.md +5 -0
  28. package/commands/pbr/dashboard.md +5 -0
  29. package/commands/pbr/debug.md +5 -0
  30. package/commands/pbr/discuss-phase.md +6 -0
  31. package/commands/pbr/do.md +5 -0
  32. package/commands/pbr/execute-phase.md +6 -0
  33. package/commands/pbr/explore.md +5 -0
  34. package/commands/pbr/health.md +5 -0
  35. package/commands/pbr/help.md +5 -0
  36. package/commands/pbr/import.md +5 -0
  37. package/commands/pbr/insert-phase.md +65 -0
  38. package/commands/pbr/join-discord.md +11 -0
  39. package/commands/pbr/list-phase-assumptions.md +69 -0
  40. package/commands/pbr/map-codebase.md +6 -0
  41. package/commands/pbr/new-milestone.md +8 -0
  42. package/commands/pbr/new-project.md +6 -0
  43. package/commands/pbr/note.md +5 -0
  44. package/commands/pbr/pause-work.md +5 -0
  45. package/commands/pbr/plan-milestone-gaps.md +7 -0
  46. package/commands/pbr/plan-phase.md +6 -0
  47. package/commands/pbr/progress.md +6 -0
  48. package/commands/pbr/quick.md +5 -0
  49. package/commands/pbr/reapply-patches.md +40 -0
  50. package/commands/pbr/remove-phase.md +66 -0
  51. package/commands/pbr/research-phase.md +59 -0
  52. package/commands/pbr/resume-work.md +5 -0
  53. package/commands/pbr/set-profile.md +6 -0
  54. package/commands/pbr/settings.md +5 -0
  55. package/commands/pbr/setup.md +5 -0
  56. package/commands/pbr/statusline.md +5 -0
  57. package/commands/pbr/test.md +5 -0
  58. package/commands/pbr/undo.md +5 -0
  59. package/commands/pbr/update.md +37 -0
  60. package/commands/pbr/verify-work.md +6 -0
  61. package/dashboard/bin/cli.cjs +85 -0
  62. package/dashboard/eslint.config.js +37 -0
  63. package/dashboard/index.html +20 -0
  64. package/dashboard/package.json +28 -23
  65. package/dashboard/server/index.js +134 -0
  66. package/dashboard/server/lib/frontmatter.js +92 -0
  67. package/dashboard/server/middleware/static.js +35 -0
  68. package/dashboard/server/package.json +16 -0
  69. package/dashboard/server/routes/agents.js +213 -0
  70. package/dashboard/server/routes/config.js +64 -0
  71. package/dashboard/server/routes/health.js +21 -0
  72. package/dashboard/server/routes/memory.js +107 -0
  73. package/dashboard/server/routes/planning.js +234 -0
  74. package/dashboard/server/routes/projects.js +36 -0
  75. package/dashboard/server/routes/requirements.js +40 -0
  76. package/dashboard/server/routes/roadmap.js +69 -0
  77. package/dashboard/server/routes/status.js +25 -0
  78. package/dashboard/server/routes/telemetry.js +171 -0
  79. package/dashboard/server/services/file-watcher.js +105 -0
  80. package/dashboard/server/services/planning-reader.js +679 -0
  81. package/dashboard/server/test/cli.test.js +34 -0
  82. package/dashboard/server/test/frontmatter.test.js +104 -0
  83. package/dashboard/server/test/isolation.test.js +32 -0
  84. package/dashboard/server/test/planning-reader.test.js +151 -0
  85. package/dashboard/server/test/routes.test.js +91 -0
  86. package/dashboard/server/test/ws.test.js +81 -0
  87. package/dashboard/server/ws.js +96 -0
  88. package/dashboard/src/App.jsx +147 -0
  89. package/dashboard/src/components/charts/BudgetBars.jsx +42 -0
  90. package/dashboard/src/components/charts/ContextRadar.jsx +34 -0
  91. package/dashboard/src/components/charts/PhaseDonut.jsx +66 -0
  92. package/dashboard/src/components/charts/SuccessTrend.jsx +45 -0
  93. package/dashboard/src/components/charts/TokenChart.jsx +55 -0
  94. package/dashboard/src/components/charts/index.js +5 -0
  95. package/dashboard/src/components/config/CfgSection.jsx +93 -0
  96. package/dashboard/src/components/layout/Header.jsx +89 -0
  97. package/dashboard/src/components/layout/ProjectSwitcher.jsx +160 -0
  98. package/dashboard/src/components/layout/Sidebar.jsx +161 -0
  99. package/dashboard/src/components/ui/AutoModeBanner.jsx +138 -0
  100. package/dashboard/src/components/ui/BackButton.jsx +27 -0
  101. package/dashboard/src/components/ui/Badge.jsx +27 -0
  102. package/dashboard/src/components/ui/Card.jsx +23 -0
  103. package/dashboard/src/components/ui/ChartTooltip.jsx +48 -0
  104. package/dashboard/src/components/ui/CheckpointBox.jsx +110 -0
  105. package/dashboard/src/components/ui/CodeBlock.jsx +27 -0
  106. package/dashboard/src/components/ui/ConfidenceBadge.jsx +20 -0
  107. package/dashboard/src/components/ui/ConfirmModal.jsx +161 -0
  108. package/dashboard/src/components/ui/ConnectionBanner.jsx +60 -0
  109. package/dashboard/src/components/ui/ErrorBoundary.jsx +106 -0
  110. package/dashboard/src/components/ui/ErrorBox.jsx +107 -0
  111. package/dashboard/src/components/ui/KeyValue.jsx +33 -0
  112. package/dashboard/src/components/ui/LoadingSkeleton.jsx +84 -0
  113. package/dashboard/src/components/ui/MetricCard.jsx +58 -0
  114. package/dashboard/src/components/ui/NextUpBlock.jsx +92 -0
  115. package/dashboard/src/components/ui/NumberInput.jsx +44 -0
  116. package/dashboard/src/components/ui/PBRBanner.jsx +47 -0
  117. package/dashboard/src/components/ui/PipelineView.jsx +130 -0
  118. package/dashboard/src/components/ui/ProgressBar.jsx +28 -0
  119. package/dashboard/src/components/ui/ProgressDisplay.jsx +47 -0
  120. package/dashboard/src/components/ui/QualityGateBadge.jsx +15 -0
  121. package/dashboard/src/components/ui/SectionTitle.jsx +35 -0
  122. package/dashboard/src/components/ui/SelectInput.jsx +45 -0
  123. package/dashboard/src/components/ui/StatusDot.jsx +51 -0
  124. package/dashboard/src/components/ui/StatusSymbol.jsx +49 -0
  125. package/dashboard/src/components/ui/TabBar.jsx +41 -0
  126. package/dashboard/src/components/ui/TextInput.jsx +42 -0
  127. package/dashboard/src/components/ui/Toast.jsx +117 -0
  128. package/dashboard/src/components/ui/Toggle.jsx +70 -0
  129. package/dashboard/src/components/ui/index.js +29 -0
  130. package/dashboard/src/hooks/useDocumentTitle.js +16 -0
  131. package/dashboard/src/hooks/useFetch.js +50 -0
  132. package/dashboard/src/hooks/useToast.jsx +43 -0
  133. package/dashboard/src/hooks/useWebSocket.js +103 -0
  134. package/dashboard/src/lib/api.js +112 -0
  135. package/dashboard/src/lib/configSchema.js +189 -0
  136. package/dashboard/src/lib/constants.js +16 -0
  137. package/dashboard/src/main.jsx +15 -0
  138. package/dashboard/src/pages/AgentsPage.jsx +191 -0
  139. package/dashboard/src/pages/ConfigPage.jsx +298 -0
  140. package/dashboard/src/pages/HooksPage.jsx +412 -0
  141. package/dashboard/src/pages/LiveFeed.jsx +274 -0
  142. package/dashboard/src/pages/MemoryPage.jsx +107 -0
  143. package/dashboard/src/pages/Overview.jsx +360 -0
  144. package/dashboard/src/pages/PhaseDetailView.jsx +216 -0
  145. package/dashboard/src/pages/PlanningPage.jsx +181 -0
  146. package/dashboard/src/pages/RoadmapPage.jsx +251 -0
  147. package/dashboard/src/pages/Telemetry.jsx +113 -0
  148. package/dashboard/src/pages/planning/DecisionsTab.jsx +153 -0
  149. package/dashboard/src/pages/planning/FilesTab.jsx +420 -0
  150. package/dashboard/src/pages/planning/MilestoneDetail.jsx +319 -0
  151. package/dashboard/src/pages/planning/MilestonesTab.jsx +151 -0
  152. package/dashboard/src/pages/planning/NotesTab.jsx +251 -0
  153. package/dashboard/src/pages/planning/PhasesTab.jsx +218 -0
  154. package/dashboard/src/pages/planning/QuickTab.jsx +50 -0
  155. package/dashboard/src/pages/planning/ResearchTab.jsx +103 -0
  156. package/dashboard/src/pages/planning/TodosTab.jsx +297 -0
  157. package/dashboard/src/theme/ThemeProvider.jsx +38 -0
  158. package/dashboard/src/theme/tokens.js +17 -0
  159. package/dashboard/tests/components/ConfirmModal.test.jsx +179 -0
  160. package/dashboard/tests/components/ConnectionBanner.test.jsx +37 -0
  161. package/dashboard/tests/components/ErrorBoundary.test.jsx +59 -0
  162. package/dashboard/tests/components/LoadingSkeleton.test.jsx +46 -0
  163. package/dashboard/tests/components/ToastContainer.test.jsx +47 -0
  164. package/dashboard/tests/components/Toggle.test.jsx +61 -0
  165. package/dashboard/tests/hooks/useFetch.test.jsx +77 -0
  166. package/dashboard/tests/hooks/useToast.test.jsx +78 -0
  167. package/dashboard/tests/hooks/useWebSocket.test.jsx +128 -0
  168. package/dashboard/tests/pages/ConfigPage.test.jsx +199 -0
  169. package/dashboard/tests/pages/PlanningPage.test.jsx +119 -0
  170. package/dashboard/tests/pages/planning/FilesTab.test.jsx +198 -0
  171. package/dashboard/tests/pages/planning/NotesTab.test.jsx +178 -0
  172. package/dashboard/tests/pages/planning/TodosTab.test.jsx +188 -0
  173. package/dashboard/tests/performance.test.jsx +46 -0
  174. package/dashboard/tests/routes/config.test.js +98 -0
  175. package/dashboard/tests/routes/health.test.js +40 -0
  176. package/dashboard/tests/routes/planning.test.js +112 -0
  177. package/dashboard/tests/routes/roadmap.test.js +91 -0
  178. package/dashboard/tests/routes/status.test.js +131 -0
  179. package/dashboard/tests/server/planning-reader.test.js +153 -0
  180. package/dashboard/tests/setup.js +7 -0
  181. package/dashboard/vite.config.js +41 -0
  182. package/hooks/dist/auto-continue.js +201 -0
  183. package/hooks/dist/block-skill-self-read.js +77 -0
  184. package/hooks/dist/branding-audit.js +232 -0
  185. package/hooks/dist/check-agent-state-write.js +63 -0
  186. package/hooks/dist/check-config-change.js +188 -0
  187. package/hooks/dist/check-dangerous-commands.js +184 -0
  188. package/hooks/dist/check-doc-sprawl.js +102 -0
  189. package/hooks/dist/check-phase-boundary.js +190 -0
  190. package/hooks/dist/check-plan-format.js +654 -0
  191. package/hooks/dist/check-roadmap-sync.js +491 -0
  192. package/hooks/dist/check-skill-workflow.js +353 -0
  193. package/hooks/dist/check-state-sync.js +612 -0
  194. package/hooks/dist/check-subagent-output.js +754 -0
  195. package/hooks/dist/check-summary-gate.js +198 -0
  196. package/hooks/dist/context-bridge.js +342 -0
  197. package/hooks/dist/context-budget-check.js +441 -0
  198. package/hooks/dist/enforce-pbr-workflow.js +277 -0
  199. package/hooks/dist/event-handler.js +217 -0
  200. package/hooks/dist/event-logger.js +92 -0
  201. package/hooks/dist/hook-logger.js +80 -0
  202. package/hooks/dist/hook-server-client.js +341 -0
  203. package/hooks/dist/hook-server.js +336 -0
  204. package/hooks/dist/hooks-schema.json +85 -0
  205. package/hooks/dist/hooks.json +288 -0
  206. package/hooks/dist/instructions-loaded.js +107 -0
  207. package/hooks/dist/intercept-plan-mode.js +48 -0
  208. package/hooks/dist/log-notification.js +87 -0
  209. package/hooks/dist/log-subagent.js +303 -0
  210. package/hooks/dist/log-tool-failure.js +140 -0
  211. package/hooks/dist/milestone-learnings.js +290 -0
  212. package/hooks/dist/post-bash-triage.js +151 -0
  213. package/hooks/dist/post-write-dispatch.js +227 -0
  214. package/hooks/dist/post-write-quality.js +207 -0
  215. package/hooks/dist/pre-bash-dispatch.js +137 -0
  216. package/hooks/dist/pre-write-dispatch.js +156 -0
  217. package/hooks/dist/progress-tracker.js +742 -0
  218. package/hooks/dist/prompt-routing.js +152 -0
  219. package/hooks/dist/run-hook.js +144 -0
  220. package/hooks/dist/session-cleanup.js +455 -0
  221. package/hooks/dist/session-tracker.js +78 -0
  222. package/hooks/dist/status-line.js +471 -0
  223. package/hooks/dist/suggest-compact.js +220 -0
  224. package/hooks/dist/sync-context-to-claude.js +100 -0
  225. package/hooks/dist/task-completed.js +167 -0
  226. package/hooks/dist/track-context-budget.js +317 -0
  227. package/hooks/dist/validate-commit.js +265 -0
  228. package/hooks/dist/validate-plugin-structure.js +193 -0
  229. package/hooks/dist/validate-skill-args.js +219 -0
  230. package/hooks/dist/validate-task.js +256 -0
  231. package/hooks/dist/worktree-create.js +144 -0
  232. package/hooks/dist/worktree-remove.js +147 -0
  233. package/package.json +53 -40
  234. package/plan-build-run/bin/config-schema.json +406 -0
  235. package/plan-build-run/bin/dashboard-launch.cjs +114 -0
  236. package/plan-build-run/bin/event-logger.cjs +92 -0
  237. package/plan-build-run/bin/lib/alternatives.cjs +198 -0
  238. package/plan-build-run/bin/lib/build.cjs +717 -0
  239. package/plan-build-run/bin/lib/circuit-state.cjs +133 -0
  240. package/plan-build-run/bin/lib/commands.cjs +482 -0
  241. package/plan-build-run/bin/lib/config.cjs +681 -0
  242. package/plan-build-run/bin/lib/context.cjs +216 -0
  243. package/plan-build-run/bin/lib/core.cjs +1548 -0
  244. package/plan-build-run/bin/lib/frontmatter.cjs +299 -0
  245. package/plan-build-run/bin/lib/gates/advisories.cjs +129 -0
  246. package/plan-build-run/bin/lib/gates/build-dependency.cjs +100 -0
  247. package/plan-build-run/bin/lib/gates/build-executor.cjs +79 -0
  248. package/plan-build-run/bin/lib/gates/doc-existence.cjs +46 -0
  249. package/plan-build-run/bin/lib/gates/helpers.cjs +74 -0
  250. package/plan-build-run/bin/lib/gates/milestone-complete.cjs +120 -0
  251. package/plan-build-run/bin/lib/gates/plan-executor.cjs +36 -0
  252. package/plan-build-run/bin/lib/gates/quick-executor.cjs +76 -0
  253. package/plan-build-run/bin/lib/gates/review-planner.cjs +61 -0
  254. package/plan-build-run/bin/lib/gates/review-verifier.cjs +69 -0
  255. package/plan-build-run/bin/lib/history.cjs +147 -0
  256. package/plan-build-run/bin/lib/init.cjs +304 -0
  257. package/plan-build-run/bin/lib/learnings.cjs +312 -0
  258. package/plan-build-run/bin/lib/local-llm/health.cjs +12 -0
  259. package/plan-build-run/bin/lib/local-llm/index.cjs +89 -0
  260. package/plan-build-run/bin/lib/local-llm/metrics.cjs +20 -0
  261. package/plan-build-run/bin/lib/local-llm/operations/classify-artifact.cjs +4 -0
  262. package/plan-build-run/bin/lib/local-llm/operations/classify-commit.cjs +4 -0
  263. package/plan-build-run/bin/lib/local-llm/operations/classify-error.cjs +4 -0
  264. package/plan-build-run/bin/lib/local-llm/operations/classify-file-intent.cjs +4 -0
  265. package/plan-build-run/bin/lib/local-llm/operations/triage-test-output.cjs +12 -0
  266. package/plan-build-run/bin/lib/local-llm/operations/validate-task.cjs +4 -0
  267. package/plan-build-run/bin/lib/migrate.cjs +248 -0
  268. package/plan-build-run/bin/lib/milestone.cjs +245 -0
  269. package/plan-build-run/bin/lib/phase.cjs +1021 -0
  270. package/plan-build-run/bin/lib/preview.cjs +174 -0
  271. package/plan-build-run/bin/lib/reference.cjs +234 -0
  272. package/plan-build-run/bin/lib/roadmap.cjs +909 -0
  273. package/plan-build-run/bin/lib/skill-section.cjs +98 -0
  274. package/plan-build-run/bin/lib/spot-check.cjs +116 -0
  275. package/plan-build-run/bin/lib/state.cjs +641 -0
  276. package/plan-build-run/bin/lib/step-verify.cjs +149 -0
  277. package/plan-build-run/bin/lib/template.cjs +222 -0
  278. package/plan-build-run/bin/lib/todo.cjs +300 -0
  279. package/plan-build-run/bin/lib/verify.cjs +820 -0
  280. package/plan-build-run/bin/pbr-tools.cjs +1287 -0
  281. package/plan-build-run/references/CLAUDE.md +7 -0
  282. package/plan-build-run/references/agent-contracts.md +324 -0
  283. package/plan-build-run/references/agent-teams.md +54 -0
  284. package/plan-build-run/references/behavioral-contexts.md +53 -0
  285. package/plan-build-run/references/checkpoints.md +776 -0
  286. package/plan-build-run/references/config-reference.md +363 -0
  287. package/plan-build-run/references/continuation-format.md +249 -0
  288. package/plan-build-run/references/debugging/CLAUDE.md +7 -0
  289. package/plan-build-run/references/decimal-phase-calculation.md +65 -0
  290. package/plan-build-run/references/git-integration.md +248 -0
  291. package/plan-build-run/references/git-planning-commit.md +38 -0
  292. package/plan-build-run/references/model-profile-resolution.md +34 -0
  293. package/plan-build-run/references/model-profiles.md +92 -0
  294. package/plan-build-run/references/model-selection.md +53 -0
  295. package/plan-build-run/references/phase-argument-parsing.md +61 -0
  296. package/plan-build-run/references/plan-authoring.md +246 -0
  297. package/plan-build-run/references/plan-format.md +351 -0
  298. package/plan-build-run/references/planning-config.md +200 -0
  299. package/plan-build-run/references/questioning.md +162 -0
  300. package/plan-build-run/references/reading-verification.md +93 -0
  301. package/plan-build-run/references/stub-patterns.md +160 -0
  302. package/plan-build-run/references/tdd.md +263 -0
  303. package/plan-build-run/references/ui-brand.md +187 -0
  304. package/plan-build-run/references/verification-overrides.md +38 -0
  305. package/plan-build-run/references/verification-patterns.md +612 -0
  306. package/plan-build-run/references/wave-execution.md +52 -0
  307. package/plan-build-run/skills/audit/SKILL.md +348 -0
  308. package/plan-build-run/skills/begin/SKILL.md +891 -0
  309. package/{plugins/cursor-pbr → plan-build-run}/skills/begin/templates/PROJECT.md.tmpl +0 -1
  310. package/{plugins/cursor-pbr → plan-build-run}/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -1
  311. package/{plugins/cursor-pbr → plan-build-run}/skills/begin/templates/STATE.md.tmpl +1 -3
  312. package/{plugins/cursor-pbr → plan-build-run}/skills/begin/templates/config.json.tmpl +7 -2
  313. package/plan-build-run/skills/begin/templates/project-CONTEXT.md.tmpl +19 -0
  314. package/plan-build-run/skills/begin/templates/researcher-prompt.md.tmpl +47 -0
  315. package/plan-build-run/skills/begin/templates/roadmap-prompt.md.tmpl +49 -0
  316. package/plan-build-run/skills/begin/templates/synthesis-prompt.md.tmpl +44 -0
  317. package/plan-build-run/skills/build/SKILL.md +1007 -0
  318. package/plan-build-run/skills/build/templates/continuation-prompt.md.tmpl +26 -0
  319. package/plan-build-run/skills/build/templates/executor-prompt.md.tmpl +70 -0
  320. package/plan-build-run/skills/build/templates/inline-verifier-prompt.md.tmpl +33 -0
  321. package/plan-build-run/skills/config/SKILL.md +342 -0
  322. package/plan-build-run/skills/continue/SKILL.md +190 -0
  323. package/plan-build-run/skills/dashboard/SKILL.md +12 -0
  324. package/plan-build-run/skills/debug/SKILL.md +539 -0
  325. package/plan-build-run/skills/debug/templates/continuation-prompt.md.tmpl +27 -0
  326. package/plan-build-run/skills/debug/templates/initial-investigation-prompt.md.tmpl +34 -0
  327. package/plan-build-run/skills/discuss/SKILL.md +440 -0
  328. package/{plugins/cursor-pbr → plan-build-run}/skills/discuss/templates/CONTEXT.md.tmpl +1 -2
  329. package/{plugins/cursor-pbr → plan-build-run}/skills/discuss/templates/decision-categories.md +0 -1
  330. package/plan-build-run/skills/discuss/templates/project-CONTEXT.md.tmpl +19 -0
  331. package/plan-build-run/skills/do/SKILL.md +70 -0
  332. package/plan-build-run/skills/explore/SKILL.md +443 -0
  333. package/plan-build-run/skills/health/SKILL.md +332 -0
  334. package/{plugins/cursor-pbr → plan-build-run}/skills/health/templates/check-pattern.md.tmpl +0 -1
  335. package/{plugins/cursor-pbr → plan-build-run}/skills/health/templates/output-format.md.tmpl +0 -1
  336. package/plan-build-run/skills/help/SKILL.md +236 -0
  337. package/plan-build-run/skills/import/SKILL.md +816 -0
  338. package/plan-build-run/skills/milestone/SKILL.md +659 -0
  339. package/plan-build-run/skills/milestone/templates/audit-output.md.tmpl +76 -0
  340. package/{plugins/cursor-pbr → plan-build-run}/skills/milestone/templates/audit-report.md.tmpl +0 -1
  341. package/plan-build-run/skills/milestone/templates/complete-output.md.tmpl +32 -0
  342. package/plan-build-run/skills/milestone/templates/edge-cases.md +54 -0
  343. package/plan-build-run/skills/milestone/templates/gaps-output.md.tmpl +25 -0
  344. package/plan-build-run/skills/milestone/templates/integration-checker-prompt.md.tmpl +25 -0
  345. package/plan-build-run/skills/milestone/templates/new-output.md.tmpl +29 -0
  346. package/{plugins/cursor-pbr → plan-build-run}/skills/milestone/templates/stats-file.md.tmpl +0 -1
  347. package/plan-build-run/skills/note/SKILL.md +221 -0
  348. package/plan-build-run/skills/pause/SKILL.md +259 -0
  349. package/{plugins/cursor-pbr → plan-build-run}/skills/pause/templates/continue-here.md.tmpl +0 -1
  350. package/plan-build-run/skills/plan/SKILL.md +700 -0
  351. package/plan-build-run/skills/plan/decimal-phase-calc.md +98 -0
  352. package/{plugins/cursor-pbr → plan-build-run}/skills/plan/templates/checker-prompt.md.tmpl +0 -1
  353. package/plan-build-run/skills/plan/templates/completion-output.md.tmpl +27 -0
  354. package/{plugins/cursor-pbr → plan-build-run}/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -1
  355. package/{plugins/cursor-pbr → plan-build-run}/skills/plan/templates/planner-prompt.md.tmpl +1 -2
  356. package/plan-build-run/skills/plan/templates/prompt-partials/phase-project-context.md.tmpl +21 -0
  357. package/{plugins/cursor-pbr → plan-build-run}/skills/plan/templates/researcher-prompt.md.tmpl +0 -1
  358. package/{plugins/cursor-pbr → plan-build-run}/skills/plan/templates/revision-prompt.md.tmpl +0 -1
  359. package/plan-build-run/skills/profile/SKILL.md +173 -0
  360. package/plan-build-run/skills/quick/SKILL.md +440 -0
  361. package/plan-build-run/skills/resume/SKILL.md +404 -0
  362. package/plan-build-run/skills/review/SKILL.md +711 -0
  363. package/{plugins/cursor-pbr → plan-build-run}/skills/review/templates/debugger-prompt.md.tmpl +0 -1
  364. package/{plugins/cursor-pbr → plan-build-run}/skills/review/templates/gap-planner-prompt.md.tmpl +0 -1
  365. package/{plugins/cursor-pbr → plan-build-run}/skills/review/templates/verifier-prompt.md.tmpl +0 -1
  366. package/plan-build-run/skills/scan/SKILL.md +326 -0
  367. package/{plugins/cursor-pbr → plan-build-run}/skills/scan/templates/mapper-prompt.md.tmpl +1 -2
  368. package/plan-build-run/skills/setup/SKILL.md +236 -0
  369. package/plan-build-run/skills/shared/commit-planning-docs.md +43 -0
  370. package/plan-build-run/skills/shared/config-loading.md +102 -0
  371. package/plan-build-run/skills/shared/context-budget.md +92 -0
  372. package/plan-build-run/skills/shared/context-loader-task.md +93 -0
  373. package/plan-build-run/skills/shared/digest-select.md +79 -0
  374. package/plan-build-run/skills/shared/domain-probes.md +125 -0
  375. package/plan-build-run/skills/shared/error-reporting.md +67 -0
  376. package/plan-build-run/skills/shared/gate-prompts.md +390 -0
  377. package/plan-build-run/skills/shared/phase-argument-parsing.md +45 -0
  378. package/plan-build-run/skills/shared/revision-loop.md +81 -0
  379. package/plan-build-run/skills/shared/state-update.md +153 -0
  380. package/plan-build-run/skills/shared/universal-anti-patterns.md +59 -0
  381. package/plan-build-run/skills/status/SKILL.md +485 -0
  382. package/plan-build-run/skills/statusline/SKILL.md +151 -0
  383. package/plan-build-run/skills/test/SKILL.md +212 -0
  384. package/plan-build-run/skills/todo/SKILL.md +301 -0
  385. package/plan-build-run/skills/undo/SKILL.md +216 -0
  386. package/plan-build-run/templates/CLAUDE.md +7 -0
  387. package/plan-build-run/templates/DEBUG.md +164 -0
  388. package/plan-build-run/templates/UAT.md +247 -0
  389. package/plan-build-run/templates/VALIDATION.md +76 -0
  390. package/plan-build-run/templates/codebase/architecture.md +255 -0
  391. package/plan-build-run/templates/codebase/concerns.md +310 -0
  392. package/plan-build-run/templates/codebase/conventions.md +307 -0
  393. package/plan-build-run/templates/codebase/integrations.md +280 -0
  394. package/plan-build-run/templates/codebase/stack.md +186 -0
  395. package/plan-build-run/templates/codebase/structure.md +285 -0
  396. package/plan-build-run/templates/codebase/testing.md +480 -0
  397. package/plan-build-run/templates/config.json +37 -0
  398. package/plan-build-run/templates/context.md +297 -0
  399. package/plan-build-run/templates/continue-here.md +78 -0
  400. package/plan-build-run/templates/crud-flow-verification.md +277 -0
  401. package/plan-build-run/templates/debug-subagent-prompt.md +91 -0
  402. package/plan-build-run/templates/deferred-items.md +19 -0
  403. package/plan-build-run/templates/discovery.md +146 -0
  404. package/plan-build-run/templates/milestone-archive.md +123 -0
  405. package/plan-build-run/templates/milestone.md +115 -0
  406. package/plan-build-run/templates/phase-prompt.md +569 -0
  407. package/plan-build-run/templates/planner-subagent-prompt.md +117 -0
  408. package/plan-build-run/templates/project.md +184 -0
  409. package/plan-build-run/templates/requirements.md +231 -0
  410. package/plan-build-run/templates/research-outputs/ARCHITECTURE.md.tmpl +86 -0
  411. package/plan-build-run/templates/research-outputs/FEATURES.md.tmpl +77 -0
  412. package/plan-build-run/templates/research-outputs/PITFALLS.md.tmpl +65 -0
  413. package/plan-build-run/templates/research-outputs/STACK.md.tmpl +80 -0
  414. package/plan-build-run/templates/research-project/ARCHITECTURE.md +204 -0
  415. package/plan-build-run/templates/research-project/FEATURES.md +147 -0
  416. package/plan-build-run/templates/research-project/PITFALLS.md +200 -0
  417. package/plan-build-run/templates/research-project/STACK.md +120 -0
  418. package/plan-build-run/templates/research-project/SUMMARY.md +170 -0
  419. package/plan-build-run/templates/research.md +552 -0
  420. package/plan-build-run/templates/retrospective.md +54 -0
  421. package/plan-build-run/templates/roadmap.md +202 -0
  422. package/plan-build-run/templates/seed.md +16 -0
  423. package/plan-build-run/templates/state.md +176 -0
  424. package/plan-build-run/templates/summary-complex.md +59 -0
  425. package/plan-build-run/templates/summary-minimal.md +41 -0
  426. package/plan-build-run/templates/summary-standard.md +48 -0
  427. package/plan-build-run/templates/summary.md +248 -0
  428. package/plan-build-run/templates/user-setup.md +311 -0
  429. package/plan-build-run/templates/verification-report.md +322 -0
  430. package/plan-build-run/workflows/add-phase.md +111 -0
  431. package/plan-build-run/workflows/add-todo.md +157 -0
  432. package/plan-build-run/workflows/audit-milestone.md +241 -0
  433. package/plan-build-run/workflows/check-todos.md +176 -0
  434. package/plan-build-run/workflows/complete-milestone.md +644 -0
  435. package/plan-build-run/workflows/diagnose-issues.md +219 -0
  436. package/plan-build-run/workflows/discovery-phase.md +289 -0
  437. package/plan-build-run/workflows/discuss-phase.md +429 -0
  438. package/plan-build-run/workflows/execute-phase.md +439 -0
  439. package/plan-build-run/workflows/execute-plan.md +437 -0
  440. package/plan-build-run/workflows/explore.md +150 -0
  441. package/plan-build-run/workflows/help.md +470 -0
  442. package/plan-build-run/workflows/insert-phase.md +129 -0
  443. package/plan-build-run/workflows/list-phase-assumptions.md +178 -0
  444. package/plan-build-run/workflows/map-codebase.md +327 -0
  445. package/plan-build-run/workflows/new-milestone.md +373 -0
  446. package/plan-build-run/workflows/new-project.md +1009 -0
  447. package/plan-build-run/workflows/note.md +90 -0
  448. package/plan-build-run/workflows/pause-work.md +122 -0
  449. package/plan-build-run/workflows/plan-milestone-gaps.md +256 -0
  450. package/plan-build-run/workflows/plan-phase.md +376 -0
  451. package/plan-build-run/workflows/progress.md +431 -0
  452. package/plan-build-run/workflows/quick.md +230 -0
  453. package/plan-build-run/workflows/remove-phase.md +154 -0
  454. package/plan-build-run/workflows/research-phase.md +74 -0
  455. package/plan-build-run/workflows/resume-project.md +306 -0
  456. package/plan-build-run/workflows/set-profile.md +80 -0
  457. package/plan-build-run/workflows/settings.md +145 -0
  458. package/plan-build-run/workflows/transition.md +539 -0
  459. package/plan-build-run/workflows/update.md +212 -0
  460. package/plan-build-run/workflows/verify-phase.md +226 -0
  461. package/plan-build-run/workflows/verify-work.md +465 -0
  462. package/plugins/codex-pbr/.codex/config.toml +101 -0
  463. package/plugins/codex-pbr/AGENTS.md +653 -0
  464. package/plugins/codex-pbr/README.md +116 -0
  465. package/plugins/codex-pbr/agents/audit.md +240 -0
  466. package/plugins/codex-pbr/agents/codebase-mapper.md +225 -0
  467. package/plugins/codex-pbr/agents/debugger.md +300 -0
  468. package/plugins/codex-pbr/agents/dev-sync.md +198 -0
  469. package/plugins/codex-pbr/agents/executor.md +549 -0
  470. package/plugins/codex-pbr/agents/general.md +151 -0
  471. package/plugins/codex-pbr/agents/integration-checker.md +230 -0
  472. package/plugins/codex-pbr/agents/nyquist-auditor.md +244 -0
  473. package/plugins/codex-pbr/agents/plan-checker.md +306 -0
  474. package/plugins/codex-pbr/agents/planner.md +464 -0
  475. package/plugins/codex-pbr/agents/researcher.md +304 -0
  476. package/plugins/codex-pbr/agents/roadmapper.md +339 -0
  477. package/plugins/codex-pbr/agents/synthesizer.md +267 -0
  478. package/plugins/codex-pbr/agents/verifier.md +488 -0
  479. package/plugins/codex-pbr/commands/add-phase.md +75 -0
  480. package/plugins/codex-pbr/commands/add-todo.md +8 -0
  481. package/plugins/codex-pbr/commands/audit-milestone.md +8 -0
  482. package/plugins/codex-pbr/commands/audit.md +5 -0
  483. package/plugins/codex-pbr/commands/check-todos.md +8 -0
  484. package/plugins/codex-pbr/commands/complete-milestone.md +8 -0
  485. package/plugins/codex-pbr/commands/config.md +5 -0
  486. package/plugins/codex-pbr/commands/continue.md +5 -0
  487. package/plugins/codex-pbr/commands/dashboard.md +5 -0
  488. package/plugins/codex-pbr/commands/debug.md +5 -0
  489. package/plugins/codex-pbr/commands/discuss-phase.md +6 -0
  490. package/plugins/codex-pbr/commands/do.md +5 -0
  491. package/plugins/codex-pbr/commands/execute-phase.md +6 -0
  492. package/plugins/codex-pbr/commands/explore.md +5 -0
  493. package/plugins/codex-pbr/commands/health.md +5 -0
  494. package/plugins/codex-pbr/commands/help.md +5 -0
  495. package/plugins/codex-pbr/commands/import.md +5 -0
  496. package/plugins/codex-pbr/commands/insert-phase.md +65 -0
  497. package/plugins/codex-pbr/commands/join-discord.md +11 -0
  498. package/plugins/codex-pbr/commands/list-phase-assumptions.md +69 -0
  499. package/plugins/codex-pbr/commands/map-codebase.md +6 -0
  500. package/plugins/codex-pbr/commands/new-milestone.md +8 -0
  501. package/plugins/codex-pbr/commands/new-project.md +6 -0
  502. package/plugins/codex-pbr/commands/note.md +5 -0
  503. package/plugins/codex-pbr/commands/pause-work.md +5 -0
  504. package/plugins/codex-pbr/commands/plan-milestone-gaps.md +7 -0
  505. package/plugins/codex-pbr/commands/plan-phase.md +6 -0
  506. package/plugins/codex-pbr/commands/progress.md +6 -0
  507. package/plugins/codex-pbr/commands/quick.md +5 -0
  508. package/plugins/codex-pbr/commands/reapply-patches.md +40 -0
  509. package/plugins/codex-pbr/commands/remove-phase.md +66 -0
  510. package/plugins/codex-pbr/commands/research-phase.md +59 -0
  511. package/plugins/codex-pbr/commands/resume-work.md +5 -0
  512. package/plugins/codex-pbr/commands/set-profile.md +6 -0
  513. package/plugins/codex-pbr/commands/settings.md +5 -0
  514. package/plugins/codex-pbr/commands/setup.md +5 -0
  515. package/plugins/codex-pbr/commands/statusline.md +5 -0
  516. package/plugins/codex-pbr/commands/test.md +5 -0
  517. package/plugins/codex-pbr/commands/undo.md +5 -0
  518. package/plugins/codex-pbr/commands/update.md +37 -0
  519. package/plugins/codex-pbr/commands/verify-work.md +6 -0
  520. package/plugins/codex-pbr/references/agent-contracts.md +324 -0
  521. package/plugins/codex-pbr/references/agent-teams.md +54 -0
  522. package/plugins/codex-pbr/references/common-bug-patterns.md +13 -0
  523. package/plugins/codex-pbr/references/config-reference.md +587 -0
  524. package/plugins/codex-pbr/references/continuation-format.md +212 -0
  525. package/plugins/codex-pbr/references/deviation-rules.md +112 -0
  526. package/plugins/codex-pbr/references/git-integration.md +284 -0
  527. package/plugins/codex-pbr/references/integration-patterns.md +117 -0
  528. package/plugins/codex-pbr/references/model-profiles.md +143 -0
  529. package/plugins/codex-pbr/references/model-selection.md +31 -0
  530. package/plugins/codex-pbr/references/pbr-tools-cli.md +400 -0
  531. package/plugins/codex-pbr/references/plan-authoring.md +246 -0
  532. package/plugins/codex-pbr/references/plan-format.md +351 -0
  533. package/plugins/codex-pbr/references/questioning.md +303 -0
  534. package/plugins/codex-pbr/references/reading-verification.md +127 -0
  535. package/plugins/codex-pbr/references/signal-files.md +41 -0
  536. package/plugins/codex-pbr/references/stub-patterns.md +160 -0
  537. package/plugins/codex-pbr/references/tmux-setup.md +286 -0
  538. package/plugins/codex-pbr/references/ui-formatting.md +449 -0
  539. package/plugins/codex-pbr/references/wave-execution.md +95 -0
  540. package/plugins/codex-pbr/skills/audit/SKILL.md +346 -0
  541. package/plugins/codex-pbr/skills/begin/SKILL.md +886 -0
  542. package/plugins/codex-pbr/skills/build/SKILL.md +992 -0
  543. package/plugins/codex-pbr/skills/config/SKILL.md +341 -0
  544. package/plugins/codex-pbr/skills/continue/SKILL.md +172 -0
  545. package/plugins/codex-pbr/skills/dashboard/SKILL.md +56 -0
  546. package/plugins/codex-pbr/skills/debug/SKILL.md +537 -0
  547. package/plugins/codex-pbr/skills/discuss/SKILL.md +438 -0
  548. package/plugins/codex-pbr/skills/do/SKILL.md +68 -0
  549. package/plugins/codex-pbr/skills/explore/SKILL.md +441 -0
  550. package/plugins/codex-pbr/skills/health/SKILL.md +330 -0
  551. package/plugins/codex-pbr/skills/help/SKILL.md +231 -0
  552. package/plugins/codex-pbr/skills/import/SKILL.md +814 -0
  553. package/plugins/codex-pbr/skills/milestone/SKILL.md +637 -0
  554. package/plugins/codex-pbr/skills/note/SKILL.md +219 -0
  555. package/plugins/codex-pbr/skills/pause/SKILL.md +258 -0
  556. package/plugins/codex-pbr/skills/plan/SKILL.md +689 -0
  557. package/plugins/codex-pbr/skills/profile/SKILL.md +171 -0
  558. package/plugins/codex-pbr/skills/quick/SKILL.md +437 -0
  559. package/plugins/codex-pbr/skills/resume/SKILL.md +403 -0
  560. package/plugins/codex-pbr/skills/review/SKILL.md +693 -0
  561. package/plugins/codex-pbr/skills/scan/SKILL.md +325 -0
  562. package/plugins/codex-pbr/skills/setup/SKILL.md +235 -0
  563. package/plugins/codex-pbr/skills/shared/commit-planning-docs.md +43 -0
  564. package/plugins/codex-pbr/skills/shared/config-loading.md +102 -0
  565. package/plugins/codex-pbr/skills/shared/context-budget.md +92 -0
  566. package/plugins/codex-pbr/skills/shared/context-loader-task.md +93 -0
  567. package/plugins/codex-pbr/skills/shared/digest-select.md +79 -0
  568. package/plugins/codex-pbr/skills/shared/domain-probes.md +125 -0
  569. package/plugins/codex-pbr/skills/shared/error-reporting.md +59 -0
  570. package/plugins/codex-pbr/skills/shared/gate-prompts.md +390 -0
  571. package/plugins/codex-pbr/skills/shared/phase-argument-parsing.md +45 -0
  572. package/plugins/codex-pbr/skills/shared/revision-loop.md +81 -0
  573. package/plugins/codex-pbr/skills/shared/state-update.md +153 -0
  574. package/plugins/codex-pbr/skills/shared/universal-anti-patterns.md +59 -0
  575. package/plugins/codex-pbr/skills/status/SKILL.md +484 -0
  576. package/plugins/codex-pbr/skills/statusline/SKILL.md +149 -0
  577. package/plugins/codex-pbr/skills/test/SKILL.md +210 -0
  578. package/plugins/codex-pbr/skills/todo/SKILL.md +281 -0
  579. package/plugins/codex-pbr/skills/undo/SKILL.md +214 -0
  580. package/plugins/codex-pbr/templates/CONTEXT.md.tmpl +52 -0
  581. package/plugins/codex-pbr/templates/INTEGRATION-REPORT.md.tmpl +167 -0
  582. package/plugins/codex-pbr/templates/PROJECT.md.tmpl +111 -0
  583. package/plugins/codex-pbr/templates/REQUIREMENTS.md.tmpl +96 -0
  584. package/plugins/codex-pbr/templates/ROADMAP.md.tmpl +105 -0
  585. package/plugins/codex-pbr/templates/SUMMARY-complex.md.tmpl +112 -0
  586. package/plugins/codex-pbr/templates/SUMMARY-minimal.md.tmpl +48 -0
  587. package/plugins/codex-pbr/templates/SUMMARY.md.tmpl +81 -0
  588. package/plugins/codex-pbr/templates/VERIFICATION-DETAIL.md.tmpl +119 -0
  589. package/plugins/codex-pbr/templates/codebase/ARCHITECTURE.md.tmpl +98 -0
  590. package/plugins/codex-pbr/templates/codebase/CONCERNS.md.tmpl +93 -0
  591. package/plugins/codex-pbr/templates/codebase/CONVENTIONS.md.tmpl +104 -0
  592. package/plugins/codex-pbr/templates/codebase/INTEGRATIONS.md.tmpl +78 -0
  593. package/plugins/codex-pbr/templates/codebase/STACK.md.tmpl +78 -0
  594. package/plugins/codex-pbr/templates/codebase/STRUCTURE.md.tmpl +80 -0
  595. package/plugins/codex-pbr/templates/codebase/TESTING.md.tmpl +107 -0
  596. package/plugins/codex-pbr/templates/continue-here.md.tmpl +73 -0
  597. package/plugins/codex-pbr/templates/pr-body.md.tmpl +22 -0
  598. package/plugins/codex-pbr/templates/project-CONTEXT.md.tmpl +43 -0
  599. package/plugins/codex-pbr/templates/prompt-partials/phase-project-context.md.tmpl +37 -0
  600. package/plugins/codex-pbr/templates/research-outputs/ARCHITECTURE.md.tmpl +91 -0
  601. package/plugins/codex-pbr/templates/research-outputs/FEATURES.md.tmpl +64 -0
  602. package/plugins/codex-pbr/templates/research-outputs/PITFALLS.md.tmpl +50 -0
  603. package/plugins/codex-pbr/templates/research-outputs/STACK.md.tmpl +63 -0
  604. package/plugins/codex-pbr/templates/research-outputs/SUMMARY.md.tmpl +98 -0
  605. package/plugins/copilot-pbr/CHANGELOG.md +19 -0
  606. package/plugins/copilot-pbr/README.md +139 -0
  607. package/plugins/copilot-pbr/agents/audit.agent.md +240 -0
  608. package/plugins/copilot-pbr/agents/codebase-mapper.agent.md +225 -0
  609. package/plugins/copilot-pbr/agents/debugger.agent.md +300 -0
  610. package/plugins/copilot-pbr/agents/dev-sync.agent.md +198 -0
  611. package/plugins/copilot-pbr/agents/executor.agent.md +549 -0
  612. package/plugins/copilot-pbr/agents/general.agent.md +151 -0
  613. package/plugins/copilot-pbr/agents/integration-checker.agent.md +230 -0
  614. package/plugins/copilot-pbr/agents/nyquist-auditor.agent.md +244 -0
  615. package/plugins/copilot-pbr/agents/plan-checker.agent.md +306 -0
  616. package/plugins/copilot-pbr/agents/planner.agent.md +464 -0
  617. package/plugins/copilot-pbr/agents/researcher.agent.md +304 -0
  618. package/plugins/copilot-pbr/agents/roadmapper.agent.md +339 -0
  619. package/plugins/copilot-pbr/agents/synthesizer.agent.md +267 -0
  620. package/plugins/copilot-pbr/agents/verifier.agent.md +488 -0
  621. package/plugins/copilot-pbr/commands/add-phase.md +75 -0
  622. package/plugins/copilot-pbr/commands/add-todo.md +8 -0
  623. package/plugins/copilot-pbr/commands/audit-milestone.md +8 -0
  624. package/plugins/copilot-pbr/commands/audit.md +5 -0
  625. package/plugins/copilot-pbr/commands/check-todos.md +8 -0
  626. package/plugins/copilot-pbr/commands/complete-milestone.md +8 -0
  627. package/plugins/copilot-pbr/commands/config.md +5 -0
  628. package/plugins/copilot-pbr/commands/continue.md +5 -0
  629. package/plugins/copilot-pbr/commands/dashboard.md +5 -0
  630. package/plugins/copilot-pbr/commands/debug.md +5 -0
  631. package/plugins/copilot-pbr/commands/discuss-phase.md +6 -0
  632. package/plugins/copilot-pbr/commands/do.md +5 -0
  633. package/plugins/copilot-pbr/commands/execute-phase.md +6 -0
  634. package/plugins/copilot-pbr/commands/explore.md +5 -0
  635. package/plugins/copilot-pbr/commands/health.md +5 -0
  636. package/plugins/copilot-pbr/commands/help.md +5 -0
  637. package/plugins/copilot-pbr/commands/import.md +5 -0
  638. package/plugins/copilot-pbr/commands/insert-phase.md +65 -0
  639. package/plugins/copilot-pbr/commands/join-discord.md +11 -0
  640. package/plugins/copilot-pbr/commands/list-phase-assumptions.md +69 -0
  641. package/plugins/copilot-pbr/commands/map-codebase.md +6 -0
  642. package/plugins/copilot-pbr/commands/new-milestone.md +8 -0
  643. package/plugins/copilot-pbr/commands/new-project.md +6 -0
  644. package/plugins/copilot-pbr/commands/note.md +5 -0
  645. package/plugins/copilot-pbr/commands/pause-work.md +5 -0
  646. package/plugins/copilot-pbr/commands/plan-milestone-gaps.md +7 -0
  647. package/plugins/copilot-pbr/commands/plan-phase.md +6 -0
  648. package/plugins/copilot-pbr/commands/progress.md +6 -0
  649. package/plugins/copilot-pbr/commands/quick.md +5 -0
  650. package/plugins/copilot-pbr/commands/reapply-patches.md +40 -0
  651. package/plugins/copilot-pbr/commands/remove-phase.md +66 -0
  652. package/plugins/copilot-pbr/commands/research-phase.md +59 -0
  653. package/plugins/copilot-pbr/commands/resume-work.md +5 -0
  654. package/plugins/copilot-pbr/commands/set-profile.md +6 -0
  655. package/plugins/copilot-pbr/commands/settings.md +5 -0
  656. package/plugins/copilot-pbr/commands/setup.md +5 -0
  657. package/plugins/copilot-pbr/commands/statusline.md +5 -0
  658. package/plugins/copilot-pbr/commands/test.md +5 -0
  659. package/plugins/copilot-pbr/commands/undo.md +5 -0
  660. package/plugins/copilot-pbr/commands/update.md +37 -0
  661. package/plugins/copilot-pbr/commands/verify-work.md +6 -0
  662. package/plugins/copilot-pbr/hooks/hooks.json +309 -0
  663. package/plugins/copilot-pbr/plugin.json +30 -0
  664. package/plugins/copilot-pbr/references/agent-contracts.md +324 -0
  665. package/plugins/copilot-pbr/references/agent-teams.md +54 -0
  666. package/plugins/copilot-pbr/references/common-bug-patterns.md +13 -0
  667. package/plugins/copilot-pbr/references/config-reference.md +587 -0
  668. package/plugins/copilot-pbr/references/continuation-format.md +212 -0
  669. package/plugins/copilot-pbr/references/deviation-rules.md +112 -0
  670. package/plugins/copilot-pbr/references/git-integration.md +284 -0
  671. package/plugins/copilot-pbr/references/integration-patterns.md +117 -0
  672. package/plugins/copilot-pbr/references/model-profiles.md +143 -0
  673. package/plugins/copilot-pbr/references/model-selection.md +31 -0
  674. package/plugins/copilot-pbr/references/pbr-tools-cli.md +400 -0
  675. package/plugins/copilot-pbr/references/plan-authoring.md +246 -0
  676. package/plugins/copilot-pbr/references/plan-format.md +351 -0
  677. package/plugins/copilot-pbr/references/questioning.md +303 -0
  678. package/plugins/copilot-pbr/references/reading-verification.md +127 -0
  679. package/plugins/copilot-pbr/references/signal-files.md +41 -0
  680. package/plugins/copilot-pbr/references/stub-patterns.md +160 -0
  681. package/plugins/copilot-pbr/references/tmux-setup.md +286 -0
  682. package/plugins/copilot-pbr/references/ui-formatting.md +449 -0
  683. package/plugins/copilot-pbr/references/wave-execution.md +95 -0
  684. package/plugins/copilot-pbr/rules/pbr-workflow.mdc +48 -0
  685. package/plugins/copilot-pbr/setup.ps1 +93 -0
  686. package/plugins/copilot-pbr/setup.sh +93 -0
  687. package/plugins/copilot-pbr/skills/audit/SKILL.md +346 -0
  688. package/plugins/copilot-pbr/skills/begin/SKILL.md +886 -0
  689. package/plugins/copilot-pbr/skills/build/SKILL.md +992 -0
  690. package/plugins/copilot-pbr/skills/config/SKILL.md +341 -0
  691. package/plugins/copilot-pbr/skills/continue/SKILL.md +172 -0
  692. package/plugins/copilot-pbr/skills/dashboard/SKILL.md +56 -0
  693. package/plugins/copilot-pbr/skills/debug/SKILL.md +537 -0
  694. package/plugins/copilot-pbr/skills/discuss/SKILL.md +438 -0
  695. package/plugins/copilot-pbr/skills/do/SKILL.md +68 -0
  696. package/plugins/copilot-pbr/skills/explore/SKILL.md +441 -0
  697. package/plugins/copilot-pbr/skills/health/SKILL.md +330 -0
  698. package/plugins/copilot-pbr/skills/help/SKILL.md +231 -0
  699. package/plugins/copilot-pbr/skills/import/SKILL.md +814 -0
  700. package/plugins/copilot-pbr/skills/milestone/SKILL.md +637 -0
  701. package/plugins/copilot-pbr/skills/note/SKILL.md +219 -0
  702. package/plugins/copilot-pbr/skills/pause/SKILL.md +258 -0
  703. package/plugins/copilot-pbr/skills/plan/SKILL.md +689 -0
  704. package/plugins/copilot-pbr/skills/profile/SKILL.md +171 -0
  705. package/plugins/copilot-pbr/skills/quick/SKILL.md +437 -0
  706. package/plugins/copilot-pbr/skills/resume/SKILL.md +403 -0
  707. package/plugins/copilot-pbr/skills/review/SKILL.md +693 -0
  708. package/plugins/copilot-pbr/skills/scan/SKILL.md +325 -0
  709. package/plugins/copilot-pbr/skills/setup/SKILL.md +235 -0
  710. package/plugins/copilot-pbr/skills/shared/commit-planning-docs.md +43 -0
  711. package/plugins/copilot-pbr/skills/shared/config-loading.md +102 -0
  712. package/plugins/copilot-pbr/skills/shared/context-budget.md +92 -0
  713. package/plugins/copilot-pbr/skills/shared/context-loader-task.md +93 -0
  714. package/plugins/copilot-pbr/skills/shared/digest-select.md +79 -0
  715. package/plugins/copilot-pbr/skills/shared/domain-probes.md +125 -0
  716. package/plugins/copilot-pbr/skills/shared/error-reporting.md +59 -0
  717. package/plugins/copilot-pbr/skills/shared/gate-prompts.md +390 -0
  718. package/plugins/copilot-pbr/skills/shared/phase-argument-parsing.md +45 -0
  719. package/plugins/copilot-pbr/skills/shared/revision-loop.md +81 -0
  720. package/plugins/copilot-pbr/skills/shared/state-update.md +153 -0
  721. package/plugins/copilot-pbr/skills/shared/universal-anti-patterns.md +59 -0
  722. package/plugins/copilot-pbr/skills/status/SKILL.md +484 -0
  723. package/plugins/copilot-pbr/skills/statusline/SKILL.md +149 -0
  724. package/plugins/copilot-pbr/skills/test/SKILL.md +210 -0
  725. package/plugins/copilot-pbr/skills/todo/SKILL.md +281 -0
  726. package/plugins/copilot-pbr/skills/undo/SKILL.md +214 -0
  727. package/plugins/copilot-pbr/templates/CONTEXT.md.tmpl +52 -0
  728. package/plugins/copilot-pbr/templates/INTEGRATION-REPORT.md.tmpl +167 -0
  729. package/plugins/copilot-pbr/templates/PROJECT.md.tmpl +111 -0
  730. package/plugins/copilot-pbr/templates/REQUIREMENTS.md.tmpl +96 -0
  731. package/plugins/copilot-pbr/templates/ROADMAP.md.tmpl +105 -0
  732. package/plugins/copilot-pbr/templates/SUMMARY-complex.md.tmpl +112 -0
  733. package/plugins/copilot-pbr/templates/SUMMARY-minimal.md.tmpl +48 -0
  734. package/plugins/copilot-pbr/templates/SUMMARY.md.tmpl +81 -0
  735. package/plugins/copilot-pbr/templates/VERIFICATION-DETAIL.md.tmpl +119 -0
  736. package/plugins/copilot-pbr/templates/codebase/ARCHITECTURE.md.tmpl +98 -0
  737. package/plugins/copilot-pbr/templates/codebase/CONCERNS.md.tmpl +93 -0
  738. package/plugins/copilot-pbr/templates/codebase/CONVENTIONS.md.tmpl +104 -0
  739. package/plugins/copilot-pbr/templates/codebase/INTEGRATIONS.md.tmpl +78 -0
  740. package/plugins/copilot-pbr/templates/codebase/STACK.md.tmpl +78 -0
  741. package/plugins/copilot-pbr/templates/codebase/STRUCTURE.md.tmpl +80 -0
  742. package/plugins/copilot-pbr/templates/codebase/TESTING.md.tmpl +107 -0
  743. package/plugins/copilot-pbr/templates/continue-here.md.tmpl +73 -0
  744. package/plugins/copilot-pbr/templates/pr-body.md.tmpl +22 -0
  745. package/plugins/copilot-pbr/templates/project-CONTEXT.md.tmpl +43 -0
  746. package/plugins/copilot-pbr/templates/prompt-partials/phase-project-context.md.tmpl +37 -0
  747. package/plugins/copilot-pbr/templates/research-outputs/ARCHITECTURE.md.tmpl +91 -0
  748. package/plugins/copilot-pbr/templates/research-outputs/FEATURES.md.tmpl +64 -0
  749. package/plugins/copilot-pbr/templates/research-outputs/PITFALLS.md.tmpl +50 -0
  750. package/plugins/copilot-pbr/templates/research-outputs/STACK.md.tmpl +63 -0
  751. package/plugins/copilot-pbr/templates/research-outputs/SUMMARY.md.tmpl +98 -0
  752. package/plugins/cursor-pbr/.cursor-plugin/plugin.json +13 -3
  753. package/plugins/cursor-pbr/README.md +32 -7
  754. package/plugins/cursor-pbr/agents/audit.md +242 -0
  755. package/plugins/cursor-pbr/agents/codebase-mapper.md +134 -15
  756. package/plugins/cursor-pbr/agents/debugger.md +160 -26
  757. package/plugins/cursor-pbr/agents/dev-sync.md +200 -0
  758. package/plugins/cursor-pbr/agents/executor.md +354 -39
  759. package/plugins/cursor-pbr/agents/general.md +70 -4
  760. package/plugins/cursor-pbr/agents/integration-checker.md +171 -26
  761. package/plugins/cursor-pbr/agents/nyquist-auditor.md +246 -0
  762. package/plugins/cursor-pbr/agents/plan-checker.md +152 -42
  763. package/plugins/cursor-pbr/agents/planner.md +315 -29
  764. package/plugins/cursor-pbr/agents/researcher.md +174 -30
  765. package/plugins/cursor-pbr/agents/roadmapper.md +341 -0
  766. package/plugins/cursor-pbr/agents/synthesizer.md +191 -23
  767. package/plugins/cursor-pbr/agents/verifier.md +320 -23
  768. package/plugins/cursor-pbr/commands/add-phase.md +75 -0
  769. package/plugins/cursor-pbr/commands/add-todo.md +8 -0
  770. package/plugins/cursor-pbr/commands/audit-milestone.md +8 -0
  771. package/plugins/cursor-pbr/commands/audit.md +5 -0
  772. package/plugins/cursor-pbr/commands/check-todos.md +8 -0
  773. package/plugins/cursor-pbr/commands/complete-milestone.md +8 -0
  774. package/plugins/cursor-pbr/commands/config.md +5 -0
  775. package/plugins/cursor-pbr/commands/continue.md +5 -0
  776. package/plugins/cursor-pbr/commands/dashboard.md +5 -0
  777. package/plugins/cursor-pbr/commands/debug.md +5 -0
  778. package/plugins/cursor-pbr/commands/discuss-phase.md +6 -0
  779. package/plugins/cursor-pbr/commands/do.md +5 -0
  780. package/plugins/cursor-pbr/commands/execute-phase.md +6 -0
  781. package/plugins/cursor-pbr/commands/explore.md +5 -0
  782. package/plugins/cursor-pbr/commands/health.md +5 -0
  783. package/plugins/cursor-pbr/commands/help.md +5 -0
  784. package/plugins/cursor-pbr/commands/import.md +5 -0
  785. package/plugins/cursor-pbr/commands/insert-phase.md +65 -0
  786. package/plugins/cursor-pbr/commands/join-discord.md +11 -0
  787. package/plugins/cursor-pbr/commands/list-phase-assumptions.md +69 -0
  788. package/plugins/cursor-pbr/commands/map-codebase.md +6 -0
  789. package/plugins/cursor-pbr/commands/new-milestone.md +8 -0
  790. package/plugins/cursor-pbr/commands/new-project.md +6 -0
  791. package/plugins/cursor-pbr/commands/note.md +5 -0
  792. package/plugins/cursor-pbr/commands/pause-work.md +5 -0
  793. package/plugins/cursor-pbr/commands/plan-milestone-gaps.md +7 -0
  794. package/plugins/cursor-pbr/commands/plan-phase.md +6 -0
  795. package/plugins/cursor-pbr/commands/progress.md +6 -0
  796. package/plugins/cursor-pbr/commands/quick.md +5 -0
  797. package/plugins/cursor-pbr/commands/reapply-patches.md +40 -0
  798. package/plugins/cursor-pbr/commands/remove-phase.md +66 -0
  799. package/plugins/cursor-pbr/commands/research-phase.md +59 -0
  800. package/plugins/cursor-pbr/commands/resume-work.md +5 -0
  801. package/plugins/cursor-pbr/commands/set-profile.md +6 -0
  802. package/plugins/cursor-pbr/commands/settings.md +5 -0
  803. package/plugins/cursor-pbr/commands/setup.md +5 -0
  804. package/plugins/cursor-pbr/commands/statusline.md +5 -0
  805. package/plugins/cursor-pbr/commands/test.md +5 -0
  806. package/plugins/cursor-pbr/commands/undo.md +5 -0
  807. package/plugins/cursor-pbr/commands/update.md +37 -0
  808. package/plugins/cursor-pbr/commands/verify-work.md +6 -0
  809. package/plugins/cursor-pbr/hooks/hooks.json +96 -28
  810. package/plugins/cursor-pbr/references/agent-contracts.md +324 -0
  811. package/plugins/cursor-pbr/references/agent-teams.md +3 -4
  812. package/plugins/cursor-pbr/references/common-bug-patterns.md +0 -1
  813. package/plugins/cursor-pbr/references/config-reference.md +155 -10
  814. package/plugins/cursor-pbr/references/continuation-format.md +0 -1
  815. package/plugins/cursor-pbr/references/deviation-rules.md +0 -1
  816. package/plugins/cursor-pbr/references/git-integration.md +80 -23
  817. package/plugins/cursor-pbr/references/integration-patterns.md +0 -1
  818. package/plugins/cursor-pbr/references/model-profiles.md +51 -8
  819. package/plugins/cursor-pbr/references/model-selection.md +1 -2
  820. package/plugins/cursor-pbr/references/pbr-tools-cli.md +400 -0
  821. package/plugins/cursor-pbr/references/plan-authoring.md +65 -1
  822. package/plugins/cursor-pbr/references/plan-format.md +72 -9
  823. package/plugins/cursor-pbr/references/questioning.md +138 -50
  824. package/plugins/cursor-pbr/references/reading-verification.md +3 -4
  825. package/plugins/cursor-pbr/references/signal-files.md +41 -0
  826. package/plugins/cursor-pbr/references/stub-patterns.md +0 -1
  827. package/plugins/cursor-pbr/references/tmux-setup.md +286 -0
  828. package/plugins/cursor-pbr/references/ui-formatting.md +67 -80
  829. package/plugins/cursor-pbr/references/wave-execution.md +0 -1
  830. package/plugins/cursor-pbr/rules/pbr-workflow.mdc +6 -6
  831. package/plugins/cursor-pbr/setup.ps1 +1 -1
  832. package/plugins/cursor-pbr/setup.sh +1 -1
  833. package/plugins/cursor-pbr/skills/audit/SKILL.md +347 -0
  834. package/plugins/cursor-pbr/skills/begin/SKILL.md +461 -141
  835. package/plugins/cursor-pbr/skills/build/SKILL.md +420 -329
  836. package/plugins/cursor-pbr/skills/config/SKILL.md +107 -19
  837. package/plugins/cursor-pbr/skills/continue/SKILL.md +49 -36
  838. package/plugins/cursor-pbr/skills/dashboard/SKILL.md +57 -0
  839. package/plugins/cursor-pbr/skills/debug/SKILL.md +60 -34
  840. package/plugins/cursor-pbr/skills/discuss/SKILL.md +125 -30
  841. package/plugins/cursor-pbr/skills/do/SKILL.md +69 -0
  842. package/plugins/cursor-pbr/skills/explore/SKILL.md +90 -23
  843. package/plugins/cursor-pbr/skills/health/SKILL.md +144 -31
  844. package/plugins/cursor-pbr/skills/help/SKILL.md +124 -45
  845. package/plugins/cursor-pbr/skills/import/SKILL.md +346 -30
  846. package/plugins/cursor-pbr/skills/milestone/SKILL.md +189 -252
  847. package/plugins/cursor-pbr/skills/note/SKILL.md +47 -55
  848. package/plugins/cursor-pbr/skills/pause/SKILL.md +28 -16
  849. package/plugins/cursor-pbr/skills/plan/SKILL.md +305 -263
  850. package/plugins/cursor-pbr/skills/profile/SKILL.md +172 -0
  851. package/plugins/cursor-pbr/skills/quick/SKILL.md +106 -20
  852. package/plugins/cursor-pbr/skills/resume/SKILL.md +31 -27
  853. package/plugins/cursor-pbr/skills/review/SKILL.md +212 -167
  854. package/plugins/cursor-pbr/skills/scan/SKILL.md +47 -23
  855. package/plugins/cursor-pbr/skills/setup/SKILL.md +158 -173
  856. package/plugins/cursor-pbr/skills/shared/commit-planning-docs.md +8 -1
  857. package/plugins/cursor-pbr/skills/shared/config-loading.md +1 -2
  858. package/plugins/cursor-pbr/skills/shared/context-budget.md +56 -5
  859. package/plugins/cursor-pbr/skills/shared/context-loader-task.md +9 -3
  860. package/plugins/cursor-pbr/skills/shared/digest-select.md +2 -3
  861. package/plugins/cursor-pbr/skills/shared/domain-probes.md +1 -2
  862. package/plugins/cursor-pbr/skills/shared/error-reporting.md +38 -59
  863. package/plugins/cursor-pbr/skills/shared/gate-prompts.md +4 -3
  864. package/plugins/cursor-pbr/skills/shared/phase-argument-parsing.md +6 -7
  865. package/plugins/cursor-pbr/skills/shared/revision-loop.md +0 -1
  866. package/plugins/cursor-pbr/skills/shared/state-update.md +38 -47
  867. package/plugins/cursor-pbr/skills/shared/universal-anti-patterns.md +34 -9
  868. package/plugins/cursor-pbr/skills/status/SKILL.md +174 -52
  869. package/plugins/cursor-pbr/skills/statusline/SKILL.md +150 -0
  870. package/plugins/cursor-pbr/skills/test/SKILL.md +211 -0
  871. package/plugins/cursor-pbr/skills/todo/SKILL.md +118 -31
  872. package/plugins/cursor-pbr/skills/undo/SKILL.md +215 -0
  873. package/plugins/cursor-pbr/templates/CONTEXT.md.tmpl +1 -2
  874. package/plugins/cursor-pbr/templates/INTEGRATION-REPORT.md.tmpl +18 -3
  875. package/plugins/cursor-pbr/templates/PROJECT.md.tmpl +111 -0
  876. package/plugins/cursor-pbr/templates/REQUIREMENTS.md.tmpl +96 -0
  877. package/plugins/cursor-pbr/templates/ROADMAP.md.tmpl +80 -16
  878. package/plugins/cursor-pbr/templates/SUMMARY-complex.md.tmpl +112 -0
  879. package/plugins/cursor-pbr/templates/SUMMARY-minimal.md.tmpl +48 -0
  880. package/plugins/cursor-pbr/templates/SUMMARY.md.tmpl +0 -1
  881. package/plugins/cursor-pbr/templates/VERIFICATION-DETAIL.md.tmpl +13 -11
  882. package/plugins/cursor-pbr/templates/codebase/ARCHITECTURE.md.tmpl +98 -0
  883. package/plugins/cursor-pbr/templates/codebase/CONCERNS.md.tmpl +93 -0
  884. package/plugins/cursor-pbr/templates/codebase/CONVENTIONS.md.tmpl +104 -0
  885. package/plugins/cursor-pbr/templates/codebase/INTEGRATIONS.md.tmpl +78 -0
  886. package/plugins/cursor-pbr/templates/codebase/STACK.md.tmpl +78 -0
  887. package/plugins/cursor-pbr/templates/codebase/STRUCTURE.md.tmpl +80 -0
  888. package/plugins/cursor-pbr/templates/codebase/TESTING.md.tmpl +107 -0
  889. package/plugins/cursor-pbr/templates/continue-here.md.tmpl +0 -1
  890. package/plugins/cursor-pbr/templates/pr-body.md.tmpl +22 -0
  891. package/plugins/cursor-pbr/templates/project-CONTEXT.md.tmpl +43 -0
  892. package/plugins/cursor-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -1
  893. package/plugins/cursor-pbr/templates/research-outputs/ARCHITECTURE.md.tmpl +91 -0
  894. package/plugins/cursor-pbr/templates/research-outputs/FEATURES.md.tmpl +64 -0
  895. package/plugins/cursor-pbr/templates/research-outputs/PITFALLS.md.tmpl +50 -0
  896. package/plugins/cursor-pbr/templates/research-outputs/STACK.md.tmpl +63 -0
  897. package/plugins/cursor-pbr/templates/research-outputs/SUMMARY.md.tmpl +98 -0
  898. package/plugins/pbr/.claude-plugin/plugin.json +7 -2
  899. package/plugins/pbr/UI-CONSISTENCY-GAPS.md +1 -1
  900. package/plugins/pbr/agents/audit.md +247 -0
  901. package/plugins/pbr/agents/codebase-mapper.md +151 -18
  902. package/plugins/pbr/agents/debugger.md +180 -28
  903. package/plugins/pbr/agents/dev-sync.md +206 -0
  904. package/plugins/pbr/agents/executor.md +365 -40
  905. package/plugins/pbr/agents/general.md +70 -5
  906. package/plugins/pbr/agents/integration-checker.md +174 -27
  907. package/plugins/pbr/agents/nyquist-auditor.md +252 -0
  908. package/plugins/pbr/agents/plan-checker.md +153 -43
  909. package/plugins/pbr/agents/planner.md +340 -28
  910. package/plugins/pbr/agents/researcher.md +210 -34
  911. package/plugins/pbr/agents/roadmapper.md +346 -0
  912. package/plugins/pbr/agents/synthesizer.md +193 -26
  913. package/plugins/pbr/agents/verifier.md +402 -23
  914. package/plugins/pbr/commands/add-phase.md +75 -0
  915. package/plugins/pbr/commands/add-todo.md +8 -0
  916. package/plugins/pbr/commands/audit-milestone.md +8 -0
  917. package/plugins/pbr/commands/audit.md +5 -0
  918. package/plugins/pbr/commands/check-todos.md +8 -0
  919. package/plugins/pbr/commands/complete-milestone.md +8 -0
  920. package/plugins/pbr/commands/config.md +2 -2
  921. package/plugins/pbr/commands/continue.md +1 -1
  922. package/plugins/pbr/commands/dashboard.md +5 -0
  923. package/plugins/pbr/commands/debug.md +1 -1
  924. package/plugins/pbr/commands/discuss-phase.md +6 -0
  925. package/plugins/pbr/commands/do.md +5 -0
  926. package/plugins/pbr/commands/execute-phase.md +6 -0
  927. package/plugins/pbr/commands/explore.md +1 -1
  928. package/plugins/pbr/commands/health.md +1 -1
  929. package/plugins/pbr/commands/help.md +1 -1
  930. package/plugins/pbr/commands/import.md +1 -1
  931. package/plugins/pbr/commands/insert-phase.md +65 -0
  932. package/plugins/pbr/commands/join-discord.md +11 -0
  933. package/plugins/pbr/commands/list-phase-assumptions.md +69 -0
  934. package/plugins/pbr/commands/map-codebase.md +6 -0
  935. package/plugins/pbr/commands/new-milestone.md +8 -0
  936. package/plugins/pbr/commands/new-project.md +6 -0
  937. package/plugins/pbr/commands/note.md +1 -1
  938. package/plugins/pbr/commands/pause-work.md +5 -0
  939. package/plugins/pbr/commands/plan-milestone-gaps.md +7 -0
  940. package/plugins/pbr/commands/plan-phase.md +6 -0
  941. package/plugins/pbr/commands/progress.md +6 -0
  942. package/plugins/pbr/commands/quick.md +1 -1
  943. package/plugins/pbr/commands/reapply-patches.md +40 -0
  944. package/plugins/pbr/commands/remove-phase.md +66 -0
  945. package/plugins/pbr/commands/research-phase.md +59 -0
  946. package/plugins/pbr/commands/resume-work.md +5 -0
  947. package/plugins/pbr/commands/set-profile.md +6 -0
  948. package/plugins/pbr/commands/settings.md +5 -0
  949. package/plugins/pbr/commands/setup.md +2 -2
  950. package/plugins/pbr/commands/statusline.md +5 -0
  951. package/plugins/pbr/commands/test.md +5 -0
  952. package/plugins/pbr/commands/undo.md +5 -0
  953. package/plugins/pbr/commands/update.md +37 -0
  954. package/plugins/pbr/commands/verify-work.md +6 -0
  955. package/plugins/pbr/dashboard/package-lock.json +6 -0
  956. package/plugins/pbr/hooks/hooks.json +97 -18
  957. package/plugins/pbr/references/agent-contracts.md +324 -0
  958. package/plugins/pbr/references/agent-teams.md +3 -3
  959. package/plugins/pbr/references/{checkpoints.md → archive/checkpoints.md} +32 -0
  960. package/plugins/pbr/references/archive/context-quality-tiers.md +45 -0
  961. package/plugins/{cursor-pbr/references → pbr/references/archive}/pbr-rules.md +4 -4
  962. package/plugins/pbr/references/archive/verification-patterns.md +277 -0
  963. package/plugins/pbr/references/config-reference.md +179 -9
  964. package/plugins/pbr/references/git-integration.md +80 -22
  965. package/plugins/pbr/references/model-profiles.md +62 -7
  966. package/plugins/pbr/references/model-selection.md +1 -1
  967. package/plugins/pbr/references/pbr-tools-cli.md +400 -0
  968. package/plugins/pbr/references/plan-authoring.md +65 -0
  969. package/plugins/pbr/references/plan-format.md +72 -8
  970. package/plugins/pbr/references/questioning.md +138 -49
  971. package/plugins/pbr/references/reading-verification.md +3 -3
  972. package/plugins/pbr/references/signal-files.md +41 -0
  973. package/plugins/pbr/references/tmux-setup.md +286 -0
  974. package/plugins/pbr/references/ui-formatting.md +67 -79
  975. package/plugins/pbr/scripts/auto-continue.js +113 -6
  976. package/plugins/pbr/scripts/block-skill-self-read.js +77 -0
  977. package/plugins/pbr/scripts/branding-audit.js +231 -0
  978. package/plugins/pbr/scripts/check-agent-state-write.js +63 -0
  979. package/plugins/pbr/scripts/check-config-change.js +188 -0
  980. package/plugins/pbr/scripts/check-cross-plugin-sync.js +93 -0
  981. package/plugins/pbr/scripts/check-dangerous-commands.js +49 -1
  982. package/plugins/pbr/scripts/check-phase-boundary.js +2 -8
  983. package/plugins/pbr/scripts/check-plan-format.js +414 -30
  984. package/plugins/pbr/scripts/check-roadmap-sync.js +178 -9
  985. package/plugins/pbr/scripts/check-skill-workflow.js +109 -18
  986. package/plugins/pbr/scripts/check-state-sync.js +156 -20
  987. package/plugins/pbr/scripts/check-subagent-output.js +581 -14
  988. package/plugins/pbr/scripts/check-summary-gate.js +1 -1
  989. package/plugins/pbr/scripts/config-schema.json +157 -2
  990. package/plugins/pbr/scripts/context-bridge.js +342 -0
  991. package/plugins/pbr/scripts/context-budget-check.js +89 -9
  992. package/plugins/pbr/scripts/enforce-pbr-workflow.js +277 -0
  993. package/plugins/pbr/scripts/event-handler.js +72 -6
  994. package/plugins/pbr/scripts/hook-server-client.js +258 -0
  995. package/plugins/pbr/scripts/hook-server.js +334 -0
  996. package/plugins/pbr/scripts/hooks-schema.json +5 -1
  997. package/plugins/pbr/scripts/instructions-loaded.js +107 -0
  998. package/plugins/pbr/scripts/intercept-plan-mode.js +47 -0
  999. package/plugins/pbr/scripts/lib/alternatives.js +203 -0
  1000. package/plugins/pbr/scripts/lib/build.js +719 -0
  1001. package/plugins/pbr/scripts/lib/circuit-state.js +133 -0
  1002. package/plugins/pbr/scripts/lib/config.js +288 -0
  1003. package/plugins/pbr/scripts/lib/context.js +246 -0
  1004. package/plugins/pbr/scripts/lib/core.js +934 -0
  1005. package/plugins/pbr/scripts/lib/gates/advisories.js +129 -0
  1006. package/plugins/pbr/scripts/lib/gates/build-dependency.js +100 -0
  1007. package/plugins/pbr/scripts/lib/gates/build-executor.js +79 -0
  1008. package/plugins/pbr/scripts/lib/gates/doc-existence.js +46 -0
  1009. package/plugins/pbr/scripts/lib/gates/helpers.js +74 -0
  1010. package/plugins/pbr/scripts/lib/gates/milestone-complete.js +120 -0
  1011. package/plugins/pbr/scripts/lib/gates/plan-executor.js +36 -0
  1012. package/plugins/pbr/scripts/lib/gates/quick-executor.js +76 -0
  1013. package/plugins/pbr/scripts/lib/gates/review-planner.js +61 -0
  1014. package/plugins/pbr/scripts/lib/gates/review-verifier.js +69 -0
  1015. package/plugins/pbr/scripts/lib/history.js +150 -0
  1016. package/plugins/pbr/scripts/lib/init.js +302 -0
  1017. package/plugins/pbr/scripts/lib/learnings.js +312 -0
  1018. package/plugins/pbr/scripts/lib/migrate.js +169 -0
  1019. package/plugins/pbr/scripts/lib/phase.js +935 -0
  1020. package/plugins/pbr/scripts/lib/preview.js +174 -0
  1021. package/plugins/pbr/scripts/lib/reference.js +236 -0
  1022. package/plugins/pbr/scripts/lib/roadmap.js +784 -0
  1023. package/plugins/pbr/scripts/lib/skill-section.js +99 -0
  1024. package/plugins/pbr/scripts/lib/spot-check.js +118 -0
  1025. package/plugins/pbr/scripts/lib/state.js +534 -0
  1026. package/plugins/pbr/scripts/lib/step-verify.js +149 -0
  1027. package/plugins/pbr/scripts/lib/todo.js +300 -0
  1028. package/plugins/pbr/scripts/local-llm/client.js +237 -0
  1029. package/plugins/pbr/scripts/local-llm/health.js +220 -0
  1030. package/plugins/pbr/scripts/local-llm/metrics.js +340 -0
  1031. package/plugins/pbr/scripts/local-llm/operations/classify-artifact.js +76 -0
  1032. package/plugins/pbr/scripts/local-llm/operations/classify-commit.js +137 -0
  1033. package/plugins/pbr/scripts/local-llm/operations/classify-error.js +75 -0
  1034. package/plugins/pbr/scripts/local-llm/operations/classify-file-intent.js +171 -0
  1035. package/plugins/pbr/scripts/local-llm/operations/score-source.js +72 -0
  1036. package/plugins/pbr/scripts/local-llm/operations/summarize-context.js +62 -0
  1037. package/plugins/pbr/scripts/local-llm/operations/triage-test-output.js +72 -0
  1038. package/plugins/pbr/scripts/local-llm/operations/validate-task.js +59 -0
  1039. package/plugins/pbr/scripts/local-llm/router.js +101 -0
  1040. package/plugins/pbr/scripts/local-llm/shadow.js +60 -0
  1041. package/plugins/pbr/scripts/local-llm/threshold-tuner.js +118 -0
  1042. package/plugins/pbr/scripts/log-subagent.js +90 -13
  1043. package/plugins/pbr/scripts/log-tool-failure.js +39 -5
  1044. package/plugins/pbr/scripts/milestone-learnings.js +290 -0
  1045. package/plugins/pbr/scripts/package.json +1 -0
  1046. package/plugins/pbr/scripts/pbr-tools.js +1143 -1232
  1047. package/plugins/pbr/scripts/post-bash-triage.js +151 -0
  1048. package/plugins/pbr/scripts/post-write-dispatch.js +181 -25
  1049. package/plugins/pbr/scripts/post-write-quality.js +3 -3
  1050. package/plugins/pbr/scripts/pre-bash-dispatch.js +56 -2
  1051. package/plugins/pbr/scripts/pre-write-dispatch.js +69 -19
  1052. package/plugins/pbr/scripts/progress-tracker.js +428 -19
  1053. package/plugins/pbr/scripts/run-hook.js +49 -8
  1054. package/plugins/pbr/scripts/session-cleanup.js +99 -5
  1055. package/plugins/pbr/scripts/session-tracker.js +78 -0
  1056. package/plugins/pbr/scripts/status-line.js +179 -27
  1057. package/plugins/pbr/scripts/suggest-compact.js +108 -7
  1058. package/plugins/pbr/scripts/sync-context-to-claude.js +100 -0
  1059. package/plugins/pbr/scripts/task-completed.js +123 -1
  1060. package/plugins/pbr/scripts/test/config.test.js +126 -0
  1061. package/plugins/pbr/scripts/test/cross-platform.test.js +131 -0
  1062. package/plugins/pbr/scripts/test/fixtures/config.json +20 -0
  1063. package/plugins/pbr/scripts/test/fixtures/plan.md +54 -0
  1064. package/plugins/pbr/scripts/test/fixtures/project.md +30 -0
  1065. package/plugins/pbr/scripts/test/fixtures/roadmap.md +55 -0
  1066. package/plugins/pbr/scripts/test/fixtures/state.md +60 -0
  1067. package/plugins/pbr/scripts/test/fixtures/summary.md +35 -0
  1068. package/plugins/pbr/scripts/test/fixtures.test.js +184 -0
  1069. package/plugins/pbr/scripts/test/phase.test.js +142 -0
  1070. package/plugins/pbr/scripts/test/roadmap.test.js +96 -0
  1071. package/plugins/pbr/scripts/test/state.test.js +163 -0
  1072. package/plugins/pbr/scripts/track-context-budget.js +237 -89
  1073. package/plugins/pbr/scripts/validate-commit.js +76 -11
  1074. package/plugins/pbr/scripts/validate-skill-args.js +151 -0
  1075. package/plugins/pbr/scripts/validate-task.js +167 -17
  1076. package/plugins/pbr/scripts/worktree-create.js +144 -0
  1077. package/plugins/pbr/scripts/worktree-remove.js +147 -0
  1078. package/plugins/pbr/skills/audit/SKILL.md +348 -0
  1079. package/plugins/pbr/skills/begin/SKILL.md +412 -118
  1080. package/plugins/pbr/skills/begin/templates/STATE.md.tmpl +1 -2
  1081. package/plugins/pbr/skills/begin/templates/config.json.tmpl +8 -2
  1082. package/plugins/pbr/skills/begin/templates/researcher-prompt.md.tmpl +28 -0
  1083. package/plugins/pbr/skills/begin/templates/roadmap-prompt.md.tmpl +19 -0
  1084. package/plugins/pbr/skills/begin/templates/synthesis-prompt.md.tmpl +33 -5
  1085. package/plugins/pbr/skills/build/SKILL.md +503 -307
  1086. package/plugins/pbr/skills/build/templates/continuation-prompt.md.tmpl +26 -0
  1087. package/plugins/pbr/skills/build/templates/executor-prompt.md.tmpl +70 -0
  1088. package/plugins/pbr/skills/build/templates/inline-verifier-prompt.md.tmpl +33 -0
  1089. package/plugins/pbr/skills/config/SKILL.md +104 -18
  1090. package/plugins/pbr/skills/continue/SKILL.md +92 -22
  1091. package/plugins/pbr/skills/dashboard/SKILL.md +58 -0
  1092. package/plugins/pbr/skills/debug/SKILL.md +57 -33
  1093. package/plugins/pbr/skills/debug/templates/continuation-prompt.md.tmpl +12 -1
  1094. package/plugins/pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +12 -5
  1095. package/plugins/pbr/skills/discuss/SKILL.md +123 -30
  1096. package/plugins/pbr/skills/discuss/templates/CONTEXT.md.tmpl +1 -1
  1097. package/plugins/pbr/skills/do/SKILL.md +70 -0
  1098. package/plugins/pbr/skills/explore/SKILL.md +92 -24
  1099. package/plugins/pbr/skills/health/SKILL.md +143 -32
  1100. package/plugins/pbr/skills/help/SKILL.md +122 -45
  1101. package/plugins/pbr/skills/import/SKILL.md +341 -29
  1102. package/plugins/pbr/skills/milestone/SKILL.md +187 -252
  1103. package/plugins/pbr/skills/milestone/templates/audit-output.md.tmpl +76 -0
  1104. package/plugins/pbr/skills/milestone/templates/complete-output.md.tmpl +32 -0
  1105. package/plugins/pbr/skills/milestone/templates/edge-cases.md +54 -0
  1106. package/plugins/pbr/skills/milestone/templates/gaps-output.md.tmpl +25 -0
  1107. package/plugins/pbr/skills/milestone/templates/integration-checker-prompt.md.tmpl +25 -0
  1108. package/plugins/pbr/skills/milestone/templates/new-output.md.tmpl +29 -0
  1109. package/plugins/pbr/skills/note/SKILL.md +45 -55
  1110. package/plugins/pbr/skills/pause/SKILL.md +26 -16
  1111. package/plugins/pbr/skills/plan/SKILL.md +264 -258
  1112. package/plugins/pbr/skills/plan/templates/completion-output.md.tmpl +27 -0
  1113. package/plugins/pbr/skills/plan/templates/planner-prompt.md.tmpl +1 -1
  1114. package/plugins/pbr/skills/profile/SKILL.md +173 -0
  1115. package/plugins/pbr/skills/quick/SKILL.md +104 -20
  1116. package/plugins/pbr/skills/resume/SKILL.md +29 -27
  1117. package/plugins/pbr/skills/review/SKILL.md +172 -136
  1118. package/plugins/pbr/skills/scan/SKILL.md +41 -19
  1119. package/plugins/pbr/skills/scan/templates/mapper-prompt.md.tmpl +1 -1
  1120. package/plugins/pbr/skills/setup/SKILL.md +160 -177
  1121. package/plugins/pbr/skills/shared/commit-planning-docs.md +8 -0
  1122. package/plugins/pbr/skills/shared/context-budget.md +67 -2
  1123. package/plugins/pbr/skills/shared/context-loader-task.md +9 -2
  1124. package/plugins/pbr/skills/shared/digest-select.md +2 -2
  1125. package/plugins/pbr/skills/shared/domain-probes.md +1 -1
  1126. package/plugins/pbr/skills/shared/error-reporting.md +38 -58
  1127. package/plugins/pbr/skills/shared/gate-prompts.md +4 -2
  1128. package/plugins/pbr/skills/shared/phase-argument-parsing.md +6 -6
  1129. package/plugins/pbr/skills/shared/state-update.md +36 -44
  1130. package/plugins/pbr/skills/shared/universal-anti-patterns.md +36 -10
  1131. package/plugins/pbr/skills/status/SKILL.md +161 -43
  1132. package/plugins/pbr/skills/statusline/SKILL.md +151 -0
  1133. package/plugins/pbr/skills/test/SKILL.md +212 -0
  1134. package/plugins/pbr/skills/todo/SKILL.md +117 -32
  1135. package/plugins/pbr/skills/undo/SKILL.md +216 -0
  1136. package/plugins/pbr/templates/CONTEXT.md.tmpl +1 -1
  1137. package/plugins/pbr/templates/INTEGRATION-REPORT.md.tmpl +18 -2
  1138. package/plugins/pbr/templates/PROJECT.md.tmpl +111 -0
  1139. package/plugins/pbr/templates/REQUIREMENTS.md.tmpl +96 -0
  1140. package/plugins/pbr/templates/ROADMAP.md.tmpl +80 -15
  1141. package/plugins/pbr/templates/SUMMARY-complex.md.tmpl +112 -0
  1142. package/plugins/pbr/templates/SUMMARY-minimal.md.tmpl +48 -0
  1143. package/plugins/pbr/templates/VERIFICATION-DETAIL.md.tmpl +13 -10
  1144. package/plugins/pbr/templates/pr-body.md.tmpl +22 -0
  1145. package/plugins/pbr/templates/project-CONTEXT.md.tmpl +43 -0
  1146. package/plugins/pbr/templates/research-outputs/ARCHITECTURE.md.tmpl +91 -0
  1147. package/plugins/pbr/templates/research-outputs/FEATURES.md.tmpl +64 -0
  1148. package/plugins/pbr/templates/research-outputs/PITFALLS.md.tmpl +50 -0
  1149. package/plugins/pbr/templates/research-outputs/STACK.md.tmpl +63 -0
  1150. package/plugins/pbr/templates/research-outputs/SUMMARY.md.tmpl +98 -0
  1151. package/scripts/build-hooks.js +61 -0
  1152. package/scripts/generate-derivatives.js +581 -0
  1153. package/scripts/run-tests.cjs +29 -0
  1154. package/dashboard/bin/cli.js +0 -25
  1155. package/dashboard/public/css/layout.css +0 -406
  1156. package/dashboard/public/css/status-colors.css +0 -98
  1157. package/dashboard/public/js/htmx-title.js +0 -5
  1158. package/dashboard/public/js/sidebar-toggle.js +0 -20
  1159. package/dashboard/src/app.js +0 -78
  1160. package/dashboard/src/middleware/errorHandler.js +0 -52
  1161. package/dashboard/src/middleware/notFoundHandler.js +0 -9
  1162. package/dashboard/src/repositories/planning.repository.js +0 -128
  1163. package/dashboard/src/routes/events.routes.js +0 -40
  1164. package/dashboard/src/routes/index.routes.js +0 -31
  1165. package/dashboard/src/routes/pages.routes.js +0 -252
  1166. package/dashboard/src/server.js +0 -42
  1167. package/dashboard/src/services/dashboard.service.js +0 -286
  1168. package/dashboard/src/services/phase.service.js +0 -226
  1169. package/dashboard/src/services/project.service.js +0 -57
  1170. package/dashboard/src/services/roadmap.service.js +0 -171
  1171. package/dashboard/src/services/sse.service.js +0 -58
  1172. package/dashboard/src/services/todo.service.js +0 -254
  1173. package/dashboard/src/services/watcher.service.js +0 -48
  1174. package/dashboard/src/views/coming-soon.ejs +0 -11
  1175. package/dashboard/src/views/error.ejs +0 -13
  1176. package/dashboard/src/views/index.ejs +0 -5
  1177. package/dashboard/src/views/layout.ejs +0 -1
  1178. package/dashboard/src/views/partials/dashboard-content.ejs +0 -77
  1179. package/dashboard/src/views/partials/footer.ejs +0 -3
  1180. package/dashboard/src/views/partials/head.ejs +0 -21
  1181. package/dashboard/src/views/partials/header.ejs +0 -12
  1182. package/dashboard/src/views/partials/layout-bottom.ejs +0 -15
  1183. package/dashboard/src/views/partials/layout-top.ejs +0 -8
  1184. package/dashboard/src/views/partials/phase-content.ejs +0 -189
  1185. package/dashboard/src/views/partials/phase-doc-content.ejs +0 -38
  1186. package/dashboard/src/views/partials/phases-content.ejs +0 -117
  1187. package/dashboard/src/views/partials/roadmap-content.ejs +0 -142
  1188. package/dashboard/src/views/partials/sidebar.ejs +0 -38
  1189. package/dashboard/src/views/partials/todo-create-content.ejs +0 -53
  1190. package/dashboard/src/views/partials/todo-detail-content.ejs +0 -38
  1191. package/dashboard/src/views/partials/todos-content.ejs +0 -53
  1192. package/dashboard/src/views/phase-detail.ejs +0 -5
  1193. package/dashboard/src/views/phase-doc.ejs +0 -5
  1194. package/dashboard/src/views/phases.ejs +0 -5
  1195. package/dashboard/src/views/roadmap.ejs +0 -5
  1196. package/dashboard/src/views/todo-create.ejs +0 -5
  1197. package/dashboard/src/views/todo-detail.ejs +0 -5
  1198. package/dashboard/src/views/todos.ejs +0 -5
  1199. package/plugins/cursor-pbr/references/agent-anti-patterns.md +0 -25
  1200. package/plugins/cursor-pbr/references/agent-interactions.md +0 -135
  1201. package/plugins/cursor-pbr/references/checkpoints.md +0 -158
  1202. package/plugins/cursor-pbr/references/planning-config.md +0 -214
  1203. package/plugins/cursor-pbr/references/subagent-coordination.md +0 -120
  1204. package/plugins/cursor-pbr/references/verification-patterns.md +0 -199
  1205. package/plugins/cursor-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
  1206. package/plugins/cursor-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
  1207. package/plugins/cursor-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
  1208. package/plugins/cursor-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
  1209. package/plugins/cursor-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
  1210. package/plugins/cursor-pbr/skills/shared/progress-display.md +0 -54
  1211. package/plugins/cursor-pbr/skills/shared/state-loading.md +0 -63
  1212. package/plugins/cursor-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
  1213. package/plugins/pbr/commands/begin.md +0 -5
  1214. package/plugins/pbr/commands/build.md +0 -5
  1215. package/plugins/pbr/commands/discuss.md +0 -5
  1216. package/plugins/pbr/commands/milestone.md +0 -5
  1217. package/plugins/pbr/commands/pause.md +0 -5
  1218. package/plugins/pbr/commands/plan.md +0 -5
  1219. package/plugins/pbr/commands/resume.md +0 -5
  1220. package/plugins/pbr/commands/review.md +0 -5
  1221. package/plugins/pbr/commands/scan.md +0 -5
  1222. package/plugins/pbr/commands/status.md +0 -5
  1223. package/plugins/pbr/commands/todo.md +0 -5
  1224. package/plugins/pbr/references/agent-interactions.md +0 -134
  1225. package/plugins/pbr/references/pbr-rules.md +0 -193
  1226. package/plugins/pbr/references/planning-config.md +0 -213
  1227. package/plugins/pbr/references/subagent-coordination.md +0 -119
  1228. package/plugins/pbr/references/verification-patterns.md +0 -198
  1229. package/plugins/pbr/skills/shared/progress-display.md +0 -53
  1230. package/plugins/pbr/skills/shared/state-loading.md +0 -62
  1231. package/plugins/pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -97
  1232. package/plugins/pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
  1233. package/plugins/pbr/templates/research/STACK.md.tmpl +0 -71
  1234. package/plugins/pbr/templates/research/SUMMARY.md.tmpl +0 -112
  1235. package/plugins/pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
  1236. package/plugins/pbr/templates/research-outputs/project-research.md.tmpl +0 -99
  1237. package/plugins/pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
  1238. /package/plugins/pbr/references/{agent-anti-patterns.md → archive/agent-anti-patterns.md} +0 -0
@@ -0,0 +1,1287 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * PBR Tools -- CLI dispatcher for Plan-Build-Run workflow operations
5
+ *
6
+ * Thin dispatcher that imports from lib/ modules. All core logic lives in:
7
+ * lib/core.cjs -- Foundation utilities (parsers, file ops, constants)
8
+ * lib/config.cjs -- Config loading, validation, depth profiles
9
+ * lib/state.cjs -- STATE.md operations (load, update, patch, advance)
10
+ * lib/roadmap.cjs -- ROADMAP.md operations (parse, update status/plans)
11
+ * lib/phase.cjs -- Phase operations (add, remove, list, info, plan-index)
12
+ * lib/init.cjs -- Compound init commands (execute-phase, plan-phase, etc.)
13
+ * lib/history.cjs -- History operations (append, load)
14
+ * lib/todo.cjs -- Todo operations (list, get, add, done)
15
+ * lib/build.cjs -- Build pipeline (staleness, gates, checkpoints, seeds, CI)
16
+ * lib/learnings.cjs -- Learning ingestion, query, threshold checks
17
+ * lib/local-llm/ -- Local LLM operations (health, classify, score, summarize)
18
+ * lib/verify.cjs -- Verification suite + consistency/health validation
19
+ * lib/frontmatter.cjs -- Frontmatter CRUD
20
+ * lib/commands.cjs -- Standalone utility commands (commit, scaffold, etc.)
21
+ * lib/template.cjs -- Template selection and fill
22
+ * lib/milestone.cjs -- Milestone and requirements lifecycle
23
+ *
24
+ * Skills/agents call this via:
25
+ * node pbr-tools.cjs <command> [args] [--raw] [--cwd <path>]
26
+ *
27
+ * Environment: PBR_PROJECT_ROOT -- Override project root directory
28
+ *
29
+ * Commands:
30
+ *
31
+ * STATE OPERATIONS:
32
+ * state load Full project state as JSON
33
+ * state check-progress Recalculate progress from filesystem
34
+ * state update <field> <value> Atomically update a STATE.md field
35
+ * state get [section] Get STATE.md content or section
36
+ * state json Output STATE.md frontmatter as JSON
37
+ * state patch --field val ... Batch update STATE.md fields
38
+ * state advance-plan Increment plan counter
39
+ * state record-metric --phase N Record execution metrics
40
+ * --plan M --duration Xmin [--tasks N] [--files N]
41
+ * state update-progress Recalculate progress bar
42
+ * state add-decision --summary "..." Add decision to STATE.md
43
+ * [--phase N] [--rationale "..."] [--summary-file path] [--rationale-file path]
44
+ * state add-blocker --text "..." Add blocker
45
+ * state resolve-blocker --text "..." Remove blocker
46
+ * state record-session --stopped-at "..." [--resume-file path]
47
+ * state record-activity <description> Record activity in STATE.md
48
+ * state-bundle <phase> Full state bundle for a phase
49
+ * state-snapshot Structured parse of STATE.md
50
+ *
51
+ * CONFIG OPERATIONS:
52
+ * config validate Validate config.json against schema
53
+ * config load-defaults Load user defaults from home dir
54
+ * config save-defaults Save current config as user defaults
55
+ * config resolve-depth [dir] Resolve depth profile from config
56
+ * config get <key> Get a config value by dotted key
57
+ * config set <key> <value> Set a config value
58
+ * config-ensure-section Initialize .planning/config.json
59
+ * config-get <key> Legacy alias for config get
60
+ * config-set <key> <value> Legacy alias for config set
61
+ *
62
+ * PHASE OPERATIONS:
63
+ * phase add <slug> [--after N] [--goal "..."] [--depends-on N]
64
+ * phase remove <N> Remove an empty phase directory
65
+ * phase list List all phase directories with status
66
+ * phase complete <N> Mark phase done, advance STATE.md
67
+ * phase insert <N> <slug> [--goal "..."] [--depends-on N]
68
+ * phase info <N> Comprehensive single-phase status
69
+ * phase commits-for <N> Read phase manifest, output commits JSON
70
+ * phase first-last-commit <N> Output first/last commit hashes
71
+ * phase next-decimal <phase> Calculate next decimal phase number
72
+ * phases list [--type T] [--phase N] [--include-archived]
73
+ * phase-info <N> Alias for phase info
74
+ * phase-plan-index <phase> Index plans with waves and status
75
+ * find-phase <phase> Find phase directory by number
76
+ * plan-index <phase> Plan inventory for a phase
77
+ * must-haves <phase> Collect all must-haves from phase plans
78
+ *
79
+ * ROADMAP OPERATIONS:
80
+ * roadmap get-phase <phase> Extract phase section from ROADMAP.md
81
+ * roadmap analyze Full roadmap parse with disk status
82
+ * roadmap update-plan-progress <N> Update progress table row from disk
83
+ * roadmap update-status <N> <status> Update phase status in ROADMAP.md
84
+ * roadmap update-plans <N> <c> <t> Update phase plans in ROADMAP.md
85
+ * roadmap append-phase <slug> ... Append new phase to roadmap
86
+ * roadmap remove-phase <N> Remove phase from roadmap
87
+ * roadmap insert-phase <N> <slug> Insert phase into roadmap
88
+ *
89
+ * INIT (COMPOUND COMMANDS):
90
+ * init execute-phase <phase> All context for execute-phase workflow
91
+ * init plan-phase <phase> All context for plan-phase workflow
92
+ * init new-project All context for new-project workflow
93
+ * init new-milestone All context for new-milestone workflow
94
+ * init quick <description> All context for quick workflow
95
+ * init resume All context for resume-project workflow
96
+ * init verify-work <phase> All context for verify-work workflow
97
+ * init phase-op <phase> Generic phase operation context
98
+ * init todos [area] All context for todo workflows
99
+ * init milestone-op All context for milestone operations
100
+ * init map-codebase All context for map-codebase workflow
101
+ * init progress All context for progress workflow
102
+ *
103
+ * TODO OPERATIONS:
104
+ * todo list [--theme T] [--status S] List todos as JSON
105
+ * todo get <NNN> Get a specific todo by number
106
+ * todo add <title> [--priority P] [--theme T] [--source S]
107
+ * todo done <NNN> Mark a todo as complete
108
+ *
109
+ * HISTORY:
110
+ * history append <type> <title> [body] Append record to STATE.md History
111
+ * history load Load history records as JSON
112
+ * history-digest Aggregate all SUMMARY.md data
113
+ *
114
+ * LEARNINGS:
115
+ * learnings ingest <json-file> Ingest a learning entry
116
+ * learnings query [--tags X] [--min-confidence Y] [--stack S] [--type T]
117
+ * learnings check-thresholds Check deferral trigger conditions
118
+ *
119
+ * BUILD PIPELINE:
120
+ * staleness-check <phase-slug> Check if phase plans are stale
121
+ * summary-gate <phase-slug> <plan-id> Verify SUMMARY.md for a plan
122
+ * checkpoint init <slug> [--plans ids] Initialize checkpoint manifest
123
+ * checkpoint update <slug> --wave N --resolved id [--sha hash]
124
+ * seeds match <slug> <phase-number> Find matching seed files
125
+ * ci-poll <run-id> [--timeout <secs>] Poll CI run status
126
+ * rollback <manifest-path> Rollback from manifest
127
+ * build-preview <phase-slug> Preview what build would do
128
+ *
129
+ * LLM OPERATIONS:
130
+ * llm health Check local LLM availability
131
+ * llm status Show LLM config status
132
+ * llm classify <PLAN|SUMMARY> <file> Classify artifact via LLM
133
+ * llm score-source <url> <file> Score a source via LLM
134
+ * llm classify-error <file> [agent] Classify error via LLM
135
+ * llm summarize <file> [max-words] Summarize context via LLM
136
+ * llm metrics [--session <ISO>] LLM usage metrics
137
+ * llm adjust-thresholds Suggest threshold adjustments
138
+ *
139
+ * SESSION:
140
+ * session get <key> [--session-id <id>]
141
+ * session set <key> <value> [--session-id <id>]
142
+ * session clear [key] [--session-id <id>]
143
+ * session dump [--session-id <id>]
144
+ *
145
+ * CLAIMS:
146
+ * claim acquire <slug> --session-id <id> --skill <name>
147
+ * claim release <slug> --session-id <id>
148
+ * claim list
149
+ *
150
+ * VERIFICATION:
151
+ * verify plan-structure <file> Check PLAN.md structure + tasks
152
+ * verify phase-completeness <phase> Check all plans have summaries
153
+ * verify references <file> Check @-refs + paths resolve
154
+ * verify commits <h1> [h2] ... Batch verify commit hashes
155
+ * verify artifacts <plan-file> Check must_haves.artifacts
156
+ * verify key-links <plan-file> Check must_haves.key_links
157
+ * verify-summary <path> Verify a SUMMARY.md file
158
+ * validate consistency Check phase/roadmap sync
159
+ * validate health [--repair] Check .planning/ integrity
160
+ * validate-project Comprehensive integrity check
161
+ *
162
+ * FRONTMATTER:
163
+ * frontmatter get <file> [--field k]
164
+ * frontmatter set <file> --field k --value v
165
+ * frontmatter merge <file> --data '{json}'
166
+ * frontmatter validate <file> --schema plan|summary|verification
167
+ * frontmatter <filepath> Parse frontmatter (reference compat)
168
+ *
169
+ * TEMPLATES:
170
+ * template select <plan-path> Select template type for a plan
171
+ * template fill summary|plan|verification --phase N [options]
172
+ *
173
+ * MILESTONES:
174
+ * milestone complete <version> [--name <name>] [--archive-phases]
175
+ * milestone stats <version> Milestone statistics
176
+ * milestone-stats <version> Alias for milestone stats
177
+ *
178
+ * REQUIREMENTS:
179
+ * requirements mark-complete <ids> Mark requirement IDs as complete
180
+ *
181
+ * SCAFFOLDING:
182
+ * scaffold context|uat|verification|phase-dir --phase <N> [--name <name>]
183
+ *
184
+ * UTILITY:
185
+ * resolve-model <agent-type> Get model for agent based on profile
186
+ * generate-slug <text> Convert text to URL-safe slug
187
+ * current-timestamp [format] Get timestamp (full|date|filename)
188
+ * verify-path-exists <path> Check file/directory existence
189
+ * summary-extract <path> [--fields] Extract structured data from SUMMARY.md
190
+ * websearch <query> [--limit N] [--freshness day|week|month]
191
+ * progress [json|table|bar] Render progress in various formats
192
+ * commit <message> [--files f1 f2] Commit planning docs
193
+ *
194
+ * REFERENCE & SKILLS:
195
+ * reference <name> [--section heading] [--list]
196
+ * skill-section <skill> <section>
197
+ * skill-section --list <skill>
198
+ * step-verify <skill> <step> <checklist-json>
199
+ * context-triage [--agents-done N] [--plans-total N] [--step NAME]
200
+ * suggest-alternatives phase-not-found|missing-prereq|config-invalid [args]
201
+ * spot-check <phaseSlug> <planId>
202
+ *
203
+ * MIGRATION & EVENTS:
204
+ * migrate [--dry-run] [--force] Run schema migrations
205
+ * event <category> <event> [details] Log an event
206
+ * tmux detect Detect tmux environment
207
+ *
208
+ * HELP:
209
+ * help Show this help message
210
+ */
211
+
212
+ const fs = require('fs');
213
+ const path = require('path');
214
+
215
+ // ─── Module-level planningDir with MSYS path bridging ─────────────────────────
216
+
217
+ let cwd = process.env.PBR_PROJECT_ROOT || process.cwd();
218
+ const msysMatch = cwd.match(/^\/([a-zA-Z])\/(.*)/);
219
+ if (msysMatch) cwd = msysMatch[1] + ':' + path.sep + msysMatch[2].replace(/\//g, path.sep);
220
+ let planningDir = path.join(cwd, '.planning');
221
+
222
+ // ─── Lazy module loaders ──────────────────────────────────────────────────────
223
+ // Each module is loaded on first use to minimize startup time
224
+
225
+ let _core, _config, _state, _phase, _roadmap, _init;
226
+ let _history, _todo, _learnings, _spotCheck, _build, _llm;
227
+ let _verify, _frontmatter, _commands, _template, _milestone;
228
+ let _reference, _skillSection, _stepVerify, _preview, _context;
229
+ let _alternatives, _migrate, _circuitState;
230
+
231
+ function getCore() { if (!_core) _core = require('./lib/core.cjs'); return _core; }
232
+ function getConfig() { if (!_config) _config = require('./lib/config.cjs'); return _config; }
233
+ function getState() { if (!_state) _state = require('./lib/state.cjs'); return _state; }
234
+ function getPhase() { if (!_phase) _phase = require('./lib/phase.cjs'); return _phase; }
235
+ function getRoadmap() { if (!_roadmap) _roadmap = require('./lib/roadmap.cjs'); return _roadmap; }
236
+ function getInit() { if (!_init) _init = require('./lib/init.cjs'); return _init; }
237
+ function getHistory() { if (!_history) _history = require('./lib/history.cjs'); return _history; }
238
+ function getTodo() { if (!_todo) _todo = require('./lib/todo.cjs'); return _todo; }
239
+ function getLearnings() { if (!_learnings) _learnings = require('./lib/learnings.cjs'); return _learnings; }
240
+ function getSpotCheck() { if (!_spotCheck) _spotCheck = require('./lib/spot-check.cjs'); return _spotCheck; }
241
+ function getBuild() { if (!_build) _build = require('./lib/build.cjs'); return _build; }
242
+ function getLlm() { if (!_llm) _llm = require('./lib/local-llm/index.cjs'); return _llm; }
243
+ function getVerify() { if (!_verify) _verify = require('./lib/verify.cjs'); return _verify; }
244
+ function getFrontmatter() { if (!_frontmatter) _frontmatter = require('./lib/frontmatter.cjs'); return _frontmatter; }
245
+ function getCommands() { if (!_commands) _commands = require('./lib/commands.cjs'); return _commands; }
246
+ function getTemplate() { if (!_template) _template = require('./lib/template.cjs'); return _template; }
247
+ function getMilestone() { if (!_milestone) _milestone = require('./lib/milestone.cjs'); return _milestone; }
248
+ function getReference() { if (!_reference) _reference = require('./lib/reference.cjs'); return _reference; }
249
+ function getSkillSection() { if (!_skillSection) _skillSection = require('./lib/skill-section.cjs'); return _skillSection; }
250
+ function getStepVerify() { if (!_stepVerify) _stepVerify = require('./lib/step-verify.cjs'); return _stepVerify; }
251
+ function getPreview() { if (!_preview) _preview = require('./lib/preview.cjs'); return _preview; }
252
+ function getContext() { if (!_context) _context = require('./lib/context.cjs'); return _context; }
253
+ function getAlternatives() { if (!_alternatives) _alternatives = require('./lib/alternatives.cjs'); return _alternatives; }
254
+ function getMigrate() { if (!_migrate) _migrate = require('./lib/migrate.cjs'); return _migrate; }
255
+
256
+ // ─── Helper: resolve plugin root ──────────────────────────────────────────────
257
+
258
+ function resolvePluginRoot() {
259
+ const pluginRoot = process.env.PBR_PLUGIN_ROOT || path.resolve(__dirname, '..');
260
+ let root = pluginRoot;
261
+ const m = root.match(/^\/([a-zA-Z])\/(.*)/);
262
+ if (m) root = m[1] + ':' + path.sep + m[2].replace(/\//g, path.sep);
263
+ return root;
264
+ }
265
+
266
+ // ─── Wrapper functions (bridge planningDir to lib pure functions) ──────────────
267
+
268
+ function configLoad(dir) { return getConfig().configLoad(dir || planningDir); }
269
+ function configValidate(preloaded) { return getConfig().configValidate(preloaded, planningDir); }
270
+
271
+ function stateLoad() { return getState().stateLoad(planningDir); }
272
+ function stateCheckProgress() { return getState().stateCheckProgress(planningDir); }
273
+ function stateUpdate(field, value) { return getState().stateUpdate(field, value, planningDir); }
274
+ function statePatch(jsonStr) { return getState().statePatch(jsonStr, planningDir); }
275
+ function stateAdvancePlan() { return getState().stateAdvancePlan(planningDir); }
276
+ function stateRecordMetric(metricArgs) { return getState().stateRecordMetric(metricArgs, planningDir); }
277
+ function stateRecordActivity(desc) { return getState().stateRecordActivity(desc, planningDir); }
278
+ function stateUpdateProgress() { return getState().stateUpdateProgress(planningDir); }
279
+ function stateGetStatus() { return getState().stateGetStatus(planningDir); }
280
+ function stateSnapshot() { return getState().stateSnapshot(planningDir); }
281
+
282
+ function roadmapAnalyze() { return getRoadmap().roadmapAnalyze(planningDir); }
283
+ function roadmapUpdateStatus(p, s) { return getRoadmap().roadmapUpdateStatus(p, s, planningDir); }
284
+ function roadmapUpdatePlans(p, c, t) { return getRoadmap().roadmapUpdatePlans(p, c, t, planningDir); }
285
+ function roadmapUpdatePlanProgress(p) { return getRoadmap().roadmapUpdatePlanProgress(p, planningDir); }
286
+ function roadmapGetPhase(p) { return getRoadmap().roadmapGetPhase(p, planningDir); }
287
+ function roadmapAppendPhase(slug, opts) { return getRoadmap().roadmapAppendPhase(slug, planningDir, opts); }
288
+ function roadmapRemovePhase(p) { return getRoadmap().roadmapRemovePhase(p, planningDir); }
289
+ function roadmapInsertPhase(pos, slug, opts) { return getRoadmap().roadmapInsertPhase(pos, slug, planningDir, opts); }
290
+
291
+ function phaseFrontmatter(fp) { return getPhase().frontmatter(fp); }
292
+ function phasePlanIndex(p) { return getPhase().phasePlanIndex(p, planningDir); }
293
+ function phaseMustHaves(p) { return getPhase().phaseMustHaves(p, planningDir); }
294
+ function phaseInfo(p) { return getPhase().phaseInfo(p, planningDir); }
295
+ function phaseAdd(slug, after, opts) { return getPhase().phaseAdd(slug, after, planningDir, opts); }
296
+ function phaseRemove(p) { return getPhase().phaseRemove(p, planningDir); }
297
+ function phaseList() { return getPhase().phaseList(planningDir); }
298
+ function phaseComplete(p) { return getPhase().phaseComplete(p, planningDir); }
299
+ function phaseInsert(pos, slug, opts) { return getPhase().phaseInsert(pos, slug, planningDir, opts); }
300
+ function phaseCommitsFor(p) { return getPhase().phaseCommitsFor(p, planningDir); }
301
+ function phaseFirstLastCommit(p) { return getPhase().phaseFirstLastCommit(p, planningDir); }
302
+ function milestoneStats(v) { return getPhase().milestoneStats(v, planningDir); }
303
+
304
+ function initExecutePhase(p, dir, model) { return getInit().initExecutePhase(p, dir || planningDir, model); }
305
+ function initPlanPhase(p, dir, model) { return getInit().initPlanPhase(p, dir || planningDir, model); }
306
+ function initQuick(desc) { return getInit().initQuick(desc, planningDir); }
307
+ function initVerifyWork(p, dir, model) { return getInit().initVerifyWork(p, dir || planningDir, model); }
308
+ function initResume() { return getInit().initResume(planningDir); }
309
+ function initProgress() { return getInit().initProgress(planningDir); }
310
+ function initStateBundle(p) { return getInit().initStateBundle(p, planningDir); }
311
+
312
+ function historyAppend(entry, dir) { return getHistory().historyAppend(entry, dir || planningDir); }
313
+ function historyLoad(dir) { return getHistory().historyLoad(dir || planningDir); }
314
+
315
+ function todoList(opts) { return getTodo().todoList(planningDir, opts); }
316
+ function todoGet(num) { return getTodo().todoGet(planningDir, num); }
317
+ function todoAdd(title, opts) { return getTodo().todoAdd(planningDir, title, opts); }
318
+ function todoDone(num) { return getTodo().todoDone(planningDir, num); }
319
+
320
+ function spotCheck(phaseSlug, planId) { return getSpotCheck().spotCheck(planningDir, phaseSlug, planId); }
321
+
322
+ function stalenessCheck(slug) { return getBuild().stalenessCheck(slug, planningDir); }
323
+ function summaryGate(slug, planId) { return getBuild().summaryGate(slug, planId, planningDir); }
324
+ function checkpointInit(slug, plans) { return getBuild().checkpointInit(slug, plans, planningDir); }
325
+ function checkpointUpdate(slug, opts) { return getBuild().checkpointUpdate(slug, opts, planningDir); }
326
+ function seedsMatch(slug, num) { return getBuild().seedsMatch(slug, num, planningDir); }
327
+ function ciPoll(runId, timeout) { return getBuild().ciPoll(runId, timeout, planningDir); }
328
+ function rollbackPlan(manifest) { return getBuild().rollback(manifest, planningDir); }
329
+
330
+ function referenceGet(name, opts) {
331
+ return getReference().referenceGet(name, opts, resolvePluginRoot());
332
+ }
333
+
334
+ function skillSectionGet(skill, query) {
335
+ return getSkillSection().skillSection(skill, query, resolvePluginRoot());
336
+ }
337
+
338
+ function listSkillHeadings(skill) {
339
+ const root = resolvePluginRoot();
340
+ const available = getSkillSection().listAvailableSkills(root);
341
+ const skillPath = path.join(root, 'skills', skill, 'SKILL.md');
342
+ if (!fs.existsSync(skillPath)) {
343
+ return { error: `Skill not found: ${skill}`, available };
344
+ }
345
+ const content = fs.readFileSync(skillPath, 'utf8');
346
+ return { skill, headings: getReference().listHeadings(content) };
347
+ }
348
+
349
+ function contextTriage(opts) {
350
+ return getContext().contextTriage(opts, planningDir);
351
+ }
352
+
353
+ // ─── validateProject (cross-cutting) ──────────────────────────────────────────
354
+
355
+ function validateProject() {
356
+ const core = getCore();
357
+ const checks = [];
358
+ const errors = [];
359
+ const warnings = [];
360
+
361
+ if (!fs.existsSync(planningDir)) {
362
+ return { valid: false, errors: ['.planning/ directory not found'], warnings: [], checks: ['directory_exists: FAIL'] };
363
+ }
364
+ checks.push('directory_exists: PASS');
365
+
366
+ const config = configLoad();
367
+ if (!config) {
368
+ errors.push('config.json missing or invalid JSON');
369
+ checks.push('config_valid: FAIL');
370
+ } else {
371
+ const configResult = configValidate(config);
372
+ if (!configResult.valid) errors.push(...configResult.errors.map(e => 'config: ' + e));
373
+ warnings.push(...(configResult.warnings || []).map(w => 'config: ' + w));
374
+ checks.push('config_valid: ' + (configResult.valid ? 'PASS' : 'FAIL'));
375
+ }
376
+
377
+ const statePath = path.join(planningDir, 'STATE.md');
378
+ if (!fs.existsSync(statePath)) {
379
+ errors.push('STATE.md not found');
380
+ checks.push('state_exists: FAIL');
381
+ } else {
382
+ try {
383
+ const stateContent = fs.readFileSync(statePath, 'utf8');
384
+ const fm = core.parseYamlFrontmatter(stateContent);
385
+ if (!fm || !fm.current_phase) {
386
+ warnings.push('STATE.md frontmatter missing current_phase');
387
+ checks.push('state_frontmatter: WARN');
388
+ } else {
389
+ checks.push('state_frontmatter: PASS');
390
+ }
391
+ } catch (e) {
392
+ errors.push('STATE.md unreadable: ' + e.message);
393
+ checks.push('state_readable: FAIL');
394
+ }
395
+ }
396
+
397
+ const roadmapPath = path.join(planningDir, 'ROADMAP.md');
398
+ if (!fs.existsSync(roadmapPath)) {
399
+ warnings.push('ROADMAP.md not found (may be a new project)');
400
+ checks.push('roadmap_exists: WARN');
401
+ } else {
402
+ checks.push('roadmap_exists: PASS');
403
+ }
404
+
405
+ return { valid: errors.length === 0, errors, warnings, checks };
406
+ }
407
+
408
+ // ─── CLI entry point ──────────────────────────────────────────────────────────
409
+
410
+ async function main() {
411
+ const args = process.argv.slice(2);
412
+ const { output, error } = getCore();
413
+
414
+ // --cwd override
415
+ const cwdEqArg = args.find(arg => arg.startsWith('--cwd='));
416
+ const cwdIdx = args.indexOf('--cwd');
417
+ if (cwdEqArg) {
418
+ const value = cwdEqArg.slice('--cwd='.length).trim();
419
+ if (!value) error('Missing value for --cwd');
420
+ args.splice(args.indexOf(cwdEqArg), 1);
421
+ cwd = path.resolve(value);
422
+ planningDir = path.join(cwd, '.planning');
423
+ } else if (cwdIdx !== -1) {
424
+ const value = args[cwdIdx + 1];
425
+ if (!value || value.startsWith('--')) error('Missing value for --cwd');
426
+ args.splice(cwdIdx, 2);
427
+ cwd = path.resolve(value);
428
+ planningDir = path.join(cwd, '.planning');
429
+ }
430
+
431
+ if (!fs.existsSync(cwd) || !fs.statSync(cwd).isDirectory()) {
432
+ error(`Invalid --cwd: ${cwd}`);
433
+ }
434
+
435
+ // --raw flag
436
+ const rawIndex = args.indexOf('--raw');
437
+ const raw = rawIndex !== -1;
438
+ if (rawIndex !== -1) args.splice(rawIndex, 1);
439
+
440
+ const command = args[0];
441
+ const subcommand = args[1];
442
+
443
+ if (!command || command === 'help') {
444
+ // Print help from the header comment
445
+ const selfContent = fs.readFileSync(__filename, 'utf8');
446
+ const commentEnd = selfContent.indexOf(' */');
447
+ const helpText = selfContent
448
+ .slice(selfContent.indexOf('/**') + 3, commentEnd)
449
+ .split('\n')
450
+ .map(l => l.replace(/^\s*\*\s?/, ''))
451
+ .join('\n')
452
+ .trim();
453
+ if (raw) {
454
+ process.stdout.write(helpText + '\n');
455
+ } else {
456
+ output({ help: helpText }, false, helpText);
457
+ }
458
+ return;
459
+ }
460
+
461
+ try {
462
+ // ─── State Operations ─────────────────────────────────────────────────────
463
+ if (command === 'state' && subcommand === 'load') {
464
+ output(stateLoad());
465
+ } else if (command === 'state' && subcommand === 'check-progress') {
466
+ output(stateCheckProgress());
467
+ } else if (command === 'state' && subcommand === 'update') {
468
+ const field = args[2];
469
+ const value = args[3];
470
+ if (!field || value === undefined) error('Usage: pbr-tools.cjs state update <field> <value>');
471
+ output(stateUpdate(field, value));
472
+ } else if (command === 'state' && subcommand === 'json') {
473
+ // GSD compat: cmdStateJson
474
+ getState().cmdStateJson(cwd, raw);
475
+ } else if (command === 'state' && subcommand === 'get') {
476
+ // GSD compat: cmdStateGet
477
+ getState().cmdStateGet(cwd, args[2], raw);
478
+ } else if (command === 'state' && subcommand === 'patch') {
479
+ // Support both reference (JSON string) and GSD (--key val pairs) patterns
480
+ if (args[2] && !args[2].startsWith('--')) {
481
+ // Reference pattern: state patch '{"key": "val"}'
482
+ output(statePatch(args[2]));
483
+ } else {
484
+ // GSD pattern: state patch --key val --key2 val2
485
+ const patches = {};
486
+ for (let i = 2; i < args.length; i += 2) {
487
+ const key = args[i].replace(/^--/, '');
488
+ const value = args[i + 1];
489
+ if (key && value !== undefined) patches[key] = value;
490
+ }
491
+ getState().cmdStatePatch(cwd, patches, raw);
492
+ }
493
+ } else if (command === 'state' && subcommand === 'advance-plan') {
494
+ output(stateAdvancePlan());
495
+ } else if (command === 'state' && subcommand === 'record-metric') {
496
+ // Support both reference (positional) and GSD (--flag) patterns
497
+ const phaseIdx = args.indexOf('--phase');
498
+ if (phaseIdx !== -1) {
499
+ // GSD pattern with --flags
500
+ const planIdx = args.indexOf('--plan');
501
+ const durationIdx = args.indexOf('--duration');
502
+ const tasksIdx = args.indexOf('--tasks');
503
+ const filesIdx = args.indexOf('--files');
504
+ getState().cmdStateRecordMetric(cwd, {
505
+ phase: phaseIdx !== -1 ? args[phaseIdx + 1] : null,
506
+ plan: planIdx !== -1 ? args[planIdx + 1] : null,
507
+ duration: durationIdx !== -1 ? args[durationIdx + 1] : null,
508
+ tasks: tasksIdx !== -1 ? args[tasksIdx + 1] : null,
509
+ files: filesIdx !== -1 ? args[filesIdx + 1] : null,
510
+ }, raw);
511
+ } else {
512
+ // Reference pattern: positional args
513
+ output(stateRecordMetric(args.slice(2)));
514
+ }
515
+ } else if (command === 'state' && subcommand === 'record-activity') {
516
+ const description = args.slice(2).join(' ');
517
+ if (!description) error('Usage: pbr-tools.cjs state record-activity <description>');
518
+ output(stateRecordActivity(description));
519
+ } else if (command === 'state' && subcommand === 'update-progress') {
520
+ output(stateUpdateProgress());
521
+ } else if (command === 'state' && subcommand === 'add-decision') {
522
+ // GSD pattern: --summary "text" --phase N
523
+ const phaseIdx = args.indexOf('--phase');
524
+ const summaryIdx = args.indexOf('--summary');
525
+ const summaryFileIdx = args.indexOf('--summary-file');
526
+ const rationaleIdx = args.indexOf('--rationale');
527
+ const rationaleFileIdx = args.indexOf('--rationale-file');
528
+ getState().cmdStateAddDecision(cwd, {
529
+ phase: phaseIdx !== -1 ? args[phaseIdx + 1] : null,
530
+ summary: summaryIdx !== -1 ? args[summaryIdx + 1] : null,
531
+ summary_file: summaryFileIdx !== -1 ? args[summaryFileIdx + 1] : null,
532
+ rationale: rationaleIdx !== -1 ? args[rationaleIdx + 1] : '',
533
+ rationale_file: rationaleFileIdx !== -1 ? args[rationaleFileIdx + 1] : null,
534
+ }, raw);
535
+ } else if (command === 'state' && subcommand === 'add-blocker') {
536
+ const textIdx = args.indexOf('--text');
537
+ const textFileIdx = args.indexOf('--text-file');
538
+ getState().cmdStateAddBlocker(cwd, {
539
+ text: textIdx !== -1 ? args[textIdx + 1] : null,
540
+ text_file: textFileIdx !== -1 ? args[textFileIdx + 1] : null,
541
+ }, raw);
542
+ } else if (command === 'state' && subcommand === 'resolve-blocker') {
543
+ const textIdx = args.indexOf('--text');
544
+ getState().cmdStateResolveBlocker(cwd, textIdx !== -1 ? args[textIdx + 1] : null, raw);
545
+ } else if (command === 'state' && subcommand === 'record-session') {
546
+ const stoppedIdx = args.indexOf('--stopped-at');
547
+ const resumeIdx = args.indexOf('--resume-file');
548
+ getState().cmdStateRecordSession(cwd, {
549
+ stopped_at: stoppedIdx !== -1 ? args[stoppedIdx + 1] : null,
550
+ resume_file: resumeIdx !== -1 ? args[resumeIdx + 1] : 'None',
551
+ }, raw);
552
+ } else if (command === 'state' && !subcommand) {
553
+ // Bare "state" = state load
554
+ output(stateLoad());
555
+
556
+ // ─── State-bundle and state-snapshot (top-level aliases) ────────────────
557
+ } else if (command === 'state-bundle') {
558
+ const phaseNum = args[1];
559
+ if (!phaseNum) error('Usage: pbr-tools.cjs state-bundle <phase-number>');
560
+ output(initStateBundle(phaseNum));
561
+ } else if (command === 'state-snapshot') {
562
+ getState().cmdStateSnapshot(cwd, raw);
563
+
564
+ // ─── Config Operations ────────────────────────────────────────────────────
565
+ } else if (command === 'config' && subcommand === 'validate') {
566
+ output(configValidate());
567
+ } else if (command === 'config' && subcommand === 'load-defaults') {
568
+ const defaults = getConfig().loadUserDefaults();
569
+ output(defaults || { exists: false, path: getConfig().USER_DEFAULTS_PATH });
570
+ } else if (command === 'config' && subcommand === 'save-defaults') {
571
+ const cfg = configLoad();
572
+ if (!cfg) error('No config.json found. Run /pbr:setup first.');
573
+ output(getConfig().saveUserDefaults(cfg));
574
+ } else if (command === 'config' && subcommand === 'resolve-depth') {
575
+ const dir = args[2] || undefined;
576
+ const cfg = configLoad(dir);
577
+ output(getConfig().configResolveDepth(cfg));
578
+ } else if (command === 'config' && subcommand === 'get') {
579
+ getConfig().cmdConfigGet(cwd, args[2], raw);
580
+ } else if (command === 'config' && subcommand === 'set') {
581
+ getConfig().cmdConfigSet(cwd, args[2], args[3], raw);
582
+ } else if (command === 'config' && subcommand === 'ensure-section') {
583
+ getConfig().cmdConfigEnsureSection(cwd, raw);
584
+ } else if (command === 'config-ensure-section') {
585
+ getConfig().cmdConfigEnsureSection(cwd, raw);
586
+ } else if (command === 'config-set') {
587
+ getConfig().cmdConfigSet(cwd, args[1], args[2], raw);
588
+ } else if (command === 'config-get') {
589
+ getConfig().cmdConfigGet(cwd, args[1], raw);
590
+
591
+ // ─── Phase Operations ─────────────────────────────────────────────────────
592
+ } else if (command === 'phase' && subcommand === 'add') {
593
+ const slug = args[2];
594
+ if (!slug) error('Usage: phase add <slug> [--after N] [--goal "..."] [--depends-on N]');
595
+ const afterIdx = args.indexOf('--after');
596
+ const afterPhase = afterIdx !== -1 ? args[afterIdx + 1] : null;
597
+ const goalIdx = args.indexOf('--goal');
598
+ const goal = goalIdx !== -1 ? args[goalIdx + 1] : null;
599
+ const depIdx = args.indexOf('--depends-on');
600
+ const dependsOn = depIdx !== -1 ? args[depIdx + 1] : null;
601
+ const opts = {};
602
+ if (goal) opts.goal = goal;
603
+ if (dependsOn) opts.dependsOn = dependsOn;
604
+ output(phaseAdd(slug, afterPhase, Object.keys(opts).length > 0 ? opts : undefined));
605
+ } else if (command === 'phase' && subcommand === 'remove') {
606
+ const p = args[2];
607
+ if (!p) error('Usage: phase remove <N>');
608
+ output(phaseRemove(p));
609
+ } else if (command === 'phase' && subcommand === 'list') {
610
+ output(phaseList());
611
+ } else if (command === 'phase' && subcommand === 'complete') {
612
+ const p = args[2];
613
+ if (!p) error('Usage: phase complete <N>');
614
+ output(phaseComplete(p));
615
+ } else if (command === 'phase' && subcommand === 'insert') {
616
+ const position = args[2];
617
+ const slug = args[3];
618
+ if (!position || !slug) error('Usage: phase insert <N> <slug> [--goal "..."] [--depends-on N]');
619
+ const goalIdx = args.indexOf('--goal');
620
+ const goal = goalIdx !== -1 ? args[goalIdx + 1] : null;
621
+ const depIdx = args.indexOf('--depends-on');
622
+ const dependsOn = depIdx !== -1 ? args[depIdx + 1] : null;
623
+ const opts = {};
624
+ if (goal) opts.goal = goal;
625
+ if (dependsOn) opts.dependsOn = dependsOn;
626
+ output(phaseInsert(parseInt(position, 10), slug, Object.keys(opts).length > 0 ? opts : undefined));
627
+ } else if (command === 'phase' && subcommand === 'info') {
628
+ const p = args[2];
629
+ if (!p) error('Usage: phase info <N>');
630
+ output(phaseInfo(p));
631
+ } else if (command === 'phase' && subcommand === 'commits-for') {
632
+ const p = args[2];
633
+ if (!p) error('Usage: phase commits-for <N>');
634
+ output(phaseCommitsFor(p));
635
+ } else if (command === 'phase' && subcommand === 'first-last-commit') {
636
+ const p = args[2];
637
+ if (!p) error('Usage: phase first-last-commit <N>');
638
+ output(phaseFirstLastCommit(p));
639
+ } else if (command === 'phase' && subcommand === 'next-decimal') {
640
+ // GSD compat
641
+ getPhase().cmdPhaseNextDecimal
642
+ ? getPhase().cmdPhaseNextDecimal(cwd, args[2], raw)
643
+ : output(getPhase().phaseNextDecimal ? getPhase().phaseNextDecimal(args[2], planningDir) : { error: 'not implemented' });
644
+ } else if (command === 'phases' && subcommand === 'list') {
645
+ // GSD compat: phases list with options
646
+ const typeIndex = args.indexOf('--type');
647
+ const phaseIndex = args.indexOf('--phase');
648
+ const options = {
649
+ type: typeIndex !== -1 ? args[typeIndex + 1] : null,
650
+ phase: phaseIndex !== -1 ? args[phaseIndex + 1] : null,
651
+ includeArchived: args.includes('--include-archived'),
652
+ };
653
+ getPhase().cmdPhasesList
654
+ ? getPhase().cmdPhasesList(cwd, options, raw)
655
+ : output(phaseList());
656
+ } else if (command === 'phase-info') {
657
+ const p = args[1];
658
+ if (!p) error('Usage: pbr-tools.cjs phase-info <N>');
659
+ output(phaseInfo(p));
660
+ } else if (command === 'phase-plan-index') {
661
+ const p = args[1];
662
+ if (!p) error('Usage: pbr-tools.cjs phase-plan-index <phase>');
663
+ getPhase().cmdPhasePlanIndex
664
+ ? getPhase().cmdPhasePlanIndex(cwd, p, raw)
665
+ : output(phasePlanIndex(p));
666
+ } else if (command === 'find-phase') {
667
+ getPhase().cmdFindPhase
668
+ ? getPhase().cmdFindPhase(cwd, args[1], raw)
669
+ : output(getCore().findPhaseInternal(cwd, args[1]));
670
+ } else if (command === 'plan-index') {
671
+ const p = args[1];
672
+ if (!p) error('Usage: pbr-tools.cjs plan-index <phase>');
673
+ output(phasePlanIndex(p));
674
+ } else if (command === 'must-haves') {
675
+ const p = args[1];
676
+ if (!p) error('Usage: pbr-tools.cjs must-haves <phase>');
677
+ output(phaseMustHaves(p));
678
+
679
+ // ─── Roadmap Operations ───────────────────────────────────────────────────
680
+ } else if (command === 'roadmap' && subcommand === 'get-phase') {
681
+ const p = args[2];
682
+ if (!p) error('Usage: roadmap get-phase <phase>');
683
+ output(roadmapGetPhase(p));
684
+ } else if (command === 'roadmap' && subcommand === 'analyze') {
685
+ output(roadmapAnalyze());
686
+ } else if (command === 'roadmap' && subcommand === 'update-plan-progress') {
687
+ const p = args[2];
688
+ if (!p) error('Usage: roadmap update-plan-progress <phase>');
689
+ output(roadmapUpdatePlanProgress(p));
690
+ } else if (command === 'roadmap' && subcommand === 'update-status') {
691
+ const p = args[2];
692
+ const s = args[3];
693
+ if (!p || !s) error('Usage: roadmap update-status <phase> <status>');
694
+ output(roadmapUpdateStatus(p, s));
695
+ } else if (command === 'roadmap' && subcommand === 'update-plans') {
696
+ const p = args[2];
697
+ const c = args[3];
698
+ const t = args[4];
699
+ if (!p || c === undefined || t === undefined) error('Usage: roadmap update-plans <phase> <complete> <total>');
700
+ output(roadmapUpdatePlans(p, c, t));
701
+ } else if (command === 'roadmap' && subcommand === 'append-phase') {
702
+ const slug = args[2];
703
+ if (!slug) error('Usage: roadmap append-phase <slug> [options]');
704
+ output(roadmapAppendPhase(slug));
705
+ } else if (command === 'roadmap' && subcommand === 'remove-phase') {
706
+ const p = args[2];
707
+ if (!p) error('Usage: roadmap remove-phase <N>');
708
+ output(roadmapRemovePhase(p));
709
+ } else if (command === 'roadmap' && subcommand === 'insert-phase') {
710
+ const pos = args[2];
711
+ const slug = args[3];
712
+ if (!pos || !slug) error('Usage: roadmap insert-phase <N> <slug>');
713
+ output(roadmapInsertPhase(parseInt(pos, 10), slug));
714
+
715
+ // ─── Init (Compound Commands) ─────────────────────────────────────────────
716
+ } else if (command === 'init' && subcommand === 'execute-phase') {
717
+ const p = args[2];
718
+ if (!p) error('Usage: pbr-tools.cjs init execute-phase <phase>');
719
+ output(initExecutePhase(p));
720
+ } else if (command === 'init' && subcommand === 'plan-phase') {
721
+ const p = args[2];
722
+ if (!p) error('Usage: pbr-tools.cjs init plan-phase <phase>');
723
+ output(initPlanPhase(p));
724
+ } else if (command === 'init' && subcommand === 'new-project') {
725
+ getInit().cmdInitNewProject
726
+ ? getInit().cmdInitNewProject(cwd, raw)
727
+ : output({ error: 'init new-project not available in reference mode' });
728
+ } else if (command === 'init' && subcommand === 'new-milestone') {
729
+ getInit().cmdInitNewMilestone
730
+ ? getInit().cmdInitNewMilestone(cwd, raw)
731
+ : output({ error: 'init new-milestone not available in reference mode' });
732
+ } else if (command === 'init' && subcommand === 'quick') {
733
+ const desc = args.slice(2).join(' ') || '';
734
+ output(initQuick(desc));
735
+ } else if (command === 'init' && subcommand === 'resume') {
736
+ output(initResume());
737
+ } else if (command === 'init' && subcommand === 'verify-work') {
738
+ const p = args[2];
739
+ if (!p) error('Usage: pbr-tools.cjs init verify-work <phase>');
740
+ output(initVerifyWork(p));
741
+ } else if (command === 'init' && subcommand === 'phase-op') {
742
+ getInit().cmdInitPhaseOp
743
+ ? getInit().cmdInitPhaseOp(cwd, args[2], raw)
744
+ : output(phaseInfo(args[2]));
745
+ } else if (command === 'init' && subcommand === 'todos') {
746
+ getInit().cmdInitTodos
747
+ ? getInit().cmdInitTodos(cwd, args[2], raw)
748
+ : output(todoList({}));
749
+ } else if (command === 'init' && subcommand === 'milestone-op') {
750
+ getInit().cmdInitMilestoneOp
751
+ ? getInit().cmdInitMilestoneOp(cwd, raw)
752
+ : output({ error: 'init milestone-op not available' });
753
+ } else if (command === 'init' && subcommand === 'map-codebase') {
754
+ getInit().cmdInitMapCodebase
755
+ ? getInit().cmdInitMapCodebase(cwd, raw)
756
+ : output({ error: 'init map-codebase not available' });
757
+ } else if (command === 'init' && subcommand === 'progress') {
758
+ output(initProgress());
759
+ } else if (command === 'init') {
760
+ error(`Unknown init workflow: ${subcommand}\nAvailable: execute-phase, plan-phase, new-project, new-milestone, quick, resume, verify-work, phase-op, todos, milestone-op, map-codebase, progress`);
761
+
762
+ // ─── Todo Operations ──────────────────────────────────────────────────────
763
+ } else if (command === 'todo' && subcommand === 'list') {
764
+ const opts = {};
765
+ const themeIdx = args.indexOf('--theme');
766
+ if (themeIdx !== -1 && args[themeIdx + 1]) opts.theme = args[themeIdx + 1];
767
+ const statusIdx = args.indexOf('--status');
768
+ if (statusIdx !== -1 && args[statusIdx + 1]) opts.status = args[statusIdx + 1];
769
+ output(todoList(opts));
770
+ } else if (command === 'todo' && subcommand === 'get') {
771
+ const num = args[2];
772
+ if (!num) error('Usage: pbr-tools.cjs todo get <NNN>');
773
+ output(todoGet(num));
774
+ } else if (command === 'todo' && subcommand === 'add') {
775
+ const titleParts = [];
776
+ const opts = {};
777
+ for (let i = 2; i < args.length; i++) {
778
+ if (args[i] === '--priority' && args[i + 1]) { opts.priority = args[++i]; }
779
+ else if (args[i] === '--theme' && args[i + 1]) { opts.theme = args[++i]; }
780
+ else if (args[i] === '--source' && args[i + 1]) { opts.source = args[++i]; }
781
+ else { titleParts.push(args[i]); }
782
+ }
783
+ const title = titleParts.join(' ');
784
+ if (!title) error('Usage: pbr-tools.cjs todo add <title> [--priority P1|P2|P3] [--theme <theme>]');
785
+ output(todoAdd(title, opts));
786
+ } else if (command === 'todo' && subcommand === 'done') {
787
+ const num = args[2];
788
+ if (!num) error('Usage: pbr-tools.cjs todo done <NNN>');
789
+ output(todoDone(num));
790
+
791
+ // ─── History ──────────────────────────────────────────────────────────────
792
+ } else if (command === 'history' && subcommand === 'append') {
793
+ const type = args[2];
794
+ const title = args[3];
795
+ const body = args[4] || '';
796
+ if (!type || !title) error('Usage: pbr-tools.cjs history append <type> <title> [body]');
797
+ output(historyAppend({ type, title, body }));
798
+ } else if (command === 'history' && subcommand === 'load') {
799
+ output(historyLoad());
800
+ } else if (command === 'history-digest') {
801
+ getCommands().cmdHistoryDigest(cwd, raw);
802
+
803
+ // ─── Learnings ────────────────────────────────────────────────────────────
804
+ } else if (command === 'learnings' && subcommand === 'ingest') {
805
+ const jsonFile = args[2];
806
+ if (!jsonFile) error('Usage: learnings ingest <json-file>');
807
+ const rawContent = fs.readFileSync(jsonFile, 'utf8');
808
+ const entry = JSON.parse(rawContent);
809
+ output(getLearnings().learningsIngest(entry));
810
+ } else if (command === 'learnings' && subcommand === 'query') {
811
+ const filters = {};
812
+ for (let i = 2; i < args.length; i++) {
813
+ if (args[i] === '--tags' && args[i + 1]) { filters.tags = args[++i].split(',').map(t => t.trim()); }
814
+ else if (args[i] === '--min-confidence' && args[i + 1]) { filters.minConfidence = args[++i]; }
815
+ else if (args[i] === '--stack' && args[i + 1]) { filters.stack = args[++i]; }
816
+ else if (args[i] === '--type' && args[i + 1]) { filters.type = args[++i]; }
817
+ }
818
+ output(getLearnings().learningsQuery(filters));
819
+ } else if (command === 'learnings' && subcommand === 'check-thresholds') {
820
+ output(getLearnings().checkDeferralThresholds());
821
+
822
+ // ─── Build Pipeline ───────────────────────────────────────────────────────
823
+ } else if (command === 'staleness-check') {
824
+ const slug = args[1];
825
+ if (!slug) error('Usage: staleness-check <phase-slug>');
826
+ output(stalenessCheck(slug));
827
+ } else if (command === 'summary-gate') {
828
+ const slug = args[1];
829
+ const planId = args[2];
830
+ if (!slug || !planId) error('Usage: summary-gate <phase-slug> <plan-id>');
831
+ output(summaryGate(slug, planId));
832
+ } else if (command === 'checkpoint' && subcommand === 'init') {
833
+ const slug = args[2];
834
+ const plans = args[3] || '';
835
+ output(checkpointInit(slug, plans));
836
+ } else if (command === 'checkpoint' && subcommand === 'update') {
837
+ const slug = args[2];
838
+ const waveIdx = args.indexOf('--wave');
839
+ const wave = waveIdx !== -1 ? parseInt(args[waveIdx + 1], 10) : 1;
840
+ const resolvedIdx = args.indexOf('--resolved');
841
+ const resolved = resolvedIdx !== -1 ? args[resolvedIdx + 1] : '';
842
+ const shaIdx = args.indexOf('--sha');
843
+ const sha = shaIdx !== -1 ? args[shaIdx + 1] : '';
844
+ output(checkpointUpdate(slug, { wave, resolved, sha }));
845
+ } else if (command === 'seeds' && subcommand === 'match') {
846
+ const slug = args[2];
847
+ const num = args[3];
848
+ if (!slug) error('Usage: seeds match <phase-slug> <phase-number>');
849
+ output(seedsMatch(slug, num));
850
+ } else if (command === 'ci-poll') {
851
+ const runId = args[1];
852
+ const timeoutIdx = args.indexOf('--timeout');
853
+ const timeoutSecs = timeoutIdx !== -1 ? parseInt(args[timeoutIdx + 1], 10) : 300;
854
+ if (!runId) error('Usage: pbr-tools.cjs ci-poll <run-id> [--timeout <seconds>]');
855
+ output(ciPoll(runId, timeoutSecs));
856
+ } else if (command === 'rollback') {
857
+ const manifestPath = args[1];
858
+ if (!manifestPath) error('Usage: pbr-tools.cjs rollback <manifest-path>');
859
+ output(rollbackPlan(manifestPath));
860
+ } else if (command === 'build-preview') {
861
+ const phaseSlug = args[1];
862
+ if (!phaseSlug) error('Usage: pbr-tools.cjs build-preview <phase-slug>');
863
+ const result = getPreview().buildPreview(phaseSlug, {}, planningDir, resolvePluginRoot());
864
+ if (result && result.error) { output(result); process.exit(1); }
865
+ output(result);
866
+
867
+ // ─── LLM Operations ──────────────────────────────────────────────────────
868
+ } else if (command === 'llm' && subcommand === 'health') {
869
+ output(getLlm().llmHealth(planningDir));
870
+ } else if (command === 'llm' && subcommand === 'status') {
871
+ output(getLlm().llmStatus(planningDir));
872
+ } else if (command === 'llm' && subcommand === 'classify') {
873
+ const fileType = args[2];
874
+ const filePath = args[3];
875
+ if (!fileType || !filePath) error('Usage: pbr-tools.cjs llm classify <PLAN|SUMMARY> <filepath>');
876
+ output(await getLlm().llmClassify(planningDir, fileType, filePath));
877
+ } else if (command === 'llm' && subcommand === 'score-source') {
878
+ const sourceUrl = args[2];
879
+ const filePath = args[3];
880
+ if (!sourceUrl || !filePath) error('Usage: pbr-tools.cjs llm score-source <url> <file-path>');
881
+ output(await getLlm().llmScoreSource(planningDir, sourceUrl, filePath));
882
+ } else if (command === 'llm' && subcommand === 'classify-error') {
883
+ const filePath = args[2];
884
+ const agentType = args[3] || 'unknown';
885
+ if (!filePath) error('Usage: pbr-tools.cjs llm classify-error <file-path> [agent-type]');
886
+ output(await getLlm().llmClassifyError(planningDir, filePath, agentType));
887
+ } else if (command === 'llm' && subcommand === 'summarize') {
888
+ const filePath = args[2];
889
+ const maxWords = args[3] ? parseInt(args[3], 10) : undefined;
890
+ if (!filePath) error('Usage: pbr-tools.cjs llm summarize <file-path> [max-words]');
891
+ output(await getLlm().llmSummarize(planningDir, filePath, maxWords));
892
+ } else if (command === 'llm' && subcommand === 'metrics') {
893
+ output(getLlm().llmMetrics(planningDir, args.slice(2)));
894
+ } else if (command === 'llm' && subcommand === 'adjust-thresholds') {
895
+ output(getLlm().llmAdjustThresholds(planningDir));
896
+
897
+ // ─── Session ──────────────────────────────────────────────────────────────
898
+ } else if (command === 'session') {
899
+ const core = getCore();
900
+ const sub = args[1];
901
+ const sessionIdIdx = args.indexOf('--session-id');
902
+ const sessionId = sessionIdIdx !== -1 ? args[sessionIdIdx + 1] : null;
903
+ const positional = sessionIdIdx !== -1
904
+ ? args.filter((_a, i) => i !== sessionIdIdx && i !== sessionIdIdx + 1)
905
+ : args;
906
+ const key = positional[2];
907
+ const value = positional[3];
908
+ const dir = planningDir;
909
+ if (sub === 'get') {
910
+ if (!key) error('Usage: pbr-tools.cjs session get <key> [--session-id <id>]');
911
+ if (!core.SESSION_ALLOWED_KEYS.includes(key)) error(`Unknown session key: ${key}. Allowed: ${core.SESSION_ALLOWED_KEYS.join(', ')}`);
912
+ const data = core.sessionLoad(dir, sessionId);
913
+ const val = Object.prototype.hasOwnProperty.call(data, key) ? data[key] : null;
914
+ output({ key, value: val });
915
+ } else if (sub === 'set') {
916
+ if (!key || value === undefined) error('Usage: pbr-tools.cjs session set <key> <value> [--session-id <id>]');
917
+ if (!core.SESSION_ALLOWED_KEYS.includes(key)) error(`Unknown session key: ${key}. Allowed: ${core.SESSION_ALLOWED_KEYS.join(', ')}`);
918
+ let coerced = value;
919
+ if (/^\d+$/.test(value)) coerced = parseInt(value, 10);
920
+ else if (value === 'null') coerced = null;
921
+ const result = core.sessionSave(dir, { [key]: coerced }, sessionId);
922
+ if (!result.success) error(result.error || 'Failed to save session');
923
+ output({ ok: true });
924
+ } else if (sub === 'clear') {
925
+ if (key) {
926
+ if (!core.SESSION_ALLOWED_KEYS.includes(key)) error(`Unknown session key: ${key}. Allowed: ${core.SESSION_ALLOWED_KEYS.join(', ')}`);
927
+ const result = core.sessionSave(dir, { [key]: null }, sessionId);
928
+ if (!result.success) error(result.error || 'Failed to clear session key');
929
+ } else {
930
+ const sessionPath = sessionId
931
+ ? core.resolveSessionPath(dir, '.session.json', sessionId)
932
+ : path.join(dir, '.session.json');
933
+ try { if (fs.existsSync(sessionPath)) fs.unlinkSync(sessionPath); } catch (e) { error(e.message); }
934
+ }
935
+ output({ ok: true });
936
+ } else if (sub === 'dump') {
937
+ const data = core.sessionLoad(dir, sessionId);
938
+ output(data);
939
+ } else {
940
+ error('Usage: pbr-tools.cjs session get|set|clear|dump <key> [value] [--session-id <id>]');
941
+ }
942
+
943
+ // ─── Claims ───────────────────────────────────────────────────────────────
944
+ } else if (command === 'claim' && subcommand === 'acquire') {
945
+ const phaseSlug = args[2];
946
+ const sidIdx = args.indexOf('--session-id');
947
+ const sessionId = sidIdx !== -1 ? args[sidIdx + 1] : null;
948
+ const skillIdx = args.indexOf('--skill');
949
+ const skill = skillIdx !== -1 ? args[skillIdx + 1] : 'unknown';
950
+ if (!phaseSlug || !sessionId) error('Usage: pbr-tools.cjs claim acquire <phase-slug> --session-id <id> --skill <name>');
951
+ const phaseDir = path.join(planningDir, 'phases', phaseSlug);
952
+ if (!fs.existsSync(phaseDir)) { output({ error: `Phase directory not found: ${phaseSlug}` }); return; }
953
+ output(getCore().acquireClaim(planningDir, phaseDir, sessionId, skill));
954
+ } else if (command === 'claim' && subcommand === 'release') {
955
+ const phaseSlug = args[2];
956
+ const sidIdx = args.indexOf('--session-id');
957
+ const sessionId = sidIdx !== -1 ? args[sidIdx + 1] : null;
958
+ if (!phaseSlug || !sessionId) error('Usage: pbr-tools.cjs claim release <phase-slug> --session-id <id>');
959
+ const phaseDir = path.join(planningDir, 'phases', phaseSlug);
960
+ if (!fs.existsSync(phaseDir)) { output({ error: `Phase directory not found: ${phaseSlug}` }); return; }
961
+ output(getCore().releaseClaim(planningDir, phaseDir, sessionId));
962
+ } else if (command === 'claim' && subcommand === 'list') {
963
+ output(getCore().listClaims(planningDir));
964
+
965
+ // ─── Verification ─────────────────────────────────────────────────────────
966
+ } else if (command === 'verify' && subcommand === 'plan-structure') {
967
+ getVerify().cmdVerifyPlanStructure(cwd, args[2], raw);
968
+ } else if (command === 'verify' && subcommand === 'phase-completeness') {
969
+ getVerify().cmdVerifyPhaseCompleteness(cwd, args[2], raw);
970
+ } else if (command === 'verify' && subcommand === 'references') {
971
+ getVerify().cmdVerifyReferences(cwd, args[2], raw);
972
+ } else if (command === 'verify' && subcommand === 'commits') {
973
+ getVerify().cmdVerifyCommits(cwd, args.slice(2), raw);
974
+ } else if (command === 'verify' && subcommand === 'artifacts') {
975
+ getVerify().cmdVerifyArtifacts(cwd, args[2], raw);
976
+ } else if (command === 'verify' && subcommand === 'key-links') {
977
+ getVerify().cmdVerifyKeyLinks(cwd, args[2], raw);
978
+ } else if (command === 'verify-summary') {
979
+ const summaryPath = args[1];
980
+ const countIndex = args.indexOf('--check-count');
981
+ const checkCount = countIndex !== -1 ? parseInt(args[countIndex + 1], 10) : 2;
982
+ getVerify().cmdVerifySummary(cwd, summaryPath, checkCount, raw);
983
+ } else if (command === 'validate' && subcommand === 'consistency') {
984
+ getVerify().cmdValidateConsistency(cwd, raw);
985
+ } else if (command === 'validate' && subcommand === 'health') {
986
+ const repairFlag = args.includes('--repair');
987
+ getVerify().cmdValidateHealth(cwd, { repair: repairFlag }, raw);
988
+ } else if (command === 'validate-project') {
989
+ output(validateProject());
990
+
991
+ // ─── Frontmatter ──────────────────────────────────────────────────────────
992
+ } else if (command === 'frontmatter' && subcommand === 'get') {
993
+ const file = args[2];
994
+ const fieldIdx = args.indexOf('--field');
995
+ getFrontmatter().cmdFrontmatterGet(cwd, file, fieldIdx !== -1 ? args[fieldIdx + 1] : null, raw);
996
+ } else if (command === 'frontmatter' && subcommand === 'set') {
997
+ const file = args[2];
998
+ const fieldIdx = args.indexOf('--field');
999
+ const valueIdx = args.indexOf('--value');
1000
+ getFrontmatter().cmdFrontmatterSet(cwd, file, fieldIdx !== -1 ? args[fieldIdx + 1] : null, valueIdx !== -1 ? args[valueIdx + 1] : undefined, raw);
1001
+ } else if (command === 'frontmatter' && subcommand === 'merge') {
1002
+ const file = args[2];
1003
+ const dataIdx = args.indexOf('--data');
1004
+ getFrontmatter().cmdFrontmatterMerge(cwd, file, dataIdx !== -1 ? args[dataIdx + 1] : null, raw);
1005
+ } else if (command === 'frontmatter' && subcommand === 'validate') {
1006
+ const file = args[2];
1007
+ const schemaIdx = args.indexOf('--schema');
1008
+ getFrontmatter().cmdFrontmatterValidate(cwd, file, schemaIdx !== -1 ? args[schemaIdx + 1] : null, raw);
1009
+ } else if (command === 'frontmatter' && subcommand && !['get', 'set', 'merge', 'validate'].includes(subcommand)) {
1010
+ // Reference compat: frontmatter <filepath> (parse frontmatter from file)
1011
+ output(phaseFrontmatter(subcommand));
1012
+
1013
+ // ─── Templates ────────────────────────────────────────────────────────────
1014
+ } else if (command === 'template' && subcommand === 'select') {
1015
+ getTemplate().cmdTemplateSelect(cwd, args[2], raw);
1016
+ } else if (command === 'template' && subcommand === 'fill') {
1017
+ const templateType = args[2];
1018
+ const phaseIdx = args.indexOf('--phase');
1019
+ const planIdx = args.indexOf('--plan');
1020
+ const nameIdx = args.indexOf('--name');
1021
+ const typeIdx = args.indexOf('--type');
1022
+ const waveIdx = args.indexOf('--wave');
1023
+ const fieldsIdx = args.indexOf('--fields');
1024
+ getTemplate().cmdTemplateFill(cwd, templateType, {
1025
+ phase: phaseIdx !== -1 ? args[phaseIdx + 1] : null,
1026
+ plan: planIdx !== -1 ? args[planIdx + 1] : null,
1027
+ name: nameIdx !== -1 ? args[nameIdx + 1] : null,
1028
+ type: typeIdx !== -1 ? args[typeIdx + 1] : 'execute',
1029
+ wave: waveIdx !== -1 ? args[waveIdx + 1] : '1',
1030
+ fields: fieldsIdx !== -1 ? JSON.parse(args[fieldsIdx + 1]) : {},
1031
+ }, raw);
1032
+
1033
+ // ─── Milestones ───────────────────────────────────────────────────────────
1034
+ } else if (command === 'milestone' && subcommand === 'complete') {
1035
+ const nameIndex = args.indexOf('--name');
1036
+ const archivePhases = args.includes('--archive-phases');
1037
+ let milestoneName = null;
1038
+ if (nameIndex !== -1) {
1039
+ const nameArgs = [];
1040
+ for (let i = nameIndex + 1; i < args.length; i++) {
1041
+ if (args[i].startsWith('--')) break;
1042
+ nameArgs.push(args[i]);
1043
+ }
1044
+ milestoneName = nameArgs.join(' ') || null;
1045
+ }
1046
+ getMilestone().cmdMilestoneComplete(cwd, args[2], { name: milestoneName, archivePhases }, raw);
1047
+ } else if (command === 'milestone' && subcommand === 'stats') {
1048
+ const version = args[2];
1049
+ if (!version) error('Usage: milestone stats <version>');
1050
+ output(milestoneStats(version));
1051
+ } else if (command === 'milestone-stats') {
1052
+ const version = args[1];
1053
+ if (!version) error('Usage: pbr-tools.cjs milestone-stats <version>');
1054
+ output(milestoneStats(version));
1055
+
1056
+ // ─── Requirements ─────────────────────────────────────────────────────────
1057
+ } else if (command === 'requirements' && subcommand === 'mark-complete') {
1058
+ getMilestone().cmdRequirementsMarkComplete(cwd, args.slice(2), raw);
1059
+
1060
+ // ─── Scaffolding ──────────────────────────────────────────────────────────
1061
+ } else if (command === 'scaffold') {
1062
+ const scaffoldType = args[1];
1063
+ const phaseIndex = args.indexOf('--phase');
1064
+ const nameIndex = args.indexOf('--name');
1065
+ const scaffoldOptions = {
1066
+ phase: phaseIndex !== -1 ? args[phaseIndex + 1] : null,
1067
+ name: nameIndex !== -1 ? args.slice(nameIndex + 1).join(' ') : null,
1068
+ };
1069
+ getCommands().cmdScaffold(cwd, scaffoldType, scaffoldOptions, raw);
1070
+
1071
+ // ─── Utility Commands ─────────────────────────────────────────────────────
1072
+ } else if (command === 'resolve-model') {
1073
+ getCommands().cmdResolveModel(cwd, args[1], raw);
1074
+ } else if (command === 'generate-slug') {
1075
+ getCommands().cmdGenerateSlug(args[1], raw);
1076
+ } else if (command === 'current-timestamp') {
1077
+ getCommands().cmdCurrentTimestamp(args[1] || 'full', raw);
1078
+ } else if (command === 'verify-path-exists') {
1079
+ getCommands().cmdVerifyPathExists(cwd, args[1], raw);
1080
+ } else if (command === 'summary-extract') {
1081
+ const summaryPath = args[1];
1082
+ const fieldsIndex = args.indexOf('--fields');
1083
+ const fields = fieldsIndex !== -1 ? args[fieldsIndex + 1].split(',') : null;
1084
+ getCommands().cmdSummaryExtract(cwd, summaryPath, fields, raw);
1085
+ } else if (command === 'websearch') {
1086
+ const query = args[1];
1087
+ const limitIdx = args.indexOf('--limit');
1088
+ const freshnessIdx = args.indexOf('--freshness');
1089
+ await getCommands().cmdWebsearch(query, {
1090
+ limit: limitIdx !== -1 ? parseInt(args[limitIdx + 1], 10) : 10,
1091
+ freshness: freshnessIdx !== -1 ? args[freshnessIdx + 1] : null,
1092
+ }, raw);
1093
+ } else if (command === 'progress') {
1094
+ const fmt = args[1] || 'json';
1095
+ getCommands().cmdProgressRender(cwd, fmt, raw);
1096
+ } else if (command === 'commit') {
1097
+ const amend = args.includes('--amend');
1098
+ const filesIndex = args.indexOf('--files');
1099
+ const endIndex = filesIndex !== -1 ? filesIndex : args.length;
1100
+ const messageArgs = args.slice(1, endIndex).filter(a => !a.startsWith('--'));
1101
+ const message = messageArgs.join(' ') || undefined;
1102
+ const files = filesIndex !== -1 ? args.slice(filesIndex + 1).filter(a => !a.startsWith('--')) : [];
1103
+ getCommands().cmdCommit(cwd, message, files, raw, amend);
1104
+
1105
+ // ─── Reference & Skills ───────────────────────────────────────────────────
1106
+ } else if (command === 'reference') {
1107
+ const name = args[1];
1108
+ if (!name) error('Usage: pbr-tools.cjs reference <name> [--section <heading>] [--list]');
1109
+ const listFlag = args.includes('--list');
1110
+ const sectionIdx = args.indexOf('--section');
1111
+ const section = sectionIdx !== -1 ? args.slice(sectionIdx + 1).join(' ') : null;
1112
+ output(referenceGet(name, { section, list: listFlag }));
1113
+ } else if (command === 'skill-section') {
1114
+ if (args[1] === '--list') {
1115
+ const skillName = args[2];
1116
+ if (!skillName) error('Usage: pbr-tools.cjs skill-section --list <skill>');
1117
+ const listResult = listSkillHeadings(skillName);
1118
+ output(listResult);
1119
+ if (listResult.error) process.exit(1);
1120
+ } else {
1121
+ const skillName = args[1];
1122
+ const sectionQuery = args.slice(2).join(' ');
1123
+ if (!skillName || !sectionQuery) error('Usage: pbr-tools.cjs skill-section <skill> <section>');
1124
+ const secResult = skillSectionGet(skillName, sectionQuery);
1125
+ output(secResult);
1126
+ if (secResult.error) process.exit(1);
1127
+ }
1128
+ } else if (command === 'step-verify') {
1129
+ const skill = args[1];
1130
+ const step = args[2];
1131
+ const checklistStr = args[3] || '[]';
1132
+ let checklist;
1133
+ try { checklist = JSON.parse(checklistStr); } catch (_e) { output({ error: 'Invalid checklist JSON' }); process.exit(1); return; }
1134
+ const svContext = {
1135
+ planningDir,
1136
+ phaseSlug: process.env.PBR_PHASE_SLUG || '',
1137
+ planId: process.env.PBR_PLAN_ID || ''
1138
+ };
1139
+ const svResult = getStepVerify().stepVerify(skill, step, checklist, svContext);
1140
+ output(svResult);
1141
+ if (svResult.error || svResult.all_passed === false) process.exit(1);
1142
+ } else if (command === 'context-triage') {
1143
+ const opts = {};
1144
+ const agentsIdx = args.indexOf('--agents-done');
1145
+ if (agentsIdx !== -1) opts.agentsDone = parseInt(args[agentsIdx + 1], 10);
1146
+ const plansIdx = args.indexOf('--plans-total');
1147
+ if (plansIdx !== -1) opts.plansTotal = parseInt(args[plansIdx + 1], 10);
1148
+ const stepIdx = args.indexOf('--step');
1149
+ if (stepIdx !== -1) opts.currentStep = args[stepIdx + 1];
1150
+ output(contextTriage(opts));
1151
+ } else if (command === 'suggest-alternatives') {
1152
+ const errorType = args[1];
1153
+ const alt = getAlternatives();
1154
+ if (errorType === 'phase-not-found') {
1155
+ output(alt.phaseAlternatives(args[2] || '', planningDir));
1156
+ } else if (errorType === 'missing-prereq') {
1157
+ output(alt.prerequisiteAlternatives(args[2] || '', planningDir));
1158
+ } else if (errorType === 'config-invalid') {
1159
+ output(alt.configAlternatives(args[2] || '', args[3] || '', planningDir));
1160
+ } else {
1161
+ output({ error: 'Unknown error type. Valid: phase-not-found, missing-prereq, config-invalid' });
1162
+ process.exit(1);
1163
+ }
1164
+ } else if (command === 'spot-check') {
1165
+ const phaseSlug = args[1];
1166
+ const planId = args[2];
1167
+ if (!phaseSlug || !planId) error('Usage: spot-check <phaseSlug> <planId>');
1168
+ output(spotCheck(phaseSlug, planId));
1169
+
1170
+ // ─── Migration & Events ───────────────────────────────────────────────────
1171
+ } else if (command === 'migrate') {
1172
+ const dryRun = args.includes('--dry-run');
1173
+ const force = args.includes('--force');
1174
+ const result = await getMigrate().applyMigrations(planningDir, { dryRun, force });
1175
+ output(result);
1176
+ } else if (command === 'event') {
1177
+ const category = args[1];
1178
+ const eventName = args[2];
1179
+ let details = {};
1180
+ if (args[3]) {
1181
+ try { details = JSON.parse(args[3]); } catch (_e) { details = { raw: args[3] }; }
1182
+ }
1183
+ if (!category || !eventName) error('Usage: pbr-tools.cjs event <category> <event> [JSON-details]');
1184
+ const { logEvent } = require('./event-logger.cjs');
1185
+ logEvent(category, eventName, details);
1186
+ output({ logged: true, category, event: eventName });
1187
+ } else if (command === 'tmux' && subcommand === 'detect') {
1188
+ const tmuxEnv = process.env.TMUX || '';
1189
+ const result = {
1190
+ in_tmux: !!tmuxEnv,
1191
+ pane: process.env.TMUX_PANE || null,
1192
+ session: null
1193
+ };
1194
+ if (tmuxEnv) {
1195
+ const parts = tmuxEnv.split(',');
1196
+ if (parts.length >= 1) result.session = parts[0].split('/').pop() || null;
1197
+ }
1198
+ output(result);
1199
+
1200
+ // ─── List-todos (legacy alias) ────────────────────────────────────────────
1201
+ } else if (command === 'list-todos') {
1202
+ // Legacy GSD command -- forward to todo list
1203
+ output(todoList({ theme: args[1] || undefined }));
1204
+
1205
+ // ─── Dashboard ─────────────────────────────────────────────────────────────
1206
+ } else if (command === 'dashboard') {
1207
+ const { spawn } = require('child_process');
1208
+ const dashboardDir = path.join(__dirname, '..', '..', 'dashboard', 'server');
1209
+ const dashboardIndex = path.join(dashboardDir, 'index.js');
1210
+
1211
+ if (!fs.existsSync(dashboardIndex)) {
1212
+ error(`Dashboard server not found at ${dashboardDir}. Ensure dashboard/server/ exists.`);
1213
+ }
1214
+
1215
+ // Check if node_modules exist in dashboard/server
1216
+ if (!fs.existsSync(path.join(dashboardDir, 'node_modules'))) {
1217
+ process.stderr.write('Installing dashboard dependencies...\n');
1218
+ const install = require('child_process').execSync('npm install', {
1219
+ cwd: dashboardDir,
1220
+ stdio: 'inherit'
1221
+ });
1222
+ }
1223
+
1224
+ const port = subcommand || process.env.PBR_DASHBOARD_PORT || '3141';
1225
+
1226
+ if (args[1] === 'stop') {
1227
+ // Find and kill existing dashboard process
1228
+ try {
1229
+ const pid = fs.readFileSync(path.join(cwd, '.planning', '.dashboard-pid'), 'utf8').trim();
1230
+ process.kill(Number(pid), 'SIGTERM');
1231
+ fs.unlinkSync(path.join(cwd, '.planning', '.dashboard-pid'));
1232
+ process.stderr.write(`Dashboard stopped (PID ${pid})\n`);
1233
+ output({ stopped: true, pid: Number(pid) });
1234
+ } catch {
1235
+ process.stderr.write('No running dashboard found.\n');
1236
+ output({ stopped: false });
1237
+ }
1238
+ } else {
1239
+ // Start dashboard server
1240
+ const child = spawn(process.execPath, [dashboardIndex], {
1241
+ cwd: cwd,
1242
+ env: { ...process.env, PBR_DASHBOARD_PORT: port },
1243
+ stdio: 'inherit',
1244
+ detached: false,
1245
+ });
1246
+
1247
+ // Write PID for stop command
1248
+ const pidDir = path.join(cwd, '.planning');
1249
+ if (fs.existsSync(pidDir)) {
1250
+ fs.writeFileSync(path.join(pidDir, '.dashboard-pid'), String(child.pid));
1251
+ }
1252
+
1253
+ child.on('error', (err) => {
1254
+ process.stderr.write(`Dashboard failed to start: ${err.message}\n`);
1255
+ process.exit(1);
1256
+ });
1257
+
1258
+ // Keep parent alive while dashboard runs
1259
+ child.on('exit', (code) => {
1260
+ const pidFile = path.join(cwd, '.planning', '.dashboard-pid');
1261
+ try { fs.unlinkSync(pidFile); } catch {}
1262
+ process.exit(code || 0);
1263
+ });
1264
+
1265
+ // Forward SIGINT/SIGTERM to child
1266
+ process.on('SIGINT', () => child.kill('SIGINT'));
1267
+ process.on('SIGTERM', () => child.kill('SIGTERM'));
1268
+
1269
+ // Prevent main() from exiting
1270
+ return new Promise(() => {});
1271
+ }
1272
+
1273
+ // ─── Unknown Command ──────────────────────────────────────────────────────
1274
+ } else {
1275
+ const allCommands = 'state load|check-progress|update|get|json|patch|advance-plan|record-metric|record-activity|update-progress|add-decision|add-blocker|resolve-blocker|record-session, state-bundle, state-snapshot, config validate|load-defaults|save-defaults|resolve-depth|get|set|ensure-section, phase add|remove|list|complete|insert|info|commits-for|first-last-commit|next-decimal, phases list, phase-info, phase-plan-index, find-phase, plan-index, must-haves, roadmap get-phase|analyze|update-plan-progress|update-status|update-plans|append-phase|remove-phase|insert-phase, init execute-phase|plan-phase|new-project|new-milestone|quick|resume|verify-work|phase-op|todos|milestone-op|map-codebase|progress, todo list|get|add|done, history append|load, history-digest, learnings ingest|query|check-thresholds, staleness-check, summary-gate, checkpoint init|update, seeds match, ci-poll, rollback, build-preview, llm health|status|classify|score-source|classify-error|summarize|metrics|adjust-thresholds, session get|set|clear|dump, claim acquire|release|list, verify plan-structure|phase-completeness|references|commits|artifacts|key-links, verify-summary, validate consistency|health, validate-project, frontmatter get|set|merge|validate, template select|fill, milestone complete|stats, milestone-stats, requirements mark-complete, scaffold, resolve-model, generate-slug, current-timestamp, verify-path-exists, summary-extract, websearch, progress, commit, reference, skill-section, step-verify, context-triage, suggest-alternatives, spot-check, migrate, event, dashboard [port|stop], tmux detect, help';
1276
+ error(`Unknown command: ${args.join(' ')}\nCommands: ${allCommands}`);
1277
+ }
1278
+ } catch (e) {
1279
+ getCore().error(e.message);
1280
+ }
1281
+ }
1282
+
1283
+ if (require.main === module || process.argv[1] === __filename) {
1284
+ main().catch(err => { process.stderr.write(err.message + '\n'); process.exit(1); });
1285
+ }
1286
+
1287
+ module.exports = { main };