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,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ApprovedFinding — the structural safety boundary between the hub and the
|
|
3
|
+
* Sprint-12 `SeoBuilder` (spec-20260717-seo-improver-builder, Sprint 11;
|
|
4
|
+
* ADR-4, `.bober/architecture/arch-20260716-seo-improver-builder-extension-adr-4.md`).
|
|
5
|
+
*
|
|
6
|
+
* Constructible ONLY via `ApprovedFinding.from(...)` — the sole factory,
|
|
7
|
+
* itself never throwing — which asserts the hub Finding is human-approved
|
|
8
|
+
* AND carries a well-formed `cite:` evidence URL before minting an instance.
|
|
9
|
+
* A raw/dropped/downgraded/uncited `SeoFinding` has NO public path into this
|
|
10
|
+
* type: a dropped finding never reached the hub as an approved action, so no
|
|
11
|
+
* `ApprovedFinding` can exist for it (resurrection structurally impossible,
|
|
12
|
+
* sc-11-1/sc-11-2).
|
|
13
|
+
*
|
|
14
|
+
* Schema-vs-contract reconciliation (see the Sprint-11 briefing §0): the
|
|
15
|
+
* canonical hub `FindingSchema.status` (`../hub/finding.js:23`) is
|
|
16
|
+
* `z.enum(["open","in-progress","snoozed","done","dropped"])` — there is NO
|
|
17
|
+
* `"approved"` status, so `finding.status === "approved"` against a raw
|
|
18
|
+
* `Finding` is a TS2367 compile error. Mirroring the do-bridge port-local
|
|
19
|
+
* pattern (`../do-bridge/finding-port.ts:10-19`, "the hub schema is NOT
|
|
20
|
+
* modified"), `ApprovedHubFindingSchema` below WIDENS the status union
|
|
21
|
+
* locally — `../hub/finding.ts` stays byte-identical. Likewise `Finding` has
|
|
22
|
+
* no top-level `citationUrl`; the SEO citation round-trips inside
|
|
23
|
+
* `evidence[]` as a `cite:<url>` string (encoded at
|
|
24
|
+
* `../hub-emitter.ts:76`, decode precedent at `../benchmark/harness.ts:112-121`)
|
|
25
|
+
* — `extractCitationUrl` below decodes exactly what the emitter encoded.
|
|
26
|
+
*/
|
|
27
|
+
import { z } from "zod";
|
|
28
|
+
import { FindingSchema } from "../../hub/finding.js";
|
|
29
|
+
// -- Widened hub Finding view (port-local; ../../hub/finding.ts untouched) --
|
|
30
|
+
/**
|
|
31
|
+
* Builder-local widened view of the hub `Finding` shape — adds `"approved"`
|
|
32
|
+
* to the status union WITHOUT mutating the canonical `FindingSchema`
|
|
33
|
+
* (mirrors `../../do-bridge/finding-port.ts:10-19`). Every other field is
|
|
34
|
+
* reused verbatim via `.extend()`.
|
|
35
|
+
*/
|
|
36
|
+
export const ApprovedHubFindingSchema = FindingSchema.extend({
|
|
37
|
+
status: z.enum(["open", "in-progress", "snoozed", "done", "dropped", "approved"]),
|
|
38
|
+
});
|
|
39
|
+
// -- Local single-purpose URL check (no shared util exists in src) --------
|
|
40
|
+
/**
|
|
41
|
+
* A citationUrl is well-formed when it is a non-empty, non-whitespace string
|
|
42
|
+
* that parses as an absolute http(s) URL. Mirrors `../citation-gate.ts:34-42`
|
|
43
|
+
* (`isWellFormedCitationUrl`) — no shared URL-validation util exists in
|
|
44
|
+
* `src`; this is a local copy per that file's own precedent comment.
|
|
45
|
+
*/
|
|
46
|
+
function isWellFormedCitationUrl(url) {
|
|
47
|
+
if (typeof url !== "string" || url.trim().length === 0)
|
|
48
|
+
return false;
|
|
49
|
+
try {
|
|
50
|
+
const parsed = new URL(url);
|
|
51
|
+
return parsed.protocol === "http:" || parsed.protocol === "https:";
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// -- cite:/tag extraction (decodes exactly what hub-emitter.ts encoded) ----
|
|
58
|
+
/**
|
|
59
|
+
* Extract `sourceCitationUrl` from the `evidence[]` entry that starts with
|
|
60
|
+
* `cite:` (mirrors `../benchmark/harness.ts:112-121`, `lacksWellFormedCitation`).
|
|
61
|
+
* Returns `null` — never throws — when the entry is absent or the URL is
|
|
62
|
+
* malformed. NEVER invents a URL.
|
|
63
|
+
*/
|
|
64
|
+
function extractCitationUrl(finding) {
|
|
65
|
+
const citeEntry = finding.evidence.find((e) => e.startsWith("cite:"));
|
|
66
|
+
if (citeEntry === undefined)
|
|
67
|
+
return null;
|
|
68
|
+
const url = citeEntry.slice("cite:".length);
|
|
69
|
+
return isWellFormedCitationUrl(url) ? url : null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Extract the first `tags[]` entry starting with `prefix`, minus the prefix.
|
|
73
|
+
* Mirrors `../benchmark/harness.ts:106-108` (`extractPlaybookRef`). SEO
|
|
74
|
+
* findings carry `tags: ["seo","workflow:<w>","playbook:<ref>","confidence:<c>"]`
|
|
75
|
+
* (`../hub-emitter.ts:79-84`).
|
|
76
|
+
*/
|
|
77
|
+
function extractTag(finding, prefix) {
|
|
78
|
+
const tag = finding.tags.find((t) => t.startsWith(prefix));
|
|
79
|
+
return tag !== undefined ? tag.slice(prefix.length) : undefined;
|
|
80
|
+
}
|
|
81
|
+
// -- ApprovedFinding --------------------------------------------------------
|
|
82
|
+
/**
|
|
83
|
+
* A hub Finding a human has approved, carrying a decoded, well-formed
|
|
84
|
+
* citation. The private constructor + private brand field together make
|
|
85
|
+
* this type NOMINAL: a structurally-similar plain object (e.g. a raw
|
|
86
|
+
* `SeoFinding` literal) is never assignable, and `new ApprovedFinding(...)`
|
|
87
|
+
* is unreachable outside this module. `ApprovedFinding.from` is the ONLY
|
|
88
|
+
* public construction path.
|
|
89
|
+
*/
|
|
90
|
+
export class ApprovedFinding {
|
|
91
|
+
sourceFindingId;
|
|
92
|
+
title;
|
|
93
|
+
sourceCitationUrl;
|
|
94
|
+
severity;
|
|
95
|
+
playbookRef;
|
|
96
|
+
workflow;
|
|
97
|
+
// Private INSTANCE field => TS compares this class nominally. A plain
|
|
98
|
+
// object literal (e.g. a raw SeoFinding) can NEVER satisfy this private
|
|
99
|
+
// member, so it can never be assigned to ApprovedFinding (sc-11-1/sc-11-2,
|
|
100
|
+
// compile-proof — see approved-finding.test.ts).
|
|
101
|
+
__brand = "ApprovedFinding";
|
|
102
|
+
constructor(
|
|
103
|
+
/** The hub Finding id this instance was derived from (provenance). */
|
|
104
|
+
sourceFindingId, title,
|
|
105
|
+
/** Extracted from the `cite:` evidence entry — never invented. */
|
|
106
|
+
sourceCitationUrl, severity,
|
|
107
|
+
/** From the `playbook:` tag; empty string if the tag is absent. */
|
|
108
|
+
playbookRef,
|
|
109
|
+
/** From the `workflow:` tag; empty string if the tag is absent. */
|
|
110
|
+
workflow) {
|
|
111
|
+
this.sourceFindingId = sourceFindingId;
|
|
112
|
+
this.title = title;
|
|
113
|
+
this.sourceCitationUrl = sourceCitationUrl;
|
|
114
|
+
this.severity = severity;
|
|
115
|
+
this.playbookRef = playbookRef;
|
|
116
|
+
this.workflow = workflow;
|
|
117
|
+
}
|
|
118
|
+
/** Debug representation; also reads `__brand` so it is not flagged unused under `noUnusedLocals`. */
|
|
119
|
+
toString() {
|
|
120
|
+
return `${this.__brand}(${this.sourceFindingId})`;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* The ONLY way to build an `ApprovedFinding`. Returns `null` — NEVER
|
|
124
|
+
* throws — when `finding.status !== "approved"` or the `cite:` evidence
|
|
125
|
+
* entry is missing/malformed. This is the single gate ADR-4's Risk
|
|
126
|
+
* section calls out: "if the adapter itself trusts an un-approved
|
|
127
|
+
* Finding, the guarantee leaks" — so both checks happen here, in the one
|
|
128
|
+
* place an `ApprovedFinding` can be minted.
|
|
129
|
+
*/
|
|
130
|
+
static from(finding) {
|
|
131
|
+
if (finding.status !== "approved")
|
|
132
|
+
return null;
|
|
133
|
+
const citationUrl = extractCitationUrl(finding);
|
|
134
|
+
if (citationUrl === null)
|
|
135
|
+
return null;
|
|
136
|
+
// bober: playbookRef/workflow default to "" when the tag is absent
|
|
137
|
+
// rather than gating construction on them — ADR-4's Risk section only
|
|
138
|
+
// requires status===approved + a well-formed citation; these tags are
|
|
139
|
+
// enrichment provenance for Sprint-12, not part of the safety gate.
|
|
140
|
+
const playbookRef = extractTag(finding, "playbook:") ?? "";
|
|
141
|
+
const workflow = extractTag(finding, "workflow:") ?? "";
|
|
142
|
+
return new ApprovedFinding(finding.id, finding.title, citationUrl, finding.severity, playbookRef, workflow);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=approved-finding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approved-finding.js","sourceRoot":"","sources":["../../../src/seo/builder/approved-finding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { BoberConfig } from "../../config/schema.js";
|
|
2
|
+
import { SeoReportStore } from "../report-store.js";
|
|
3
|
+
import type { SeoFindingSink } from "../hub-emitter.js";
|
|
4
|
+
import { SeoBuilder } from "./seo-builder.js";
|
|
5
|
+
import type { ApprovedFinding } from "./approved-finding.js";
|
|
6
|
+
import type { SeoDraft } from "./draft-types.js";
|
|
7
|
+
import { SeoDraftStore } from "./draft-store.js";
|
|
8
|
+
export type SeoBuildRunInput = {
|
|
9
|
+
projectRoot: string;
|
|
10
|
+
config: BoberConfig;
|
|
11
|
+
reportId: string;
|
|
12
|
+
/** ISO timestamp, stamped ONCE by the `seo build` CLI action. */
|
|
13
|
+
now: string;
|
|
14
|
+
/** Default = `new SeoReportStore()`. */
|
|
15
|
+
reportStore?: SeoReportStore;
|
|
16
|
+
/** Default = `new SeoDraftStore()`. */
|
|
17
|
+
draftStore?: SeoDraftStore;
|
|
18
|
+
/** Default = `new SeoBuilder(new NeverEncodeFilter())`. */
|
|
19
|
+
builder?: SeoBuilder;
|
|
20
|
+
/** Default = open a real `FactStore` + `readApprovedSeoFindings`. */
|
|
21
|
+
readApproved?: (projectRoot: string) => Promise<ApprovedFinding[]>;
|
|
22
|
+
/** Default binds `ingestFinding` to a real `FactStore`. */
|
|
23
|
+
findingSink?: SeoFindingSink;
|
|
24
|
+
};
|
|
25
|
+
export type SeoBuildRunOutcome = {
|
|
26
|
+
drafts?: SeoDraft[];
|
|
27
|
+
skipped?: number;
|
|
28
|
+
exitCode: 0 | 2;
|
|
29
|
+
};
|
|
30
|
+
export declare class SeoBuildRunner {
|
|
31
|
+
/**
|
|
32
|
+
* Run one `seo build <reportId>` invocation end-to-end. NEVER throws:
|
|
33
|
+
* every fallible step (report read, approved-findings read, build,
|
|
34
|
+
* persist) is wrapped in one top-level try/catch -> `exitCode: 2`. An
|
|
35
|
+
* unknown reportId or a report with no approved findings is a CLEAN
|
|
36
|
+
* `exitCode: 0` with an informational stdout message and ZERO hub emits
|
|
37
|
+
* (sc-13-4) — `2` is reserved for a caught unexpected error.
|
|
38
|
+
*/
|
|
39
|
+
run(input: SeoBuildRunInput): Promise<SeoBuildRunOutcome>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=build-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-runner.d.ts","sourceRoot":"","sources":["../../../src/seo/builder/build-runner.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAK1D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKjD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;IAEZ,wCAAwC;IACxC,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,uCAAuC;IACvC,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,2DAA2D;IAC3D,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,qEAAqE;IACrE,YAAY,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACnE,2DAA2D;IAC3D,WAAW,CAAC,EAAE,cAAc,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;CACjB,CAAC;AA+FF,qBAAa,cAAc;IACzB;;;;;;;OAOG;IACG,GAAG,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA8ChE"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SeoBuildRunner — drives reportId -> approved hub findings -> SeoBuilder.build
|
|
3
|
+
* -> SeoDraftStore persist -> best-effort hub 'action' emission
|
|
4
|
+
* (spec-20260717-seo-improver-builder, Sprint 13). NEVER throws; exit 0/2.
|
|
5
|
+
* `now` is caller-injected (never re-stamped here) — mirrors
|
|
6
|
+
* `SeoWorkflowRunner.run` (`../runner.ts`) fail-closed/never-throw discipline
|
|
7
|
+
* and `emitFindingsToHub`'s best-effort hub-emit pattern.
|
|
8
|
+
*
|
|
9
|
+
* reportId -> approved-findings linkage (no stored reportId link exists on
|
|
10
|
+
* hub findings, sprint briefing §5): the report is read FIRST (supplies
|
|
11
|
+
* `report.target`, required by `SeoBuilder.build`, and detects an unknown
|
|
12
|
+
* reportId), then approved SEO findings are narrowed to
|
|
13
|
+
* `af.workflow === report.workflow` — the only available linkage.
|
|
14
|
+
*/
|
|
15
|
+
import { createHash } from "node:crypto";
|
|
16
|
+
import { FactStore, factsDbPath, ensureFactsDir } from "../../state/facts.js";
|
|
17
|
+
import { ingestFinding } from "../../hub/finding-store.js";
|
|
18
|
+
import { logger } from "../../utils/logger.js";
|
|
19
|
+
import { SeoReportStore } from "../report-store.js";
|
|
20
|
+
import { NeverEncodeFilter } from "../never-encode-filter.js";
|
|
21
|
+
import { SeoBuilder } from "./seo-builder.js";
|
|
22
|
+
import { readApprovedSeoFindings } from "./hub-approved-source.js";
|
|
23
|
+
import { SeoDraftStore } from "./draft-store.js";
|
|
24
|
+
// ── Defaults ─────────────────────────────────────────────────────────
|
|
25
|
+
/** Opens a real `FactStore` (closed in `finally`) to read approved SEO findings. */
|
|
26
|
+
async function defaultReadApproved(projectRoot) {
|
|
27
|
+
await ensureFactsDir(projectRoot);
|
|
28
|
+
const store = new FactStore(factsDbPath(projectRoot));
|
|
29
|
+
try {
|
|
30
|
+
return readApprovedSeoFindings(store);
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
store.close();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Map a `SeoDraft` -> hub `Finding` (kind ALWAYS `"action"` — every
|
|
38
|
+
* `SeoDraft` carries `humanApprovalRequired: true`, the type literal,
|
|
39
|
+
* `draft-types.ts:29`). Mirrors `SeoHubEmitter`'s title/id/evidence
|
|
40
|
+
* conventions (`../hub-emitter.ts:54-90`) but maps `SeoDraft`, not
|
|
41
|
+
* `SeoFinding` — there is no existing draft->Finding mapper to reuse.
|
|
42
|
+
*
|
|
43
|
+
* bober: `SeoDraft` carries no severity/urgency of its own (it is
|
|
44
|
+
* decoupled from the source finding by `SeoBuilder.build`) — default both
|
|
45
|
+
* to `3` (mid-scale) rather than inventing a provenance link back to the
|
|
46
|
+
* approved finding's severity. Revisit if a future sprint threads
|
|
47
|
+
* `ApprovedFinding.severity` through `SeoBuildResult`.
|
|
48
|
+
*/
|
|
49
|
+
function draftToFinding(draft, now) {
|
|
50
|
+
const title = `[seo] draft ${draft.kind}: ${draft.artifact.slice(0, 80)}`;
|
|
51
|
+
const kind = "action";
|
|
52
|
+
return {
|
|
53
|
+
id: deriveDraftFindingId(title, kind),
|
|
54
|
+
domain: "seo",
|
|
55
|
+
title,
|
|
56
|
+
kind,
|
|
57
|
+
urgency: 3,
|
|
58
|
+
severity: 3,
|
|
59
|
+
evidence: [draft.artifact, `cite:${draft.sourceCitationUrl}`],
|
|
60
|
+
surfacedAt: now,
|
|
61
|
+
tags: ["seo", `playbook:${draft.playbookRef}`, `draft-kind:${draft.kind}`, "seo-draft"],
|
|
62
|
+
status: "open",
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** Content-stable id: hash of domain|title|kind (mirrors `../hub-emitter.ts:32-34`). */
|
|
66
|
+
function deriveDraftFindingId(title, kind) {
|
|
67
|
+
return createHash("sha256").update(`seo|${title}|${kind}`).digest("hex").slice(0, 16);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Best-effort emit each draft as a hub 'action' Finding. NEVER throws and
|
|
71
|
+
* NEVER changes the caller's exit code — mirrors `emitFindingsToHub`
|
|
72
|
+
* (`../runner.ts:391-421`). Checks emptiness BEFORE opening a store so a
|
|
73
|
+
* fully-skipped build never touches the hub (sprint briefing Pitfall 8).
|
|
74
|
+
*/
|
|
75
|
+
async function emitDraftsToHub(drafts, projectRoot, now, findingSink) {
|
|
76
|
+
if (drafts.length === 0)
|
|
77
|
+
return;
|
|
78
|
+
const findings = drafts.map((d) => draftToFinding(d, now));
|
|
79
|
+
if (findingSink !== undefined) {
|
|
80
|
+
try {
|
|
81
|
+
for (const finding of findings) {
|
|
82
|
+
await findingSink(finding);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
logger.warn(`SEO draft hub emission failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
87
|
+
}
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
let store;
|
|
91
|
+
try {
|
|
92
|
+
await ensureFactsDir(projectRoot);
|
|
93
|
+
const opened = new FactStore(factsDbPath(projectRoot));
|
|
94
|
+
store = opened;
|
|
95
|
+
for (const finding of findings) {
|
|
96
|
+
await ingestFinding(opened, finding, { now });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
logger.warn(`SEO draft hub emission failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
store?.close();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// ── SeoBuildRunner ───────────────────────────────────────────────────
|
|
107
|
+
export class SeoBuildRunner {
|
|
108
|
+
/**
|
|
109
|
+
* Run one `seo build <reportId>` invocation end-to-end. NEVER throws:
|
|
110
|
+
* every fallible step (report read, approved-findings read, build,
|
|
111
|
+
* persist) is wrapped in one top-level try/catch -> `exitCode: 2`. An
|
|
112
|
+
* unknown reportId or a report with no approved findings is a CLEAN
|
|
113
|
+
* `exitCode: 0` with an informational stdout message and ZERO hub emits
|
|
114
|
+
* (sc-13-4) — `2` is reserved for a caught unexpected error.
|
|
115
|
+
*/
|
|
116
|
+
async run(input) {
|
|
117
|
+
try {
|
|
118
|
+
const report = await (input.reportStore ?? new SeoReportStore()).read(input.projectRoot, input.reportId);
|
|
119
|
+
if (report === null) {
|
|
120
|
+
process.stdout.write(`seo build: no report found for id "${input.reportId}"\n`);
|
|
121
|
+
return { exitCode: 0 };
|
|
122
|
+
}
|
|
123
|
+
const approvedAll = await (input.readApproved ?? defaultReadApproved)(input.projectRoot);
|
|
124
|
+
// Narrow to the report's workflow — the only available reportId->
|
|
125
|
+
// approved-findings linkage (sprint briefing §5).
|
|
126
|
+
const approved = approvedAll.filter((a) => a.workflow === report.workflow);
|
|
127
|
+
if (approved.length === 0) {
|
|
128
|
+
process.stdout.write(`seo build: report "${input.reportId}" has no approved findings\n`);
|
|
129
|
+
return { exitCode: 0 };
|
|
130
|
+
}
|
|
131
|
+
const builder = input.builder ?? new SeoBuilder(new NeverEncodeFilter());
|
|
132
|
+
const { drafts, skipped } = builder.build({
|
|
133
|
+
approvedFindings: approved,
|
|
134
|
+
target: report.target,
|
|
135
|
+
config: input.config,
|
|
136
|
+
now: input.now,
|
|
137
|
+
});
|
|
138
|
+
const bundle = {
|
|
139
|
+
reportId: report.reportId,
|
|
140
|
+
target: report.target,
|
|
141
|
+
generatedAt: input.now,
|
|
142
|
+
drafts,
|
|
143
|
+
skipped,
|
|
144
|
+
};
|
|
145
|
+
await (input.draftStore ?? new SeoDraftStore()).save(input.projectRoot, bundle);
|
|
146
|
+
// Best-effort AFTER persist — a hub failure never changes the exit code.
|
|
147
|
+
await emitDraftsToHub(drafts, input.projectRoot, input.now, input.findingSink);
|
|
148
|
+
return { drafts, skipped, exitCode: 0 };
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Unexpected throw (report/approved-findings read, build, or persist) -> fail-closed.
|
|
152
|
+
return { exitCode: 2 };
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=build-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-runner.js","sourceRoot":"","sources":["../../../src/seo/builder/build-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic draft-artifact templates (spec-20260717-seo-improver-builder,
|
|
3
|
+
* Sprint 12; ADR-4). Network-free by construction — no LLM, no `fetch`.
|
|
4
|
+
* Every template is pure: no clock, no `Math.random`, no I/O. Each template
|
|
5
|
+
* echoes the `ApprovedFinding.title` verbatim into the produced artifact text
|
|
6
|
+
* so a banned-implying finding yields a banned-implying draft the Sprint-12
|
|
7
|
+
* `SeoBuilder`'s re-filter can catch and drop (sc-12-4).
|
|
8
|
+
*
|
|
9
|
+
* The generators map is injected into `SeoBuilder`'s constructor (optional,
|
|
10
|
+
* defaulting to `DEFAULT_DRAFT_GENERATORS`) so a test can substitute a
|
|
11
|
+
* generator that forces a banned artifact without touching real templates —
|
|
12
|
+
* mirrors how `runner.ts` injects `analyzer`/`dataSource`/`findingSink`.
|
|
13
|
+
*/
|
|
14
|
+
import type { ApprovedFinding } from "./approved-finding.js";
|
|
15
|
+
import type { SeoDraftKind } from "./draft-types.js";
|
|
16
|
+
/** Turns one `ApprovedFinding` + `target` into the proposed artifact TEXT. */
|
|
17
|
+
export type DraftGenerator = (finding: ApprovedFinding, target: string) => string;
|
|
18
|
+
/**
|
|
19
|
+
* One deterministic template per `SeoDraftKind`. Each MUST echo
|
|
20
|
+
* `finding.title` into the artifact text — this is what lets the
|
|
21
|
+
* `SeoBuilder`'s re-filter (`../never-encode-filter.js`) catch a banned
|
|
22
|
+
* tactic implied by the approved finding's own title (sc-12-4).
|
|
23
|
+
*/
|
|
24
|
+
export declare const DEFAULT_DRAFT_GENERATORS: Record<SeoDraftKind, DraftGenerator>;
|
|
25
|
+
/**
|
|
26
|
+
* Deterministically selects the `SeoDraftKind` for an `ApprovedFinding` from
|
|
27
|
+
* its `playbookRef` prefix (`../hub-emitter.ts` encodes `playbook:<ref>` per
|
|
28
|
+
* finding). Falls back to `"title-meta"` — the most generic, broadly
|
|
29
|
+
* applicable draft kind — when no prefix matches. Pure; never throws.
|
|
30
|
+
*/
|
|
31
|
+
export declare function kindForApprovedFinding(finding: ApprovedFinding): SeoDraftKind;
|
|
32
|
+
//# sourceMappingURL=draft-generators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-generators.d.ts","sourceRoot":"","sources":["../../../src/seo/builder/draft-generators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIrD,8EAA8E;AAC9E,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;AAIlF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,YAAY,EAAE,cAAc,CAMzE,CAAC;AAWF;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,eAAe,GAAG,YAAY,CAG7E"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// -- Default templates (one per SeoDraftKind, pure) -------------------------
|
|
2
|
+
/**
|
|
3
|
+
* One deterministic template per `SeoDraftKind`. Each MUST echo
|
|
4
|
+
* `finding.title` into the artifact text — this is what lets the
|
|
5
|
+
* `SeoBuilder`'s re-filter (`../never-encode-filter.js`) catch a banned
|
|
6
|
+
* tactic implied by the approved finding's own title (sc-12-4).
|
|
7
|
+
*/
|
|
8
|
+
export const DEFAULT_DRAFT_GENERATORS = {
|
|
9
|
+
"schema-jsonld": (finding, target) => JSON.stringify({ "@context": "https://schema.org", "@type": "WebPage", name: finding.title, url: target }),
|
|
10
|
+
"internal-link": (finding, target) => `Add an internal link on ${target} implementing: ${finding.title}`,
|
|
11
|
+
"title-meta": (finding, _target) => `<title>${finding.title}</title>`,
|
|
12
|
+
"content-refresh": (finding, target) => `Refresh ${target}: ${finding.title}`,
|
|
13
|
+
};
|
|
14
|
+
// -- Kind selection ----------------------------------------------------------
|
|
15
|
+
/** Deterministic mapping from `playbookRef` prefix to the `SeoDraftKind` produced. */
|
|
16
|
+
const PLAYBOOK_KIND_RULES = [
|
|
17
|
+
{ prefix: "seo.schema", kind: "schema-jsonld" },
|
|
18
|
+
{ prefix: "seo.internal-linking", kind: "internal-link" },
|
|
19
|
+
{ prefix: "seo.content-decay", kind: "content-refresh" },
|
|
20
|
+
];
|
|
21
|
+
/**
|
|
22
|
+
* Deterministically selects the `SeoDraftKind` for an `ApprovedFinding` from
|
|
23
|
+
* its `playbookRef` prefix (`../hub-emitter.ts` encodes `playbook:<ref>` per
|
|
24
|
+
* finding). Falls back to `"title-meta"` — the most generic, broadly
|
|
25
|
+
* applicable draft kind — when no prefix matches. Pure; never throws.
|
|
26
|
+
*/
|
|
27
|
+
export function kindForApprovedFinding(finding) {
|
|
28
|
+
const match = PLAYBOOK_KIND_RULES.find((rule) => finding.playbookRef.startsWith(rule.prefix));
|
|
29
|
+
return match?.kind ?? "title-meta";
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=draft-generators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-generators.js","sourceRoot":"","sources":["../../../src/seo/builder/draft-generators.ts"],"names":[],"mappings":"AAqBA,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAyC;IAC5E,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CACnC,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,oBAAoB,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAC5G,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,2BAA2B,MAAM,kBAAkB,OAAO,CAAC,KAAK,EAAE;IACxG,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,OAAO,CAAC,KAAK,UAAU;IACrE,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,WAAW,MAAM,KAAK,OAAO,CAAC,KAAK,EAAE;CAC9E,CAAC;AAEF,+EAA+E;AAE/E,sFAAsF;AACtF,MAAM,mBAAmB,GAA0D;IACjF,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE;IAC/C,EAAE,MAAM,EAAE,sBAAsB,EAAE,IAAI,EAAE,eAAe,EAAE;IACzD,EAAE,MAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE,iBAAiB,EAAE;CACzD,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAwB;IAC7D,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9F,OAAO,KAAK,EAAE,IAAI,IAAI,YAAY,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { SeoDraft } from "./draft-types.js";
|
|
2
|
+
/** One `SeoBuildRunner.run` invocation's persisted output, keyed by `reportId`. */
|
|
3
|
+
export type SeoDraftBundle = {
|
|
4
|
+
reportId: string;
|
|
5
|
+
target: string;
|
|
6
|
+
/** = the injected `now`, never `Date.now()`. */
|
|
7
|
+
generatedAt: string;
|
|
8
|
+
drafts: SeoDraft[];
|
|
9
|
+
skipped: number;
|
|
10
|
+
};
|
|
11
|
+
export declare class SeoDraftStore {
|
|
12
|
+
/**
|
|
13
|
+
* Write `bundle` atomically (temp file + POSIX-atomic rename) under
|
|
14
|
+
* `.bober/seo/drafts/`. Overwrites any existing bundle with the same
|
|
15
|
+
* `reportId`. Throws on an unrecoverable fs failure — callers (the build
|
|
16
|
+
* runner) are expected to catch and fail closed.
|
|
17
|
+
*/
|
|
18
|
+
save(projectRoot: string, bundle: SeoDraftBundle): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Read a persisted `SeoDraftBundle` by `reportId`. Returns `null` on a
|
|
21
|
+
* missing file — NEVER throws (mirrors `SeoReportStore.read`).
|
|
22
|
+
*/
|
|
23
|
+
read(projectRoot: string, reportId: string): Promise<SeoDraftBundle | null>;
|
|
24
|
+
/**
|
|
25
|
+
* List all persisted draft-bundle reportIds, sorted by filename. Returns
|
|
26
|
+
* `[]` if the drafts directory does not exist — never throws.
|
|
27
|
+
*/
|
|
28
|
+
list(projectRoot: string): Promise<string[]>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=draft-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-store.d.ts","sourceRoot":"","sources":["../../../src/seo/builder/draft-store.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAmBjD,mFAAmF;AACnF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAIF,qBAAa,aAAa;IACxB;;;;;OAKG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAStE;;;OAGG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAUjF;;;OAGG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAanD"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SeoDraftStore — persists a `SeoDraftBundle` JSON under `.bober/seo/drafts/`
|
|
3
|
+
* (spec-20260717-seo-improver-builder, Sprint 13). MIRRORS `SeoReportStore`
|
|
4
|
+
* (`../report-store.ts`): atomic temp-file + POSIX rename, sanitized
|
|
5
|
+
* filename, `null`-on-missing read, `[]`-on-missing list. Write-once id =
|
|
6
|
+
* the source `reportId` (one draft bundle per built report).
|
|
7
|
+
*
|
|
8
|
+
* `generatedAt` on the bundle is ALWAYS the caller-injected `now` — this
|
|
9
|
+
* file never reads the clock for that purpose. The `.tmp` suffix below uses
|
|
10
|
+
* `Date.now()` purely as a uniqueness token for the temp filename (same
|
|
11
|
+
* carve-out `report-store.ts:67-68` documents), never as a bundle timestamp.
|
|
12
|
+
*/
|
|
13
|
+
import { readFile, writeFile, readdir, rename } from "node:fs/promises";
|
|
14
|
+
import { randomBytes } from "node:crypto";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { ensureDir } from "../../utils/fs.js";
|
|
17
|
+
// ── Paths ────────────────────────────────────────────────────────────
|
|
18
|
+
const SEO_DRAFTS_DIR = ".bober/seo/drafts";
|
|
19
|
+
const DRAFT_SUFFIX = "-seo-drafts.json";
|
|
20
|
+
function draftsDir(projectRoot) {
|
|
21
|
+
return join(projectRoot, SEO_DRAFTS_DIR);
|
|
22
|
+
}
|
|
23
|
+
/** fs-safe filename — mirrors `report-store.ts`'s sanitization. */
|
|
24
|
+
function draftPath(projectRoot, reportId) {
|
|
25
|
+
const safeId = reportId.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
26
|
+
return join(draftsDir(projectRoot), `${safeId}${DRAFT_SUFFIX}`);
|
|
27
|
+
}
|
|
28
|
+
// ── Store ────────────────────────────────────────────────────────────
|
|
29
|
+
export class SeoDraftStore {
|
|
30
|
+
/**
|
|
31
|
+
* Write `bundle` atomically (temp file + POSIX-atomic rename) under
|
|
32
|
+
* `.bober/seo/drafts/`. Overwrites any existing bundle with the same
|
|
33
|
+
* `reportId`. Throws on an unrecoverable fs failure — callers (the build
|
|
34
|
+
* runner) are expected to catch and fail closed.
|
|
35
|
+
*/
|
|
36
|
+
async save(projectRoot, bundle) {
|
|
37
|
+
await ensureDir(draftsDir(projectRoot));
|
|
38
|
+
const path = draftPath(projectRoot, bundle.reportId);
|
|
39
|
+
// Uniqueness token for the temp filename only — NOT a bundle timestamp.
|
|
40
|
+
const tmp = `${path}.${process.pid}.${Date.now()}.${randomBytes(4).toString("hex")}.tmp`;
|
|
41
|
+
await writeFile(tmp, JSON.stringify(bundle, null, 2) + "\n", { encoding: "utf-8" });
|
|
42
|
+
await rename(tmp, path);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Read a persisted `SeoDraftBundle` by `reportId`. Returns `null` on a
|
|
46
|
+
* missing file — NEVER throws (mirrors `SeoReportStore.read`).
|
|
47
|
+
*/
|
|
48
|
+
async read(projectRoot, reportId) {
|
|
49
|
+
const path = draftPath(projectRoot, reportId);
|
|
50
|
+
try {
|
|
51
|
+
const raw = await readFile(path, "utf-8");
|
|
52
|
+
return JSON.parse(raw);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* List all persisted draft-bundle reportIds, sorted by filename. Returns
|
|
60
|
+
* `[]` if the drafts directory does not exist — never throws.
|
|
61
|
+
*/
|
|
62
|
+
async list(projectRoot) {
|
|
63
|
+
let entries;
|
|
64
|
+
try {
|
|
65
|
+
entries = await readdir(draftsDir(projectRoot));
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
return entries
|
|
71
|
+
.filter((f) => f.endsWith(DRAFT_SUFFIX))
|
|
72
|
+
.sort()
|
|
73
|
+
.map((f) => f.slice(0, -DRAFT_SUFFIX.length));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=draft-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-store.js","sourceRoot":"","sources":["../../../src/seo/builder/draft-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C,wEAAwE;AAExE,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAC3C,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAExC,SAAS,SAAS,CAAC,WAAmB;IACpC,OAAO,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;AAC3C,CAAC;AAED,mEAAmE;AACnE,SAAS,SAAS,CAAC,WAAmB,EAAE,QAAgB;IACtD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,GAAG,MAAM,GAAG,YAAY,EAAE,CAAC,CAAC;AAClE,CAAC;AAcD,wEAAwE;AAExE,MAAM,OAAO,aAAa;IACxB;;;;;OAKG;IACH,KAAK,CAAC,IAAI,CAAC,WAAmB,EAAE,MAAsB;QACpD,MAAM,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrD,wEAAwE;QACxE,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;QACzF,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACpF,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,WAAmB,EAAE,QAAgB;QAC9C,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,WAAmB;QAC5B,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;aACvC,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;CACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SeoDraft artifact types (spec-20260717-seo-improver-builder, Sprint 11;
|
|
3
|
+
* ADR-4). Pure `type` declarations only — no runtime code, no imports —
|
|
4
|
+
* mirrors `../types.ts`'s "no runtime" discipline (`types.ts:1-12`).
|
|
5
|
+
*
|
|
6
|
+
* A `SeoDraft` is a PROPOSAL the Sprint-12 `SeoBuilder.build` produces from
|
|
7
|
+
* an `ApprovedFinding` (`./approved-finding.js`); it is never auto-applied.
|
|
8
|
+
* `humanApprovalRequired` is pinned to the LITERAL `true` (not `boolean`) —
|
|
9
|
+
* ADR-4 explicitly rejected a boolean flag as forgeable/mutable, so the type
|
|
10
|
+
* itself must reject `false`. `sourceCitationUrl` must be COPIED verbatim
|
|
11
|
+
* from the `ApprovedFinding` that produced the draft — never invented.
|
|
12
|
+
*/
|
|
13
|
+
/** The four artifact kinds the Sprint-12 `SeoBuilder.build` can draft. */
|
|
14
|
+
export type SeoDraftKind = "schema-jsonld" | "internal-link" | "title-meta" | "content-refresh";
|
|
15
|
+
/**
|
|
16
|
+
* One drafted artifact. Every field is provenance-preserving: `artifact` is
|
|
17
|
+
* a proposed text/content string, never auto-applied; `sourceCitationUrl`
|
|
18
|
+
* and `sourceFindingId` trace back to the exact `ApprovedFinding` this draft
|
|
19
|
+
* was derived from.
|
|
20
|
+
*/
|
|
21
|
+
export type SeoDraft = {
|
|
22
|
+
kind: SeoDraftKind;
|
|
23
|
+
/** LITERAL `true` — a forgeable plain `boolean` was explicitly rejected (ADR-4). */
|
|
24
|
+
humanApprovalRequired: true;
|
|
25
|
+
/** Copied verbatim from `ApprovedFinding.sourceCitationUrl` — never invented. */
|
|
26
|
+
sourceCitationUrl: string;
|
|
27
|
+
/** The hub Finding id this draft was derived from. */
|
|
28
|
+
sourceFindingId: string;
|
|
29
|
+
/** The URL/page/entity this draft targets. */
|
|
30
|
+
target: string;
|
|
31
|
+
/** The proposed artifact text/content — a proposal, never auto-applied. */
|
|
32
|
+
artifact: string;
|
|
33
|
+
/** The playbook whose tactic produced this draft. */
|
|
34
|
+
playbookRef: string;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=draft-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-types.d.ts","sourceRoot":"","sources":["../../../src/seo/builder/draft-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,0EAA0E;AAC1E,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,eAAe,GAAG,YAAY,GAAG,iBAAiB,CAAC;AAIhG;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,YAAY,CAAC;IACnB,oFAAoF;IACpF,qBAAqB,EAAE,IAAI,CAAC;IAC5B,iFAAiF;IACjF,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sDAAsD;IACtD,eAAe,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SeoDraft artifact types (spec-20260717-seo-improver-builder, Sprint 11;
|
|
3
|
+
* ADR-4). Pure `type` declarations only — no runtime code, no imports —
|
|
4
|
+
* mirrors `../types.ts`'s "no runtime" discipline (`types.ts:1-12`).
|
|
5
|
+
*
|
|
6
|
+
* A `SeoDraft` is a PROPOSAL the Sprint-12 `SeoBuilder.build` produces from
|
|
7
|
+
* an `ApprovedFinding` (`./approved-finding.js`); it is never auto-applied.
|
|
8
|
+
* `humanApprovalRequired` is pinned to the LITERAL `true` (not `boolean`) —
|
|
9
|
+
* ADR-4 explicitly rejected a boolean flag as forgeable/mutable, so the type
|
|
10
|
+
* itself must reject `false`. `sourceCitationUrl` must be COPIED verbatim
|
|
11
|
+
* from the `ApprovedFinding` that produced the draft — never invented.
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=draft-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-types.js","sourceRoot":"","sources":["../../../src/seo/builder/draft-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { FactStore } from "../../state/facts.js";
|
|
2
|
+
import { ApprovedFinding } from "./approved-finding.js";
|
|
3
|
+
/**
|
|
4
|
+
* Reads approved, cited, SEO-domain hub Findings from `store` and maps each
|
|
5
|
+
* to an `ApprovedFinding` via `ApprovedFinding.from`. Never throws: malformed
|
|
6
|
+
* JSON, schema-invalid rows, non-`"seo"`-domain rows, non-`"approved"`
|
|
7
|
+
* status, and uncited/malformed-citation rows are all silently skipped
|
|
8
|
+
* (sc-11-4).
|
|
9
|
+
*/
|
|
10
|
+
export declare function readApprovedSeoFindings(store: FactStore): ApprovedFinding[];
|
|
11
|
+
//# sourceMappingURL=hub-approved-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-approved-source.d.ts","sourceRoot":"","sources":["../../../src/seo/builder/hub-approved-source.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAA4B,MAAM,uBAAuB,CAAC;AAElF;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,GAAG,eAAe,EAAE,CAqB3E"}
|