@sienklogic/plan-build-run 2.21.1 → 2.21.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1331 -323
- package/CLAUDE.md +75 -40
- package/LICENSE +2 -1
- package/README.md +412 -177
- package/bin/install.js +2752 -0
- package/dashboard/bin/cli.cjs +96 -0
- package/dashboard/bin/stop.cjs +129 -0
- package/dashboard/eslint.config.js +37 -0
- package/dashboard/index.html +20 -0
- package/dashboard/package.json +27 -25
- package/dashboard/server/index.js +151 -0
- package/dashboard/server/lib/frontmatter.js +92 -0
- package/dashboard/server/middleware/static.js +35 -0
- package/dashboard/server/package.json +16 -0
- package/dashboard/server/routes/agents.js +234 -0
- package/dashboard/server/routes/config.js +64 -0
- package/dashboard/server/routes/health.js +98 -0
- package/dashboard/server/routes/incidents.js +78 -0
- package/dashboard/server/routes/intel.js +69 -0
- package/dashboard/server/routes/memory.js +107 -0
- package/dashboard/server/routes/planning.js +234 -0
- package/dashboard/server/routes/progress.js +77 -0
- package/dashboard/server/routes/projects.js +36 -0
- package/dashboard/server/routes/requirements.js +40 -0
- package/dashboard/server/routes/roadmap.js +69 -0
- package/dashboard/server/routes/sessions.js +70 -0
- package/dashboard/server/routes/status.js +25 -0
- package/dashboard/server/routes/telemetry.js +233 -0
- package/dashboard/server/services/file-watcher.js +105 -0
- package/dashboard/server/services/planning-reader.js +727 -0
- package/dashboard/server/test/cli.test.js +34 -0
- package/dashboard/server/test/frontmatter.test.js +104 -0
- package/dashboard/server/test/isolation.test.js +32 -0
- package/dashboard/server/test/planning-reader.test.js +151 -0
- package/dashboard/server/test/routes.test.js +91 -0
- package/dashboard/server/test/ws.test.js +81 -0
- package/dashboard/server/ws.js +96 -0
- package/dashboard/src/App.jsx +165 -0
- package/dashboard/src/components/charts/BudgetBars.jsx +42 -0
- package/dashboard/src/components/charts/ContextRadar.jsx +34 -0
- package/dashboard/src/components/charts/PhaseDonut.jsx +66 -0
- package/dashboard/src/components/charts/SuccessTrend.jsx +45 -0
- package/dashboard/src/components/charts/TokenChart.jsx +55 -0
- package/dashboard/src/components/charts/index.js +5 -0
- package/dashboard/src/components/config/CfgSection.jsx +93 -0
- package/dashboard/src/components/layout/Header.jsx +89 -0
- package/dashboard/src/components/layout/ProjectSwitcher.jsx +160 -0
- package/dashboard/src/components/layout/Sidebar.jsx +161 -0
- package/dashboard/src/components/ui/AutoModeBanner.jsx +138 -0
- package/dashboard/src/components/ui/BackButton.jsx +27 -0
- package/dashboard/src/components/ui/Badge.jsx +27 -0
- package/dashboard/src/components/ui/Card.jsx +23 -0
- package/dashboard/src/components/ui/ChartTooltip.jsx +48 -0
- package/dashboard/src/components/ui/CheckpointBox.jsx +110 -0
- package/dashboard/src/components/ui/CodeBlock.jsx +27 -0
- package/dashboard/src/components/ui/ConfidenceBadge.jsx +20 -0
- package/dashboard/src/components/ui/ConfirmModal.jsx +161 -0
- package/dashboard/src/components/ui/ConnectionBanner.jsx +60 -0
- package/dashboard/src/components/ui/ErrorBoundary.jsx +106 -0
- package/dashboard/src/components/ui/ErrorBox.jsx +107 -0
- package/dashboard/src/components/ui/KeyValue.jsx +33 -0
- package/dashboard/src/components/ui/LoadingSkeleton.jsx +84 -0
- package/dashboard/src/components/ui/MetricCard.jsx +58 -0
- package/dashboard/src/components/ui/NextUpBlock.jsx +92 -0
- package/dashboard/src/components/ui/NumberInput.jsx +44 -0
- package/dashboard/src/components/ui/PBRBanner.jsx +47 -0
- package/dashboard/src/components/ui/PipelineView.jsx +130 -0
- package/dashboard/src/components/ui/ProgressBar.jsx +28 -0
- package/dashboard/src/components/ui/ProgressDisplay.jsx +47 -0
- package/dashboard/src/components/ui/QualityGateBadge.jsx +15 -0
- package/dashboard/src/components/ui/SectionTitle.jsx +35 -0
- package/dashboard/src/components/ui/SelectInput.jsx +45 -0
- package/dashboard/src/components/ui/StatusDot.jsx +51 -0
- package/dashboard/src/components/ui/StatusSymbol.jsx +49 -0
- package/dashboard/src/components/ui/TabBar.jsx +41 -0
- package/dashboard/src/components/ui/TextInput.jsx +42 -0
- package/dashboard/src/components/ui/Toast.jsx +117 -0
- package/dashboard/src/components/ui/Toggle.jsx +70 -0
- package/dashboard/src/components/ui/index.js +29 -0
- package/dashboard/src/hooks/useDocumentTitle.js +16 -0
- package/dashboard/src/hooks/useFetch.js +50 -0
- package/dashboard/src/hooks/useToast.jsx +43 -0
- package/dashboard/src/hooks/useWebSocket.js +103 -0
- package/dashboard/src/lib/api.js +112 -0
- package/dashboard/src/lib/configSchema.js +189 -0
- package/dashboard/src/lib/constants.js +22 -0
- package/dashboard/src/main.jsx +15 -0
- package/dashboard/src/pages/AgentsPage.jsx +191 -0
- package/dashboard/src/pages/ConfigPage.jsx +298 -0
- package/dashboard/src/pages/HooksPage.jsx +412 -0
- package/dashboard/src/pages/IncidentsPage.jsx +135 -0
- package/dashboard/src/pages/IntelPage.jsx +193 -0
- package/dashboard/src/pages/LiveFeed.jsx +274 -0
- package/dashboard/src/pages/MemoryPage.jsx +107 -0
- package/dashboard/src/pages/OnboardingPage.jsx +117 -0
- package/dashboard/src/pages/Overview.jsx +360 -0
- package/dashboard/src/pages/PhaseDetailView.jsx +216 -0
- package/dashboard/src/pages/PlanningPage.jsx +181 -0
- package/dashboard/src/pages/ProgressPage.jsx +249 -0
- package/dashboard/src/pages/ResearchPage.jsx +129 -0
- package/dashboard/src/pages/RoadmapPage.jsx +251 -0
- package/dashboard/src/pages/SessionsPage.jsx +117 -0
- package/dashboard/src/pages/Telemetry.jsx +166 -0
- package/dashboard/src/pages/planning/DecisionsTab.jsx +153 -0
- package/dashboard/src/pages/planning/FilesTab.jsx +420 -0
- package/dashboard/src/pages/planning/MilestoneDetail.jsx +319 -0
- package/dashboard/src/pages/planning/MilestonesTab.jsx +151 -0
- package/dashboard/src/pages/planning/NotesTab.jsx +251 -0
- package/dashboard/src/pages/planning/PhasesTab.jsx +218 -0
- package/dashboard/src/pages/planning/QuickTab.jsx +50 -0
- package/dashboard/src/pages/planning/ResearchTab.jsx +103 -0
- package/dashboard/src/pages/planning/TodosTab.jsx +297 -0
- package/dashboard/src/theme/ThemeProvider.jsx +38 -0
- package/dashboard/src/theme/tokens.js +17 -0
- package/dashboard/tests/components/ConfirmModal.test.jsx +179 -0
- package/dashboard/tests/components/ConnectionBanner.test.jsx +37 -0
- package/dashboard/tests/components/ErrorBoundary.test.jsx +59 -0
- package/dashboard/tests/components/LoadingSkeleton.test.jsx +46 -0
- package/dashboard/tests/components/ToastContainer.test.jsx +47 -0
- package/dashboard/tests/components/Toggle.test.jsx +61 -0
- package/dashboard/tests/hooks/useFetch.test.jsx +77 -0
- package/dashboard/tests/hooks/useToast.test.jsx +78 -0
- package/dashboard/tests/hooks/useWebSocket.test.jsx +128 -0
- package/dashboard/tests/pages/ConfigPage.test.jsx +199 -0
- package/dashboard/tests/pages/PlanningPage.test.jsx +119 -0
- package/dashboard/tests/pages/planning/FilesTab.test.jsx +198 -0
- package/dashboard/tests/pages/planning/NotesTab.test.jsx +178 -0
- package/dashboard/tests/pages/planning/TodosTab.test.jsx +188 -0
- package/dashboard/tests/performance.test.jsx +46 -0
- package/dashboard/tests/routes/config.test.js +98 -0
- package/dashboard/tests/routes/health.test.js +40 -0
- package/dashboard/tests/routes/planning.test.js +112 -0
- package/dashboard/tests/routes/roadmap.test.js +91 -0
- package/dashboard/tests/routes/status.test.js +131 -0
- package/dashboard/tests/server/planning-reader.test.js +153 -0
- package/dashboard/tests/setup.js +7 -0
- package/dashboard/vite.config.js +41 -0
- package/package.json +56 -41
- package/plan-build-run/bin/config-schema.json +1298 -0
- package/plugins/pbr/.claude-plugin/plugin.json +1 -1
- package/plugins/pbr/CLAUDE.md +19 -0
- package/plugins/pbr/UI-CONSISTENCY-GAPS.md +1 -1
- package/plugins/pbr/agents/advisor-researcher.md +101 -0
- package/plugins/pbr/agents/audit.md +207 -89
- package/plugins/pbr/agents/codebase-mapper.md +158 -23
- package/plugins/pbr/agents/debugger.md +210 -34
- package/plugins/pbr/agents/dev-sync.md +206 -0
- package/plugins/pbr/agents/executor.md +734 -38
- package/plugins/pbr/agents/general.md +69 -5
- package/plugins/pbr/agents/integration-checker.md +147 -31
- package/plugins/pbr/agents/intel-updater.md +332 -0
- package/plugins/pbr/agents/nyquist-auditor.md +254 -0
- package/plugins/pbr/agents/plan-checker.md +268 -65
- package/plugins/pbr/agents/planner.md +449 -41
- package/plugins/pbr/agents/researcher.md +218 -37
- package/plugins/pbr/agents/roadmapper.md +398 -0
- package/plugins/pbr/agents/synthesizer.md +166 -25
- package/plugins/pbr/agents/ui-checker.md +204 -0
- package/plugins/pbr/agents/ui-researcher.md +224 -0
- package/plugins/pbr/agents/verifier.md +570 -46
- 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/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 +76 -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 +213 -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 +227 -0
- package/plugins/pbr/dist/check-read-first.js +345 -0
- package/plugins/pbr/dist/check-roadmap-sync.js +507 -0
- package/plugins/pbr/dist/check-skill-workflow.js +354 -0
- package/plugins/pbr/dist/check-state-sync.js +676 -0
- package/plugins/pbr/dist/check-subagent-output.js +425 -0
- package/plugins/pbr/dist/check-summary-gate.js +188 -0
- package/plugins/pbr/dist/context-bridge.js +425 -0
- package/plugins/pbr/dist/context-budget-check.js +442 -0
- package/plugins/pbr/dist/context-quality.js +271 -0
- package/plugins/pbr/dist/enforce-context-budget.js +138 -0
- package/plugins/pbr/dist/enforce-pbr-workflow.js +277 -0
- package/plugins/pbr/dist/event-handler.js +212 -0
- package/plugins/pbr/dist/event-logger.js +125 -0
- package/plugins/pbr/dist/feedback-loop.js +155 -0
- package/plugins/pbr/dist/graph-update.js +422 -0
- package/plugins/pbr/dist/hook-logger.js +114 -0
- package/plugins/pbr/dist/hook-server-client.js +361 -0
- package/plugins/pbr/dist/hook-server.js +664 -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 +367 -0
- package/plugins/pbr/dist/log-tool-failure.js +140 -0
- package/plugins/pbr/dist/milestone-learnings.js +519 -0
- package/plugins/pbr/dist/pbr-tools.js +493 -0
- package/plugins/pbr/dist/post-bash-triage.js +96 -0
- package/plugins/pbr/dist/post-compact.js +135 -0
- package/plugins/pbr/dist/post-hoc.js +237 -0
- package/plugins/pbr/dist/post-write-dispatch.js +243 -0
- package/plugins/pbr/dist/post-write-quality.js +208 -0
- package/plugins/pbr/dist/pre-bash-dispatch.js +212 -0
- package/plugins/pbr/dist/pre-skill-dispatch.js +114 -0
- package/plugins/pbr/dist/pre-task-dispatch.js +269 -0
- package/plugins/pbr/dist/pre-write-dispatch.js +234 -0
- package/plugins/pbr/dist/progress-tracker.js +173 -0
- package/plugins/pbr/dist/prompt-guard.js +114 -0
- package/plugins/pbr/dist/prompt-routing.js +209 -0
- package/plugins/pbr/dist/quick-status.js +179 -0
- package/plugins/pbr/dist/record-incident.js +37 -0
- package/plugins/pbr/dist/run-hook.js +132 -0
- package/plugins/pbr/dist/session-cleanup.js +653 -0
- package/plugins/pbr/dist/session-tracker.js +124 -0
- package/plugins/pbr/dist/status-line.js +849 -0
- package/plugins/pbr/dist/suggest-compact.js +307 -0
- package/plugins/pbr/dist/sync-context-to-claude.js +100 -0
- package/plugins/pbr/dist/task-completed.js +206 -0
- package/plugins/pbr/dist/track-context-budget.js +432 -0
- package/plugins/pbr/dist/track-user-gates.js +88 -0
- package/plugins/pbr/dist/trust-tracker.js +193 -0
- package/plugins/pbr/dist/validate-commit.js +233 -0
- package/plugins/pbr/dist/validate-skill-args.js +222 -0
- package/plugins/pbr/dist/validate-task.js +271 -0
- package/plugins/pbr/dist/worktree-create.js +144 -0
- package/plugins/pbr/dist/worktree-remove.js +147 -0
- package/plugins/pbr/hooks/hooks.json +137 -65
- package/plugins/pbr/references/agent-contracts.md +39 -8
- package/plugins/pbr/references/agent-teams.md +3 -3
- package/plugins/pbr/references/archive/checkpoints.md +189 -0
- package/plugins/pbr/references/archive/context-quality-tiers.md +45 -0
- package/plugins/pbr/references/archive/hook-ordering.md +89 -0
- package/plugins/pbr/references/archive/limitations.md +106 -0
- package/plugins/pbr/references/archive/pbr-rules.md +194 -0
- package/plugins/pbr/references/archive/pbr-tools-cli.md +415 -0
- package/plugins/pbr/references/archive/pretooluse-jsonl-behavior.md +58 -0
- package/plugins/pbr/references/archive/signal-files.md +41 -0
- package/plugins/pbr/references/archive/tmux-setup.md +288 -0
- package/plugins/pbr/references/archive/verification-matrix.md +34 -0
- package/plugins/pbr/references/archive/verification-patterns.md +277 -0
- package/plugins/pbr/references/archive/worktree-sparse-checkout.md +86 -0
- package/plugins/pbr/references/assumptions.md +42 -0
- package/plugins/pbr/references/checkpoints.md +723 -104
- package/plugins/pbr/references/config-reference.md +387 -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/few-shot-examples/audit.md +77 -0
- package/plugins/pbr/references/few-shot-examples/check-plan-format.md +172 -0
- package/plugins/pbr/references/few-shot-examples/check-subagent-output.md +118 -0
- package/plugins/pbr/references/few-shot-examples/integration-checker.md +70 -0
- package/plugins/pbr/references/few-shot-examples/nyquist-auditor.md +83 -0
- package/plugins/pbr/references/few-shot-examples/plan-checker.md +73 -0
- package/plugins/pbr/references/few-shot-examples/ui-checker.md +71 -0
- package/plugins/pbr/references/few-shot-examples/verifier.md +109 -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 +184 -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/thinking-models-planning.md +47 -0
- package/plugins/pbr/references/thinking-models-verification.md +44 -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 +76 -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 +455 -0
- package/plugins/pbr/scripts/audit-checks/session-quality.js +980 -0
- package/plugins/pbr/scripts/audit-checks/si-agent-hook-config-checks.js +396 -0
- package/plugins/pbr/scripts/audit-checks/si-cross-cutting-checks.js +272 -0
- package/plugins/pbr/scripts/audit-checks/si-skill-checks.js +424 -0
- package/plugins/pbr/scripts/audit-checks/workflow-compliance.js +1175 -0
- package/plugins/pbr/scripts/audit-dimensions.js +556 -0
- package/plugins/pbr/scripts/auto-continue.js +192 -37
- 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 +84 -1
- 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 -2
- package/plugins/pbr/scripts/check-plan-format.js +153 -354
- package/plugins/pbr/scripts/check-read-first.js +345 -0
- package/plugins/pbr/scripts/check-roadmap-sync.js +174 -19
- package/plugins/pbr/scripts/check-skill-workflow.js +21 -16
- package/plugins/pbr/scripts/check-state-sync.js +352 -220
- package/plugins/pbr/scripts/check-subagent-output.js +296 -333
- package/plugins/pbr/scripts/check-summary-gate.js +5 -15
- package/plugins/pbr/scripts/commands/benchmarks.js +195 -0
- package/plugins/pbr/scripts/commands/calibrate.js +530 -0
- package/plugins/pbr/scripts/commands/config.js +72 -0
- package/plugins/pbr/scripts/commands/misc.js +779 -0
- package/plugins/pbr/scripts/commands/phase.js +293 -0
- package/plugins/pbr/scripts/commands/roadmap.js +75 -0
- package/plugins/pbr/scripts/commands/state.js +84 -0
- package/plugins/pbr/scripts/commands/stress-test.js +349 -0
- package/plugins/pbr/scripts/commands/todo.js +191 -0
- package/plugins/pbr/scripts/commands/verify.js +169 -0
- package/plugins/pbr/scripts/config-schema.json +1183 -95
- package/plugins/pbr/scripts/context-bridge.js +425 -0
- package/plugins/pbr/scripts/context-budget-check.js +171 -16
- 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 +137 -87
- package/plugins/pbr/scripts/event-logger.js +58 -25
- package/plugins/pbr/scripts/feedback-loop.js +155 -0
- package/plugins/pbr/scripts/graph-update.js +422 -0
- package/plugins/pbr/scripts/hook-logger.js +69 -35
- package/plugins/pbr/scripts/hook-server-client.js +361 -0
- package/plugins/pbr/scripts/hook-server.js +664 -0
- package/plugins/pbr/scripts/hooks-schema.json +12 -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 +123 -0
- package/plugins/pbr/scripts/lib/benchmark.js +190 -0
- package/plugins/pbr/scripts/lib/build.js +719 -0
- package/plugins/pbr/scripts/lib/ci-fix-loop.js +228 -0
- package/plugins/pbr/scripts/lib/commands.js +483 -0
- package/plugins/pbr/scripts/lib/compound.js +222 -0
- package/plugins/pbr/scripts/lib/config-cache.js +83 -0
- package/plugins/pbr/scripts/lib/config.js +1469 -0
- package/plugins/pbr/scripts/lib/context.js +254 -0
- package/plugins/pbr/scripts/lib/contextual-help.js +183 -0
- package/plugins/pbr/scripts/lib/convention-detector.js +413 -0
- package/plugins/pbr/scripts/lib/core.js +1585 -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 +1049 -0
- package/plugins/pbr/scripts/lib/frontmatter.js +302 -0
- package/plugins/pbr/scripts/lib/gates/advisories.js +133 -0
- package/plugins/pbr/scripts/lib/gates/build-dependency.js +118 -0
- package/plugins/pbr/scripts/lib/gates/build-executor.js +106 -0
- package/plugins/pbr/scripts/lib/gates/doc-existence.js +46 -0
- package/plugins/pbr/scripts/lib/gates/helpers.js +98 -0
- package/plugins/pbr/scripts/lib/gates/inline-execution.js +187 -0
- package/plugins/pbr/scripts/lib/gates/milestone-complete.js +139 -0
- package/plugins/pbr/scripts/lib/gates/milestone-summary.js +121 -0
- package/plugins/pbr/scripts/lib/gates/multi-phase-loader.js +149 -0
- package/plugins/pbr/scripts/lib/gates/plan-executor.js +36 -0
- package/plugins/pbr/scripts/lib/gates/plan-validation.js +115 -0
- package/plugins/pbr/scripts/lib/gates/quick-executor.js +78 -0
- package/plugins/pbr/scripts/lib/gates/review-planner.js +63 -0
- package/plugins/pbr/scripts/lib/gates/review-verifier.js +71 -0
- package/plugins/pbr/scripts/lib/gates/rich-agent-context.js +148 -0
- package/plugins/pbr/scripts/lib/gates/sprint-preflight.js +30 -0
- package/plugins/pbr/scripts/lib/gates/user-confirmation.js +95 -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/handoff-validators.js +224 -0
- package/plugins/pbr/scripts/lib/health-checks.js +107 -0
- package/plugins/pbr/scripts/lib/health-phase06.js +120 -0
- package/plugins/pbr/scripts/lib/health.js +132 -0
- package/plugins/pbr/scripts/lib/help.js +100 -0
- package/plugins/pbr/scripts/lib/history.js +150 -0
- package/plugins/pbr/scripts/lib/impact-analysis.js +319 -0
- package/plugins/pbr/scripts/lib/incidents.js +190 -0
- package/plugins/pbr/scripts/lib/init.js +643 -0
- package/plugins/pbr/scripts/lib/insights-parser.js +320 -0
- package/plugins/pbr/scripts/lib/intel.js +653 -0
- package/plugins/pbr/scripts/lib/learnings.js +511 -0
- package/plugins/pbr/scripts/lib/migrate.js +309 -0
- package/plugins/pbr/scripts/lib/milestone.js +306 -0
- package/plugins/pbr/scripts/lib/msys-path.js +20 -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 +1043 -0
- package/plugins/pbr/scripts/lib/pid-lock.js +156 -0
- package/plugins/pbr/scripts/lib/post-hoc.js +160 -0
- package/plugins/pbr/scripts/lib/pre-commit-checks.js +220 -0
- package/plugins/pbr/scripts/lib/pre-research.js +126 -0
- package/plugins/pbr/scripts/lib/premature-completion.js +312 -0
- package/plugins/pbr/scripts/lib/preview.js +174 -0
- package/plugins/pbr/scripts/lib/progress-visualization.js +296 -0
- package/plugins/pbr/scripts/lib/quick-init.js +131 -0
- package/plugins/pbr/scripts/lib/reference.js +236 -0
- package/plugins/pbr/scripts/lib/requirements.js +153 -0
- package/plugins/pbr/scripts/lib/resolve-root.js +66 -0
- package/plugins/pbr/scripts/lib/reverse-spec.js +259 -0
- package/plugins/pbr/scripts/lib/roadmap.js +1089 -0
- package/plugins/pbr/scripts/lib/security-scan.js +200 -0
- package/plugins/pbr/scripts/lib/session-briefing.js +918 -0
- package/plugins/pbr/scripts/lib/skill-section.js +99 -0
- package/plugins/pbr/scripts/lib/smart-next-task.js +198 -0
- package/plugins/pbr/scripts/lib/snapshot-manager.js +232 -0
- package/plugins/pbr/scripts/lib/spec-diff.js +209 -0
- package/plugins/pbr/scripts/lib/spec-engine.js +189 -0
- package/plugins/pbr/scripts/lib/spot-check.js +539 -0
- package/plugins/pbr/scripts/lib/state-queue.js +171 -0
- package/plugins/pbr/scripts/lib/state.js +1082 -0
- package/plugins/pbr/scripts/lib/status-render.js +511 -0
- package/plugins/pbr/scripts/lib/step-verify.js +149 -0
- package/plugins/pbr/scripts/lib/subagent-validators.js +1119 -0
- package/plugins/pbr/scripts/lib/suggest-next.js +435 -0
- package/plugins/pbr/scripts/lib/tech-debt-scanner.js +116 -0
- package/plugins/pbr/scripts/lib/templates.js +362 -0
- package/plugins/pbr/scripts/lib/test-selection.js +163 -0
- package/plugins/pbr/scripts/lib/todo.js +300 -0
- package/plugins/pbr/scripts/lib/verify.js +1561 -0
- package/plugins/pbr/scripts/log-notification.js +131 -0
- package/plugins/pbr/scripts/log-subagent.js +221 -18
- package/plugins/pbr/scripts/log-tool-failure.js +60 -5
- package/plugins/pbr/scripts/milestone-learnings.js +519 -0
- package/plugins/pbr/scripts/package.json +1 -1
- package/plugins/pbr/scripts/pbr-tools.js +362 -1247
- package/plugins/pbr/scripts/post-bash-triage.js +96 -0
- package/plugins/pbr/scripts/post-compact.js +135 -0
- package/plugins/pbr/scripts/post-hoc.js +237 -0
- package/plugins/pbr/scripts/post-write-dispatch.js +201 -31
- package/plugins/pbr/scripts/post-write-quality.js +4 -3
- package/plugins/pbr/scripts/pre-bash-dispatch.js +147 -51
- package/plugins/pbr/scripts/pre-skill-dispatch.js +114 -0
- package/plugins/pbr/scripts/pre-task-dispatch.js +269 -0
- package/plugins/pbr/scripts/pre-write-dispatch.js +170 -72
- package/plugins/pbr/scripts/progress-tracker.js +121 -324
- 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 +63 -23
- package/plugins/pbr/scripts/session-cleanup.js +428 -29
- package/plugins/pbr/scripts/session-tracker.js +124 -0
- package/plugins/pbr/scripts/status-line.js +571 -43
- package/plugins/pbr/scripts/suggest-compact.js +201 -13
- package/plugins/pbr/scripts/sync-context-to-claude.js +100 -0
- package/plugins/pbr/scripts/task-completed.js +165 -4
- package/plugins/pbr/scripts/test/config.test.js +126 -0
- package/plugins/pbr/scripts/test/cross-platform.test.js +120 -0
- package/plugins/pbr/scripts/test/fixtures/config.json +20 -0
- package/plugins/pbr/scripts/test/fixtures/plan.md +54 -0
- package/plugins/pbr/scripts/test/fixtures/project.md +30 -0
- package/plugins/pbr/scripts/test/fixtures/roadmap.md +55 -0
- package/plugins/pbr/scripts/test/fixtures/state.md +60 -0
- package/plugins/pbr/scripts/test/fixtures/summary.md +35 -0
- package/plugins/pbr/scripts/test/fixtures.test.js +184 -0
- package/plugins/pbr/scripts/test/phase.test.js +142 -0
- package/plugins/pbr/scripts/test/roadmap.test.js +96 -0
- package/plugins/pbr/scripts/test/state.test.js +155 -0
- package/plugins/pbr/scripts/track-context-budget.js +368 -104
- 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 +51 -19
- package/plugins/pbr/scripts/validate-skill-args.js +85 -14
- package/plugins/pbr/scripts/validate-task.js +83 -622
- 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 +551 -0
- package/plugins/pbr/skills/backlog/SKILL.md +56 -0
- package/plugins/pbr/skills/begin/SKILL.md +508 -153
- package/plugins/pbr/skills/begin/templates/STATE.md.tmpl +1 -2
- package/plugins/pbr/skills/begin/templates/config.json.tmpl +419 -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 +1180 -357
- 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/build/templates/qa-round-context.md.tmpl +16 -0
- package/plugins/pbr/skills/config/SKILL.md +112 -9
- package/plugins/pbr/skills/continue/SKILL.md +113 -33
- package/plugins/pbr/skills/dashboard/SKILL.md +21 -9
- package/plugins/pbr/skills/debug/SKILL.md +70 -12
- package/plugins/pbr/skills/debug/templates/continuation-prompt.md.tmpl +12 -1
- package/plugins/pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +12 -5
- package/plugins/pbr/skills/discuss/SKILL.md +205 -24
- package/plugins/pbr/skills/discuss/templates/CONTEXT.md.tmpl +21 -1
- package/plugins/pbr/skills/do/SKILL.md +119 -24
- package/plugins/pbr/skills/explore/SKILL.md +95 -20
- package/plugins/pbr/skills/fast/SKILL.md +94 -0
- package/plugins/pbr/skills/forensics/SKILL.md +144 -0
- package/plugins/pbr/skills/health/SKILL.md +35 -115
- package/plugins/pbr/skills/help/SKILL.md +83 -123
- 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 +383 -274
- package/plugins/pbr/skills/milestone/templates/audit-output.md.tmpl +76 -0
- package/plugins/pbr/skills/milestone/templates/complete-output.md.tmpl +32 -0
- package/plugins/pbr/skills/milestone/templates/edge-cases.md +54 -0
- package/plugins/pbr/skills/milestone/templates/gaps-output.md.tmpl +25 -0
- package/plugins/pbr/skills/milestone/templates/integration-checker-prompt.md.tmpl +25 -0
- package/plugins/pbr/skills/milestone/templates/new-output.md.tmpl +29 -0
- package/plugins/pbr/skills/milestone-summary/SKILL.md +86 -0
- package/plugins/pbr/skills/note/SKILL.md +20 -4
- package/plugins/pbr/skills/pause/SKILL.md +54 -14
- package/plugins/pbr/skills/pause/templates/continue-here.md.tmpl +33 -52
- package/plugins/pbr/skills/plan/SKILL.md +526 -280
- package/plugins/pbr/skills/plan/templates/checker-prompt.md.tmpl +20 -2
- package/plugins/pbr/skills/plan/templates/completion-output.md.tmpl +27 -0
- package/plugins/pbr/skills/plan/templates/planner-prompt.md.tmpl +43 -1
- package/plugins/pbr/skills/plan/templates/revision-prompt.md.tmpl +21 -5
- package/plugins/pbr/skills/profile/SKILL.md +185 -0
- package/plugins/pbr/skills/profile-user/SKILL.md +227 -0
- package/plugins/pbr/skills/quick/SKILL.md +435 -100
- package/plugins/pbr/skills/release/SKILL.md +206 -0
- package/plugins/pbr/skills/resume/SKILL.md +170 -46
- package/plugins/pbr/skills/review/SKILL.md +233 -165
- package/plugins/pbr/skills/review/templates/verifier-prompt.md.tmpl +7 -0
- package/plugins/pbr/skills/scan/SKILL.md +152 -106
- package/plugins/pbr/skills/scan/templates/mapper-prompt.md.tmpl +5 -56
- package/plugins/pbr/skills/seed/SKILL.md +87 -0
- package/plugins/pbr/skills/session-report/SKILL.md +130 -0
- package/plugins/pbr/skills/setup/SKILL.md +150 -202
- package/plugins/pbr/skills/shared/agent-context-enrichment.md +21 -0
- package/plugins/pbr/skills/shared/agent-type-resolution.md +32 -0
- package/plugins/pbr/skills/shared/commit-planning-docs.md +8 -0
- package/plugins/pbr/skills/shared/context-budget.md +66 -1
- package/plugins/pbr/skills/shared/context-loader-task.md +18 -11
- package/plugins/pbr/skills/shared/criterion-writing.md +58 -0
- 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 +46 -61
- 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 +110 -0
- package/plugins/pbr/skills/status/SKILL.md +185 -119
- package/plugins/pbr/skills/test/SKILL.md +254 -0
- package/plugins/pbr/skills/thread/SKILL.md +73 -0
- package/plugins/pbr/skills/todo/SKILL.md +28 -72
- package/plugins/pbr/skills/ui-phase/SKILL.md +180 -0
- package/plugins/pbr/skills/ui-review/SKILL.md +206 -0
- package/plugins/pbr/skills/undo/SKILL.md +221 -0
- package/plugins/pbr/skills/validate-phase/SKILL.md +362 -0
- package/plugins/pbr/templates/CONTEXT.md.tmpl +45 -20
- package/plugins/pbr/templates/DISCOVERY.md.tmpl +29 -0
- package/plugins/pbr/templates/DISCUSSION-LOG.md.tmpl +49 -0
- package/plugins/pbr/templates/HANDOFF.json.tmpl +30 -0
- package/plugins/pbr/templates/INTEGRATION-REPORT.md.tmpl +18 -2
- package/plugins/pbr/templates/MILESTONE-AUDIT.md.tmpl +44 -0
- package/plugins/pbr/templates/PROJECT.md.tmpl +126 -0
- package/plugins/pbr/templates/REQUIREMENTS.md.tmpl +96 -0
- package/plugins/pbr/templates/RETROSPECTIVE.md.tmpl +43 -0
- package/plugins/pbr/templates/ROADMAP.md.tmpl +106 -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 +54 -13
- package/plugins/pbr/templates/project-CONTEXT.md.tmpl +59 -0
- package/plugins/pbr/templates/research-outputs/ARCHITECTURE.md.tmpl +91 -0
- package/plugins/pbr/templates/research-outputs/FEATURES.md.tmpl +64 -0
- package/plugins/pbr/templates/research-outputs/PITFALLS.md.tmpl +50 -0
- package/plugins/pbr/templates/research-outputs/STACK.md.tmpl +63 -0
- package/plugins/pbr/templates/research-outputs/SUMMARY.md.tmpl +98 -0
- package/scripts/build-hooks.js +61 -0
- package/scripts/check-ci.js +100 -0
- package/scripts/clean-changelog.js +364 -0
- package/scripts/generate-derivatives.js +581 -0
- package/scripts/posttest.js +93 -0
- package/scripts/release.js +262 -0
- package/scripts/run-tests.cjs +29 -0
- package/scripts/test-wrapper.js +43 -0
- package/dashboard/bin/cli.js +0 -25
- package/dashboard/public/css/layout.css +0 -704
- package/dashboard/public/css/status-colors.css +0 -98
- package/dashboard/public/css/tokens.css +0 -59
- package/dashboard/public/js/htmx-title.js +0 -5
- package/dashboard/public/js/sidebar-toggle.js +0 -34
- package/dashboard/public/js/sse-client.js +0 -100
- package/dashboard/public/js/theme-toggle.js +0 -46
- package/dashboard/src/app.js +0 -91
- package/dashboard/src/middleware/current-phase.js +0 -24
- package/dashboard/src/middleware/errorHandler.js +0 -52
- package/dashboard/src/middleware/notFoundHandler.js +0 -9
- package/dashboard/src/repositories/planning.repository.js +0 -130
- package/dashboard/src/routes/events.routes.js +0 -45
- package/dashboard/src/routes/index.routes.js +0 -35
- package/dashboard/src/routes/pages.routes.js +0 -426
- package/dashboard/src/server.js +0 -42
- package/dashboard/src/services/analytics.service.js +0 -141
- package/dashboard/src/services/dashboard.service.js +0 -309
- package/dashboard/src/services/milestone.service.js +0 -222
- package/dashboard/src/services/notes.service.js +0 -50
- package/dashboard/src/services/phase.service.js +0 -232
- package/dashboard/src/services/project.service.js +0 -57
- package/dashboard/src/services/roadmap.service.js +0 -258
- package/dashboard/src/services/sse.service.js +0 -58
- package/dashboard/src/services/todo.service.js +0 -272
- package/dashboard/src/services/watcher.service.js +0 -48
- package/dashboard/src/utils/cache.js +0 -55
- package/dashboard/src/views/analytics.ejs +0 -5
- package/dashboard/src/views/coming-soon.ejs +0 -11
- package/dashboard/src/views/dependencies.ejs +0 -5
- package/dashboard/src/views/error.ejs +0 -20
- package/dashboard/src/views/index.ejs +0 -5
- package/dashboard/src/views/milestone-detail.ejs +0 -5
- package/dashboard/src/views/milestones.ejs +0 -5
- package/dashboard/src/views/notes.ejs +0 -5
- package/dashboard/src/views/partials/analytics-content.ejs +0 -90
- package/dashboard/src/views/partials/breadcrumbs.ejs +0 -14
- package/dashboard/src/views/partials/dashboard-content.ejs +0 -84
- package/dashboard/src/views/partials/dependencies-content.ejs +0 -48
- package/dashboard/src/views/partials/empty-state.ejs +0 -7
- package/dashboard/src/views/partials/footer.ejs +0 -3
- package/dashboard/src/views/partials/head.ejs +0 -30
- package/dashboard/src/views/partials/header.ejs +0 -21
- package/dashboard/src/views/partials/layout-bottom.ejs +0 -43
- package/dashboard/src/views/partials/layout-top.ejs +0 -16
- package/dashboard/src/views/partials/milestone-detail-content.ejs +0 -20
- package/dashboard/src/views/partials/milestones-content.ejs +0 -88
- package/dashboard/src/views/partials/notes-content.ejs +0 -23
- package/dashboard/src/views/partials/phase-content.ejs +0 -193
- package/dashboard/src/views/partials/phase-doc-content.ejs +0 -38
- package/dashboard/src/views/partials/phases-content.ejs +0 -124
- package/dashboard/src/views/partials/roadmap-content.ejs +0 -180
- package/dashboard/src/views/partials/sidebar.ejs +0 -99
- package/dashboard/src/views/partials/todo-create-content.ejs +0 -54
- package/dashboard/src/views/partials/todo-detail-content.ejs +0 -42
- package/dashboard/src/views/partials/todos-content.ejs +0 -97
- package/dashboard/src/views/phase-detail.ejs +0 -5
- package/dashboard/src/views/phase-doc.ejs +0 -5
- package/dashboard/src/views/phases.ejs +0 -5
- package/dashboard/src/views/roadmap.ejs +0 -5
- package/dashboard/src/views/todo-create.ejs +0 -5
- package/dashboard/src/views/todo-detail.ejs +0 -5
- package/dashboard/src/views/todos.ejs +0 -5
- package/plugins/copilot-pbr/CHANGELOG.md +0 -19
- package/plugins/copilot-pbr/README.md +0 -139
- package/plugins/copilot-pbr/agents/audit.agent.md +0 -113
- package/plugins/copilot-pbr/agents/codebase-mapper.agent.md +0 -151
- package/plugins/copilot-pbr/agents/debugger.agent.md +0 -184
- package/plugins/copilot-pbr/agents/executor.agent.md +0 -269
- package/plugins/copilot-pbr/agents/general.agent.md +0 -89
- package/plugins/copilot-pbr/agents/integration-checker.agent.md +0 -121
- package/plugins/copilot-pbr/agents/plan-checker.agent.md +0 -208
- package/plugins/copilot-pbr/agents/planner.agent.md +0 -240
- package/plugins/copilot-pbr/agents/researcher.agent.md +0 -188
- 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 -258
- 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 -959
- package/plugins/copilot-pbr/skills/config/SKILL.md +0 -250
- package/plugins/copilot-pbr/skills/continue/SKILL.md +0 -159
- package/plugins/copilot-pbr/skills/dashboard/SKILL.md +0 -43
- package/plugins/copilot-pbr/skills/debug/SKILL.md +0 -508
- package/plugins/copilot-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
- package/plugins/copilot-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
- package/plugins/copilot-pbr/skills/discuss/SKILL.md +0 -353
- package/plugins/copilot-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
- package/plugins/copilot-pbr/skills/discuss/templates/decision-categories.md +0 -10
- package/plugins/copilot-pbr/skills/do/SKILL.md +0 -66
- package/plugins/copilot-pbr/skills/explore/SKILL.md +0 -373
- package/plugins/copilot-pbr/skills/health/SKILL.md +0 -283
- package/plugins/copilot-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
- package/plugins/copilot-pbr/skills/health/templates/output-format.md.tmpl +0 -64
- package/plugins/copilot-pbr/skills/help/SKILL.md +0 -193
- package/plugins/copilot-pbr/skills/import/SKILL.md +0 -502
- package/plugins/copilot-pbr/skills/milestone/SKILL.md +0 -806
- 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-recovery-strategies.md +0 -51
- 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 -170
- 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 -48
- 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 -183
- package/plugins/cursor-pbr/agents/executor.md +0 -268
- package/plugins/cursor-pbr/agents/general.md +0 -88
- package/plugins/cursor-pbr/agents/integration-checker.md +0 -120
- package/plugins/cursor-pbr/agents/plan-checker.md +0 -207
- package/plugins/cursor-pbr/agents/planner.md +0 -239
- package/plugins/cursor-pbr/agents/researcher.md +0 -187
- 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 -224
- 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 -960
- package/plugins/cursor-pbr/skills/config/SKILL.md +0 -252
- package/plugins/cursor-pbr/skills/continue/SKILL.md +0 -159
- package/plugins/cursor-pbr/skills/dashboard/SKILL.md +0 -44
- package/plugins/cursor-pbr/skills/debug/SKILL.md +0 -512
- package/plugins/cursor-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
- package/plugins/cursor-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
- package/plugins/cursor-pbr/skills/discuss/SKILL.md +0 -354
- package/plugins/cursor-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
- package/plugins/cursor-pbr/skills/discuss/templates/decision-categories.md +0 -10
- package/plugins/cursor-pbr/skills/do/SKILL.md +0 -67
- package/plugins/cursor-pbr/skills/explore/SKILL.md +0 -376
- package/plugins/cursor-pbr/skills/health/SKILL.md +0 -283
- package/plugins/cursor-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
- package/plugins/cursor-pbr/skills/health/templates/output-format.md.tmpl +0 -64
- package/plugins/cursor-pbr/skills/help/SKILL.md +0 -193
- package/plugins/cursor-pbr/skills/import/SKILL.md +0 -505
- package/plugins/cursor-pbr/skills/milestone/SKILL.md +0 -807
- 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-recovery-strategies.md +0 -51
- 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 -170
- 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 -48
- 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/error-recovery-strategies.md +0 -51
- 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,22 @@
|
|
|
20
20
|
const fs = require('fs');
|
|
21
21
|
const path = require('path');
|
|
22
22
|
const { logHook } = require('./hook-logger');
|
|
23
|
-
|
|
24
|
-
const KNOWN_AGENTS =
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
23
|
+
const { checkNonPbrAgent } = require('./enforce-pbr-workflow');
|
|
24
|
+
const { KNOWN_AGENTS } = require('./lib/core');
|
|
25
|
+
|
|
26
|
+
// Gate modules
|
|
27
|
+
const { checkQuickExecutorGate } = require('./lib/gates/quick-executor');
|
|
28
|
+
const { checkBuildExecutorGate } = require('./lib/gates/build-executor');
|
|
29
|
+
const { checkPlanExecutorGate } = require('./lib/gates/plan-executor');
|
|
30
|
+
const { checkReviewPlannerGate } = require('./lib/gates/review-planner');
|
|
31
|
+
const { checkReviewVerifierGate } = require('./lib/gates/review-verifier');
|
|
32
|
+
const { checkMilestoneCompleteGate, getVerificationStatus } = require('./lib/gates/milestone-complete');
|
|
33
|
+
const { checkMilestoneSummaryGate } = require('./lib/gates/milestone-summary');
|
|
34
|
+
const { checkBuildDependencyGate } = require('./lib/gates/build-dependency');
|
|
35
|
+
const { checkPlanValidationGate } = require('./lib/gates/plan-validation');
|
|
36
|
+
const { checkDebuggerAdvisory, checkCheckpointManifest, checkActiveSkillIntegrity } = require('./lib/gates/advisories');
|
|
37
|
+
const { checkDocExistence } = require('./lib/gates/doc-existence');
|
|
38
|
+
const { checkUserConfirmationGate } = require('./lib/gates/user-confirmation');
|
|
36
39
|
|
|
37
40
|
const MAX_DESCRIPTION_LENGTH = 100;
|
|
38
41
|
|
|
@@ -49,7 +52,7 @@ function checkTask(data) {
|
|
|
49
52
|
|
|
50
53
|
// Check description exists and is non-empty
|
|
51
54
|
if (!description || (typeof description === 'string' && !description.trim())) {
|
|
52
|
-
warnings.push('Task() called without a description. Descriptions
|
|
55
|
+
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
56
|
} else if (typeof description === 'string') {
|
|
54
57
|
// Check description length
|
|
55
58
|
if (description.length > MAX_DESCRIPTION_LENGTH) {
|
|
@@ -82,620 +85,31 @@ function checkTask(data) {
|
|
|
82
85
|
return warnings;
|
|
83
86
|
}
|
|
84
87
|
|
|
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
|
-
* Parse VERIFICATION.md frontmatter to extract status field.
|
|
572
|
-
* Returns the status string or 'unknown' if not parseable.
|
|
573
|
-
*/
|
|
574
|
-
function getVerificationStatus(filePath) {
|
|
575
|
-
try {
|
|
576
|
-
const content = fs.readFileSync(filePath, 'utf8');
|
|
577
|
-
const fmMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
578
|
-
if (!fmMatch) return 'unknown';
|
|
579
|
-
const statusMatch = fmMatch[1].match(/^status:\s*(\S+)/m);
|
|
580
|
-
return statusMatch ? statusMatch[1] : 'unknown';
|
|
581
|
-
} catch (_e) {
|
|
582
|
-
return 'unknown';
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
/**
|
|
587
|
-
* Advisory check: when pbr:debugger is spawned and .active-skill is 'debug',
|
|
588
|
-
* warn if .planning/debug/ directory does not exist.
|
|
589
|
-
* Returns a warning string or null.
|
|
590
|
-
*/
|
|
591
|
-
function checkDebuggerAdvisory(data) {
|
|
592
|
-
const subagentType = data.tool_input?.subagent_type || '';
|
|
593
|
-
if (subagentType !== 'pbr:debugger') return null;
|
|
594
|
-
// Only advise when spawned from the debug skill
|
|
595
|
-
const activeSkillPath = path.join(process.cwd(), '.planning', '.active-skill');
|
|
596
|
-
try {
|
|
597
|
-
const activeSkill = fs.readFileSync(activeSkillPath, 'utf8').trim();
|
|
598
|
-
if (activeSkill !== 'debug') return null;
|
|
599
|
-
} catch (_e) {
|
|
600
|
-
return null; // No .active-skill file — skip advisory
|
|
601
|
-
}
|
|
602
|
-
const debugDir = path.join(process.cwd(), '.planning', 'debug');
|
|
603
|
-
if (!fs.existsSync(debugDir)) {
|
|
604
|
-
return 'Debugger advisory: .planning/debug/ does not exist. Create it before spawning the debugger so output has a target location.';
|
|
605
|
-
}
|
|
606
|
-
return null;
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
function checkCheckpointManifest(data) {
|
|
610
|
-
const toolInput = data.tool_input || {};
|
|
611
|
-
const subagentType = toolInput.subagent_type || '';
|
|
612
|
-
|
|
613
|
-
if (subagentType !== 'pbr:executor') return null;
|
|
614
|
-
|
|
615
|
-
const cwd = process.cwd();
|
|
616
|
-
const planningDir = path.join(cwd, '.planning');
|
|
617
|
-
const activeSkillFile = path.join(planningDir, '.active-skill');
|
|
618
|
-
|
|
619
|
-
try {
|
|
620
|
-
const activeSkill = fs.readFileSync(activeSkillFile, 'utf8').trim();
|
|
621
|
-
if (activeSkill !== 'build') return null;
|
|
622
|
-
} catch (_e) {
|
|
623
|
-
return null;
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
// Find current phase dir
|
|
627
|
-
const stateFile = path.join(planningDir, 'STATE.md');
|
|
628
|
-
try {
|
|
629
|
-
const state = fs.readFileSync(stateFile, 'utf8');
|
|
630
|
-
const phaseMatch = state.match(/Phase:\s*(\d+)\s+of\s+\d+/);
|
|
631
|
-
if (!phaseMatch) return null;
|
|
632
|
-
|
|
633
|
-
const currentPhase = phaseMatch[1].padStart(2, '0');
|
|
634
|
-
const phasesDir = path.join(planningDir, 'phases');
|
|
635
|
-
if (!fs.existsSync(phasesDir)) return null;
|
|
636
|
-
|
|
637
|
-
const dirs = fs.readdirSync(phasesDir).filter(d => d.startsWith(currentPhase + '-'));
|
|
638
|
-
if (dirs.length === 0) return null;
|
|
639
|
-
|
|
640
|
-
const phaseDir = path.join(phasesDir, dirs[0]);
|
|
641
|
-
const manifestFile = path.join(phaseDir, '.checkpoint-manifest.json');
|
|
642
|
-
if (!fs.existsSync(manifestFile)) {
|
|
643
|
-
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.';
|
|
644
|
-
}
|
|
645
|
-
} catch (_e) {
|
|
646
|
-
return null;
|
|
647
|
-
}
|
|
648
|
-
|
|
649
|
-
return null;
|
|
650
|
-
}
|
|
651
|
-
|
|
652
|
-
/**
|
|
653
|
-
* Advisory check: when any pbr:* agent is being spawned, warn if
|
|
654
|
-
* .planning/.active-skill doesn't exist. Without this file, all
|
|
655
|
-
* skill-specific enforcement is silently disabled.
|
|
656
|
-
* Returns a warning string or null.
|
|
657
|
-
*/
|
|
658
|
-
function checkActiveSkillIntegrity(data) {
|
|
659
|
-
const toolInput = data.tool_input || {};
|
|
660
|
-
const subagentType = toolInput.subagent_type || '';
|
|
661
|
-
|
|
662
|
-
if (typeof subagentType !== 'string' || !subagentType.startsWith('pbr:')) return null;
|
|
663
|
-
|
|
664
|
-
const cwd = process.cwd();
|
|
665
|
-
const planningDir = path.join(cwd, '.planning');
|
|
666
|
-
|
|
667
|
-
// Only check if .planning/ exists (PBR project)
|
|
668
|
-
if (!fs.existsSync(planningDir)) return null;
|
|
669
|
-
|
|
670
|
-
const activeSkillFile = path.join(planningDir, '.active-skill');
|
|
671
|
-
if (!fs.existsSync(activeSkillFile)) {
|
|
672
|
-
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.';
|
|
673
|
-
}
|
|
674
|
-
|
|
675
|
-
// Stale lock detection: warn if .active-skill is older than 2 hours
|
|
676
|
-
try {
|
|
677
|
-
const stat = fs.statSync(activeSkillFile);
|
|
678
|
-
const ageMs = Date.now() - stat.mtimeMs;
|
|
679
|
-
const TWO_HOURS = 2 * 60 * 60 * 1000;
|
|
680
|
-
if (ageMs > TWO_HOURS) {
|
|
681
|
-
const ageHours = Math.round(ageMs / (60 * 60 * 1000));
|
|
682
|
-
const skill = fs.readFileSync(activeSkillFile, 'utf8').trim();
|
|
683
|
-
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.`;
|
|
684
|
-
}
|
|
685
|
-
} catch (_e) { /* best-effort */ }
|
|
686
|
-
|
|
687
|
-
return null;
|
|
688
|
-
}
|
|
689
|
-
|
|
690
88
|
function main() {
|
|
691
89
|
let input = '';
|
|
692
90
|
|
|
693
91
|
process.stdin.setEncoding('utf8');
|
|
694
92
|
process.stdin.on('data', (chunk) => { input += chunk; });
|
|
695
|
-
process.stdin.on('end', () => {
|
|
93
|
+
process.stdin.on('end', async () => {
|
|
696
94
|
try {
|
|
697
95
|
const data = JSON.parse(input);
|
|
698
96
|
|
|
97
|
+
// Blocking gate: user confirmation required for gated operations
|
|
98
|
+
const userConfGate = checkUserConfirmationGate(data);
|
|
99
|
+
if (userConfGate && userConfGate.block) {
|
|
100
|
+
logHook('validate-task', 'PreToolUse', 'blocked', { reason: userConfGate.reason });
|
|
101
|
+
process.stdout.write(JSON.stringify({
|
|
102
|
+
decision: 'block',
|
|
103
|
+
reason: userConfGate.reason
|
|
104
|
+
}));
|
|
105
|
+
process.exit(2);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// Advisory: non-blocking user confirmation warning
|
|
109
|
+
if (userConfGate && userConfGate.warning) {
|
|
110
|
+
logHook('validate-task', 'PreToolUse', 'warn', { warning: userConfGate.warning });
|
|
111
|
+
}
|
|
112
|
+
|
|
699
113
|
// Blocking gate: quick executor must have PLAN.md
|
|
700
114
|
const gate = checkQuickExecutorGate(data);
|
|
701
115
|
if (gate && gate.block) {
|
|
@@ -720,6 +134,15 @@ function main() {
|
|
|
720
134
|
return;
|
|
721
135
|
}
|
|
722
136
|
|
|
137
|
+
// Blocking gate: plan validation artifact must exist and pass
|
|
138
|
+
const planValGate = checkPlanValidationGate(data);
|
|
139
|
+
if (planValGate && planValGate.block) {
|
|
140
|
+
logHook('validate-task', 'PreToolUse', 'blocked', { reason: planValGate.reason });
|
|
141
|
+
process.stdout.write(JSON.stringify({ decision: 'block', reason: planValGate.reason }));
|
|
142
|
+
process.exit(2);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
|
|
723
146
|
// Blocking gate: review skill planner needs VERIFICATION.md
|
|
724
147
|
const reviewGate = checkReviewPlannerGate(data);
|
|
725
148
|
if (reviewGate && reviewGate.block) {
|
|
@@ -768,6 +191,18 @@ function main() {
|
|
|
768
191
|
return;
|
|
769
192
|
}
|
|
770
193
|
|
|
194
|
+
// Blocking gate: milestone complete needs SUMMARY.md in all phases
|
|
195
|
+
const milestoneSummaryGate = checkMilestoneSummaryGate(data);
|
|
196
|
+
if (milestoneSummaryGate && milestoneSummaryGate.block) {
|
|
197
|
+
logHook('validate-task', 'PreToolUse', 'blocked', { reason: milestoneSummaryGate.reason });
|
|
198
|
+
process.stdout.write(JSON.stringify({
|
|
199
|
+
decision: 'block',
|
|
200
|
+
reason: milestoneSummaryGate.reason
|
|
201
|
+
}));
|
|
202
|
+
process.exit(2);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
|
|
771
206
|
// Blocking gate: build dependency check
|
|
772
207
|
const buildDepGate = checkBuildDependencyGate(data);
|
|
773
208
|
if (buildDepGate && buildDepGate.block) {
|
|
@@ -780,14 +215,37 @@ function main() {
|
|
|
780
215
|
return;
|
|
781
216
|
}
|
|
782
217
|
|
|
218
|
+
// Blocking gate: PROJECT.md + REQUIREMENTS.md must exist for plan/build
|
|
219
|
+
const docGate = checkDocExistence(data);
|
|
220
|
+
if (docGate && docGate.block) {
|
|
221
|
+
logHook('validate-task', 'PreToolUse', 'blocked', { reason: docGate.reason });
|
|
222
|
+
process.stdout.write(JSON.stringify({
|
|
223
|
+
decision: 'block',
|
|
224
|
+
reason: docGate.reason
|
|
225
|
+
}));
|
|
226
|
+
process.exit(2);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Blocking/advisory gate: non-PBR agent enforcement
|
|
231
|
+
const nonPbrAgentResult = checkNonPbrAgent(data);
|
|
232
|
+
if (nonPbrAgentResult && nonPbrAgentResult.exitCode === 2) {
|
|
233
|
+
process.stdout.write(JSON.stringify(nonPbrAgentResult.output));
|
|
234
|
+
process.exit(2);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
|
|
783
238
|
// Advisory warnings
|
|
784
239
|
const warnings = checkTask(data);
|
|
240
|
+
if (userConfGate && userConfGate.warning) warnings.push(userConfGate.warning);
|
|
785
241
|
const manifestWarning = checkCheckpointManifest(data);
|
|
786
242
|
if (manifestWarning) warnings.push(manifestWarning);
|
|
787
243
|
const debuggerWarning = checkDebuggerAdvisory(data);
|
|
788
244
|
if (debuggerWarning) warnings.push(debuggerWarning);
|
|
789
245
|
const activeSkillWarning = checkActiveSkillIntegrity(data);
|
|
790
246
|
if (activeSkillWarning) warnings.push(activeSkillWarning);
|
|
247
|
+
if (nonPbrAgentResult) warnings.push(nonPbrAgentResult.output.additionalContext);
|
|
248
|
+
if (planValGate && planValGate.warning) warnings.push(planValGate.warning);
|
|
791
249
|
|
|
792
250
|
if (warnings.length > 0) {
|
|
793
251
|
for (const warning of warnings) {
|
|
@@ -800,11 +258,14 @@ function main() {
|
|
|
800
258
|
|
|
801
259
|
process.exit(0);
|
|
802
260
|
} catch (_e) {
|
|
803
|
-
//
|
|
261
|
+
// Don't block on errors — emit valid output for Claude Code
|
|
262
|
+
process.stderr.write(`[pbr] validate-task error: ${_e.message}
|
|
263
|
+
`);
|
|
264
|
+
process.stdout.write(JSON.stringify({ decision: "allow", additionalContext: '⚠ [PBR] validate-task failed: ' + _e.message }));
|
|
804
265
|
process.exit(0);
|
|
805
266
|
}
|
|
806
267
|
});
|
|
807
268
|
}
|
|
808
269
|
|
|
809
|
-
module.exports = { checkTask, checkQuickExecutorGate, checkBuildExecutorGate, checkPlanExecutorGate, checkReviewPlannerGate, checkReviewVerifierGate, checkMilestoneCompleteGate, checkBuildDependencyGate, checkCheckpointManifest, checkDebuggerAdvisory, getVerificationStatus, checkActiveSkillIntegrity, KNOWN_AGENTS, MAX_DESCRIPTION_LENGTH };
|
|
270
|
+
module.exports = { checkTask, checkQuickExecutorGate, checkBuildExecutorGate, checkPlanValidationGate, checkPlanExecutorGate, checkReviewPlannerGate, checkReviewVerifierGate, checkMilestoneCompleteGate, checkMilestoneSummaryGate, checkBuildDependencyGate, checkCheckpointManifest, checkDebuggerAdvisory, getVerificationStatus, checkActiveSkillIntegrity, checkDocExistence, checkUserConfirmationGate, KNOWN_AGENTS, MAX_DESCRIPTION_LENGTH };
|
|
810
271
|
if (require.main === module || process.argv[1] === __filename) { main(); }
|