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