agent-bober 0.12.0 → 0.17.0
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/.claude-plugin/marketplace.json +20 -0
- package/.claude-plugin/plugin.json +2 -2
- package/CHANGELOG.md +243 -0
- package/README.md +238 -5
- package/agents/bober-architect.md +72 -0
- package/agents/bober-code-reviewer.md +238 -0
- package/agents/bober-curator.md +49 -0
- package/agents/bober-deployer.md +267 -0
- package/agents/bober-diagnoser.md +289 -0
- package/agents/bober-documenter.md +129 -0
- package/agents/bober-evaluator.md +135 -1
- package/agents/bober-generator.md +80 -3
- package/agents/bober-planner.md +47 -1
- package/agents/bober-postmortemer.md +185 -0
- package/agents/bober-researcher.md +38 -0
- package/dist/cli/commands/approve.d.ts +17 -0
- package/dist/cli/commands/approve.d.ts.map +1 -0
- package/dist/cli/commands/approve.js +64 -0
- package/dist/cli/commands/approve.js.map +1 -0
- package/dist/cli/commands/audit-show.d.ts +14 -0
- package/dist/cli/commands/audit-show.d.ts.map +1 -0
- package/dist/cli/commands/audit-show.js +85 -0
- package/dist/cli/commands/audit-show.js.map +1 -0
- package/dist/cli/commands/config.d.ts +10 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +73 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/graph.d.ts +8 -0
- package/dist/cli/commands/graph.d.ts.map +1 -0
- package/dist/cli/commands/graph.js +219 -0
- package/dist/cli/commands/graph.js.map +1 -0
- package/dist/cli/commands/impact.d.ts +19 -0
- package/dist/cli/commands/impact.d.ts.map +1 -0
- package/dist/cli/commands/impact.js +191 -0
- package/dist/cli/commands/impact.js.map +1 -0
- package/dist/cli/commands/incident.d.ts +19 -0
- package/dist/cli/commands/incident.d.ts.map +1 -0
- package/dist/cli/commands/incident.js +324 -0
- package/dist/cli/commands/incident.js.map +1 -0
- package/dist/cli/commands/init.js +40 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/list-approvals.d.ts +16 -0
- package/dist/cli/commands/list-approvals.d.ts.map +1 -0
- package/dist/cli/commands/list-approvals.js +57 -0
- package/dist/cli/commands/list-approvals.js.map +1 -0
- package/dist/cli/commands/memory.d.ts +14 -0
- package/dist/cli/commands/memory.d.ts.map +1 -0
- package/dist/cli/commands/memory.js +132 -0
- package/dist/cli/commands/memory.js.map +1 -0
- package/dist/cli/commands/onboard.d.ts +3 -0
- package/dist/cli/commands/onboard.d.ts.map +1 -0
- package/dist/cli/commands/onboard.js +190 -0
- package/dist/cli/commands/onboard.js.map +1 -0
- package/dist/cli/commands/playbook.d.ts +17 -0
- package/dist/cli/commands/playbook.d.ts.map +1 -0
- package/dist/cli/commands/playbook.js +123 -0
- package/dist/cli/commands/playbook.js.map +1 -0
- package/dist/cli/commands/postmortem.d.ts +12 -0
- package/dist/cli/commands/postmortem.d.ts.map +1 -0
- package/dist/cli/commands/postmortem.js +67 -0
- package/dist/cli/commands/postmortem.js.map +1 -0
- package/dist/cli/commands/reject.d.ts +17 -0
- package/dist/cli/commands/reject.d.ts.map +1 -0
- package/dist/cli/commands/reject.js +52 -0
- package/dist/cli/commands/reject.js.map +1 -0
- package/dist/cli/commands/rollback.d.ts +21 -0
- package/dist/cli/commands/rollback.d.ts.map +1 -0
- package/dist/cli/commands/rollback.js +90 -0
- package/dist/cli/commands/rollback.js.map +1 -0
- package/dist/cli/commands/run.d.ts +9 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +29 -0
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/telemetry.d.ts +16 -0
- package/dist/cli/commands/telemetry.d.ts.map +1 -0
- package/dist/cli/commands/telemetry.js +152 -0
- package/dist/cli/commands/telemetry.js.map +1 -0
- package/dist/cli/commands/worktree.d.ts +12 -0
- package/dist/cli/commands/worktree.d.ts.map +1 -0
- package/dist/cli/commands/worktree.js +57 -0
- package/dist/cli/commands/worktree.js.map +1 -0
- package/dist/cli/index.js +56 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +41 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +25 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/config/role-providers.d.ts +29 -0
- package/dist/config/role-providers.d.ts.map +1 -0
- package/dist/config/role-providers.js +115 -0
- package/dist/config/role-providers.js.map +1 -0
- package/dist/config/schema.d.ts +1350 -61
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +189 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/contracts/eval-result.d.ts +112 -56
- package/dist/contracts/eval-result.d.ts.map +1 -1
- package/dist/contracts/eval-result.js +3 -0
- package/dist/contracts/eval-result.js.map +1 -1
- package/dist/contracts/sprint-contract.d.ts +30 -30
- package/dist/fleet/aggregator.d.ts +5 -0
- package/dist/fleet/aggregator.d.ts.map +1 -0
- package/dist/fleet/aggregator.js +39 -0
- package/dist/fleet/aggregator.js.map +1 -0
- package/dist/fleet/child-config.d.ts +12 -0
- package/dist/fleet/child-config.d.ts.map +1 -0
- package/dist/fleet/child-config.js +38 -0
- package/dist/fleet/child-config.js.map +1 -0
- package/dist/fleet/coordinator.d.ts +25 -0
- package/dist/fleet/coordinator.d.ts.map +1 -0
- package/dist/fleet/coordinator.js +40 -0
- package/dist/fleet/coordinator.js.map +1 -0
- package/dist/fleet/index.d.ts +40 -0
- package/dist/fleet/index.d.ts.map +1 -0
- package/dist/fleet/index.js +117 -0
- package/dist/fleet/index.js.map +1 -0
- package/dist/fleet/manifest.d.ts +51 -0
- package/dist/fleet/manifest.d.ts.map +1 -0
- package/dist/fleet/manifest.js +32 -0
- package/dist/fleet/manifest.js.map +1 -0
- package/dist/fleet/reporter.d.ts +32 -0
- package/dist/fleet/reporter.d.ts.map +1 -0
- package/dist/fleet/reporter.js +71 -0
- package/dist/fleet/reporter.js.map +1 -0
- package/dist/fleet/runner.d.ts +48 -0
- package/dist/fleet/runner.d.ts.map +1 -0
- package/dist/fleet/runner.js +104 -0
- package/dist/fleet/runner.js.map +1 -0
- package/dist/fleet/scaffolder.d.ts +12 -0
- package/dist/fleet/scaffolder.d.ts.map +1 -0
- package/dist/fleet/scaffolder.js +82 -0
- package/dist/fleet/scaffolder.js.map +1 -0
- package/dist/fleet/types.d.ts +21 -0
- package/dist/fleet/types.d.ts.map +1 -0
- package/dist/fleet/types.js +2 -0
- package/dist/fleet/types.js.map +1 -0
- package/dist/graph/artifact-store.d.ts +14 -0
- package/dist/graph/artifact-store.d.ts.map +1 -0
- package/dist/graph/artifact-store.js +100 -0
- package/dist/graph/artifact-store.js.map +1 -0
- package/dist/graph/cli.d.ts +53 -0
- package/dist/graph/cli.d.ts.map +1 -0
- package/dist/graph/cli.js +181 -0
- package/dist/graph/cli.js.map +1 -0
- package/dist/graph/client.d.ts +64 -0
- package/dist/graph/client.d.ts.map +1 -0
- package/dist/graph/client.js +216 -0
- package/dist/graph/client.js.map +1 -0
- package/dist/graph/fallback.d.ts +13 -0
- package/dist/graph/fallback.d.ts.map +1 -0
- package/dist/graph/fallback.js +57 -0
- package/dist/graph/fallback.js.map +1 -0
- package/dist/graph/hook-handler.d.ts +50 -0
- package/dist/graph/hook-handler.d.ts.map +1 -0
- package/dist/graph/hook-handler.js +217 -0
- package/dist/graph/hook-handler.js.map +1 -0
- package/dist/graph/incidents.d.ts +59 -0
- package/dist/graph/incidents.d.ts.map +1 -0
- package/dist/graph/incidents.js +22 -0
- package/dist/graph/incidents.js.map +1 -0
- package/dist/graph/mcp-client.d.ts +51 -0
- package/dist/graph/mcp-client.d.ts.map +1 -0
- package/dist/graph/mcp-client.js +285 -0
- package/dist/graph/mcp-client.js.map +1 -0
- package/dist/graph/onboarding-composer.d.ts +30 -0
- package/dist/graph/onboarding-composer.d.ts.map +1 -0
- package/dist/graph/onboarding-composer.js +275 -0
- package/dist/graph/onboarding-composer.js.map +1 -0
- package/dist/graph/pipeline-lifecycle.d.ts +95 -0
- package/dist/graph/pipeline-lifecycle.d.ts.map +1 -0
- package/dist/graph/pipeline-lifecycle.js +341 -0
- package/dist/graph/pipeline-lifecycle.js.map +1 -0
- package/dist/graph/preflight-budgets.d.ts +52 -0
- package/dist/graph/preflight-budgets.d.ts.map +1 -0
- package/dist/graph/preflight-budgets.js +78 -0
- package/dist/graph/preflight-budgets.js.map +1 -0
- package/dist/graph/preflight-injector.d.ts +130 -0
- package/dist/graph/preflight-injector.d.ts.map +1 -0
- package/dist/graph/preflight-injector.js +618 -0
- package/dist/graph/preflight-injector.js.map +1 -0
- package/dist/graph/prereq.d.ts +12 -0
- package/dist/graph/prereq.d.ts.map +1 -0
- package/dist/graph/prereq.js +61 -0
- package/dist/graph/prereq.js.map +1 -0
- package/dist/graph/prompts.d.ts +42 -0
- package/dist/graph/prompts.d.ts.map +1 -0
- package/dist/graph/prompts.js +80 -0
- package/dist/graph/prompts.js.map +1 -0
- package/dist/graph/sandbox.d.ts +19 -0
- package/dist/graph/sandbox.d.ts.map +1 -0
- package/dist/graph/sandbox.js +25 -0
- package/dist/graph/sandbox.js.map +1 -0
- package/dist/graph/token-usage.d.ts +21 -0
- package/dist/graph/token-usage.d.ts.map +1 -0
- package/dist/graph/token-usage.js +22 -0
- package/dist/graph/token-usage.js.map +1 -0
- package/dist/graph/types.d.ts +129 -0
- package/dist/graph/types.d.ts.map +1 -0
- package/dist/graph/types.js +12 -0
- package/dist/graph/types.js.map +1 -0
- package/dist/incident/orchestrator.d.ts +168 -0
- package/dist/incident/orchestrator.d.ts.map +1 -0
- package/dist/incident/orchestrator.js +279 -0
- package/dist/incident/orchestrator.js.map +1 -0
- package/dist/incident/playbook-search.d.ts +67 -0
- package/dist/incident/playbook-search.d.ts.map +1 -0
- package/dist/incident/playbook-search.js +288 -0
- package/dist/incident/playbook-search.js.map +1 -0
- package/dist/incident/postmortem.d.ts +44 -0
- package/dist/incident/postmortem.d.ts.map +1 -0
- package/dist/incident/postmortem.js +486 -0
- package/dist/incident/postmortem.js.map +1 -0
- package/dist/incident/resolution-verify.d.ts +186 -0
- package/dist/incident/resolution-verify.d.ts.map +1 -0
- package/dist/incident/resolution-verify.js +210 -0
- package/dist/incident/resolution-verify.js.map +1 -0
- package/dist/incident/rollback.d.ts +137 -0
- package/dist/incident/rollback.d.ts.map +1 -0
- package/dist/incident/rollback.js +328 -0
- package/dist/incident/rollback.js.map +1 -0
- package/dist/incident/timeline.d.ts +147 -0
- package/dist/incident/timeline.d.ts.map +1 -0
- package/dist/incident/timeline.js +452 -0
- package/dist/incident/timeline.js.map +1 -0
- package/dist/incident/types.d.ts +335 -0
- package/dist/incident/types.d.ts.map +1 -0
- package/dist/incident/types.js +158 -0
- package/dist/incident/types.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/event-stream.d.ts +46 -0
- package/dist/mcp/event-stream.d.ts.map +1 -0
- package/dist/mcp/event-stream.js +421 -0
- package/dist/mcp/event-stream.js.map +1 -0
- package/dist/mcp/external-client.d.ts +38 -0
- package/dist/mcp/external-client.d.ts.map +1 -0
- package/dist/mcp/external-client.js +121 -0
- package/dist/mcp/external-client.js.map +1 -0
- package/dist/mcp/run-manager.d.ts +74 -9
- package/dist/mcp/run-manager.d.ts.map +1 -1
- package/dist/mcp/run-manager.js +127 -31
- package/dist/mcp/run-manager.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +56 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/abort-run.d.ts +2 -0
- package/dist/mcp/tools/abort-run.d.ts.map +1 -0
- package/dist/mcp/tools/abort-run.js +62 -0
- package/dist/mcp/tools/abort-run.js.map +1 -0
- package/dist/mcp/tools/anchor.js +1 -1
- package/dist/mcp/tools/anchor.js.map +1 -1
- package/dist/mcp/tools/approve-checkpoint.d.ts +2 -0
- package/dist/mcp/tools/approve-checkpoint.d.ts.map +1 -0
- package/dist/mcp/tools/approve-checkpoint.js +70 -0
- package/dist/mcp/tools/approve-checkpoint.js.map +1 -0
- package/dist/mcp/tools/brownfield.js +1 -1
- package/dist/mcp/tools/brownfield.js.map +1 -1
- package/dist/mcp/tools/get-project-state.d.ts +2 -0
- package/dist/mcp/tools/get-project-state.d.ts.map +1 -0
- package/dist/mcp/tools/get-project-state.js +107 -0
- package/dist/mcp/tools/get-project-state.js.map +1 -0
- package/dist/mcp/tools/get-run-status.d.ts +2 -0
- package/dist/mcp/tools/get-run-status.d.ts.map +1 -0
- package/dist/mcp/tools/get-run-status.js +40 -0
- package/dist/mcp/tools/get-run-status.js.map +1 -0
- package/dist/mcp/tools/graph-schemas.d.ts +100 -0
- package/dist/mcp/tools/graph-schemas.d.ts.map +1 -0
- package/dist/mcp/tools/graph-schemas.js +39 -0
- package/dist/mcp/tools/graph-schemas.js.map +1 -0
- package/dist/mcp/tools/graph.d.ts +19 -0
- package/dist/mcp/tools/graph.d.ts.map +1 -0
- package/dist/mcp/tools/graph.js +263 -0
- package/dist/mcp/tools/graph.js.map +1 -0
- package/dist/mcp/tools/incident.d.ts +2 -0
- package/dist/mcp/tools/incident.d.ts.map +1 -0
- package/dist/mcp/tools/incident.js +246 -0
- package/dist/mcp/tools/incident.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +38 -18
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +74 -18
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/init.d.ts.map +1 -1
- package/dist/mcp/tools/init.js +2 -0
- package/dist/mcp/tools/init.js.map +1 -1
- package/dist/mcp/tools/list-active-runs.d.ts +2 -0
- package/dist/mcp/tools/list-active-runs.d.ts.map +1 -0
- package/dist/mcp/tools/list-active-runs.js +35 -0
- package/dist/mcp/tools/list-active-runs.js.map +1 -0
- package/dist/mcp/tools/list-pending-approvals.d.ts +2 -0
- package/dist/mcp/tools/list-pending-approvals.d.ts.map +1 -0
- package/dist/mcp/tools/list-pending-approvals.js +40 -0
- package/dist/mcp/tools/list-pending-approvals.js.map +1 -0
- package/dist/mcp/tools/list-projects.d.ts +2 -0
- package/dist/mcp/tools/list-projects.d.ts.map +1 -0
- package/dist/mcp/tools/list-projects.js +101 -0
- package/dist/mcp/tools/list-projects.js.map +1 -0
- package/dist/mcp/tools/list-specs.d.ts +2 -0
- package/dist/mcp/tools/list-specs.d.ts.map +1 -0
- package/dist/mcp/tools/list-specs.js +48 -0
- package/dist/mcp/tools/list-specs.js.map +1 -0
- package/dist/mcp/tools/playbook.d.ts +2 -0
- package/dist/mcp/tools/playbook.d.ts.map +1 -0
- package/dist/mcp/tools/playbook.js +104 -0
- package/dist/mcp/tools/playbook.js.map +1 -0
- package/dist/mcp/tools/postmortem.d.ts +2 -0
- package/dist/mcp/tools/postmortem.d.ts.map +1 -0
- package/dist/mcp/tools/postmortem.js +75 -0
- package/dist/mcp/tools/postmortem.js.map +1 -0
- package/dist/mcp/tools/react.js +1 -1
- package/dist/mcp/tools/react.js.map +1 -1
- package/dist/mcp/tools/reject-checkpoint.d.ts +2 -0
- package/dist/mcp/tools/reject-checkpoint.d.ts.map +1 -0
- package/dist/mcp/tools/reject-checkpoint.js +79 -0
- package/dist/mcp/tools/reject-checkpoint.js.map +1 -0
- package/dist/mcp/tools/rollback.d.ts +2 -0
- package/dist/mcp/tools/rollback.d.ts.map +1 -0
- package/dist/mcp/tools/rollback.js +78 -0
- package/dist/mcp/tools/rollback.js.map +1 -0
- package/dist/mcp/tools/run-in-worktree.d.ts +2 -0
- package/dist/mcp/tools/run-in-worktree.d.ts.map +1 -0
- package/dist/mcp/tools/run-in-worktree.js +90 -0
- package/dist/mcp/tools/run-in-worktree.js.map +1 -0
- package/dist/mcp/tools/run.js +1 -1
- package/dist/mcp/tools/run.js.map +1 -1
- package/dist/mcp/tools/solidity.js +1 -1
- package/dist/mcp/tools/solidity.js.map +1 -1
- package/dist/mcp/tools/status.d.ts.map +1 -1
- package/dist/mcp/tools/status.js +11 -0
- package/dist/mcp/tools/status.js.map +1 -1
- package/dist/mcp/tools/subscribe-events.d.ts +2 -0
- package/dist/mcp/tools/subscribe-events.d.ts.map +1 -0
- package/dist/mcp/tools/subscribe-events.js +48 -0
- package/dist/mcp/tools/subscribe-events.js.map +1 -0
- package/dist/mcp/tools/unsubscribe-events.d.ts +2 -0
- package/dist/mcp/tools/unsubscribe-events.d.ts.map +1 -0
- package/dist/mcp/tools/unsubscribe-events.js +45 -0
- package/dist/mcp/tools/unsubscribe-events.js.map +1 -0
- package/dist/orchestrator/agent-loader.d.ts +16 -0
- package/dist/orchestrator/agent-loader.d.ts.map +1 -1
- package/dist/orchestrator/agent-loader.js +30 -0
- package/dist/orchestrator/agent-loader.js.map +1 -1
- package/dist/orchestrator/agentic-loop.d.ts +51 -0
- package/dist/orchestrator/agentic-loop.d.ts.map +1 -1
- package/dist/orchestrator/agentic-loop.js +123 -4
- package/dist/orchestrator/agentic-loop.js.map +1 -1
- package/dist/orchestrator/arch-lenses.d.ts +7 -0
- package/dist/orchestrator/arch-lenses.d.ts.map +1 -0
- package/dist/orchestrator/arch-lenses.js +22 -0
- package/dist/orchestrator/arch-lenses.js.map +1 -0
- package/dist/orchestrator/architect-agent.d.ts +16 -0
- package/dist/orchestrator/architect-agent.d.ts.map +1 -1
- package/dist/orchestrator/architect-agent.js +546 -9
- package/dist/orchestrator/architect-agent.js.map +1 -1
- package/dist/orchestrator/checkpoints/audit.d.ts +128 -0
- package/dist/orchestrator/checkpoints/audit.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/audit.js +272 -0
- package/dist/orchestrator/checkpoints/audit.js.map +1 -0
- package/dist/orchestrator/checkpoints/feedback-router.d.ts +213 -0
- package/dist/orchestrator/checkpoints/feedback-router.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/feedback-router.js +438 -0
- package/dist/orchestrator/checkpoints/feedback-router.js.map +1 -0
- package/dist/orchestrator/checkpoints/index.d.ts +11 -0
- package/dist/orchestrator/checkpoints/index.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/index.js +12 -0
- package/dist/orchestrator/checkpoints/index.js.map +1 -0
- package/dist/orchestrator/checkpoints/mechanisms/cli.d.ts +35 -0
- package/dist/orchestrator/checkpoints/mechanisms/cli.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/mechanisms/cli.js +153 -0
- package/dist/orchestrator/checkpoints/mechanisms/cli.js.map +1 -0
- package/dist/orchestrator/checkpoints/mechanisms/disk.d.ts +34 -0
- package/dist/orchestrator/checkpoints/mechanisms/disk.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/mechanisms/disk.js +139 -0
- package/dist/orchestrator/checkpoints/mechanisms/disk.js.map +1 -0
- package/dist/orchestrator/checkpoints/mechanisms/pr.d.ts +141 -0
- package/dist/orchestrator/checkpoints/mechanisms/pr.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/mechanisms/pr.js +445 -0
- package/dist/orchestrator/checkpoints/mechanisms/pr.js.map +1 -0
- package/dist/orchestrator/checkpoints/noop.d.ts +12 -0
- package/dist/orchestrator/checkpoints/noop.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/noop.js +13 -0
- package/dist/orchestrator/checkpoints/noop.js.map +1 -0
- package/dist/orchestrator/checkpoints/registry.d.ts +48 -0
- package/dist/orchestrator/checkpoints/registry.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/registry.js +89 -0
- package/dist/orchestrator/checkpoints/registry.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/_util.d.ts +50 -0
- package/dist/orchestrator/checkpoints/renderers/_util.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/_util.js +137 -0
- package/dist/orchestrator/checkpoints/renderers/_util.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/code-review.d.ts +15 -0
- package/dist/orchestrator/checkpoints/renderers/code-review.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/code-review.js +66 -0
- package/dist/orchestrator/checkpoints/renderers/code-review.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/curator-briefing.d.ts +15 -0
- package/dist/orchestrator/checkpoints/renderers/curator-briefing.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/curator-briefing.js +40 -0
- package/dist/orchestrator/checkpoints/renderers/curator-briefing.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/eval-result.d.ts +15 -0
- package/dist/orchestrator/checkpoints/renderers/eval-result.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/eval-result.js +54 -0
- package/dist/orchestrator/checkpoints/renderers/eval-result.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/generator-diff.d.ts +49 -0
- package/dist/orchestrator/checkpoints/renderers/generator-diff.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/generator-diff.js +154 -0
- package/dist/orchestrator/checkpoints/renderers/generator-diff.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/pipeline-summary.d.ts +15 -0
- package/dist/orchestrator/checkpoints/renderers/pipeline-summary.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/pipeline-summary.js +59 -0
- package/dist/orchestrator/checkpoints/renderers/pipeline-summary.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/plan.d.ts +15 -0
- package/dist/orchestrator/checkpoints/renderers/plan.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/plan.js +34 -0
- package/dist/orchestrator/checkpoints/renderers/plan.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/registry.d.ts +43 -0
- package/dist/orchestrator/checkpoints/renderers/registry.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/registry.js +83 -0
- package/dist/orchestrator/checkpoints/renderers/registry.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/research.d.ts +15 -0
- package/dist/orchestrator/checkpoints/renderers/research.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/research.js +39 -0
- package/dist/orchestrator/checkpoints/renderers/research.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/sprint-contract.d.ts +20 -0
- package/dist/orchestrator/checkpoints/renderers/sprint-contract.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/sprint-contract.js +57 -0
- package/dist/orchestrator/checkpoints/renderers/sprint-contract.js.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/sprint-summary.d.ts +15 -0
- package/dist/orchestrator/checkpoints/renderers/sprint-summary.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/renderers/sprint-summary.js +38 -0
- package/dist/orchestrator/checkpoints/renderers/sprint-summary.js.map +1 -0
- package/dist/orchestrator/checkpoints/sites.d.ts +22 -0
- package/dist/orchestrator/checkpoints/sites.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/sites.js +57 -0
- package/dist/orchestrator/checkpoints/sites.js.map +1 -0
- package/dist/orchestrator/checkpoints/types.d.ts +51 -0
- package/dist/orchestrator/checkpoints/types.d.ts.map +1 -0
- package/dist/orchestrator/checkpoints/types.js +9 -0
- package/dist/orchestrator/checkpoints/types.js.map +1 -0
- package/dist/orchestrator/code-reviewer-agent.d.ts +50 -0
- package/dist/orchestrator/code-reviewer-agent.d.ts.map +1 -0
- package/dist/orchestrator/code-reviewer-agent.js +283 -0
- package/dist/orchestrator/code-reviewer-agent.js.map +1 -0
- package/dist/orchestrator/curator-agent.d.ts.map +1 -1
- package/dist/orchestrator/curator-agent.js +60 -9
- package/dist/orchestrator/curator-agent.js.map +1 -1
- package/dist/orchestrator/deploy/classify.d.ts +31 -0
- package/dist/orchestrator/deploy/classify.d.ts.map +1 -0
- package/dist/orchestrator/deploy/classify.js +109 -0
- package/dist/orchestrator/deploy/classify.js.map +1 -0
- package/dist/orchestrator/deploy/execute.d.ts +45 -0
- package/dist/orchestrator/deploy/execute.d.ts.map +1 -0
- package/dist/orchestrator/deploy/execute.js +146 -0
- package/dist/orchestrator/deploy/execute.js.map +1 -0
- package/dist/orchestrator/deploy/executor.d.ts +22 -0
- package/dist/orchestrator/deploy/executor.d.ts.map +1 -0
- package/dist/orchestrator/deploy/executor.js +31 -0
- package/dist/orchestrator/deploy/executor.js.map +1 -0
- package/dist/orchestrator/deploy/index.d.ts +21 -0
- package/dist/orchestrator/deploy/index.d.ts.map +1 -0
- package/dist/orchestrator/deploy/index.js +21 -0
- package/dist/orchestrator/deploy/index.js.map +1 -0
- package/dist/orchestrator/deploy/resolve.d.ts +51 -0
- package/dist/orchestrator/deploy/resolve.d.ts.map +1 -0
- package/dist/orchestrator/deploy/resolve.js +53 -0
- package/dist/orchestrator/deploy/resolve.js.map +1 -0
- package/dist/orchestrator/deploy/spawn.d.ts +60 -0
- package/dist/orchestrator/deploy/spawn.d.ts.map +1 -0
- package/dist/orchestrator/deploy/spawn.js +62 -0
- package/dist/orchestrator/deploy/spawn.js.map +1 -0
- package/dist/orchestrator/deploy/types.d.ts +98 -0
- package/dist/orchestrator/deploy/types.d.ts.map +1 -0
- package/dist/orchestrator/deploy/types.js +39 -0
- package/dist/orchestrator/deploy/types.js.map +1 -0
- package/dist/orchestrator/documenter-agent.d.ts +57 -0
- package/dist/orchestrator/documenter-agent.d.ts.map +1 -0
- package/dist/orchestrator/documenter-agent.js +195 -0
- package/dist/orchestrator/documenter-agent.js.map +1 -0
- package/dist/orchestrator/environment.d.ts +45 -0
- package/dist/orchestrator/environment.d.ts.map +1 -0
- package/dist/orchestrator/environment.js +151 -0
- package/dist/orchestrator/environment.js.map +1 -0
- package/dist/orchestrator/eval-lenses.d.ts +7 -0
- package/dist/orchestrator/eval-lenses.d.ts.map +1 -0
- package/dist/orchestrator/eval-lenses.js +19 -0
- package/dist/orchestrator/eval-lenses.js.map +1 -0
- package/dist/orchestrator/eval-persist.d.ts +25 -0
- package/dist/orchestrator/eval-persist.d.ts.map +1 -0
- package/dist/orchestrator/eval-persist.js +74 -0
- package/dist/orchestrator/eval-persist.js.map +1 -0
- package/dist/orchestrator/evaluator-agent.d.ts +23 -0
- package/dist/orchestrator/evaluator-agent.d.ts.map +1 -1
- package/dist/orchestrator/evaluator-agent.js +80 -10
- package/dist/orchestrator/evaluator-agent.js.map +1 -1
- package/dist/orchestrator/generator-agent.d.ts.map +1 -1
- package/dist/orchestrator/generator-agent.js +53 -8
- package/dist/orchestrator/generator-agent.js.map +1 -1
- package/dist/orchestrator/memory/distill.d.ts +60 -0
- package/dist/orchestrator/memory/distill.d.ts.map +1 -0
- package/dist/orchestrator/memory/distill.js +177 -0
- package/dist/orchestrator/memory/distill.js.map +1 -0
- package/dist/orchestrator/memory/eval-source.d.ts +20 -0
- package/dist/orchestrator/memory/eval-source.d.ts.map +1 -0
- package/dist/orchestrator/memory/eval-source.js +88 -0
- package/dist/orchestrator/memory/eval-source.js.map +1 -0
- package/dist/orchestrator/memory/retrieve.d.ts +45 -0
- package/dist/orchestrator/memory/retrieve.d.ts.map +1 -0
- package/dist/orchestrator/memory/retrieve.js +102 -0
- package/dist/orchestrator/memory/retrieve.js.map +1 -0
- package/dist/orchestrator/model-resolver.d.ts.map +1 -1
- package/dist/orchestrator/model-resolver.js +15 -1
- package/dist/orchestrator/model-resolver.js.map +1 -1
- package/dist/orchestrator/observability/index.d.ts +12 -0
- package/dist/orchestrator/observability/index.d.ts.map +1 -0
- package/dist/orchestrator/observability/index.js +12 -0
- package/dist/orchestrator/observability/index.js.map +1 -0
- package/dist/orchestrator/observability/merge.d.ts +73 -0
- package/dist/orchestrator/observability/merge.d.ts.map +1 -0
- package/dist/orchestrator/observability/merge.js +110 -0
- package/dist/orchestrator/observability/merge.js.map +1 -0
- package/dist/orchestrator/pipeline.d.ts +31 -0
- package/dist/orchestrator/pipeline.d.ts.map +1 -1
- package/dist/orchestrator/pipeline.js +267 -5
- package/dist/orchestrator/pipeline.js.map +1 -1
- package/dist/orchestrator/planner-agent.d.ts +22 -1
- package/dist/orchestrator/planner-agent.d.ts.map +1 -1
- package/dist/orchestrator/planner-agent.js +165 -8
- package/dist/orchestrator/planner-agent.js.map +1 -1
- package/dist/orchestrator/research-agent.d.ts.map +1 -1
- package/dist/orchestrator/research-agent.js +48 -11
- package/dist/orchestrator/research-agent.js.map +1 -1
- package/dist/orchestrator/tools/handlers.d.ts +16 -0
- package/dist/orchestrator/tools/handlers.d.ts.map +1 -1
- package/dist/orchestrator/tools/handlers.js +30 -5
- package/dist/orchestrator/tools/handlers.js.map +1 -1
- package/dist/orchestrator/tools/index.d.ts +84 -1
- package/dist/orchestrator/tools/index.d.ts.map +1 -1
- package/dist/orchestrator/tools/index.js +164 -1
- package/dist/orchestrator/tools/index.js.map +1 -1
- package/dist/orchestrator/tools/schemas.js +5 -5
- package/dist/orchestrator/tools/schemas.js.map +1 -1
- package/dist/orchestrator/workflow/args-builder.d.ts +35 -0
- package/dist/orchestrator/workflow/args-builder.d.ts.map +1 -0
- package/dist/orchestrator/workflow/args-builder.js +142 -0
- package/dist/orchestrator/workflow/args-builder.js.map +1 -0
- package/dist/orchestrator/workflow/budget.d.ts +57 -0
- package/dist/orchestrator/workflow/budget.d.ts.map +1 -0
- package/dist/orchestrator/workflow/budget.js +80 -0
- package/dist/orchestrator/workflow/budget.js.map +1 -0
- package/dist/orchestrator/workflow/conformance.d.ts +27 -0
- package/dist/orchestrator/workflow/conformance.d.ts.map +1 -0
- package/dist/orchestrator/workflow/conformance.js +111 -0
- package/dist/orchestrator/workflow/conformance.js.map +1 -0
- package/dist/orchestrator/workflow/eligibility.d.ts +8 -0
- package/dist/orchestrator/workflow/eligibility.d.ts.map +1 -0
- package/dist/orchestrator/workflow/eligibility.js +10 -0
- package/dist/orchestrator/workflow/eligibility.js.map +1 -0
- package/dist/orchestrator/workflow/engine.d.ts +10 -0
- package/dist/orchestrator/workflow/engine.d.ts.map +1 -0
- package/dist/orchestrator/workflow/engine.js +2 -0
- package/dist/orchestrator/workflow/engine.js.map +1 -0
- package/dist/orchestrator/workflow/errors.d.ts +13 -0
- package/dist/orchestrator/workflow/errors.d.ts.map +1 -0
- package/dist/orchestrator/workflow/errors.js +26 -0
- package/dist/orchestrator/workflow/errors.js.map +1 -0
- package/dist/orchestrator/workflow/flusher.d.ts +19 -0
- package/dist/orchestrator/workflow/flusher.d.ts.map +1 -0
- package/dist/orchestrator/workflow/flusher.js +81 -0
- package/dist/orchestrator/workflow/flusher.js.map +1 -0
- package/dist/orchestrator/workflow/interpreter.d.ts +48 -0
- package/dist/orchestrator/workflow/interpreter.d.ts.map +1 -0
- package/dist/orchestrator/workflow/interpreter.js +92 -0
- package/dist/orchestrator/workflow/interpreter.js.map +1 -0
- package/dist/orchestrator/workflow/pure-sprint.d.ts +65 -0
- package/dist/orchestrator/workflow/pure-sprint.d.ts.map +1 -0
- package/dist/orchestrator/workflow/pure-sprint.js +82 -0
- package/dist/orchestrator/workflow/pure-sprint.js.map +1 -0
- package/dist/orchestrator/workflow/reconciler.d.ts +15 -0
- package/dist/orchestrator/workflow/reconciler.d.ts.map +1 -0
- package/dist/orchestrator/workflow/reconciler.js +65 -0
- package/dist/orchestrator/workflow/reconciler.js.map +1 -0
- package/dist/orchestrator/workflow/resume-cursor.d.ts +10 -0
- package/dist/orchestrator/workflow/resume-cursor.d.ts.map +1 -0
- package/dist/orchestrator/workflow/resume-cursor.js +25 -0
- package/dist/orchestrator/workflow/resume-cursor.js.map +1 -0
- package/dist/orchestrator/workflow/retry.d.ts +50 -0
- package/dist/orchestrator/workflow/retry.d.ts.map +1 -0
- package/dist/orchestrator/workflow/retry.js +100 -0
- package/dist/orchestrator/workflow/retry.js.map +1 -0
- package/dist/orchestrator/workflow/scheduler.d.ts +87 -0
- package/dist/orchestrator/workflow/scheduler.d.ts.map +1 -0
- package/dist/orchestrator/workflow/scheduler.js +158 -0
- package/dist/orchestrator/workflow/scheduler.js.map +1 -0
- package/dist/orchestrator/workflow/selector.d.ts +26 -0
- package/dist/orchestrator/workflow/selector.d.ts.map +1 -0
- package/dist/orchestrator/workflow/selector.js +54 -0
- package/dist/orchestrator/workflow/selector.js.map +1 -0
- package/dist/orchestrator/workflow/synthesizer.d.ts +52 -0
- package/dist/orchestrator/workflow/synthesizer.d.ts.map +1 -0
- package/dist/orchestrator/workflow/synthesizer.js +75 -0
- package/dist/orchestrator/workflow/synthesizer.js.map +1 -0
- package/dist/orchestrator/workflow/ts-engine.d.ts +13 -0
- package/dist/orchestrator/workflow/ts-engine.d.ts.map +1 -0
- package/dist/orchestrator/workflow/ts-engine.js +14 -0
- package/dist/orchestrator/workflow/ts-engine.js.map +1 -0
- package/dist/orchestrator/workflow/types.d.ts +55 -0
- package/dist/orchestrator/workflow/types.d.ts.map +1 -0
- package/dist/orchestrator/workflow/types.js +3 -0
- package/dist/orchestrator/workflow/types.js.map +1 -0
- package/dist/orchestrator/workflow/workflow-engine.d.ts +31 -0
- package/dist/orchestrator/workflow/workflow-engine.d.ts.map +1 -0
- package/dist/orchestrator/workflow/workflow-engine.js +70 -0
- package/dist/orchestrator/workflow/workflow-engine.js.map +1 -0
- package/dist/orchestrator/worktree.d.ts +18 -0
- package/dist/orchestrator/worktree.d.ts.map +1 -0
- package/dist/orchestrator/worktree.js +129 -0
- package/dist/orchestrator/worktree.js.map +1 -0
- package/dist/providers/anthropic.d.ts +8 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +135 -11
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/claude-code.d.ts +44 -0
- package/dist/providers/claude-code.d.ts.map +1 -0
- package/dist/providers/claude-code.js +143 -0
- package/dist/providers/claude-code.js.map +1 -0
- package/dist/providers/factory.d.ts +16 -2
- package/dist/providers/factory.d.ts.map +1 -1
- package/dist/providers/factory.js +101 -14
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/google.d.ts.map +1 -1
- package/dist/providers/google.js +32 -3
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/index.d.ts +4 -2
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +3 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +28 -3
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/preflight.d.ts +22 -0
- package/dist/providers/preflight.d.ts.map +1 -0
- package/dist/providers/preflight.js +54 -0
- package/dist/providers/preflight.js.map +1 -0
- package/dist/providers/structured.d.ts +130 -0
- package/dist/providers/structured.d.ts.map +1 -0
- package/dist/providers/structured.js +205 -0
- package/dist/providers/structured.js.map +1 -0
- package/dist/providers/types.d.ts +53 -2
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/state/approval-state.d.ts +74 -0
- package/dist/state/approval-state.d.ts.map +1 -0
- package/dist/state/approval-state.js +127 -0
- package/dist/state/approval-state.js.map +1 -0
- package/dist/state/history-rotation.d.ts +17 -0
- package/dist/state/history-rotation.d.ts.map +1 -0
- package/dist/state/history-rotation.js +84 -0
- package/dist/state/history-rotation.js.map +1 -0
- package/dist/state/history.d.ts +16 -4
- package/dist/state/history.d.ts.map +1 -1
- package/dist/state/history.js +62 -20
- package/dist/state/history.js.map +1 -1
- package/dist/state/index.d.ts +4 -1
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +5 -2
- package/dist/state/index.js.map +1 -1
- package/dist/state/memory.d.ts +60 -0
- package/dist/state/memory.d.ts.map +1 -0
- package/dist/state/memory.js +242 -0
- package/dist/state/memory.js.map +1 -0
- package/dist/state/review-state.d.ts +15 -0
- package/dist/state/review-state.d.ts.map +1 -0
- package/dist/state/review-state.js +51 -0
- package/dist/state/review-state.js.map +1 -0
- package/dist/state/run-state.d.ts +39 -0
- package/dist/state/run-state.d.ts.map +1 -0
- package/dist/state/run-state.js +101 -0
- package/dist/state/run-state.js.map +1 -0
- package/dist/telemetry/emit.d.ts +41 -0
- package/dist/telemetry/emit.d.ts.map +1 -0
- package/dist/telemetry/emit.js +65 -0
- package/dist/telemetry/emit.js.map +1 -0
- package/dist/utils/git.d.ts +27 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +50 -0
- package/dist/utils/git.js.map +1 -1
- package/hooks/hooks.json +27 -1
- package/hooks/session-start +42 -0
- package/package.json +13 -6
- package/scripts/check-prereqs.sh +12 -0
- package/scripts/e2e-graph-smoke.sh +167 -0
- package/scripts/graph-hook.mjs +151 -0
- package/scripts/run-kpi-gate.mjs +245 -0
- package/scripts/spike-claude-code-provider.mjs +66 -0
- package/scripts/spike-deepseek.mjs +63 -0
- package/scripts/sync-skills.mjs +4 -1
- package/scripts/sync-targets.json +12 -0
- package/scripts/update-all.mjs +255 -0
- package/skills/bober.architect/SKILL.md +13 -0
- package/skills/bober.architect/references/arch-lens-panel.md +126 -0
- package/skills/bober.code-review/SKILL.md +186 -0
- package/skills/bober.debug/SKILL.md +300 -0
- package/skills/bober.deploy/SKILL.md +262 -0
- package/skills/bober.diagnose/SKILL.md +254 -0
- package/skills/bober.eval/SKILL.md +9 -0
- package/skills/bober.eval/references/lens-panel.md +115 -0
- package/skills/bober.graph/SKILL.md +85 -0
- package/skills/bober.impact/SKILL.md +101 -0
- package/skills/bober.incident/SKILL.md +245 -0
- package/skills/bober.onboard/SKILL.md +84 -0
- package/skills/bober.plan/SKILL.md +16 -0
- package/skills/bober.postmortem/SKILL.md +231 -0
- package/skills/bober.run/SKILL.md +23 -4
- package/skills/bober.run/references/lens-panel.md +115 -0
- package/skills/bober.runbook/SKILL.md +335 -0
- package/skills/bober.sprint/SKILL.md +44 -2
- package/skills/bober.sprint/references/lens-panel.md +115 -0
- package/skills/bober.using-bober/SKILL.md +133 -0
- package/skills/bober.verify/SKILL.md +143 -0
- package/skills/shared/arch-lens-panel.md +126 -0
- package/skills/shared/lens-panel.md +115 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// ── worktree.ts ───────────────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// runInWorktree(task, projectRoot, config, opts) creates a git worktree
|
|
4
|
+
// under <projectRoot>/<pipeline.worktreeRoot>/<runId>, kicks off the
|
|
5
|
+
// pipeline INSIDE that worktree (passing worktreePath as the new projectRoot),
|
|
6
|
+
// then cleans up per policy on success or retains on failure.
|
|
7
|
+
//
|
|
8
|
+
// Sprint 4 (cockpit-integration)
|
|
9
|
+
import { randomUUID } from "node:crypto";
|
|
10
|
+
import { join, isAbsolute } from "node:path";
|
|
11
|
+
import { readFile } from "node:fs/promises";
|
|
12
|
+
import { runPipeline } from "./pipeline.js";
|
|
13
|
+
import { runManager } from "../mcp/run-manager.js";
|
|
14
|
+
import { addWorktree, removeWorktree, isClean, getCurrentBranch } from "../utils/git.js";
|
|
15
|
+
import { logger } from "../utils/logger.js";
|
|
16
|
+
// ── Slug derivation ────────────────────────────────────────────────────
|
|
17
|
+
//
|
|
18
|
+
// Matches the generator.branchPattern '{feature-name}' substitution.
|
|
19
|
+
// Takes first 60 chars of the task, lowercases, replaces non-alphanumeric
|
|
20
|
+
// runs with '-', strips leading/trailing dashes.
|
|
21
|
+
// If the resulting slug is empty (e.g. all-emoji task), falls back to a
|
|
22
|
+
// short prefix so branch names are always valid.
|
|
23
|
+
export function deriveWorktreeSlug(task) {
|
|
24
|
+
const slug = task
|
|
25
|
+
.slice(0, 60)
|
|
26
|
+
.toLowerCase()
|
|
27
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
28
|
+
.replace(/^-+|-+$/g, "");
|
|
29
|
+
return slug || "run";
|
|
30
|
+
}
|
|
31
|
+
// ── .gitignore check ──────────────────────────────────────────────────
|
|
32
|
+
async function isBoberGitignored(projectRoot) {
|
|
33
|
+
try {
|
|
34
|
+
const gitignore = await readFile(join(projectRoot, ".gitignore"), "utf-8");
|
|
35
|
+
// Check if any line matches .bober or .bober/
|
|
36
|
+
return gitignore.split("\n").some((line) => {
|
|
37
|
+
const trimmed = line.trim();
|
|
38
|
+
return trimmed === ".bober" || trimmed === ".bober/" || trimmed === "/.bober" || trimmed === "/.bober/";
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// ── Main entry point ───────────────────────────────────────────────────
|
|
46
|
+
export async function runInWorktree(task, projectRoot, config, opts = {}) {
|
|
47
|
+
// 1. Dirty-tree guard
|
|
48
|
+
if (!opts.allowDirty) {
|
|
49
|
+
const { clean, dirtyFiles } = await isClean(projectRoot);
|
|
50
|
+
if (!clean) {
|
|
51
|
+
throw new Error(`Working tree has uncommitted changes:\n ${dirtyFiles.join("\n ")}\n` +
|
|
52
|
+
`Pass --allow-dirty (CLI) or allowDirty=true (MCP) to override.`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// 2. Determine baseline branch (current HEAD or 'main' fallback)
|
|
56
|
+
let baseBranch;
|
|
57
|
+
let isDetached = false;
|
|
58
|
+
try {
|
|
59
|
+
const cur = await getCurrentBranch(projectRoot);
|
|
60
|
+
if (cur === "HEAD") {
|
|
61
|
+
// Detached HEAD
|
|
62
|
+
isDetached = true;
|
|
63
|
+
baseBranch = "main";
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
baseBranch = cur;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
isDetached = true;
|
|
71
|
+
baseBranch = "main";
|
|
72
|
+
}
|
|
73
|
+
if (isDetached) {
|
|
74
|
+
process.stderr.write(`[runInWorktree] Detached HEAD detected — falling back to baseline 'main'.\n`);
|
|
75
|
+
}
|
|
76
|
+
// Warn if .bober/ is not gitignored (soft check, not a hard error)
|
|
77
|
+
const gitignored = await isBoberGitignored(projectRoot);
|
|
78
|
+
if (!gitignored) {
|
|
79
|
+
process.stderr.write(`[runInWorktree] Warning: .bober/ is not in .gitignore — ` +
|
|
80
|
+
`the worktree directory will appear as a tracked path. ` +
|
|
81
|
+
`Consider adding '.bober/' to .gitignore.\n`);
|
|
82
|
+
}
|
|
83
|
+
// 3. Derive runId, branch name, worktree path
|
|
84
|
+
const runId = randomUUID();
|
|
85
|
+
const slug = deriveWorktreeSlug(task);
|
|
86
|
+
const branchPattern = config.generator.branchPattern ?? "bober/{feature-name}";
|
|
87
|
+
const branch = branchPattern.replace("{feature-name}", slug);
|
|
88
|
+
const worktreeRootRel = config.pipeline.worktreeRoot ?? ".bober/worktrees";
|
|
89
|
+
const worktreeRootAbs = isAbsolute(worktreeRootRel)
|
|
90
|
+
? worktreeRootRel
|
|
91
|
+
: join(projectRoot, worktreeRootRel);
|
|
92
|
+
const worktreePath = join(worktreeRootAbs, runId);
|
|
93
|
+
// 4. Create worktree via git CLI
|
|
94
|
+
await addWorktree(projectRoot, worktreePath, branch, baseBranch);
|
|
95
|
+
// 5. Kick off pipeline INSIDE the worktree (worktreePath becomes the new projectRoot)
|
|
96
|
+
const cleanupOnSuccess = !opts.keepOnSuccess && config.pipeline.cleanupWorktreeOnSuccess !== false;
|
|
97
|
+
const pipelineFn = opts.pipelineFn ?? runPipeline;
|
|
98
|
+
// Wrap pipelineFn so we can intercept resolution and run cleanup.
|
|
99
|
+
// CRITICAL: pipelineFn is called with worktreePath as projectRoot, NOT the original.
|
|
100
|
+
const wrapped = async (t, _root, c) => {
|
|
101
|
+
try {
|
|
102
|
+
const result = await pipelineFn(t, worktreePath, c);
|
|
103
|
+
if (result.success && cleanupOnSuccess) {
|
|
104
|
+
try {
|
|
105
|
+
await removeWorktree(projectRoot, worktreePath);
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
logger.warn(`[runInWorktree] worktree cleanup failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else if (!result.success) {
|
|
112
|
+
process.stderr.write(`[runInWorktree] Pipeline failed — worktree retained for debugging: ${worktreePath}\n`);
|
|
113
|
+
}
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
// On throw, ALWAYS retain
|
|
118
|
+
process.stderr.write(`[runInWorktree] Pipeline crashed — worktree retained for debugging: ${worktreePath}\n`);
|
|
119
|
+
throw err;
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
await runManager.startRun(task, projectRoot, config, wrapped, {
|
|
123
|
+
runId,
|
|
124
|
+
worktreePath,
|
|
125
|
+
branch,
|
|
126
|
+
});
|
|
127
|
+
return { runId, branch, worktreePath };
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=worktree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../src/orchestrator/worktree.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,10 +6,17 @@ import type { LLMClient, ChatParams, ChatResponse } from "./types.js";
|
|
|
6
6
|
* converts provider-agnostic Message[] (including tool call/result variants)
|
|
7
7
|
* to Anthropic MessageParam[], and normalizes Anthropic responses to
|
|
8
8
|
* ChatResponse after each call.
|
|
9
|
+
*
|
|
10
|
+
* When promptCaching is enabled (the default), attaches ephemeral
|
|
11
|
+
* cache_control breakpoints to the system prompt and up to the last 3
|
|
12
|
+
* messages (system-and-last-3 strategy, capped at 4 breakpoints total).
|
|
9
13
|
*/
|
|
10
14
|
export declare class AnthropicAdapter implements LLMClient {
|
|
11
15
|
private readonly client;
|
|
12
|
-
|
|
16
|
+
private readonly promptCaching;
|
|
17
|
+
constructor(apiKey?: string, opts?: {
|
|
18
|
+
promptCaching?: boolean;
|
|
19
|
+
});
|
|
13
20
|
chat(params: ChatParams): Promise<ChatResponse>;
|
|
14
21
|
}
|
|
15
22
|
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,YAAY,EAKb,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,YAAY,EAKb,MAAM,YAAY,CAAC;AA6LpB;;;;;;;;;;;GAWG;AACH,qBAAa,gBAAiB,YAAW,SAAS;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;gBAE5B,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE;IAKzD,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;CA8FtD"}
|
|
@@ -51,10 +51,11 @@ function normalizeContent(content) {
|
|
|
51
51
|
/**
|
|
52
52
|
* Convert a provider-agnostic Message to an Anthropic MessageParam.
|
|
53
53
|
*
|
|
54
|
-
* Handles
|
|
54
|
+
* Handles four message variants:
|
|
55
55
|
* - TextMessage: plain string content for user or assistant
|
|
56
56
|
* - AssistantMessage: assistant turn with optional text + tool_use blocks
|
|
57
57
|
* - ToolResultMessage: user turn carrying tool_result blocks
|
|
58
|
+
* - SystemUpdateMessage: user turn carrying a mid_conv_system content block
|
|
58
59
|
*/
|
|
59
60
|
function toAnthropicMessage(message) {
|
|
60
61
|
// ToolResultMessage: user turn with tool results
|
|
@@ -85,12 +86,74 @@ function toAnthropicMessage(message) {
|
|
|
85
86
|
}
|
|
86
87
|
return { role: "assistant", content };
|
|
87
88
|
}
|
|
89
|
+
// SystemUpdateMessage: render as a mid_conv_system content block inside a user turn
|
|
90
|
+
if ("systemUpdate" in message) {
|
|
91
|
+
const block = {
|
|
92
|
+
type: "mid_conv_system",
|
|
93
|
+
content: [{ type: "text", text: message.systemUpdate }],
|
|
94
|
+
...(message.cacheTtl
|
|
95
|
+
? { cache_control: { type: "ephemeral", ttl: message.cacheTtl } }
|
|
96
|
+
: {}),
|
|
97
|
+
};
|
|
98
|
+
return { role: "user", content: [block] };
|
|
99
|
+
}
|
|
88
100
|
// TextMessage: plain string content
|
|
89
101
|
return {
|
|
90
102
|
role: message.role,
|
|
91
103
|
content: message.content,
|
|
92
104
|
};
|
|
93
105
|
}
|
|
106
|
+
// ── Prompt caching ──────────────────────────────────────────────────
|
|
107
|
+
/**
|
|
108
|
+
* Build a cached system block: wraps the plain system string in a
|
|
109
|
+
* TextBlockParam array with an ephemeral cache_control marker.
|
|
110
|
+
*/
|
|
111
|
+
function buildCachedSystem(system) {
|
|
112
|
+
return [{ type: "text", text: system, cache_control: { type: "ephemeral" } }];
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Attach ephemeral cache_control breakpoints to the final content block of
|
|
116
|
+
* up to the last 3 messages (system-and-last-3 strategy, capped at 4 total).
|
|
117
|
+
*
|
|
118
|
+
* System counts as 1 breakpoint, so at most 3 message breakpoints are added.
|
|
119
|
+
* Messages with plain-string content are converted to a one-element
|
|
120
|
+
* TextBlockParam array so the breakpoint can be attached.
|
|
121
|
+
*/
|
|
122
|
+
function attachMessageBreakpoints(msgs) {
|
|
123
|
+
const result = msgs.map((m) => ({ ...m }));
|
|
124
|
+
const maxMsgBreakpoints = 3; // 4 total - 1 for system
|
|
125
|
+
let placed = 0;
|
|
126
|
+
// Walk from the end of the array, attaching breakpoints to the last 3.
|
|
127
|
+
for (let i = result.length - 1; i >= 0 && placed < maxMsgBreakpoints; i--) {
|
|
128
|
+
const msg = result[i];
|
|
129
|
+
if (typeof msg.content === "string") {
|
|
130
|
+
// Convert plain-string content to a TextBlockParam array.
|
|
131
|
+
result[i] = {
|
|
132
|
+
...msg,
|
|
133
|
+
content: [
|
|
134
|
+
{
|
|
135
|
+
type: "text",
|
|
136
|
+
text: msg.content,
|
|
137
|
+
cache_control: { type: "ephemeral" },
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
else if (Array.isArray(msg.content) && msg.content.length > 0) {
|
|
143
|
+
// Attach to the LAST block of the existing array.
|
|
144
|
+
const blocks = msg.content.map((b) => ({ ...b }));
|
|
145
|
+
const last = blocks[blocks.length - 1];
|
|
146
|
+
last.cache_control = { type: "ephemeral" };
|
|
147
|
+
result[i] = { ...msg, content: blocks };
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
// Empty content — skip without consuming a breakpoint slot.
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
placed++;
|
|
154
|
+
}
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
94
157
|
// ── AnthropicAdapter ────────────────────────────────────────────────
|
|
95
158
|
/**
|
|
96
159
|
* LLMClient implementation that wraps the Anthropic SDK.
|
|
@@ -99,34 +162,95 @@ function toAnthropicMessage(message) {
|
|
|
99
162
|
* converts provider-agnostic Message[] (including tool call/result variants)
|
|
100
163
|
* to Anthropic MessageParam[], and normalizes Anthropic responses to
|
|
101
164
|
* ChatResponse after each call.
|
|
165
|
+
*
|
|
166
|
+
* When promptCaching is enabled (the default), attaches ephemeral
|
|
167
|
+
* cache_control breakpoints to the system prompt and up to the last 3
|
|
168
|
+
* messages (system-and-last-3 strategy, capped at 4 breakpoints total).
|
|
102
169
|
*/
|
|
103
170
|
export class AnthropicAdapter {
|
|
104
171
|
client;
|
|
105
|
-
|
|
172
|
+
promptCaching;
|
|
173
|
+
constructor(apiKey, opts) {
|
|
106
174
|
this.client = new Anthropic({ apiKey });
|
|
175
|
+
this.promptCaching = opts?.promptCaching ?? true;
|
|
107
176
|
}
|
|
108
177
|
async chat(params) {
|
|
109
|
-
const { model, system, messages, tools, maxTokens = 16384 } = params;
|
|
178
|
+
const { model, system, messages, tools, maxTokens = 16384, effort } = params;
|
|
110
179
|
// Convert provider-agnostic Message[] to Anthropic MessageParam[]
|
|
111
180
|
const anthropicMessages = messages.map(toAnthropicMessage);
|
|
112
|
-
//
|
|
113
|
-
|
|
181
|
+
// ── Structured output branch ────────────────────────────────────
|
|
182
|
+
// When responseSchema is set, force a single "structured_output" tool
|
|
183
|
+
// whose input_schema IS the schema, and do NOT forward the user's tools.
|
|
184
|
+
// tool_choice forces the model to call it, and we stringify the resulting
|
|
185
|
+
// tool input into ChatResponse.text (with empty toolCalls).
|
|
186
|
+
const structured = params.responseSchema !== undefined;
|
|
187
|
+
const forcedTool = structured
|
|
188
|
+
? {
|
|
189
|
+
name: "structured_output",
|
|
190
|
+
description: "Return your answer as a single structured JSON object matching the schema.",
|
|
191
|
+
input_schema: params.responseSchema,
|
|
192
|
+
}
|
|
193
|
+
: undefined;
|
|
194
|
+
// Convert ToolDef[] to Anthropic.Messages.Tool[]. In the structured branch
|
|
195
|
+
// the user's tools are intentionally suppressed in favour of the forced tool.
|
|
196
|
+
const anthropicTools = structured
|
|
197
|
+
? [forcedTool]
|
|
198
|
+
: tools && tools.length > 0
|
|
199
|
+
? tools.map(toAnthropicTool)
|
|
200
|
+
: undefined;
|
|
201
|
+
// ── Prompt caching branch ──────────────────────────────────────
|
|
202
|
+
// When enabled: system becomes a TextBlockParam[] with cache_control,
|
|
203
|
+
// and breakpoints are attached to the final block of up to the last 3
|
|
204
|
+
// messages (total capped at 4 across system + messages).
|
|
205
|
+
// When disabled: plain-string system and unmodified messages (C3 guard).
|
|
206
|
+
const cachedSystem = this.promptCaching && system !== undefined
|
|
207
|
+
? buildCachedSystem(system)
|
|
208
|
+
: system;
|
|
209
|
+
const cachedMessages = this.promptCaching
|
|
210
|
+
? attachMessageBreakpoints(anthropicMessages)
|
|
211
|
+
: anthropicMessages;
|
|
114
212
|
const response = await this.client.messages.create({
|
|
115
213
|
model,
|
|
116
214
|
max_tokens: maxTokens,
|
|
117
|
-
system,
|
|
118
|
-
messages:
|
|
215
|
+
system: cachedSystem,
|
|
216
|
+
messages: cachedMessages,
|
|
119
217
|
tools: anthropicTools,
|
|
218
|
+
...(effort !== undefined ? { output_config: { effort } } : {}),
|
|
219
|
+
...(structured
|
|
220
|
+
? {
|
|
221
|
+
tool_choice: {
|
|
222
|
+
type: "tool",
|
|
223
|
+
name: "structured_output",
|
|
224
|
+
},
|
|
225
|
+
}
|
|
226
|
+
: {}),
|
|
120
227
|
});
|
|
121
228
|
const { text, toolCalls } = normalizeContent(response.content);
|
|
229
|
+
const usage = {
|
|
230
|
+
inputTokens: response.usage.input_tokens,
|
|
231
|
+
outputTokens: response.usage.output_tokens,
|
|
232
|
+
};
|
|
233
|
+
// ── Structured output normalisation ─────────────────────────────
|
|
234
|
+
// Take the forced tool call's input, stringify it into text, and return
|
|
235
|
+
// empty toolCalls with a clean "end" stop reason. If the forced tool call
|
|
236
|
+
// is somehow absent, fall back to the normal normalized result so the
|
|
237
|
+
// caller's coerce/repair can still try.
|
|
238
|
+
if (structured) {
|
|
239
|
+
const forced = toolCalls.find((tc) => tc.name === "structured_output");
|
|
240
|
+
if (forced !== undefined) {
|
|
241
|
+
return {
|
|
242
|
+
text: JSON.stringify(forced.input),
|
|
243
|
+
toolCalls: [],
|
|
244
|
+
stopReason: "end",
|
|
245
|
+
usage,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
}
|
|
122
249
|
return {
|
|
123
250
|
text,
|
|
124
251
|
toolCalls,
|
|
125
252
|
stopReason: normalizeStopReason(response.stop_reason),
|
|
126
|
-
usage
|
|
127
|
-
inputTokens: response.usage.input_tokens,
|
|
128
|
-
outputTokens: response.usage.output_tokens,
|
|
129
|
-
},
|
|
253
|
+
usage,
|
|
130
254
|
};
|
|
131
255
|
}
|
|
132
256
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAY1C,uEAAuE;AAEvE;;;;;GAKG;AACH,SAAS,eAAe,CAAC,IAAa;IACpC,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,YAAY,EAAE,IAAI,CAAC,YAAuD;KAC3E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAC1B,MAAiD;IAEjD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU;YACb,OAAO,KAAK,CAAC;QACf,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;QACpB,KAAK,YAAY;YACf,OAAO,YAAY,CAAC;QACtB;YACE,OAAO,MAAM,IAAI,KAAK,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,OAA0C;IAE1C,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,MAAM,SAAS,GAAe,EAAE,CAAC;IAEjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC;QACrB,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACrC,SAAS,CAAC,IAAI,CAAC;gBACb,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,KAAK,CAAC,KAAgC;aAC9C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC7B,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code subscription provider.
|
|
3
|
+
*
|
|
4
|
+
* Backs the LLMClient interface with the local `claude` CLI in headless
|
|
5
|
+
* print mode (`claude -p --output-format json`), so model calls bill against
|
|
6
|
+
* the user's Claude Pro/Max SUBSCRIPTION credit instead of an
|
|
7
|
+
* ANTHROPIC_API_KEY. No API key is read or required by this adapter.
|
|
8
|
+
*
|
|
9
|
+
* ─────────────────────────────────────────────────────────────────────────
|
|
10
|
+
* CAPABILITY BOUNDARY:
|
|
11
|
+
*
|
|
12
|
+
* agent-bober drives its OWN agentic loop: chat() is contracted to take MY
|
|
13
|
+
* tools, return ONE model turn, stop at tool_use, and let the caller execute
|
|
14
|
+
* the tool. The `claude` CLI does the OPPOSITE — it runs ITS OWN loop with
|
|
15
|
+
* ITS OWN built-in tools (Read/Write/Bash) and never hands custom tool_use
|
|
16
|
+
* blocks back. There is no faithful single-turn-with-my-tools mode.
|
|
17
|
+
*
|
|
18
|
+
* Therefore this adapter supports ONLY the no-tools case (system + messages
|
|
19
|
+
* → text). That covers the pure prompt→text roles (planner, researcher
|
|
20
|
+
* question-gen). If `params.tools` is non-empty it THROWS rather than
|
|
21
|
+
* silently dropping the tools and corrupting the caller's loop.
|
|
22
|
+
*
|
|
23
|
+
* COST CAVEAT: `claude -p` injects Claude Code's full system prompt
|
|
24
|
+
* (~40k cache-creation tokens) on every call, and post-2026-06-15 these calls
|
|
25
|
+
* bill at standard API rates against a capped monthly subscription credit
|
|
26
|
+
* (Max 5×=$100/mo, 20×=$200/mo, no rollover). This path is NOT free-unlimited.
|
|
27
|
+
*
|
|
28
|
+
* TERMS: programmatic subscription use via `claude -p` is permitted by
|
|
29
|
+
* Anthropic as of 2026-06-15, billed from the separate Agent-SDK/CLI credit.
|
|
30
|
+
* Verify current terms before relying on it at scale.
|
|
31
|
+
* ─────────────────────────────────────────────────────────────────────────
|
|
32
|
+
*/
|
|
33
|
+
import type { LLMClient, ChatParams, ChatResponse } from "./types.js";
|
|
34
|
+
export declare class ClaudeCodeAdapter implements LLMClient {
|
|
35
|
+
private readonly binary;
|
|
36
|
+
private readonly timeoutMs;
|
|
37
|
+
/**
|
|
38
|
+
* @param binary Path/name of the claude CLI (default "claude").
|
|
39
|
+
* @param timeoutMs Per-call timeout. Default 180s (sprints make long calls).
|
|
40
|
+
*/
|
|
41
|
+
constructor(binary?: string, timeoutMs?: number);
|
|
42
|
+
chat(params: ChatParams): Promise<ChatResponse>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=claude-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/providers/claude-code.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAGH,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,YAAY,EAEb,MAAM,YAAY,CAAC;AAyDpB,qBAAa,iBAAkB,YAAW,SAAS;IAM/C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAN5B;;;OAGG;gBAEgB,MAAM,GAAE,MAAiB,EACzB,SAAS,GAAE,MAAgB;IAGxC,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;CA0EtD"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code subscription provider.
|
|
3
|
+
*
|
|
4
|
+
* Backs the LLMClient interface with the local `claude` CLI in headless
|
|
5
|
+
* print mode (`claude -p --output-format json`), so model calls bill against
|
|
6
|
+
* the user's Claude Pro/Max SUBSCRIPTION credit instead of an
|
|
7
|
+
* ANTHROPIC_API_KEY. No API key is read or required by this adapter.
|
|
8
|
+
*
|
|
9
|
+
* ─────────────────────────────────────────────────────────────────────────
|
|
10
|
+
* CAPABILITY BOUNDARY:
|
|
11
|
+
*
|
|
12
|
+
* agent-bober drives its OWN agentic loop: chat() is contracted to take MY
|
|
13
|
+
* tools, return ONE model turn, stop at tool_use, and let the caller execute
|
|
14
|
+
* the tool. The `claude` CLI does the OPPOSITE — it runs ITS OWN loop with
|
|
15
|
+
* ITS OWN built-in tools (Read/Write/Bash) and never hands custom tool_use
|
|
16
|
+
* blocks back. There is no faithful single-turn-with-my-tools mode.
|
|
17
|
+
*
|
|
18
|
+
* Therefore this adapter supports ONLY the no-tools case (system + messages
|
|
19
|
+
* → text). That covers the pure prompt→text roles (planner, researcher
|
|
20
|
+
* question-gen). If `params.tools` is non-empty it THROWS rather than
|
|
21
|
+
* silently dropping the tools and corrupting the caller's loop.
|
|
22
|
+
*
|
|
23
|
+
* COST CAVEAT: `claude -p` injects Claude Code's full system prompt
|
|
24
|
+
* (~40k cache-creation tokens) on every call, and post-2026-06-15 these calls
|
|
25
|
+
* bill at standard API rates against a capped monthly subscription credit
|
|
26
|
+
* (Max 5×=$100/mo, 20×=$200/mo, no rollover). This path is NOT free-unlimited.
|
|
27
|
+
*
|
|
28
|
+
* TERMS: programmatic subscription use via `claude -p` is permitted by
|
|
29
|
+
* Anthropic as of 2026-06-15, billed from the separate Agent-SDK/CLI credit.
|
|
30
|
+
* Verify current terms before relying on it at scale.
|
|
31
|
+
* ─────────────────────────────────────────────────────────────────────────
|
|
32
|
+
*/
|
|
33
|
+
import { execa } from "execa";
|
|
34
|
+
/** Map the CLI's stop_reason onto agent-bober's normalized StopReason. */
|
|
35
|
+
function mapStopReason(raw) {
|
|
36
|
+
switch (raw) {
|
|
37
|
+
case "end_turn":
|
|
38
|
+
return "end";
|
|
39
|
+
case "tool_use":
|
|
40
|
+
return "tool_use";
|
|
41
|
+
case "max_tokens":
|
|
42
|
+
return "max_tokens";
|
|
43
|
+
default:
|
|
44
|
+
return raw ?? "end";
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Flatten the provider-agnostic Message[] into a single prompt string for the
|
|
49
|
+
* CLI's `-p` argument. The CLI takes one prompt, not a structured transcript,
|
|
50
|
+
* so we render the conversation as labelled turns. Adequate for the no-tools
|
|
51
|
+
* roles this adapter targets; NOT a faithful multi-turn tool transcript.
|
|
52
|
+
*/
|
|
53
|
+
function flattenMessages(messages) {
|
|
54
|
+
const parts = [];
|
|
55
|
+
for (const m of messages) {
|
|
56
|
+
if ("systemUpdate" in m) {
|
|
57
|
+
parts.push(`[system update]\n${m.systemUpdate}`);
|
|
58
|
+
}
|
|
59
|
+
else if ("toolResults" in m) {
|
|
60
|
+
// No-tools adapter: tool results shouldn't occur, but render defensively.
|
|
61
|
+
for (const r of m.toolResults) {
|
|
62
|
+
parts.push(`[tool result ${r.toolUseId}]\n${r.content}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else if (m.role === "assistant") {
|
|
66
|
+
parts.push(`Assistant: ${m.content}`);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
parts.push(`User: ${m.content}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return parts.join("\n\n");
|
|
73
|
+
}
|
|
74
|
+
export class ClaudeCodeAdapter {
|
|
75
|
+
binary;
|
|
76
|
+
timeoutMs;
|
|
77
|
+
/**
|
|
78
|
+
* @param binary Path/name of the claude CLI (default "claude").
|
|
79
|
+
* @param timeoutMs Per-call timeout. Default 180s (sprints make long calls).
|
|
80
|
+
*/
|
|
81
|
+
constructor(binary = "claude", timeoutMs = 180_000) {
|
|
82
|
+
this.binary = binary;
|
|
83
|
+
this.timeoutMs = timeoutMs;
|
|
84
|
+
}
|
|
85
|
+
async chat(params) {
|
|
86
|
+
const { system, messages, tools, model } = params;
|
|
87
|
+
// Hard fail on tools — see SPIKE SCOPE. Silent drop would corrupt the
|
|
88
|
+
// caller's agentic loop (it would wait forever for tool_use that can't come).
|
|
89
|
+
if (tools && tools.length > 0) {
|
|
90
|
+
throw new Error("ClaudeCodeAdapter (spike) does not support custom tools: the `claude` " +
|
|
91
|
+
"CLI runs its own tool loop and cannot return custom tool_use blocks. " +
|
|
92
|
+
"Use this provider only for prompt→text roles (e.g. planner), or use " +
|
|
93
|
+
"the anthropic/openai-compat providers for tool-driven roles.");
|
|
94
|
+
}
|
|
95
|
+
const prompt = flattenMessages(messages);
|
|
96
|
+
const args = [
|
|
97
|
+
"-p",
|
|
98
|
+
prompt,
|
|
99
|
+
"--output-format",
|
|
100
|
+
"json",
|
|
101
|
+
// Disable Claude Code's built-in tools — we want pure completion, not its loop.
|
|
102
|
+
"--disallowed-tools",
|
|
103
|
+
"Read Edit Write Bash Glob Grep WebFetch WebSearch Task",
|
|
104
|
+
// Don't inherit the project's MCP servers (keeps the call hermetic).
|
|
105
|
+
"--strict-mcp-config",
|
|
106
|
+
];
|
|
107
|
+
if (system && system.trim().length > 0) {
|
|
108
|
+
args.push("--append-system-prompt", system);
|
|
109
|
+
}
|
|
110
|
+
if (model) {
|
|
111
|
+
args.push("--model", model);
|
|
112
|
+
}
|
|
113
|
+
const result = await execa(this.binary, args, {
|
|
114
|
+
reject: false,
|
|
115
|
+
timeout: this.timeoutMs,
|
|
116
|
+
// No stdin; everything is in args.
|
|
117
|
+
input: "",
|
|
118
|
+
});
|
|
119
|
+
if (result.exitCode !== 0) {
|
|
120
|
+
throw new Error(`claude CLI exited ${String(result.exitCode)}: ${result.stderr || result.stdout || "no output"}`);
|
|
121
|
+
}
|
|
122
|
+
let parsed;
|
|
123
|
+
try {
|
|
124
|
+
parsed = JSON.parse(result.stdout);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
throw new Error(`claude CLI returned non-JSON output: ${result.stdout.slice(0, 200)}`);
|
|
128
|
+
}
|
|
129
|
+
if (parsed.is_error) {
|
|
130
|
+
throw new Error(`claude CLI reported an error: ${parsed.result ?? parsed.subtype ?? "unknown"}`);
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
text: parsed.result ?? "",
|
|
134
|
+
toolCalls: [],
|
|
135
|
+
stopReason: mapStopReason(parsed.stop_reason),
|
|
136
|
+
usage: {
|
|
137
|
+
inputTokens: parsed.usage?.input_tokens ?? 0,
|
|
138
|
+
outputTokens: parsed.usage?.output_tokens ?? 0,
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/providers/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,16 +2,30 @@ import type { LLMClient } from "./types.js";
|
|
|
2
2
|
/**
|
|
3
3
|
* The set of provider names currently supported.
|
|
4
4
|
*/
|
|
5
|
-
export type ProviderName = "anthropic" | "openai" | "google" | "openai-compat";
|
|
5
|
+
export type ProviderName = "anthropic" | "openai" | "google" | "openai-compat" | "claude-code";
|
|
6
|
+
/**
|
|
7
|
+
* Injectable probe function for verifying the claude CLI is on PATH.
|
|
8
|
+
* Defaults to an execa-based check; override in tests to avoid real CLI calls.
|
|
9
|
+
*/
|
|
10
|
+
export type BinaryProbe = (binary: string) => Promise<boolean>;
|
|
11
|
+
/**
|
|
12
|
+
* Verify the claude CLI binary is on PATH. Throws an Error naming the binary
|
|
13
|
+
* when it is absent. Call this before using the claude-code provider.
|
|
14
|
+
*
|
|
15
|
+
* @param binary - CLI binary name/path (default "claude").
|
|
16
|
+
* @param probe - Injectable PATH-check function (default uses execa; override in tests).
|
|
17
|
+
*/
|
|
18
|
+
export declare function preflightClaudeBinary(binary?: string, probe?: BinaryProbe): Promise<void>;
|
|
6
19
|
/**
|
|
7
20
|
* Validate that the required API key environment variable is set for a given provider.
|
|
8
21
|
*
|
|
9
22
|
* @param resolvedProvider - The resolved provider name.
|
|
10
23
|
* @param role - Optional role label (e.g. "Planner", "Generator", "Evaluator") for the error message.
|
|
11
24
|
* @param apiKey - Optional explicit API key from providerConfig (skips env var check if set).
|
|
25
|
+
* @param endpoint - Optional endpoint URL used to distinguish DeepSeek from other openai-compat servers.
|
|
12
26
|
* @throws If the required environment variable is missing and no explicit apiKey was provided.
|
|
13
27
|
*/
|
|
14
|
-
export declare function validateApiKey(resolvedProvider: string, role?: string, apiKey?: string): void;
|
|
28
|
+
export declare function validateApiKey(resolvedProvider: string, role?: string, apiKey?: string, endpoint?: string): void;
|
|
15
29
|
/**
|
|
16
30
|
* Create an LLMClient for the given provider.
|
|
17
31
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/providers/factory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/providers/factory.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAA4B,MAAM,YAAY,CAAC;AAItE;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,eAAe,GAAG,aAAa,CAAC;AA6B/F;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAW/D;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,SAAW,EACjB,KAAK,GAAE,WAAgC,GACtC,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,gBAAgB,EAAE,MAAM,EACxB,IAAI,CAAC,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI,CA0DN;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,EACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,EACxB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxC,KAAK,CAAC,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,GACZ,SAAS,CAmGX"}
|