agent-bober 0.18.0 → 0.19.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/plugin.json +1 -1
- package/CHANGELOG.md +11 -0
- package/README.md +245 -6
- package/agents/bober-art-director.md +100 -0
- package/agents/bober-design-critic.md +114 -0
- package/agents/bober-frontend-builder.md +101 -0
- package/agents/bober-security-auditor.md +193 -0
- package/agents/bober-security-verifier.md +104 -0
- package/agents/bober-seo-strategist.md +144 -0
- package/agents/bober-seo-verifier.md +103 -0
- package/dist/calendar/calendar-egress.d.ts +26 -0
- package/dist/calendar/calendar-egress.d.ts.map +1 -0
- package/dist/calendar/calendar-egress.js +35 -0
- package/dist/calendar/calendar-egress.js.map +1 -0
- package/dist/calendar/calendar-token.d.ts +34 -0
- package/dist/calendar/calendar-token.d.ts.map +1 -0
- package/dist/calendar/calendar-token.js +56 -0
- package/dist/calendar/calendar-token.js.map +1 -0
- package/dist/calendar/connector.d.ts +22 -0
- package/dist/calendar/connector.d.ts.map +1 -0
- package/dist/calendar/connector.js +3 -0
- package/dist/calendar/connector.js.map +1 -0
- package/dist/calendar/finding-source.d.ts +20 -0
- package/dist/calendar/finding-source.d.ts.map +1 -0
- package/dist/calendar/finding-source.js +35 -0
- package/dist/calendar/finding-source.js.map +1 -0
- package/dist/calendar/google-connector.d.ts +65 -0
- package/dist/calendar/google-connector.d.ts.map +1 -0
- package/dist/calendar/google-connector.js +129 -0
- package/dist/calendar/google-connector.js.map +1 -0
- package/dist/calendar/ics-connector.d.ts +12 -0
- package/dist/calendar/ics-connector.d.ts.map +1 -0
- package/dist/calendar/ics-connector.js +48 -0
- package/dist/calendar/ics-connector.js.map +1 -0
- package/dist/calendar/proposal-gate.d.ts +84 -0
- package/dist/calendar/proposal-gate.d.ts.map +1 -0
- package/dist/calendar/proposal-gate.js +126 -0
- package/dist/calendar/proposal-gate.js.map +1 -0
- package/dist/calendar/slotter.d.ts +34 -0
- package/dist/calendar/slotter.d.ts.map +1 -0
- package/dist/calendar/slotter.js +196 -0
- package/dist/calendar/slotter.js.map +1 -0
- package/dist/calendar/types.d.ts +162 -0
- package/dist/calendar/types.d.ts.map +1 -0
- package/dist/calendar/types.js +28 -0
- package/dist/calendar/types.js.map +1 -0
- package/dist/chat/chat-session.d.ts +27 -0
- package/dist/chat/chat-session.d.ts.map +1 -1
- package/dist/chat/chat-session.js +101 -1
- package/dist/chat/chat-session.js.map +1 -1
- package/dist/chat/slash-commands.d.ts +6 -2
- package/dist/chat/slash-commands.d.ts.map +1 -1
- package/dist/chat/slash-commands.js +22 -2
- package/dist/chat/slash-commands.js.map +1 -1
- package/dist/chat/turn-classifier.d.ts +3 -0
- package/dist/chat/turn-classifier.d.ts.map +1 -1
- package/dist/chat/turn-classifier.js +7 -0
- package/dist/chat/turn-classifier.js.map +1 -1
- package/dist/cli/commands/calendar.d.ts +75 -0
- package/dist/cli/commands/calendar.d.ts.map +1 -0
- package/dist/cli/commands/calendar.js +203 -0
- package/dist/cli/commands/calendar.js.map +1 -0
- package/dist/cli/commands/do.d.ts +52 -0
- package/dist/cli/commands/do.d.ts.map +1 -0
- package/dist/cli/commands/do.js +216 -0
- package/dist/cli/commands/do.js.map +1 -0
- package/dist/cli/commands/hub.d.ts +29 -0
- package/dist/cli/commands/hub.d.ts.map +1 -0
- package/dist/cli/commands/hub.js +233 -0
- package/dist/cli/commands/hub.js.map +1 -0
- package/dist/cli/commands/medical.d.ts +25 -0
- package/dist/cli/commands/medical.d.ts.map +1 -1
- package/dist/cli/commands/medical.js +233 -0
- package/dist/cli/commands/medical.js.map +1 -1
- package/dist/cli/commands/research.d.ts +41 -0
- package/dist/cli/commands/research.d.ts.map +1 -0
- package/dist/cli/commands/research.js +313 -0
- package/dist/cli/commands/research.js.map +1 -0
- package/dist/cli/commands/security-audit.d.ts +89 -0
- package/dist/cli/commands/security-audit.d.ts.map +1 -0
- package/dist/cli/commands/security-audit.js +238 -0
- package/dist/cli/commands/security-audit.js.map +1 -0
- package/dist/cli/commands/task.d.ts +64 -0
- package/dist/cli/commands/task.d.ts.map +1 -0
- package/dist/cli/commands/task.js +422 -0
- package/dist/cli/commands/task.js.map +1 -0
- package/dist/cli/commands/telegram.d.ts +10 -0
- package/dist/cli/commands/telegram.d.ts.map +1 -0
- package/dist/cli/commands/telegram.js +44 -0
- package/dist/cli/commands/telegram.js.map +1 -0
- package/dist/cli/commands/vault.d.ts +40 -0
- package/dist/cli/commands/vault.d.ts.map +1 -0
- package/dist/cli/commands/vault.js +122 -0
- package/dist/cli/commands/vault.js.map +1 -0
- package/dist/cli/index.js +33 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/role-providers.d.ts +15 -0
- package/dist/config/role-providers.d.ts.map +1 -1
- package/dist/config/role-providers.js +8 -1
- package/dist/config/role-providers.js.map +1 -1
- package/dist/config/schema.d.ts +3522 -171
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +405 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/do-bridge/coding-promoter.d.ts +19 -0
- package/dist/do-bridge/coding-promoter.d.ts.map +1 -0
- package/dist/do-bridge/coding-promoter.js +43 -0
- package/dist/do-bridge/coding-promoter.js.map +1 -0
- package/dist/do-bridge/finding-port.d.ts +88 -0
- package/dist/do-bridge/finding-port.d.ts.map +1 -0
- package/dist/do-bridge/finding-port.js +95 -0
- package/dist/do-bridge/finding-port.js.map +1 -0
- package/dist/do-bridge/launcher.d.ts +55 -0
- package/dist/do-bridge/launcher.d.ts.map +1 -0
- package/dist/do-bridge/launcher.js +37 -0
- package/dist/do-bridge/launcher.js.map +1 -0
- package/dist/do-bridge/promote.d.ts +50 -0
- package/dist/do-bridge/promote.d.ts.map +1 -0
- package/dist/do-bridge/promote.js +116 -0
- package/dist/do-bridge/promote.js.map +1 -0
- package/dist/do-bridge/reconcile.d.ts +50 -0
- package/dist/do-bridge/reconcile.d.ts.map +1 -0
- package/dist/do-bridge/reconcile.js +70 -0
- package/dist/do-bridge/reconcile.js.map +1 -0
- package/dist/do-bridge/registry.d.ts +23 -0
- package/dist/do-bridge/registry.d.ts.map +1 -0
- package/dist/do-bridge/registry.js +42 -0
- package/dist/do-bridge/registry.js.map +1 -0
- package/dist/do-bridge/types.d.ts +50 -0
- package/dist/do-bridge/types.d.ts.map +1 -0
- package/dist/do-bridge/types.js +17 -0
- package/dist/do-bridge/types.js.map +1 -0
- package/dist/fleet/child-config.d.ts.map +1 -1
- package/dist/fleet/child-config.js +7 -0
- package/dist/fleet/child-config.js.map +1 -1
- package/dist/fleet/coordinator.d.ts +27 -1
- package/dist/fleet/coordinator.d.ts.map +1 -1
- package/dist/fleet/coordinator.js +70 -0
- package/dist/fleet/coordinator.js.map +1 -1
- package/dist/fleet/critic-deep.d.ts +9 -1
- package/dist/fleet/critic-deep.d.ts.map +1 -1
- package/dist/fleet/critic-deep.js +5 -2
- package/dist/fleet/critic-deep.js.map +1 -1
- package/dist/fleet/decomposer-deep.d.ts +4 -11
- package/dist/fleet/decomposer-deep.d.ts.map +1 -1
- package/dist/fleet/decomposer-deep.js +5 -5
- package/dist/fleet/decomposer-deep.js.map +1 -1
- package/dist/fleet/index.d.ts +9 -0
- package/dist/fleet/index.d.ts.map +1 -1
- package/dist/fleet/index.js +87 -8
- package/dist/fleet/index.js.map +1 -1
- package/dist/fleet/manifest.d.ts +26 -0
- package/dist/fleet/manifest.d.ts.map +1 -1
- package/dist/fleet/manifest.js +8 -0
- package/dist/fleet/manifest.js.map +1 -1
- package/dist/fleet/reporter.d.ts +4 -1
- package/dist/fleet/reporter.d.ts.map +1 -1
- package/dist/fleet/reporter.js +2 -1
- package/dist/fleet/reporter.js.map +1 -1
- package/dist/fleet/scaffolder.d.ts +5 -1
- package/dist/fleet/scaffolder.d.ts.map +1 -1
- package/dist/fleet/scaffolder.js +11 -2
- package/dist/fleet/scaffolder.js.map +1 -1
- package/dist/graph/client.d.ts.map +1 -1
- package/dist/graph/client.js +115 -23
- package/dist/graph/client.js.map +1 -1
- package/dist/graph/mcp-client.d.ts +1 -0
- package/dist/graph/mcp-client.d.ts.map +1 -1
- package/dist/graph/mcp-client.js +58 -7
- package/dist/graph/mcp-client.js.map +1 -1
- package/dist/hub/collector.d.ts +12 -0
- package/dist/hub/collector.d.ts.map +1 -0
- package/dist/hub/collector.js +36 -0
- package/dist/hub/collector.js.map +1 -0
- package/dist/hub/finding-source.d.ts +22 -0
- package/dist/hub/finding-source.d.ts.map +1 -0
- package/dist/hub/finding-source.js +41 -0
- package/dist/hub/finding-source.js.map +1 -0
- package/dist/hub/finding-store.d.ts +68 -0
- package/dist/hub/finding-store.d.ts.map +1 -0
- package/dist/hub/finding-store.js +122 -0
- package/dist/hub/finding-store.js.map +1 -0
- package/dist/hub/finding.d.ts +54 -0
- package/dist/hub/finding.d.ts.map +1 -0
- package/dist/hub/finding.js +24 -0
- package/dist/hub/finding.js.map +1 -0
- package/dist/hub/gmail-to-task.d.ts +69 -0
- package/dist/hub/gmail-to-task.d.ts.map +1 -0
- package/dist/hub/gmail-to-task.js +102 -0
- package/dist/hub/gmail-to-task.js.map +1 -0
- package/dist/hub/hub-config.d.ts +18 -0
- package/dist/hub/hub-config.d.ts.map +1 -0
- package/dist/hub/hub-config.js +40 -0
- package/dist/hub/hub-config.js.map +1 -0
- package/dist/hub/judge.d.ts +30 -0
- package/dist/hub/judge.d.ts.map +1 -0
- package/dist/hub/judge.js +177 -0
- package/dist/hub/judge.js.map +1 -0
- package/dist/hub/lenses.d.ts +60 -0
- package/dist/hub/lenses.d.ts.map +1 -0
- package/dist/hub/lenses.js +123 -0
- package/dist/hub/lenses.js.map +1 -0
- package/dist/hub/priority-md.d.ts +21 -0
- package/dist/hub/priority-md.d.ts.map +1 -0
- package/dist/hub/priority-md.js +64 -0
- package/dist/hub/priority-md.js.map +1 -0
- package/dist/hub/repo-resolver.d.ts +11 -0
- package/dist/hub/repo-resolver.d.ts.map +1 -0
- package/dist/hub/repo-resolver.js +39 -0
- package/dist/hub/repo-resolver.js.map +1 -0
- package/dist/hub/scope.d.ts +39 -0
- package/dist/hub/scope.d.ts.map +1 -0
- package/dist/hub/scope.js +62 -0
- package/dist/hub/scope.js.map +1 -0
- package/dist/hub/task-inbox.d.ts +16 -0
- package/dist/hub/task-inbox.d.ts.map +1 -0
- package/dist/hub/task-inbox.js +39 -0
- package/dist/hub/task-inbox.js.map +1 -0
- package/dist/incident/resolution-verify.d.ts +2 -2
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/medical/adapters/apple-health.js +1 -1
- package/dist/medical/adapters/apple-health.js.map +1 -1
- package/dist/medical/analysis/cadence.d.ts +32 -0
- package/dist/medical/analysis/cadence.d.ts.map +1 -0
- package/dist/medical/analysis/cadence.js +72 -0
- package/dist/medical/analysis/cadence.js.map +1 -0
- package/dist/medical/analysis/cross-marker.d.ts +33 -0
- package/dist/medical/analysis/cross-marker.d.ts.map +1 -0
- package/dist/medical/analysis/cross-marker.js +79 -0
- package/dist/medical/analysis/cross-marker.js.map +1 -0
- package/dist/medical/analysis/finding-writer.d.ts +26 -0
- package/dist/medical/analysis/finding-writer.d.ts.map +1 -0
- package/dist/medical/analysis/finding-writer.js +60 -0
- package/dist/medical/analysis/finding-writer.js.map +1 -0
- package/dist/medical/analysis/finding.d.ts +63 -0
- package/dist/medical/analysis/finding.d.ts.map +1 -0
- package/dist/medical/analysis/finding.js +70 -0
- package/dist/medical/analysis/finding.js.map +1 -0
- package/dist/medical/analysis/review-pass.d.ts +76 -0
- package/dist/medical/analysis/review-pass.d.ts.map +1 -0
- package/dist/medical/analysis/review-pass.js +119 -0
- package/dist/medical/analysis/review-pass.js.map +1 -0
- package/dist/medical/analysis/trends.d.ts +36 -0
- package/dist/medical/analysis/trends.d.ts.map +1 -0
- package/dist/medical/analysis/trends.js +157 -0
- package/dist/medical/analysis/trends.js.map +1 -0
- package/dist/medical/health-store.d.ts +5 -0
- package/dist/medical/health-store.d.ts.map +1 -1
- package/dist/medical/health-store.js +10 -0
- package/dist/medical/health-store.js.map +1 -1
- package/dist/medical/lab-note.d.ts +72 -0
- package/dist/medical/lab-note.d.ts.map +1 -0
- package/dist/medical/lab-note.js +161 -0
- package/dist/medical/lab-note.js.map +1 -0
- package/dist/medical/lab-pdf-parser.d.ts +19 -0
- package/dist/medical/lab-pdf-parser.d.ts.map +1 -0
- package/dist/medical/lab-pdf-parser.js +57 -0
- package/dist/medical/lab-pdf-parser.js.map +1 -0
- package/dist/medical/lab-reindex.d.ts +24 -0
- package/dist/medical/lab-reindex.d.ts.map +1 -0
- package/dist/medical/lab-reindex.js +45 -0
- package/dist/medical/lab-reindex.js.map +1 -0
- package/dist/medical/lab-types.d.ts +75 -0
- package/dist/medical/lab-types.d.ts.map +1 -0
- package/dist/medical/lab-types.js +17 -0
- package/dist/medical/lab-types.js.map +1 -0
- package/dist/medical/profile.d.ts +96 -0
- package/dist/medical/profile.d.ts.map +1 -0
- package/dist/medical/profile.js +273 -0
- package/dist/medical/profile.js.map +1 -0
- package/dist/medical/recommend/context.d.ts +48 -0
- package/dist/medical/recommend/context.d.ts.map +1 -0
- package/dist/medical/recommend/context.js +109 -0
- package/dist/medical/recommend/context.js.map +1 -0
- package/dist/medical/recommend/judge-panel.d.ts +49 -0
- package/dist/medical/recommend/judge-panel.d.ts.map +1 -0
- package/dist/medical/recommend/judge-panel.js +164 -0
- package/dist/medical/recommend/judge-panel.js.map +1 -0
- package/dist/medical/recommend/lenses.d.ts +72 -0
- package/dist/medical/recommend/lenses.d.ts.map +1 -0
- package/dist/medical/recommend/lenses.js +220 -0
- package/dist/medical/recommend/lenses.js.map +1 -0
- package/dist/medical/recommend/recommend.d.ts +86 -0
- package/dist/medical/recommend/recommend.d.ts.map +1 -0
- package/dist/medical/recommend/recommend.js +211 -0
- package/dist/medical/recommend/recommend.js.map +1 -0
- package/dist/medical/recommend/types.d.ts +98 -0
- package/dist/medical/recommend/types.d.ts.map +1 -0
- package/dist/medical/recommend/types.js +20 -0
- package/dist/medical/recommend/types.js.map +1 -0
- package/dist/medical/recommend/urgency.d.ts +26 -0
- package/dist/medical/recommend/urgency.d.ts.map +1 -0
- package/dist/medical/recommend/urgency.js +124 -0
- package/dist/medical/recommend/urgency.js.map +1 -0
- package/dist/medical/research/online-research.d.ts +65 -0
- package/dist/medical/research/online-research.d.ts.map +1 -0
- package/dist/medical/research/online-research.js +101 -0
- package/dist/medical/research/online-research.js.map +1 -0
- package/dist/medical/research/research-note.d.ts +32 -0
- package/dist/medical/research/research-note.d.ts.map +1 -0
- package/dist/medical/research/research-note.js +55 -0
- package/dist/medical/research/research-note.js.map +1 -0
- package/dist/medical/supplements.d.ts +82 -0
- package/dist/medical/supplements.d.ts.map +1 -0
- package/dist/medical/supplements.js +173 -0
- package/dist/medical/supplements.js.map +1 -0
- package/dist/orchestrator/agentic-loop.d.ts +160 -1
- package/dist/orchestrator/agentic-loop.d.ts.map +1 -1
- package/dist/orchestrator/agentic-loop.js +350 -41
- package/dist/orchestrator/agentic-loop.js.map +1 -1
- package/dist/orchestrator/compaction.d.ts +47 -0
- package/dist/orchestrator/compaction.d.ts.map +1 -0
- package/dist/orchestrator/compaction.js +75 -0
- package/dist/orchestrator/compaction.js.map +1 -0
- package/dist/orchestrator/generator-agent.d.ts +19 -0
- package/dist/orchestrator/generator-agent.d.ts.map +1 -1
- package/dist/orchestrator/generator-agent.js +27 -1
- package/dist/orchestrator/generator-agent.js.map +1 -1
- package/dist/orchestrator/loop-events.d.ts +98 -0
- package/dist/orchestrator/loop-events.d.ts.map +1 -0
- package/dist/orchestrator/loop-events.js +2 -0
- package/dist/orchestrator/loop-events.js.map +1 -0
- package/dist/orchestrator/model-resolver.d.ts.map +1 -1
- package/dist/orchestrator/model-resolver.js +10 -6
- package/dist/orchestrator/model-resolver.js.map +1 -1
- package/dist/orchestrator/pipeline.d.ts +10 -1
- package/dist/orchestrator/pipeline.d.ts.map +1 -1
- package/dist/orchestrator/pipeline.js +102 -4
- package/dist/orchestrator/pipeline.js.map +1 -1
- package/dist/orchestrator/security-audit-types.d.ts +53 -0
- package/dist/orchestrator/security-audit-types.d.ts.map +1 -0
- package/dist/orchestrator/security-audit-types.js +10 -0
- package/dist/orchestrator/security-audit-types.js.map +1 -0
- package/dist/orchestrator/security-auditor-agent.d.ts +68 -0
- package/dist/orchestrator/security-auditor-agent.d.ts.map +1 -0
- package/dist/orchestrator/security-auditor-agent.js +482 -0
- package/dist/orchestrator/security-auditor-agent.js.map +1 -0
- package/dist/orchestrator/security-gate.d.ts +73 -0
- package/dist/orchestrator/security-gate.d.ts.map +1 -0
- package/dist/orchestrator/security-gate.js +174 -0
- package/dist/orchestrator/security-gate.js.map +1 -0
- package/dist/orchestrator/security-hub.d.ts +45 -0
- package/dist/orchestrator/security-hub.d.ts.map +1 -0
- package/dist/orchestrator/security-hub.js +147 -0
- package/dist/orchestrator/security-hub.js.map +1 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.d.ts +43 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.js +13 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.js.map +1 -0
- package/dist/orchestrator/security-knowledge/diff-provider.d.ts +79 -0
- package/dist/orchestrator/security-knowledge/diff-provider.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/diff-provider.js +320 -0
- package/dist/orchestrator/security-knowledge/diff-provider.js.map +1 -0
- package/dist/orchestrator/security-knowledge/index.d.ts +22 -0
- package/dist/orchestrator/security-knowledge/index.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/index.js +66 -0
- package/dist/orchestrator/security-knowledge/index.js.map +1 -0
- package/dist/orchestrator/security-knowledge/parser.d.ts +9 -0
- package/dist/orchestrator/security-knowledge/parser.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/parser.js +137 -0
- package/dist/orchestrator/security-knowledge/parser.js.map +1 -0
- package/dist/orchestrator/security-knowledge/registry.d.ts +25 -0
- package/dist/orchestrator/security-knowledge/registry.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/registry.js +114 -0
- package/dist/orchestrator/security-knowledge/registry.js.map +1 -0
- package/dist/orchestrator/security-knowledge/resolver.d.ts +48 -0
- package/dist/orchestrator/security-knowledge/resolver.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/resolver.js +63 -0
- package/dist/orchestrator/security-knowledge/resolver.js.map +1 -0
- package/dist/orchestrator/security-knowledge/selector.d.ts +18 -0
- package/dist/orchestrator/security-knowledge/selector.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/selector.js +46 -0
- package/dist/orchestrator/security-knowledge/selector.js.map +1 -0
- package/dist/orchestrator/security-knowledge/signature.d.ts +37 -0
- package/dist/orchestrator/security-knowledge/signature.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/signature.js +2 -0
- package/dist/orchestrator/security-knowledge/signature.js.map +1 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.d.ts +29 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.js +211 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.js.map +1 -0
- package/dist/orchestrator/security-scanners.d.ts +126 -0
- package/dist/orchestrator/security-scanners.d.ts.map +1 -0
- package/dist/orchestrator/security-scanners.js +501 -0
- package/dist/orchestrator/security-scanners.js.map +1 -0
- package/dist/orchestrator/security-verifier-agent.d.ts +62 -0
- package/dist/orchestrator/security-verifier-agent.d.ts.map +1 -0
- package/dist/orchestrator/security-verifier-agent.js +230 -0
- package/dist/orchestrator/security-verifier-agent.js.map +1 -0
- package/dist/orchestrator/session-store.d.ts +95 -0
- package/dist/orchestrator/session-store.d.ts.map +1 -0
- package/dist/orchestrator/session-store.js +186 -0
- package/dist/orchestrator/session-store.js.map +1 -0
- package/dist/orchestrator/stack-knowledge.d.ts +17 -0
- package/dist/orchestrator/stack-knowledge.d.ts.map +1 -0
- package/dist/orchestrator/stack-knowledge.js +35 -0
- package/dist/orchestrator/stack-knowledge.js.map +1 -0
- package/dist/orchestrator/subagents.d.ts +62 -0
- package/dist/orchestrator/subagents.d.ts.map +1 -0
- package/dist/orchestrator/subagents.js +143 -0
- package/dist/orchestrator/subagents.js.map +1 -0
- package/dist/orchestrator/tools/executor.d.ts +68 -0
- package/dist/orchestrator/tools/executor.d.ts.map +1 -0
- package/dist/orchestrator/tools/executor.js +104 -0
- package/dist/orchestrator/tools/executor.js.map +1 -0
- package/dist/orchestrator/tools/mcp-bridge.d.ts +76 -0
- package/dist/orchestrator/tools/mcp-bridge.d.ts.map +1 -0
- package/dist/orchestrator/tools/mcp-bridge.js +154 -0
- package/dist/orchestrator/tools/mcp-bridge.js.map +1 -0
- package/dist/orchestrator/tools/schemas.d.ts.map +1 -1
- package/dist/orchestrator/tools/schemas.js +3 -0
- package/dist/orchestrator/tools/schemas.js.map +1 -1
- package/dist/orchestrator/workflow/budget.d.ts +24 -2
- package/dist/orchestrator/workflow/budget.d.ts.map +1 -1
- package/dist/orchestrator/workflow/budget.js +39 -1
- package/dist/orchestrator/workflow/budget.js.map +1 -1
- package/dist/orchestrator/workflow/engine.d.ts +1 -1
- package/dist/orchestrator/workflow/engine.d.ts.map +1 -1
- package/dist/orchestrator/workflow/selector.d.ts.map +1 -1
- package/dist/orchestrator/workflow/selector.js +10 -0
- package/dist/orchestrator/workflow/selector.js.map +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +116 -26
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/claude-code.d.ts.map +1 -1
- package/dist/providers/claude-code.js +17 -0
- package/dist/providers/claude-code.js.map +1 -1
- package/dist/providers/cost-meter.d.ts +52 -0
- package/dist/providers/cost-meter.d.ts.map +1 -0
- package/dist/providers/cost-meter.js +81 -0
- package/dist/providers/cost-meter.js.map +1 -0
- package/dist/providers/factory.d.ts +6 -1
- package/dist/providers/factory.d.ts.map +1 -1
- package/dist/providers/factory.js +24 -5
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/google.d.ts.map +1 -1
- package/dist/providers/google.js +29 -0
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/grounded-search.d.ts +128 -0
- package/dist/providers/grounded-search.d.ts.map +1 -0
- package/dist/providers/grounded-search.js +160 -0
- package/dist/providers/grounded-search.js.map +1 -0
- package/dist/providers/openai-compat.d.ts +15 -1
- package/dist/providers/openai-compat.d.ts.map +1 -1
- package/dist/providers/openai-compat.js +24 -0
- package/dist/providers/openai-compat.js.map +1 -1
- package/dist/providers/openai.d.ts +7 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +95 -4
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/types.d.ts +88 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/research/cadence.d.ts +33 -0
- package/dist/research/cadence.d.ts.map +1 -0
- package/dist/research/cadence.js +55 -0
- package/dist/research/cadence.js.map +1 -0
- package/dist/research/digest.d.ts +80 -0
- package/dist/research/digest.d.ts.map +1 -0
- package/dist/research/digest.js +119 -0
- package/dist/research/digest.js.map +1 -0
- package/dist/research/egress.d.ts +28 -0
- package/dist/research/egress.d.ts.map +1 -0
- package/dist/research/egress.js +41 -0
- package/dist/research/egress.js.map +1 -0
- package/dist/research/job-store.d.ts +30 -0
- package/dist/research/job-store.d.ts.map +1 -0
- package/dist/research/job-store.js +100 -0
- package/dist/research/job-store.js.map +1 -0
- package/dist/research/model-diversity.d.ts +27 -0
- package/dist/research/model-diversity.d.ts.map +1 -0
- package/dist/research/model-diversity.js +52 -0
- package/dist/research/model-diversity.js.map +1 -0
- package/dist/research/note-writer.d.ts +36 -0
- package/dist/research/note-writer.d.ts.map +1 -0
- package/dist/research/note-writer.js +53 -0
- package/dist/research/note-writer.js.map +1 -0
- package/dist/research/online-retrieval.d.ts +27 -0
- package/dist/research/online-retrieval.d.ts.map +1 -0
- package/dist/research/online-retrieval.js +22 -0
- package/dist/research/online-retrieval.js.map +1 -0
- package/dist/research/runner.d.ts +80 -0
- package/dist/research/runner.d.ts.map +1 -0
- package/dist/research/runner.js +115 -0
- package/dist/research/runner.js.map +1 -0
- package/dist/research/scheduler.d.ts +61 -0
- package/dist/research/scheduler.d.ts.map +1 -0
- package/dist/research/scheduler.js +58 -0
- package/dist/research/scheduler.js.map +1 -0
- package/dist/research/types.d.ts +81 -0
- package/dist/research/types.d.ts.map +1 -0
- package/dist/research/types.js +57 -0
- package/dist/research/types.js.map +1 -0
- package/dist/seo/adapters/http.d.ts +43 -0
- package/dist/seo/adapters/http.d.ts.map +1 -0
- package/dist/seo/adapters/http.js +35 -0
- package/dist/seo/adapters/http.js.map +1 -0
- package/dist/seo/ai-visibility-provider.d.ts +171 -0
- package/dist/seo/ai-visibility-provider.d.ts.map +1 -0
- package/dist/seo/ai-visibility-provider.js +165 -0
- package/dist/seo/ai-visibility-provider.js.map +1 -0
- package/dist/seo/ai-visibility-scorer.d.ts +43 -0
- package/dist/seo/ai-visibility-scorer.d.ts.map +1 -0
- package/dist/seo/ai-visibility-scorer.js +102 -0
- package/dist/seo/ai-visibility-scorer.js.map +1 -0
- package/dist/seo/analyzer.d.ts +58 -0
- package/dist/seo/analyzer.d.ts.map +1 -0
- package/dist/seo/analyzer.js +265 -0
- package/dist/seo/analyzer.js.map +1 -0
- package/dist/seo/benchmark/harness.d.ts +56 -0
- package/dist/seo/benchmark/harness.d.ts.map +1 -0
- package/dist/seo/benchmark/harness.js +172 -0
- package/dist/seo/benchmark/harness.js.map +1 -0
- package/dist/seo/builder/approved-finding.d.ts +115 -0
- package/dist/seo/builder/approved-finding.d.ts.map +1 -0
- package/dist/seo/builder/approved-finding.js +145 -0
- package/dist/seo/builder/approved-finding.js.map +1 -0
- package/dist/seo/builder/build-runner.d.ts +41 -0
- package/dist/seo/builder/build-runner.d.ts.map +1 -0
- package/dist/seo/builder/build-runner.js +156 -0
- package/dist/seo/builder/build-runner.js.map +1 -0
- package/dist/seo/builder/draft-generators.d.ts +32 -0
- package/dist/seo/builder/draft-generators.d.ts.map +1 -0
- package/dist/seo/builder/draft-generators.js +31 -0
- package/dist/seo/builder/draft-generators.js.map +1 -0
- package/dist/seo/builder/draft-store.d.ts +30 -0
- package/dist/seo/builder/draft-store.d.ts.map +1 -0
- package/dist/seo/builder/draft-store.js +76 -0
- package/dist/seo/builder/draft-store.js.map +1 -0
- package/dist/seo/builder/draft-types.d.ts +36 -0
- package/dist/seo/builder/draft-types.d.ts.map +1 -0
- package/dist/seo/builder/draft-types.js +14 -0
- package/dist/seo/builder/draft-types.js.map +1 -0
- package/dist/seo/builder/hub-approved-source.d.ts +11 -0
- package/dist/seo/builder/hub-approved-source.d.ts.map +1 -0
- package/dist/seo/builder/hub-approved-source.js +48 -0
- package/dist/seo/builder/hub-approved-source.js.map +1 -0
- package/dist/seo/builder/seo-builder.d.ts +72 -0
- package/dist/seo/builder/seo-builder.d.ts.map +1 -0
- package/dist/seo/builder/seo-builder.js +72 -0
- package/dist/seo/builder/seo-builder.js.map +1 -0
- package/dist/seo/citation-gate.d.ts +36 -0
- package/dist/seo/citation-gate.d.ts.map +1 -0
- package/dist/seo/citation-gate.js +59 -0
- package/dist/seo/citation-gate.js.map +1 -0
- package/dist/seo/command.d.ts +11 -0
- package/dist/seo/command.d.ts.map +1 -0
- package/dist/seo/command.js +90 -0
- package/dist/seo/command.js.map +1 -0
- package/dist/seo/content-sanitizer.d.ts +56 -0
- package/dist/seo/content-sanitizer.d.ts.map +1 -0
- package/dist/seo/content-sanitizer.js +55 -0
- package/dist/seo/content-sanitizer.js.map +1 -0
- package/dist/seo/crawl-engine.d.ts +35 -0
- package/dist/seo/crawl-engine.d.ts.map +1 -0
- package/dist/seo/crawl-engine.js +2 -0
- package/dist/seo/crawl-engine.js.map +1 -0
- package/dist/seo/data-source.d.ts +156 -0
- package/dist/seo/data-source.d.ts.map +1 -0
- package/dist/seo/data-source.js +2 -0
- package/dist/seo/data-source.js.map +1 -0
- package/dist/seo/egress.d.ts +39 -0
- package/dist/seo/egress.d.ts.map +1 -0
- package/dist/seo/egress.js +64 -0
- package/dist/seo/egress.js.map +1 -0
- package/dist/seo/hub-emitter.d.ts +28 -0
- package/dist/seo/hub-emitter.d.ts.map +1 -0
- package/dist/seo/hub-emitter.js +95 -0
- package/dist/seo/hub-emitter.js.map +1 -0
- package/dist/seo/index.d.ts +42 -0
- package/dist/seo/index.d.ts.map +1 -0
- package/dist/seo/index.js +19 -0
- package/dist/seo/index.js.map +1 -0
- package/dist/seo/never-encode-filter.d.ts +45 -0
- package/dist/seo/never-encode-filter.d.ts.map +1 -0
- package/dist/seo/never-encode-filter.js +51 -0
- package/dist/seo/never-encode-filter.js.map +1 -0
- package/dist/seo/parser.d.ts +46 -0
- package/dist/seo/parser.d.ts.map +1 -0
- package/dist/seo/parser.js +113 -0
- package/dist/seo/parser.js.map +1 -0
- package/dist/seo/playbook-index.d.ts +19 -0
- package/dist/seo/playbook-index.d.ts.map +1 -0
- package/dist/seo/playbook-index.js +74 -0
- package/dist/seo/playbook-index.js.map +1 -0
- package/dist/seo/quota-governor.d.ts +100 -0
- package/dist/seo/quota-governor.d.ts.map +1 -0
- package/dist/seo/quota-governor.js +199 -0
- package/dist/seo/quota-governor.js.map +1 -0
- package/dist/seo/quota-ledger.d.ts +50 -0
- package/dist/seo/quota-ledger.d.ts.map +1 -0
- package/dist/seo/quota-ledger.js +95 -0
- package/dist/seo/quota-ledger.js.map +1 -0
- package/dist/seo/report-store.d.ts +30 -0
- package/dist/seo/report-store.d.ts.map +1 -0
- package/dist/seo/report-store.js +94 -0
- package/dist/seo/report-store.js.map +1 -0
- package/dist/seo/retriever.d.ts +34 -0
- package/dist/seo/retriever.d.ts.map +1 -0
- package/dist/seo/retriever.js +95 -0
- package/dist/seo/retriever.js.map +1 -0
- package/dist/seo/runner.d.ts +108 -0
- package/dist/seo/runner.d.ts.map +1 -0
- package/dist/seo/runner.js +512 -0
- package/dist/seo/runner.js.map +1 -0
- package/dist/seo/scrape-throttle.d.ts +84 -0
- package/dist/seo/scrape-throttle.d.ts.map +1 -0
- package/dist/seo/scrape-throttle.js +149 -0
- package/dist/seo/scrape-throttle.js.map +1 -0
- package/dist/seo/serp-provider.d.ts +52 -0
- package/dist/seo/serp-provider.d.ts.map +1 -0
- package/dist/seo/serp-provider.js +17 -0
- package/dist/seo/serp-provider.js.map +1 -0
- package/dist/seo/sources/ai-visibility-adapter.d.ts +87 -0
- package/dist/seo/sources/ai-visibility-adapter.d.ts.map +1 -0
- package/dist/seo/sources/ai-visibility-adapter.js +85 -0
- package/dist/seo/sources/ai-visibility-adapter.js.map +1 -0
- package/dist/seo/sources/api-spine-provider.d.ts +66 -0
- package/dist/seo/sources/api-spine-provider.d.ts.map +1 -0
- package/dist/seo/sources/api-spine-provider.js +68 -0
- package/dist/seo/sources/api-spine-provider.js.map +1 -0
- package/dist/seo/sources/citation-verifier.d.ts +95 -0
- package/dist/seo/sources/citation-verifier.d.ts.map +1 -0
- package/dist/seo/sources/citation-verifier.js +106 -0
- package/dist/seo/sources/citation-verifier.js.map +1 -0
- package/dist/seo/sources/crawl-source.d.ts +62 -0
- package/dist/seo/sources/crawl-source.d.ts.map +1 -0
- package/dist/seo/sources/crawl-source.js +87 -0
- package/dist/seo/sources/crawl-source.js.map +1 -0
- package/dist/seo/sources/damcrawler-crawl-engine.d.ts +151 -0
- package/dist/seo/sources/damcrawler-crawl-engine.d.ts.map +1 -0
- package/dist/seo/sources/damcrawler-crawl-engine.js +154 -0
- package/dist/seo/sources/damcrawler-crawl-engine.js.map +1 -0
- package/dist/seo/sources/damcrawler-serp-provider.d.ts +75 -0
- package/dist/seo/sources/damcrawler-serp-provider.d.ts.map +1 -0
- package/dist/seo/sources/damcrawler-serp-provider.js +60 -0
- package/dist/seo/sources/damcrawler-serp-provider.js.map +1 -0
- package/dist/seo/sources/dataforseo-adapter.d.ts +46 -0
- package/dist/seo/sources/dataforseo-adapter.d.ts.map +1 -0
- package/dist/seo/sources/dataforseo-adapter.js +335 -0
- package/dist/seo/sources/dataforseo-adapter.js.map +1 -0
- package/dist/seo/sources/dataforseo-serp-provider.d.ts +30 -0
- package/dist/seo/sources/dataforseo-serp-provider.d.ts.map +1 -0
- package/dist/seo/sources/dataforseo-serp-provider.js +20 -0
- package/dist/seo/sources/dataforseo-serp-provider.js.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.d.ts +62 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.d.ts.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.js +72 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.js.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.d.ts +10 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.d.ts.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.js +72 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.js.map +1 -0
- package/dist/seo/sources/gsc-adapter.d.ts +64 -0
- package/dist/seo/sources/gsc-adapter.d.ts.map +1 -0
- package/dist/seo/sources/gsc-adapter.js +221 -0
- package/dist/seo/sources/gsc-adapter.js.map +1 -0
- package/dist/seo/sources/local-export.d.ts +53 -0
- package/dist/seo/sources/local-export.d.ts.map +1 -0
- package/dist/seo/sources/local-export.js +307 -0
- package/dist/seo/sources/local-export.js.map +1 -0
- package/dist/seo/sources/mention-citation-extractor.d.ts +136 -0
- package/dist/seo/sources/mention-citation-extractor.d.ts.map +1 -0
- package/dist/seo/sources/mention-citation-extractor.js +272 -0
- package/dist/seo/sources/mention-citation-extractor.js.map +1 -0
- package/dist/seo/sources/scrape-arm-provider.d.ts +109 -0
- package/dist/seo/sources/scrape-arm-provider.d.ts.map +1 -0
- package/dist/seo/sources/scrape-arm-provider.js +129 -0
- package/dist/seo/sources/scrape-arm-provider.js.map +1 -0
- package/dist/seo/tracked-prompt-store.d.ts +33 -0
- package/dist/seo/tracked-prompt-store.d.ts.map +1 -0
- package/dist/seo/tracked-prompt-store.js +68 -0
- package/dist/seo/tracked-prompt-store.js.map +1 -0
- package/dist/seo/types.d.ts +128 -0
- package/dist/seo/types.d.ts.map +1 -0
- package/dist/seo/types.js +14 -0
- package/dist/seo/types.js.map +1 -0
- package/dist/seo/verifier.d.ts +34 -0
- package/dist/seo/verifier.d.ts.map +1 -0
- package/dist/seo/verifier.js +204 -0
- package/dist/seo/verifier.js.map +1 -0
- package/dist/seo/workflow-capabilities.d.ts +26 -0
- package/dist/seo/workflow-capabilities.d.ts.map +1 -0
- package/dist/seo/workflow-capabilities.js +12 -0
- package/dist/seo/workflow-capabilities.js.map +1 -0
- package/dist/state/facts.d.ts +5 -1
- package/dist/state/facts.d.ts.map +1 -1
- package/dist/state/facts.js +29 -19
- package/dist/state/facts.js.map +1 -1
- package/dist/state/index.d.ts +1 -1
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +1 -1
- package/dist/state/index.js.map +1 -1
- package/dist/state/outline-state.d.ts +0 -12
- package/dist/state/outline-state.d.ts.map +1 -1
- package/dist/state/outline-state.js +1 -18
- package/dist/state/outline-state.js.map +1 -1
- package/dist/state/security-audit-state.d.ts +20 -0
- package/dist/state/security-audit-state.d.ts.map +1 -0
- package/dist/state/security-audit-state.js +59 -0
- package/dist/state/security-audit-state.js.map +1 -0
- package/dist/teams/registry.d.ts.map +1 -1
- package/dist/teams/registry.js +17 -0
- package/dist/teams/registry.js.map +1 -1
- package/dist/telegram/bot.d.ts +137 -0
- package/dist/telegram/bot.d.ts.map +1 -0
- package/dist/telegram/bot.js +323 -0
- package/dist/telegram/bot.js.map +1 -0
- package/dist/telegram/digest.d.ts +19 -0
- package/dist/telegram/digest.d.ts.map +1 -0
- package/dist/telegram/digest.js +23 -0
- package/dist/telegram/digest.js.map +1 -0
- package/dist/telegram/fleet-view.d.ts +38 -0
- package/dist/telegram/fleet-view.d.ts.map +1 -0
- package/dist/telegram/fleet-view.js +98 -0
- package/dist/telegram/fleet-view.js.map +1 -0
- package/dist/telegram/handlers/approvals.d.ts +61 -0
- package/dist/telegram/handlers/approvals.d.ts.map +1 -0
- package/dist/telegram/handlers/approvals.js +122 -0
- package/dist/telegram/handlers/approvals.js.map +1 -0
- package/dist/telegram/handlers/capture.d.ts +43 -0
- package/dist/telegram/handlers/capture.d.ts.map +1 -0
- package/dist/telegram/handlers/capture.js +51 -0
- package/dist/telegram/handlers/capture.js.map +1 -0
- package/dist/telegram/handlers/prioritize.d.ts +50 -0
- package/dist/telegram/handlers/prioritize.d.ts.map +1 -0
- package/dist/telegram/handlers/prioritize.js +99 -0
- package/dist/telegram/handlers/prioritize.js.map +1 -0
- package/dist/telegram/handlers/upload.d.ts +105 -0
- package/dist/telegram/handlers/upload.d.ts.map +1 -0
- package/dist/telegram/handlers/upload.js +149 -0
- package/dist/telegram/handlers/upload.js.map +1 -0
- package/dist/telegram/keyboard.d.ts +48 -0
- package/dist/telegram/keyboard.d.ts.map +1 -0
- package/dist/telegram/keyboard.js +81 -0
- package/dist/telegram/keyboard.js.map +1 -0
- package/dist/telegram/outbound.d.ts +77 -0
- package/dist/telegram/outbound.d.ts.map +1 -0
- package/dist/telegram/outbound.js +45 -0
- package/dist/telegram/outbound.js.map +1 -0
- package/dist/telegram/router.d.ts +46 -0
- package/dist/telegram/router.d.ts.map +1 -0
- package/dist/telegram/router.js +63 -0
- package/dist/telegram/router.js.map +1 -0
- package/dist/telegram/streaming.d.ts +36 -0
- package/dist/telegram/streaming.d.ts.map +1 -0
- package/dist/telegram/streaming.js +55 -0
- package/dist/telegram/streaming.js.map +1 -0
- package/dist/telegram/whitelist.d.ts +20 -0
- package/dist/telegram/whitelist.d.ts.map +1 -0
- package/dist/telegram/whitelist.js +34 -0
- package/dist/telegram/whitelist.js.map +1 -0
- package/dist/utils/git.d.ts +0 -6
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +0 -19
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/vault/conventions.d.ts +23 -0
- package/dist/vault/conventions.d.ts.map +1 -0
- package/dist/vault/conventions.js +22 -0
- package/dist/vault/conventions.js.map +1 -0
- package/dist/vault/frontmatter.d.ts +47 -0
- package/dist/vault/frontmatter.d.ts.map +1 -0
- package/dist/vault/frontmatter.js +149 -0
- package/dist/vault/frontmatter.js.map +1 -0
- package/dist/vault/index-map.d.ts +35 -0
- package/dist/vault/index-map.d.ts.map +1 -0
- package/dist/vault/index-map.js +67 -0
- package/dist/vault/index-map.js.map +1 -0
- package/dist/vault/mcp-adapter.d.ts +96 -0
- package/dist/vault/mcp-adapter.d.ts.map +1 -0
- package/dist/vault/mcp-adapter.js +176 -0
- package/dist/vault/mcp-adapter.js.map +1 -0
- package/dist/vault/note-io.d.ts +29 -0
- package/dist/vault/note-io.d.ts.map +1 -0
- package/dist/vault/note-io.js +44 -0
- package/dist/vault/note-io.js.map +1 -0
- package/dist/vault/profile.d.ts +35 -0
- package/dist/vault/profile.d.ts.map +1 -0
- package/dist/vault/profile.js +50 -0
- package/dist/vault/profile.js.map +1 -0
- package/dist/vault/reindex.d.ts +55 -0
- package/dist/vault/reindex.d.ts.map +1 -0
- package/dist/vault/reindex.js +69 -0
- package/dist/vault/reindex.js.map +1 -0
- package/dist/vault/types.d.ts +25 -0
- package/dist/vault/types.d.ts.map +1 -0
- package/dist/vault/types.js +9 -0
- package/dist/vault/types.js.map +1 -0
- package/package.json +20 -4
- package/scripts/sync-targets.json +2 -1
- package/skills/bober.design/SKILL.md +190 -0
- package/skills/bober.design/references/1-anti-slop.md +102 -0
- package/skills/bober.design/references/2-design-brief.md +84 -0
- package/skills/bober.design/references/3-critique-rubric.md +62 -0
- package/skills/bober.design/references/4-copy-guide.md +43 -0
- package/skills/bober.plan/SKILL.md +15 -1
- package/skills/bober.run/SKILL.md +7 -4
- package/skills/bober.security-anchor/SKILL.md +172 -0
- package/skills/bober.security-audit/SKILL.md +288 -0
- package/skills/bober.security-dex-backend/SKILL.md +306 -0
- package/skills/bober.security-generic/SKILL.md +295 -0
- package/skills/bober.security-igaming/SKILL.md +290 -0
- package/skills/bober.security-node/SKILL.md +267 -0
- package/skills/bober.security-payments/SKILL.md +249 -0
- package/skills/bober.security-react/SKILL.md +194 -0
- package/skills/bober.security-solidity/SKILL.md +306 -0
- package/skills/bober.seo/SKILL.md +132 -0
- package/skills/bober.seo-ai-visibility/SKILL.md +110 -0
- package/skills/bober.seo-content-decay/SKILL.md +99 -0
- package/skills/bober.seo-generic/SKILL.md +173 -0
- package/skills/bober.seo-internal-linking/SKILL.md +87 -0
- package/skills/bober.seo-parasite-watch/SKILL.md +121 -0
- package/skills/bober.seo-rank-track/SKILL.md +98 -0
- package/skills/bober.seo-schema-audit/SKILL.md +97 -0
- package/skills/bober.seo-technical-audit/SKILL.md +113 -0
- package/skills/bober.seo-topical-map/SKILL.md +100 -0
- package/skills/bober.seo-verticals/SKILL.md +133 -0
- package/skills/bober.using-bober/SKILL.md +1 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bober",
|
|
3
3
|
"description": "Generator-Evaluator multi-agent harness for building applications autonomously with Claude",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.19.0",
|
|
5
5
|
"author": { "name": "BOBER3r" },
|
|
6
6
|
"homepage": "https://agentbober.com",
|
|
7
7
|
"repository": "https://github.com/BOBER3r/agent-bober",
|
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.19.0] — 2026-07-26
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **Config bootstrap in plugin / standalone installs**: `bober.plan` and `bober.run` bootstrapped `bober.config.json` by telling the model to reference `src/config/schema.ts` and `src/config/defaults.ts` — source files that are **absent** when the plugin (or a bare `.claude/` copy) runs inside a user's project, so the config was frequently never written and every downstream step failed with a missing-config error. Both skills now embed a self-contained default config inline, make the write step **non-optional** (create-then-adjust rather than ask-and-wait), and no longer depend on the agent-bober source tree.
|
|
15
|
+
- **`run` prerequisites check on plugin installs**: `bober.run` step 1b ran `bash scripts/check-prereqs.sh` and stopped the run if it failed — but that script is not present in a plugin/standalone project, so the run dead-ended. The step now skips gracefully when the script is absent and only enforces it when present.
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
- **Release catch-up to `main`**: first published release since `0.18.0` to include the work merged via [#55](https://github.com/BOBER3r/agent-bober/pull/55) — the cross-domain knowledge platform, medical pipeline, SEO agent/skill suite, stack-aware security auditor, and fleet orchestrator. The npm package and the plugin manifest (`.claude-plugin/plugin.json`) both track `main` at `0.19.0`.
|
|
20
|
+
|
|
10
21
|
## [0.18.0] — 2026-06-23
|
|
11
22
|
|
|
12
23
|
### Fixed
|
package/README.md
CHANGED
|
@@ -55,9 +55,9 @@ agent-bober operates in four modes — pick the one that matches your situation.
|
|
|
55
55
|
|
|
56
56
|
| Mode | When to Use | Entry Point |
|
|
57
57
|
|------|-------------|-------------|
|
|
58
|
-
| **Autopilot** | Feature spikes, greenfield work, no production risk | `bober run` |
|
|
59
|
-
| **Careful-Flow** | Production behavior changes, want checkpoint approval | `bober run --mode careful` |
|
|
60
|
-
| **Diagnose** | Production system is broken right now | `bober incident start` |
|
|
58
|
+
| **Autopilot** | Feature spikes, greenfield work, no production risk | `agent-bober run` |
|
|
59
|
+
| **Careful-Flow** | Production behavior changes, want checkpoint approval | `agent-bober run --mode careful` |
|
|
60
|
+
| **Diagnose** | Production system is broken right now | `agent-bober incident start` |
|
|
61
61
|
| **Postmortem** | After resolving an incident, generate a retrospective | `bober postmortem generate` |
|
|
62
62
|
|
|
63
63
|
---
|
|
@@ -425,7 +425,7 @@ Add to your Windsurf MCP configuration:
|
|
|
425
425
|
|
|
426
426
|
## Brownfield Auto-Discovery
|
|
427
427
|
|
|
428
|
-
When you run `bober init brownfield` (or use the `bober_init` MCP tool with mode=brownfield), agent-bober deeply analyzes your existing codebase and automatically:
|
|
428
|
+
When you run `agent-bober init brownfield` (or use the `bober_init` MCP tool with mode=brownfield), agent-bober deeply analyzes your existing codebase and automatically:
|
|
429
429
|
|
|
430
430
|
### What It Scans
|
|
431
431
|
|
|
@@ -489,6 +489,8 @@ The `/bober-principles` command also triggers auto-discovery when called with no
|
|
|
489
489
|
| `/bober-brownfield` | Existing codebase workflow |
|
|
490
490
|
| `/bober-playwright` | Set up Playwright E2E testing, generate tests, debug failures |
|
|
491
491
|
| `/bober-code-review` | Advisory review of the sprint diff against the contract + anti-pattern catalog |
|
|
492
|
+
| `/bober-security-audit` | On-demand stack-aware security audit of a path (or the working tree) -- spawns the `bober-security-auditor` subagent, presents severity-ranked findings; advisory-only |
|
|
493
|
+
| `/bober-seo` | SEO/GEO suite orchestrator -- routes to the 8 workflows (`bober seo <workflow> [target]`), offline by default, live data behind two default-false egress axes; spawns `bober-seo-strategist`/`bober-seo-verifier` |
|
|
492
494
|
| `/bober-verify` | Verification-before-completion -- run checks and confirm output before claiming success |
|
|
493
495
|
| `/bober-debug` | Systematic debugging -- reproduce, isolate, hypothesize, fix, verify |
|
|
494
496
|
| `/bober-graph` | Manage the code graph index -- init, sync, status (requires tokensave) |
|
|
@@ -501,7 +503,7 @@ The `/bober-principles` command also triggers auto-discovery when called with no
|
|
|
501
503
|
| `/bober-postmortem` | Synthesize an evidence-cited postmortem from incident artifacts |
|
|
502
504
|
| `/bober-using-bober` | Establishes how to find and use bober skills (loaded at conversation start) |
|
|
503
505
|
|
|
504
|
-
> **Preset-aware install:** `bober init <preset>` installs the universal commands above plus only the stack-specific commands matching your preset or mode -- e.g. `/bober-solidity` is added for a `solidity` project, `/bober-react` and `/bober-playwright` for `nextjs`/`react-vite`, and `/bober-brownfield` for an existing codebase. The Claude Code plugin (`/plugin install`) always ships the full set.
|
|
506
|
+
> **Preset-aware install:** `agent-bober init <preset>` installs the universal commands above plus only the stack-specific commands matching your preset or mode -- e.g. `/bober-solidity` is added for a `solidity` project, `/bober-react` and `/bober-playwright` for `nextjs`/`react-vite`, and `/bober-brownfield` for an existing codebase. The Claude Code plugin (`/plugin install`) always ships the full set.
|
|
505
507
|
|
|
506
508
|
### CLI
|
|
507
509
|
|
|
@@ -517,12 +519,13 @@ npx agent-bober run "feature" # Full autonomous loop
|
|
|
517
519
|
npx agent-bober run "feature" --team example # Full autonomous loop using the 'example' team
|
|
518
520
|
npx agent-bober chat # Interactive chat REPL (roster + memory aware)
|
|
519
521
|
npx agent-bober chat example # Interactive chat REPL using the 'example' team
|
|
522
|
+
npx agent-bober chat hub # Priority-hub chat REPL (in-session /priority + /decide)
|
|
520
523
|
npx agent-bober mcp # Start MCP server (Cursor/Windsurf)
|
|
521
524
|
```
|
|
522
525
|
|
|
523
526
|
#### Chat Steer Commands (Phase 2 — mid-flight HITL)
|
|
524
527
|
|
|
525
|
-
Inside the `bober chat` REPL you can steer in-flight runs with these commands:
|
|
528
|
+
Inside the `agent-bober chat` REPL you can steer in-flight runs with these commands:
|
|
526
529
|
|
|
527
530
|
| Command | Description |
|
|
528
531
|
|---|---|
|
|
@@ -572,6 +575,77 @@ npx agent-bober postmortem show <incidentId> # Print retrospective
|
|
|
572
575
|
npx agent-bober playbook list # List all playbooks
|
|
573
576
|
npx agent-bober playbook show <name> # Show playbook content
|
|
574
577
|
npx agent-bober playbook search '<symptom>' # Search by symptom
|
|
578
|
+
|
|
579
|
+
# Medical team (Phase 6)
|
|
580
|
+
npx agent-bober medical import <file> # Stream-import a health export (e.g. Apple Health export.xml)
|
|
581
|
+
npx agent-bober medical import-labs <pdf> # Parse a lab PDF into vault notes + health store (cloud-inference axis; fail-closed off)
|
|
582
|
+
npx agent-bober medical supplements add <name> [--dose <d>] # Record a supplement as a FactStore fact (medical scope; idempotent re-add)
|
|
583
|
+
npx agent-bober medical supplements list # Print supplements from the markdown-frontmatter file
|
|
584
|
+
npx agent-bober medical profile show # Decrypt + show the SOPS-encrypted personalization profile (fail-closed if sops missing)
|
|
585
|
+
npx agent-bober medical profile set <key> <value> # Update one profile field (age/sex/conditions/...); re-encrypts via sops (age backend, local)
|
|
586
|
+
npx agent-bober medical whoop sync [--since <iso>] # Sync WHOOP recovery/sleep/cycle/workout (device-connection axis)
|
|
587
|
+
npx agent-bober medical review [--dig-deeper <id>] # Deterministic offline proactive pass -> trend + cadence-gap + cross-marker-offer Finding notes; --dig-deeper runs the gated 4-lens deep analysis for an offer
|
|
588
|
+
npx agent-bober medical recommend <question> [--goal <g>] # 4-lens judge panel -> action/question Finding (cloud-inference axis; fail-closed local)
|
|
589
|
+
npx agent-bober medical research [--marker <m>] # Online MedlinePlus research -> grounded vault research notes + watch findings (literature-retrieval axis; zero egress off)
|
|
590
|
+
|
|
591
|
+
# Vault knowledge base
|
|
592
|
+
npx agent-bober vault reindex --scope <domain> [--vault <dir>] # Rebuild the derived FactStore from a vault's note frontmatter
|
|
593
|
+
|
|
594
|
+
# Priority hub (cross-domain Findings)
|
|
595
|
+
npx agent-bober hub list # Print Findings from the project's own FactStore + sibling kb-* repos (read-only, deduped by id); title [kind] urgency/severity per line
|
|
596
|
+
npx agent-bober hub priority [--domain <d>] [--due <days>] [--tag <t>] # Rank pooled Findings (general, or filtered) and write priority.md into the kb-hub vault; prints a ranked summary
|
|
597
|
+
npx agent-bober hub decide "X vs Y" # Rank Findings under decision scope (only X/Y-relevant survive) and write priority.md
|
|
598
|
+
|
|
599
|
+
# Task inbox (zero-friction capture into the hub pool)
|
|
600
|
+
npx agent-bober task add "<text>" [--domain <d>] # Capture a plain task as one open kind=action Finding in the hub pool; deterministic, never prompts/blocks
|
|
601
|
+
npx agent-bober task list [--all] [--status <s>] # List tasks (open + in-progress + woken snoozed by default; --all or --status widens to done/dropped)
|
|
602
|
+
npx agent-bober task start <id> # Move a task to in-progress (supersede; prior status kept as history)
|
|
603
|
+
npx agent-bober task done <id> # Mark a task done (supersede; hidden from the default list, still in --all)
|
|
604
|
+
npx agent-bober task drop <id> # Abandon a task → status=dropped via supersede (never deleted)
|
|
605
|
+
npx agent-bober task snooze <id> --until <when> # Defer a task: status=snoozed + snooze-until:<ISO> tag; hidden from default list until wake time passes (lazy, no timer)
|
|
606
|
+
npx agent-bober task ingest [file] # Domain seam: ingest a Finding JSON (file or stdin) into the hub pool; content-id dedup (domain|title|kind), schema-validated, fail-closed exitCode=1
|
|
607
|
+
npx agent-bober task from-gmail <thread> # Opt-in: capture one Gmail thread as an open action task. OFF by default (taskInbox.gmailEgress) — refuses with no MCP client/network when disabled; sanitizes connector errors (never leaks tokens)
|
|
608
|
+
|
|
609
|
+
# Do-bridge (promote a Finding into an agent-bober run)
|
|
610
|
+
npx agent-bober do <findingId> --dry-run # Preview the agent-bober run task a coding/projects Finding would launch (read-only: no mutation, no approval marker, no spawn); unsupported domain → exitCode=1
|
|
611
|
+
npx agent-bober do <findingId> # Real path: write a promote-<id> approval marker, gate (TTY confirm / non-TTY wait for agent-bober approve|reject), then launch detached `agent-bober run` on approve — links Finding.promotesTo (runId, status launched) + moves it open→in-progress; reject leaves it unchanged
|
|
612
|
+
npx agent-bober do <findingId> --yes # Real path, auto-approve (skip the confirm prompt; still writes+clears the marker)
|
|
613
|
+
npx agent-bober do --reconcile # Reconcile launched promotions: read each run's run-state.json snapshot → advance the Finding (completed→done, aborted/failed→open, running→unchanged); also runs best-effort at the start of every `agent-bober do`
|
|
614
|
+
|
|
615
|
+
# Calendar planner (deterministic slot-fill from ranked Findings)
|
|
616
|
+
npx agent-bober calendar plan --dry-run --findings <path> [--freebusy <path>] # Place ranked Findings into open slots in priority order (pure JS, LLM never packs); print scheduled (ISO start/end) + unscheduled (reason) — dry-run writes nothing to any calendar
|
|
617
|
+
npx agent-bober calendar plan --export-ics <path> --findings <path> [--freebusy <path>] # Same slot-fill, then write the plan to a local-first RFC 5545 .ics file (one VEVENT per scheduled item, UTC DTSTART/DTEND) with zero network egress — import it manually into your calendar app
|
|
618
|
+
npx agent-bober calendar plan --findings <path> [--freebusy <path>] # Live path: slot, then PROPOSE through the existing approval gate — writes a pending marker + plan sidecar and ZERO events; prints checkpointId (calendar-<id>) + how to approve. No auto-approve in any mode
|
|
619
|
+
npx agent-bober calendar apply <checkpointId> # Write events for an approved plan: detects the approved/rejected marker inline → connector.writeEvents EXACTLY once on approval / never on reject (Google still egress-gated). Approve first: agent-bober approve <checkpointId> (or /approve in chat)
|
|
620
|
+
|
|
621
|
+
# Research scheduler (recurring multi-model research jobs)
|
|
622
|
+
npx agent-bober research job add --question "..." [--cadence daily|weekly|monthly] [--tier <t>] [--domain <d>] [--target-repo <r>] [--online-research] # Define a recurring research job as JSON under .bober/research/jobs/ (validated by ResearchJobSchema; deterministic jobId=sha256(question|createdAt); --online-research stored but inert until egress lands)
|
|
623
|
+
npx agent-bober research job list # List all defined research jobs (jobId, cadence, question, [domain])
|
|
624
|
+
npx agent-bober research job remove <jobId> # Delete a research job's JSON file (not-found → exitCode=1)
|
|
625
|
+
npx agent-bober research run <jobId> # Execute one stored job: query ≥2 distinct tier-policy provider/model blocks, write a vault research note (frontmatter jobId/question/models[]/generatedAt), emit exactly one kind:"watch" hub Finding; prints the note path. Offline unless research.egress.onlineResearch; never throws (not-found → exitCode=1)
|
|
626
|
+
npx agent-bober research tick [--watch] [--interval <ms>] # Run every job due as of now (nextDueAt unset or <= now) on the same path; idempotent — advances each run job's nextDueAt by cadence (daily+1d/weekly+7d/monthly+1mo) + sets lastRunAt, so a 2nd tick runs nothing. Clock read only at the boundary. --watch = in-process setInterval (default 1h); for unattended runs use OS cron/launchd, e.g. `0 * * * * agent-bober research tick`
|
|
627
|
+
npx agent-bober research digest [--since <iso>] # Aggregate research runs in [since, now] (default last 24h) into a morning digest under .bober/research/digests/<date>.{md,json} — markdown (one bullet per run: title/top finding/source) + JSON for the Telegram bot. Reads vault research notes (non-sensitive titles only); empty window writes both files with an explicit no-new-research body; never throws
|
|
628
|
+
|
|
629
|
+
# Telegram frontend (local long-polling bot; transport + whitelist + funnel + zero-friction capture + scoped hub-priority commands + inline approve/adjust/reject gate + document-upload medical-ingest opt-in + streaming in-place progress + silent scheduled digest + multi-LLM /fleet secretary view) — spec COMPLETE (7/7 sprints)
|
|
630
|
+
npx agent-bober telegram # Start the local getUpdates long-polling bot (NO server/webhook/inbound port). Reads TELEGRAM_BOT_TOKEN (required; absent → exitCode=1, no network) + TELEGRAM_ALLOWED_USERS (comma-separated numeric ids; empty → deny-all, fail-closed) from env. Plain text from a whitelisted sender is captured as one open inbox task (message = title, no other required field) with a "Captured: <title>" reply; /priority, /today, and /decide X vs Y reply with a numbered ranked list from the priority hub (ephemeral scope parsed from the command, delegated to the hub CLI subprocess so the LLM stays out of the adapter, titles only); /pending lists pending approval checkpoints with [Approve][Adjust][Reject] inline buttons whose taps write the SAME .approved.json/.rejected.json disk markers the approve/reject CLI writes (no new mechanism — calendar/do-bridge resolve through the one existing gate; Approve has no editDelta, Adjust carries editDelta, Reject carries feedback; taps are whitelist-first + pendingExists-guarded, Adjust/Reject collect a follow-up text turn via ephemeral in-memory state); uploading a document (Telegram is NOT E2E-encrypted) DEFERS the download behind a per-upload [Yes][No] opt-in that names the local medical store (.bober/medical) — only on Yes does it download to a temp dir + hand the file to the existing `medical import` ingest exactly once (medical egress/consent/audit guards stay authoritative in the subprocess) + reply with a non-sensitive count only (no PHI) + remove the temp dir; No/no-confirm ingests nothing; /start gets a help stub and any other /command an "Unknown command" stub; everyone else gets one denial echoing their own id. Two Sprint-6 outbound delivery modes (presentation only, no run/fleet/scheduler logic): streamProgress reports a long-running operation by editing ONE status message in place — one sendSafeForEdit send (captures the message id) + N sendSafeEdit edits on the SAME id over an injected async iterable (never a new message per tick; live do-bridge wiring left as a documented seam in src/do-bridge/do.ts), and sendDigest delivers a scheduler-handed digest payload silently (sendSafe with {silent:true} → disable_notification; content/cadence owned by the research-scheduler). /fleet (Sprint 7) shows the most recent fleet run: a read-only renderer reads .bober/fleet-synthesis.json, groups findings by per-agent FactRecord.subject, and replies with a header (round count) + one labeled section per agent (label + one-line summary of the latest finding + round + confidence + finding count); the SAME renderer feeds the live streaming sections, over-long values are truncated to one line, missing/empty synthesis → "no recent fleet run" (never throws), /fleet is whitelist-gated first (non-whitelisted reads nothing), and SynthesisBundle/FactRecord are type-only imports so the bot keeps zero runtime coupling to src/fleet/better-sqlite3 (no new dep). All text replies leave through the single sendSafe funnel + all keyboards through the single sendSafeKeyboard funnel + streaming through sendSafeForEdit/sendSafeEdit (four chokepoints total; the new silent option is an optional 4th sendSafe arg so prior callers are byte-identical); grammy is isolated behind the transport wrapper. Ctrl+C (SIGINT/SIGTERM) stops it; never throws. spec-20260628-telegram-frontend is COMPLETE (7/7 sprints); deferred: live do-bridge streaming wire + live smoke tests need a real bot token, Tier 2/Tier 3 → sibling specs
|
|
631
|
+
|
|
632
|
+
# Security audit (three surfaces over one runSecurityAudit core: fail-closed pipeline gate + this CLI + the advisory `bober.security-audit` skill; opt-in, default-off) — spec-20260712 COMPLETE (7/7). agent-bober itself dogfoods the gate (security.enabled=true, scanners:[] — LLM-only). Full reference: docs/security-audit.md
|
|
633
|
+
npx agent-bober security-audit [target] # Run an on-demand stack-aware security audit against a local path (or the working tree when target is omitted). Runs the SAME runSecurityAudit core the in-pipeline gate uses (with evaluation=null), persists a cited artifact to .bober/security/<id>-security-audit.md, and prints a summary (verdict, per-bucket counts, top findings as path:line, artifact path). Exit code: 0 = pass, 2 = blocked-by-threshold OR fail-closed (audit threw / auditor output unparseable) — wire it into CI. Blocking threshold is security.standaloneBlockOn ('critical' default | 'important' also fails on important-bucket findings). Does NOT require security.enabled=true — the explicit invocation IS the opt-in; the pipeline gate's critical-only veto is untouched. After the exit code is computed, critical (hub severity/urgency 5) + important (3) findings are emitted into the priority hub (best-effort, guarded by security.hub default true; never changes the exit code) so they show up in `bober hub list`/`priority`. Local paths only (no remote URLs). For a conversational audit inside Claude Code use the `/bober-security-audit` skill (advisory-only; spawns the bober-security-auditor subagent)
|
|
634
|
+
|
|
635
|
+
# SEO / GEO suite (one `bober seo <workflow>` CLI + the /bober-seo orchestration skill + bober-seo-strategist/verifier subagents; opt-in, default-off, offline by default) — spec-20260715 COMPLETE; the SEO improver+builder (spec-20260717) and the in-house AI-visibility Hybrid (spec-20260718) extensions are also COMPLETE. Full reference: docs/seo.md
|
|
636
|
+
npx agent-bober seo <workflow> [target] # Run one of 8 SEO/GEO workflows (technical-audit, rank-track, content-decay, topical-map, ai-visibility, parasite-watch, internal-linking, schema-audit) end-to-end. Offline by default (reads .bober/seo/imports/<capability>.csv|json); live data ONLY behind five default-false egress axes: config.seo.egress.{search-console (GSC), serp-provider (DataForSEO), ai-visibility, ai-visibility-scrape, site-crawl}. The ai-visibility axis now routes to an in-house Hybrid (3 BYOK grounded-API engines: anthropic/openai/perplexity) instead of the offline arm; ai-visibility-scrape adds a separately-gated damcrawler UI-scrape arm (chatgpt-ui/perplexity-ui). Exit 0=pass, 2=blocked-or-fail-closed (1 reserved). Prints `SEO report <id>: verdict=…, findings=…, droppedUncited=…`. Guardrails: never-encode tactics dropped at parse, humanApprovalRequired findings, every finding carries a primary-source citation. For a conversational run in Claude Code use /bober-seo.
|
|
637
|
+
|
|
638
|
+
# Fleet orchestrator (spawn N isolated agent-bober children in bulk)
|
|
639
|
+
npx agent-bober fleet <manifest> # Run a fleet of agent-bober children from a manifest (full reference in COMMANDS.md)
|
|
640
|
+
npx agent-bober fleet expand <goal> # Decompose a goal into a fleet manifest and optionally run it (full reference in COMMANDS.md)
|
|
641
|
+
npx agent-bober fleet expand-deep <goal> # Robustly decompose a large/ambiguous goal (two-stage plan-then-expand) into a fleet manifest and optionally run it (full reference in COMMANDS.md)
|
|
642
|
+
|
|
643
|
+
# Config, telemetry & introspection
|
|
644
|
+
npx agent-bober config [migrate] # Inspect and migrate bober.config.json (full reference in COMMANDS.md)
|
|
645
|
+
npx agent-bober telemetry <status|purge|export> # Inspect, export, or purge local telemetry events (opt-in, local-only; full reference in COMMANDS.md)
|
|
646
|
+
npx agent-bober worktree run <task> # Run the full Bober pipeline in an isolated git worktree on a new branch (full reference in COMMANDS.md)
|
|
647
|
+
npx agent-bober memory <distill|list|show|prune> # Inspect and distill self-improvement lessons (full reference in COMMANDS.md)
|
|
648
|
+
npx agent-bober facts <add|list|show|invalidate> # Inspect and manage semantic bi-temporal facts (full reference in COMMANDS.md)
|
|
575
649
|
```
|
|
576
650
|
|
|
577
651
|
#### Clarification gating
|
|
@@ -685,6 +759,23 @@ namespace / pipeline shape), the built-in programming team, and the deferred
|
|
|
685
759
|
|
|
686
760
|
---
|
|
687
761
|
|
|
762
|
+
## Documentation
|
|
763
|
+
|
|
764
|
+
The `bober/medical-team` build turns agent-bober into a **local-first, multi-LLM personal
|
|
765
|
+
knowledge platform** — recurring research + fleet runs produce Findings and vault notes, the
|
|
766
|
+
priority hub ranks them, and a local Telegram bot is the read/act surface. Start with the umbrella
|
|
767
|
+
guide, then drill into a subsystem:
|
|
768
|
+
|
|
769
|
+
- **[docs/knowledge-platform.md](./docs/knowledge-platform.md)** — umbrella guide: how the pieces
|
|
770
|
+
connect, one-time setup, and end-to-end quick-starts. **Read this first.**
|
|
771
|
+
- [docs/fleet.md](./docs/fleet.md) — multi-LLM fleet (heterogeneous children, difficulty tiers, blackboard, synthesis).
|
|
772
|
+
- [docs/research-scheduler.md](./docs/research-scheduler.md) — recurring multi-model research jobs, vault notes, digests.
|
|
773
|
+
- [docs/telegram.md](./docs/telegram.md) — the local long-polling Telegram frontend.
|
|
774
|
+
- [docs/providers.md](./docs/providers.md) — provider/model selection and env-var setup.
|
|
775
|
+
- [docs/storage.md](./docs/storage.md) — the local SQLite / JSON storage model and egress axes.
|
|
776
|
+
|
|
777
|
+
---
|
|
778
|
+
|
|
688
779
|
## Configuration
|
|
689
780
|
|
|
690
781
|
All configuration lives in `bober.config.json` at your project root. The `init` command creates this file from a template, and you can customize it afterward.
|
|
@@ -775,6 +866,18 @@ All configuration lives in `bober.config.json` at your project root. The `init`
|
|
|
775
866
|
}
|
|
776
867
|
},
|
|
777
868
|
|
|
869
|
+
// -- Security auditor (opt-in; whole section optional, default-off; agent-bober's own repo dogfoods it with { enabled: true, scanners: [] } — LLM-only) --
|
|
870
|
+
"security": { // Optional. Omit entirely => byte-identical (no key, no defaults).
|
|
871
|
+
"enabled": false, // Fail-closed pipeline gate runs ONLY when exactly true. NOT required by the standalone CLI.
|
|
872
|
+
"failClosed": true, // Unparseable auditor output / timeout blocks. Default true.
|
|
873
|
+
"timeoutMs": 300000, // Per-audit time-box (pipeline gate).
|
|
874
|
+
"model": "opus", // Auditor model. Any model string or shorthand.
|
|
875
|
+
"maxTurns": 20, // Max read-only tool-use turns for the audit.
|
|
876
|
+
"standaloneBlockOn": "critical", // CI threshold for `bober security-audit`: 'critical' | 'important'. Gate ignores this key.
|
|
877
|
+
"scanners": [], // Opt-in deterministic pre-filter strategies (EvalStrategy[]). slither/semgrep JSON parsed into auditor priors; unknown scanners → raw-text excerpt. Nonzero exit ⇒ [] (use exit-0 commands). Empty ⇒ zero child processes.
|
|
878
|
+
"hub": true // Emit critical (severity 5) / important (severity 3) findings into the priority hub after the verdict (gate + CLI). Best-effort; false ⇒ zero hub writes. Never affects the verdict/exit code.
|
|
879
|
+
},
|
|
880
|
+
|
|
778
881
|
// -- Sprint ------------------------------------------
|
|
779
882
|
"sprint": {
|
|
780
883
|
"maxSprints": 10, // Max sprints per plan
|
|
@@ -811,10 +914,146 @@ All configuration lives in `bober.config.json` at your project root. The `init`
|
|
|
811
914
|
"pipelineShape": "ts", // "ts" | "skill" | "workflow"
|
|
812
915
|
"providers": { "chat": "openai" } // Partial role->provider override; unset roles keep defaults
|
|
813
916
|
}
|
|
917
|
+
},
|
|
918
|
+
|
|
919
|
+
// -- Medical team egress (Phase 6; all three axes default false) --
|
|
920
|
+
"medical": { // Optional. Omit entirely => zero egress (all axes off).
|
|
921
|
+
"egress": { // Three INDEPENDENT opt-in axes; code-enforced zero-egress default.
|
|
922
|
+
"cloudInference": false, // Permit cloud inference synthesis. Default false.
|
|
923
|
+
"literatureRetrieval": false, // Permit MedlinePlus literature retrieval. Default false.
|
|
924
|
+
"deviceConnection": false // Permit WHOOP device-connection egress. Default false.
|
|
925
|
+
},
|
|
926
|
+
"inference": { // Optional. Synthesis/critic model override. Omit => local Ollama default.
|
|
927
|
+
"provider": "openai-compat", // Default openai-compat. A CLOUD provider here needs egress.cloudInference=true.
|
|
928
|
+
"endpoint": "http://localhost:11434/v1", // Default localhost (Ollama). Non-localhost => treated as cloud + gated.
|
|
929
|
+
"model": "llama3" // Default llama3. Threaded into both synthesis and the grounding critic.
|
|
930
|
+
},
|
|
931
|
+
"vaultDir": ".bober/medical/vault" // Optional. Vault dir for proactive-review Finding notes. Omit => <root>/.bober/medical/vault.
|
|
932
|
+
},
|
|
933
|
+
|
|
934
|
+
// -- Vault (on-device Obsidian MCP read/write adapter) --
|
|
935
|
+
"vault": { // Optional. Omit entirely => no MCP adapter.
|
|
936
|
+
"obsidian": { // Declares ONE on-device Obsidian MCP server.
|
|
937
|
+
"name": "my_vault", // Alphanumeric/underscore. Used in errors — never secrets.
|
|
938
|
+
"mcpCommand": "npx", // Local executable to spawn (stdio). REMOTE schemes are refused.
|
|
939
|
+
"mcpArgs": ["-y", "obsidian-mcp-server"],
|
|
940
|
+
"mcpEnv": { "OBSIDIAN_API_KEY": "..." }, // OPAQUE secret — never logged or stringified.
|
|
941
|
+
"enabled": true, // Default true.
|
|
942
|
+
"toolNames": { // Optional. Override per-op tool names for a non-cyanheads server.
|
|
943
|
+
"readNote": "obsidian_read_file", // Default (cyanheads/obsidian-mcp-server).
|
|
944
|
+
"writeNote": "obsidian_update_file", // Default.
|
|
945
|
+
"listNotes": "obsidian_list_files_in_dir" // Default.
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
},
|
|
949
|
+
|
|
950
|
+
// -- Task inbox Gmail egress (opt-in; isolated single axis, default false) --
|
|
951
|
+
"taskInbox": { // Optional. Omit entirely => zero Gmail egress.
|
|
952
|
+
"gmailEgress": false // Permit `agent-bober task from-gmail` to read a thread via the MCP connector. Default false.
|
|
953
|
+
},
|
|
954
|
+
|
|
955
|
+
// -- Calendar planner (Google Calendar egress, opt-in; default 'ics', zero-egress) --
|
|
956
|
+
"calendar": { // Optional. Omit entirely => local .ics connector, zero cloud egress.
|
|
957
|
+
"egress": { // Single opt-in axis; code-enforced fail-closed default.
|
|
958
|
+
"cloudCalendar": false // Permit Google Calendar (cloud) free/busy read + event write. Default false.
|
|
959
|
+
},
|
|
960
|
+
"connector": "ics", // 'ics' (local, default) | 'google' (cloud, needs egress.cloudCalendar=true + a 0600 token).
|
|
961
|
+
"timezone": "America/New_York" // Optional IANA tz, informational only (not used in epoch-ms slot math).
|
|
962
|
+
},
|
|
963
|
+
|
|
964
|
+
// -- Research scheduler online egress (opt-in; isolated single axis, default false) --
|
|
965
|
+
"research": { // Optional. Omit entirely => research runs are fully offline.
|
|
966
|
+
"egress": { // Single opt-in axis; code-enforced fail-closed default.
|
|
967
|
+
"onlineResearch": false // Permit `agent-bober research run` web/online retrieval. Default false.
|
|
968
|
+
}
|
|
814
969
|
}
|
|
815
970
|
}
|
|
816
971
|
```
|
|
817
972
|
|
|
973
|
+
> **The Obsidian MCP adapter is on-device only.** `VaultMcpAdapter` wraps the existing
|
|
974
|
+
> `ExternalMcpServer` and exposes `readNote` / `writeNote` / `listNotes` over the declared
|
|
975
|
+
> server. An `isOnDevice()` guard **refuses any non-local declaration before the server is
|
|
976
|
+
> spawned** — a `mcpCommand` with a remote URL scheme (`https?`/`wss?`/`ftp`/`tcp://`) or an
|
|
977
|
+
> `mcpArgs` element pointing at a non-loopback host throws (naming only `name`, never `mcpEnv`).
|
|
978
|
+
> `mcpEnv` is treated as opaque secrets and is never logged. Tool names default to
|
|
979
|
+
> cyanheads/obsidian-mcp-server and are overridable for other servers (e.g. the Obsidian Local
|
|
980
|
+
> REST API plugin's built-in MCP). The adapter is an independent read/write surface — it is **not**
|
|
981
|
+
> wired into `agent-bober vault reindex`, which reads notes from the local filesystem. See
|
|
982
|
+
> [docs/sprints/sprint-spec-20260628-obsidian-vault-store-4.md](./docs/sprints/sprint-spec-20260628-obsidian-vault-store-4.md).
|
|
983
|
+
|
|
984
|
+
> **Zero-egress is code-enforced for the medical team.** All three `medical.egress` axes
|
|
985
|
+
> default `false`, so a medical SOP turn makes **zero outbound calls** out of the box —
|
|
986
|
+
> a numeric question is answered from deterministic local compute and a literature
|
|
987
|
+
> question abstains, with no network module ever reached. The default is enforced two
|
|
988
|
+
> ways: the runtime `EgressGuard` (whose `assertAllowed` throws when an axis is off) and
|
|
989
|
+
> a scoped `no-restricted-imports` ESLint boundary over `src/medical/**/*.ts` that makes
|
|
990
|
+
> any network import a lint error (with **two** sanctioned exceptions — the
|
|
991
|
+
> literature-retrieval source `src/medical/retrieval/medline-source.ts` and the WHOOP
|
|
992
|
+
> client `src/medical/whoop/whoop-client.ts`). Opting `literatureRetrieval` **in** turns
|
|
993
|
+
> on a real MedlinePlus / NIH (no-auth) grounded retrieval + cited synthesis that
|
|
994
|
+
> **abstains unless a retrieved passage supports the claim**; it runs the synthesis on a
|
|
995
|
+
> **local** model (Ollama by default). Opting `deviceConnection` **in** turns on the
|
|
996
|
+
> authenticated WHOOP transport (OAuth2 refresh + paginated v2 fetch; credentials from
|
|
997
|
+
> `WHOOP_CLIENT_ID`/`WHOOP_CLIENT_SECRET` env vars + a `0600` refresh-token sidecar, no
|
|
998
|
+
> keychain) used by the on-demand `agent-bober medical whoop sync [--since <iso>]` command,
|
|
999
|
+
> which persists WHOOP recovery/sleep/cycle/workout into the medical health store
|
|
1000
|
+
> (idempotent, fail-closed). The three axes are **independent** — enabling one never
|
|
1001
|
+
> enables another. See
|
|
1002
|
+
> [docs/teams.md](./docs/teams.md) ("EgressGuard + full SOP wiring", "MedlinePlus
|
|
1003
|
+
> grounded retrieval + cited synthesis", and "WHOOP device-connection axis +
|
|
1004
|
+
> authenticated transport").
|
|
1005
|
+
|
|
1006
|
+
> **The synthesis/critic model is configurable, and cloud is gated by `cloudInference`.**
|
|
1007
|
+
> The optional `medical.inference` block `{ provider?, endpoint?, model? }` overrides the
|
|
1008
|
+
> model used for grounded synthesis **and** the grounding critic. Omit it (the default) and
|
|
1009
|
+
> the medical team uses the **local Ollama default** (`openai-compat`,
|
|
1010
|
+
> `http://localhost:11434/v1`, `llama3`). A **cloud** provider here (anything that is not
|
|
1011
|
+
> `openai-compat` against a `localhost` endpoint) is honoured **only** when
|
|
1012
|
+
> `medical.egress.cloudInference` is `true`; with the axis off (the default) the resolver
|
|
1013
|
+
> **fails closed to the local default** and **no cloud client is ever constructed** — so the
|
|
1014
|
+
> out-of-the-box posture still makes zero cloud egress. The critic's outcome is recorded as
|
|
1015
|
+
> the IDs/enums-only `criticVerdict` (`approve` / `reject-abstained` / `error-abstained`)
|
|
1016
|
+
> field on the PHI-free `0600` medical audit log. See
|
|
1017
|
+
> [docs/teams.md](./docs/teams.md) ("Configurable model + cloud-inference gating" and
|
|
1018
|
+
> "Critic verdict in the audit").
|
|
1019
|
+
|
|
1020
|
+
> **Gmail capture is opt-in and default-off.** The isolated `taskInbox.gmailEgress` axis
|
|
1021
|
+
> (default `false`, separate from the `medical.egress` axes) gates `agent-bober task from-gmail
|
|
1022
|
+
> <thread>`. With the axis off — the default — the command **refuses with an opt-in message,
|
|
1023
|
+
> sets `exitCode=1`, and constructs no MCP client / makes no network call**, so the
|
|
1024
|
+
> out-of-the-box build performs **zero Gmail egress**. The gate fires fail-closed at two
|
|
1025
|
+
> layers (the CLI returns before constructing the connector, and the `fromGmailTask` core
|
|
1026
|
+
> throws before `mcp.start()`/`callTool()`), a missing/invalid config resolves to disabled,
|
|
1027
|
+
> and any connector error is caught and **sanitized** (`KEY=VALUE` env assignments stripped to
|
|
1028
|
+
> `[redacted]`, the same regex as `src/mcp/external-client.ts`) so tokens never leak. When
|
|
1029
|
+
> enabled (plus an enabled `observability` provider named `gmail`), one thread is read on
|
|
1030
|
+
> demand and captured through the same `captureTask` write path as `task add`. See
|
|
1031
|
+
> [COMMANDS.md](./COMMANDS.md) (`agent-bober task from-gmail <thread>`) and
|
|
1032
|
+
> [docs/sprints/sprint-spec-20260628-task-inbox-6.md](./docs/sprints/sprint-spec-20260628-task-inbox-6.md).
|
|
1033
|
+
|
|
1034
|
+
> **Google Calendar egress is opt-in and default-off.** The isolated `calendar.egress.cloudCalendar`
|
|
1035
|
+
> axis (default `false`, separate from the `medical`/`taskInbox` axes) gates the Sprint 3 Google
|
|
1036
|
+
> Calendar connector. With the axis off — the default — the calendar planner uses the local-first
|
|
1037
|
+
> `.ics` connector and makes **zero cloud egress**; any Google read/write **refuses before constructing
|
|
1038
|
+
> the MCP client**, naming `calendar.egress.cloudCalendar`. Enabling it also requires a provisioned
|
|
1039
|
+
> `0600` OAuth token sidecar (`.bober/calendar/google-token.json`), and only a non-sensitive
|
|
1040
|
+
> `calendarSafeTitle` (never the full finding title, evidence, or tags) ever leaves the device as the
|
|
1041
|
+
> event summary; connector errors are sanitized (`KEY=VALUE` stripped, same regex as
|
|
1042
|
+
> `src/mcp/external-client.ts`) so tokens never leak. Hosted OAuth is **unfit for unattended/cron runs**,
|
|
1043
|
+
> so scheduled use should stay on the `.ics` fallback. See [docs/calendar.md](./docs/calendar.md) and
|
|
1044
|
+
> [docs/sprints/sprint-spec-20260628-calendar-planner-3.md](./docs/sprints/sprint-spec-20260628-calendar-planner-3.md).
|
|
1045
|
+
|
|
1046
|
+
> **Online research egress is opt-in and default-off.** The isolated `research.egress.onlineResearch`
|
|
1047
|
+
> axis (default `false`, **separate** from the `medical`/`taskInbox`/`calendar` axes) gates `bober
|
|
1048
|
+
> research run` (and `agent-bober research tick`) web retrieval. With the axis off — the default — a research run uses only its injected
|
|
1049
|
+
> provider clients and makes **zero outbound retrieval requests**; the `ResearchEgressGuard`
|
|
1050
|
+
> (`src/research/egress.ts`, mirroring the medical `EgressGuard`) is fail-closed (`assertAllowed` throws
|
|
1051
|
+
> `Egress axis 'online-research' not enabled` when off), and the runner's gated branch skips retrieval
|
|
1052
|
+
> entirely so the retrieval client is **never constructed** and the note is byte-identical to the
|
|
1053
|
+
> offline run. Opting in threads the retrieved source URLs into the note frontmatter `sources` list. See
|
|
1054
|
+
> [COMMANDS.md](./COMMANDS.md) (Research Commands → "Online research egress") and
|
|
1055
|
+
> [docs/sprints/sprint-spec-20260628-research-scheduler-3.md](./docs/sprints/sprint-spec-20260628-research-scheduler-3.md).
|
|
1056
|
+
|
|
818
1057
|
### Sprint Sizes
|
|
819
1058
|
|
|
820
1059
|
| Size | Generator Effort | Files Changed | Scope |
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bober-art-director
|
|
3
|
+
description: Art direction specialist that turns a design brief into a complete DESIGN.md contract — named vibe, fresh color tokens, type pairing, layout wireframes, signature element — self-critiqued against the anti-slop catalog before handoff. Produces design documents only; never writes application code.
|
|
4
|
+
tools:
|
|
5
|
+
- Read
|
|
6
|
+
- Grep
|
|
7
|
+
- Glob
|
|
8
|
+
- Bash
|
|
9
|
+
- Write
|
|
10
|
+
model: opus
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Bober Art Director Agent
|
|
14
|
+
|
|
15
|
+
## Subagent Context
|
|
16
|
+
|
|
17
|
+
You are being **spawned as a subagent** by the bober.design orchestrator. You have no access to
|
|
18
|
+
the orchestrator's conversation. Everything you need is in your prompt:
|
|
19
|
+
|
|
20
|
+
- **BRIEF.md** — the intake brief: subject, audience, job, reference notes, discovery answers,
|
|
21
|
+
constraints, assets. This is the user's intent; you do not get to ask follow-up questions,
|
|
22
|
+
so where the brief is silent, decide and state the decision (never leave an axis undesigned).
|
|
23
|
+
- **Reference image paths** — Read every one. For each, the brief says what to take from it.
|
|
24
|
+
Borrow patterns and moods across references; never reproduce one site.
|
|
25
|
+
- **The Anti-Slop Catalog** — the tells you design against, the entropy rules you must apply,
|
|
26
|
+
and the replacement pools (a floor, not the method).
|
|
27
|
+
- **The DESIGN.md template** — your output contract, all 11 sections.
|
|
28
|
+
- **`.bober/design/history.md`** (if provided) — faces, vibes, and palettes used in previous
|
|
29
|
+
projects. Never repeat the last three display faces, vibe names, or palettes.
|
|
30
|
+
|
|
31
|
+
Your final message back to the orchestrator is the complete DESIGN.md content plus a short
|
|
32
|
+
self-critique summary. Also Write it to the path the orchestrator specifies.
|
|
33
|
+
|
|
34
|
+
## Identity
|
|
35
|
+
|
|
36
|
+
You are the design lead at a small studio known for giving every client a visual identity that
|
|
37
|
+
could not be mistaken for anyone else's. This client has already rejected work that felt
|
|
38
|
+
templated and is paying for a distinctive point of view: make deliberate, opinionated choices
|
|
39
|
+
about palette, typography, and layout that are specific to THIS brief, and take one real
|
|
40
|
+
aesthetic risk you can justify. Not taking a risk is itself a risk.
|
|
41
|
+
|
|
42
|
+
The subject's own world — its materials, instruments, artifacts, era, vernacular — is where
|
|
43
|
+
distinctive choices come from. A page about beekeeping and a page about GPU kernels must not
|
|
44
|
+
share a palette logic, a type voice, or a hero thesis.
|
|
45
|
+
|
|
46
|
+
## Method
|
|
47
|
+
|
|
48
|
+
Work in two passes. **Do the exploration in your thinking; show only decisions.**
|
|
49
|
+
|
|
50
|
+
### Pass 1 — Design
|
|
51
|
+
|
|
52
|
+
1. **Ground:** restate subject, audience, single job in your own words. The hero is a thesis —
|
|
53
|
+
decide the most characteristic thing in the subject's world to open with (headline, image,
|
|
54
|
+
demo, interactive moment — whatever form fits the subject, not the template).
|
|
55
|
+
2. **Influences:** pick exactly two unrelated influences (at least one from the subject's own
|
|
56
|
+
world; references may supply the other). Name where their collision will be visible.
|
|
57
|
+
3. **Name the vibe** in 2–4 words. Every decision after this is tested against the name.
|
|
58
|
+
4. **Colors:** generate 4–6 tokens fresh from real-world sources in the subject's world — no
|
|
59
|
+
remembered hex defaults. Name each after its source. Compute and record contrast ratios for
|
|
60
|
+
every text pair (4.5:1 body / 3:1 large — the floor is not negotiable).
|
|
61
|
+
5. **Type:** a characterful display face used with restraint, a complementary body face
|
|
62
|
+
(different family), a utility face if data/captions demand it. Rotate per history.md. State
|
|
63
|
+
the scale as named steps and why this pairing belongs to this brief.
|
|
64
|
+
6. **Layout:** one-sentence thesis, then ASCII wireframes per section. Every structural device
|
|
65
|
+
(numbering, eyebrows, dividers) must encode something true about the content — numbered
|
|
66
|
+
markers only if the content is genuinely a sequence. Devices that encode nothing get cut.
|
|
67
|
+
7. **Signature element:** the ONE thing the page will be remembered by. Spend the entire
|
|
68
|
+
boldness budget here; keep everything around it quiet and disciplined. Design its
|
|
69
|
+
reduced-motion fallback in the same breath.
|
|
70
|
+
8. **Wildcard:** one deliberate misfit detail. Perfectly coherent = obviously generated.
|
|
71
|
+
9. **Motion plan & copy deck** per the template — one orchestrated moment beats scattered
|
|
72
|
+
effects; the headline must pass the litmus test before it goes in the deck.
|
|
73
|
+
|
|
74
|
+
### Pass 2 — The generic-twin critique (mandatory, before handoff)
|
|
75
|
+
|
|
76
|
+
Simulate the twin: work through what you would have produced for a *similar but generic*
|
|
77
|
+
prompt — same product category, no brief. Compare axis by axis (palette, type, hero, layout,
|
|
78
|
+
motion). **Any axis where your design and the twin's converge is an axis you defaulted** —
|
|
79
|
+
redesign it and note what changed and why. Then check the three whole-page default looks and
|
|
80
|
+
the component tells; fill the Slop Ledger with every rule you consciously break and its
|
|
81
|
+
one-line justification tied to the brief. The brief's own words always win — if the user asked
|
|
82
|
+
for a "banned" look, deliver it excellently and record it in the ledger.
|
|
83
|
+
|
|
84
|
+
## Hard rules
|
|
85
|
+
|
|
86
|
+
- You produce DESIGN.md and nothing else — no application code, no CSS files, no prototypes.
|
|
87
|
+
- All 11 template sections present and concrete. A section you can't fill means the brief is
|
|
88
|
+
deficient — fill it with a stated assumption and flag it at the top of your report.
|
|
89
|
+
- Where the brief pins something down (brand colors, a reference the user loves), follow it
|
|
90
|
+
exactly. Your freedom lives only on the axes the brief leaves open.
|
|
91
|
+
- If a candidate-generator tool result is in your prompt (e.g. ui-ux-pro-max search output),
|
|
92
|
+
treat it as raw material: harvest structure and options, but every adopted item must survive
|
|
93
|
+
the generic-twin critique like any other choice. Its font/palette defaults trend generic.
|
|
94
|
+
- Quality floor (template §11) is restated verbatim, never weakened.
|
|
95
|
+
|
|
96
|
+
## Report format
|
|
97
|
+
|
|
98
|
+
Return: (1) the complete DESIGN.md content; (2) a 5-line self-critique summary — what the
|
|
99
|
+
generic twin would have done on each major axis and what you did instead; (3) any assumptions
|
|
100
|
+
made where the brief was silent.
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bober-design-critic
|
|
3
|
+
description: Skeptical design reviewer that judges the RENDERED page against DESIGN.md and the anti-slop catalog — Playwright screenshots at three viewports, eight review phases, deterministic slop lint and accessibility scan — and returns severity-ranked findings. Never writes or edits code.
|
|
4
|
+
tools:
|
|
5
|
+
- Read
|
|
6
|
+
- Bash
|
|
7
|
+
- Grep
|
|
8
|
+
- Glob
|
|
9
|
+
- mcp__plugin_playwright_playwright__browser_navigate
|
|
10
|
+
- mcp__plugin_playwright_playwright__browser_snapshot
|
|
11
|
+
- mcp__plugin_playwright_playwright__browser_take_screenshot
|
|
12
|
+
- mcp__plugin_playwright_playwright__browser_click
|
|
13
|
+
- mcp__plugin_playwright_playwright__browser_fill_form
|
|
14
|
+
- mcp__plugin_playwright_playwright__browser_evaluate
|
|
15
|
+
- mcp__plugin_playwright_playwright__browser_console_messages
|
|
16
|
+
- mcp__plugin_playwright_playwright__browser_network_requests
|
|
17
|
+
- mcp__plugin_playwright_playwright__browser_resize
|
|
18
|
+
- mcp__plugin_playwright_playwright__browser_tabs
|
|
19
|
+
- mcp__plugin_playwright_playwright__browser_close
|
|
20
|
+
model: sonnet
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Bober Design Critic Agent
|
|
24
|
+
|
|
25
|
+
## Subagent Context
|
|
26
|
+
|
|
27
|
+
You are being **spawned as a subagent** by the bober.design orchestrator. You have no access to
|
|
28
|
+
the orchestrator's conversation. Your prompt contains:
|
|
29
|
+
|
|
30
|
+
- **DESIGN.md** — the contract you judge against. You are not judging your own taste; you are
|
|
31
|
+
judging fidelity to an approved design plus the objective quality floor plus genericness.
|
|
32
|
+
- **The Critique Rubric** — your full protocol (baseline screenshots, eight phases,
|
|
33
|
+
deterministic gates, finding format). Follow it exactly; every phase is mandatory.
|
|
34
|
+
- **The Anti-Slop Catalog** — the tells, the scoring (0–1 pass / 2–3 warn / 4+ fail), the
|
|
35
|
+
Slop Ledger exemption, and the final AI Slop Test.
|
|
36
|
+
- **How to run the page** — dev server command or file path, and the iteration number.
|
|
37
|
+
|
|
38
|
+
Your final message is the structured DesignReviewResult JSON below — raw data for the
|
|
39
|
+
orchestrator, not prose for a human.
|
|
40
|
+
|
|
41
|
+
## Identity
|
|
42
|
+
|
|
43
|
+
You are a skeptical design reviewer with one conviction: **the rendered page is the truth; the
|
|
44
|
+
source code is a claim about it.** You review the live environment first — screenshots at
|
|
45
|
+
1440/768/375, real interactions, keyboard-only passes — and only read source in phase 7. You
|
|
46
|
+
have seen a thousand pages that "passed" in code review and fell apart at 375px. A picture is
|
|
47
|
+
worth 1000 tokens; capture the baseline screenshot set before forming any opinion.
|
|
48
|
+
|
|
49
|
+
You are adversarial toward the work, not the builder: your job is to find what's wrong before
|
|
50
|
+
a user does. But you are calibrated — you distinguish a BLOCKER from a preference, you prefix
|
|
51
|
+
preferences with "Nit:", and you open with one line on what genuinely works so it doesn't get
|
|
52
|
+
regressed away.
|
|
53
|
+
|
|
54
|
+
## Non-negotiables
|
|
55
|
+
|
|
56
|
+
- **Never write or edit code.** You describe problems and fix *directions*; the builder owns
|
|
57
|
+
the how. Prescribing exact CSS is overstepping; describing the defect precisely is the job.
|
|
58
|
+
- **Evidence for every finding**: viewport + screenshot reference + what/where. A finding you
|
|
59
|
+
can't evidence is a hunch — either verify it or drop it.
|
|
60
|
+
- **Faithful-but-weak routing:** if the page correctly implements a DESIGN.md decision that is
|
|
61
|
+
itself weak (a contrast pair that passes ratios but reads muddy; a signature element that
|
|
62
|
+
lands flat), file it as `"target": "design-brief"` — that goes to the art director, not the
|
|
63
|
+
builder. Never punish the builder for following the contract.
|
|
64
|
+
- **Fonts first:** check computed `font-family` on display and body text immediately after
|
|
65
|
+
load. If a fallback is serving, everything visual you'd review is a different design —
|
|
66
|
+
file the CRITICAL and short-circuit the visual phases.
|
|
67
|
+
- **Deterministic gates run every time:** slop lint (impeccable if available, else the
|
|
68
|
+
catalog's built-in DOM checks) and a11y scan (axe if available, else the manual phase-5
|
|
69
|
+
pass, with the gap noted). Slop Ledger entries in DESIGN.md exempt their tells from the
|
|
70
|
+
score — unledgered tells count.
|
|
71
|
+
- **The AI Slop Test verdict is mandatory** on iteration 1 and on the final pass: look at the
|
|
72
|
+
1440px screenshot cold and answer honestly. On smoke passes (post-polish), run phases
|
|
73
|
+
1, 3, 8 + slop lint only, as instructed by the orchestrator.
|
|
74
|
+
|
|
75
|
+
## DesignReviewResult format
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"reviewId": "design-review-<project>-<iteration>",
|
|
80
|
+
"iteration": 1,
|
|
81
|
+
"verdict": "pass | fail",
|
|
82
|
+
"worksWell": "<one line — what must not regress>",
|
|
83
|
+
"screenshots": { "1440": "<path>", "768": "<path>", "375": "<path>" },
|
|
84
|
+
"slopLint": {
|
|
85
|
+
"tool": "impeccable | builtin",
|
|
86
|
+
"score": 0,
|
|
87
|
+
"tellsFound": ["<tell> (ledgered: yes/no)"],
|
|
88
|
+
"aiSlopTest": { "verdict": "pass | fail", "reason": "<one line>" }
|
|
89
|
+
},
|
|
90
|
+
"accessibility": {
|
|
91
|
+
"tool": "axe | manual",
|
|
92
|
+
"blockers": ["<serious/critical violations>"],
|
|
93
|
+
"keyboardPass": "clean | <issues>"
|
|
94
|
+
},
|
|
95
|
+
"findings": [
|
|
96
|
+
{
|
|
97
|
+
"id": "F1",
|
|
98
|
+
"severity": "BLOCKER | HIGH | MEDIUM | NIT",
|
|
99
|
+
"phase": 3,
|
|
100
|
+
"target": "build | design-brief",
|
|
101
|
+
"viewport": "375",
|
|
102
|
+
"finding": "<what + where>",
|
|
103
|
+
"evidence": "<screenshot ref / console line / computed style>",
|
|
104
|
+
"fixDirection": "<direction, not prescription>"
|
|
105
|
+
}
|
|
106
|
+
],
|
|
107
|
+
"phasesRun": [1,2,3,4,5,6,7,8],
|
|
108
|
+
"summary": "<2-3 sentences: verdict rationale>"
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
`pass` requires: zero BLOCKER/HIGH findings, slop score ≤1, AI Slop Test passed, no
|
|
113
|
+
accessibility blockers. Anything else is `fail` — with findings complete enough that the
|
|
114
|
+
builder can fix everything in one batch.
|