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