@sienklogic/plan-build-run 2.19.0 → 2.19.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1287 -303
- package/CLAUDE.md +74 -39
- package/LICENSE +2 -1
- package/README.md +412 -177
- package/bin/install.js +2752 -0
- package/dashboard/bin/cli.cjs +96 -0
- package/dashboard/bin/stop.cjs +129 -0
- package/dashboard/eslint.config.js +37 -0
- package/dashboard/index.html +20 -0
- package/dashboard/package.json +27 -25
- package/dashboard/server/index.js +151 -0
- package/dashboard/server/lib/frontmatter.js +92 -0
- package/dashboard/server/middleware/static.js +35 -0
- package/dashboard/server/package.json +16 -0
- package/dashboard/server/routes/agents.js +234 -0
- package/dashboard/server/routes/config.js +64 -0
- package/dashboard/server/routes/health.js +98 -0
- package/dashboard/server/routes/incidents.js +78 -0
- package/dashboard/server/routes/intel.js +69 -0
- package/dashboard/server/routes/memory.js +107 -0
- package/dashboard/server/routes/planning.js +234 -0
- package/dashboard/server/routes/progress.js +77 -0
- package/dashboard/server/routes/projects.js +36 -0
- package/dashboard/server/routes/requirements.js +40 -0
- package/dashboard/server/routes/roadmap.js +69 -0
- package/dashboard/server/routes/sessions.js +70 -0
- package/dashboard/server/routes/status.js +25 -0
- package/dashboard/server/routes/telemetry.js +233 -0
- package/dashboard/server/services/file-watcher.js +105 -0
- package/dashboard/server/services/planning-reader.js +727 -0
- package/dashboard/server/test/cli.test.js +34 -0
- package/dashboard/server/test/frontmatter.test.js +104 -0
- package/dashboard/server/test/isolation.test.js +32 -0
- package/dashboard/server/test/planning-reader.test.js +151 -0
- package/dashboard/server/test/routes.test.js +91 -0
- package/dashboard/server/test/ws.test.js +81 -0
- package/dashboard/server/ws.js +96 -0
- package/dashboard/src/App.jsx +165 -0
- package/dashboard/src/components/charts/BudgetBars.jsx +42 -0
- package/dashboard/src/components/charts/ContextRadar.jsx +34 -0
- package/dashboard/src/components/charts/PhaseDonut.jsx +66 -0
- package/dashboard/src/components/charts/SuccessTrend.jsx +45 -0
- package/dashboard/src/components/charts/TokenChart.jsx +55 -0
- package/dashboard/src/components/charts/index.js +5 -0
- package/dashboard/src/components/config/CfgSection.jsx +93 -0
- package/dashboard/src/components/layout/Header.jsx +89 -0
- package/dashboard/src/components/layout/ProjectSwitcher.jsx +160 -0
- package/dashboard/src/components/layout/Sidebar.jsx +161 -0
- package/dashboard/src/components/ui/AutoModeBanner.jsx +138 -0
- package/dashboard/src/components/ui/BackButton.jsx +27 -0
- package/dashboard/src/components/ui/Badge.jsx +27 -0
- package/dashboard/src/components/ui/Card.jsx +23 -0
- package/dashboard/src/components/ui/ChartTooltip.jsx +48 -0
- package/dashboard/src/components/ui/CheckpointBox.jsx +110 -0
- package/dashboard/src/components/ui/CodeBlock.jsx +27 -0
- package/dashboard/src/components/ui/ConfidenceBadge.jsx +20 -0
- package/dashboard/src/components/ui/ConfirmModal.jsx +161 -0
- package/dashboard/src/components/ui/ConnectionBanner.jsx +60 -0
- package/dashboard/src/components/ui/ErrorBoundary.jsx +106 -0
- package/dashboard/src/components/ui/ErrorBox.jsx +107 -0
- package/dashboard/src/components/ui/KeyValue.jsx +33 -0
- package/dashboard/src/components/ui/LoadingSkeleton.jsx +84 -0
- package/dashboard/src/components/ui/MetricCard.jsx +58 -0
- package/dashboard/src/components/ui/NextUpBlock.jsx +92 -0
- package/dashboard/src/components/ui/NumberInput.jsx +44 -0
- package/dashboard/src/components/ui/PBRBanner.jsx +47 -0
- package/dashboard/src/components/ui/PipelineView.jsx +130 -0
- package/dashboard/src/components/ui/ProgressBar.jsx +28 -0
- package/dashboard/src/components/ui/ProgressDisplay.jsx +47 -0
- package/dashboard/src/components/ui/QualityGateBadge.jsx +15 -0
- package/dashboard/src/components/ui/SectionTitle.jsx +35 -0
- package/dashboard/src/components/ui/SelectInput.jsx +45 -0
- package/dashboard/src/components/ui/StatusDot.jsx +51 -0
- package/dashboard/src/components/ui/StatusSymbol.jsx +49 -0
- package/dashboard/src/components/ui/TabBar.jsx +41 -0
- package/dashboard/src/components/ui/TextInput.jsx +42 -0
- package/dashboard/src/components/ui/Toast.jsx +117 -0
- package/dashboard/src/components/ui/Toggle.jsx +70 -0
- package/dashboard/src/components/ui/index.js +29 -0
- package/dashboard/src/hooks/useDocumentTitle.js +16 -0
- package/dashboard/src/hooks/useFetch.js +50 -0
- package/dashboard/src/hooks/useToast.jsx +43 -0
- package/dashboard/src/hooks/useWebSocket.js +103 -0
- package/dashboard/src/lib/api.js +112 -0
- package/dashboard/src/lib/configSchema.js +189 -0
- package/dashboard/src/lib/constants.js +22 -0
- package/dashboard/src/main.jsx +15 -0
- package/dashboard/src/pages/AgentsPage.jsx +191 -0
- package/dashboard/src/pages/ConfigPage.jsx +298 -0
- package/dashboard/src/pages/HooksPage.jsx +412 -0
- package/dashboard/src/pages/IncidentsPage.jsx +135 -0
- package/dashboard/src/pages/IntelPage.jsx +193 -0
- package/dashboard/src/pages/LiveFeed.jsx +274 -0
- package/dashboard/src/pages/MemoryPage.jsx +107 -0
- package/dashboard/src/pages/OnboardingPage.jsx +117 -0
- package/dashboard/src/pages/Overview.jsx +360 -0
- package/dashboard/src/pages/PhaseDetailView.jsx +216 -0
- package/dashboard/src/pages/PlanningPage.jsx +181 -0
- package/dashboard/src/pages/ProgressPage.jsx +249 -0
- package/dashboard/src/pages/ResearchPage.jsx +129 -0
- package/dashboard/src/pages/RoadmapPage.jsx +251 -0
- package/dashboard/src/pages/SessionsPage.jsx +117 -0
- package/dashboard/src/pages/Telemetry.jsx +166 -0
- package/dashboard/src/pages/planning/DecisionsTab.jsx +153 -0
- package/dashboard/src/pages/planning/FilesTab.jsx +420 -0
- package/dashboard/src/pages/planning/MilestoneDetail.jsx +319 -0
- package/dashboard/src/pages/planning/MilestonesTab.jsx +151 -0
- package/dashboard/src/pages/planning/NotesTab.jsx +251 -0
- package/dashboard/src/pages/planning/PhasesTab.jsx +218 -0
- package/dashboard/src/pages/planning/QuickTab.jsx +50 -0
- package/dashboard/src/pages/planning/ResearchTab.jsx +103 -0
- package/dashboard/src/pages/planning/TodosTab.jsx +297 -0
- package/dashboard/src/theme/ThemeProvider.jsx +38 -0
- package/dashboard/src/theme/tokens.js +17 -0
- package/dashboard/tests/components/ConfirmModal.test.jsx +179 -0
- package/dashboard/tests/components/ConnectionBanner.test.jsx +37 -0
- package/dashboard/tests/components/ErrorBoundary.test.jsx +59 -0
- package/dashboard/tests/components/LoadingSkeleton.test.jsx +46 -0
- package/dashboard/tests/components/ToastContainer.test.jsx +47 -0
- package/dashboard/tests/components/Toggle.test.jsx +61 -0
- package/dashboard/tests/hooks/useFetch.test.jsx +77 -0
- package/dashboard/tests/hooks/useToast.test.jsx +78 -0
- package/dashboard/tests/hooks/useWebSocket.test.jsx +128 -0
- package/dashboard/tests/pages/ConfigPage.test.jsx +199 -0
- package/dashboard/tests/pages/PlanningPage.test.jsx +119 -0
- package/dashboard/tests/pages/planning/FilesTab.test.jsx +198 -0
- package/dashboard/tests/pages/planning/NotesTab.test.jsx +178 -0
- package/dashboard/tests/pages/planning/TodosTab.test.jsx +188 -0
- package/dashboard/tests/performance.test.jsx +46 -0
- package/dashboard/tests/routes/config.test.js +98 -0
- package/dashboard/tests/routes/health.test.js +40 -0
- package/dashboard/tests/routes/planning.test.js +112 -0
- package/dashboard/tests/routes/roadmap.test.js +91 -0
- package/dashboard/tests/routes/status.test.js +131 -0
- package/dashboard/tests/server/planning-reader.test.js +153 -0
- package/dashboard/tests/setup.js +7 -0
- package/dashboard/vite.config.js +41 -0
- package/package.json +55 -40
- package/plan-build-run/bin/config-schema.json +1298 -0
- package/plugins/pbr/.claude-plugin/plugin.json +1 -1
- package/plugins/pbr/CLAUDE.md +19 -0
- package/plugins/pbr/UI-CONSISTENCY-GAPS.md +1 -1
- package/plugins/pbr/agents/advisor-researcher.md +101 -0
- package/plugins/pbr/agents/audit.md +205 -89
- package/plugins/pbr/agents/codebase-mapper.md +158 -23
- package/plugins/pbr/agents/debugger.md +212 -34
- package/plugins/pbr/agents/dev-sync.md +206 -0
- package/plugins/pbr/agents/executor.md +717 -39
- package/plugins/pbr/agents/general.md +71 -6
- package/plugins/pbr/agents/integration-checker.md +146 -30
- package/plugins/pbr/agents/intel-updater.md +332 -0
- package/plugins/pbr/agents/nyquist-auditor.md +253 -0
- package/plugins/pbr/agents/plan-checker.md +265 -65
- package/plugins/pbr/agents/planner.md +440 -42
- package/plugins/pbr/agents/researcher.md +219 -36
- package/plugins/pbr/agents/roadmapper.md +397 -0
- package/plugins/pbr/agents/synthesizer.md +166 -26
- package/plugins/pbr/agents/ui-checker.md +203 -0
- package/plugins/pbr/agents/ui-researcher.md +224 -0
- package/plugins/pbr/agents/verifier.md +495 -47
- package/plugins/pbr/commands/add-phase.md +75 -0
- package/plugins/pbr/commands/add-todo.md +8 -0
- package/plugins/pbr/commands/audit-fix.md +5 -0
- package/plugins/pbr/commands/audit-milestone.md +8 -0
- package/plugins/pbr/commands/autonomous.md +5 -0
- package/plugins/pbr/commands/backlog.md +6 -0
- package/plugins/pbr/commands/check-todos.md +8 -0
- package/plugins/pbr/commands/complete-milestone.md +8 -0
- package/plugins/pbr/commands/config.md +1 -1
- package/plugins/pbr/commands/discuss-phase.md +6 -0
- package/plugins/pbr/commands/do.md +5 -0
- package/plugins/pbr/commands/execute-phase.md +6 -0
- package/plugins/pbr/commands/fast.md +6 -0
- package/plugins/pbr/commands/forensics.md +6 -0
- package/plugins/pbr/commands/import.md +1 -1
- package/plugins/pbr/commands/insert-phase.md +65 -0
- package/plugins/pbr/commands/intel.md +5 -0
- package/plugins/pbr/commands/join-discord.md +11 -0
- package/plugins/pbr/commands/list-phase-assumptions.md +5 -0
- package/plugins/pbr/commands/map-codebase.md +6 -0
- package/plugins/pbr/commands/milestone-summary.md +6 -0
- package/plugins/pbr/commands/new-milestone.md +8 -0
- package/plugins/pbr/commands/new-project.md +6 -0
- package/plugins/pbr/commands/pause-work.md +5 -0
- package/plugins/pbr/commands/plan-milestone-gaps.md +7 -0
- package/plugins/pbr/commands/plan-phase.md +6 -0
- package/plugins/pbr/commands/plant-seed.md +6 -0
- package/plugins/pbr/commands/profile-user.md +5 -0
- package/plugins/pbr/commands/profile.md +5 -0
- package/plugins/pbr/commands/progress.md +6 -0
- package/plugins/pbr/commands/quick.md +1 -1
- package/plugins/pbr/commands/reapply-patches.md +47 -0
- package/plugins/pbr/commands/release.md +6 -0
- package/plugins/pbr/commands/remove-phase.md +66 -0
- package/plugins/pbr/commands/research-phase.md +59 -0
- package/plugins/pbr/commands/resume-work.md +5 -0
- package/plugins/pbr/commands/seed.md +6 -0
- package/plugins/pbr/commands/session-report.md +5 -0
- package/plugins/pbr/commands/set-profile.md +6 -0
- package/plugins/pbr/commands/settings.md +5 -0
- package/plugins/pbr/commands/setup.md +1 -1
- package/plugins/pbr/commands/ship.md +5 -0
- package/plugins/pbr/commands/stats.md +6 -0
- package/plugins/pbr/commands/test.md +5 -0
- package/plugins/pbr/commands/thread.md +6 -0
- package/plugins/pbr/commands/todo.md +1 -1
- package/plugins/pbr/commands/ui-phase.md +5 -0
- package/plugins/pbr/commands/ui-review.md +5 -0
- package/plugins/pbr/commands/undo.md +5 -0
- package/plugins/pbr/commands/update.md +37 -0
- package/plugins/pbr/commands/validate-phase.md +5 -0
- package/plugins/pbr/commands/verify-work.md +6 -0
- package/plugins/pbr/dashboard/package-lock.json +6 -0
- package/plugins/pbr/dist/architecture-guard.js +59 -0
- package/plugins/pbr/dist/audit-dimensions.js +556 -0
- package/plugins/pbr/dist/auto-continue.js +277 -0
- package/plugins/pbr/dist/block-skill-self-read.js +124 -0
- package/plugins/pbr/dist/check-agent-state-write.js +63 -0
- package/plugins/pbr/dist/check-config-change.js +155 -0
- package/plugins/pbr/dist/check-cross-plugin-sync.js +93 -0
- package/plugins/pbr/dist/check-dangerous-commands.js +193 -0
- package/plugins/pbr/dist/check-direct-state-write.js +37 -0
- package/plugins/pbr/dist/check-doc-sprawl.js +102 -0
- package/plugins/pbr/dist/check-phase-boundary.js +191 -0
- package/plugins/pbr/dist/check-plan-format.js +209 -0
- package/plugins/pbr/dist/check-read-first.js +345 -0
- package/plugins/pbr/dist/check-roadmap-sync.js +507 -0
- package/plugins/pbr/dist/check-skill-workflow.js +354 -0
- package/plugins/pbr/dist/check-state-sync.js +658 -0
- package/plugins/pbr/dist/check-subagent-output.js +396 -0
- package/plugins/pbr/dist/check-summary-gate.js +188 -0
- package/plugins/pbr/dist/context-bridge.js +425 -0
- package/plugins/pbr/dist/context-budget-check.js +442 -0
- package/plugins/pbr/dist/context-quality.js +271 -0
- package/plugins/pbr/dist/enforce-context-budget.js +138 -0
- package/plugins/pbr/dist/enforce-pbr-workflow.js +277 -0
- package/plugins/pbr/dist/event-handler.js +202 -0
- package/plugins/pbr/dist/event-logger.js +125 -0
- package/plugins/pbr/dist/feedback-loop.js +155 -0
- package/plugins/pbr/dist/graph-update.js +422 -0
- package/plugins/pbr/dist/hook-logger.js +114 -0
- package/plugins/pbr/dist/hook-server-client.js +361 -0
- package/plugins/pbr/dist/hook-server.js +658 -0
- package/plugins/pbr/dist/hooks-schema.json +87 -0
- package/plugins/pbr/dist/instructions-loaded.js +173 -0
- package/plugins/pbr/dist/intercept-plan-mode.js +81 -0
- package/plugins/pbr/dist/log-notification.js +131 -0
- package/plugins/pbr/dist/log-subagent.js +349 -0
- package/plugins/pbr/dist/log-tool-failure.js +140 -0
- package/plugins/pbr/dist/milestone-learnings.js +519 -0
- package/plugins/pbr/dist/pbr-tools.js +1961 -0
- package/plugins/pbr/dist/post-bash-triage.js +96 -0
- package/plugins/pbr/dist/post-compact.js +135 -0
- package/plugins/pbr/dist/post-hoc.js +237 -0
- package/plugins/pbr/dist/post-write-dispatch.js +243 -0
- package/plugins/pbr/dist/post-write-quality.js +208 -0
- package/plugins/pbr/dist/pre-bash-dispatch.js +212 -0
- package/plugins/pbr/dist/pre-skill-dispatch.js +114 -0
- package/plugins/pbr/dist/pre-task-dispatch.js +269 -0
- package/plugins/pbr/dist/pre-write-dispatch.js +234 -0
- package/plugins/pbr/dist/progress-tracker.js +173 -0
- package/plugins/pbr/dist/prompt-guard.js +114 -0
- package/plugins/pbr/dist/prompt-routing.js +209 -0
- package/plugins/pbr/dist/quick-status.js +179 -0
- package/plugins/pbr/dist/record-incident.js +37 -0
- package/plugins/pbr/dist/run-hook.js +144 -0
- package/plugins/pbr/dist/session-cleanup.js +653 -0
- package/plugins/pbr/dist/session-tracker.js +124 -0
- package/plugins/pbr/dist/status-line.js +849 -0
- package/plugins/pbr/dist/suggest-compact.js +307 -0
- package/plugins/pbr/dist/sync-context-to-claude.js +100 -0
- package/plugins/pbr/dist/task-completed.js +206 -0
- package/plugins/pbr/dist/track-context-budget.js +432 -0
- package/plugins/pbr/dist/track-user-gates.js +88 -0
- package/plugins/pbr/dist/trust-tracker.js +193 -0
- package/plugins/pbr/dist/validate-commit.js +215 -0
- package/plugins/pbr/dist/validate-skill-args.js +222 -0
- package/plugins/pbr/dist/validate-task.js +271 -0
- package/plugins/pbr/dist/worktree-create.js +144 -0
- package/plugins/pbr/dist/worktree-remove.js +147 -0
- package/plugins/pbr/hooks/hooks.json +143 -60
- package/plugins/pbr/references/agent-contracts.md +39 -8
- package/plugins/pbr/references/agent-teams.md +3 -3
- package/plugins/pbr/references/archive/checkpoints.md +189 -0
- package/plugins/pbr/references/archive/context-quality-tiers.md +45 -0
- package/plugins/pbr/references/archive/hook-ordering.md +89 -0
- package/plugins/pbr/references/archive/limitations.md +106 -0
- package/plugins/pbr/references/archive/pbr-rules.md +194 -0
- package/plugins/pbr/references/archive/pbr-tools-cli.md +415 -0
- package/plugins/pbr/references/archive/pretooluse-jsonl-behavior.md +58 -0
- package/plugins/pbr/references/archive/signal-files.md +41 -0
- package/plugins/pbr/references/archive/tmux-setup.md +288 -0
- package/plugins/pbr/references/archive/verification-matrix.md +34 -0
- package/plugins/pbr/references/archive/verification-patterns.md +277 -0
- package/plugins/pbr/references/archive/worktree-sparse-checkout.md +86 -0
- package/plugins/pbr/references/checkpoints.md +723 -104
- package/plugins/pbr/references/config-reference.md +376 -10
- package/plugins/pbr/references/continuation-format.md +1 -0
- package/plugins/pbr/references/decimal-phase-calculation.md +65 -0
- package/plugins/pbr/references/deviation-rules.md +12 -0
- package/plugins/pbr/references/git-integration.md +110 -27
- package/plugins/pbr/references/git-planning-commit.md +35 -0
- package/plugins/pbr/references/model-profile-resolution.md +34 -0
- package/plugins/pbr/references/model-profiles.md +90 -7
- package/plugins/pbr/references/model-selection.md +1 -1
- package/plugins/pbr/references/node-repair.md +48 -0
- package/plugins/pbr/references/plan-authoring.md +65 -0
- package/plugins/pbr/references/plan-format.md +161 -10
- package/plugins/pbr/references/questioning.md +138 -49
- package/plugins/pbr/references/reading-verification.md +4 -4
- package/plugins/pbr/references/tdd.md +263 -0
- package/plugins/pbr/references/ui-brand.md +449 -0
- package/plugins/pbr/references/verification-overrides.md +39 -0
- package/plugins/pbr/references/verification-patterns.md +529 -113
- package/plugins/pbr/scripts/architecture-guard.js +59 -0
- package/plugins/pbr/scripts/audit-checks/behavioral-compliance.js +2098 -0
- package/plugins/pbr/scripts/audit-checks/error-analysis.js +989 -0
- package/plugins/pbr/scripts/audit-checks/feature-verification.js +723 -0
- package/plugins/pbr/scripts/audit-checks/index.js +433 -0
- package/plugins/pbr/scripts/audit-checks/infrastructure.js +816 -0
- package/plugins/pbr/scripts/audit-checks/quality-metrics.js +452 -0
- package/plugins/pbr/scripts/audit-checks/session-quality.js +980 -0
- package/plugins/pbr/scripts/audit-checks/si-agent-hook-config-checks.js +396 -0
- package/plugins/pbr/scripts/audit-checks/si-cross-cutting-checks.js +272 -0
- package/plugins/pbr/scripts/audit-checks/si-skill-checks.js +424 -0
- package/plugins/pbr/scripts/audit-checks/workflow-compliance.js +1175 -0
- package/plugins/pbr/scripts/audit-dimensions.js +556 -0
- package/plugins/pbr/scripts/auto-continue.js +192 -31
- package/plugins/pbr/scripts/block-skill-self-read.js +124 -0
- package/plugins/pbr/scripts/check-agent-state-write.js +63 -0
- package/plugins/pbr/scripts/check-config-change.js +155 -0
- package/plugins/pbr/scripts/check-cross-plugin-sync.js +93 -0
- package/plugins/pbr/scripts/check-dangerous-commands.js +18 -5
- package/plugins/pbr/scripts/check-direct-state-write.js +37 -0
- package/plugins/pbr/scripts/check-phase-boundary.js +3 -8
- package/plugins/pbr/scripts/check-plan-format.js +135 -278
- package/plugins/pbr/scripts/check-read-first.js +345 -0
- package/plugins/pbr/scripts/check-roadmap-sync.js +182 -21
- package/plugins/pbr/scripts/check-skill-workflow.js +24 -27
- package/plugins/pbr/scripts/check-state-sync.js +339 -215
- package/plugins/pbr/scripts/check-subagent-output.js +281 -275
- package/plugins/pbr/scripts/check-summary-gate.js +5 -15
- package/plugins/pbr/scripts/config-schema.json +1134 -95
- package/plugins/pbr/scripts/context-bridge.js +425 -0
- package/plugins/pbr/scripts/context-budget-check.js +169 -14
- package/plugins/pbr/scripts/context-quality.js +271 -0
- package/plugins/pbr/scripts/enforce-context-budget.js +138 -0
- package/plugins/pbr/scripts/enforce-pbr-workflow.js +277 -0
- package/plugins/pbr/scripts/event-handler.js +127 -87
- package/plugins/pbr/scripts/event-logger.js +58 -25
- package/plugins/pbr/scripts/feedback-loop.js +155 -0
- package/plugins/pbr/scripts/graph-update.js +422 -0
- package/plugins/pbr/scripts/hook-logger.js +69 -35
- package/plugins/pbr/scripts/hook-server-client.js +361 -0
- package/plugins/pbr/scripts/hook-server.js +658 -0
- package/plugins/pbr/scripts/hooks-schema.json +13 -5
- package/plugins/pbr/scripts/instructions-loaded.js +173 -0
- package/plugins/pbr/scripts/intent-router.cjs +147 -0
- package/plugins/pbr/scripts/intercept-plan-mode.js +52 -18
- package/plugins/pbr/scripts/lib/alternatives.js +203 -0
- package/plugins/pbr/scripts/lib/audit.js +65 -0
- package/plugins/pbr/scripts/lib/auto-cleanup.js +221 -0
- package/plugins/pbr/scripts/lib/auto-verify.js +103 -0
- package/plugins/pbr/scripts/lib/build.js +719 -0
- package/plugins/pbr/scripts/lib/ci-fix-loop.js +228 -0
- package/plugins/pbr/scripts/lib/commands.js +483 -0
- package/plugins/pbr/scripts/lib/compound.js +216 -0
- package/plugins/pbr/scripts/lib/config.js +1308 -0
- package/plugins/pbr/scripts/lib/context.js +254 -0
- package/plugins/pbr/scripts/lib/contextual-help.js +183 -0
- package/plugins/pbr/scripts/lib/convention-detector.js +413 -0
- package/plugins/pbr/scripts/lib/core.js +1569 -0
- package/plugins/pbr/scripts/lib/dashboard-launch.js +364 -0
- package/plugins/pbr/scripts/lib/data-hygiene.js +179 -0
- package/plugins/pbr/scripts/lib/decision-extraction.js +183 -0
- package/plugins/pbr/scripts/lib/decisions.js +194 -0
- package/plugins/pbr/scripts/lib/dependency-break.js +147 -0
- package/plugins/pbr/scripts/lib/format-validators.js +1025 -0
- package/plugins/pbr/scripts/lib/frontmatter.js +302 -0
- package/plugins/pbr/scripts/lib/gates/advisories.js +129 -0
- package/plugins/pbr/scripts/lib/gates/build-dependency.js +115 -0
- package/plugins/pbr/scripts/lib/gates/build-executor.js +104 -0
- package/plugins/pbr/scripts/lib/gates/doc-existence.js +46 -0
- package/plugins/pbr/scripts/lib/gates/helpers.js +93 -0
- package/plugins/pbr/scripts/lib/gates/inline-execution.js +185 -0
- package/plugins/pbr/scripts/lib/gates/milestone-complete.js +136 -0
- package/plugins/pbr/scripts/lib/gates/milestone-summary.js +119 -0
- package/plugins/pbr/scripts/lib/gates/multi-phase-loader.js +147 -0
- package/plugins/pbr/scripts/lib/gates/plan-executor.js +36 -0
- package/plugins/pbr/scripts/lib/gates/plan-validation.js +114 -0
- package/plugins/pbr/scripts/lib/gates/quick-executor.js +76 -0
- package/plugins/pbr/scripts/lib/gates/review-planner.js +61 -0
- package/plugins/pbr/scripts/lib/gates/review-verifier.js +69 -0
- package/plugins/pbr/scripts/lib/gates/rich-agent-context.js +137 -0
- package/plugins/pbr/scripts/lib/gates/user-confirmation.js +93 -0
- package/plugins/pbr/scripts/lib/graph-cli.js +89 -0
- package/plugins/pbr/scripts/lib/graph.js +553 -0
- package/plugins/pbr/scripts/lib/health-checks.js +107 -0
- package/plugins/pbr/scripts/lib/health-phase06.js +120 -0
- package/plugins/pbr/scripts/lib/health.js +132 -0
- package/plugins/pbr/scripts/lib/help.js +100 -0
- package/plugins/pbr/scripts/lib/history.js +150 -0
- package/plugins/pbr/scripts/lib/impact-analysis.js +319 -0
- package/plugins/pbr/scripts/lib/incidents.js +190 -0
- package/plugins/pbr/scripts/lib/init.js +643 -0
- package/plugins/pbr/scripts/lib/insights-parser.js +320 -0
- package/plugins/pbr/scripts/lib/intel.js +653 -0
- package/plugins/pbr/scripts/lib/learnings.js +511 -0
- package/plugins/pbr/scripts/lib/migrate.js +298 -0
- package/plugins/pbr/scripts/lib/milestone.js +306 -0
- package/plugins/pbr/scripts/lib/negative-knowledge.js +194 -0
- package/plugins/pbr/scripts/lib/notification-throttle.js +141 -0
- package/plugins/pbr/scripts/lib/onboarding-generator.js +288 -0
- package/plugins/pbr/scripts/lib/parse-args.js +134 -0
- package/plugins/pbr/scripts/lib/pattern-routing.js +55 -0
- package/plugins/pbr/scripts/lib/patterns.js +272 -0
- package/plugins/pbr/scripts/lib/perf.js +190 -0
- package/plugins/pbr/scripts/lib/phase.js +1025 -0
- package/plugins/pbr/scripts/lib/pid-lock.js +154 -0
- package/plugins/pbr/scripts/lib/post-hoc.js +160 -0
- package/plugins/pbr/scripts/lib/pre-commit-checks.js +220 -0
- package/plugins/pbr/scripts/lib/pre-research.js +126 -0
- package/plugins/pbr/scripts/lib/preview.js +174 -0
- package/plugins/pbr/scripts/lib/progress-visualization.js +296 -0
- package/plugins/pbr/scripts/lib/quick-init.js +131 -0
- package/plugins/pbr/scripts/lib/reference.js +236 -0
- package/plugins/pbr/scripts/lib/requirements.js +153 -0
- package/plugins/pbr/scripts/lib/resolve-root.js +66 -0
- package/plugins/pbr/scripts/lib/reverse-spec.js +259 -0
- package/plugins/pbr/scripts/lib/roadmap.js +1089 -0
- package/plugins/pbr/scripts/lib/security-scan.js +200 -0
- package/plugins/pbr/scripts/lib/session-briefing.js +895 -0
- package/plugins/pbr/scripts/lib/skill-section.js +99 -0
- package/plugins/pbr/scripts/lib/smart-next-task.js +198 -0
- package/plugins/pbr/scripts/lib/snapshot-manager.js +232 -0
- package/plugins/pbr/scripts/lib/spec-diff.js +209 -0
- package/plugins/pbr/scripts/lib/spec-engine.js +189 -0
- package/plugins/pbr/scripts/lib/spot-check.js +539 -0
- package/plugins/pbr/scripts/lib/state-queue.js +171 -0
- package/plugins/pbr/scripts/lib/state.js +1082 -0
- package/plugins/pbr/scripts/lib/status-render.js +511 -0
- package/plugins/pbr/scripts/lib/step-verify.js +149 -0
- package/plugins/pbr/scripts/lib/subagent-validators.js +1059 -0
- package/plugins/pbr/scripts/lib/suggest-next.js +435 -0
- package/plugins/pbr/scripts/lib/tech-debt-scanner.js +116 -0
- package/plugins/pbr/scripts/lib/templates.js +362 -0
- package/plugins/pbr/scripts/lib/test-selection.js +163 -0
- package/plugins/pbr/scripts/lib/todo.js +300 -0
- package/plugins/pbr/scripts/lib/verify.js +1483 -0
- package/plugins/pbr/scripts/log-notification.js +131 -0
- package/plugins/pbr/scripts/log-subagent.js +203 -18
- package/plugins/pbr/scripts/log-tool-failure.js +60 -8
- package/plugins/pbr/scripts/milestone-learnings.js +519 -0
- package/plugins/pbr/scripts/package.json +1 -1
- package/plugins/pbr/scripts/pbr-tools.js +1754 -1171
- package/plugins/pbr/scripts/post-bash-triage.js +96 -0
- package/plugins/pbr/scripts/post-compact.js +135 -0
- package/plugins/pbr/scripts/post-hoc.js +237 -0
- package/plugins/pbr/scripts/post-write-dispatch.js +201 -31
- package/plugins/pbr/scripts/post-write-quality.js +4 -3
- package/plugins/pbr/scripts/pre-bash-dispatch.js +147 -51
- package/plugins/pbr/scripts/pre-skill-dispatch.js +114 -0
- package/plugins/pbr/scripts/pre-task-dispatch.js +269 -0
- package/plugins/pbr/scripts/pre-write-dispatch.js +170 -73
- package/plugins/pbr/scripts/progress-tracker.js +122 -310
- package/plugins/pbr/scripts/prompt-guard.js +114 -0
- package/plugins/pbr/scripts/prompt-routing.js +209 -0
- package/plugins/pbr/scripts/quick-status.js +179 -0
- package/plugins/pbr/scripts/record-incident.js +37 -0
- package/plugins/pbr/scripts/risk-classifier.cjs +123 -0
- package/plugins/pbr/scripts/run-hook.js +62 -10
- package/plugins/pbr/scripts/session-cleanup.js +428 -29
- package/plugins/pbr/scripts/session-tracker.js +124 -0
- package/plugins/pbr/scripts/status-line.js +593 -32
- package/plugins/pbr/scripts/suggest-compact.js +201 -13
- package/plugins/pbr/scripts/sync-context-to-claude.js +100 -0
- package/plugins/pbr/scripts/task-completed.js +165 -4
- package/plugins/pbr/scripts/test/config.test.js +126 -0
- package/plugins/pbr/scripts/test/cross-platform.test.js +131 -0
- package/plugins/pbr/scripts/test/fixtures/config.json +20 -0
- package/plugins/pbr/scripts/test/fixtures/plan.md +54 -0
- package/plugins/pbr/scripts/test/fixtures/project.md +30 -0
- package/plugins/pbr/scripts/test/fixtures/roadmap.md +55 -0
- package/plugins/pbr/scripts/test/fixtures/state.md +60 -0
- package/plugins/pbr/scripts/test/fixtures/summary.md +35 -0
- package/plugins/pbr/scripts/test/fixtures.test.js +184 -0
- package/plugins/pbr/scripts/test/phase.test.js +142 -0
- package/plugins/pbr/scripts/test/roadmap.test.js +96 -0
- package/plugins/pbr/scripts/test/state.test.js +155 -0
- package/plugins/pbr/scripts/track-context-budget.js +368 -99
- package/plugins/pbr/scripts/track-user-gates.js +88 -0
- package/plugins/pbr/scripts/trust-tracker.js +193 -0
- package/plugins/pbr/scripts/validate-commit.js +41 -26
- package/plugins/pbr/scripts/validate-skill-args.js +87 -15
- package/plugins/pbr/scripts/validate-task.js +83 -627
- package/plugins/pbr/scripts/worktree-create.js +144 -0
- package/plugins/pbr/scripts/worktree-remove.js +147 -0
- package/plugins/pbr/skills/audit/SKILL.md +195 -24
- package/plugins/pbr/skills/audit-fix/SKILL.md +326 -0
- package/plugins/pbr/skills/autonomous/SKILL.md +545 -0
- package/plugins/pbr/skills/backlog/SKILL.md +56 -0
- package/plugins/pbr/skills/begin/SKILL.md +508 -153
- package/plugins/pbr/skills/begin/templates/STATE.md.tmpl +1 -2
- package/plugins/pbr/skills/begin/templates/config.json.tmpl +411 -36
- package/plugins/pbr/skills/begin/templates/researcher-prompt.md.tmpl +28 -0
- package/plugins/pbr/skills/begin/templates/roadmap-prompt.md.tmpl +28 -3
- package/plugins/pbr/skills/begin/templates/synthesis-prompt.md.tmpl +33 -5
- package/plugins/pbr/skills/build/SKILL.md +1040 -354
- package/plugins/pbr/skills/build/templates/continuation-prompt.md.tmpl +26 -0
- package/plugins/pbr/skills/build/templates/executor-prompt.md.tmpl +77 -0
- package/plugins/pbr/skills/build/templates/inline-verifier-prompt.md.tmpl +33 -0
- package/plugins/pbr/skills/config/SKILL.md +112 -9
- package/plugins/pbr/skills/continue/SKILL.md +113 -33
- package/plugins/pbr/skills/dashboard/SKILL.md +21 -9
- package/plugins/pbr/skills/debug/SKILL.md +70 -12
- package/plugins/pbr/skills/debug/templates/continuation-prompt.md.tmpl +12 -1
- package/plugins/pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +12 -5
- package/plugins/pbr/skills/discuss/SKILL.md +206 -25
- package/plugins/pbr/skills/discuss/templates/CONTEXT.md.tmpl +21 -1
- package/plugins/pbr/skills/do/SKILL.md +119 -24
- package/plugins/pbr/skills/explore/SKILL.md +95 -20
- package/plugins/pbr/skills/fast/SKILL.md +94 -0
- package/plugins/pbr/skills/forensics/SKILL.md +144 -0
- package/plugins/pbr/skills/health/SKILL.md +35 -117
- package/plugins/pbr/skills/help/SKILL.md +84 -101
- package/plugins/pbr/skills/import/SKILL.md +332 -13
- package/plugins/pbr/skills/intel/SKILL.md +131 -0
- package/plugins/pbr/skills/list-phase-assumptions/SKILL.md +231 -0
- package/plugins/pbr/skills/milestone/SKILL.md +421 -263
- package/plugins/pbr/skills/milestone/templates/audit-output.md.tmpl +76 -0
- package/plugins/pbr/skills/milestone/templates/complete-output.md.tmpl +32 -0
- package/plugins/pbr/skills/milestone/templates/edge-cases.md +54 -0
- package/plugins/pbr/skills/milestone/templates/gaps-output.md.tmpl +25 -0
- package/plugins/pbr/skills/milestone/templates/integration-checker-prompt.md.tmpl +25 -0
- package/plugins/pbr/skills/milestone/templates/new-output.md.tmpl +29 -0
- package/plugins/pbr/skills/milestone-summary/SKILL.md +86 -0
- package/plugins/pbr/skills/note/SKILL.md +20 -4
- package/plugins/pbr/skills/pause/SKILL.md +54 -14
- package/plugins/pbr/skills/pause/templates/continue-here.md.tmpl +33 -52
- package/plugins/pbr/skills/plan/SKILL.md +526 -280
- package/plugins/pbr/skills/plan/templates/checker-prompt.md.tmpl +5 -2
- package/plugins/pbr/skills/plan/templates/completion-output.md.tmpl +27 -0
- package/plugins/pbr/skills/plan/templates/planner-prompt.md.tmpl +27 -1
- package/plugins/pbr/skills/plan/templates/revision-prompt.md.tmpl +21 -5
- package/plugins/pbr/skills/profile/SKILL.md +185 -0
- package/plugins/pbr/skills/profile-user/SKILL.md +227 -0
- package/plugins/pbr/skills/quick/SKILL.md +435 -100
- package/plugins/pbr/skills/release/SKILL.md +206 -0
- package/plugins/pbr/skills/resume/SKILL.md +170 -46
- package/plugins/pbr/skills/review/SKILL.md +217 -164
- package/plugins/pbr/skills/review/templates/verifier-prompt.md.tmpl +7 -0
- package/plugins/pbr/skills/scan/SKILL.md +152 -106
- package/plugins/pbr/skills/scan/templates/mapper-prompt.md.tmpl +5 -56
- package/plugins/pbr/skills/seed/SKILL.md +87 -0
- package/plugins/pbr/skills/session-report/SKILL.md +130 -0
- package/plugins/pbr/skills/setup/SKILL.md +150 -202
- package/plugins/pbr/skills/shared/agent-context-enrichment.md +21 -0
- package/plugins/pbr/skills/shared/agent-type-resolution.md +32 -0
- package/plugins/pbr/skills/shared/commit-planning-docs.md +8 -0
- package/plugins/pbr/skills/shared/context-budget.md +66 -1
- package/plugins/pbr/skills/shared/context-loader-task.md +18 -11
- package/plugins/pbr/skills/shared/digest-select.md +2 -2
- package/plugins/pbr/skills/shared/domain-probes.md +1 -1
- package/plugins/pbr/skills/shared/error-reporting.md +38 -60
- package/plugins/pbr/skills/shared/gate-prompts.md +4 -2
- package/plugins/pbr/skills/shared/memory-capture.md +48 -0
- package/plugins/pbr/skills/shared/phase-argument-parsing.md +4 -4
- package/plugins/pbr/skills/shared/revision-loop.md +24 -6
- package/plugins/pbr/skills/shared/state-update.md +49 -56
- package/plugins/pbr/skills/shared/universal-anti-patterns.md +27 -4
- package/plugins/pbr/skills/ship/SKILL.md +155 -0
- package/plugins/pbr/skills/stats/SKILL.md +80 -0
- package/plugins/pbr/skills/status/SKILL.md +185 -119
- package/plugins/pbr/skills/test/SKILL.md +254 -0
- package/plugins/pbr/skills/thread/SKILL.md +73 -0
- package/plugins/pbr/skills/todo/SKILL.md +28 -72
- package/plugins/pbr/skills/ui-phase/SKILL.md +180 -0
- package/plugins/pbr/skills/ui-review/SKILL.md +206 -0
- package/plugins/pbr/skills/undo/SKILL.md +221 -0
- package/plugins/pbr/skills/validate-phase/SKILL.md +362 -0
- package/plugins/pbr/templates/CONTEXT.md.tmpl +45 -20
- package/plugins/pbr/templates/DISCOVERY.md.tmpl +29 -0
- package/plugins/pbr/templates/DISCUSSION-LOG.md.tmpl +49 -0
- package/plugins/pbr/templates/HANDOFF.json.tmpl +30 -0
- package/plugins/pbr/templates/INTEGRATION-REPORT.md.tmpl +18 -2
- package/plugins/pbr/templates/MILESTONE-AUDIT.md.tmpl +44 -0
- package/plugins/pbr/templates/PROJECT.md.tmpl +126 -0
- package/plugins/pbr/templates/REQUIREMENTS.md.tmpl +96 -0
- package/plugins/pbr/templates/RETROSPECTIVE.md.tmpl +43 -0
- package/plugins/pbr/templates/ROADMAP.md.tmpl +108 -14
- package/plugins/pbr/templates/SUMMARY-complex.md.tmpl +133 -0
- package/plugins/pbr/templates/SUMMARY-minimal.md.tmpl +55 -0
- package/plugins/pbr/templates/SUMMARY.md.tmpl +21 -0
- package/plugins/pbr/templates/UAT.md.tmpl +94 -0
- package/plugins/pbr/templates/UI-SPEC.md.tmpl +144 -0
- package/plugins/pbr/templates/VALIDATION.md.tmpl +94 -0
- package/plugins/pbr/templates/VERIFICATION-DETAIL.md.tmpl +49 -13
- package/plugins/pbr/templates/project-CONTEXT.md.tmpl +59 -0
- package/plugins/pbr/templates/research-outputs/ARCHITECTURE.md.tmpl +91 -0
- package/plugins/pbr/templates/research-outputs/FEATURES.md.tmpl +64 -0
- package/plugins/pbr/templates/research-outputs/PITFALLS.md.tmpl +50 -0
- package/plugins/pbr/templates/research-outputs/STACK.md.tmpl +63 -0
- package/plugins/pbr/templates/research-outputs/SUMMARY.md.tmpl +98 -0
- package/scripts/build-hooks.js +61 -0
- package/scripts/check-ci.js +100 -0
- package/scripts/clean-changelog.js +364 -0
- package/scripts/generate-derivatives.js +581 -0
- package/scripts/posttest.js +93 -0
- package/scripts/release.js +262 -0
- package/scripts/run-tests.cjs +29 -0
- package/scripts/test-wrapper.js +43 -0
- package/dashboard/bin/cli.js +0 -25
- package/dashboard/public/css/layout.css +0 -704
- package/dashboard/public/css/status-colors.css +0 -98
- package/dashboard/public/css/tokens.css +0 -59
- package/dashboard/public/js/htmx-title.js +0 -5
- package/dashboard/public/js/sidebar-toggle.js +0 -34
- package/dashboard/public/js/sse-client.js +0 -100
- package/dashboard/public/js/theme-toggle.js +0 -46
- package/dashboard/src/app.js +0 -91
- package/dashboard/src/middleware/current-phase.js +0 -24
- package/dashboard/src/middleware/errorHandler.js +0 -52
- package/dashboard/src/middleware/notFoundHandler.js +0 -9
- package/dashboard/src/repositories/planning.repository.js +0 -130
- package/dashboard/src/routes/events.routes.js +0 -45
- package/dashboard/src/routes/index.routes.js +0 -35
- package/dashboard/src/routes/pages.routes.js +0 -426
- package/dashboard/src/server.js +0 -42
- package/dashboard/src/services/analytics.service.js +0 -141
- package/dashboard/src/services/dashboard.service.js +0 -309
- package/dashboard/src/services/milestone.service.js +0 -222
- package/dashboard/src/services/notes.service.js +0 -50
- package/dashboard/src/services/phase.service.js +0 -232
- package/dashboard/src/services/project.service.js +0 -57
- package/dashboard/src/services/roadmap.service.js +0 -258
- package/dashboard/src/services/sse.service.js +0 -58
- package/dashboard/src/services/todo.service.js +0 -272
- package/dashboard/src/services/watcher.service.js +0 -48
- package/dashboard/src/utils/cache.js +0 -55
- package/dashboard/src/views/analytics.ejs +0 -5
- package/dashboard/src/views/coming-soon.ejs +0 -11
- package/dashboard/src/views/dependencies.ejs +0 -5
- package/dashboard/src/views/error.ejs +0 -20
- package/dashboard/src/views/index.ejs +0 -5
- package/dashboard/src/views/milestone-detail.ejs +0 -5
- package/dashboard/src/views/milestones.ejs +0 -5
- package/dashboard/src/views/notes.ejs +0 -5
- package/dashboard/src/views/partials/analytics-content.ejs +0 -90
- package/dashboard/src/views/partials/breadcrumbs.ejs +0 -14
- package/dashboard/src/views/partials/dashboard-content.ejs +0 -84
- package/dashboard/src/views/partials/dependencies-content.ejs +0 -48
- package/dashboard/src/views/partials/empty-state.ejs +0 -7
- package/dashboard/src/views/partials/footer.ejs +0 -3
- package/dashboard/src/views/partials/head.ejs +0 -30
- package/dashboard/src/views/partials/header.ejs +0 -21
- package/dashboard/src/views/partials/layout-bottom.ejs +0 -43
- package/dashboard/src/views/partials/layout-top.ejs +0 -16
- package/dashboard/src/views/partials/milestone-detail-content.ejs +0 -20
- package/dashboard/src/views/partials/milestones-content.ejs +0 -88
- package/dashboard/src/views/partials/notes-content.ejs +0 -23
- package/dashboard/src/views/partials/phase-content.ejs +0 -193
- package/dashboard/src/views/partials/phase-doc-content.ejs +0 -38
- package/dashboard/src/views/partials/phases-content.ejs +0 -124
- package/dashboard/src/views/partials/roadmap-content.ejs +0 -180
- package/dashboard/src/views/partials/sidebar.ejs +0 -99
- package/dashboard/src/views/partials/todo-create-content.ejs +0 -54
- package/dashboard/src/views/partials/todo-detail-content.ejs +0 -42
- package/dashboard/src/views/partials/todos-content.ejs +0 -97
- package/dashboard/src/views/phase-detail.ejs +0 -5
- package/dashboard/src/views/phase-doc.ejs +0 -5
- package/dashboard/src/views/phases.ejs +0 -5
- package/dashboard/src/views/roadmap.ejs +0 -5
- package/dashboard/src/views/todo-create.ejs +0 -5
- package/dashboard/src/views/todo-detail.ejs +0 -5
- package/dashboard/src/views/todos.ejs +0 -5
- package/plugins/copilot-pbr/CHANGELOG.md +0 -19
- package/plugins/copilot-pbr/README.md +0 -139
- package/plugins/copilot-pbr/agents/audit.agent.md +0 -113
- package/plugins/copilot-pbr/agents/codebase-mapper.agent.md +0 -151
- package/plugins/copilot-pbr/agents/debugger.agent.md +0 -182
- package/plugins/copilot-pbr/agents/executor.agent.md +0 -267
- package/plugins/copilot-pbr/agents/general.agent.md +0 -88
- package/plugins/copilot-pbr/agents/integration-checker.agent.md +0 -119
- package/plugins/copilot-pbr/agents/plan-checker.agent.md +0 -208
- package/plugins/copilot-pbr/agents/planner.agent.md +0 -238
- package/plugins/copilot-pbr/agents/researcher.agent.md +0 -186
- package/plugins/copilot-pbr/agents/synthesizer.agent.md +0 -126
- package/plugins/copilot-pbr/agents/verifier.agent.md +0 -228
- package/plugins/copilot-pbr/hooks/hooks.json +0 -156
- package/plugins/copilot-pbr/plugin.json +0 -30
- package/plugins/copilot-pbr/references/agent-anti-patterns.md +0 -25
- package/plugins/copilot-pbr/references/agent-contracts.md +0 -297
- package/plugins/copilot-pbr/references/agent-interactions.md +0 -135
- package/plugins/copilot-pbr/references/agent-teams.md +0 -55
- package/plugins/copilot-pbr/references/checkpoints.md +0 -158
- package/plugins/copilot-pbr/references/common-bug-patterns.md +0 -14
- package/plugins/copilot-pbr/references/config-reference.md +0 -442
- package/plugins/copilot-pbr/references/continuation-format.md +0 -213
- package/plugins/copilot-pbr/references/deviation-rules.md +0 -113
- package/plugins/copilot-pbr/references/git-integration.md +0 -227
- package/plugins/copilot-pbr/references/integration-patterns.md +0 -118
- package/plugins/copilot-pbr/references/model-profiles.md +0 -100
- package/plugins/copilot-pbr/references/model-selection.md +0 -32
- package/plugins/copilot-pbr/references/pbr-rules.md +0 -195
- package/plugins/copilot-pbr/references/pbr-tools-cli.md +0 -285
- package/plugins/copilot-pbr/references/plan-authoring.md +0 -182
- package/plugins/copilot-pbr/references/plan-format.md +0 -288
- package/plugins/copilot-pbr/references/planning-config.md +0 -214
- package/plugins/copilot-pbr/references/questioning.md +0 -215
- package/plugins/copilot-pbr/references/reading-verification.md +0 -128
- package/plugins/copilot-pbr/references/stub-patterns.md +0 -161
- package/plugins/copilot-pbr/references/subagent-coordination.md +0 -120
- package/plugins/copilot-pbr/references/ui-formatting.md +0 -444
- package/plugins/copilot-pbr/references/verification-patterns.md +0 -199
- package/plugins/copilot-pbr/references/wave-execution.md +0 -96
- package/plugins/copilot-pbr/rules/pbr-workflow.mdc +0 -48
- package/plugins/copilot-pbr/setup.ps1 +0 -93
- package/plugins/copilot-pbr/setup.sh +0 -93
- package/plugins/copilot-pbr/skills/audit/SKILL.md +0 -330
- package/plugins/copilot-pbr/skills/begin/SKILL.md +0 -589
- package/plugins/copilot-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
- package/plugins/copilot-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
- package/plugins/copilot-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
- package/plugins/copilot-pbr/skills/begin/templates/config.json.tmpl +0 -64
- package/plugins/copilot-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
- package/plugins/copilot-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
- package/plugins/copilot-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
- package/plugins/copilot-pbr/skills/build/SKILL.md +0 -960
- package/plugins/copilot-pbr/skills/config/SKILL.md +0 -250
- package/plugins/copilot-pbr/skills/continue/SKILL.md +0 -159
- package/plugins/copilot-pbr/skills/dashboard/SKILL.md +0 -43
- package/plugins/copilot-pbr/skills/debug/SKILL.md +0 -508
- package/plugins/copilot-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
- package/plugins/copilot-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
- package/plugins/copilot-pbr/skills/discuss/SKILL.md +0 -353
- package/plugins/copilot-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
- package/plugins/copilot-pbr/skills/discuss/templates/decision-categories.md +0 -10
- package/plugins/copilot-pbr/skills/do/SKILL.md +0 -66
- package/plugins/copilot-pbr/skills/explore/SKILL.md +0 -373
- package/plugins/copilot-pbr/skills/health/SKILL.md +0 -283
- package/plugins/copilot-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
- package/plugins/copilot-pbr/skills/health/templates/output-format.md.tmpl +0 -64
- package/plugins/copilot-pbr/skills/help/SKILL.md +0 -170
- package/plugins/copilot-pbr/skills/import/SKILL.md +0 -502
- package/plugins/copilot-pbr/skills/milestone/SKILL.md +0 -745
- package/plugins/copilot-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
- package/plugins/copilot-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
- package/plugins/copilot-pbr/skills/note/SKILL.md +0 -213
- package/plugins/copilot-pbr/skills/pause/SKILL.md +0 -247
- package/plugins/copilot-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
- package/plugins/copilot-pbr/skills/plan/SKILL.md +0 -662
- package/plugins/copilot-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
- package/plugins/copilot-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
- package/plugins/copilot-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
- package/plugins/copilot-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
- package/plugins/copilot-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
- package/plugins/copilot-pbr/skills/quick/SKILL.md +0 -376
- package/plugins/copilot-pbr/skills/resume/SKILL.md +0 -399
- package/plugins/copilot-pbr/skills/review/SKILL.md +0 -653
- package/plugins/copilot-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
- package/plugins/copilot-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
- package/plugins/copilot-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
- package/plugins/copilot-pbr/skills/scan/SKILL.md +0 -299
- package/plugins/copilot-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
- package/plugins/copilot-pbr/skills/setup/SKILL.md +0 -296
- package/plugins/copilot-pbr/skills/shared/commit-planning-docs.md +0 -36
- package/plugins/copilot-pbr/skills/shared/config-loading.md +0 -103
- package/plugins/copilot-pbr/skills/shared/context-budget.md +0 -41
- package/plugins/copilot-pbr/skills/shared/context-loader-task.md +0 -87
- package/plugins/copilot-pbr/skills/shared/digest-select.md +0 -80
- package/plugins/copilot-pbr/skills/shared/domain-probes.md +0 -126
- package/plugins/copilot-pbr/skills/shared/error-reporting.md +0 -81
- package/plugins/copilot-pbr/skills/shared/gate-prompts.md +0 -389
- package/plugins/copilot-pbr/skills/shared/phase-argument-parsing.md +0 -46
- package/plugins/copilot-pbr/skills/shared/progress-display.md +0 -53
- package/plugins/copilot-pbr/skills/shared/revision-loop.md +0 -82
- package/plugins/copilot-pbr/skills/shared/state-loading.md +0 -63
- package/plugins/copilot-pbr/skills/shared/state-update.md +0 -162
- package/plugins/copilot-pbr/skills/shared/universal-anti-patterns.md +0 -38
- package/plugins/copilot-pbr/skills/status/SKILL.md +0 -362
- package/plugins/copilot-pbr/skills/statusline/SKILL.md +0 -149
- package/plugins/copilot-pbr/skills/todo/SKILL.md +0 -279
- package/plugins/copilot-pbr/templates/CONTEXT.md.tmpl +0 -53
- package/plugins/copilot-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
- package/plugins/copilot-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
- package/plugins/copilot-pbr/templates/ROADMAP.md.tmpl +0 -41
- package/plugins/copilot-pbr/templates/SUMMARY.md.tmpl +0 -82
- package/plugins/copilot-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
- package/plugins/copilot-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
- package/plugins/copilot-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
- package/plugins/copilot-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
- package/plugins/copilot-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
- package/plugins/copilot-pbr/templates/codebase/STACK.md.tmpl +0 -78
- package/plugins/copilot-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
- package/plugins/copilot-pbr/templates/codebase/TESTING.md.tmpl +0 -107
- package/plugins/copilot-pbr/templates/continue-here.md.tmpl +0 -74
- package/plugins/copilot-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
- package/plugins/copilot-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
- package/plugins/copilot-pbr/templates/research/STACK.md.tmpl +0 -71
- package/plugins/copilot-pbr/templates/research/SUMMARY.md.tmpl +0 -112
- package/plugins/copilot-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
- package/plugins/copilot-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
- package/plugins/copilot-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
- package/plugins/cursor-pbr/.cursor-plugin/plugin.json +0 -32
- package/plugins/cursor-pbr/CHANGELOG.md +0 -15
- package/plugins/cursor-pbr/README.md +0 -123
- package/plugins/cursor-pbr/agents/audit.md +0 -178
- package/plugins/cursor-pbr/agents/codebase-mapper.md +0 -150
- package/plugins/cursor-pbr/agents/debugger.md +0 -181
- package/plugins/cursor-pbr/agents/executor.md +0 -266
- package/plugins/cursor-pbr/agents/general.md +0 -87
- package/plugins/cursor-pbr/agents/integration-checker.md +0 -118
- package/plugins/cursor-pbr/agents/plan-checker.md +0 -207
- package/plugins/cursor-pbr/agents/planner.md +0 -237
- package/plugins/cursor-pbr/agents/researcher.md +0 -185
- package/plugins/cursor-pbr/agents/synthesizer.md +0 -125
- package/plugins/cursor-pbr/agents/verifier.md +0 -227
- package/plugins/cursor-pbr/assets/.gitkeep +0 -0
- package/plugins/cursor-pbr/assets/logo.svg +0 -21
- package/plugins/cursor-pbr/hooks/hooks.json +0 -213
- package/plugins/cursor-pbr/references/agent-anti-patterns.md +0 -25
- package/plugins/cursor-pbr/references/agent-contracts.md +0 -297
- package/plugins/cursor-pbr/references/agent-interactions.md +0 -135
- package/plugins/cursor-pbr/references/agent-teams.md +0 -55
- package/plugins/cursor-pbr/references/checkpoints.md +0 -158
- package/plugins/cursor-pbr/references/common-bug-patterns.md +0 -14
- package/plugins/cursor-pbr/references/config-reference.md +0 -442
- package/plugins/cursor-pbr/references/continuation-format.md +0 -213
- package/plugins/cursor-pbr/references/deviation-rules.md +0 -113
- package/plugins/cursor-pbr/references/git-integration.md +0 -227
- package/plugins/cursor-pbr/references/integration-patterns.md +0 -118
- package/plugins/cursor-pbr/references/model-profiles.md +0 -100
- package/plugins/cursor-pbr/references/model-selection.md +0 -32
- package/plugins/cursor-pbr/references/pbr-rules.md +0 -195
- package/plugins/cursor-pbr/references/pbr-tools-cli.md +0 -285
- package/plugins/cursor-pbr/references/plan-authoring.md +0 -182
- package/plugins/cursor-pbr/references/plan-format.md +0 -288
- package/plugins/cursor-pbr/references/planning-config.md +0 -214
- package/plugins/cursor-pbr/references/questioning.md +0 -215
- package/plugins/cursor-pbr/references/reading-verification.md +0 -128
- package/plugins/cursor-pbr/references/stub-patterns.md +0 -161
- package/plugins/cursor-pbr/references/subagent-coordination.md +0 -120
- package/plugins/cursor-pbr/references/ui-formatting.md +0 -444
- package/plugins/cursor-pbr/references/verification-patterns.md +0 -199
- package/plugins/cursor-pbr/references/wave-execution.md +0 -96
- package/plugins/cursor-pbr/rules/pbr-workflow.mdc +0 -48
- package/plugins/cursor-pbr/setup.ps1 +0 -78
- package/plugins/cursor-pbr/setup.sh +0 -83
- package/plugins/cursor-pbr/skills/audit/SKILL.md +0 -331
- package/plugins/cursor-pbr/skills/begin/SKILL.md +0 -589
- package/plugins/cursor-pbr/skills/begin/templates/PROJECT.md.tmpl +0 -34
- package/plugins/cursor-pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +0 -19
- package/plugins/cursor-pbr/skills/begin/templates/STATE.md.tmpl +0 -50
- package/plugins/cursor-pbr/skills/begin/templates/config.json.tmpl +0 -64
- package/plugins/cursor-pbr/skills/begin/templates/researcher-prompt.md.tmpl +0 -20
- package/plugins/cursor-pbr/skills/begin/templates/roadmap-prompt.md.tmpl +0 -31
- package/plugins/cursor-pbr/skills/begin/templates/synthesis-prompt.md.tmpl +0 -17
- package/plugins/cursor-pbr/skills/build/SKILL.md +0 -961
- package/plugins/cursor-pbr/skills/config/SKILL.md +0 -252
- package/plugins/cursor-pbr/skills/continue/SKILL.md +0 -159
- package/plugins/cursor-pbr/skills/dashboard/SKILL.md +0 -44
- package/plugins/cursor-pbr/skills/debug/SKILL.md +0 -512
- package/plugins/cursor-pbr/skills/debug/templates/continuation-prompt.md.tmpl +0 -17
- package/plugins/cursor-pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +0 -28
- package/plugins/cursor-pbr/skills/discuss/SKILL.md +0 -354
- package/plugins/cursor-pbr/skills/discuss/templates/CONTEXT.md.tmpl +0 -62
- package/plugins/cursor-pbr/skills/discuss/templates/decision-categories.md +0 -10
- package/plugins/cursor-pbr/skills/do/SKILL.md +0 -67
- package/plugins/cursor-pbr/skills/explore/SKILL.md +0 -376
- package/plugins/cursor-pbr/skills/health/SKILL.md +0 -283
- package/plugins/cursor-pbr/skills/health/templates/check-pattern.md.tmpl +0 -31
- package/plugins/cursor-pbr/skills/health/templates/output-format.md.tmpl +0 -64
- package/plugins/cursor-pbr/skills/help/SKILL.md +0 -170
- package/plugins/cursor-pbr/skills/import/SKILL.md +0 -505
- package/plugins/cursor-pbr/skills/milestone/SKILL.md +0 -746
- package/plugins/cursor-pbr/skills/milestone/templates/audit-report.md.tmpl +0 -49
- package/plugins/cursor-pbr/skills/milestone/templates/stats-file.md.tmpl +0 -31
- package/plugins/cursor-pbr/skills/note/SKILL.md +0 -214
- package/plugins/cursor-pbr/skills/pause/SKILL.md +0 -248
- package/plugins/cursor-pbr/skills/pause/templates/continue-here.md.tmpl +0 -72
- package/plugins/cursor-pbr/skills/plan/SKILL.md +0 -663
- package/plugins/cursor-pbr/skills/plan/templates/checker-prompt.md.tmpl +0 -22
- package/plugins/cursor-pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +0 -33
- package/plugins/cursor-pbr/skills/plan/templates/planner-prompt.md.tmpl +0 -39
- package/plugins/cursor-pbr/skills/plan/templates/researcher-prompt.md.tmpl +0 -20
- package/plugins/cursor-pbr/skills/plan/templates/revision-prompt.md.tmpl +0 -24
- package/plugins/cursor-pbr/skills/quick/SKILL.md +0 -376
- package/plugins/cursor-pbr/skills/resume/SKILL.md +0 -399
- package/plugins/cursor-pbr/skills/review/SKILL.md +0 -654
- package/plugins/cursor-pbr/skills/review/templates/debugger-prompt.md.tmpl +0 -61
- package/plugins/cursor-pbr/skills/review/templates/gap-planner-prompt.md.tmpl +0 -41
- package/plugins/cursor-pbr/skills/review/templates/verifier-prompt.md.tmpl +0 -116
- package/plugins/cursor-pbr/skills/scan/SKILL.md +0 -300
- package/plugins/cursor-pbr/skills/scan/templates/mapper-prompt.md.tmpl +0 -202
- package/plugins/cursor-pbr/skills/setup/SKILL.md +0 -296
- package/plugins/cursor-pbr/skills/shared/commit-planning-docs.md +0 -36
- package/plugins/cursor-pbr/skills/shared/config-loading.md +0 -103
- package/plugins/cursor-pbr/skills/shared/context-budget.md +0 -41
- package/plugins/cursor-pbr/skills/shared/context-loader-task.md +0 -87
- package/plugins/cursor-pbr/skills/shared/digest-select.md +0 -80
- package/plugins/cursor-pbr/skills/shared/domain-probes.md +0 -126
- package/plugins/cursor-pbr/skills/shared/error-reporting.md +0 -81
- package/plugins/cursor-pbr/skills/shared/gate-prompts.md +0 -389
- package/plugins/cursor-pbr/skills/shared/phase-argument-parsing.md +0 -46
- package/plugins/cursor-pbr/skills/shared/progress-display.md +0 -53
- package/plugins/cursor-pbr/skills/shared/revision-loop.md +0 -82
- package/plugins/cursor-pbr/skills/shared/state-loading.md +0 -63
- package/plugins/cursor-pbr/skills/shared/state-update.md +0 -162
- package/plugins/cursor-pbr/skills/shared/universal-anti-patterns.md +0 -38
- package/plugins/cursor-pbr/skills/status/SKILL.md +0 -362
- package/plugins/cursor-pbr/skills/statusline/SKILL.md +0 -150
- package/plugins/cursor-pbr/skills/todo/SKILL.md +0 -280
- package/plugins/cursor-pbr/templates/CONTEXT.md.tmpl +0 -53
- package/plugins/cursor-pbr/templates/INTEGRATION-REPORT.md.tmpl +0 -152
- package/plugins/cursor-pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -98
- package/plugins/cursor-pbr/templates/ROADMAP.md.tmpl +0 -41
- package/plugins/cursor-pbr/templates/SUMMARY.md.tmpl +0 -82
- package/plugins/cursor-pbr/templates/VERIFICATION-DETAIL.md.tmpl +0 -117
- package/plugins/cursor-pbr/templates/codebase/ARCHITECTURE.md.tmpl +0 -98
- package/plugins/cursor-pbr/templates/codebase/CONCERNS.md.tmpl +0 -93
- package/plugins/cursor-pbr/templates/codebase/CONVENTIONS.md.tmpl +0 -104
- package/plugins/cursor-pbr/templates/codebase/INTEGRATIONS.md.tmpl +0 -78
- package/plugins/cursor-pbr/templates/codebase/STACK.md.tmpl +0 -78
- package/plugins/cursor-pbr/templates/codebase/STRUCTURE.md.tmpl +0 -80
- package/plugins/cursor-pbr/templates/codebase/TESTING.md.tmpl +0 -107
- package/plugins/cursor-pbr/templates/continue-here.md.tmpl +0 -74
- package/plugins/cursor-pbr/templates/prompt-partials/phase-project-context.md.tmpl +0 -38
- package/plugins/cursor-pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
- package/plugins/cursor-pbr/templates/research/STACK.md.tmpl +0 -71
- package/plugins/cursor-pbr/templates/research/SUMMARY.md.tmpl +0 -112
- package/plugins/cursor-pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
- package/plugins/cursor-pbr/templates/research-outputs/project-research.md.tmpl +0 -99
- package/plugins/cursor-pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
- package/plugins/pbr/references/agent-interactions.md +0 -134
- package/plugins/pbr/references/pbr-rules.md +0 -194
- package/plugins/pbr/references/pbr-tools-cli.md +0 -285
- package/plugins/pbr/references/planning-config.md +0 -213
- package/plugins/pbr/references/subagent-coordination.md +0 -119
- package/plugins/pbr/references/ui-formatting.md +0 -444
- package/plugins/pbr/scripts/validate-plugin-structure.js +0 -183
- package/plugins/pbr/skills/milestone/templates/audit-report.md.tmpl +0 -48
- package/plugins/pbr/skills/shared/progress-display.md +0 -53
- package/plugins/pbr/skills/shared/state-loading.md +0 -62
- package/plugins/pbr/templates/RESEARCH-SUMMARY.md.tmpl +0 -97
- package/plugins/pbr/templates/research/ARCHITECTURE.md.tmpl +0 -124
- package/plugins/pbr/templates/research/STACK.md.tmpl +0 -71
- package/plugins/pbr/templates/research/SUMMARY.md.tmpl +0 -112
- package/plugins/pbr/templates/research-outputs/phase-research.md.tmpl +0 -81
- package/plugins/pbr/templates/research-outputs/project-research.md.tmpl +0 -99
- package/plugins/pbr/templates/research-outputs/synthesis.md.tmpl +0 -36
- /package/plugins/pbr/references/{agent-anti-patterns.md → archive/agent-anti-patterns.md} +0 -0
|
@@ -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,625 +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
|
-
* Advisory check: when active skill is "build" and an executor is being
|
|
572
|
-
* spawned, warn if .checkpoint-manifest.json is missing in the phase dir.
|
|
573
|
-
* Returns a warning string or null.
|
|
574
|
-
*/
|
|
575
|
-
/**
|
|
576
|
-
* Parse VERIFICATION.md frontmatter to extract status field.
|
|
577
|
-
* Returns the status string or 'unknown' if not parseable.
|
|
578
|
-
*/
|
|
579
|
-
function getVerificationStatus(filePath) {
|
|
580
|
-
try {
|
|
581
|
-
const content = fs.readFileSync(filePath, 'utf8');
|
|
582
|
-
const fmMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
583
|
-
if (!fmMatch) return 'unknown';
|
|
584
|
-
const statusMatch = fmMatch[1].match(/^status:\s*(\S+)/m);
|
|
585
|
-
return statusMatch ? statusMatch[1] : 'unknown';
|
|
586
|
-
} catch (_e) {
|
|
587
|
-
return 'unknown';
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
/**
|
|
592
|
-
* Advisory check: when pbr:debugger is spawned and .active-skill is 'debug',
|
|
593
|
-
* warn if .planning/debug/ directory does not exist.
|
|
594
|
-
* Returns a warning string or null.
|
|
595
|
-
*/
|
|
596
|
-
function checkDebuggerAdvisory(data) {
|
|
597
|
-
const subagentType = data.tool_input?.subagent_type || '';
|
|
598
|
-
if (subagentType !== 'pbr:debugger') return null;
|
|
599
|
-
// Only advise when spawned from the debug skill
|
|
600
|
-
const activeSkillPath = path.join(process.cwd(), '.planning', '.active-skill');
|
|
601
|
-
try {
|
|
602
|
-
const activeSkill = fs.readFileSync(activeSkillPath, 'utf8').trim();
|
|
603
|
-
if (activeSkill !== 'debug') return null;
|
|
604
|
-
} catch (_e) {
|
|
605
|
-
return null; // No .active-skill file — skip advisory
|
|
606
|
-
}
|
|
607
|
-
const debugDir = path.join(process.cwd(), '.planning', 'debug');
|
|
608
|
-
if (!fs.existsSync(debugDir)) {
|
|
609
|
-
return 'Debugger advisory: .planning/debug/ does not exist. Create it before spawning the debugger so output has a target location.';
|
|
610
|
-
}
|
|
611
|
-
return null;
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
function checkCheckpointManifest(data) {
|
|
615
|
-
const toolInput = data.tool_input || {};
|
|
616
|
-
const subagentType = toolInput.subagent_type || '';
|
|
617
|
-
|
|
618
|
-
if (subagentType !== 'pbr:executor') return null;
|
|
619
|
-
|
|
620
|
-
const cwd = process.cwd();
|
|
621
|
-
const planningDir = path.join(cwd, '.planning');
|
|
622
|
-
const activeSkillFile = path.join(planningDir, '.active-skill');
|
|
623
|
-
|
|
624
|
-
try {
|
|
625
|
-
const activeSkill = fs.readFileSync(activeSkillFile, 'utf8').trim();
|
|
626
|
-
if (activeSkill !== 'build') return null;
|
|
627
|
-
} catch (_e) {
|
|
628
|
-
return null;
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
// Find current phase dir
|
|
632
|
-
const stateFile = path.join(planningDir, 'STATE.md');
|
|
633
|
-
try {
|
|
634
|
-
const state = fs.readFileSync(stateFile, 'utf8');
|
|
635
|
-
const phaseMatch = state.match(/Phase:\s*(\d+)\s+of\s+\d+/);
|
|
636
|
-
if (!phaseMatch) return null;
|
|
637
|
-
|
|
638
|
-
const currentPhase = phaseMatch[1].padStart(2, '0');
|
|
639
|
-
const phasesDir = path.join(planningDir, 'phases');
|
|
640
|
-
if (!fs.existsSync(phasesDir)) return null;
|
|
641
|
-
|
|
642
|
-
const dirs = fs.readdirSync(phasesDir).filter(d => d.startsWith(currentPhase + '-'));
|
|
643
|
-
if (dirs.length === 0) return null;
|
|
644
|
-
|
|
645
|
-
const phaseDir = path.join(phasesDir, dirs[0]);
|
|
646
|
-
const manifestFile = path.join(phaseDir, '.checkpoint-manifest.json');
|
|
647
|
-
if (!fs.existsSync(manifestFile)) {
|
|
648
|
-
return 'Build advisory: .checkpoint-manifest.json not found in phase directory. The build skill should write this before spawning executors. To fix: Run /pbr:health to regenerate checkpoint manifest.';
|
|
649
|
-
}
|
|
650
|
-
} catch (_e) {
|
|
651
|
-
return null;
|
|
652
|
-
}
|
|
653
|
-
|
|
654
|
-
return null;
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
/**
|
|
658
|
-
* Advisory check: when any pbr:* agent is being spawned, warn if
|
|
659
|
-
* .planning/.active-skill doesn't exist. Without this file, all
|
|
660
|
-
* skill-specific enforcement is silently disabled.
|
|
661
|
-
* Returns a warning string or null.
|
|
662
|
-
*/
|
|
663
|
-
function checkActiveSkillIntegrity(data) {
|
|
664
|
-
const toolInput = data.tool_input || {};
|
|
665
|
-
const subagentType = toolInput.subagent_type || '';
|
|
666
|
-
|
|
667
|
-
if (typeof subagentType !== 'string' || !subagentType.startsWith('pbr:')) return null;
|
|
668
|
-
|
|
669
|
-
const cwd = process.cwd();
|
|
670
|
-
const planningDir = path.join(cwd, '.planning');
|
|
671
|
-
|
|
672
|
-
// Only check if .planning/ exists (PBR project)
|
|
673
|
-
if (!fs.existsSync(planningDir)) return null;
|
|
674
|
-
|
|
675
|
-
const activeSkillFile = path.join(planningDir, '.active-skill');
|
|
676
|
-
if (!fs.existsSync(activeSkillFile)) {
|
|
677
|
-
return 'Active-skill integrity: .planning/.active-skill not found. Skill-specific enforcement is disabled. The invoking skill should write this file. To fix: Wait for the current skill to finish, or delete .planning/.active-skill if stale.';
|
|
678
|
-
}
|
|
679
|
-
|
|
680
|
-
// Stale lock detection: warn if .active-skill is older than 2 hours
|
|
681
|
-
try {
|
|
682
|
-
const stat = fs.statSync(activeSkillFile);
|
|
683
|
-
const ageMs = Date.now() - stat.mtimeMs;
|
|
684
|
-
const TWO_HOURS = 2 * 60 * 60 * 1000;
|
|
685
|
-
if (ageMs > TWO_HOURS) {
|
|
686
|
-
const ageHours = Math.round(ageMs / (60 * 60 * 1000));
|
|
687
|
-
const skill = fs.readFileSync(activeSkillFile, 'utf8').trim();
|
|
688
|
-
return `Active-skill integrity: .planning/.active-skill is ${ageHours}h old (skill: "${skill}"). This may be a stale lock from a crashed session. Run /pbr:health to diagnose, or delete .planning/.active-skill if the previous session is no longer running.`;
|
|
689
|
-
}
|
|
690
|
-
} catch (_e) { /* best-effort */ }
|
|
691
|
-
|
|
692
|
-
return null;
|
|
693
|
-
}
|
|
694
|
-
|
|
695
88
|
function main() {
|
|
696
89
|
let input = '';
|
|
697
90
|
|
|
698
91
|
process.stdin.setEncoding('utf8');
|
|
699
92
|
process.stdin.on('data', (chunk) => { input += chunk; });
|
|
700
|
-
process.stdin.on('end', () => {
|
|
93
|
+
process.stdin.on('end', async () => {
|
|
701
94
|
try {
|
|
702
95
|
const data = JSON.parse(input);
|
|
703
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
|
+
|
|
704
113
|
// Blocking gate: quick executor must have PLAN.md
|
|
705
114
|
const gate = checkQuickExecutorGate(data);
|
|
706
115
|
if (gate && gate.block) {
|
|
@@ -725,6 +134,15 @@ function main() {
|
|
|
725
134
|
return;
|
|
726
135
|
}
|
|
727
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
|
+
|
|
728
146
|
// Blocking gate: review skill planner needs VERIFICATION.md
|
|
729
147
|
const reviewGate = checkReviewPlannerGate(data);
|
|
730
148
|
if (reviewGate && reviewGate.block) {
|
|
@@ -773,6 +191,18 @@ function main() {
|
|
|
773
191
|
return;
|
|
774
192
|
}
|
|
775
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
|
+
|
|
776
206
|
// Blocking gate: build dependency check
|
|
777
207
|
const buildDepGate = checkBuildDependencyGate(data);
|
|
778
208
|
if (buildDepGate && buildDepGate.block) {
|
|
@@ -785,14 +215,37 @@ function main() {
|
|
|
785
215
|
return;
|
|
786
216
|
}
|
|
787
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
|
+
|
|
788
238
|
// Advisory warnings
|
|
789
239
|
const warnings = checkTask(data);
|
|
240
|
+
if (userConfGate && userConfGate.warning) warnings.push(userConfGate.warning);
|
|
790
241
|
const manifestWarning = checkCheckpointManifest(data);
|
|
791
242
|
if (manifestWarning) warnings.push(manifestWarning);
|
|
792
243
|
const debuggerWarning = checkDebuggerAdvisory(data);
|
|
793
244
|
if (debuggerWarning) warnings.push(debuggerWarning);
|
|
794
245
|
const activeSkillWarning = checkActiveSkillIntegrity(data);
|
|
795
246
|
if (activeSkillWarning) warnings.push(activeSkillWarning);
|
|
247
|
+
if (nonPbrAgentResult) warnings.push(nonPbrAgentResult.output.additionalContext);
|
|
248
|
+
if (planValGate && planValGate.warning) warnings.push(planValGate.warning);
|
|
796
249
|
|
|
797
250
|
if (warnings.length > 0) {
|
|
798
251
|
for (const warning of warnings) {
|
|
@@ -805,11 +258,14 @@ function main() {
|
|
|
805
258
|
|
|
806
259
|
process.exit(0);
|
|
807
260
|
} catch (_e) {
|
|
808
|
-
//
|
|
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 }));
|
|
809
265
|
process.exit(0);
|
|
810
266
|
}
|
|
811
267
|
});
|
|
812
268
|
}
|
|
813
269
|
|
|
814
|
-
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 };
|
|
815
271
|
if (require.main === module || process.argv[1] === __filename) { main(); }
|