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,249 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bober.security-payments
|
|
3
|
+
description: "Payments/PSP backend security signature library. Not a workflow skill -- a data file of discrete vulnerable/safe code signature blocks read by SecuritySignatureParser. Covers webhook HMAC verification, non-constant-time signature comparison, idempotency keys, duplicate-credit on webhook replay, refund/chargeback abuse, float money, withdrawal-to-different-method, withdrawal approval thresholds, client-supplied amounts, and unvalidated refund amounts."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# bober.security-payments — Payments/PSP Backend Security Signature Library
|
|
7
|
+
|
|
8
|
+
This skill is a **signature-library** file, not a workflow skill. It is read (as raw
|
|
9
|
+
markdown text) by `SecuritySignatureParser.parse()`
|
|
10
|
+
(`src/orchestrator/security-knowledge/parser.ts`) and turned into typed
|
|
11
|
+
`SecuritySignature[]` records used by the security-audit agent team. Do not confuse this
|
|
12
|
+
with `bober.security-audit`, which is the audit *workflow* skill.
|
|
13
|
+
|
|
14
|
+
## Signature Block Format
|
|
15
|
+
|
|
16
|
+
Each signature is a level-3 heading (three `#` characters, a space, then the
|
|
17
|
+
`signatureId`) followed by labelled fields and two fenced code examples. This file and
|
|
18
|
+
`SecuritySignatureParser` are one executable spec — keep them in sync.
|
|
19
|
+
|
|
20
|
+
Required fields per block:
|
|
21
|
+
- The heading text itself is the `signatureId` (must be non-empty).
|
|
22
|
+
- `- **Title:** <human-readable title>`
|
|
23
|
+
- `- **CWE:** CWE-xx` (optional — omit the line entirely for `cwe: null`)
|
|
24
|
+
- `- **Severity:** critical|high|medium|low|info`
|
|
25
|
+
- `- **VulnClass:** <a VulnClass union member, verbatim — see security-audit-types.ts>`
|
|
26
|
+
- `- **Invariant:** <the safety invariant this signature protects>`
|
|
27
|
+
- `- **Keywords:** comma, separated, keywords`
|
|
28
|
+
|
|
29
|
+
Then two labelled fenced code examples:
|
|
30
|
+
- `**Unsafe:**` followed by a fenced `ts` block with the vulnerable example.
|
|
31
|
+
- `**Safe:**` followed by a fenced `ts` block with the fixed example.
|
|
32
|
+
|
|
33
|
+
A block missing `Title`, a valid `VulnClass`, a valid `Severity`, or a non-empty
|
|
34
|
+
unsafe/safe example is dropped by the parser — never a fatal error.
|
|
35
|
+
|
|
36
|
+
## Signatures
|
|
37
|
+
|
|
38
|
+
### payments.webhook-missing-hmac
|
|
39
|
+
- **Title:** PSP webhook processed without HMAC signature verification
|
|
40
|
+
- **CWE:** CWE-345
|
|
41
|
+
- **Severity:** critical
|
|
42
|
+
- **VulnClass:** authn-authz
|
|
43
|
+
- **Invariant:** A PSP webhook payload is only processed after its HMAC signature over the raw request body is verified — an unsigned or unverified webhook body is never trusted.
|
|
44
|
+
- **Keywords:** webhook, HMAC, PSP, raw-body, signature, verify
|
|
45
|
+
|
|
46
|
+
**Unsafe:**
|
|
47
|
+
```ts
|
|
48
|
+
app.post("/psp/webhook", (req, res) => { applyPayment(req.body); }); // no signature check
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Safe:**
|
|
52
|
+
```ts
|
|
53
|
+
app.post("/psp/webhook", (req, res) => {
|
|
54
|
+
const expected = crypto.createHmac("sha256", secret).update(req.rawBody).digest("hex");
|
|
55
|
+
if (!verifySignature(expected, req.headers["x-psp-signature"])) return res.status(401).end();
|
|
56
|
+
applyPayment(req.body);
|
|
57
|
+
});
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### payments.webhook-nonconstant-compare
|
|
61
|
+
- **Title:** Webhook signature compared non-constant-time / no replay timestamp
|
|
62
|
+
- **CWE:** CWE-208
|
|
63
|
+
- **Severity:** high
|
|
64
|
+
- **VulnClass:** crypto-weakness
|
|
65
|
+
- **Invariant:** A webhook signature comparison always uses a constant-time comparison and rejects payloads whose signed timestamp falls outside an acceptable replay window.
|
|
66
|
+
- **Keywords:** timingSafeEqual, timing attack, ===, timestamp, replay
|
|
67
|
+
|
|
68
|
+
**Unsafe:**
|
|
69
|
+
```ts
|
|
70
|
+
if (req.headers["x-psp-signature"] === expected) applyPayment(req.body);
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Safe:**
|
|
74
|
+
```ts
|
|
75
|
+
const inWindow = Date.now() - Number(req.headers["x-psp-timestamp"]) <= MAX_SKEW_MS;
|
|
76
|
+
if (inWindow && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(req.headers["x-psp-signature"]))) {
|
|
77
|
+
applyPayment(req.body);
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### payments.missing-idempotency-key
|
|
82
|
+
- **Title:** Missing/non-atomic idempotency key on a money endpoint
|
|
83
|
+
- **CWE:** CWE-362
|
|
84
|
+
- **Severity:** critical
|
|
85
|
+
- **VulnClass:** race-condition
|
|
86
|
+
- **Invariant:** A charge request is applied at most once per idempotency key, enforced by a unique constraint at the database layer via an atomic insert — never by an application-level check-then-insert.
|
|
87
|
+
- **Keywords:** idempotency, idempotency-key, atomic, unique, upsert
|
|
88
|
+
|
|
89
|
+
**Unsafe:**
|
|
90
|
+
```ts
|
|
91
|
+
const existing = await db.query("SELECT id FROM charges WHERE key = $1", [idempotencyKey]);
|
|
92
|
+
if (!existing) await db.query("INSERT INTO charges (key, amount) VALUES ($1, $2)", [idempotencyKey, amount]);
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Safe:**
|
|
96
|
+
```ts
|
|
97
|
+
await db.query(
|
|
98
|
+
"INSERT INTO charges (key, amount) VALUES ($1, $2) ON CONFLICT (key) DO NOTHING", // key is UNIQUE
|
|
99
|
+
[idempotencyKey, amount],
|
|
100
|
+
);
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### payments.duplicate-credit-webhook-replay
|
|
104
|
+
- **Title:** Duplicate credit on PSP webhook replay (no event dedup)
|
|
105
|
+
- **CWE:** CWE-799
|
|
106
|
+
- **Severity:** critical
|
|
107
|
+
- **VulnClass:** money-integrity
|
|
108
|
+
- **Invariant:** Each provider webhook event is applied at most once, keyed by the provider's unique event id enforced with a database uniqueness constraint — a retried event never credits the account twice.
|
|
109
|
+
- **Keywords:** webhook, replay, dedup, provider-event, double-credit
|
|
110
|
+
|
|
111
|
+
**Unsafe:**
|
|
112
|
+
```ts
|
|
113
|
+
app.post("/webhook", async (req, res) => { await creditAccount(req.body); }); // "payment_intent.succeeded" retried by PSP credits twice
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Safe:**
|
|
117
|
+
```ts
|
|
118
|
+
app.post("/webhook", async (req, res) => {
|
|
119
|
+
const inserted = await db.query(
|
|
120
|
+
"INSERT INTO webhook_events (event_id) VALUES ($1) ON CONFLICT DO NOTHING RETURNING event_id",
|
|
121
|
+
[req.body.id],
|
|
122
|
+
);
|
|
123
|
+
if (inserted.rowCount === 0) return res.status(200).end(); // already processed
|
|
124
|
+
await creditAccount(req.body);
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### payments.refund-chargeback-abuse
|
|
129
|
+
- **Title:** Refund/chargeback abuse (over-refund, double refund, post-chargeback)
|
|
130
|
+
- **CWE:** CWE-840
|
|
131
|
+
- **Severity:** critical
|
|
132
|
+
- **VulnClass:** money-integrity
|
|
133
|
+
- **Invariant:** A refund amount never exceeds the captured amount minus amounts already refunded, and no further refund is issued once a charge has been disputed/charged back.
|
|
134
|
+
- **Keywords:** refund, chargeback, over-refund, double refund, dispute
|
|
135
|
+
|
|
136
|
+
**Unsafe:**
|
|
137
|
+
```ts
|
|
138
|
+
await refund(chargeId, req.body.amount); // no cap against captured-minus-already-refunded
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**Safe:**
|
|
142
|
+
```ts
|
|
143
|
+
const charge = await getCharge(chargeId);
|
|
144
|
+
if (charge.disputed) throw new Error("charge is disputed");
|
|
145
|
+
const remaining = charge.capturedAmount - charge.refundedAmount;
|
|
146
|
+
if (req.body.amount > remaining) throw new Error("refund exceeds remaining captured amount");
|
|
147
|
+
await refund(chargeId, req.body.amount);
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### payments.float-money-currency-mismatch
|
|
151
|
+
- **Title:** Float money / currency-conversion mismatch
|
|
152
|
+
- **CWE:** CWE-681
|
|
153
|
+
- **Severity:** high
|
|
154
|
+
- **VulnClass:** money-integrity
|
|
155
|
+
- **Invariant:** Monetary amounts are represented as integer minor units with an explicit currency code end-to-end — amounts in different currencies are never added directly, and amounts are never stored or summed as IEEE-754 floats.
|
|
156
|
+
- **Keywords:** float, minor units, currency, Decimal, rounding, cents
|
|
157
|
+
|
|
158
|
+
**Unsafe:**
|
|
159
|
+
```ts
|
|
160
|
+
totalUsd += lineItem.price * 1.1; // float drift; also silently adds a EUR line item's price
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**Safe:**
|
|
164
|
+
```ts
|
|
165
|
+
if (lineItem.currency !== "USD") throw new Error("currency mismatch");
|
|
166
|
+
totalCents += Math.round(lineItem.priceCents * 1.1); // integer minor units
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### payments.withdraw-different-method
|
|
170
|
+
- **Title:** Withdrawal to a method different from the funding source
|
|
171
|
+
- **CWE:** CWE-840
|
|
172
|
+
- **Severity:** critical
|
|
173
|
+
- **VulnClass:** money-integrity
|
|
174
|
+
- **Invariant:** A withdrawal payout is only permitted to the same verified instrument the funds were originally deposited from — an arbitrary attacker-supplied destination account is never accepted.
|
|
175
|
+
- **Keywords:** withdrawal, payout, funding source, cash-out, method
|
|
176
|
+
|
|
177
|
+
**Unsafe:**
|
|
178
|
+
```ts
|
|
179
|
+
await payout(userId, req.body.destinationAccount, req.body.amount); // any destination accepted
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
**Safe:**
|
|
183
|
+
```ts
|
|
184
|
+
const fundingInstrument = await getVerifiedFundingInstrument(userId);
|
|
185
|
+
if (req.body.destinationAccount !== fundingInstrument.id) throw new Error("destination must match funding source");
|
|
186
|
+
await payout(userId, fundingInstrument.id, req.body.amount);
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### payments.missing-withdrawal-approval-threshold
|
|
190
|
+
- **Title:** Large withdrawal with no approval threshold / dual control
|
|
191
|
+
- **CWE:** CWE-862
|
|
192
|
+
- **Severity:** high
|
|
193
|
+
- **VulnClass:** authn-authz
|
|
194
|
+
- **Invariant:** A withdrawal above a configured threshold requires a second approver (dual control) before funds move — no withdrawal amount is auto-approved unconditionally.
|
|
195
|
+
- **Keywords:** withdrawal, approval, threshold, dual control, four-eyes
|
|
196
|
+
|
|
197
|
+
**Unsafe:**
|
|
198
|
+
```ts
|
|
199
|
+
await processWithdrawal(userId, req.body.amount); // any size auto-approved
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**Safe:**
|
|
203
|
+
```ts
|
|
204
|
+
if (req.body.amount > WITHDRAWAL_APPROVAL_THRESHOLD_CENTS) {
|
|
205
|
+
await queueForDualControlApproval(userId, req.body.amount);
|
|
206
|
+
} else {
|
|
207
|
+
await processWithdrawal(userId, req.body.amount);
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### payments.client-supplied-amount
|
|
212
|
+
- **Title:** Trusting client-supplied price/amount at charge time
|
|
213
|
+
- **CWE:** CWE-602
|
|
214
|
+
- **Severity:** critical
|
|
215
|
+
- **VulnClass:** money-integrity
|
|
216
|
+
- **Invariant:** The amount charged is always computed from the server-side order/catalog at charge time — a price or amount value submitted by the client is never used directly.
|
|
217
|
+
- **Keywords:** amount, price, tampering, client-supplied, server-side
|
|
218
|
+
|
|
219
|
+
**Unsafe:**
|
|
220
|
+
```ts
|
|
221
|
+
await charge(userId, req.body.amount); // client controls the charged amount directly
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**Safe:**
|
|
225
|
+
```ts
|
|
226
|
+
const order = await getOrder(req.body.orderId); // server-resolved amount from the catalog/order record
|
|
227
|
+
await charge(userId, order.totalCents);
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### payments.unvalidated-refund-amount
|
|
231
|
+
- **Title:** Negative/oversized refund amount not validated
|
|
232
|
+
- **CWE:** CWE-20
|
|
233
|
+
- **Severity:** high
|
|
234
|
+
- **VulnClass:** money-integrity
|
|
235
|
+
- **Invariant:** A refund amount is validated as a positive integer no greater than the captured amount before any refund is issued — a negative, zero, or oversized value is rejected.
|
|
236
|
+
- **Keywords:** refund, negative, validation, amount, bound
|
|
237
|
+
|
|
238
|
+
**Unsafe:**
|
|
239
|
+
```ts
|
|
240
|
+
await refund(chargeId, req.body.amount); // negative amount inverts refund into a charge
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
**Safe:**
|
|
244
|
+
```ts
|
|
245
|
+
if (!Number.isInteger(req.body.amount) || req.body.amount <= 0 || req.body.amount > charge.capturedAmount) {
|
|
246
|
+
throw new Error("invalid refund amount");
|
|
247
|
+
}
|
|
248
|
+
await refund(chargeId, req.body.amount);
|
|
249
|
+
```
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bober.security-react
|
|
3
|
+
description: "React client-side security signature library. Not a workflow skill -- a data file of discrete vulnerable/safe code signature blocks read by SecuritySignatureParser. Covers XSS via dangerouslySetInnerHTML/innerHTML/document.write, secrets committed into the client bundle, client-side-only trust of security decisions, unsafe href/redirect, postMessage without origin checks, and prototype pollution via client-side deep merge of untrusted input."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# bober.security-react — React Client-Side Security Signature Library
|
|
7
|
+
|
|
8
|
+
This skill is a **signature-library** file, not a workflow skill. It is read (as raw
|
|
9
|
+
markdown text) by `SecuritySignatureParser.parse()`
|
|
10
|
+
(`src/orchestrator/security-knowledge/parser.ts`) and turned into typed
|
|
11
|
+
`SecuritySignature[]` records used by the security-audit agent team. Do not confuse this
|
|
12
|
+
with `bober.security-audit`, which is the audit *workflow* skill, or with
|
|
13
|
+
`skills/bober.react/SKILL.md`, which is the unrelated React *framework* skill.
|
|
14
|
+
|
|
15
|
+
## Signature Block Format
|
|
16
|
+
|
|
17
|
+
Each signature is a level-3 heading (three `#` characters, a space, then the
|
|
18
|
+
`signatureId`) followed by labelled fields and two fenced code examples. This file and
|
|
19
|
+
`SecuritySignatureParser` are one executable spec — keep them in sync.
|
|
20
|
+
|
|
21
|
+
Required fields per block:
|
|
22
|
+
- The heading text itself is the `signatureId` (must be non-empty).
|
|
23
|
+
- `- **Title:** <human-readable title>`
|
|
24
|
+
- `- **CWE:** CWE-xx` (optional — omit the line entirely for `cwe: null`)
|
|
25
|
+
- `- **Severity:** critical|high|medium|low|info`
|
|
26
|
+
- `- **VulnClass:** <a VulnClass union member, verbatim — see security-audit-types.ts>`
|
|
27
|
+
- `- **Invariant:** <the safety invariant this signature protects>`
|
|
28
|
+
- `- **Keywords:** comma, separated, keywords`
|
|
29
|
+
|
|
30
|
+
Then two labelled fenced code examples:
|
|
31
|
+
- `**Unsafe:**` followed by a fenced `ts` block with the vulnerable example.
|
|
32
|
+
- `**Safe:**` followed by a fenced `ts` block with the fixed example.
|
|
33
|
+
|
|
34
|
+
A block missing `Title`, a valid `VulnClass`, a valid `Severity`, or a non-empty
|
|
35
|
+
unsafe/safe example is dropped by the parser — never a fatal error.
|
|
36
|
+
|
|
37
|
+
## Signatures
|
|
38
|
+
|
|
39
|
+
### react.dangerously-set-inner-html
|
|
40
|
+
- **Title:** XSS via dangerouslySetInnerHTML with variable input
|
|
41
|
+
- **CWE:** CWE-79
|
|
42
|
+
- **Severity:** critical
|
|
43
|
+
- **VulnClass:** xss
|
|
44
|
+
- **Invariant:** `dangerouslySetInnerHTML` is never given HTML built from unsanitized user-controlled data — either the content is rendered as text or it is passed through a sanitizer first.
|
|
45
|
+
- **Keywords:** dangerouslySetInnerHTML, XSS, __html, DOMPurify, sanitize
|
|
46
|
+
|
|
47
|
+
**Unsafe:**
|
|
48
|
+
```tsx
|
|
49
|
+
<div dangerouslySetInnerHTML={{ __html: userBio }} />
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Safe:**
|
|
53
|
+
```tsx
|
|
54
|
+
<div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(userBio) }} />
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### react.raw-innerhtml-documentwrite
|
|
58
|
+
- **Title:** XSS via innerHTML / document.write with variable input
|
|
59
|
+
- **CWE:** CWE-79
|
|
60
|
+
- **Severity:** critical
|
|
61
|
+
- **VulnClass:** xss
|
|
62
|
+
- **Invariant:** DOM content derived from user-controlled data is assigned via `textContent` or a sanitized render path — `innerHTML` and `document.write` are never given unsanitized user input.
|
|
63
|
+
- **Keywords:** innerHTML, document.write, XSS, textContent, DOM
|
|
64
|
+
|
|
65
|
+
**Unsafe:**
|
|
66
|
+
```ts
|
|
67
|
+
el.innerHTML = new URLSearchParams(location.search).get("q");
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Safe:**
|
|
71
|
+
```ts
|
|
72
|
+
el.textContent = new URLSearchParams(location.search).get("q");
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### react.secret-in-client-bundle
|
|
76
|
+
- **Title:** Secret / API key committed into the client bundle
|
|
77
|
+
- **CWE:** CWE-798
|
|
78
|
+
- **Severity:** critical
|
|
79
|
+
- **VulnClass:** secret-handling
|
|
80
|
+
- **Invariant:** A secret credential is never referenced from client-side code or a `REACT_APP_`/build-time env var that ships in the bundle — secret-gated calls are proxied through a server that holds the credential.
|
|
81
|
+
- **Keywords:** API key, client bundle, secret, process.env, REACT_APP
|
|
82
|
+
|
|
83
|
+
**Unsafe:**
|
|
84
|
+
```ts
|
|
85
|
+
const stripeSecretKey = process.env.REACT_APP_STRIPE_SECRET_KEY; // bundled into client JS, extractable
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**Safe:**
|
|
89
|
+
```ts
|
|
90
|
+
// client never holds the secret key; it calls a server endpoint that holds it
|
|
91
|
+
const res = await fetch("/api/create-payment-intent", { method: "POST", body: JSON.stringify(order) });
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### react.client-trusted-authz
|
|
95
|
+
- **Title:** Security decision trusted client-side (must be enforced server-side)
|
|
96
|
+
- **CWE:** CWE-602
|
|
97
|
+
- **Severity:** critical
|
|
98
|
+
- **VulnClass:** authn-authz
|
|
99
|
+
- **Invariant:** A UI element being conditionally rendered based on a client-held flag is never the sole enforcement of an authorization decision — the server independently re-checks authorization on every request the action triggers.
|
|
100
|
+
- **Keywords:** client-side, isAdmin, authorization, trust boundary, server
|
|
101
|
+
|
|
102
|
+
**Unsafe:**
|
|
103
|
+
```tsx
|
|
104
|
+
{user.isAdmin && <AdminPanel />} // server trusts any request that reaches the admin API
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Safe:**
|
|
108
|
+
```tsx
|
|
109
|
+
{user.isAdmin && <AdminPanel />} // UI hint only; server middleware independently requires an admin role
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### react.unsafe-href-redirect
|
|
113
|
+
- **Title:** Unsafe href / open redirect (javascript: scheme / attacker-controlled target)
|
|
114
|
+
- **CWE:** CWE-601
|
|
115
|
+
- **Severity:** high
|
|
116
|
+
- **VulnClass:** input-validation
|
|
117
|
+
- **Invariant:** A URL used as a link target or redirect destination is validated against an allowed scheme and, for redirects, an allowlist of same-origin/known paths before use — an attacker-controlled `javascript:` URI or arbitrary external redirect target is never followed.
|
|
118
|
+
- **Keywords:** href, javascript:, open redirect, location, next, allowlist
|
|
119
|
+
|
|
120
|
+
**Unsafe:**
|
|
121
|
+
```tsx
|
|
122
|
+
<a href={userSuppliedUrl}>Visit</a>
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**Safe:**
|
|
126
|
+
```tsx
|
|
127
|
+
const safeUrl = /^https?:\/\//.test(userSuppliedUrl) ? userSuppliedUrl : "#";
|
|
128
|
+
<a href={safeUrl}>Visit</a>
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### react.postmessage-no-origin
|
|
132
|
+
- **Title:** postMessage handler without origin check
|
|
133
|
+
- **CWE:** CWE-346
|
|
134
|
+
- **Severity:** high
|
|
135
|
+
- **VulnClass:** input-validation
|
|
136
|
+
- **Invariant:** A `message` event listener always verifies `event.origin` against an allowlist before acting on `event.data` — a message from an unexpected origin is never processed.
|
|
137
|
+
- **Keywords:** postMessage, message event, origin, onmessage, allowlist
|
|
138
|
+
|
|
139
|
+
**Unsafe:**
|
|
140
|
+
```ts
|
|
141
|
+
window.addEventListener("message", (event) => { runCommand(event.data); });
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**Safe:**
|
|
145
|
+
```ts
|
|
146
|
+
window.addEventListener("message", (event) => {
|
|
147
|
+
if (!ALLOWED_ORIGINS.includes(event.origin)) return;
|
|
148
|
+
runCommand(event.data);
|
|
149
|
+
});
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### react.prototype-pollution-deepmerge
|
|
153
|
+
- **Title:** Prototype pollution via client-side deep merge of untrusted input
|
|
154
|
+
- **CWE:** CWE-1321
|
|
155
|
+
- **Severity:** high
|
|
156
|
+
- **VulnClass:** input-validation
|
|
157
|
+
- **Invariant:** A deep-merge of parsed untrusted JSON always rejects or strips `__proto__`, `constructor`, and `prototype` keys before merging — object state derived from untrusted input never reaches `Object.prototype`.
|
|
158
|
+
- **Keywords:** prototype pollution, __proto__, deep merge, constructor, JSON.parse
|
|
159
|
+
|
|
160
|
+
**Unsafe:**
|
|
161
|
+
```ts
|
|
162
|
+
const merged = deepMerge(state, JSON.parse(untrustedResponse)); // "__proto__" key pollutes Object.prototype
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**Safe:**
|
|
166
|
+
```ts
|
|
167
|
+
function safeDeepMerge(target, source) {
|
|
168
|
+
for (const key of Object.keys(source)) {
|
|
169
|
+
if (key === "__proto__" || key === "constructor" || key === "prototype") continue;
|
|
170
|
+
target[key] = source[key];
|
|
171
|
+
}
|
|
172
|
+
return target;
|
|
173
|
+
}
|
|
174
|
+
const merged = safeDeepMerge(state, JSON.parse(untrustedResponse));
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### react.token-in-localstorage
|
|
178
|
+
- **Title:** Auth token stored in localStorage (XSS-exfiltratable)
|
|
179
|
+
- **CWE:** CWE-922
|
|
180
|
+
- **Severity:** high
|
|
181
|
+
- **VulnClass:** secret-handling
|
|
182
|
+
- **Invariant:** An authentication token is stored in an httpOnly cookie inaccessible to JavaScript — it is never written to `localStorage`/`sessionStorage`, where any XSS on the page can read and exfiltrate it.
|
|
183
|
+
- **Keywords:** localStorage, JWT, token, httpOnly, XSS exfiltration
|
|
184
|
+
|
|
185
|
+
**Unsafe:**
|
|
186
|
+
```ts
|
|
187
|
+
localStorage.setItem("jwt", token); // any injected script can read this
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Safe:**
|
|
191
|
+
```ts
|
|
192
|
+
// server sets the token as an httpOnly, Secure, SameSite cookie on login;
|
|
193
|
+
// the client never touches the token value directly
|
|
194
|
+
```
|