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
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { runSecurityAudit } from "./security-auditor-agent.js";
|
|
2
|
+
import { saveSecurityAudit } from "../state/security-audit-state.js";
|
|
3
|
+
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { emitSecurityFindings, mapAuditToFindings } from "./security-hub.js";
|
|
5
|
+
import { ingestFinding } from "../hub/finding-store.js";
|
|
6
|
+
import { FactStore, factsDbPath, ensureFactsDir } from "../state/facts.js";
|
|
7
|
+
// Unique sentinel so a race timeout is distinguishable from any other
|
|
8
|
+
// rejection (provider/network/budget error) surfaced by runSecurityAudit.
|
|
9
|
+
const TIMEOUT_MESSAGE = "security-audit timeout";
|
|
10
|
+
// ── Gate ───────────────────────────────────────────────────────────
|
|
11
|
+
/**
|
|
12
|
+
* Evaluate the security gate for a sprint that just passed evaluation.
|
|
13
|
+
*
|
|
14
|
+
* Never throws. Resolution mapping:
|
|
15
|
+
* - `config.security` absent or `enabled !== true` → `{blocked:false, reason:'disabled'}`
|
|
16
|
+
* WITHOUT invoking the audit at all.
|
|
17
|
+
* - `runSecurityAudit` rejects (any error) → `{blocked:true, reason:'audit-error'}`.
|
|
18
|
+
* - The Promise.race timeout (`config.security.timeoutMs`) fires first →
|
|
19
|
+
* `{blocked:true, reason:'timeout'}`.
|
|
20
|
+
* - `result.parsed === false` (unparseable auditor output) →
|
|
21
|
+
* `{blocked:true, reason:'audit-error', result}` — checked BEFORE
|
|
22
|
+
* `result.verdict` so a parse failure is never mistaken for a genuine
|
|
23
|
+
* critical finding.
|
|
24
|
+
* - `result.verdict === 'blocked'` (a real critical finding) →
|
|
25
|
+
* `{blocked:true, reason:'critical-finding', result}`.
|
|
26
|
+
* - Otherwise → `{blocked:false, reason:'clean', result}`.
|
|
27
|
+
*
|
|
28
|
+
* A `saveSecurityAudit` persistence failure is caught, logged, and never
|
|
29
|
+
* changes the already-computed verdict in either direction (sc-3-6).
|
|
30
|
+
*/
|
|
31
|
+
export async function evaluateSecurityGate(input) {
|
|
32
|
+
const { contract, evaluation, projectRoot, config, findingSink } = input;
|
|
33
|
+
// Disabled short-circuit — construct nothing, invoke nothing.
|
|
34
|
+
if (config.security?.enabled !== true) {
|
|
35
|
+
return { blocked: false, reason: "disabled" };
|
|
36
|
+
}
|
|
37
|
+
const timeoutMs = config.security.timeoutMs;
|
|
38
|
+
let result;
|
|
39
|
+
try {
|
|
40
|
+
result = await Promise.race([
|
|
41
|
+
runSecurityAudit(contract, evaluation, projectRoot, config),
|
|
42
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(TIMEOUT_MESSAGE)), timeoutMs)),
|
|
43
|
+
]);
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
const timedOut = err instanceof Error && err.message === TIMEOUT_MESSAGE;
|
|
47
|
+
logger.warn(`Security audit ${timedOut ? "timed out" : "failed"}: ${err instanceof Error ? err.message : String(err)}`);
|
|
48
|
+
return { blocked: true, reason: timedOut ? "timeout" : "audit-error" };
|
|
49
|
+
}
|
|
50
|
+
// Parse-failure elevation MUST be checked before result.verdict: a parse
|
|
51
|
+
// failure already forces verdict:'blocked' inside runSecurityAudit, but the
|
|
52
|
+
// gate reports the distinct reason 'audit-error' (not 'critical-finding')
|
|
53
|
+
// so callers/tests can tell the two failure modes apart.
|
|
54
|
+
if (result.parsed === false) {
|
|
55
|
+
return { blocked: true, reason: "audit-error", result };
|
|
56
|
+
}
|
|
57
|
+
// Best-effort hub emission — result.verdict is already computed (above)
|
|
58
|
+
// and this call is OUTSIDE the Promise.race time-box, so a slow or
|
|
59
|
+
// failing ingest can never manufacture a false 'timeout' or flip the
|
|
60
|
+
// verdict (nonGoals[3]). Guarded by config.security.hub (default true).
|
|
61
|
+
await emitFindingsToHub(result, projectRoot, config, findingSink);
|
|
62
|
+
// Best-effort persistence. runSecurityAudit already persisted internally
|
|
63
|
+
// (security-auditor-agent.ts) — this is a deliberate, idempotent re-save
|
|
64
|
+
// guarded independently so a store failure here can never flip the
|
|
65
|
+
// already-computed verdict (sc-3-6).
|
|
66
|
+
try {
|
|
67
|
+
await saveSecurityAudit(projectRoot, contract.contractId, result);
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
logger.warn(`Security audit persistence failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
71
|
+
}
|
|
72
|
+
return result.verdict === "blocked"
|
|
73
|
+
? { blocked: true, reason: "critical-finding", result }
|
|
74
|
+
: { blocked: false, reason: "clean", result };
|
|
75
|
+
}
|
|
76
|
+
// ── Hub emission ─────────────────────────────────────────────────────
|
|
77
|
+
/**
|
|
78
|
+
* Emit a SecurityAuditResult's critical/important findings into the
|
|
79
|
+
* priority hub. Best-effort: emitSecurityFindings already catches and logs
|
|
80
|
+
* sink failures internally, so this helper never throws and never affects
|
|
81
|
+
* the gate's verdict.
|
|
82
|
+
*
|
|
83
|
+
* - `config.security.hub === false` -> no-op (zero hub writes).
|
|
84
|
+
* - An injected `findingSink` (tests) is used as-is.
|
|
85
|
+
* - Otherwise, a FactStore is opened lazily — only when mapAuditToFindings
|
|
86
|
+
* produces at least one finding to emit — so a clean audit (or a
|
|
87
|
+
* `hub:false` config) never touches the filesystem.
|
|
88
|
+
*
|
|
89
|
+
* `now` is stamped here (not injected) — SecurityGateInput has no clock
|
|
90
|
+
* dependency today, and pipeline.ts already stamps `new Date()` at its own
|
|
91
|
+
* history-event boundaries (pipeline.ts:481,525), so this is a genuine,
|
|
92
|
+
* consistent side-effecting boundary.
|
|
93
|
+
*/
|
|
94
|
+
async function emitFindingsToHub(result, projectRoot, config, findingSink) {
|
|
95
|
+
if (config.security?.hub === false)
|
|
96
|
+
return;
|
|
97
|
+
const now = new Date().toISOString();
|
|
98
|
+
if (findingSink !== undefined) {
|
|
99
|
+
await emitSecurityFindings(result, findingSink, logger, now);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
// Check emptiness BEFORE opening a store — a clean audit (mapAuditToFindings
|
|
103
|
+
// returns []) never touches the filesystem. mapAuditToFindings is pure and
|
|
104
|
+
// cheap, so computing it twice (here + inside emitSecurityFindings) is fine.
|
|
105
|
+
if (mapAuditToFindings(result, now).length === 0)
|
|
106
|
+
return;
|
|
107
|
+
// The ENTIRE default-sink sequence (dir creation, store open, emission,
|
|
108
|
+
// store close) is wrapped in one try/catch/finally: `emitSecurityFindings`
|
|
109
|
+
// only guards the emission loop itself — it does NOT cover `ensureFactsDir`
|
|
110
|
+
// or `new FactStore`, so an fs failure there (disk full, EACCES, a
|
|
111
|
+
// non-directory occupying `.bober`, a locked/corrupt sqlite file) must be
|
|
112
|
+
// caught here too, or it propagates as an unhandled rejection out of this
|
|
113
|
+
// async function and never reaches the gate's already-computed verdict
|
|
114
|
+
// (sc-6-2 regression fix, iteration 2).
|
|
115
|
+
let store;
|
|
116
|
+
try {
|
|
117
|
+
await ensureFactsDir(projectRoot);
|
|
118
|
+
const opened = new FactStore(factsDbPath(projectRoot));
|
|
119
|
+
store = opened;
|
|
120
|
+
const defaultSink = async (finding) => {
|
|
121
|
+
await ingestFinding(opened, finding, { now });
|
|
122
|
+
};
|
|
123
|
+
await emitSecurityFindings(result, defaultSink, logger, now);
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
logger.warn(`Security hub emission failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
store?.close();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// ── Feedback rendering ─────────────────────────────────────────────
|
|
133
|
+
/** Bound the number of findings rendered/logged per blocked round. */
|
|
134
|
+
const MAX_RENDERED_FINDINGS = 20;
|
|
135
|
+
/**
|
|
136
|
+
* Render a blocked SecurityGateVerdict into feedback strings for the
|
|
137
|
+
* generator's next retry iteration (ADR-5), phrased for a fixer. Pure
|
|
138
|
+
* function — no side effects, no I/O.
|
|
139
|
+
*
|
|
140
|
+
* Returns `[]` for a non-blocked verdict. Returns a single generic message
|
|
141
|
+
* when there is no `result` to enumerate findings from (a `timeout` or a
|
|
142
|
+
* rejected `audit-error` never resolves a SecurityAuditResult). Otherwise
|
|
143
|
+
* returns a summary line followed by one line per critical finding, capped
|
|
144
|
+
* to MAX_RENDERED_FINDINGS.
|
|
145
|
+
*/
|
|
146
|
+
export function renderSecurityFeedback(verdict) {
|
|
147
|
+
if (!verdict.blocked)
|
|
148
|
+
return [];
|
|
149
|
+
if (!verdict.result) {
|
|
150
|
+
const reasonText = verdict.reason === "timeout"
|
|
151
|
+
? "the security audit timed out before completing"
|
|
152
|
+
: "the security audit could not be completed";
|
|
153
|
+
return [
|
|
154
|
+
`[SECURITY] Sprint blocked: ${reasonText}. No specific findings are available — investigate the audit failure and retry.`,
|
|
155
|
+
];
|
|
156
|
+
}
|
|
157
|
+
const { review } = verdict.result;
|
|
158
|
+
// The auditor always constructs `review.critical` from SecurityFinding
|
|
159
|
+
// objects (security-auditor-agent.ts), a superset of the locked
|
|
160
|
+
// ReviewFinding shape — safe to narrow here to read the optional vulnClass.
|
|
161
|
+
const criticalFindings = review.critical;
|
|
162
|
+
const parts = [
|
|
163
|
+
`[SECURITY] Security audit blocked this sprint (reason: ${verdict.reason}, ${criticalFindings.length} critical finding(s)).`,
|
|
164
|
+
];
|
|
165
|
+
for (const finding of criticalFindings.slice(0, MAX_RENDERED_FINDINGS)) {
|
|
166
|
+
const evidence = finding.evidence[0];
|
|
167
|
+
const path = evidence?.path ?? "unknown";
|
|
168
|
+
const line = evidence?.line ?? 0;
|
|
169
|
+
const vulnPrefix = finding.vulnClass ? `${finding.vulnClass}: ` : "";
|
|
170
|
+
parts.push(`[CRITICAL] ${vulnPrefix}${finding.description} at ${path}:${line} — remediate by fixing the flagged vulnerability before this sprint can pass.`);
|
|
171
|
+
}
|
|
172
|
+
return parts;
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=security-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-gate.js","sourceRoot":"","sources":["../../src/orchestrator/security-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* security-hub.ts — maps SecurityAuditResult findings into the canonical hub
|
|
3
|
+
* Finding shape and emits them via an injected sink (spec-20260712-security-
|
|
4
|
+
* audit-agent-team, sprint 6). Closes the ADR open question at
|
|
5
|
+
* .bober/architecture/arch-20260712-security-audit-agent-team-architecture.md:363
|
|
6
|
+
* ("wiring important findings into the priority hub ... must respect the
|
|
7
|
+
* hub's canonical FindingSchema").
|
|
8
|
+
*
|
|
9
|
+
* Two callers wire this module in AFTER the audit's verdict is already
|
|
10
|
+
* computed: the pipeline gate (security-gate.ts) and the standalone CLI
|
|
11
|
+
* (security-audit.ts). Neither call site awaits emission inside a
|
|
12
|
+
* time-boxed race, and a hub failure never changes the verdict or exit code
|
|
13
|
+
* — emission is a best-effort side effect (nonGoals[3]).
|
|
14
|
+
*
|
|
15
|
+
* Mirrors the injected-FindingSink precedent in src/research/runner.ts:
|
|
16
|
+
* the mapper is PURE (never reads the clock — `now` is injected by the
|
|
17
|
+
* caller) and the sink is a dependency the caller binds to the real
|
|
18
|
+
* `ingestFinding` (src/hub/finding-store.ts) at the fs boundary.
|
|
19
|
+
*/
|
|
20
|
+
import type { Finding } from "../hub/finding.js";
|
|
21
|
+
import type { SecurityAuditResult } from "./security-audit-types.js";
|
|
22
|
+
import type { Logger } from "../utils/logger.js";
|
|
23
|
+
/** Hub Finding emitter — mirrors research runner's FindingSink (runner.ts:44). */
|
|
24
|
+
export type SecurityFindingSink = (finding: Finding) => Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Map a SecurityAuditResult into hub Findings — one per critical (severity
|
|
27
|
+
* 5) and important (severity 3) finding. `minor` and `approvedAreas` are
|
|
28
|
+
* never emitted (nonGoals[2]) — the LLM auditor did not confirm those into a
|
|
29
|
+
* blocking or notable bucket. A clean audit (no critical/important) returns
|
|
30
|
+
* `[]`.
|
|
31
|
+
*
|
|
32
|
+
* PURE: never reads the clock — `now` is injected by the caller.
|
|
33
|
+
*/
|
|
34
|
+
export declare function mapAuditToFindings(result: SecurityAuditResult, now: string): Finding[];
|
|
35
|
+
/**
|
|
36
|
+
* Map and emit a SecurityAuditResult's findings through the injected sink.
|
|
37
|
+
*
|
|
38
|
+
* Best-effort: never throws. A failure raised by the sink (or by the
|
|
39
|
+
* mapping) is caught and logged via `log.warn` — it must NEVER alter the
|
|
40
|
+
* audit verdict or block the pipeline/CLI (sc-6-2). Callers invoke this
|
|
41
|
+
* strictly AFTER the verdict has already been computed and OUTSIDE any
|
|
42
|
+
* time-boxed race (nonGoals[3]).
|
|
43
|
+
*/
|
|
44
|
+
export declare function emitSecurityFindings(result: SecurityAuditResult, sink: SecurityFindingSink, log: Pick<Logger, "warn">, now: string): Promise<void>;
|
|
45
|
+
//# sourceMappingURL=security-hub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-hub.d.ts","sourceRoot":"","sources":["../../src/orchestrator/security-hub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,mBAAmB,EAAmB,MAAM,2BAA2B,CAAC;AACtF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAIjD,kFAAkF;AAClF,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAqGtE;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE,CAYtF;AAID;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,mBAAmB,EAC3B,IAAI,EAAE,mBAAmB,EACzB,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EACzB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAQf"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* security-hub.ts — maps SecurityAuditResult findings into the canonical hub
|
|
3
|
+
* Finding shape and emits them via an injected sink (spec-20260712-security-
|
|
4
|
+
* audit-agent-team, sprint 6). Closes the ADR open question at
|
|
5
|
+
* .bober/architecture/arch-20260712-security-audit-agent-team-architecture.md:363
|
|
6
|
+
* ("wiring important findings into the priority hub ... must respect the
|
|
7
|
+
* hub's canonical FindingSchema").
|
|
8
|
+
*
|
|
9
|
+
* Two callers wire this module in AFTER the audit's verdict is already
|
|
10
|
+
* computed: the pipeline gate (security-gate.ts) and the standalone CLI
|
|
11
|
+
* (security-audit.ts). Neither call site awaits emission inside a
|
|
12
|
+
* time-boxed race, and a hub failure never changes the verdict or exit code
|
|
13
|
+
* — emission is a best-effort side effect (nonGoals[3]).
|
|
14
|
+
*
|
|
15
|
+
* Mirrors the injected-FindingSink precedent in src/research/runner.ts:
|
|
16
|
+
* the mapper is PURE (never reads the clock — `now` is injected by the
|
|
17
|
+
* caller) and the sink is a dependency the caller binds to the real
|
|
18
|
+
* `ingestFinding` (src/hub/finding-store.ts) at the fs boundary.
|
|
19
|
+
*/
|
|
20
|
+
import { createHash } from "node:crypto";
|
|
21
|
+
// ── Local id hash ────────────────────────────────────────────────────────
|
|
22
|
+
/**
|
|
23
|
+
* Content-stable id: hash of domain|title|kind. Replicated locally because
|
|
24
|
+
* finding-store.ts's own deriveFindingId is not exported — src/research/
|
|
25
|
+
* runner.ts sets this precedent (runner.ts:104-109). This is an id hash,
|
|
26
|
+
* NOT a schema-level redefinition of the Finding shape (sc-6-4).
|
|
27
|
+
*/
|
|
28
|
+
function deriveFindingId(domain, title, kind) {
|
|
29
|
+
return createHash("sha256").update(`${domain}|${title}|${kind}`).digest("hex").slice(0, 16);
|
|
30
|
+
}
|
|
31
|
+
// ── Severity mapping (sc-6-1) ────────────────────────────────────────────
|
|
32
|
+
//
|
|
33
|
+
// Read directly from the REAL FindingSchema (src/hub/finding.ts:15-16):
|
|
34
|
+
// both `severity` and `urgency` are `z.number().int().min(1).max(5)`.
|
|
35
|
+
//
|
|
36
|
+
// Audit bucket Hub severity Hub urgency Rationale
|
|
37
|
+
// ------------------------ ------------- ------------ ----------------------
|
|
38
|
+
// review.critical[] 5 (highest) 5 blocking vulnerability
|
|
39
|
+
// review.important[] 3 (mid) 3 non-blocking, surfaced
|
|
40
|
+
// review.minor[] / (not emitted) -- nonGoals[2] — the LLM
|
|
41
|
+
// approvedAreas auditor did not confirm
|
|
42
|
+
// these into a blocking
|
|
43
|
+
// or notable bucket.
|
|
44
|
+
const CRITICAL_SEVERITY = 5;
|
|
45
|
+
const CRITICAL_URGENCY = 5;
|
|
46
|
+
const IMPORTANT_SEVERITY = 3;
|
|
47
|
+
const IMPORTANT_URGENCY = 3;
|
|
48
|
+
// ── Mapping ──────────────────────────────────────────────────────────────
|
|
49
|
+
/**
|
|
50
|
+
* Build one hub Finding per SecurityFinding in a bucket.
|
|
51
|
+
*
|
|
52
|
+
* `title` is STABLE — vulnClass + a discriminator + the first evidence
|
|
53
|
+
* entry's path:line. It must NEVER embed the free-text description
|
|
54
|
+
* verbatim: the Finding `id` is derived from `domain|title|kind`, so a
|
|
55
|
+
* title that varies across retries would mint a new id every time and
|
|
56
|
+
* defeat the hub's content-hash dedup (sc-6-3).
|
|
57
|
+
*
|
|
58
|
+
* The discriminator (`#${...}`) fixes a title collision (G10): two
|
|
59
|
+
* DIFFERENT vulnerabilities of the same vulnClass at the same path:line
|
|
60
|
+
* used to hash to the SAME id and silently overwrite each other. It
|
|
61
|
+
* prefers `signatureId`, then `cwe`, then falls back to a short stable
|
|
62
|
+
* hash of the finding's own `description` — content-derived so identical
|
|
63
|
+
* retries (same description) still resolve to the same discriminator and
|
|
64
|
+
* dedup, while two distinct descriptions diverge into distinct ids.
|
|
65
|
+
*
|
|
66
|
+
* The description itself still lands in `evidence[]` — FindingSchema has
|
|
67
|
+
* no `body` field, and its `evidence` is `z.array(z.string())` (finding.
|
|
68
|
+
* ts:17), NOT the `{path,line,snippet}[]` shape a SecurityFinding
|
|
69
|
+
* carries — so each evidence entry is flattened to a string.
|
|
70
|
+
*/
|
|
71
|
+
function mapBucket(findings, severity, urgency, stack, now) {
|
|
72
|
+
return findings.map((finding) => {
|
|
73
|
+
const primaryEvidence = finding.evidence[0];
|
|
74
|
+
const path = primaryEvidence?.path ?? "unknown";
|
|
75
|
+
const line = primaryEvidence?.line ?? 0;
|
|
76
|
+
const discriminator = finding.signatureId ??
|
|
77
|
+
finding.cwe ??
|
|
78
|
+
createHash("sha256").update(finding.description).digest("hex").slice(0, 8);
|
|
79
|
+
const title = `[security] ${finding.vulnClass ?? "vulnerability"} #${discriminator} at ${path}:${line}`;
|
|
80
|
+
const evidence = [
|
|
81
|
+
finding.description,
|
|
82
|
+
...finding.evidence.map((e) => `${e.path}:${e.line} — ${e.snippet}`),
|
|
83
|
+
];
|
|
84
|
+
return {
|
|
85
|
+
id: deriveFindingId("security", title, "risk"),
|
|
86
|
+
domain: "security",
|
|
87
|
+
title,
|
|
88
|
+
kind: "risk",
|
|
89
|
+
urgency,
|
|
90
|
+
severity,
|
|
91
|
+
evidence,
|
|
92
|
+
surfacedAt: now,
|
|
93
|
+
tags: [
|
|
94
|
+
"security",
|
|
95
|
+
...(finding.vulnClass ? [`vuln:${finding.vulnClass}`] : []),
|
|
96
|
+
`stack:${stack}`,
|
|
97
|
+
...(finding.cwe ? [`cwe:${finding.cwe}`] : []),
|
|
98
|
+
...(finding.severity ? [`severity:${finding.severity}`] : []),
|
|
99
|
+
...(finding.confidence ? [`confidence:${finding.confidence}`] : []),
|
|
100
|
+
...(finding.signatureId ? [`sig:${finding.signatureId}`] : []),
|
|
101
|
+
],
|
|
102
|
+
status: "open",
|
|
103
|
+
};
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Map a SecurityAuditResult into hub Findings — one per critical (severity
|
|
108
|
+
* 5) and important (severity 3) finding. `minor` and `approvedAreas` are
|
|
109
|
+
* never emitted (nonGoals[2]) — the LLM auditor did not confirm those into a
|
|
110
|
+
* blocking or notable bucket. A clean audit (no critical/important) returns
|
|
111
|
+
* `[]`.
|
|
112
|
+
*
|
|
113
|
+
* PURE: never reads the clock — `now` is injected by the caller.
|
|
114
|
+
*/
|
|
115
|
+
export function mapAuditToFindings(result, now) {
|
|
116
|
+
// review.critical/important are always built from SecurityFinding objects
|
|
117
|
+
// inside runSecurityAudit (a superset of the locked ReviewFinding shape) —
|
|
118
|
+
// the same safe narrowing security-gate.ts's renderSecurityFeedback relies
|
|
119
|
+
// on (security-gate.ts:158).
|
|
120
|
+
const critical = result.review.critical;
|
|
121
|
+
const important = result.review.important;
|
|
122
|
+
return [
|
|
123
|
+
...mapBucket(critical, CRITICAL_SEVERITY, CRITICAL_URGENCY, result.stack, now),
|
|
124
|
+
...mapBucket(important, IMPORTANT_SEVERITY, IMPORTANT_URGENCY, result.stack, now),
|
|
125
|
+
];
|
|
126
|
+
}
|
|
127
|
+
// ── Emission ─────────────────────────────────────────────────────────────
|
|
128
|
+
/**
|
|
129
|
+
* Map and emit a SecurityAuditResult's findings through the injected sink.
|
|
130
|
+
*
|
|
131
|
+
* Best-effort: never throws. A failure raised by the sink (or by the
|
|
132
|
+
* mapping) is caught and logged via `log.warn` — it must NEVER alter the
|
|
133
|
+
* audit verdict or block the pipeline/CLI (sc-6-2). Callers invoke this
|
|
134
|
+
* strictly AFTER the verdict has already been computed and OUTSIDE any
|
|
135
|
+
* time-boxed race (nonGoals[3]).
|
|
136
|
+
*/
|
|
137
|
+
export async function emitSecurityFindings(result, sink, log, now) {
|
|
138
|
+
try {
|
|
139
|
+
for (const finding of mapAuditToFindings(result, now)) {
|
|
140
|
+
await sink(finding);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
log.warn(`Security hub emission failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=security-hub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-hub.js","sourceRoot":"","sources":["../../src/orchestrator/security-hub.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { VulnClass } from "../../security-audit-types.js";
|
|
2
|
+
import type { SecurityStackId } from "../signature.js";
|
|
3
|
+
/**
|
|
4
|
+
* Deterministic measurement harness for the security-auditor finder+verifier
|
|
5
|
+
* pipeline (spec-20260714 sprint 9, architecture success criterion #3:
|
|
6
|
+
* "measured, not asserted"). Pure — no fs, no network, no `Math.random`, no
|
|
7
|
+
* `new Date()`/`Date.now()`. Not wired into `runSecurityAudit` or the gate
|
|
8
|
+
* (nonGoals: "not a new blocking gate") — this is a leaf measurement module
|
|
9
|
+
* consumed only by `harness.test.ts`.
|
|
10
|
+
*/
|
|
11
|
+
/** One labelled benchmark case (mirrors a `fixtures/manifest.json` entry). */
|
|
12
|
+
export interface BenchmarkCase {
|
|
13
|
+
/** Stable id, unique in the corpus (used by fakes to pick the FP subset). */
|
|
14
|
+
id: string;
|
|
15
|
+
expected: "vulnerable" | "safe";
|
|
16
|
+
stack: SecurityStackId;
|
|
17
|
+
/** Only meaningful for expected:"vulnerable". Omitted for scanner-only classes (supply-chain). */
|
|
18
|
+
signatureId?: string;
|
|
19
|
+
vulnClass?: VulnClass;
|
|
20
|
+
/** The illustrative snippet — inline, never a separate compiled file. */
|
|
21
|
+
code: string;
|
|
22
|
+
}
|
|
23
|
+
/** Injected finder: does this case get flagged CRITICAL? (pluggable so CI uses a fake). */
|
|
24
|
+
export type FinderFn = (c: BenchmarkCase) => boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Injected verifier: given the finder's critical verdict, the post-verify verdict.
|
|
27
|
+
* DOWNGRADE-ONLY, mirroring `VerifierResult` semantics (security-verifier-agent.ts):
|
|
28
|
+
* may only turn true->false (drop/downgrade), never false->true.
|
|
29
|
+
*/
|
|
30
|
+
export type VerifierFn = (c: BenchmarkCase, finderCritical: boolean) => boolean;
|
|
31
|
+
export interface StageMetrics {
|
|
32
|
+
/** vulnerable cases flagged critical / total vulnerable cases (detection retained; higher is better). */
|
|
33
|
+
recall: number;
|
|
34
|
+
/** safe cases flagged critical / total safe cases (false-positive BLOCK rate; lower is better). */
|
|
35
|
+
fpBlockRate: number;
|
|
36
|
+
}
|
|
37
|
+
export interface MeasureResult {
|
|
38
|
+
finderOnly: StageMetrics;
|
|
39
|
+
finderPlusVerifier: StageMetrics;
|
|
40
|
+
}
|
|
41
|
+
/** PURE. No fs, no network, NO Math.random, NO new Date(). */
|
|
42
|
+
export declare function measure(corpus: BenchmarkCase[], finderFn: FinderFn, verifierFn: VerifierFn): MeasureResult;
|
|
43
|
+
//# sourceMappingURL=harness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../../../src/orchestrator/security-knowledge/benchmark/harness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD;;;;;;;GAOG;AAEH,8EAA8E;AAC9E,MAAM,WAAW,aAAa;IAC5B,6EAA6E;IAC7E,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,YAAY,GAAG,MAAM,CAAC;IAChC,KAAK,EAAE,eAAe,CAAC;IACvB,kGAAkG;IAClG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;CACd;AAED,2FAA2F;AAC3F,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC;AAErD;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,aAAa,EAAE,cAAc,EAAE,OAAO,KAAK,OAAO,CAAC;AAEhF,MAAM,WAAW,YAAY;IAC3B,yGAAyG;IACzG,MAAM,EAAE,MAAM,CAAC;IACf,mGAAmG;IACnG,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,YAAY,CAAC;IACzB,kBAAkB,EAAE,YAAY,CAAC;CAClC;AAED,8DAA8D;AAC9D,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,GAAG,aAAa,CAc1G"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** PURE. No fs, no network, NO Math.random, NO new Date(). */
|
|
2
|
+
export function measure(corpus, finderFn, verifierFn) {
|
|
3
|
+
const vulnerable = corpus.filter((c) => c.expected === "vulnerable");
|
|
4
|
+
const safe = corpus.filter((c) => c.expected === "safe");
|
|
5
|
+
const finderOnly = (c) => finderFn(c);
|
|
6
|
+
const finderPlusVerifier = (c) => verifierFn(c, finderFn(c));
|
|
7
|
+
const rate = (cases, flag) => cases.length === 0 ? 0 : cases.filter(flag).length / cases.length;
|
|
8
|
+
return {
|
|
9
|
+
finderOnly: { recall: rate(vulnerable, finderOnly), fpBlockRate: rate(safe, finderOnly) },
|
|
10
|
+
finderPlusVerifier: { recall: rate(vulnerable, finderPlusVerifier), fpBlockRate: rate(safe, finderPlusVerifier) },
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.js","sourceRoot":"","sources":["../../../../src/orchestrator/security-knowledge/benchmark/harness.ts"],"names":[],"mappings":"AA+CA,8DAA8D;AAC9D,MAAM,UAAU,OAAO,CAAC,MAAuB,EAAE,QAAkB,EAAE,UAAsB;IACzF,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC;IACrE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;IAEzD,MAAM,UAAU,GAAG,CAAC,CAAgB,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,kBAAkB,GAAG,CAAC,CAAgB,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5E,MAAM,IAAI,GAAG,CAAC,KAAsB,EAAE,IAAmC,EAAE,EAAE,CAC3E,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAEpE,OAAO;QACL,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE;QACzF,kBAAkB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,EAAE;KAClH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { BoberConfig } from "../../config/schema.js";
|
|
2
|
+
/**
|
|
3
|
+
* Orchestrator-owned real-diff provider (spec-20260714 sprint 6, ADR-5).
|
|
4
|
+
*
|
|
5
|
+
* Shells `git` in orchestrator Node — NEVER as an auditor tool — to compute
|
|
6
|
+
* the actual changed files/hunks for a sprint, replacing the sprint-5 seam
|
|
7
|
+
* that ranked signatures against `contract.estimatedFiles` only. Mirrors
|
|
8
|
+
* `security-scanners.ts`'s injectable never-throw runner shape exactly
|
|
9
|
+
* (Pattern A): any git failure (ENOENT, not-a-repo, abort, malformed
|
|
10
|
+
* output) degrades to an empty `AuditDiff` rather than throwing, so a
|
|
11
|
+
* broken git environment never crashes the audit — it just falls back to
|
|
12
|
+
* `estimated-files` behavior.
|
|
13
|
+
*
|
|
14
|
+
* `AuditDiff` is the shared input type future sprints (7: supply-chain,
|
|
15
|
+
* 8: verifier) will also consume — kept clean and exported.
|
|
16
|
+
*/
|
|
17
|
+
export interface DiffHunk {
|
|
18
|
+
startLine: number;
|
|
19
|
+
lineCount: number;
|
|
20
|
+
content: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ChangedFile {
|
|
23
|
+
path: string;
|
|
24
|
+
status: "added" | "modified" | "deleted" | "renamed";
|
|
25
|
+
hunks: DiffHunk[];
|
|
26
|
+
}
|
|
27
|
+
export interface AuditDiff {
|
|
28
|
+
changedFiles: ChangedFile[];
|
|
29
|
+
neighborhoodFiles: string[];
|
|
30
|
+
truncated: boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare const EMPTY_DIFF: AuditDiff;
|
|
33
|
+
export interface GitRunResult {
|
|
34
|
+
exitCode: number | undefined;
|
|
35
|
+
stdout: string;
|
|
36
|
+
failed: boolean;
|
|
37
|
+
}
|
|
38
|
+
export type GitRunner = (args: string[], opts: {
|
|
39
|
+
cwd: string;
|
|
40
|
+
signal: AbortSignal;
|
|
41
|
+
}) => Promise<GitRunResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Parse `git diff --name-status` + `git diff -U<n>` output into
|
|
44
|
+
* `ChangedFile[]`, bounded by `MAX_CHANGED_FILES` (file count) and
|
|
45
|
+
* `MAX_HUNK_BYTES` (total hunk content bytes). Pure and total — any
|
|
46
|
+
* structural surprise (non-string input, malformed lines) is skipped
|
|
47
|
+
* rather than thrown (Pattern B, mirrors `parseSlitherOutput`).
|
|
48
|
+
*/
|
|
49
|
+
export declare function parseUnifiedDiff(nameStatus: string, unified: string): {
|
|
50
|
+
files: ChangedFile[];
|
|
51
|
+
truncated: boolean;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Tokenizes changed-hunk text into keywords for the selector's
|
|
55
|
+
* keyword-overlap ranking (selector.ts). Pure and total: guards every
|
|
56
|
+
* field access, never throws on malformed hunk content.
|
|
57
|
+
*/
|
|
58
|
+
export declare function extractDiffKeywords(files: ChangedFile[]): string[];
|
|
59
|
+
export interface SecurityDiffComputeInput {
|
|
60
|
+
projectRoot: string;
|
|
61
|
+
baseRef?: string;
|
|
62
|
+
expandWithGraph: boolean;
|
|
63
|
+
signal: AbortSignal;
|
|
64
|
+
/** Needed for the `getGraphState(config).engineHealth === 'ready'` gate (sc-6-2). */
|
|
65
|
+
config?: BoberConfig;
|
|
66
|
+
/** Injected in tests — default wraps execa. */
|
|
67
|
+
runner?: GitRunner;
|
|
68
|
+
}
|
|
69
|
+
export interface SecurityDiffProvider {
|
|
70
|
+
compute(input: SecurityDiffComputeInput): Promise<AuditDiff>;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Computes a real, bounded `AuditDiff` by shelling git in orchestrator
|
|
74
|
+
* Node. NEVER throws: any failure (missing git, not-a-repo, abort,
|
|
75
|
+
* malformed diff output) degrades to `EMPTY_DIFF`, which callers treat as
|
|
76
|
+
* "fall back to estimated-files" rather than an audit-crashing error.
|
|
77
|
+
*/
|
|
78
|
+
export declare const securityDiffProvider: SecurityDiffProvider;
|
|
79
|
+
//# sourceMappingURL=diff-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-provider.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/security-knowledge/diff-provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAI1D;;;;;;;;;;;;;;GAcG;AAIH,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;IACrD,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,UAAU,EAAE,SAAyE,CAAC;AAInG,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,SAAS,GAAG,CACtB,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,KACvC,OAAO,CAAC,YAAY,CAAC,CAAC;AAqL3B;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAmC9C;AAoBD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CAyBlE;AAqCD,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,qFAAqF;IACrF,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;CAC9D;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,oBAwDlC,CAAC"}
|