agent-bober 0.11.6 → 0.15.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/CHANGELOG.md +311 -0
- package/README.md +124 -9
- package/agents/bober-architect.md +38 -0
- package/agents/bober-code-reviewer.md +236 -0
- package/agents/bober-curator.md +37 -0
- package/agents/bober-deployer.md +267 -0
- package/agents/bober-diagnoser.md +289 -0
- package/agents/bober-evaluator.md +127 -1
- package/agents/bober-generator.md +122 -3
- package/agents/bober-planner.md +293 -32
- 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/eval.js +6 -6
- package/dist/cli/commands/eval.js.map +1 -1
- 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 +82 -3
- 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/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/plan.d.ts +12 -0
- package/dist/cli/commands/plan.d.ts.map +1 -1
- package/dist/cli/commands/plan.js +232 -37
- package/dist/cli/commands/plan.js.map +1 -1
- 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 +31 -2
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/sprint.d.ts.map +1 -1
- package/dist/cli/commands/sprint.js +8 -8
- package/dist/cli/commands/sprint.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 +73 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +27 -0
- 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 +18 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +1016 -96
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +147 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/contracts/eval-result.d.ts +38 -38
- package/dist/contracts/index.d.ts +2 -2
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +8 -4
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/spec.d.ts +335 -40
- package/dist/contracts/spec.d.ts.map +1 -1
- package/dist/contracts/spec.js +210 -18
- package/dist/contracts/spec.js.map +1 -1
- package/dist/contracts/sprint-contract.d.ts +155 -88
- package/dist/contracts/sprint-contract.d.ts.map +1 -1
- package/dist/contracts/sprint-contract.js +176 -29
- package/dist/contracts/sprint-contract.js.map +1 -1
- package/dist/evaluators/builtin/api-check.js +1 -1
- package/dist/evaluators/builtin/api-check.js.map +1 -1
- 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 +49 -0
- package/dist/graph/cli.d.ts.map +1 -0
- package/dist/graph/cli.js +140 -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 +86 -0
- package/dist/graph/pipeline-lifecycle.d.ts.map +1 -0
- package/dist/graph/pipeline-lifecycle.js +329 -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 +116 -0
- package/dist/graph/preflight-injector.d.ts.map +1 -0
- package/dist/graph/preflight-injector.js +538 -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 +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- 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/contracts.js +2 -2
- package/dist/mcp/tools/contracts.js.map +1 -1
- package/dist/mcp/tools/eval.js +8 -8
- package/dist/mcp/tools/eval.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/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/plan.d.ts.map +1 -1
- package/dist/mcp/tools/plan.js +40 -14
- package/dist/mcp/tools/plan.js.map +1 -1
- 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/sprint.d.ts.map +1 -1
- package/dist/mcp/tools/sprint.js +11 -11
- package/dist/mcp/tools/sprint.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 +16 -0
- package/dist/orchestrator/agent-loader.js.map +1 -1
- package/dist/orchestrator/architect-agent.d.ts.map +1 -1
- package/dist/orchestrator/architect-agent.js +37 -8
- 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/context-handoff.d.ts +484 -224
- package/dist/orchestrator/context-handoff.d.ts.map +1 -1
- package/dist/orchestrator/context-handoff.js +32 -12
- package/dist/orchestrator/context-handoff.js.map +1 -1
- package/dist/orchestrator/curator-agent.d.ts.map +1 -1
- package/dist/orchestrator/curator-agent.js +63 -12
- 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/evaluator-agent.d.ts.map +1 -1
- package/dist/orchestrator/evaluator-agent.js +23 -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 +24 -11
- package/dist/orchestrator/generator-agent.js.map +1 -1
- package/dist/orchestrator/model-resolver.d.ts.map +1 -1
- package/dist/orchestrator/model-resolver.js +4 -2
- 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 +28 -0
- package/dist/orchestrator/pipeline.d.ts.map +1 -1
- package/dist/orchestrator/pipeline.js +223 -30
- package/dist/orchestrator/pipeline.js.map +1 -1
- package/dist/orchestrator/planner-agent.d.ts +21 -1
- package/dist/orchestrator/planner-agent.d.ts.map +1 -1
- package/dist/orchestrator/planner-agent.js +16 -6
- 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 +46 -9
- package/dist/orchestrator/research-agent.js.map +1 -1
- package/dist/orchestrator/tools/handlers.d.ts +2 -0
- package/dist/orchestrator/tools/handlers.d.ts.map +1 -1
- package/dist/orchestrator/tools/handlers.js +1 -1
- 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/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 +86 -5
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/factory.d.ts.map +1 -1
- package/dist/providers/factory.js +35 -2
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/google.d.ts.map +1 -1
- package/dist/providers/google.js +5 -0
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/index.d.ts +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +4 -0
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/types.d.ts +25 -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.d.ts.map +1 -1
- package/dist/state/history.js +3 -3
- package/dist/state/history.js.map +1 -1
- package/dist/state/index.d.ts +3 -0
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +4 -1
- package/dist/state/index.js.map +1 -1
- package/dist/state/plan-state.js +1 -1
- package/dist/state/plan-state.js.map +1 -1
- 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/state/sprint-state.d.ts +9 -2
- package/dist/state/sprint-state.d.ts.map +1 -1
- package/dist/state/sprint-state.js +25 -11
- package/dist/state/sprint-state.js.map +1 -1
- 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 +17 -1
- package/hooks/session-start +42 -0
- package/package.json +6 -2
- package/scripts/check-prereqs.sh +12 -0
- package/scripts/e2e-graph-smoke.sh +167 -0
- package/scripts/graph-hook.mjs +151 -0
- package/scripts/migrate-specs.mjs +127 -0
- package/scripts/run-kpi-gate.mjs +245 -0
- package/scripts/sync-skills.mjs +99 -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.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 +51 -0
- package/skills/bober.plan/references/spec-schema.md +31 -4
- package/skills/bober.postmortem/SKILL.md +231 -0
- package/skills/bober.run/SKILL.md +41 -7
- package/skills/bober.runbook/SKILL.md +335 -0
- package/skills/bober.sprint/SKILL.md +6 -259
- package/skills/bober.using-bober/SKILL.md +133 -0
- package/skills/bober.verify/SKILL.md +143 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readFile, writeFile, readdir } from "node:fs/promises";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import { SprintContractSchema, } from "../contracts/sprint-contract.js";
|
|
3
|
+
import { SprintContractSchema, findPrecisionIssues, } from "../contracts/sprint-contract.js";
|
|
4
4
|
import { ensureDir } from "./helpers.js";
|
|
5
5
|
const CONTRACTS_DIR = ".bober/contracts";
|
|
6
6
|
function contractsDir(projectRoot) {
|
|
@@ -11,20 +11,33 @@ function contractPath(projectRoot, id) {
|
|
|
11
11
|
const safeId = id.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
12
12
|
return join(contractsDir(projectRoot), `${safeId}.json`);
|
|
13
13
|
}
|
|
14
|
+
function formatZodIssues(error) {
|
|
15
|
+
return error.issues
|
|
16
|
+
.map((i) => ` - ${i.path.join(".")}: ${i.message}`)
|
|
17
|
+
.join("\n");
|
|
18
|
+
}
|
|
14
19
|
/**
|
|
15
20
|
* Save a sprint contract to disk.
|
|
16
|
-
* Overwrites any existing contract with the same
|
|
21
|
+
* Overwrites any existing contract with the same contractId.
|
|
22
|
+
*
|
|
23
|
+
* Validates the contract against the schema and the precision quality gate.
|
|
24
|
+
* Throws on either failure — partial or vague contracts are not silently saved.
|
|
17
25
|
*/
|
|
18
26
|
export async function saveContract(projectRoot, contract) {
|
|
19
27
|
await ensureDir(contractsDir(projectRoot));
|
|
20
28
|
const validation = SprintContractSchema.safeParse(contract);
|
|
21
29
|
if (!validation.success) {
|
|
22
|
-
|
|
23
|
-
|
|
30
|
+
throw new Error(`Invalid contract:\n${formatZodIssues(validation.error)}`);
|
|
31
|
+
}
|
|
32
|
+
// Quality gate: vague phrases the schema can't express via min-length alone.
|
|
33
|
+
const precisionIssues = findPrecisionIssues(validation.data);
|
|
34
|
+
if (precisionIssues.length > 0) {
|
|
35
|
+
const formatted = precisionIssues
|
|
36
|
+
.map((i) => ` - ${i.field}: ${i.message}`)
|
|
24
37
|
.join("\n");
|
|
25
|
-
throw new Error(`
|
|
38
|
+
throw new Error(`Contract "${contract.contractId}" failed precision gate:\n${formatted}`);
|
|
26
39
|
}
|
|
27
|
-
const filePath = contractPath(projectRoot, contract.
|
|
40
|
+
const filePath = contractPath(projectRoot, contract.contractId);
|
|
28
41
|
await writeFile(filePath, JSON.stringify(contract, null, 2), "utf-8");
|
|
29
42
|
}
|
|
30
43
|
/**
|
|
@@ -49,15 +62,16 @@ export async function loadContract(projectRoot, id) {
|
|
|
49
62
|
}
|
|
50
63
|
const result = SprintContractSchema.safeParse(parsed);
|
|
51
64
|
if (!result.success) {
|
|
52
|
-
|
|
53
|
-
.map((i) => ` - ${i.path.join(".")}: ${i.message}`)
|
|
54
|
-
.join("\n");
|
|
55
|
-
throw new Error(`Contract "${id}" failed validation:\n${issues}`);
|
|
65
|
+
throw new Error(`Contract "${id}" failed validation:\n${formatZodIssues(result.error)}`);
|
|
56
66
|
}
|
|
57
67
|
return result.data;
|
|
58
68
|
}
|
|
59
69
|
/**
|
|
60
70
|
* List all saved contracts, sorted by filename.
|
|
71
|
+
*
|
|
72
|
+
* Files that fail validation are skipped silently — to surface validation
|
|
73
|
+
* errors, use `loadContract` directly. (Skipping is intentional here so that
|
|
74
|
+
* a single bad file doesn't break listing for the rest.)
|
|
61
75
|
*/
|
|
62
76
|
export async function listContracts(projectRoot) {
|
|
63
77
|
const dir = contractsDir(projectRoot);
|
|
@@ -90,7 +104,7 @@ export async function listContracts(projectRoot) {
|
|
|
90
104
|
return contracts;
|
|
91
105
|
}
|
|
92
106
|
/**
|
|
93
|
-
* Update an existing contract (save with the same
|
|
107
|
+
* Update an existing contract (save with the same contractId).
|
|
94
108
|
*/
|
|
95
109
|
export async function updateContract(projectRoot, contract) {
|
|
96
110
|
await saveContract(projectRoot, contract);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sprint-state.js","sourceRoot":"","sources":["../../src/state/sprint-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"sprint-state.js","sourceRoot":"","sources":["../../src/state/sprint-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GAEpB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEzC,SAAS,YAAY,CAAC,WAAmB;IACvC,OAAO,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,YAAY,CAAC,WAAmB,EAAE,EAAU;IACnD,wCAAwC;IACxC,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,eAAe,CAAC,KAAe;IACtC,OAAO,KAAK,CAAC,MAAM;SAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;SACnD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,WAAmB,EACnB,QAAwB;IAExB,MAAM,SAAS,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;IAE3C,MAAM,UAAU,GAAG,oBAAoB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC5D,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,sBAAsB,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAC1D,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,MAAM,eAAe,GAAG,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,eAAe;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aAC1C,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CACb,aAAa,QAAQ,CAAC,UAAU,6BAA6B,SAAS,EAAE,CACzE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IAChE,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACxE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,WAAmB,EACnB,EAAU;IAEV,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAE/C,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,aAAa,EAAE,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACjF,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;IACJ,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,sCAAsC,EAAE,MAAM,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAChG,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,aAAa,EAAE,yBAAyB,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACxE,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,WAAmB;IAEnB,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAEtC,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;QAC7C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,SAAS,GAAG,OAAO;SACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SAClC,IAAI,EAAE,CAAC;IAEV,MAAM,SAAS,GAAqB,EAAE,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACtD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAmB,EACnB,QAAwB;IAExB,MAAM,YAAY,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Opt-in local-only telemetry event emitter (Sprint 28).
|
|
3
|
+
*
|
|
4
|
+
* When config.telemetry.enabled === true, appends one newline-terminated JSON
|
|
5
|
+
* line to .bober/telemetry/<YYYY-MM-DD>.jsonl. When disabled (default), emit()
|
|
6
|
+
* is a no-op and performs ZERO file IO.
|
|
7
|
+
*
|
|
8
|
+
* File is created with mode 0600 on first append via fs.open(O_WRONLY|O_APPEND|
|
|
9
|
+
* O_CREAT). Mirrors the Sprint 13 audit pattern verbatim (see audit.ts:86 for
|
|
10
|
+
* the rationale on why fs.appendFile is NOT used).
|
|
11
|
+
*
|
|
12
|
+
* NETWORK EGRESS: forbidden by design. No import of node:http, node:https,
|
|
13
|
+
* node:net, node:tls, undici, or fetch — enforced by ESLint no-restricted-imports
|
|
14
|
+
* rule scoped to src/telemetry/** in eslint.config.js.
|
|
15
|
+
*
|
|
16
|
+
* PRIVACY: event payloads MUST be IDs / counts / enum outcomes only. NEVER pass
|
|
17
|
+
* user-content strings (feedbackText, prompts, file contents, MCP response
|
|
18
|
+
* bodies). Reviewers grep `emit(` across src/ to enforce this discipline.
|
|
19
|
+
*
|
|
20
|
+
* Sprint 28 — src/telemetry/emit.ts
|
|
21
|
+
*/
|
|
22
|
+
import type { BoberConfig } from "../config/schema.js";
|
|
23
|
+
export type TelemetryEventType = "checkpoint-approved" | "checkpoint-rejected" | "checkpoint-edited" | "sprint-pass" | "sprint-fail-retry" | "incident-resolved" | "incident-aborted" | "agent-spawn" | "agent-error";
|
|
24
|
+
/** Allowed payload fields. NO string values from user input. */
|
|
25
|
+
export interface TelemetryEventData {
|
|
26
|
+
runId?: string;
|
|
27
|
+
incidentId?: string;
|
|
28
|
+
specId?: string;
|
|
29
|
+
sprintId?: string;
|
|
30
|
+
contractId?: string;
|
|
31
|
+
agentName?: string;
|
|
32
|
+
checkpointId?: string;
|
|
33
|
+
iteration?: number;
|
|
34
|
+
durationMs?: number;
|
|
35
|
+
outcome?: string;
|
|
36
|
+
retryCount?: number;
|
|
37
|
+
errorKind?: string;
|
|
38
|
+
}
|
|
39
|
+
/** Emit a telemetry event. No-op when telemetry.enabled !== true. */
|
|
40
|
+
export declare function emit(projectRoot: string, config: BoberConfig, eventType: TelemetryEventType, data?: TelemetryEventData): Promise<void>;
|
|
41
|
+
//# sourceMappingURL=emit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/telemetry/emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,MAAM,MAAM,kBAAkB,GAC1B,qBAAqB,GACrB,qBAAqB,GACrB,mBAAmB,GACnB,aAAa,GACb,mBAAmB,GACnB,mBAAmB,GACnB,kBAAkB,GAClB,aAAa,GACb,aAAa,CAAC;AAElB,gEAAgE;AAChE,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAaD,qEAAqE;AACrE,wBAAsB,IAAI,CACxB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,kBAAkB,EAC7B,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAgCf"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Opt-in local-only telemetry event emitter (Sprint 28).
|
|
3
|
+
*
|
|
4
|
+
* When config.telemetry.enabled === true, appends one newline-terminated JSON
|
|
5
|
+
* line to .bober/telemetry/<YYYY-MM-DD>.jsonl. When disabled (default), emit()
|
|
6
|
+
* is a no-op and performs ZERO file IO.
|
|
7
|
+
*
|
|
8
|
+
* File is created with mode 0600 on first append via fs.open(O_WRONLY|O_APPEND|
|
|
9
|
+
* O_CREAT). Mirrors the Sprint 13 audit pattern verbatim (see audit.ts:86 for
|
|
10
|
+
* the rationale on why fs.appendFile is NOT used).
|
|
11
|
+
*
|
|
12
|
+
* NETWORK EGRESS: forbidden by design. No import of node:http, node:https,
|
|
13
|
+
* node:net, node:tls, undici, or fetch — enforced by ESLint no-restricted-imports
|
|
14
|
+
* rule scoped to src/telemetry/** in eslint.config.js.
|
|
15
|
+
*
|
|
16
|
+
* PRIVACY: event payloads MUST be IDs / counts / enum outcomes only. NEVER pass
|
|
17
|
+
* user-content strings (feedbackText, prompts, file contents, MCP response
|
|
18
|
+
* bodies). Reviewers grep `emit(` across src/ to enforce this discipline.
|
|
19
|
+
*
|
|
20
|
+
* Sprint 28 — src/telemetry/emit.ts
|
|
21
|
+
*/
|
|
22
|
+
import { open, mkdir } from "node:fs/promises";
|
|
23
|
+
import { constants } from "node:fs";
|
|
24
|
+
import { join } from "node:path";
|
|
25
|
+
import { logger } from "../utils/logger.js";
|
|
26
|
+
const writeChain = new Map();
|
|
27
|
+
function telemetryDir(projectRoot) {
|
|
28
|
+
return join(projectRoot, ".bober", "telemetry");
|
|
29
|
+
}
|
|
30
|
+
function telemetryPath(projectRoot) {
|
|
31
|
+
const date = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
|
|
32
|
+
return join(telemetryDir(projectRoot), `${date}.jsonl`);
|
|
33
|
+
}
|
|
34
|
+
/** Emit a telemetry event. No-op when telemetry.enabled !== true. */
|
|
35
|
+
export async function emit(projectRoot, config, eventType, data = {}) {
|
|
36
|
+
if (config.telemetry?.enabled !== true)
|
|
37
|
+
return;
|
|
38
|
+
const event = {
|
|
39
|
+
timestamp: new Date().toISOString(),
|
|
40
|
+
eventType,
|
|
41
|
+
...data,
|
|
42
|
+
};
|
|
43
|
+
const filePath = telemetryPath(projectRoot);
|
|
44
|
+
const prev = writeChain.get(filePath) ?? Promise.resolve();
|
|
45
|
+
const next = prev
|
|
46
|
+
.then(async () => {
|
|
47
|
+
await mkdir(telemetryDir(projectRoot), { recursive: true });
|
|
48
|
+
const flags = constants.O_WRONLY | constants.O_APPEND | constants.O_CREAT;
|
|
49
|
+
const fh = await open(filePath, flags, 0o600);
|
|
50
|
+
try {
|
|
51
|
+
// Guarantee mode 0600 even if umask would have reduced it.
|
|
52
|
+
await fh.chmod(0o600);
|
|
53
|
+
await fh.write(JSON.stringify(event) + "\n");
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
await fh.close();
|
|
57
|
+
}
|
|
58
|
+
})
|
|
59
|
+
.catch((err) => {
|
|
60
|
+
logger.warn(`[telemetry] Failed to emit ${eventType}: ${err instanceof Error ? err.message : String(err)}`);
|
|
61
|
+
});
|
|
62
|
+
writeChain.set(filePath, next);
|
|
63
|
+
return next;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=emit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/telemetry/emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA6B5C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;AAEpD,SAAS,YAAY,CAAC,WAAmB;IACvC,OAAO,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,aAAa,CAAC,WAAmB;IACxC,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa;IACjE,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAC;AAC1D,CAAC;AAED,qEAAqE;AACrE,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,WAAmB,EACnB,MAAmB,EACnB,SAA6B,EAC7B,OAA2B,EAAE;IAE7B,IAAI,MAAM,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI;QAAE,OAAO;IAE/C,MAAM,KAAK,GAAG;QACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS;QACT,GAAG,IAAI;KACR,CAAC;IAEF,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAE5C,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3D,MAAM,IAAI,GAAG,IAAI;SACd,IAAI,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC;QAC1E,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,2DAA2D;YAC3D,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACtB,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QAC/C,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QACtB,MAAM,CAAC,IAAI,CACT,8BAA8B,SAAS,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC/F,CAAC;IACJ,CAAC,CAAC,CAAC;IACL,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/utils/git.d.ts
CHANGED
|
@@ -26,6 +26,33 @@ export declare function getDiff(cwd: string, since?: string): Promise<string>;
|
|
|
26
26
|
* Check whether the working tree has uncommitted changes (staged or unstaged).
|
|
27
27
|
*/
|
|
28
28
|
export declare function hasUncommittedChanges(cwd: string): Promise<boolean>;
|
|
29
|
+
/**
|
|
30
|
+
* Add a new git worktree at the given path on a new branch.
|
|
31
|
+
*
|
|
32
|
+
* Shells out to: git worktree add <path> -b <branch> [<baseBranch>]
|
|
33
|
+
* Throws on non-zero exit (a failed worktree-add must surface as an error).
|
|
34
|
+
*/
|
|
35
|
+
export declare function addWorktree(projectRoot: string, worktreePath: string, branch: string, baseBranch?: string): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Remove a git worktree by path.
|
|
38
|
+
*
|
|
39
|
+
* Shells out to: git worktree remove [-f] <path>
|
|
40
|
+
* Uses reject: false so that removing a worktree that no longer exists
|
|
41
|
+
* does not crash cleanup paths.
|
|
42
|
+
*/
|
|
43
|
+
export declare function removeWorktree(projectRoot: string, worktreePath: string, force?: boolean): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Check whether the working tree is clean (no staged or unstaged changes).
|
|
46
|
+
*
|
|
47
|
+
* Returns { clean: true, dirtyFiles: [] } when the tree is clean.
|
|
48
|
+
* Returns { clean: false, dirtyFiles: [...] } listing each dirty path
|
|
49
|
+
* (parsed from `git status --porcelain` — columns 0-1 are the XY status
|
|
50
|
+
* codes, column 2 is a space, then the path starts at column 3).
|
|
51
|
+
*/
|
|
52
|
+
export declare function isClean(cwd: string): Promise<{
|
|
53
|
+
clean: boolean;
|
|
54
|
+
dirtyFiles: string[];
|
|
55
|
+
}>;
|
|
29
56
|
/**
|
|
30
57
|
* Stash any current changes, run the provided function, then restore.
|
|
31
58
|
*
|
package/dist/utils/git.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKnE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3E;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CAWnB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMzE;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,CAAC,EACrC,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAcZ"}
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKnE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3E;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CAWnB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMzE;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,OAAO,GACd,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAenD;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,CAAC,EACrC,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAcZ"}
|
package/dist/utils/git.js
CHANGED
|
@@ -62,6 +62,56 @@ export async function hasUncommittedChanges(cwd) {
|
|
|
62
62
|
});
|
|
63
63
|
return stdout.trim().length > 0;
|
|
64
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Add a new git worktree at the given path on a new branch.
|
|
67
|
+
*
|
|
68
|
+
* Shells out to: git worktree add <path> -b <branch> [<baseBranch>]
|
|
69
|
+
* Throws on non-zero exit (a failed worktree-add must surface as an error).
|
|
70
|
+
*/
|
|
71
|
+
export async function addWorktree(projectRoot, worktreePath, branch, baseBranch) {
|
|
72
|
+
const args = ["worktree", "add", worktreePath, "-b", branch];
|
|
73
|
+
if (baseBranch)
|
|
74
|
+
args.push(baseBranch);
|
|
75
|
+
await execa("git", args, { cwd: projectRoot });
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Remove a git worktree by path.
|
|
79
|
+
*
|
|
80
|
+
* Shells out to: git worktree remove [-f] <path>
|
|
81
|
+
* Uses reject: false so that removing a worktree that no longer exists
|
|
82
|
+
* does not crash cleanup paths.
|
|
83
|
+
*/
|
|
84
|
+
export async function removeWorktree(projectRoot, worktreePath, force) {
|
|
85
|
+
const args = ["worktree", "remove"];
|
|
86
|
+
if (force)
|
|
87
|
+
args.push("-f");
|
|
88
|
+
args.push(worktreePath);
|
|
89
|
+
await execa("git", args, { cwd: projectRoot, reject: false });
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Check whether the working tree is clean (no staged or unstaged changes).
|
|
93
|
+
*
|
|
94
|
+
* Returns { clean: true, dirtyFiles: [] } when the tree is clean.
|
|
95
|
+
* Returns { clean: false, dirtyFiles: [...] } listing each dirty path
|
|
96
|
+
* (parsed from `git status --porcelain` — columns 0-1 are the XY status
|
|
97
|
+
* codes, column 2 is a space, then the path starts at column 3).
|
|
98
|
+
*/
|
|
99
|
+
export async function isClean(cwd) {
|
|
100
|
+
const { stdout } = await execa("git", ["status", "--porcelain"], {
|
|
101
|
+
cwd,
|
|
102
|
+
reject: false,
|
|
103
|
+
});
|
|
104
|
+
const lines = stdout
|
|
105
|
+
.split("\n")
|
|
106
|
+
.map((l) => l.trim())
|
|
107
|
+
.filter(Boolean);
|
|
108
|
+
if (lines.length === 0) {
|
|
109
|
+
return { clean: true, dirtyFiles: [] };
|
|
110
|
+
}
|
|
111
|
+
// Porcelain format: "XY path" — strip the leading "XY " (3 chars)
|
|
112
|
+
const dirtyFiles = lines.map((l) => l.slice(3).trim());
|
|
113
|
+
return { clean: false, dirtyFiles };
|
|
114
|
+
}
|
|
65
115
|
/**
|
|
66
116
|
* Stash any current changes, run the provided function, then restore.
|
|
67
117
|
*
|
package/dist/utils/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
|
package/hooks/hooks.json
CHANGED
|
@@ -1,9 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"hooks": {
|
|
3
|
+
"SessionStart": [
|
|
4
|
+
{
|
|
5
|
+
"matcher": "startup|clear|compact",
|
|
6
|
+
"hooks": [
|
|
7
|
+
{
|
|
8
|
+
"type": "command",
|
|
9
|
+
"command": "${CLAUDE_PLUGIN_ROOT:-.}/hooks/session-start",
|
|
10
|
+
"async": false
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
],
|
|
3
15
|
"PostToolUse": [
|
|
4
16
|
{
|
|
5
17
|
"matcher": "Edit|Write",
|
|
6
|
-
"command": "echo 'Files modified
|
|
18
|
+
"command": "echo 'Files modified — run /bober:eval to verify'"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"matcher": "Edit|Write",
|
|
22
|
+
"command": "node scripts/graph-hook.mjs"
|
|
7
23
|
}
|
|
8
24
|
]
|
|
9
25
|
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# session-start — SessionStart hook for agent-bober
|
|
3
|
+
# Injects the bober.using-bober bootstrap skill into the model's first-turn context.
|
|
4
|
+
#
|
|
5
|
+
# Structural pattern from obra/superpowers (MIT). https://github.com/obra/superpowers
|
|
6
|
+
|
|
7
|
+
set -euo pipefail
|
|
8
|
+
|
|
9
|
+
# Determine project root directory
|
|
10
|
+
PROJECT_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
11
|
+
|
|
12
|
+
# Read bober.using-bober skill content
|
|
13
|
+
using_bober_content=$(cat "${PROJECT_ROOT}/skills/bober.using-bober/SKILL.md" 2>&1 || echo "Error reading bober.using-bober skill")
|
|
14
|
+
|
|
15
|
+
# Escape string for JSON embedding using bash parameter substitution.
|
|
16
|
+
# Each ${s//old/new} is a single C-level pass - orders of magnitude
|
|
17
|
+
# faster than the character-by-character loop this replaces.
|
|
18
|
+
escape_for_json() {
|
|
19
|
+
local s="$1"
|
|
20
|
+
s="${s//\\/\\\\}"
|
|
21
|
+
s="${s//\"/\\\"}"
|
|
22
|
+
s="${s//$'\n'/\\n}"
|
|
23
|
+
s="${s//$'\r'/\\r}"
|
|
24
|
+
s="${s//$'\t'/\\t}"
|
|
25
|
+
printf '%s' "$s"
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
using_bober_escaped=$(escape_for_json "$using_bober_content")
|
|
29
|
+
session_context="<EXTREMELY_IMPORTANT>\nYou are agent-bober.\n\n**Below is the full content of your 'bober-using-bober' skill - your introduction to using bober skills. For all other skills, use the 'Skill' tool:**\n\n${using_bober_escaped}\n\n</EXTREMELY_IMPORTANT>"
|
|
30
|
+
|
|
31
|
+
# Output context injection as JSON.
|
|
32
|
+
# Uses printf instead of heredoc to work around bash 5.3+ heredoc hang.
|
|
33
|
+
# See: https://github.com/obra/superpowers/issues/571
|
|
34
|
+
if [ -n "${CURSOR_PLUGIN_ROOT:-}" ]; then
|
|
35
|
+
printf '{\n "additional_context": "%s"\n}\n' "$session_context"
|
|
36
|
+
elif [ -n "${CLAUDE_PLUGIN_ROOT:-}" ] && [ -z "${COPILOT_CLI:-}" ]; then
|
|
37
|
+
printf '{\n "hookSpecificOutput": {\n "hookEventName": "SessionStart",\n "additionalContext": "%s"\n }\n}\n' "$session_context"
|
|
38
|
+
else
|
|
39
|
+
printf '{\n "additionalContext": "%s"\n}\n' "$session_context"
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
exit 0
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-bober",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"description": "Multi-agent harness for building applications autonomously with any LLM. Researcher, Planner, Curator, Generator, Evaluator pipeline. Supports Claude, GPT, Gemini, Ollama. MCP server for Cursor/Windsurf.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -53,10 +53,11 @@
|
|
|
53
53
|
"templates/",
|
|
54
54
|
".claude-plugin/",
|
|
55
55
|
"README.md",
|
|
56
|
+
"CHANGELOG.md",
|
|
56
57
|
"LICENSE"
|
|
57
58
|
],
|
|
58
59
|
"dependencies": {
|
|
59
|
-
"@anthropic-ai/sdk": "^0.
|
|
60
|
+
"@anthropic-ai/sdk": "^0.100.1",
|
|
60
61
|
"@modelcontextprotocol/sdk": "^1.28.0",
|
|
61
62
|
"chalk": "^5.4.1",
|
|
62
63
|
"commander": "^13.1.0",
|
|
@@ -64,6 +65,7 @@
|
|
|
64
65
|
"glob": "^11.0.1",
|
|
65
66
|
"ora": "^8.1.1",
|
|
66
67
|
"prompts": "^2.4.2",
|
|
68
|
+
"semver": "^7.8.1",
|
|
67
69
|
"zod": "^3.24.2"
|
|
68
70
|
},
|
|
69
71
|
"peerDependencies": {
|
|
@@ -82,9 +84,11 @@
|
|
|
82
84
|
"@eslint/js": "^10.0.1",
|
|
83
85
|
"@types/node": "^22.13.0",
|
|
84
86
|
"@types/prompts": "^2.4.9",
|
|
87
|
+
"@types/semver": "^7.7.1",
|
|
85
88
|
"@typescript-eslint/eslint-plugin": "^8.22.0",
|
|
86
89
|
"@typescript-eslint/parser": "^8.22.0",
|
|
87
90
|
"eslint": "^9.19.0",
|
|
91
|
+
"markdownlint-cli": "^0.48.0",
|
|
88
92
|
"typescript": "^5.7.3",
|
|
89
93
|
"vitest": "^3.0.5"
|
|
90
94
|
}
|
package/scripts/check-prereqs.sh
CHANGED
|
@@ -54,6 +54,18 @@ else
|
|
|
54
54
|
add_check "{\"name\":\"bober_dir\",\"status\":\"missing\",\"path\":\".bober/\",\"message\":\"No .bober/ directory. Run /bober-plan first.\"}"
|
|
55
55
|
fi
|
|
56
56
|
|
|
57
|
+
# ── Optional check: tokensave (only if installed) ─────────────────
|
|
58
|
+
if command -v agent-bober &>/dev/null; then
|
|
59
|
+
ts_json=$(agent-bober graph check-prereq 2>/dev/null || echo '{"ok":false,"reason":"MISSING","hint":"agent-bober graph check-prereq failed"}')
|
|
60
|
+
# Normalize to the {name,status} shape used by other checks
|
|
61
|
+
if echo "$ts_json" | grep -q '"ok":true'; then
|
|
62
|
+
add_check "{\"name\":\"tokensave\",\"status\":\"ok\",\"detail\":$ts_json}"
|
|
63
|
+
else
|
|
64
|
+
# Tokensave missing is NOT a hard blocker for any current command — emit info-only
|
|
65
|
+
CHECKS+=("{\"name\":\"tokensave\",\"status\":\"optional\",\"detail\":$ts_json}")
|
|
66
|
+
fi
|
|
67
|
+
fi
|
|
68
|
+
|
|
57
69
|
# ── Command-specific checks ───────────────────────────────────────
|
|
58
70
|
|
|
59
71
|
case "$COMMAND" in
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# e2e-graph-smoke.sh — end-to-end smoke test for the tokensave graph integration.
|
|
3
|
+
#
|
|
4
|
+
# Prerequisites:
|
|
5
|
+
# - tokensave >= 6.0.0-beta.1 installed and on PATH
|
|
6
|
+
# - npm + node >= 18
|
|
7
|
+
#
|
|
8
|
+
# This script is gated in CI by checking for the tokensave binary.
|
|
9
|
+
# If tokensave is not available, the script exits 0 (skip, not fail).
|
|
10
|
+
#
|
|
11
|
+
# Usage:
|
|
12
|
+
# bash scripts/e2e-graph-smoke.sh
|
|
13
|
+
#
|
|
14
|
+
# The script:
|
|
15
|
+
# 1. Verifies tokensave is available
|
|
16
|
+
# 2. Builds the project
|
|
17
|
+
# 3. Creates a temp directory with a minimal project
|
|
18
|
+
# 4. Runs agent-bober init (brownfield) to get bober.config.json with graph.enabled=true
|
|
19
|
+
# 5. Runs agent-bober graph init
|
|
20
|
+
# 6. Runs agent-bober graph status — asserts ready=true in JSON output
|
|
21
|
+
# 7. Runs agent-bober onboard — asserts 5 files written
|
|
22
|
+
# 8. Runs agent-bober impact sandboxPath — asserts .bober/graph/impact/sandboxpath.md exists
|
|
23
|
+
# 9. Cleans up
|
|
24
|
+
|
|
25
|
+
set -euo pipefail
|
|
26
|
+
|
|
27
|
+
# ── Colors ────────────────────────────────────────────────────────────────────
|
|
28
|
+
RED='\033[0;31m'
|
|
29
|
+
GREEN='\033[0;32m'
|
|
30
|
+
CYAN='\033[0;36m'
|
|
31
|
+
YELLOW='\033[1;33m'
|
|
32
|
+
NC='\033[0m' # No Color
|
|
33
|
+
|
|
34
|
+
info() { echo -e "${CYAN}[smoke]${NC} $*"; }
|
|
35
|
+
ok() { echo -e "${GREEN}[OK]${NC} $*"; }
|
|
36
|
+
warn() { echo -e "${YELLOW}[SKIP]${NC} $*"; }
|
|
37
|
+
fail() { echo -e "${RED}[FAIL]${NC} $*" >&2; exit 1; }
|
|
38
|
+
|
|
39
|
+
# ── Gate: tokensave must be available ─────────────────────────────────────────
|
|
40
|
+
if ! command -v tokensave &>/dev/null; then
|
|
41
|
+
warn "tokensave binary not found — skipping e2e smoke test (install with: brew install aovestdipaperino/tap/tokensave)"
|
|
42
|
+
exit 0
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
TOKENSAVE_VERSION=$(tokensave --version 2>&1 | head -1 || echo "unknown")
|
|
46
|
+
info "tokensave found: ${TOKENSAVE_VERSION}"
|
|
47
|
+
|
|
48
|
+
# ── Step 1: Build the project ─────────────────────────────────────────────────
|
|
49
|
+
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
50
|
+
info "Building agent-bober from ${REPO_ROOT}..."
|
|
51
|
+
cd "${REPO_ROOT}"
|
|
52
|
+
npm run build 2>&1 | tail -5
|
|
53
|
+
ok "Build complete"
|
|
54
|
+
|
|
55
|
+
# ── Step 2: Create a temp test project ────────────────────────────────────────
|
|
56
|
+
TMP_DIR="$(mktemp -d)"
|
|
57
|
+
trap 'rm -rf "${TMP_DIR}"' EXIT
|
|
58
|
+
info "Temp project: ${TMP_DIR}"
|
|
59
|
+
|
|
60
|
+
# Initialise a minimal git repo so agent-bober can detect project root
|
|
61
|
+
cd "${TMP_DIR}"
|
|
62
|
+
git init -q
|
|
63
|
+
git commit --allow-empty -m "init" -q
|
|
64
|
+
|
|
65
|
+
# Write a minimal bober.config.json with graph.enabled=true
|
|
66
|
+
cat > bober.config.json <<'EOF'
|
|
67
|
+
{
|
|
68
|
+
"project": { "name": "smoke-test", "mode": "brownfield" },
|
|
69
|
+
"planner": { "model": "sonnet" },
|
|
70
|
+
"generator": { "model": "sonnet" },
|
|
71
|
+
"evaluator": { "strategies": [] },
|
|
72
|
+
"graph": { "enabled": true, "languageTier": "core" }
|
|
73
|
+
}
|
|
74
|
+
EOF
|
|
75
|
+
|
|
76
|
+
# Add a minimal TypeScript source file
|
|
77
|
+
mkdir -p src
|
|
78
|
+
cat > src/index.ts <<'EOF'
|
|
79
|
+
export function sandboxPath(root: string, p: string): string {
|
|
80
|
+
return `${root}/${p}`;
|
|
81
|
+
}
|
|
82
|
+
EOF
|
|
83
|
+
|
|
84
|
+
# Write a package.json so tokensave knows it is a Node project
|
|
85
|
+
cat > package.json <<'EOF'
|
|
86
|
+
{ "name": "smoke-test", "version": "1.0.0" }
|
|
87
|
+
EOF
|
|
88
|
+
|
|
89
|
+
ok "Temp project created"
|
|
90
|
+
|
|
91
|
+
# ── Step 3: Link or use agent-bober ───────────────────────────────────────────
|
|
92
|
+
BOBER_BIN="${REPO_ROOT}/node_modules/.bin/agent-bober"
|
|
93
|
+
if [[ ! -f "${BOBER_BIN}" ]]; then
|
|
94
|
+
# If running from a global install
|
|
95
|
+
BOBER_BIN="agent-bober"
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
# Use the built binary directly for hermetic execution
|
|
99
|
+
NODE_BIN="node ${REPO_ROOT}/dist/cli/index.js"
|
|
100
|
+
|
|
101
|
+
run_bober() {
|
|
102
|
+
${NODE_BIN} "$@"
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
# ── Step 4: graph init ────────────────────────────────────────────────────────
|
|
106
|
+
info "Running: agent-bober graph init"
|
|
107
|
+
run_bober graph init
|
|
108
|
+
ok "graph init succeeded"
|
|
109
|
+
|
|
110
|
+
# ── Step 5: graph status ──────────────────────────────────────────────────────
|
|
111
|
+
info "Running: agent-bober graph status --json"
|
|
112
|
+
STATUS_JSON="$(run_bober graph status --json)"
|
|
113
|
+
info "Status output: ${STATUS_JSON}"
|
|
114
|
+
|
|
115
|
+
# The graph may not be 'ready' if tokensave hasn't fully indexed in CI,
|
|
116
|
+
# but the command should succeed (exit 0) and produce valid JSON.
|
|
117
|
+
echo "${STATUS_JSON}" | node -e "
|
|
118
|
+
const d = JSON.parse(require('fs').readFileSync('/dev/stdin','utf8'));
|
|
119
|
+
if (typeof d.indexedFileCount !== 'number') { console.error('Missing indexedFileCount'); process.exit(1); }
|
|
120
|
+
if (typeof d.stale !== 'boolean') { console.error('Missing stale'); process.exit(1); }
|
|
121
|
+
console.log('JSON shape OK');
|
|
122
|
+
" || fail "graph status --json produced invalid JSON"
|
|
123
|
+
|
|
124
|
+
ok "graph status succeeded"
|
|
125
|
+
|
|
126
|
+
# ── Step 6: onboard ───────────────────────────────────────────────────────────
|
|
127
|
+
info "Running: agent-bober onboard"
|
|
128
|
+
# onboard requires a live graph engine; run it and check artifacts
|
|
129
|
+
run_bober onboard || warn "onboard exited non-zero (graph may not be fully ready)"
|
|
130
|
+
|
|
131
|
+
ONBOARD_DIR="${TMP_DIR}/.bober/onboarding"
|
|
132
|
+
if [[ -d "${ONBOARD_DIR}" ]]; then
|
|
133
|
+
ARTIFACT_COUNT="$(ls "${ONBOARD_DIR}"/*.md 2>/dev/null | wc -l | tr -d ' ')"
|
|
134
|
+
if [[ "${ARTIFACT_COUNT}" -eq 5 ]]; then
|
|
135
|
+
ok "onboard wrote 5 artifacts"
|
|
136
|
+
else
|
|
137
|
+
warn "onboard wrote ${ARTIFACT_COUNT}/5 artifacts (graph may be warming up)"
|
|
138
|
+
fi
|
|
139
|
+
else
|
|
140
|
+
warn "onboard directory not created (graph engine may not be ready)"
|
|
141
|
+
fi
|
|
142
|
+
|
|
143
|
+
# ── Step 7: impact ────────────────────────────────────────────────────────────
|
|
144
|
+
info "Running: agent-bober impact sandboxPath"
|
|
145
|
+
run_bober impact sandboxPath || warn "impact exited non-zero (graph may not be fully ready)"
|
|
146
|
+
|
|
147
|
+
IMPACT_FILE="${TMP_DIR}/.bober/graph/impact/sandboxpath.md"
|
|
148
|
+
if [[ -f "${IMPACT_FILE}" ]]; then
|
|
149
|
+
ok "impact report written: .bober/graph/impact/sandboxpath.md"
|
|
150
|
+
# Verify required sections
|
|
151
|
+
if grep -q "^# Impact: sandboxPath" "${IMPACT_FILE}" && \
|
|
152
|
+
grep -q "^## Affected symbols" "${IMPACT_FILE}" && \
|
|
153
|
+
grep -q "^## Tests covering this symbol" "${IMPACT_FILE}"; then
|
|
154
|
+
ok "impact report has all required sections"
|
|
155
|
+
else
|
|
156
|
+
fail "impact report is missing required sections"
|
|
157
|
+
fi
|
|
158
|
+
else
|
|
159
|
+
warn "impact file not created (graph engine may not be ready)"
|
|
160
|
+
fi
|
|
161
|
+
|
|
162
|
+
# ── Done ──────────────────────────────────────────────────────────────────────
|
|
163
|
+
echo ""
|
|
164
|
+
ok "e2e-graph-smoke.sh completed"
|
|
165
|
+
echo ""
|
|
166
|
+
echo " Temp project: ${TMP_DIR} (cleaned up)"
|
|
167
|
+
echo " Tokensave: ${TOKENSAVE_VERSION}"
|