@sienklogic/plan-build-run 2.18.1 → 2.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1265 -296
- package/CLAUDE.md +56 -34
- 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 +142 -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 +213 -0
- package/dashboard/server/routes/config.js +64 -0
- package/dashboard/server/routes/health.js +95 -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 +214 -0
- package/dashboard/server/services/file-watcher.js +105 -0
- package/dashboard/server/services/planning-reader.js +741 -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 +1420 -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 +100 -0
- package/plugins/pbr/agents/audit.md +205 -89
- package/plugins/pbr/agents/codebase-mapper.md +158 -23
- package/plugins/pbr/agents/debugger.md +222 -30
- 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 +270 -61
- package/plugins/pbr/agents/planner.md +440 -42
- package/plugins/pbr/agents/researcher.md +223 -36
- package/plugins/pbr/agents/roadmapper.md +397 -0
- package/plugins/pbr/agents/synthesizer.md +170 -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 +162 -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 +241 -0
- package/plugins/pbr/dist/check-read-first.js +345 -0
- package/plugins/pbr/dist/check-roadmap-sync.js +503 -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 +452 -0
- package/plugins/pbr/dist/check-summary-gate.js +199 -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 +172 -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 +606 -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 +569 -0
- package/plugins/pbr/dist/pbr-tools.js +2044 -0
- package/plugins/pbr/dist/post-bash-triage.js +154 -0
- package/plugins/pbr/dist/post-compact.js +135 -0
- package/plugins/pbr/dist/post-hoc.js +286 -0
- package/plugins/pbr/dist/post-write-dispatch.js +279 -0
- package/plugins/pbr/dist/post-write-quality.js +208 -0
- package/plugins/pbr/dist/pre-bash-dispatch.js +218 -0
- package/plugins/pbr/dist/pre-skill-dispatch.js +114 -0
- package/plugins/pbr/dist/pre-task-dispatch.js +297 -0
- package/plugins/pbr/dist/pre-write-dispatch.js +234 -0
- package/plugins/pbr/dist/progress-tracker.js +198 -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 +683 -0
- package/plugins/pbr/dist/session-tracker.js +124 -0
- package/plugins/pbr/dist/status-line.js +847 -0
- package/plugins/pbr/dist/suggest-compact.js +315 -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 +271 -0
- package/plugins/pbr/dist/validate-skill-args.js +222 -0
- package/plugins/pbr/dist/validate-task.js +301 -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 +40 -9
- 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/behavioral-contexts.md +53 -0
- package/plugins/pbr/references/checkpoints.md +723 -104
- package/plugins/pbr/references/config-reference.md +472 -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 +466 -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 +1211 -0
- package/plugins/pbr/scripts/audit-dimensions.js +556 -0
- package/plugins/pbr/scripts/auto-continue.js +198 -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 +162 -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 +166 -277
- package/plugins/pbr/scripts/check-read-first.js +345 -0
- package/plugins/pbr/scripts/check-roadmap-sync.js +167 -10
- 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 +338 -276
- package/plugins/pbr/scripts/check-summary-gate.js +2 -1
- package/plugins/pbr/scripts/config-schema.json +1247 -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 +128 -77
- package/plugins/pbr/scripts/event-logger.js +58 -25
- package/plugins/pbr/scripts/feedback-loop.js +172 -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 +606 -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/autonomy.js +91 -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/circuit-state.js +133 -0
- package/plugins/pbr/scripts/lib/commands.js +483 -0
- package/plugins/pbr/scripts/lib/completion.js +377 -0
- package/plugins/pbr/scripts/lib/compound.js +216 -0
- package/plugins/pbr/scripts/lib/config.js +1315 -0
- package/plugins/pbr/scripts/lib/context.js +254 -0
- package/plugins/pbr/scripts/lib/contextual-help.js +207 -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 +1050 -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 +143 -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 +133 -0
- package/plugins/pbr/scripts/lib/help.js +151 -0
- package/plugins/pbr/scripts/lib/history.js +150 -0
- package/plugins/pbr/scripts/lib/hypothesis-runner.js +127 -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/local-llm/client.js +237 -0
- package/plugins/pbr/scripts/lib/local-llm/health.js +12 -0
- package/plugins/pbr/scripts/lib/local-llm/index.js +89 -0
- package/plugins/pbr/scripts/lib/local-llm/metrics.js +20 -0
- package/plugins/pbr/scripts/lib/local-llm/operations/classify-artifact.js +4 -0
- package/plugins/pbr/scripts/lib/local-llm/operations/classify-commit.js +4 -0
- package/plugins/pbr/scripts/lib/local-llm/operations/classify-error.js +4 -0
- package/plugins/pbr/scripts/lib/local-llm/operations/classify-file-intent.js +4 -0
- package/plugins/pbr/scripts/lib/local-llm/operations/score-source.js +72 -0
- package/plugins/pbr/scripts/lib/local-llm/operations/summarize-context.js +62 -0
- package/plugins/pbr/scripts/lib/local-llm/operations/triage-test-output.js +12 -0
- package/plugins/pbr/scripts/lib/local-llm/operations/validate-task.js +4 -0
- package/plugins/pbr/scripts/lib/local-llm/router.js +101 -0
- package/plugins/pbr/scripts/lib/local-llm/shadow.js +60 -0
- package/plugins/pbr/scripts/lib/local-llm/threshold-tuner.js +118 -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 +1027 -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 +133 -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 +1113 -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 +207 -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 +642 -0
- package/plugins/pbr/scripts/lib/state-queue.js +171 -0
- package/plugins/pbr/scripts/lib/state.js +1187 -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/team-composer.js +87 -0
- package/plugins/pbr/scripts/lib/team-coordinator.js +153 -0
- package/plugins/pbr/scripts/lib/tech-debt-scanner.js +116 -0
- package/plugins/pbr/scripts/lib/template.js +222 -0
- package/plugins/pbr/scripts/lib/templates.js +362 -0
- package/plugins/pbr/scripts/lib/test-cache.js +54 -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/trust-gate.js +84 -0
- package/plugins/pbr/scripts/lib/verify.js +1473 -0
- package/plugins/pbr/scripts/lib/wiring-check.js +196 -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 +569 -0
- package/plugins/pbr/scripts/package.json +1 -0
- package/plugins/pbr/scripts/pbr-tools.js +1833 -1167
- package/plugins/pbr/scripts/post-bash-triage.js +154 -0
- package/plugins/pbr/scripts/post-compact.js +135 -0
- package/plugins/pbr/scripts/post-hoc.js +286 -0
- package/plugins/pbr/scripts/post-write-dispatch.js +237 -31
- package/plugins/pbr/scripts/post-write-quality.js +4 -3
- package/plugins/pbr/scripts/pre-bash-dispatch.js +155 -23
- package/plugins/pbr/scripts/pre-skill-dispatch.js +114 -0
- package/plugins/pbr/scripts/pre-task-dispatch.js +297 -0
- package/plugins/pbr/scripts/pre-write-dispatch.js +171 -47
- package/plugins/pbr/scripts/progress-tracker.js +144 -307
- 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 +458 -29
- package/plugins/pbr/scripts/session-tracker.js +124 -0
- package/plugins/pbr/scripts/status-line.js +591 -32
- package/plugins/pbr/scripts/suggest-compact.js +203 -7
- 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 +163 -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 +97 -26
- package/plugins/pbr/scripts/validate-skill-args.js +87 -15
- package/plugins/pbr/scripts/validate-task.js +112 -626
- 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 +507 -153
- package/plugins/pbr/skills/begin/templates/STATE.md.tmpl +1 -2
- package/plugins/pbr/skills/begin/templates/config.json.tmpl +415 -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 +111 -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 +44 -117
- package/plugins/pbr/skills/help/SKILL.md +83 -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 +53 -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 +226 -0
- package/plugins/pbr/skills/quick/SKILL.md +434 -100
- package/plugins/pbr/skills/release/SKILL.md +206 -0
- package/plugins/pbr/skills/resume/SKILL.md +169 -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 +151 -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 +149 -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 +47 -54
- 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 +184 -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 -636
- 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 -244
- package/dashboard/src/services/sse.service.js +0 -58
- package/dashboard/src/services/todo.service.js +0 -263
- 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 -6
- package/dashboard/src/views/partials/layout-top.ejs +0 -15
- 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 -155
- 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 -94
- 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 -172
- 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 -199
- 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 -274
- 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 -171
- 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 -198
- 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 -274
- 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
|
@@ -20,19 +20,39 @@
|
|
|
20
20
|
const fs = require('fs');
|
|
21
21
|
const path = require('path');
|
|
22
22
|
const { logHook } = require('./hook-logger');
|
|
23
|
+
const { resolveConfig } = require('./lib/local-llm/health');
|
|
24
|
+
const { validateTask: llmValidateTask } = require('./lib/local-llm/operations/validate-task');
|
|
25
|
+
const { checkNonPbrAgent } = require('./enforce-pbr-workflow');
|
|
26
|
+
const { KNOWN_AGENTS } = require('./lib/core');
|
|
27
|
+
|
|
28
|
+
// Gate modules
|
|
29
|
+
const { checkQuickExecutorGate } = require('./lib/gates/quick-executor');
|
|
30
|
+
const { checkBuildExecutorGate } = require('./lib/gates/build-executor');
|
|
31
|
+
const { checkPlanExecutorGate } = require('./lib/gates/plan-executor');
|
|
32
|
+
const { checkReviewPlannerGate } = require('./lib/gates/review-planner');
|
|
33
|
+
const { checkReviewVerifierGate } = require('./lib/gates/review-verifier');
|
|
34
|
+
const { checkMilestoneCompleteGate, getVerificationStatus } = require('./lib/gates/milestone-complete');
|
|
35
|
+
const { checkMilestoneSummaryGate } = require('./lib/gates/milestone-summary');
|
|
36
|
+
const { checkBuildDependencyGate } = require('./lib/gates/build-dependency');
|
|
37
|
+
const { checkPlanValidationGate } = require('./lib/gates/plan-validation');
|
|
38
|
+
const { checkDebuggerAdvisory, checkCheckpointManifest, checkActiveSkillIntegrity } = require('./lib/gates/advisories');
|
|
39
|
+
const { checkDocExistence } = require('./lib/gates/doc-existence');
|
|
40
|
+
const { checkUserConfirmationGate } = require('./lib/gates/user-confirmation');
|
|
23
41
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Load and resolve the local_llm config block from .planning/config.json.
|
|
44
|
+
* Returns a resolved config (always safe to use — disabled by default on error).
|
|
45
|
+
* @param {string} cwd - working directory to resolve .planning/config.json from
|
|
46
|
+
*/
|
|
47
|
+
function loadLocalLlmConfig(cwd) {
|
|
48
|
+
try {
|
|
49
|
+
const configPath = path.join(cwd, '.planning', 'config.json');
|
|
50
|
+
const parsed = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
51
|
+
return resolveConfig(parsed.local_llm);
|
|
52
|
+
} catch (_e) {
|
|
53
|
+
return resolveConfig(undefined);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
36
56
|
|
|
37
57
|
const MAX_DESCRIPTION_LENGTH = 100;
|
|
38
58
|
|
|
@@ -49,7 +69,7 @@ function checkTask(data) {
|
|
|
49
69
|
|
|
50
70
|
// Check description exists and is non-empty
|
|
51
71
|
if (!description || (typeof description === 'string' && !description.trim())) {
|
|
52
|
-
warnings.push('Task() called without a description. Descriptions
|
|
72
|
+
warnings.push('Task() called without a description. Descriptions are required for audit logging and skill enforcement. Add a short description (3-5 words), e.g.: "Build phase 3 executor".');
|
|
53
73
|
} else if (typeof description === 'string') {
|
|
54
74
|
// Check description length
|
|
55
75
|
if (description.length > MAX_DESCRIPTION_LENGTH) {
|
|
@@ -82,625 +102,31 @@ function checkTask(data) {
|
|
|
82
102
|
return warnings;
|
|
83
103
|
}
|
|
84
104
|
|
|
85
|
-
/**
|
|
86
|
-
* Blocking check: when the active skill is "quick" and an executor is being
|
|
87
|
-
* spawned, verify that at least one .planning/quick/{NNN}-{slug}/PLAN.md exists.
|
|
88
|
-
* Returns { block: true, reason: "..." } if the executor should be blocked,
|
|
89
|
-
* or null if it's OK to proceed.
|
|
90
|
-
*/
|
|
91
|
-
function checkQuickExecutorGate(data) {
|
|
92
|
-
const toolInput = data.tool_input || {};
|
|
93
|
-
const subagentType = toolInput.subagent_type || '';
|
|
94
|
-
|
|
95
|
-
// Only gate pbr:executor
|
|
96
|
-
if (subagentType !== 'pbr:executor') return null;
|
|
97
|
-
|
|
98
|
-
const cwd = process.cwd();
|
|
99
|
-
const planningDir = path.join(cwd, '.planning');
|
|
100
|
-
const activeSkillFile = path.join(planningDir, '.active-skill');
|
|
101
|
-
|
|
102
|
-
// Only gate when active skill is "quick"
|
|
103
|
-
try {
|
|
104
|
-
const activeSkill = fs.readFileSync(activeSkillFile, 'utf8').trim();
|
|
105
|
-
if (activeSkill !== 'quick') return null;
|
|
106
|
-
} catch (_e) {
|
|
107
|
-
// No .active-skill file — not in a quick task flow
|
|
108
|
-
return null;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Check for any PLAN.md in .planning/quick/*/
|
|
112
|
-
const quickDir = path.join(planningDir, 'quick');
|
|
113
|
-
if (!fs.existsSync(quickDir)) {
|
|
114
|
-
return {
|
|
115
|
-
block: true,
|
|
116
|
-
reason: 'Cannot spawn executor: .planning/quick/ directory does not exist. ' +
|
|
117
|
-
'You must create the quick task directory and PLAN.md first (Steps 4-6). ' +
|
|
118
|
-
'To fix: Re-run /pbr:quick to create the quick task directory and PLAN.md.'
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
try {
|
|
123
|
-
const dirs = fs.readdirSync(quickDir).filter(d => {
|
|
124
|
-
return /^\d{3}-/.test(d) && fs.statSync(path.join(quickDir, d)).isDirectory();
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
// Look for the most recent quick task dir that has a PLAN.md
|
|
128
|
-
const hasPlan = dirs.some(d => {
|
|
129
|
-
const planFile = path.join(quickDir, d, 'PLAN.md');
|
|
130
|
-
try {
|
|
131
|
-
const stat = fs.statSync(planFile);
|
|
132
|
-
return stat.size > 0;
|
|
133
|
-
} catch (_e) {
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
if (!hasPlan) {
|
|
139
|
-
return {
|
|
140
|
-
block: true,
|
|
141
|
-
reason: 'Cannot spawn executor: no PLAN.md found in any .planning/quick/*/ directory. ' +
|
|
142
|
-
'You must create .planning/quick/{NNN}-{slug}/PLAN.md first (Steps 4-6). ' +
|
|
143
|
-
'To fix: Re-run /pbr:quick to create the quick task directory and PLAN.md.'
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
} catch (_e) {
|
|
147
|
-
return {
|
|
148
|
-
block: true,
|
|
149
|
-
reason: 'Cannot spawn executor: failed to read .planning/quick/ directory. ' +
|
|
150
|
-
'To fix: Re-run /pbr:quick to create the quick task directory and PLAN.md.'
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
return null;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Blocking check: when the active skill is "build" and an executor is being
|
|
159
|
-
* spawned, verify that a PLAN*.md exists in the current phase directory.
|
|
160
|
-
* Returns { block: true, reason: "..." } if blocked, or null if OK.
|
|
161
|
-
*/
|
|
162
|
-
function checkBuildExecutorGate(data) {
|
|
163
|
-
const toolInput = data.tool_input || {};
|
|
164
|
-
const subagentType = toolInput.subagent_type || '';
|
|
165
|
-
|
|
166
|
-
// Only gate pbr:executor
|
|
167
|
-
if (subagentType !== 'pbr:executor') return null;
|
|
168
|
-
|
|
169
|
-
const cwd = process.cwd();
|
|
170
|
-
const planningDir = path.join(cwd, '.planning');
|
|
171
|
-
const activeSkillFile = path.join(planningDir, '.active-skill');
|
|
172
|
-
|
|
173
|
-
// Only gate when active skill is "build"
|
|
174
|
-
try {
|
|
175
|
-
const activeSkill = fs.readFileSync(activeSkillFile, 'utf8').trim();
|
|
176
|
-
if (activeSkill !== 'build') return null;
|
|
177
|
-
} catch (_e) {
|
|
178
|
-
return null;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// Read STATE.md for current phase
|
|
182
|
-
const stateFile = path.join(planningDir, 'STATE.md');
|
|
183
|
-
try {
|
|
184
|
-
const state = fs.readFileSync(stateFile, 'utf8');
|
|
185
|
-
const phaseMatch = state.match(/Phase:\s*(\d+)\s+of\s+\d+/);
|
|
186
|
-
if (!phaseMatch) return null;
|
|
187
|
-
|
|
188
|
-
const currentPhase = phaseMatch[1].padStart(2, '0');
|
|
189
|
-
const phasesDir = path.join(planningDir, 'phases');
|
|
190
|
-
if (!fs.existsSync(phasesDir)) {
|
|
191
|
-
return {
|
|
192
|
-
block: true,
|
|
193
|
-
reason: 'Cannot spawn executor: .planning/phases/ directory does not exist. To fix: Run /pbr:plan {N} to create plans first.'
|
|
194
|
-
};
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
const dirs = fs.readdirSync(phasesDir).filter(d => d.startsWith(currentPhase + '-'));
|
|
198
|
-
if (dirs.length === 0) {
|
|
199
|
-
return {
|
|
200
|
-
block: true,
|
|
201
|
-
reason: `Cannot spawn executor: no phase directory found for phase ${currentPhase}. To fix: Run /pbr:plan ${currentPhase} to create plans first.`
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
const phaseDir = path.join(phasesDir, dirs[0]);
|
|
206
|
-
const files = fs.readdirSync(phaseDir);
|
|
207
|
-
const hasPlan = files.some(f => {
|
|
208
|
-
if (!/^PLAN.*\.md$/i.test(f)) return false;
|
|
209
|
-
try {
|
|
210
|
-
return fs.statSync(path.join(phaseDir, f)).size > 0;
|
|
211
|
-
} catch (_e) {
|
|
212
|
-
return false;
|
|
213
|
-
}
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
if (!hasPlan) {
|
|
217
|
-
return {
|
|
218
|
-
block: true,
|
|
219
|
-
reason: `Cannot spawn executor: no PLAN.md found in .planning/phases/${dirs[0]}/. To fix: Run /pbr:plan ${currentPhase} to create plans first.`
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
} catch (_e) {
|
|
223
|
-
return null;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
return null;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* Blocking check: when the active skill is "plan", block executor spawning.
|
|
231
|
-
* The plan skill should never spawn executors.
|
|
232
|
-
* Returns { block: true, reason: "..." } if blocked, or null if OK.
|
|
233
|
-
*/
|
|
234
|
-
function checkPlanExecutorGate(data) {
|
|
235
|
-
const toolInput = data.tool_input || {};
|
|
236
|
-
const subagentType = toolInput.subagent_type || '';
|
|
237
|
-
|
|
238
|
-
// Only gate pbr:executor
|
|
239
|
-
if (subagentType !== 'pbr:executor') return null;
|
|
240
|
-
|
|
241
|
-
const cwd = process.cwd();
|
|
242
|
-
const planningDir = path.join(cwd, '.planning');
|
|
243
|
-
const activeSkillFile = path.join(planningDir, '.active-skill');
|
|
244
|
-
|
|
245
|
-
try {
|
|
246
|
-
const activeSkill = fs.readFileSync(activeSkillFile, 'utf8').trim();
|
|
247
|
-
if (activeSkill !== 'plan') return null;
|
|
248
|
-
} catch (_e) {
|
|
249
|
-
return null;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
return {
|
|
253
|
-
block: true,
|
|
254
|
-
reason: 'Plan skill should not spawn executors. To fix: Run /pbr:build to execute plans. The plan skill creates plans; the build skill executes them.'
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* Blocking check: when the active skill is "review" and a planner is being
|
|
260
|
-
* spawned, verify that a VERIFICATION.md exists in the current phase directory.
|
|
261
|
-
* Returns { block: true, reason: "..." } if blocked, or null if OK.
|
|
262
|
-
*/
|
|
263
|
-
function checkReviewPlannerGate(data) {
|
|
264
|
-
const toolInput = data.tool_input || {};
|
|
265
|
-
const subagentType = toolInput.subagent_type || '';
|
|
266
|
-
|
|
267
|
-
// Only gate pbr:planner
|
|
268
|
-
if (subagentType !== 'pbr:planner') return null;
|
|
269
|
-
|
|
270
|
-
const cwd = process.cwd();
|
|
271
|
-
const planningDir = path.join(cwd, '.planning');
|
|
272
|
-
const activeSkillFile = path.join(planningDir, '.active-skill');
|
|
273
|
-
|
|
274
|
-
// Only gate when active skill is "review"
|
|
275
|
-
try {
|
|
276
|
-
const activeSkill = fs.readFileSync(activeSkillFile, 'utf8').trim();
|
|
277
|
-
if (activeSkill !== 'review') return null;
|
|
278
|
-
} catch (_e) {
|
|
279
|
-
return null;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
// Read STATE.md for current phase
|
|
283
|
-
const stateFile = path.join(planningDir, 'STATE.md');
|
|
284
|
-
try {
|
|
285
|
-
const state = fs.readFileSync(stateFile, 'utf8');
|
|
286
|
-
const phaseMatch = state.match(/Phase:\s*(\d+)/);
|
|
287
|
-
if (!phaseMatch) return null;
|
|
288
|
-
|
|
289
|
-
const currentPhase = phaseMatch[1].padStart(2, '0');
|
|
290
|
-
const phasesDir = path.join(planningDir, 'phases');
|
|
291
|
-
if (!fs.existsSync(phasesDir)) return null;
|
|
292
|
-
|
|
293
|
-
const dirs = fs.readdirSync(phasesDir).filter(d => d.startsWith(currentPhase + '-'));
|
|
294
|
-
if (dirs.length === 0) return null;
|
|
295
|
-
|
|
296
|
-
const phaseDir = path.join(phasesDir, dirs[0]);
|
|
297
|
-
const hasVerification = fs.existsSync(path.join(phaseDir, 'VERIFICATION.md'));
|
|
298
|
-
|
|
299
|
-
if (!hasVerification) {
|
|
300
|
-
return {
|
|
301
|
-
block: true,
|
|
302
|
-
reason: 'Review planner gate: Cannot spawn planner for gap closure without a VERIFICATION.md. To fix: Run /pbr:review {N} to create VERIFICATION.md first.'
|
|
303
|
-
};
|
|
304
|
-
}
|
|
305
|
-
} catch (_e) {
|
|
306
|
-
return null;
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
return null;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
/**
|
|
313
|
-
* Blocking check: when the active skill is "review" and a verifier is being
|
|
314
|
-
* spawned, verify that a SUMMARY*.md exists in the current phase directory.
|
|
315
|
-
* Returns { block: true, reason: "..." } if blocked, or null if OK.
|
|
316
|
-
*/
|
|
317
|
-
function checkReviewVerifierGate(data) {
|
|
318
|
-
const toolInput = data.tool_input || {};
|
|
319
|
-
const subagentType = toolInput.subagent_type || '';
|
|
320
|
-
|
|
321
|
-
// Only gate pbr:verifier
|
|
322
|
-
if (subagentType !== 'pbr:verifier') return null;
|
|
323
|
-
|
|
324
|
-
const cwd = process.cwd();
|
|
325
|
-
const planningDir = path.join(cwd, '.planning');
|
|
326
|
-
const activeSkillFile = path.join(planningDir, '.active-skill');
|
|
327
|
-
|
|
328
|
-
// Only gate when active skill is "review"
|
|
329
|
-
try {
|
|
330
|
-
const activeSkill = fs.readFileSync(activeSkillFile, 'utf8').trim();
|
|
331
|
-
if (activeSkill !== 'review') return null;
|
|
332
|
-
} catch (_e) {
|
|
333
|
-
return null;
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
// Read STATE.md for current phase
|
|
337
|
-
const stateFile = path.join(planningDir, 'STATE.md');
|
|
338
|
-
try {
|
|
339
|
-
const state = fs.readFileSync(stateFile, 'utf8');
|
|
340
|
-
const phaseMatch = state.match(/Phase:\s*(\d+)/);
|
|
341
|
-
if (!phaseMatch) return null;
|
|
342
|
-
|
|
343
|
-
const currentPhase = phaseMatch[1].padStart(2, '0');
|
|
344
|
-
const phasesDir = path.join(planningDir, 'phases');
|
|
345
|
-
if (!fs.existsSync(phasesDir)) return null;
|
|
346
|
-
|
|
347
|
-
const dirs = fs.readdirSync(phasesDir).filter(d => d.startsWith(currentPhase + '-'));
|
|
348
|
-
if (dirs.length === 0) return null;
|
|
349
|
-
|
|
350
|
-
const phaseDir = path.join(phasesDir, dirs[0]);
|
|
351
|
-
const files = fs.readdirSync(phaseDir);
|
|
352
|
-
const hasSummary = files.some(f => {
|
|
353
|
-
if (!/^SUMMARY/i.test(f)) return false;
|
|
354
|
-
try {
|
|
355
|
-
return fs.statSync(path.join(phaseDir, f)).size > 0;
|
|
356
|
-
} catch (_e) {
|
|
357
|
-
return false;
|
|
358
|
-
}
|
|
359
|
-
});
|
|
360
|
-
|
|
361
|
-
if (!hasSummary) {
|
|
362
|
-
return {
|
|
363
|
-
block: true,
|
|
364
|
-
reason: 'Review verifier gate: Cannot spawn verifier without SUMMARY.md in phase directory. To fix: Run /pbr:build {N} to create SUMMARY.md first.'
|
|
365
|
-
};
|
|
366
|
-
}
|
|
367
|
-
} catch (_e) {
|
|
368
|
-
return null;
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
return null;
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
/**
|
|
375
|
-
* Blocking check: when the active skill is "milestone" and a general/planner agent
|
|
376
|
-
* is being spawned for a "complete" operation, verify all milestone phases have VERIFICATION.md.
|
|
377
|
-
* Returns { block: true, reason: "..." } if blocked, or null if OK.
|
|
378
|
-
*/
|
|
379
|
-
function checkMilestoneCompleteGate(data) {
|
|
380
|
-
const toolInput = data.tool_input || {};
|
|
381
|
-
const subagentType = toolInput.subagent_type || '';
|
|
382
|
-
const description = toolInput.description || '';
|
|
383
|
-
|
|
384
|
-
const cwd = process.cwd();
|
|
385
|
-
const planningDir = path.join(cwd, '.planning');
|
|
386
|
-
const activeSkillFile = path.join(planningDir, '.active-skill');
|
|
387
|
-
|
|
388
|
-
// Only gate when active skill is "milestone"
|
|
389
|
-
try {
|
|
390
|
-
const activeSkill = fs.readFileSync(activeSkillFile, 'utf8').trim();
|
|
391
|
-
if (activeSkill !== 'milestone') return null;
|
|
392
|
-
} catch (_e) {
|
|
393
|
-
return null;
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
// Only gate pbr:general and pbr:planner
|
|
397
|
-
if (subagentType !== 'pbr:general' && subagentType !== 'pbr:planner') return null;
|
|
398
|
-
|
|
399
|
-
// Only gate "complete" operations
|
|
400
|
-
if (!/complete/i.test(description)) return null;
|
|
401
|
-
|
|
402
|
-
// Read STATE.md for current phase
|
|
403
|
-
const stateFile = path.join(planningDir, 'STATE.md');
|
|
404
|
-
let currentPhase;
|
|
405
|
-
try {
|
|
406
|
-
const state = fs.readFileSync(stateFile, 'utf8');
|
|
407
|
-
const fmMatch = state.match(/current_phase:\s*(\d+)/);
|
|
408
|
-
if (fmMatch) {
|
|
409
|
-
currentPhase = parseInt(fmMatch[1], 10);
|
|
410
|
-
} else {
|
|
411
|
-
const bodyMatch = state.match(/Phase:\s*(\d+)/);
|
|
412
|
-
if (bodyMatch) currentPhase = parseInt(bodyMatch[1], 10);
|
|
413
|
-
}
|
|
414
|
-
if (!currentPhase) return null;
|
|
415
|
-
} catch (_e) {
|
|
416
|
-
return null;
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
// Read ROADMAP.md and find the milestone containing the current phase
|
|
420
|
-
const roadmapFile = path.join(planningDir, 'ROADMAP.md');
|
|
421
|
-
try {
|
|
422
|
-
const roadmap = fs.readFileSync(roadmapFile, 'utf8');
|
|
423
|
-
|
|
424
|
-
// Split into milestone sections
|
|
425
|
-
const milestoneSections = roadmap.split(/^## Milestone:/m).slice(1);
|
|
426
|
-
|
|
427
|
-
for (const section of milestoneSections) {
|
|
428
|
-
// Parse phase numbers from table rows
|
|
429
|
-
const phaseNumbers = [];
|
|
430
|
-
const tableRowRegex = /^\|\s*(\d+)\s*\|/gm;
|
|
431
|
-
let match;
|
|
432
|
-
while ((match = tableRowRegex.exec(section)) !== null) {
|
|
433
|
-
phaseNumbers.push(parseInt(match[1], 10));
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
// Check if current phase is in this milestone
|
|
437
|
-
if (!phaseNumbers.includes(currentPhase)) continue;
|
|
438
|
-
|
|
439
|
-
// Found the right milestone — check all phases have VERIFICATION.md
|
|
440
|
-
const phasesDir = path.join(planningDir, 'phases');
|
|
441
|
-
if (!fs.existsSync(phasesDir)) return null;
|
|
442
|
-
|
|
443
|
-
for (const phaseNum of phaseNumbers) {
|
|
444
|
-
const paddedPhase = String(phaseNum).padStart(2, '0');
|
|
445
|
-
const pDirs = fs.readdirSync(phasesDir).filter(d => d.startsWith(paddedPhase + '-'));
|
|
446
|
-
if (pDirs.length === 0) {
|
|
447
|
-
return {
|
|
448
|
-
block: true,
|
|
449
|
-
reason: `Milestone complete gate: Phase ${paddedPhase} directory not found. All milestone phases must be verified before completing milestone. To fix: Run /pbr:review ${paddedPhase} — phase must have status: passed.`
|
|
450
|
-
};
|
|
451
|
-
}
|
|
452
|
-
const verificationFile = path.join(phasesDir, pDirs[0], 'VERIFICATION.md');
|
|
453
|
-
const hasVerification = fs.existsSync(verificationFile);
|
|
454
|
-
if (!hasVerification) {
|
|
455
|
-
return {
|
|
456
|
-
block: true,
|
|
457
|
-
reason: `Milestone complete gate: Phase ${paddedPhase} (${pDirs[0]}) lacks VERIFICATION.md. All milestone phases must be verified before completing milestone. To fix: Run /pbr:review ${paddedPhase} — phase must have status: passed.`
|
|
458
|
-
};
|
|
459
|
-
}
|
|
460
|
-
const verStatus = getVerificationStatus(verificationFile);
|
|
461
|
-
if (verStatus === 'gaps_found') {
|
|
462
|
-
return {
|
|
463
|
-
block: true,
|
|
464
|
-
reason: `Milestone complete gate: Phase ${paddedPhase} VERIFICATION.md has status: gaps_found. Close all gaps before completing milestone. To fix: Run /pbr:review ${paddedPhase} — phase must have status: passed.`
|
|
465
|
-
};
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
// All phases verified
|
|
470
|
-
return null;
|
|
471
|
-
}
|
|
472
|
-
} catch (_e) {
|
|
473
|
-
return null;
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
return null;
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
/**
|
|
480
|
-
* Blocking check: when the active skill is "build" and an executor is being
|
|
481
|
-
* spawned, verify that dependent phases (from ROADMAP.md) have VERIFICATION.md.
|
|
482
|
-
* Returns { block: true, reason: "..." } if blocked, or null if OK.
|
|
483
|
-
*/
|
|
484
|
-
function checkBuildDependencyGate(data) {
|
|
485
|
-
const toolInput = data.tool_input || {};
|
|
486
|
-
const subagentType = toolInput.subagent_type || '';
|
|
487
|
-
|
|
488
|
-
// Only gate pbr:executor
|
|
489
|
-
if (subagentType !== 'pbr:executor') return null;
|
|
490
|
-
|
|
491
|
-
const cwd = process.cwd();
|
|
492
|
-
const planningDir = path.join(cwd, '.planning');
|
|
493
|
-
const activeSkillFile = path.join(planningDir, '.active-skill');
|
|
494
|
-
|
|
495
|
-
// Only gate when active skill is "build"
|
|
496
|
-
try {
|
|
497
|
-
const activeSkill = fs.readFileSync(activeSkillFile, 'utf8').trim();
|
|
498
|
-
if (activeSkill !== 'build') return null;
|
|
499
|
-
} catch (_e) {
|
|
500
|
-
return null;
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
// Read STATE.md for current phase
|
|
504
|
-
const stateFile = path.join(planningDir, 'STATE.md');
|
|
505
|
-
let currentPhase;
|
|
506
|
-
try {
|
|
507
|
-
const state = fs.readFileSync(stateFile, 'utf8');
|
|
508
|
-
const phaseMatch = state.match(/Phase:\s*(\d+)/);
|
|
509
|
-
if (!phaseMatch) return null;
|
|
510
|
-
currentPhase = parseInt(phaseMatch[1], 10);
|
|
511
|
-
} catch (_e) {
|
|
512
|
-
return null;
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
// Read ROADMAP.md, find current phase section, check dependencies
|
|
516
|
-
const roadmapFile = path.join(planningDir, 'ROADMAP.md');
|
|
517
|
-
try {
|
|
518
|
-
const roadmap = fs.readFileSync(roadmapFile, 'utf8');
|
|
519
|
-
|
|
520
|
-
// Find ### Phase N: section
|
|
521
|
-
const phaseRegex = new RegExp(`### Phase ${currentPhase}:[\\s\\S]*?(?=### Phase \\d|$)`);
|
|
522
|
-
const phaseSection = roadmap.match(phaseRegex);
|
|
523
|
-
if (!phaseSection) return null;
|
|
524
|
-
|
|
525
|
-
// Look for **Depends on:** line
|
|
526
|
-
const depMatch = phaseSection[0].match(/\*\*Depends on:\*\*\s*(.*)/);
|
|
527
|
-
if (!depMatch) return null;
|
|
528
|
-
|
|
529
|
-
const depLine = depMatch[1].trim();
|
|
530
|
-
if (!depLine || /^none$/i.test(depLine)) return null;
|
|
531
|
-
|
|
532
|
-
// Parse phase numbers from "Phase 1", "Phase 1, Phase 2", etc.
|
|
533
|
-
const depPhases = [];
|
|
534
|
-
const depRegex = /Phase\s+(\d+)/gi;
|
|
535
|
-
let match;
|
|
536
|
-
while ((match = depRegex.exec(depLine)) !== null) {
|
|
537
|
-
depPhases.push(parseInt(match[1], 10));
|
|
538
|
-
}
|
|
539
|
-
|
|
540
|
-
if (depPhases.length === 0) return null;
|
|
541
|
-
|
|
542
|
-
// Check each dependent phase has VERIFICATION.md
|
|
543
|
-
const phasesDir = path.join(planningDir, 'phases');
|
|
544
|
-
if (!fs.existsSync(phasesDir)) return null;
|
|
545
|
-
|
|
546
|
-
for (const depPhase of depPhases) {
|
|
547
|
-
const paddedPhase = String(depPhase).padStart(2, '0');
|
|
548
|
-
const pDirs = fs.readdirSync(phasesDir).filter(d => d.startsWith(paddedPhase + '-'));
|
|
549
|
-
if (pDirs.length === 0) {
|
|
550
|
-
return {
|
|
551
|
-
block: true,
|
|
552
|
-
reason: `Build dependency gate: Dependent phase ${paddedPhase} lacks VERIFICATION.md. To fix: Run /pbr:review on the dependency phase first.`
|
|
553
|
-
};
|
|
554
|
-
}
|
|
555
|
-
const hasVerification = fs.existsSync(path.join(phasesDir, pDirs[0], 'VERIFICATION.md'));
|
|
556
|
-
if (!hasVerification) {
|
|
557
|
-
return {
|
|
558
|
-
block: true,
|
|
559
|
-
reason: `Build dependency gate: Dependent phase ${paddedPhase} lacks VERIFICATION.md. To fix: Run /pbr:review on the dependency phase first.`
|
|
560
|
-
};
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
} catch (_e) {
|
|
564
|
-
return null;
|
|
565
|
-
}
|
|
566
|
-
|
|
567
|
-
return null;
|
|
568
|
-
}
|
|
569
|
-
|
|
570
|
-
/**
|
|
571
|
-
* Advisory check: when active skill is "build" and an executor is being
|
|
572
|
-
* spawned, warn if .checkpoint-manifest.json is missing in the phase dir.
|
|
573
|
-
* Returns a warning string or null.
|
|
574
|
-
*/
|
|
575
|
-
/**
|
|
576
|
-
* Parse VERIFICATION.md frontmatter to extract status field.
|
|
577
|
-
* Returns the status string or 'unknown' if not parseable.
|
|
578
|
-
*/
|
|
579
|
-
function getVerificationStatus(filePath) {
|
|
580
|
-
try {
|
|
581
|
-
const content = fs.readFileSync(filePath, 'utf8');
|
|
582
|
-
const fmMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
583
|
-
if (!fmMatch) return 'unknown';
|
|
584
|
-
const statusMatch = fmMatch[1].match(/^status:\s*(\S+)/m);
|
|
585
|
-
return statusMatch ? statusMatch[1] : 'unknown';
|
|
586
|
-
} catch (_e) {
|
|
587
|
-
return 'unknown';
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
/**
|
|
592
|
-
* Advisory check: when pbr:debugger is spawned and .active-skill is 'debug',
|
|
593
|
-
* warn if .planning/debug/ directory does not exist.
|
|
594
|
-
* Returns a warning string or null.
|
|
595
|
-
*/
|
|
596
|
-
function checkDebuggerAdvisory(data) {
|
|
597
|
-
const subagentType = data.tool_input?.subagent_type || '';
|
|
598
|
-
if (subagentType !== 'pbr:debugger') return null;
|
|
599
|
-
// Only advise when spawned from the debug skill
|
|
600
|
-
const activeSkillPath = path.join(process.cwd(), '.planning', '.active-skill');
|
|
601
|
-
try {
|
|
602
|
-
const activeSkill = fs.readFileSync(activeSkillPath, 'utf8').trim();
|
|
603
|
-
if (activeSkill !== 'debug') return null;
|
|
604
|
-
} catch (_e) {
|
|
605
|
-
return null; // No .active-skill file — skip advisory
|
|
606
|
-
}
|
|
607
|
-
const debugDir = path.join(process.cwd(), '.planning', 'debug');
|
|
608
|
-
if (!fs.existsSync(debugDir)) {
|
|
609
|
-
return 'Debugger advisory: .planning/debug/ does not exist. Create it before spawning the debugger so output has a target location.';
|
|
610
|
-
}
|
|
611
|
-
return null;
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
function checkCheckpointManifest(data) {
|
|
615
|
-
const toolInput = data.tool_input || {};
|
|
616
|
-
const subagentType = toolInput.subagent_type || '';
|
|
617
|
-
|
|
618
|
-
if (subagentType !== 'pbr:executor') return null;
|
|
619
|
-
|
|
620
|
-
const cwd = process.cwd();
|
|
621
|
-
const planningDir = path.join(cwd, '.planning');
|
|
622
|
-
const activeSkillFile = path.join(planningDir, '.active-skill');
|
|
623
|
-
|
|
624
|
-
try {
|
|
625
|
-
const activeSkill = fs.readFileSync(activeSkillFile, 'utf8').trim();
|
|
626
|
-
if (activeSkill !== 'build') return null;
|
|
627
|
-
} catch (_e) {
|
|
628
|
-
return null;
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
// Find current phase dir
|
|
632
|
-
const stateFile = path.join(planningDir, 'STATE.md');
|
|
633
|
-
try {
|
|
634
|
-
const state = fs.readFileSync(stateFile, 'utf8');
|
|
635
|
-
const phaseMatch = state.match(/Phase:\s*(\d+)\s+of\s+\d+/);
|
|
636
|
-
if (!phaseMatch) return null;
|
|
637
|
-
|
|
638
|
-
const currentPhase = phaseMatch[1].padStart(2, '0');
|
|
639
|
-
const phasesDir = path.join(planningDir, 'phases');
|
|
640
|
-
if (!fs.existsSync(phasesDir)) return null;
|
|
641
|
-
|
|
642
|
-
const dirs = fs.readdirSync(phasesDir).filter(d => d.startsWith(currentPhase + '-'));
|
|
643
|
-
if (dirs.length === 0) return null;
|
|
644
|
-
|
|
645
|
-
const phaseDir = path.join(phasesDir, dirs[0]);
|
|
646
|
-
const manifestFile = path.join(phaseDir, '.checkpoint-manifest.json');
|
|
647
|
-
if (!fs.existsSync(manifestFile)) {
|
|
648
|
-
return 'Build advisory: .checkpoint-manifest.json not found in phase directory. The build skill should write this before spawning executors. To fix: Run /pbr:health to regenerate checkpoint manifest.';
|
|
649
|
-
}
|
|
650
|
-
} catch (_e) {
|
|
651
|
-
return null;
|
|
652
|
-
}
|
|
653
|
-
|
|
654
|
-
return null;
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
/**
|
|
658
|
-
* Advisory check: when any pbr:* agent is being spawned, warn if
|
|
659
|
-
* .planning/.active-skill doesn't exist. Without this file, all
|
|
660
|
-
* skill-specific enforcement is silently disabled.
|
|
661
|
-
* Returns a warning string or null.
|
|
662
|
-
*/
|
|
663
|
-
function checkActiveSkillIntegrity(data) {
|
|
664
|
-
const toolInput = data.tool_input || {};
|
|
665
|
-
const subagentType = toolInput.subagent_type || '';
|
|
666
|
-
|
|
667
|
-
if (typeof subagentType !== 'string' || !subagentType.startsWith('pbr:')) return null;
|
|
668
|
-
|
|
669
|
-
const cwd = process.cwd();
|
|
670
|
-
const planningDir = path.join(cwd, '.planning');
|
|
671
|
-
|
|
672
|
-
// Only check if .planning/ exists (PBR project)
|
|
673
|
-
if (!fs.existsSync(planningDir)) return null;
|
|
674
|
-
|
|
675
|
-
const activeSkillFile = path.join(planningDir, '.active-skill');
|
|
676
|
-
if (!fs.existsSync(activeSkillFile)) {
|
|
677
|
-
return 'Active-skill integrity: .planning/.active-skill not found. Skill-specific enforcement is disabled. The invoking skill should write this file. To fix: Wait for the current skill to finish, or delete .planning/.active-skill if stale.';
|
|
678
|
-
}
|
|
679
|
-
|
|
680
|
-
// Stale lock detection: warn if .active-skill is older than 2 hours
|
|
681
|
-
try {
|
|
682
|
-
const stat = fs.statSync(activeSkillFile);
|
|
683
|
-
const ageMs = Date.now() - stat.mtimeMs;
|
|
684
|
-
const TWO_HOURS = 2 * 60 * 60 * 1000;
|
|
685
|
-
if (ageMs > TWO_HOURS) {
|
|
686
|
-
const ageHours = Math.round(ageMs / (60 * 60 * 1000));
|
|
687
|
-
const skill = fs.readFileSync(activeSkillFile, 'utf8').trim();
|
|
688
|
-
return `Active-skill integrity: .planning/.active-skill is ${ageHours}h old (skill: "${skill}"). This may be a stale lock from a crashed session. Run /pbr:health to diagnose, or delete .planning/.active-skill if the previous session is no longer running.`;
|
|
689
|
-
}
|
|
690
|
-
} catch (_e) { /* best-effort */ }
|
|
691
|
-
|
|
692
|
-
return null;
|
|
693
|
-
}
|
|
694
|
-
|
|
695
105
|
function main() {
|
|
696
106
|
let input = '';
|
|
697
107
|
|
|
698
108
|
process.stdin.setEncoding('utf8');
|
|
699
109
|
process.stdin.on('data', (chunk) => { input += chunk; });
|
|
700
|
-
process.stdin.on('end', () => {
|
|
110
|
+
process.stdin.on('end', async () => {
|
|
701
111
|
try {
|
|
702
112
|
const data = JSON.parse(input);
|
|
703
113
|
|
|
114
|
+
// Blocking gate: user confirmation required for gated operations
|
|
115
|
+
const userConfGate = checkUserConfirmationGate(data);
|
|
116
|
+
if (userConfGate && userConfGate.block) {
|
|
117
|
+
logHook('validate-task', 'PreToolUse', 'blocked', { reason: userConfGate.reason });
|
|
118
|
+
process.stdout.write(JSON.stringify({
|
|
119
|
+
decision: 'block',
|
|
120
|
+
reason: userConfGate.reason
|
|
121
|
+
}));
|
|
122
|
+
process.exit(2);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
// Advisory: non-blocking user confirmation warning
|
|
126
|
+
if (userConfGate && userConfGate.warning) {
|
|
127
|
+
logHook('validate-task', 'PreToolUse', 'warn', { warning: userConfGate.warning });
|
|
128
|
+
}
|
|
129
|
+
|
|
704
130
|
// Blocking gate: quick executor must have PLAN.md
|
|
705
131
|
const gate = checkQuickExecutorGate(data);
|
|
706
132
|
if (gate && gate.block) {
|
|
@@ -725,6 +151,15 @@ function main() {
|
|
|
725
151
|
return;
|
|
726
152
|
}
|
|
727
153
|
|
|
154
|
+
// Blocking gate: plan validation artifact must exist and pass
|
|
155
|
+
const planValGate = checkPlanValidationGate(data);
|
|
156
|
+
if (planValGate && planValGate.block) {
|
|
157
|
+
logHook('validate-task', 'PreToolUse', 'blocked', { reason: planValGate.reason });
|
|
158
|
+
process.stdout.write(JSON.stringify({ decision: 'block', reason: planValGate.reason }));
|
|
159
|
+
process.exit(2);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
|
|
728
163
|
// Blocking gate: review skill planner needs VERIFICATION.md
|
|
729
164
|
const reviewGate = checkReviewPlannerGate(data);
|
|
730
165
|
if (reviewGate && reviewGate.block) {
|
|
@@ -773,6 +208,18 @@ function main() {
|
|
|
773
208
|
return;
|
|
774
209
|
}
|
|
775
210
|
|
|
211
|
+
// Blocking gate: milestone complete needs SUMMARY.md in all phases
|
|
212
|
+
const milestoneSummaryGate = checkMilestoneSummaryGate(data);
|
|
213
|
+
if (milestoneSummaryGate && milestoneSummaryGate.block) {
|
|
214
|
+
logHook('validate-task', 'PreToolUse', 'blocked', { reason: milestoneSummaryGate.reason });
|
|
215
|
+
process.stdout.write(JSON.stringify({
|
|
216
|
+
decision: 'block',
|
|
217
|
+
reason: milestoneSummaryGate.reason
|
|
218
|
+
}));
|
|
219
|
+
process.exit(2);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
|
|
776
223
|
// Blocking gate: build dependency check
|
|
777
224
|
const buildDepGate = checkBuildDependencyGate(data);
|
|
778
225
|
if (buildDepGate && buildDepGate.block) {
|
|
@@ -785,14 +232,50 @@ function main() {
|
|
|
785
232
|
return;
|
|
786
233
|
}
|
|
787
234
|
|
|
235
|
+
// Blocking gate: PROJECT.md + REQUIREMENTS.md must exist for plan/build
|
|
236
|
+
const docGate = checkDocExistence(data);
|
|
237
|
+
if (docGate && docGate.block) {
|
|
238
|
+
logHook('validate-task', 'PreToolUse', 'blocked', { reason: docGate.reason });
|
|
239
|
+
process.stdout.write(JSON.stringify({
|
|
240
|
+
decision: 'block',
|
|
241
|
+
reason: docGate.reason
|
|
242
|
+
}));
|
|
243
|
+
process.exit(2);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Blocking/advisory gate: non-PBR agent enforcement
|
|
248
|
+
const nonPbrAgentResult = checkNonPbrAgent(data);
|
|
249
|
+
if (nonPbrAgentResult && nonPbrAgentResult.exitCode === 2) {
|
|
250
|
+
process.stdout.write(JSON.stringify(nonPbrAgentResult.output));
|
|
251
|
+
process.exit(2);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
|
|
788
255
|
// Advisory warnings
|
|
789
256
|
const warnings = checkTask(data);
|
|
257
|
+
if (userConfGate && userConfGate.warning) warnings.push(userConfGate.warning);
|
|
790
258
|
const manifestWarning = checkCheckpointManifest(data);
|
|
791
259
|
if (manifestWarning) warnings.push(manifestWarning);
|
|
792
260
|
const debuggerWarning = checkDebuggerAdvisory(data);
|
|
793
261
|
if (debuggerWarning) warnings.push(debuggerWarning);
|
|
794
262
|
const activeSkillWarning = checkActiveSkillIntegrity(data);
|
|
795
263
|
if (activeSkillWarning) warnings.push(activeSkillWarning);
|
|
264
|
+
if (nonPbrAgentResult) warnings.push(nonPbrAgentResult.output.additionalContext);
|
|
265
|
+
if (planValGate && planValGate.warning) warnings.push(planValGate.warning);
|
|
266
|
+
|
|
267
|
+
// LLM task coherence check — advisory only
|
|
268
|
+
try {
|
|
269
|
+
const llmCwd = process.env.PBR_PROJECT_ROOT || process.cwd();
|
|
270
|
+
const llmConfig = loadLocalLlmConfig(llmCwd);
|
|
271
|
+
const planningDir = path.join(llmCwd, '.planning');
|
|
272
|
+
const llmResult = await llmValidateTask(llmConfig, planningDir, data.tool_input || {}, data.session_id);
|
|
273
|
+
if (llmResult && !llmResult.coherent) {
|
|
274
|
+
warnings.push('LLM task coherence advisory: ' + (llmResult.issue || 'Task description may not match intended operation.') + ' (confidence: ' + (llmResult.confidence * 100).toFixed(0) + '%)');
|
|
275
|
+
}
|
|
276
|
+
} catch (_llmErr) {
|
|
277
|
+
// Never propagate LLM errors
|
|
278
|
+
}
|
|
796
279
|
|
|
797
280
|
if (warnings.length > 0) {
|
|
798
281
|
for (const warning of warnings) {
|
|
@@ -805,11 +288,14 @@ function main() {
|
|
|
805
288
|
|
|
806
289
|
process.exit(0);
|
|
807
290
|
} catch (_e) {
|
|
808
|
-
//
|
|
291
|
+
// Don't block on errors — emit valid output for Claude Code
|
|
292
|
+
process.stderr.write(`[pbr] validate-task error: ${_e.message}
|
|
293
|
+
`);
|
|
294
|
+
process.stdout.write(JSON.stringify({ decision: "allow", additionalContext: '⚠ [PBR] validate-task failed: ' + _e.message }));
|
|
809
295
|
process.exit(0);
|
|
810
296
|
}
|
|
811
297
|
});
|
|
812
298
|
}
|
|
813
299
|
|
|
814
|
-
module.exports = { checkTask, checkQuickExecutorGate, checkBuildExecutorGate, checkPlanExecutorGate, checkReviewPlannerGate, checkReviewVerifierGate, checkMilestoneCompleteGate, checkBuildDependencyGate, checkCheckpointManifest, checkDebuggerAdvisory, getVerificationStatus, checkActiveSkillIntegrity, KNOWN_AGENTS, MAX_DESCRIPTION_LENGTH };
|
|
300
|
+
module.exports = { checkTask, checkQuickExecutorGate, checkBuildExecutorGate, checkPlanValidationGate, checkPlanExecutorGate, checkReviewPlannerGate, checkReviewVerifierGate, checkMilestoneCompleteGate, checkMilestoneSummaryGate, checkBuildDependencyGate, checkCheckpointManifest, checkDebuggerAdvisory, getVerificationStatus, checkActiveSkillIntegrity, checkDocExistence, checkUserConfirmationGate, KNOWN_AGENTS, MAX_DESCRIPTION_LENGTH };
|
|
815
301
|
if (require.main === module || process.argv[1] === __filename) { main(); }
|