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
package/scripts/sync-skills.mjs
CHANGED
|
@@ -10,7 +10,10 @@
|
|
|
10
10
|
// Usage: node scripts/sync-skills.mjs <skill-key>:<command-file> ...
|
|
11
11
|
// e.g.: node scripts/sync-skills.mjs bober.plan:bober-plan.md \
|
|
12
12
|
// bober.run:bober-run.md \
|
|
13
|
-
// bober.sprint:bober-sprint.md
|
|
13
|
+
// bober.sprint:bober-sprint.md \
|
|
14
|
+
// bober.graph:bober-graph.md \
|
|
15
|
+
// bober.onboard:bober-onboard.md \
|
|
16
|
+
// bober.impact:bober-impact.md
|
|
14
17
|
|
|
15
18
|
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
16
19
|
import { join, dirname } from "node:path";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"//": "Projects that consume agent-bober's skills/agents. `npm run update-all` rebuilds the CLI once (shared via symlink) and re-inlines skills/agents into each target's .claude/. Add absolute project paths here. Auto-discovery (--discover) appends any initialized project it finds under the configured roots.",
|
|
3
|
+
"discoverRoots": [
|
|
4
|
+
"/Users/bober4ik/WebstormProjects",
|
|
5
|
+
"/Users/bober4ik/agent-bober-workspace"
|
|
6
|
+
],
|
|
7
|
+
"targets": [
|
|
8
|
+
"/Users/bober4ik/WebstormProjects/solex-integration-demo",
|
|
9
|
+
"/Users/bober4ik/WebstormProjects/solex-integration-demo/apps/api",
|
|
10
|
+
"/Users/bober4ik/WebstormProjects/solex-integration-demo/solex-games-betbook (Copy)"
|
|
11
|
+
]
|
|
12
|
+
}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
3
|
+
// update-all — propagate an agent-bober change to every consuming project.
|
|
4
|
+
//
|
|
5
|
+
// agent-bober is distributed two ways at once:
|
|
6
|
+
// 1. CLI/engine code → ONE copy, shared via npm symlink. `npm run build`
|
|
7
|
+
// recompiles src→dist and every symlinked project picks it up for free.
|
|
8
|
+
// 2. Skills/agents → COPIED into each project's .claude/ by `init`
|
|
9
|
+
// (skills are inlined: SKILL.md + sorted references concatenated into a
|
|
10
|
+
// single .claude/commands/<name>.md). These copies go stale on every
|
|
11
|
+
// skill edit and must be re-emitted per project.
|
|
12
|
+
//
|
|
13
|
+
// This script does both: build once, then re-inline skills + copy agents into
|
|
14
|
+
// every target listed in scripts/sync-targets.json. The inlining format is
|
|
15
|
+
// kept byte-identical to src/cli/commands/init.ts (installClaudeCommands) so a
|
|
16
|
+
// synced project is indistinguishable from a freshly `init`-ed one.
|
|
17
|
+
//
|
|
18
|
+
// Usage:
|
|
19
|
+
// node scripts/update-all.mjs # build + sync all targets
|
|
20
|
+
// node scripts/update-all.mjs --check # dry-run: report drift, write nothing
|
|
21
|
+
// node scripts/update-all.mjs --skills-only # skip the build
|
|
22
|
+
// node scripts/update-all.mjs --no-build # alias of --skills-only
|
|
23
|
+
// node scripts/update-all.mjs --discover # add initialized projects under discoverRoots to the registry
|
|
24
|
+
// node scripts/update-all.mjs /abs/path ... # sync ONLY these paths (ignore registry)
|
|
25
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
26
|
+
|
|
27
|
+
import { readFile, writeFile, readdir, mkdir, stat } from "node:fs/promises";
|
|
28
|
+
import { join, dirname, resolve } from "node:path";
|
|
29
|
+
import { fileURLToPath } from "node:url";
|
|
30
|
+
import { execSync } from "node:child_process";
|
|
31
|
+
|
|
32
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
33
|
+
const PKG_ROOT = resolve(__dirname, "..");
|
|
34
|
+
const SKILLS_ROOT = join(PKG_ROOT, "skills");
|
|
35
|
+
const AGENTS_ROOT = join(PKG_ROOT, "agents");
|
|
36
|
+
const TARGETS_FILE = join(__dirname, "sync-targets.json");
|
|
37
|
+
|
|
38
|
+
// Skill-dir → command-file map. MUST match installClaudeCommands in
|
|
39
|
+
// src/cli/commands/init.ts. Derived at runtime from skills/ so it can never
|
|
40
|
+
// drift: every skills/bober.X dir maps to bober-X.md.
|
|
41
|
+
async function buildSkillMap() {
|
|
42
|
+
const entries = await readdir(SKILLS_ROOT, { withFileTypes: true });
|
|
43
|
+
const map = {};
|
|
44
|
+
for (const e of entries) {
|
|
45
|
+
if (!e.isDirectory()) continue;
|
|
46
|
+
if (!e.name.startsWith("bober.")) continue;
|
|
47
|
+
// bober.code-review → bober-code-review.md
|
|
48
|
+
const cmd = e.name.replace(/\./g, "-") + ".md";
|
|
49
|
+
map[e.name] = cmd;
|
|
50
|
+
}
|
|
51
|
+
return map;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Re-create the inlined command file for one skill, byte-identical to init.ts.
|
|
55
|
+
async function inlineSkill(skillDir) {
|
|
56
|
+
const srcSkill = join(SKILLS_ROOT, skillDir, "SKILL.md");
|
|
57
|
+
let content = await readFile(srcSkill, "utf-8");
|
|
58
|
+
|
|
59
|
+
const refsDir = join(SKILLS_ROOT, skillDir, "references");
|
|
60
|
+
try {
|
|
61
|
+
const refFiles = await readdir(refsDir);
|
|
62
|
+
for (const refFile of refFiles.sort()) {
|
|
63
|
+
if (!refFile.endsWith(".md")) continue;
|
|
64
|
+
const refContent = await readFile(join(refsDir, refFile), "utf-8");
|
|
65
|
+
content += `\n\n---\n\n<!-- Reference: ${refFile} -->\n\n${refContent}`;
|
|
66
|
+
}
|
|
67
|
+
} catch {
|
|
68
|
+
// No references directory — fine.
|
|
69
|
+
}
|
|
70
|
+
return content;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function isDir(p) {
|
|
74
|
+
try {
|
|
75
|
+
return (await stat(p)).isDirectory();
|
|
76
|
+
} catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async function fileEquals(path, expected) {
|
|
82
|
+
try {
|
|
83
|
+
return (await readFile(path, "utf-8")) === expected;
|
|
84
|
+
} catch {
|
|
85
|
+
return false; // missing → counts as changed
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Sync skills + agents into ONE project. Returns a per-target report.
|
|
90
|
+
async function syncTarget(projectRoot, { check }) {
|
|
91
|
+
const claudeDir = join(projectRoot, ".claude");
|
|
92
|
+
const commandsDir = join(claudeDir, "commands");
|
|
93
|
+
const agentsDir = join(claudeDir, "agents");
|
|
94
|
+
|
|
95
|
+
const report = { projectRoot, commandsChanged: [], agentsChanged: [], skipped: false };
|
|
96
|
+
|
|
97
|
+
// A target must already be a project (have a .claude/ or bober.config.json).
|
|
98
|
+
// We never create .claude from scratch here — that's init's job.
|
|
99
|
+
if (!(await isDir(claudeDir)) && !(await fileEquals(join(projectRoot, "bober.config.json"), "__never__"))) {
|
|
100
|
+
// bober.config.json may exist even if .claude doesn't; tolerate either.
|
|
101
|
+
if (!(await isDir(claudeDir))) {
|
|
102
|
+
const hasCfg = await readFile(join(projectRoot, "bober.config.json"), "utf-8").then(() => true).catch(() => false);
|
|
103
|
+
if (!hasCfg) {
|
|
104
|
+
report.skipped = true;
|
|
105
|
+
report.reason = "no .claude/ and no bober.config.json — not an agent-bober project";
|
|
106
|
+
return report;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const skillMap = await buildSkillMap();
|
|
112
|
+
|
|
113
|
+
// ── Commands (inlined skills) ──────────────────────────────────────
|
|
114
|
+
if (!check) await mkdir(commandsDir, { recursive: true });
|
|
115
|
+
for (const [skillDir, commandFile] of Object.entries(skillMap)) {
|
|
116
|
+
let content;
|
|
117
|
+
try {
|
|
118
|
+
content = await inlineSkill(skillDir);
|
|
119
|
+
} catch {
|
|
120
|
+
continue; // SKILL.md missing — skip, mirrors init's behaviour
|
|
121
|
+
}
|
|
122
|
+
const dest = join(commandsDir, commandFile);
|
|
123
|
+
if (!(await fileEquals(dest, content))) {
|
|
124
|
+
report.commandsChanged.push(commandFile);
|
|
125
|
+
if (!check) await writeFile(dest, content, "utf-8");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// ── Agents (verbatim) ──────────────────────────────────────────────
|
|
130
|
+
if (!check) await mkdir(agentsDir, { recursive: true });
|
|
131
|
+
let agentFiles = [];
|
|
132
|
+
try {
|
|
133
|
+
agentFiles = await readdir(AGENTS_ROOT);
|
|
134
|
+
} catch {
|
|
135
|
+
/* no agents dir in package — unusual but tolerate */
|
|
136
|
+
}
|
|
137
|
+
for (const agentFile of agentFiles) {
|
|
138
|
+
if (!agentFile.endsWith(".md")) continue;
|
|
139
|
+
const content = await readFile(join(AGENTS_ROOT, agentFile), "utf-8");
|
|
140
|
+
const dest = join(agentsDir, agentFile);
|
|
141
|
+
if (!(await fileEquals(dest, content))) {
|
|
142
|
+
report.agentsChanged.push(agentFile);
|
|
143
|
+
if (!check) await writeFile(dest, content, "utf-8");
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return report;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Walk discoverRoots and return any initialized project (has a bober-plan.md
|
|
151
|
+
// command — the marker that init ran there). Bounded depth to stay safe/fast.
|
|
152
|
+
async function discover(roots) {
|
|
153
|
+
const found = new Set();
|
|
154
|
+
async function walk(dir, depth) {
|
|
155
|
+
if (depth > 4) return;
|
|
156
|
+
let entries;
|
|
157
|
+
try {
|
|
158
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
159
|
+
} catch {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
// Initialized? marker file present.
|
|
163
|
+
const marker = join(dir, ".claude", "commands", "bober-plan.md");
|
|
164
|
+
if (await readFile(marker, "utf-8").then(() => true).catch(() => false)) {
|
|
165
|
+
found.add(dir);
|
|
166
|
+
}
|
|
167
|
+
for (const e of entries) {
|
|
168
|
+
if (!e.isDirectory()) continue;
|
|
169
|
+
if (e.name === "node_modules" || e.name === ".git" || e.name === "dist") continue;
|
|
170
|
+
await walk(join(dir, e.name), depth + 1);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
for (const r of roots) await walk(r, 0);
|
|
174
|
+
return [...found];
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
async function loadRegistry() {
|
|
178
|
+
const raw = JSON.parse(await readFile(TARGETS_FILE, "utf-8"));
|
|
179
|
+
return raw;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
async function main() {
|
|
183
|
+
const argv = process.argv.slice(2);
|
|
184
|
+
const flags = new Set(argv.filter((a) => a.startsWith("--")));
|
|
185
|
+
const pathArgs = argv.filter((a) => !a.startsWith("--"));
|
|
186
|
+
const check = flags.has("--check");
|
|
187
|
+
const skillsOnly = flags.has("--skills-only") || flags.has("--no-build");
|
|
188
|
+
|
|
189
|
+
// ── Optional: discovery mode (mutates the registry, then exits) ─────
|
|
190
|
+
if (flags.has("--discover")) {
|
|
191
|
+
const reg = await loadRegistry();
|
|
192
|
+
const discovered = await discover(reg.discoverRoots ?? []);
|
|
193
|
+
const before = new Set(reg.targets);
|
|
194
|
+
for (const d of discovered) before.add(d);
|
|
195
|
+
reg.targets = [...before].sort();
|
|
196
|
+
await writeFile(TARGETS_FILE, JSON.stringify(reg, null, 2) + "\n", "utf-8");
|
|
197
|
+
console.log(`Discovered ${discovered.length} initialized project(s); registry now has ${reg.targets.length}:`);
|
|
198
|
+
for (const t of reg.targets) console.log(` - ${t}`);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// ── 1. Build the CLI (the shared half) ─────────────────────────────
|
|
203
|
+
if (!skillsOnly && !check) {
|
|
204
|
+
console.log("▸ Building CLI (src → dist)…");
|
|
205
|
+
execSync("npm run build", { cwd: PKG_ROOT, stdio: "inherit" });
|
|
206
|
+
console.log(" ✓ dist rebuilt — every symlinked project now runs current code.\n");
|
|
207
|
+
} else if (check) {
|
|
208
|
+
console.log("▸ --check: dry run, nothing will be written.\n");
|
|
209
|
+
} else {
|
|
210
|
+
console.log("▸ --skills-only: skipping build.\n");
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// ── 2. Resolve targets ─────────────────────────────────────────────
|
|
214
|
+
let targets;
|
|
215
|
+
if (pathArgs.length > 0) {
|
|
216
|
+
targets = pathArgs.map((p) => resolve(p));
|
|
217
|
+
} else {
|
|
218
|
+
const reg = await loadRegistry();
|
|
219
|
+
targets = reg.targets ?? [];
|
|
220
|
+
}
|
|
221
|
+
if (targets.length === 0) {
|
|
222
|
+
console.error("No targets. Add paths to scripts/sync-targets.json or pass them as args (or run --discover).");
|
|
223
|
+
process.exit(1);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// ── 3. Sync skills + agents into each target ───────────────────────
|
|
227
|
+
console.log(`▸ Syncing skills + agents into ${targets.length} project(s):\n`);
|
|
228
|
+
let totalChanged = 0;
|
|
229
|
+
for (const t of targets) {
|
|
230
|
+
const r = await syncTarget(t, { check });
|
|
231
|
+
if (r.skipped) {
|
|
232
|
+
console.log(` ⊘ ${t}\n skipped: ${r.reason}`);
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
const n = r.commandsChanged.length + r.agentsChanged.length;
|
|
236
|
+
totalChanged += n;
|
|
237
|
+
if (n === 0) {
|
|
238
|
+
console.log(` ✓ ${t}\n already up to date`);
|
|
239
|
+
} else {
|
|
240
|
+
console.log(` ${check ? "✎" : "✓"} ${t}`);
|
|
241
|
+
if (r.commandsChanged.length) console.log(` commands ${check ? "would update" : "updated"}: ${r.commandsChanged.length} (${r.commandsChanged.slice(0, 5).join(", ")}${r.commandsChanged.length > 5 ? ", …" : ""})`);
|
|
242
|
+
if (r.agentsChanged.length) console.log(` agents ${check ? "would update" : "updated"}: ${r.agentsChanged.length} (${r.agentsChanged.join(", ")})`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
console.log(
|
|
247
|
+
`\n${check ? "Drift check complete" : "Sync complete"}: ${totalChanged} file(s) ${check ? "out of date" : "written"} across ${targets.length} project(s).`,
|
|
248
|
+
);
|
|
249
|
+
if (check && totalChanged > 0) process.exitCode = 1; // CI-friendly: drift → nonzero
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
main().catch((err) => {
|
|
253
|
+
console.error(err);
|
|
254
|
+
process.exit(1);
|
|
255
|
+
});
|
|
@@ -106,6 +106,13 @@ Wait for user response. If (B) or (C): respawn the subagent with the user's feed
|
|
|
106
106
|
|
|
107
107
|
## Step 6: Checkpoint 2 — Approach Selection
|
|
108
108
|
|
|
109
|
+
**Panel mode (gated, off by default):** Read `config.architect?.panel`. If `panel.enabled` is `true` AND `panel.lenses.length >= 2`, run the PANEL flow described in the inlined Lens Panel reference below (`<!-- Reference: arch-lens-panel.md -->`):
|
|
110
|
+
- First spawn a generate-approaches subagent (producing 2–3 candidate approaches that satisfy the Checkpoint 1 constraints).
|
|
111
|
+
- Then spawn one bober-architect subagent per lens in **MODE:lens-score:\<name\>** for each name in `panel.lenses`, bounded by `panel.maxConcurrent` concurrent spawns. Each scorer receives the same candidate set and scores them exclusively through its lens focus fragment (see `resolveArchLensFocus(lens)` in the reference).
|
|
112
|
+
- Call `synthesize()` (see `src/orchestrator/synthesizer.ts`) to aggregate per-lens scores and produce the ranked winner with dissent. Proceed with the highest-scoring approach as the selected approach.
|
|
113
|
+
|
|
114
|
+
OTHERWISE (panel disabled, or fewer than 2 lenses), spawn exactly ONE bober-architect subagent as described below — byte-identical to today's behaviour.
|
|
115
|
+
|
|
109
116
|
Spawn a subagent with the approved Problem Statement included:
|
|
110
117
|
|
|
111
118
|
```
|
|
@@ -295,6 +302,12 @@ Handle (B)/(C) by respawning with feedback.
|
|
|
295
302
|
|
|
296
303
|
## Step 9: Checkpoint 5 — Final Assembly
|
|
297
304
|
|
|
305
|
+
**Panel mode (gated, off by default):** Read `config.architect?.panel`. If `panel.enabled` is `true` AND `panel.lenses.length >= 2`, run the PANEL flow described in the inlined Lens Panel reference below (`<!-- Reference: arch-lens-panel.md -->`):
|
|
306
|
+
- Spawn one bober-architect subagent per lens in **MODE:lens-review:\<name\>** for each name in `panel.lenses`, bounded by `panel.maxConcurrent` concurrent spawns. Each reviewer receives the assembled architecture document and ADRs and produces a PASS/FAIL verdict exclusively through its lens focus fragment.
|
|
307
|
+
- Call `reconcile()` (see `src/orchestrator/workflow/reconciler.ts`) to aggregate verdicts: strict majority (`passCount > failCount`), **fail-closed on tie** (tie → false). Record the reconciled verdict (including `lensVerdicts` array) in the assembly output.
|
|
308
|
+
|
|
309
|
+
OTHERWISE (panel disabled, or fewer than 2 lenses), spawn exactly ONE bober-architect subagent as described below — byte-identical to today's behaviour.
|
|
310
|
+
|
|
298
311
|
Spawn a subagent to compile the complete architecture document:
|
|
299
312
|
|
|
300
313
|
```
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Arch Lens Panel — Canonical Protocol Reference
|
|
2
|
+
|
|
3
|
+
This document is the single source of truth for native architect panel orchestration in agent-bober.
|
|
4
|
+
It embeds the seven canonical arch lens focus fragments verbatim from
|
|
5
|
+
`src/orchestrator/arch-lenses.ts` (the `ARCH_LENS_CATALOG` literal) and documents the
|
|
6
|
+
CP2 synthesis panel and CP5 reconcile panel protocols.
|
|
7
|
+
The drift gate (`src/orchestrator/arch-lens-panel-parity.test.ts`) enforces byte-exact parity.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Lens Focus Fragments
|
|
12
|
+
|
|
13
|
+
The following fragments are the exact strings returned by `resolveArchLensFocus(lens)` for each
|
|
14
|
+
built-in arch lens. They MUST remain byte-for-byte identical to the corresponding entries in
|
|
15
|
+
`ARCH_LENS_CATALOG` — the drift gate (`src/orchestrator/arch-lens-panel-parity.test.ts`) enforces this.
|
|
16
|
+
|
|
17
|
+
### scalability
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
Focus on whether the proposed architecture can handle projected load growth. Evaluate horizontal and vertical scaling paths, bottlenecks, stateful vs stateless components, and whether partitioning or sharding strategies are available when needed.
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### security
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
Focus on the threat surface introduced by this architecture. Evaluate trust boundaries, data flows across zones, authentication and authorisation enforcement points, secrets management, and exposure of internal services.
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### cost
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
Focus on the total cost of ownership implied by this architecture. Evaluate compute, storage, and egress costs at projected scale, licensing or SaaS subscription expenses, and the operational overhead of running, monitoring, and scaling the system.
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### operability
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
Focus on how easy it will be to operate this architecture in production. Evaluate observability (metrics, logs, traces), deployment complexity, rollout and rollback procedures, on-call burden, and the blast radius of common failure modes.
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### maintainability
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
Focus on how easy it will be to change and extend this architecture over time. Evaluate coupling between components, clarity of boundaries, documentation needs, onboarding friction for new contributors, and the risk of accruing technical debt.
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### reversibility
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
Focus on how difficult or costly it would be to undo or replace this architectural decision. Evaluate lock-in to vendors or proprietary technologies, data migration complexity, and whether a strangler-fig or incremental migration path exists if the approach needs to change.
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### simplicity
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
Focus on whether this is the simplest architecture that satisfies the Checkpoint 1 constraints. Challenge whether each component needs to exist, whether a native platform feature or an already-present dependency removes a proposed custom layer, whether two components should collapse into one, and whether any abstraction is speculative — added for a use case absent from the problem statement. Reward the smallest design that honours every hard constraint; penalise layers introduced for unproven future flexibility, but never at the expense of a stated constraint.
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
> The `simplicity` lens enforces the top rung of the YAGNI ladder at design time: "does this
|
|
60
|
+
> component need to exist at all?". It is constraint-bounded by construction — it may never
|
|
61
|
+
> recommend dropping a layer that a Checkpoint 1 hard constraint requires. This keeps it
|
|
62
|
+
> consistent with the architect's IRON LAW (every decision must cite the constraint that
|
|
63
|
+
> eliminates the rejected alternative): a simplification that violates a constraint is not simpler,
|
|
64
|
+
> it is wrong.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Native Architect Panel Protocol
|
|
69
|
+
|
|
70
|
+
### CP2 Synthesis Panel
|
|
71
|
+
|
|
72
|
+
At Checkpoint 2 (candidate generation + scoring), the orchestrator runs the synthesis panel:
|
|
73
|
+
|
|
74
|
+
1. **Generate candidates:** The architect produces 2–3 candidate approaches that satisfy the
|
|
75
|
+
Checkpoint 1 constraints.
|
|
76
|
+
|
|
77
|
+
2. **Lens scorer fan-out (one per lens):** The orchestrator spawns one scorer subagent per
|
|
78
|
+
configured arch lens (scalability, security, cost, operability, maintainability, reversibility,
|
|
79
|
+
simplicity), bounded by `maxConcurrent`. Each scorer receives the same candidate set and is instructed to
|
|
80
|
+
score the candidates exclusively through its lens focus fragment (the exact string returned by
|
|
81
|
+
`resolveArchLensFocus(lens)` from `src/orchestrator/arch-lenses.ts`).
|
|
82
|
+
|
|
83
|
+
3. **Synthesis:** `synthesize()` in `src/orchestrator/synthesizer.ts` aggregates the per-lens
|
|
84
|
+
scores and produces a ranked winner with dissent. The highest-scoring approach across lenses
|
|
85
|
+
becomes the recommended architecture; any lens that preferred a different candidate is recorded
|
|
86
|
+
as a dissenting voice in the synthesis output.
|
|
87
|
+
|
|
88
|
+
### CP5 Reconcile Panel
|
|
89
|
+
|
|
90
|
+
At Checkpoint 5 (review pass), the orchestrator runs the reconcile panel:
|
|
91
|
+
|
|
92
|
+
1. **Lens reviewer fan-out (one per lens):** The orchestrator spawns one reviewer subagent per
|
|
93
|
+
configured arch lens. Each reviewer receives the assembled architecture document and ADRs, and
|
|
94
|
+
is instructed to produce a PASS/FAIL verdict exclusively through its lens focus fragment.
|
|
95
|
+
|
|
96
|
+
2. **Reconciliation — fail-closed on tie:** `reconcile()` in
|
|
97
|
+
`src/orchestrator/workflow/reconciler.ts` aggregates the per-lens verdicts using the following
|
|
98
|
+
semantics:
|
|
99
|
+
|
|
100
|
+
- **Inputs:** the array of per-lens `EvalResult` objects (`lensVerdicts`).
|
|
101
|
+
- **Require non-empty:** an empty array throws `"reconcile: lensVerdicts must be non-empty"`.
|
|
102
|
+
- **Vote count:** `passCount` = number of lenses where `passed === true`;
|
|
103
|
+
`failCount` = total − passCount.
|
|
104
|
+
- **Verdict:** `passed = passCount > failCount` (strict majority).
|
|
105
|
+
- **Fail-closed on tie:** when `passCount === failCount` the panel verdict is `false`.
|
|
106
|
+
- **Details:** union of all failing lens details, de-duplicated by `(criterion, message)` key.
|
|
107
|
+
- **Feedback:** failing lenses' feedback joined with `\n`; `"All lenses passed."` when all pass.
|
|
108
|
+
- **Summary:** `"Panel verdict: ${passCount}/${n} lenses passed"`.
|
|
109
|
+
- **Score:** `Math.round((100 * passCount) / n)`.
|
|
110
|
+
- **Evaluator tag:** `evaluator = "panel"`.
|
|
111
|
+
|
|
112
|
+
### lensVerdicts Output Shape
|
|
113
|
+
|
|
114
|
+
After reconciliation the orchestrator writes a `lensVerdicts` array into the saved result.
|
|
115
|
+
The array shape is:
|
|
116
|
+
|
|
117
|
+
```ts
|
|
118
|
+
lensVerdicts: Array<{
|
|
119
|
+
lens: string; // e.g. "scalability", "security", "cost", "operability", "maintainability", "reversibility", "simplicity"
|
|
120
|
+
passed: boolean; // individual lens verdict
|
|
121
|
+
summary: string; // per-lens summary from the scorer or reviewer subagent
|
|
122
|
+
}>
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
This field is optional and backward-compatible: results produced before the panel feature
|
|
126
|
+
(or by non-panel architect runs) simply omit it.
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bober-code-review
|
|
3
|
+
description: Use when completing a sprint, after evaluator pass — spawns bober-code-reviewer subagent to audit the sprint diff against the contract and anti-pattern catalog, producing an advisory ReviewResult written to .bober/reviews/<contractId>-review.md.
|
|
4
|
+
argument-hint: "[contract-id]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
> Adapted from [obra/superpowers](https://github.com/obra/superpowers) — MIT License.
|
|
8
|
+
> Original: skills/requesting-code-review/.
|
|
9
|
+
> Adaptations: agent name (bober-code-reviewer), advisory-only contract, ReviewResult JSON schema, anti-pattern citations from .bober/anti-patterns/.
|
|
10
|
+
|
|
11
|
+
# bober.code-review — Advisory Code Review Orchestrator
|
|
12
|
+
|
|
13
|
+
You are the **orchestrator** for a standalone code review run. You do NOT review the code yourself. You spawn the code reviewer as a subagent using the **Agent tool**, then process and save its results to `.bober/reviews/<contractId>-review.md`.
|
|
14
|
+
|
|
15
|
+
The code reviewer subagent runs in its own isolated context window. It receives ONLY the information you explicitly pass in its prompt.
|
|
16
|
+
|
|
17
|
+
**Integration with bober pipeline:** In the automated pipeline, bober-code-reviewer is spawned automatically after `runEvaluatorAgent` returns `passed: true` in `src/orchestrator/pipeline.ts`. This skill is for standalone runs — when you want to trigger a review manually outside the normal pipeline flow.
|
|
18
|
+
|
|
19
|
+
## When to Request Review
|
|
20
|
+
|
|
21
|
+
**Mandatory in pipeline:** The orchestrator triggers code review automatically after each sprint evaluator pass. You do not need to invoke this skill for normal pipeline runs.
|
|
22
|
+
|
|
23
|
+
**Use this skill manually when:**
|
|
24
|
+
- You completed a sprint manually (outside the pipeline) and want advisory feedback
|
|
25
|
+
- You want to re-review a sprint with a different anti-pattern focus
|
|
26
|
+
- You want to review a specific file range that the pipeline did not cover
|
|
27
|
+
|
|
28
|
+
## What the Reviewer Checks
|
|
29
|
+
|
|
30
|
+
**What to check — findings the reviewer WILL surface:**
|
|
31
|
+
|
|
32
|
+
- **DRY violations**: New code that duplicates an existing utility verbatim. Cite the duplicate location with file:line evidence.
|
|
33
|
+
- **YAGNI violations**: Abstractions added for future use cases not in the contract. Config options wired but never read.
|
|
34
|
+
- **Dead code**: Functions defined but never called; exports with zero import sites in the diff.
|
|
35
|
+
- **Missing tests**: Changed behavior with no new test coverage; tests that only check the happy path.
|
|
36
|
+
- **Anti-pattern matches** from `.bober/anti-patterns/`:
|
|
37
|
+
- Testing Mock Behavior, Test-Only Methods in Production → `.bober/anti-patterns/testing-anti-patterns.md`
|
|
38
|
+
- Arbitrary-delay waiting (`setTimeout`/`sleep`) → `.bober/anti-patterns/condition-based-waiting.md`
|
|
39
|
+
- Symptom-fix instead of root-cause → `.bober/anti-patterns/root-cause-tracing.md`
|
|
40
|
+
- Single-layer validation (missing defense-in-depth) → `.bober/anti-patterns/defense-in-depth.md`
|
|
41
|
+
- **Silent error swallowing**: `catch {}` with no log or rethrow; errors absorbed without surfacing
|
|
42
|
+
- **TypeScript `any` types** without a comment explaining why
|
|
43
|
+
|
|
44
|
+
**What NOT to flag — the reviewer MUST drop these:**
|
|
45
|
+
|
|
46
|
+
- Style preferences (indentation, line length, trailing commas when file is internally consistent)
|
|
47
|
+
- Naming opinions when the name is consistent with the surrounding file
|
|
48
|
+
- Theoretical risks without an observed trigger (speculation without evidence)
|
|
49
|
+
- Decisions the planner already resolved — re-litigating settled choices is scope creep
|
|
50
|
+
- Pre-existing code that was NOT changed in this sprint
|
|
51
|
+
|
|
52
|
+
## Acting on Feedback
|
|
53
|
+
|
|
54
|
+
Because the review is advisory (it never blocks sprint completion), severity signals what to do NEXT:
|
|
55
|
+
|
|
56
|
+
- **Critical**: Warrants a dedicated fix sprint. The finding has file:line evidence and an observed trigger. Prioritize addressing this before the next feature sprint.
|
|
57
|
+
- **Important**: Address before shipping this feature broadly. Worth tracking in the backlog.
|
|
58
|
+
- **Minor**: Note for future housekeeping. Do not delay other work for these.
|
|
59
|
+
|
|
60
|
+
Even Critical findings do NOT trigger a generator retry. The sprint is complete. The review surfaces information for planning the next sprint.
|
|
61
|
+
|
|
62
|
+
## Process Flow
|
|
63
|
+
|
|
64
|
+
### Step 1: Identify the Target Contract
|
|
65
|
+
|
|
66
|
+
**If a contract ID was provided as an argument:**
|
|
67
|
+
- Load the contract from `.bober/contracts/<contractId>.json`
|
|
68
|
+
- Verify the contract status is `passed` — review runs after evaluator pass
|
|
69
|
+
|
|
70
|
+
**If no contract ID was provided:**
|
|
71
|
+
- Find the most recently passed contract from `.bober/contracts/`
|
|
72
|
+
- If no passed contracts exist, tell the user there is nothing to review
|
|
73
|
+
|
|
74
|
+
Read the contract and its parent PlanSpec.
|
|
75
|
+
|
|
76
|
+
### Step 2: Gather Context
|
|
77
|
+
|
|
78
|
+
Read `bober.config.json` for commands and evaluator config.
|
|
79
|
+
Read `.bober/principles.md` if it exists.
|
|
80
|
+
|
|
81
|
+
Check the git status:
|
|
82
|
+
```bash
|
|
83
|
+
git log --oneline -5
|
|
84
|
+
git diff HEAD~1 --stat
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Step 3: Spawn the Code Reviewer Subagent
|
|
88
|
+
|
|
89
|
+
Use the **Agent tool** to spawn a code reviewer subagent.
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
Agent tool call:
|
|
93
|
+
description: "Code Review: <sprint title>"
|
|
94
|
+
subagent_type: bober-code-reviewer
|
|
95
|
+
mode: auto
|
|
96
|
+
prompt: <the full prompt below>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**Build the reviewer prompt with ALL of these sections:**
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
You are the Bober Code Reviewer subagent. You have been spawned to advisory-review a sprint that already passed evaluation.
|
|
103
|
+
|
|
104
|
+
## Sprint Contract
|
|
105
|
+
<paste the full SprintContract JSON from .bober/contracts/<contractId>.json>
|
|
106
|
+
|
|
107
|
+
## Evaluation Result (Already Passed)
|
|
108
|
+
<paste the EvaluationRunResult JSON — key fields: passed: true, summary, score>
|
|
109
|
+
|
|
110
|
+
## Project Configuration
|
|
111
|
+
Commands:
|
|
112
|
+
<paste the commands section from bober.config.json>
|
|
113
|
+
|
|
114
|
+
## Project Root
|
|
115
|
+
<absolute path to the project root>
|
|
116
|
+
|
|
117
|
+
## Context
|
|
118
|
+
- Contract ID: <contractId>
|
|
119
|
+
- Spec ID: <specId>
|
|
120
|
+
- Review is ADVISORY ONLY — findings do not block completion or trigger retries
|
|
121
|
+
|
|
122
|
+
## Anti-Pattern Catalog
|
|
123
|
+
The catalog index is at .bober/anti-patterns/README.md. Consult it BEFORE classifying severity.
|
|
124
|
+
Catalogued anti-patterns:
|
|
125
|
+
- Testing anti-patterns → .bober/anti-patterns/testing-anti-patterns.md
|
|
126
|
+
- Condition-based waiting → .bober/anti-patterns/condition-based-waiting.md
|
|
127
|
+
- Root-cause tracing → .bober/anti-patterns/root-cause-tracing.md
|
|
128
|
+
- Defense in depth → .bober/anti-patterns/defense-in-depth.md
|
|
129
|
+
|
|
130
|
+
## Your Task
|
|
131
|
+
Review the sprint diff. Produce a ReviewResult JSON. Output ONLY the JSON — no text outside it.
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Step 4: Process and Save the Result
|
|
135
|
+
|
|
136
|
+
When the subagent returns:
|
|
137
|
+
|
|
138
|
+
1. Parse the ReviewResult JSON from its response
|
|
139
|
+
2. Render the markdown review document (6 required sections):
|
|
140
|
+
|
|
141
|
+
```markdown
|
|
142
|
+
# Code Review: <contractId>
|
|
143
|
+
|
|
144
|
+
## Summary
|
|
145
|
+
|
|
146
|
+
<paste summary field>
|
|
147
|
+
|
|
148
|
+
## Critical
|
|
149
|
+
|
|
150
|
+
<for each finding in critical array: description + evidence>
|
|
151
|
+
<if empty: "No critical findings.">
|
|
152
|
+
|
|
153
|
+
## Important
|
|
154
|
+
|
|
155
|
+
<for each finding in important array>
|
|
156
|
+
<if empty: "No important findings.">
|
|
157
|
+
|
|
158
|
+
## Minor
|
|
159
|
+
|
|
160
|
+
<for each finding in minor array>
|
|
161
|
+
<if empty: "No minor findings.">
|
|
162
|
+
|
|
163
|
+
## Approved Areas
|
|
164
|
+
|
|
165
|
+
<for each item in approvedAreas: bullet>
|
|
166
|
+
<if empty: "No areas specifically called out.">
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
3. Save to `.bober/reviews/<contractId>-review.md`
|
|
170
|
+
4. Report a summary to the user: counts of critical/important/minor findings
|
|
171
|
+
|
|
172
|
+
## Red Flags - STOP
|
|
173
|
+
|
|
174
|
+
- About to spawn the reviewer before checking that the sprint status is `passed`
|
|
175
|
+
- About to save a review for a contract that never passed evaluation
|
|
176
|
+
- About to treat Critical findings as blocking (they are advisory — the sprint is done)
|
|
177
|
+
- About to skip reading `.bober/anti-patterns/README.md` before the reviewer prompt
|
|
178
|
+
|
|
179
|
+
## Rationalization Prevention
|
|
180
|
+
|
|
181
|
+
| Excuse | Reality |
|
|
182
|
+
|--------|---------|
|
|
183
|
+
| "The sprint passed, so there is nothing to review" | Passing evaluation is a correctness bar, not a quality bar. Code review adds a separate signal. |
|
|
184
|
+
| "Critical findings mean I should trigger a rework" | No. Advisory means advisory. The sprint is complete. Plan a fix sprint if needed. |
|
|
185
|
+
| "The reviewer ran out of context — I will skip saving the file" | Save what you have. An empty review with just a Summary is better than no record. |
|
|
186
|
+
| "Different words so rule doesn't apply" | Spirit over letter. |
|