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,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SeoDataSource seam (spec-20260715-ultimate-seo-suite, Sprint 6).
|
|
3
|
+
*
|
|
4
|
+
* The unified interface every data provider (offline `LocalExportSource`,
|
|
5
|
+
* this sprint; live `gsc`/`dataforseo` adapters, sprints 8-9) implements.
|
|
6
|
+
* Capability/query/row shapes are quoted from the architecture Component
|
|
7
|
+
* Breakdown / Data Model (.bober/architecture/
|
|
8
|
+
* arch-20260715-ultimate-seo-agents-skills-architecture.md:143-212).
|
|
9
|
+
*
|
|
10
|
+
* `DataOutcome`/`DataProvenance` are the canonical outcome union defined in
|
|
11
|
+
* `./types.js` (Sprint 1) — RE-EXPORTED here, never redefined.
|
|
12
|
+
*/
|
|
13
|
+
import type { DataOutcome } from "./types.js";
|
|
14
|
+
export type { DataOutcome, DataProvenance } from "./types.js";
|
|
15
|
+
/**
|
|
16
|
+
* The seven data capabilities a `SeoDataSource` may serve. Widened from five
|
|
17
|
+
* to seven (spec-20260717-seo-improver-builder, Sprint 1) with
|
|
18
|
+
* `"ai-visibility"` and `"link-graph"` — a closed union, so every
|
|
19
|
+
* implementer + any exhaustive `Record<SeoCapability, ...>` map is forced by
|
|
20
|
+
* the compiler to account for the two new members.
|
|
21
|
+
*/
|
|
22
|
+
export type SeoCapability = "search-analytics" | "url-inspection" | "serp" | "keywords" | "backlinks" | "ai-visibility" | "link-graph";
|
|
23
|
+
export type SearchAnalyticsQuery = {
|
|
24
|
+
siteUrl: string;
|
|
25
|
+
startDate: string;
|
|
26
|
+
endDate: string;
|
|
27
|
+
dimensions: Array<"query" | "page" | "country" | "device">;
|
|
28
|
+
rowLimit?: number;
|
|
29
|
+
};
|
|
30
|
+
export type UrlInspectionQuery = {
|
|
31
|
+
siteUrl: string;
|
|
32
|
+
inspectionUrl: string;
|
|
33
|
+
};
|
|
34
|
+
export type SerpQuery = {
|
|
35
|
+
keyword: string;
|
|
36
|
+
location: string;
|
|
37
|
+
priority?: "standard" | "priority" | "live";
|
|
38
|
+
};
|
|
39
|
+
export type KeywordQuery = {
|
|
40
|
+
keywords: string[];
|
|
41
|
+
location: string;
|
|
42
|
+
};
|
|
43
|
+
export type BacklinkQuery = {
|
|
44
|
+
target: string;
|
|
45
|
+
limit?: number;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* AI-visibility/GEO probe query — one batch of prompts against a target
|
|
49
|
+
* (architecture Data Model, arch-20260716-...-architecture.md:64; F5).
|
|
50
|
+
*/
|
|
51
|
+
export type AiVisibilityQuery = {
|
|
52
|
+
target: string;
|
|
53
|
+
prompts: string[];
|
|
54
|
+
locale?: string;
|
|
55
|
+
};
|
|
56
|
+
/** Site-crawl internal-link-graph query (architecture:65; F7). */
|
|
57
|
+
export type LinkGraphQuery = {
|
|
58
|
+
rootUrl: string;
|
|
59
|
+
limit?: number;
|
|
60
|
+
};
|
|
61
|
+
/** GSC Search-Analytics export, flattened. */
|
|
62
|
+
export type SearchAnalyticsRow = {
|
|
63
|
+
query?: string;
|
|
64
|
+
page?: string;
|
|
65
|
+
country?: string;
|
|
66
|
+
device?: string;
|
|
67
|
+
clicks: number;
|
|
68
|
+
impressions: number;
|
|
69
|
+
ctr: number;
|
|
70
|
+
position: number;
|
|
71
|
+
};
|
|
72
|
+
/** GSC URL-Inspection export or local crawl output. */
|
|
73
|
+
export type UrlInspectionRow = {
|
|
74
|
+
url: string;
|
|
75
|
+
coverageState?: string;
|
|
76
|
+
indexingState?: string;
|
|
77
|
+
lastCrawlTime?: string;
|
|
78
|
+
robotsTxtState?: string;
|
|
79
|
+
pageFetchState?: string;
|
|
80
|
+
};
|
|
81
|
+
export type SerpRow = {
|
|
82
|
+
keyword: string;
|
|
83
|
+
position: number;
|
|
84
|
+
url: string;
|
|
85
|
+
title?: string;
|
|
86
|
+
location?: string;
|
|
87
|
+
};
|
|
88
|
+
export type KeywordRow = {
|
|
89
|
+
keyword: string;
|
|
90
|
+
searchVolume?: number;
|
|
91
|
+
cpc?: number;
|
|
92
|
+
competition?: number;
|
|
93
|
+
location?: string;
|
|
94
|
+
};
|
|
95
|
+
export type BacklinkRow = {
|
|
96
|
+
sourceUrl: string;
|
|
97
|
+
targetUrl: string;
|
|
98
|
+
anchor?: string;
|
|
99
|
+
dofollow?: boolean;
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* One AI-answer probe result — one row per (prompt, provider) pair
|
|
103
|
+
* (architecture:64; F5). `citationPresent`/`sourceUrls` capture whether the
|
|
104
|
+
* AI answer cited the target at all, distinct from `mentioned` (brand
|
|
105
|
+
* mentioned in the answer text without a citation).
|
|
106
|
+
*/
|
|
107
|
+
export type AiVisibilityRow = {
|
|
108
|
+
prompt: string;
|
|
109
|
+
provider: string;
|
|
110
|
+
mentioned: boolean;
|
|
111
|
+
rank?: number;
|
|
112
|
+
citationPresent: boolean;
|
|
113
|
+
sourceUrls: string[];
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* One internal/external link edge from a site crawl — flat rows, not a
|
|
117
|
+
* nested graph (architecture:65, ADR-6; F7).
|
|
118
|
+
*/
|
|
119
|
+
export type LinkGraphRow = {
|
|
120
|
+
fromUrl: string;
|
|
121
|
+
toUrl: string;
|
|
122
|
+
anchor?: string;
|
|
123
|
+
internal: boolean;
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* One crawled page's sanitized content (architecture:66, ADR-11; F6/F7).
|
|
127
|
+
* `content` has already been passed through `ContentSanitizer` by the time
|
|
128
|
+
* it reaches this row — no further sanitization is required downstream. No
|
|
129
|
+
* `Query` pair this sprint (the crawl query lives on `CrawlEngine`, a later
|
|
130
|
+
* sprint).
|
|
131
|
+
*/
|
|
132
|
+
export type CrawlPageRow = {
|
|
133
|
+
url: string;
|
|
134
|
+
title?: string;
|
|
135
|
+
content: string;
|
|
136
|
+
};
|
|
137
|
+
/**
|
|
138
|
+
* Implemented by every SEO data provider (offline or live). Each method
|
|
139
|
+
* returns a `DataOutcome` and — per the discipline mirrored from
|
|
140
|
+
* `RetrievalOutcome` (`src/medical/retrieval/medline-source.ts:25-28`) —
|
|
141
|
+
* NEVER throws to the caller: absent/unsupported capability maps to
|
|
142
|
+
* `{ kind: "disabled" }`, a parseable-but-empty result maps to
|
|
143
|
+
* `{ kind: "abstain", reason }`.
|
|
144
|
+
*/
|
|
145
|
+
export interface SeoDataSource {
|
|
146
|
+
/** The capabilities this source can currently serve (advertises only what it can). */
|
|
147
|
+
capabilities(): SeoCapability[];
|
|
148
|
+
searchAnalytics(q: SearchAnalyticsQuery): Promise<DataOutcome<SearchAnalyticsRow[]>>;
|
|
149
|
+
urlInspection(q: UrlInspectionQuery): Promise<DataOutcome<UrlInspectionRow[]>>;
|
|
150
|
+
serp(q: SerpQuery): Promise<DataOutcome<SerpRow[]>>;
|
|
151
|
+
keywords(q: KeywordQuery): Promise<DataOutcome<KeywordRow[]>>;
|
|
152
|
+
backlinks(q: BacklinkQuery): Promise<DataOutcome<BacklinkRow[]>>;
|
|
153
|
+
aiVisibility(q: AiVisibilityQuery): Promise<DataOutcome<AiVisibilityRow[]>>;
|
|
154
|
+
linkGraph(q: LinkGraphQuery): Promise<DataOutcome<LinkGraphRow[]>>;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=data-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-source.d.ts","sourceRoot":"","sources":["../../src/seo/data-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAI9D;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GACrB,kBAAkB,GAClB,gBAAgB,GAChB,MAAM,GACN,UAAU,GACV,WAAW,GACX,eAAe,GACf,YAAY,CAAC;AAIjB,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,KAAK,CAAC,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5E,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,MAAM,MAAM,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvF,kEAAkE;AAClE,MAAM,MAAM,cAAc,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAMjE,8CAA8C;AAC9C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,uDAAuD;AACvD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAElG;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAI5E;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,sFAAsF;IACtF,YAAY,IAAI,aAAa,EAAE,CAAC;IAChC,eAAe,CAAC,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;IACrF,aAAa,CAAC,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;IAC/E,IAAI,CAAC,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC9D,SAAS,CAAC,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAGjE,YAAY,CAAC,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IAC5E,SAAS,CAAC,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;CACpE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-source.js","sourceRoot":"","sources":["../../src/seo/data-source.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** SeoEgressGuard — five independently opt-in live-data egress axes, all default false (spec-20260715-ultimate-seo-suite, Sprint 1; widened spec-20260717-seo-improver-builder, Sprint 1; widened again in-house-ai-visibility, Sprint 3; mirrors medical/egress.ts:17-59, ADR-6). */
|
|
2
|
+
import type { BoberConfig } from "../config/schema.js";
|
|
3
|
+
/**
|
|
4
|
+
* The five independent live-data egress axes. All default FALSE
|
|
5
|
+
* (code-enforced zero-egress). `ai-visibility-scrape` (Sprint 3) is
|
|
6
|
+
* axis-only this sprint — no scrape provider composes it yet (Sprint 10).
|
|
7
|
+
*/
|
|
8
|
+
export type SeoEgressAxis = "search-console" | "serp-provider" | "ai-visibility" | "site-crawl" | "ai-visibility-scrape";
|
|
9
|
+
/**
|
|
10
|
+
* Guards outbound egress for the SEO pipeline's live-data adapters (Google
|
|
11
|
+
* Search Console, DataForSEO, AI-visibility provider, damcrawler site-crawl,
|
|
12
|
+
* AI-visibility UI-scrape arm).
|
|
13
|
+
*
|
|
14
|
+
* The five axes operate INDEPENDENTLY — opting in one does NOT opt in any
|
|
15
|
+
* other. All default false when absent from config. `assertAllowed` throws
|
|
16
|
+
* if the axis is not opted in, providing a hard code-enforced barrier that
|
|
17
|
+
* every network-opening adapter method must call first (ADR-5).
|
|
18
|
+
*
|
|
19
|
+
* bober: plain decision object; no network import here; swap for a shared
|
|
20
|
+
* policy engine if per-scope granularity is ever needed.
|
|
21
|
+
*/
|
|
22
|
+
export declare class SeoEgressGuard {
|
|
23
|
+
private readonly searchConsole;
|
|
24
|
+
private readonly serpProvider;
|
|
25
|
+
private readonly aiVisibility;
|
|
26
|
+
private readonly siteCrawl;
|
|
27
|
+
private readonly aiVisibilityScrape;
|
|
28
|
+
constructor(searchConsole: boolean, serpProvider: boolean, aiVisibility?: boolean, siteCrawl?: boolean, aiVisibilityScrape?: boolean);
|
|
29
|
+
/** Build from BoberConfig seo section; all five axes default false when absent. */
|
|
30
|
+
static fromConfig(config: BoberConfig): SeoEgressGuard;
|
|
31
|
+
/** Returns true only when the axis has been explicitly opted in via config. */
|
|
32
|
+
isAllowed(axis: SeoEgressAxis): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Throws an Error when the axis is not enabled.
|
|
35
|
+
* Returns void (not throws) when the axis is allowed.
|
|
36
|
+
*/
|
|
37
|
+
assertAllowed(axis: SeoEgressAxis): void;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=egress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"egress.d.ts","sourceRoot":"","sources":["../../src/seo/egress.ts"],"names":[],"mappings":"AAAA,sRAAsR;AACtR,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACrB,gBAAgB,GAChB,eAAe,GACf,eAAe,GACf,YAAY,GACZ,sBAAsB,CAAC;AAE3B;;;;;;;;;;;;GAYG;AACH,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAG7B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBANlB,aAAa,EAAE,OAAO,EACtB,YAAY,EAAE,OAAO,EAGrB,YAAY,GAAE,OAAe,EAC7B,SAAS,GAAE,OAAe,EAC1B,kBAAkB,GAAE,OAAe;IAGtD,mFAAmF;IACnF,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc;IAWtD,+EAA+E;IAC/E,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO;IAmBvC;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;CAKzC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guards outbound egress for the SEO pipeline's live-data adapters (Google
|
|
3
|
+
* Search Console, DataForSEO, AI-visibility provider, damcrawler site-crawl,
|
|
4
|
+
* AI-visibility UI-scrape arm).
|
|
5
|
+
*
|
|
6
|
+
* The five axes operate INDEPENDENTLY — opting in one does NOT opt in any
|
|
7
|
+
* other. All default false when absent from config. `assertAllowed` throws
|
|
8
|
+
* if the axis is not opted in, providing a hard code-enforced barrier that
|
|
9
|
+
* every network-opening adapter method must call first (ADR-5).
|
|
10
|
+
*
|
|
11
|
+
* bober: plain decision object; no network import here; swap for a shared
|
|
12
|
+
* policy engine if per-scope granularity is ever needed.
|
|
13
|
+
*/
|
|
14
|
+
export class SeoEgressGuard {
|
|
15
|
+
searchConsole;
|
|
16
|
+
serpProvider;
|
|
17
|
+
aiVisibility;
|
|
18
|
+
siteCrawl;
|
|
19
|
+
aiVisibilityScrape;
|
|
20
|
+
constructor(searchConsole, serpProvider,
|
|
21
|
+
// NEW axes, DEFAULTED so the ~99 existing 2-4-arg `new SeoEgressGuard(...)`
|
|
22
|
+
// call sites across the adapter test files keep compiling untouched.
|
|
23
|
+
aiVisibility = false, siteCrawl = false, aiVisibilityScrape = false) {
|
|
24
|
+
this.searchConsole = searchConsole;
|
|
25
|
+
this.serpProvider = serpProvider;
|
|
26
|
+
this.aiVisibility = aiVisibility;
|
|
27
|
+
this.siteCrawl = siteCrawl;
|
|
28
|
+
this.aiVisibilityScrape = aiVisibilityScrape;
|
|
29
|
+
}
|
|
30
|
+
/** Build from BoberConfig seo section; all five axes default false when absent. */
|
|
31
|
+
static fromConfig(config) {
|
|
32
|
+
const seo = config.seo;
|
|
33
|
+
return new SeoEgressGuard(seo?.egress?.["search-console"] ?? false, seo?.egress?.["serp-provider"] ?? false, seo?.egress?.["ai-visibility"] ?? false, seo?.egress?.["site-crawl"] ?? false, seo?.egress?.["ai-visibility-scrape"] ?? false);
|
|
34
|
+
}
|
|
35
|
+
/** Returns true only when the axis has been explicitly opted in via config. */
|
|
36
|
+
isAllowed(axis) {
|
|
37
|
+
switch (axis) {
|
|
38
|
+
case "search-console":
|
|
39
|
+
return this.searchConsole;
|
|
40
|
+
case "serp-provider":
|
|
41
|
+
return this.serpProvider;
|
|
42
|
+
case "ai-visibility":
|
|
43
|
+
return this.aiVisibility;
|
|
44
|
+
case "site-crawl":
|
|
45
|
+
return this.siteCrawl;
|
|
46
|
+
case "ai-visibility-scrape":
|
|
47
|
+
return this.aiVisibilityScrape;
|
|
48
|
+
default: {
|
|
49
|
+
const _exhaustive = axis; // compile error if a SeoEgressAxis value is unhandled
|
|
50
|
+
return _exhaustive;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Throws an Error when the axis is not enabled.
|
|
56
|
+
* Returns void (not throws) when the axis is allowed.
|
|
57
|
+
*/
|
|
58
|
+
assertAllowed(axis) {
|
|
59
|
+
if (!this.isAllowed(axis)) {
|
|
60
|
+
throw new Error(`Egress axis '${axis}' not enabled`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=egress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"egress.js","sourceRoot":"","sources":["../../src/seo/egress.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,cAAc;IAEN;IACA;IAGA;IACA;IACA;IAPnB,YACmB,aAAsB,EACtB,YAAqB;IACtC,4EAA4E;IAC5E,qEAAqE;IACpD,eAAwB,KAAK,EAC7B,YAAqB,KAAK,EAC1B,qBAA8B,KAAK;QANnC,kBAAa,GAAb,aAAa,CAAS;QACtB,iBAAY,GAAZ,YAAY,CAAS;QAGrB,iBAAY,GAAZ,YAAY,CAAiB;QAC7B,cAAS,GAAT,SAAS,CAAiB;QAC1B,uBAAkB,GAAlB,kBAAkB,CAAiB;IACnD,CAAC;IAEJ,mFAAmF;IACnF,MAAM,CAAC,UAAU,CAAC,MAAmB;QACnC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACvB,OAAO,IAAI,cAAc,CACvB,GAAG,EAAE,MAAM,EAAE,CAAC,gBAAgB,CAAC,IAAI,KAAK,EACxC,GAAG,EAAE,MAAM,EAAE,CAAC,eAAe,CAAC,IAAI,KAAK,EACvC,GAAG,EAAE,MAAM,EAAE,CAAC,eAAe,CAAC,IAAI,KAAK,EACvC,GAAG,EAAE,MAAM,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,EACpC,GAAG,EAAE,MAAM,EAAE,CAAC,sBAAsB,CAAC,IAAI,KAAK,CAC/C,CAAC;IACJ,CAAC;IAED,+EAA+E;IAC/E,SAAS,CAAC,IAAmB;QAC3B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,gBAAgB;gBACnB,OAAO,IAAI,CAAC,aAAa,CAAC;YAC5B,KAAK,eAAe;gBAClB,OAAO,IAAI,CAAC,YAAY,CAAC;YAC3B,KAAK,eAAe;gBAClB,OAAO,IAAI,CAAC,YAAY,CAAC;YAC3B,KAAK,YAAY;gBACf,OAAO,IAAI,CAAC,SAAS,CAAC;YACxB,KAAK,sBAAsB;gBACzB,OAAO,IAAI,CAAC,kBAAkB,CAAC;YACjC,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,WAAW,GAAU,IAAI,CAAC,CAAC,sDAAsD;gBACvF,OAAO,WAAW,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,IAAmB;QAC/B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,eAAe,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Finding } from "../hub/finding.js";
|
|
2
|
+
import type { SeoAnalysis } from "./analyzer.js";
|
|
3
|
+
import type { Logger } from "../utils/logger.js";
|
|
4
|
+
/** Hub Finding emitter — mirrors `SecurityFindingSink` (`security-hub.ts:29`). */
|
|
5
|
+
export type SeoFindingSink = (finding: Finding) => Promise<void>;
|
|
6
|
+
export declare class SeoHubEmitter {
|
|
7
|
+
/**
|
|
8
|
+
* Build one hub `Finding` per CITED `SeoFinding` in `analysis.findings`.
|
|
9
|
+
* PURE — never reads the clock (`now` is injected).
|
|
10
|
+
*
|
|
11
|
+
* `kind` mapping: `humanApprovalRequired: true` -> `"action"`;
|
|
12
|
+
* otherwise `"risk"` (informational/low-severity findings could be
|
|
13
|
+
* refined to `"watch"` in a later sprint — not required by sc-11-4).
|
|
14
|
+
*
|
|
15
|
+
* `title` is STABLE across retries (feeds the id hash via
|
|
16
|
+
* `deriveFindingId`) — built from `workflow` + a slice of the
|
|
17
|
+
* recommendation text, never the full free-text body.
|
|
18
|
+
*/
|
|
19
|
+
mapToFindings(analysis: SeoAnalysis, now: string): Finding[];
|
|
20
|
+
/**
|
|
21
|
+
* Map and emit `analysis`'s cited findings through the injected sink.
|
|
22
|
+
* Best-effort: NEVER throws. A failure raised by the sink (or the
|
|
23
|
+
* mapping) is caught and logged via `log.warn` — it must never alter the
|
|
24
|
+
* runner's exit code (mirrors `emitSecurityFindings`, `security-hub.ts:164-177`).
|
|
25
|
+
*/
|
|
26
|
+
emit(analysis: SeoAnalysis, sink: SeoFindingSink, log: Pick<Logger, "warn">, now: string): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=hub-emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-emitter.d.ts","sourceRoot":"","sources":["../../src/seo/hub-emitter.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,kFAAkF;AAClF,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAgBjE,qBAAa,aAAa;IACxB;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE;IAsC5D;;;;;OAKG;IACG,IAAI,CACR,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,cAAc,EACpB,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EACzB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC;CASjB"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SeoHubEmitter — maps cited `SeoFinding`s into the canonical hub `Finding`
|
|
3
|
+
* shape and emits them via an injected sink (spec-20260715-ultimate-seo-suite,
|
|
4
|
+
* Sprint 11). Mirrors `src/orchestrator/security-hub.ts:39-177` — the FIRST
|
|
5
|
+
* use of the import-only `src/hub/finding.ts` from this module.
|
|
6
|
+
*
|
|
7
|
+
* `Finding`/`FindingSchema` are IMPORTED, never redefined (sc-11-4). The
|
|
8
|
+
* mapper is PURE (never reads the clock — `now` is caller-injected, mirrors
|
|
9
|
+
* `mapAuditToFindings`); the sink is a dependency the caller binds to the
|
|
10
|
+
* real `ingestFinding` (`src/hub/finding-store.ts`) at the fs boundary.
|
|
11
|
+
*
|
|
12
|
+
* Uncited findings are dropped TWICE (belt-and-suspenders with
|
|
13
|
+
* `SeoCitationGate`, arch line 325): callers are expected to pass only
|
|
14
|
+
* `SeoCitationGate.apply(...).cited` findings, but `mapToFindings` ALSO
|
|
15
|
+
* skips any finding whose `citationUrl` is missing/empty as a second,
|
|
16
|
+
* independent guard (sc-11-5).
|
|
17
|
+
*/
|
|
18
|
+
import { createHash } from "node:crypto";
|
|
19
|
+
/**
|
|
20
|
+
* Content-stable id: hash of domain|title|kind. Replicated locally (same
|
|
21
|
+
* precedent as `security-hub.ts:33-41`) rather than imported — an id hash,
|
|
22
|
+
* NOT a schema-level redefinition of `Finding`.
|
|
23
|
+
*/
|
|
24
|
+
function deriveFindingId(domain, title, kind) {
|
|
25
|
+
return createHash("sha256").update(`${domain}|${title}|${kind}`).digest("hex").slice(0, 16);
|
|
26
|
+
}
|
|
27
|
+
/** Flatten one `SeoFinding.evidence` entry into a hub `evidence[]` string. */
|
|
28
|
+
function formatEvidence(entry) {
|
|
29
|
+
return `${entry.metric}=${entry.value} (${entry.source}) ${entry.url}`;
|
|
30
|
+
}
|
|
31
|
+
export class SeoHubEmitter {
|
|
32
|
+
/**
|
|
33
|
+
* Build one hub `Finding` per CITED `SeoFinding` in `analysis.findings`.
|
|
34
|
+
* PURE — never reads the clock (`now` is injected).
|
|
35
|
+
*
|
|
36
|
+
* `kind` mapping: `humanApprovalRequired: true` -> `"action"`;
|
|
37
|
+
* otherwise `"risk"` (informational/low-severity findings could be
|
|
38
|
+
* refined to `"watch"` in a later sprint — not required by sc-11-4).
|
|
39
|
+
*
|
|
40
|
+
* `title` is STABLE across retries (feeds the id hash via
|
|
41
|
+
* `deriveFindingId`) — built from `workflow` + a slice of the
|
|
42
|
+
* recommendation text, never the full free-text body.
|
|
43
|
+
*/
|
|
44
|
+
mapToFindings(analysis, now) {
|
|
45
|
+
const out = [];
|
|
46
|
+
for (const finding of analysis.findings) {
|
|
47
|
+
// Belt-and-suspenders with SeoCitationGate — skip any uncited finding
|
|
48
|
+
// that slipped through, even though callers are expected to pass only
|
|
49
|
+
// gate.cited (sc-11-5).
|
|
50
|
+
if (!finding.citationUrl || finding.citationUrl.trim().length === 0)
|
|
51
|
+
continue;
|
|
52
|
+
const kind = finding.humanApprovalRequired ? "action" : "risk";
|
|
53
|
+
const title = `[seo] ${finding.workflow}: ${finding.recommendation.slice(0, 80)}`;
|
|
54
|
+
out.push({
|
|
55
|
+
id: deriveFindingId("seo", title, kind),
|
|
56
|
+
domain: "seo",
|
|
57
|
+
title,
|
|
58
|
+
kind,
|
|
59
|
+
urgency: finding.severity,
|
|
60
|
+
severity: finding.severity,
|
|
61
|
+
evidence: [
|
|
62
|
+
finding.recommendation,
|
|
63
|
+
...finding.evidence.map(formatEvidence),
|
|
64
|
+
`cite:${finding.citationUrl}`,
|
|
65
|
+
],
|
|
66
|
+
surfacedAt: now,
|
|
67
|
+
tags: [
|
|
68
|
+
"seo",
|
|
69
|
+
`workflow:${finding.workflow}`,
|
|
70
|
+
`playbook:${finding.playbookRef}`,
|
|
71
|
+
`confidence:${finding.confidence}`,
|
|
72
|
+
],
|
|
73
|
+
status: "open",
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Map and emit `analysis`'s cited findings through the injected sink.
|
|
80
|
+
* Best-effort: NEVER throws. A failure raised by the sink (or the
|
|
81
|
+
* mapping) is caught and logged via `log.warn` — it must never alter the
|
|
82
|
+
* runner's exit code (mirrors `emitSecurityFindings`, `security-hub.ts:164-177`).
|
|
83
|
+
*/
|
|
84
|
+
async emit(analysis, sink, log, now) {
|
|
85
|
+
try {
|
|
86
|
+
for (const finding of this.mapToFindings(analysis, now)) {
|
|
87
|
+
await sink(finding);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
log.warn(`SEO hub emission failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=hub-emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-emitter.js","sourceRoot":"","sources":["../../src/seo/hub-emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AASzC;;;;GAIG;AACH,SAAS,eAAe,CAAC,MAAc,EAAE,KAAa,EAAE,IAAY;IAClE,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC9F,CAAC;AAED,8EAA8E;AAC9E,SAAS,cAAc,CAAC,KAAqE;IAC3F,OAAO,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,GAAG,EAAE,CAAC;AACzE,CAAC;AAED,MAAM,OAAO,aAAa;IACxB;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,QAAqB,EAAE,GAAW;QAC9C,MAAM,GAAG,GAAc,EAAE,CAAC;QAE1B,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACxC,sEAAsE;YACtE,sEAAsE;YACtE,wBAAwB;YACxB,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAE9E,MAAM,IAAI,GAAoB,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;YAChF,MAAM,KAAK,GAAG,SAAS,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAElF,GAAG,CAAC,IAAI,CAAC;gBACP,EAAE,EAAE,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC;gBACvC,MAAM,EAAE,KAAK;gBACb,KAAK;gBACL,IAAI;gBACJ,OAAO,EAAE,OAAO,CAAC,QAAQ;gBACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,QAAQ,EAAE;oBACR,OAAO,CAAC,cAAc;oBACtB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC;oBACvC,QAAQ,OAAO,CAAC,WAAW,EAAE;iBAC9B;gBACD,UAAU,EAAE,GAAG;gBACf,IAAI,EAAE;oBACJ,KAAK;oBACL,YAAY,OAAO,CAAC,QAAQ,EAAE;oBAC9B,YAAY,OAAO,CAAC,WAAW,EAAE;oBACjC,cAAc,OAAO,CAAC,UAAU,EAAE;iBACnC;gBACD,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;QACL,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAI,CACR,QAAqB,EACrB,IAAoB,EACpB,GAAyB,EACzB,GAAW;QAEX,IAAI,CAAC;YACH,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC;gBACxD,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public surface of `src/seo/` (spec-20260715-ultimate-seo-suite, Sprint 1).
|
|
3
|
+
* Focused local barrel — mirrors `src/config/index.ts` (selective named
|
|
4
|
+
* re-exports, `type` keyword for types). Deliberately does NOT re-export
|
|
5
|
+
* `SeoConfigSchema` from `src/config/schema.js` — that barrel intentionally
|
|
6
|
+
* omits section schemas (`src/config/index.ts:1-58`); consumers import
|
|
7
|
+
* section schemas directly from `./schema.js`.
|
|
8
|
+
*/
|
|
9
|
+
export type { SeoWorkflow, DataProvenance, DataOutcome, SeoSignature, SeoFinding, SeoReport, SeoQuotaLedger, } from "./types.js";
|
|
10
|
+
export { SeoEgressGuard } from "./egress.js";
|
|
11
|
+
export type { SeoEgressAxis } from "./egress.js";
|
|
12
|
+
export { SeoQuotaGovernor } from "./quota-governor.js";
|
|
13
|
+
export type { QuotaRequest, QuotaDecision, QuotaRefusalReason } from "./quota-governor.js";
|
|
14
|
+
export { SeoPlaybookParser } from "./parser.js";
|
|
15
|
+
export { SeoPlaybookIndex } from "./playbook-index.js";
|
|
16
|
+
export { SeoPlaybookRetriever } from "./retriever.js";
|
|
17
|
+
export type { SeoRetrieveInput, SeoRetrieveResult } from "./retriever.js";
|
|
18
|
+
export type { SeoDataSource, SeoCapability, SearchAnalyticsQuery, SearchAnalyticsRow, UrlInspectionQuery, UrlInspectionRow, SerpQuery, SerpRow, KeywordQuery, KeywordRow, BacklinkQuery, BacklinkRow, } from "./data-source.js";
|
|
19
|
+
export { LocalExportSource } from "./sources/local-export.js";
|
|
20
|
+
export { GscAdapter } from "./sources/gsc-adapter.js";
|
|
21
|
+
export { DataForSeoAdapter } from "./sources/dataforseo-adapter.js";
|
|
22
|
+
export type { HttpClient, HttpResponse, HttpRequestInit } from "./adapters/http.js";
|
|
23
|
+
export { SeoAnalyzer } from "./analyzer.js";
|
|
24
|
+
export type { SeoAnalyzeInput, SeoAnalysis, SeoDataBundle } from "./analyzer.js";
|
|
25
|
+
export { AiVisibilityScorer } from "./ai-visibility-scorer.js";
|
|
26
|
+
export type { AiVisibilityMetric } from "./ai-visibility-scorer.js";
|
|
27
|
+
export { SeoCitationGate } from "./citation-gate.js";
|
|
28
|
+
export type { SeoBlockThreshold, CitationGateResult } from "./citation-gate.js";
|
|
29
|
+
export { NeverEncodeFilter, NEVER_ENCODE_PATTERNS } from "./never-encode-filter.js";
|
|
30
|
+
export type { NeverEncodeResult } from "./never-encode-filter.js";
|
|
31
|
+
export { SeoReportStore, deriveReportId } from "./report-store.js";
|
|
32
|
+
export { SeoHubEmitter } from "./hub-emitter.js";
|
|
33
|
+
export type { SeoFindingSink } from "./hub-emitter.js";
|
|
34
|
+
export { SeoWorkflowRunner, selectSource } from "./runner.js";
|
|
35
|
+
export type { SeoRunInput, SeoRunOutcome } from "./runner.js";
|
|
36
|
+
export { SeoRecommendationVerifier } from "./verifier.js";
|
|
37
|
+
export type { SeoVerifier, SeoVerifyParams, SeoVerifyResult } from "./verifier.js";
|
|
38
|
+
export { registerSeoCommand } from "./command.js";
|
|
39
|
+
export type { SeoCommandOverrides } from "./command.js";
|
|
40
|
+
export { runBenchmark } from "./benchmark/harness.js";
|
|
41
|
+
export type { SeoBenchmarkCase, CorpusMetrics } from "./benchmark/harness.js";
|
|
42
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/seo/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,YAAY,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,YAAY,EACZ,UAAU,EACV,SAAS,EACT,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAE1E,YAAY,EACV,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,SAAS,EACT,OAAO,EACP,YAAY,EACZ,UAAU,EACV,aAAa,EACb,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEpE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEpF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,YAAY,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEhF,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACpF,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export { SeoEgressGuard } from "./egress.js";
|
|
2
|
+
export { SeoQuotaGovernor } from "./quota-governor.js";
|
|
3
|
+
export { SeoPlaybookParser } from "./parser.js";
|
|
4
|
+
export { SeoPlaybookIndex } from "./playbook-index.js";
|
|
5
|
+
export { SeoPlaybookRetriever } from "./retriever.js";
|
|
6
|
+
export { LocalExportSource } from "./sources/local-export.js";
|
|
7
|
+
export { GscAdapter } from "./sources/gsc-adapter.js";
|
|
8
|
+
export { DataForSeoAdapter } from "./sources/dataforseo-adapter.js";
|
|
9
|
+
export { SeoAnalyzer } from "./analyzer.js";
|
|
10
|
+
export { AiVisibilityScorer } from "./ai-visibility-scorer.js";
|
|
11
|
+
export { SeoCitationGate } from "./citation-gate.js";
|
|
12
|
+
export { NeverEncodeFilter, NEVER_ENCODE_PATTERNS } from "./never-encode-filter.js";
|
|
13
|
+
export { SeoReportStore, deriveReportId } from "./report-store.js";
|
|
14
|
+
export { SeoHubEmitter } from "./hub-emitter.js";
|
|
15
|
+
export { SeoWorkflowRunner, selectSource } from "./runner.js";
|
|
16
|
+
export { SeoRecommendationVerifier } from "./verifier.js";
|
|
17
|
+
export { registerSeoCommand } from "./command.js";
|
|
18
|
+
export { runBenchmark } from "./benchmark/harness.js";
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/seo/index.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAiBtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAIpE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG/D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGpF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAG1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NeverEncodeFilter — pure, total, DROP-only runtime never-encode belt
|
|
3
|
+
* (spec-20260717-seo-improver-builder, Sprint 2; ADR-3). Third belt after
|
|
4
|
+
* parse-time drop (`parser.ts:111`, `policyClassRaw === "never-encode"`) and
|
|
5
|
+
* the skill-content lint (`skills-content.test.ts:26-33`). This belt catches
|
|
6
|
+
* an LLM-*synthesized* banned tactic at runtime — one that was never in a
|
|
7
|
+
* skill file, so belts 1/2 never see it — even when it carries a
|
|
8
|
+
* well-formed `citationUrl` that would otherwise sail through
|
|
9
|
+
* `SeoCitationGate` (`citation-gate.ts:66-90`).
|
|
10
|
+
*
|
|
11
|
+
* Pure and total, mirroring `SeoCitationGate.apply` exactly: imports ONLY
|
|
12
|
+
* `./types.js`. No LLM, no egress, no filesystem, no clock, no
|
|
13
|
+
* `Math.random`. Identical input always yields identical output; never
|
|
14
|
+
* throws. DROP-only (ADR-3 option table, nonGoal #1): unlike the citation
|
|
15
|
+
* gate, this filter does NOT compute a `blocked`/exit-2 flag — a single
|
|
16
|
+
* hallucinated phrase must not brick an otherwise-clean run.
|
|
17
|
+
*/
|
|
18
|
+
import type { SeoFinding } from "./types.js";
|
|
19
|
+
export type NeverEncodeResult = {
|
|
20
|
+
/** Findings whose recommendation/evidence matches NO banned tactic — the ONLY findings passed downstream. */
|
|
21
|
+
kept: SeoFinding[];
|
|
22
|
+
/** Findings whose recommendation/evidence matches a banned never-encode tactic. */
|
|
23
|
+
dropped: SeoFinding[];
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Single exported const so the parser floor (`retriever.ts:34-37`), the
|
|
27
|
+
* benchmark's test-local mirror (`benchmark/harness.ts:79-86`), and this
|
|
28
|
+
* filter share intent (generatorNotes). Case-insensitive, `\b`-anchored to
|
|
29
|
+
* avoid over-matching clean recommendations ("Fix duplicate title tags...",
|
|
30
|
+
* "Add a self-referencing canonical tag."). Covers all 8 sc-2-2 classes:
|
|
31
|
+
* parasite SEO, expired-domain, paid/bought links, PBN/link schemes, mass AI
|
|
32
|
+
* pages, cloaking, doorway pages, AI-recommendation poisoning. The first 6
|
|
33
|
+
* are the existing set (`skills-content.test.ts:26-33`); PBN/cloaking/
|
|
34
|
+
* doorway are new for this sprint.
|
|
35
|
+
*/
|
|
36
|
+
export declare const NEVER_ENCODE_PATTERNS: readonly RegExp[];
|
|
37
|
+
export declare class NeverEncodeFilter {
|
|
38
|
+
/**
|
|
39
|
+
* Partitions `findings` into `kept`/`dropped` by banned-tactic text
|
|
40
|
+
* matching. Pure and total: identical input always yields identical
|
|
41
|
+
* output. DROP-only — never computes a block/exit-code signal (ADR-3).
|
|
42
|
+
*/
|
|
43
|
+
apply(findings: SeoFinding[]): NeverEncodeResult;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=never-encode-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"never-encode-filter.d.ts","sourceRoot":"","sources":["../../src/seo/never-encode-filter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,6GAA6G;IAC7G,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,mFAAmF;IACnF,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAUlD,CAAC;AAWF,qBAAa,iBAAiB;IAC5B;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,iBAAiB;CAcjD"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single exported const so the parser floor (`retriever.ts:34-37`), the
|
|
3
|
+
* benchmark's test-local mirror (`benchmark/harness.ts:79-86`), and this
|
|
4
|
+
* filter share intent (generatorNotes). Case-insensitive, `\b`-anchored to
|
|
5
|
+
* avoid over-matching clean recommendations ("Fix duplicate title tags...",
|
|
6
|
+
* "Add a self-referencing canonical tag."). Covers all 8 sc-2-2 classes:
|
|
7
|
+
* parasite SEO, expired-domain, paid/bought links, PBN/link schemes, mass AI
|
|
8
|
+
* pages, cloaking, doorway pages, AI-recommendation poisoning. The first 6
|
|
9
|
+
* are the existing set (`skills-content.test.ts:26-33`); PBN/cloaking/
|
|
10
|
+
* doorway are new for this sprint.
|
|
11
|
+
*/
|
|
12
|
+
export const NEVER_ENCODE_PATTERNS = [
|
|
13
|
+
/\bplace\b[^.]*\b(parasite|high-?authority host|third-?party host)/i, // parasite SEO
|
|
14
|
+
/\b(?:buy(?:ing)?|purchas(?:e|ing))\b[^.]*\blinks?\b/i, // paid/bought links
|
|
15
|
+
/\bregister(ing)?\b[^.]*\bexpired domain/i, // expired-domain
|
|
16
|
+
/\bgenerate\b[^.]*\bmass\b[^.]*\bpages\b/i, // mass AI pages
|
|
17
|
+
/\b(?:mass[-\s]?generat(?:e|ing)|generat(?:e|ing)[-\s]?mass)\b/i, // mass AI pages
|
|
18
|
+
/\bpoison/i, // AI-recommendation poisoning
|
|
19
|
+
/\b(?:private blog network|pbn|link scheme|link network|link farm)\b/i, // PBN / link schemes
|
|
20
|
+
/\bcloak(?:ing|ed)?\b/i, // cloaking
|
|
21
|
+
/\bdoorway\s+pages?\b/i, // doorway pages
|
|
22
|
+
];
|
|
23
|
+
/** Scans `recommendation` + all evidence fields (metric/value/source/url) for a banned tactic match. */
|
|
24
|
+
function matchesBannedTactic(finding) {
|
|
25
|
+
const evidenceText = finding.evidence
|
|
26
|
+
.map((e) => `${e.metric} ${e.value} ${e.source} ${e.url}`)
|
|
27
|
+
.join(" ");
|
|
28
|
+
const text = `${finding.recommendation} ${evidenceText}`;
|
|
29
|
+
return NEVER_ENCODE_PATTERNS.some((pattern) => pattern.test(text));
|
|
30
|
+
}
|
|
31
|
+
export class NeverEncodeFilter {
|
|
32
|
+
/**
|
|
33
|
+
* Partitions `findings` into `kept`/`dropped` by banned-tactic text
|
|
34
|
+
* matching. Pure and total: identical input always yields identical
|
|
35
|
+
* output. DROP-only — never computes a block/exit-code signal (ADR-3).
|
|
36
|
+
*/
|
|
37
|
+
apply(findings) {
|
|
38
|
+
const kept = [];
|
|
39
|
+
const dropped = [];
|
|
40
|
+
for (const finding of findings) {
|
|
41
|
+
if (matchesBannedTactic(finding)) {
|
|
42
|
+
dropped.push(finding);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
kept.push(finding);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return { kept, dropped };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=never-encode-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"never-encode-filter.js","sourceRoot":"","sources":["../../src/seo/never-encode-filter.ts"],"names":[],"mappings":"AA0BA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAsB;IACtD,oEAAoE,EAAE,eAAe;IACrF,sDAAsD,EAAE,oBAAoB;IAC5E,0CAA0C,EAAE,iBAAiB;IAC7D,0CAA0C,EAAE,gBAAgB;IAC5D,gEAAgE,EAAE,gBAAgB;IAClF,WAAW,EAAE,8BAA8B;IAC3C,sEAAsE,EAAE,qBAAqB;IAC7F,uBAAuB,EAAE,WAAW;IACpC,uBAAuB,EAAE,gBAAgB;CAC1C,CAAC;AAEF,wGAAwG;AACxG,SAAS,mBAAmB,CAAC,OAAmB;IAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;SACzD,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,MAAM,IAAI,GAAG,GAAG,OAAO,CAAC,cAAc,IAAI,YAAY,EAAE,CAAC;IACzD,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,OAAO,iBAAiB;IAC5B;;;;OAIG;IACH,KAAK,CAAC,QAAsB;QAC1B,MAAM,IAAI,GAAiB,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAiB,EAAE,CAAC;QAEjC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF"}
|