memory-journal-mcp 7.7.0 → 8.0.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/README.md +126 -56
- package/dist/chunk-6OHRCNYW.js +3231 -0
- package/dist/chunk-JFMITANR.js +5168 -0
- package/dist/{chunk-QCQPAF4I.js → chunk-MWNLAEHR.js} +301 -4321
- package/dist/{chunk-ARLYSFSI.js → chunk-UHSO65A4.js} +4242 -6092
- package/dist/cli.js +21 -3
- package/dist/index.d.ts +16 -13
- package/dist/index.js +4 -2
- package/dist/resources-IJVKDFGS.js +2 -0
- package/dist/tools-44DGXE3V.js +2 -0
- package/dist/worker-script.js +201 -20
- package/package.json +7 -4
- package/skills/README.md +62 -25
- package/skills/adversarial-performance/SKILL.md +139 -0
- package/skills/adversarial-performance/references/audit-categories.md +462 -0
- package/skills/adversarial-performance/references/copilot-performance-prompts.md +44 -0
- package/skills/adversarial-performance/references/copilot-usage.md +16 -0
- package/skills/adversarial-performance/references/feedback-loop.md +177 -0
- package/skills/adversarial-performance/references/multi-pass-performance-protocol.md +398 -0
- package/skills/adversarial-planner/SKILL.md +23 -54
- package/skills/adversarial-planner/references/copilot-integration.md +25 -40
- package/skills/adversarial-planner/references/copilot-usage.md +16 -0
- package/skills/adversarial-planner/references/multi-pass-protocol.md +4 -0
- package/skills/adversarial-security/SKILL.md +149 -0
- package/skills/adversarial-security/references/adversarial-base-protocol.md +44 -0
- package/skills/adversarial-security/references/audit-categories.md +723 -0
- package/skills/adversarial-security/references/copilot-security-prompts.md +142 -0
- package/skills/adversarial-security/references/copilot-usage.md +16 -0
- package/skills/adversarial-security/references/feedback-loop.md +206 -0
- package/skills/adversarial-security/references/journal-opt-out.md +7 -0
- package/skills/adversarial-security/references/multi-pass-security-protocol.md +403 -0
- package/skills/adversarial-skill-audit/SKILL.md +118 -0
- package/skills/adversarial-skill-audit/references/audit-categories.md +308 -0
- package/skills/adversarial-skill-audit/references/copilot-skill-prompts.md +68 -0
- package/skills/adversarial-skill-audit/references/copilot-usage.md +16 -0
- package/skills/adversarial-skill-audit/references/feedback-loop.md +155 -0
- package/skills/adversarial-skill-audit/references/multi-pass-skill-protocol.md +367 -0
- package/skills/adversarial-skill-audit/scripts/check-skills.ps1 +48 -0
- package/skills/adversarial-skill-audit/scripts/run-copilot.ps1 +52 -0
- package/skills/adversarial-workflow-audit/SKILL.md +82 -0
- package/skills/adversarial-workflow-audit/references/audit-categories.md +28 -0
- package/skills/adversarial-workflow-audit/references/copilot-usage.md +16 -0
- package/skills/adversarial-workflow-audit/scripts/check-workflows.ps1 +24 -0
- package/skills/agents-sdk/SKILL.md +220 -0
- package/skills/agents-sdk/references/callable.md +92 -0
- package/skills/agents-sdk/references/codemode.md +209 -0
- package/skills/agents-sdk/references/email.md +144 -0
- package/skills/agents-sdk/references/mcp/SKILL.md +65 -0
- package/skills/agents-sdk/references/mcp/code-mode-reference.md +245 -0
- package/skills/agents-sdk/references/mcp/oauth-reference.md +359 -0
- package/skills/agents-sdk/references/mcp/references/architecture-reference.md +208 -0
- package/skills/agents-sdk/references/mcp/references/cloudflare-quickstart.md +156 -0
- package/skills/agents-sdk/references/mcp/references/error-handling.md +343 -0
- package/skills/agents-sdk/references/mcp/references/http-security.md +164 -0
- package/skills/agents-sdk/references/mcp/references/implementation-guide.md +507 -0
- package/skills/agents-sdk/references/mcp/references/testing-reference.md +171 -0
- package/skills/agents-sdk/references/mcp.md +157 -0
- package/skills/agents-sdk/references/state-scheduling.md +164 -0
- package/skills/agents-sdk/references/streaming-chat.md +168 -0
- package/skills/agents-sdk/references/workflows.md +136 -0
- package/skills/auth-identity/SKILL.md +48 -0
- package/skills/autonomous-dev/SKILL.md +46 -23
- package/skills/autonomous-dev/references/workflow_orchestration.md +22 -0
- package/skills/aws/SKILL.md +39 -0
- package/skills/azure/SKILL.md +38 -0
- package/skills/bin/sync.js +7 -1
- package/skills/biome/SKILL.md +59 -0
- package/skills/bun/SKILL.md +8 -2
- package/skills/cloudflare/SKILL.md +37 -0
- package/skills/cloudflare/references/agents-sdk/README.md +95 -0
- package/skills/cloudflare/references/agents-sdk/api.md +195 -0
- package/skills/cloudflare/references/agents-sdk/configuration.md +178 -0
- package/skills/cloudflare/references/agents-sdk/gotchas.md +173 -0
- package/skills/cloudflare/references/agents-sdk/patterns.md +215 -0
- package/skills/cloudflare/references/ai-gateway/README.md +176 -0
- package/skills/cloudflare/references/ai-gateway/configuration.md +117 -0
- package/skills/cloudflare/references/ai-gateway/dynamic-routing.md +88 -0
- package/skills/cloudflare/references/ai-gateway/features.md +96 -0
- package/skills/cloudflare/references/ai-gateway/sdk-integration.md +110 -0
- package/skills/cloudflare/references/ai-gateway/troubleshooting.md +90 -0
- package/skills/cloudflare/references/ai-search/README.md +145 -0
- package/skills/cloudflare/references/ai-search/api.md +87 -0
- package/skills/cloudflare/references/ai-search/configuration.md +91 -0
- package/skills/cloudflare/references/ai-search/gotchas.md +92 -0
- package/skills/cloudflare/references/ai-search/patterns.md +87 -0
- package/skills/cloudflare/references/analytics-engine/README.md +96 -0
- package/skills/cloudflare/references/analytics-engine/api.md +112 -0
- package/skills/cloudflare/references/analytics-engine/configuration.md +107 -0
- package/skills/cloudflare/references/analytics-engine/gotchas.md +87 -0
- package/skills/cloudflare/references/analytics-engine/patterns.md +83 -0
- package/skills/cloudflare/references/api/README.md +66 -0
- package/skills/cloudflare/references/api/api.md +205 -0
- package/skills/cloudflare/references/api/configuration.md +158 -0
- package/skills/cloudflare/references/api/gotchas.md +231 -0
- package/skills/cloudflare/references/api/patterns.md +208 -0
- package/skills/cloudflare/references/api-shield/README.md +44 -0
- package/skills/cloudflare/references/api-shield/api.md +153 -0
- package/skills/cloudflare/references/api-shield/configuration.md +210 -0
- package/skills/cloudflare/references/api-shield/gotchas.md +132 -0
- package/skills/cloudflare/references/api-shield/patterns.md +185 -0
- package/skills/cloudflare/references/argo-smart-routing/README.md +96 -0
- package/skills/cloudflare/references/argo-smart-routing/api.md +253 -0
- package/skills/cloudflare/references/argo-smart-routing/configuration.md +205 -0
- package/skills/cloudflare/references/argo-smart-routing/gotchas.md +115 -0
- package/skills/cloudflare/references/argo-smart-routing/patterns.md +107 -0
- package/skills/cloudflare/references/bindings/README.md +127 -0
- package/skills/cloudflare/references/bindings/api.md +214 -0
- package/skills/cloudflare/references/bindings/configuration.md +200 -0
- package/skills/cloudflare/references/bindings/gotchas.md +210 -0
- package/skills/cloudflare/references/bindings/patterns.md +205 -0
- package/skills/cloudflare/references/bot-management/README.md +95 -0
- package/skills/cloudflare/references/bot-management/api.md +175 -0
- package/skills/cloudflare/references/bot-management/configuration.md +175 -0
- package/skills/cloudflare/references/bot-management/gotchas.md +116 -0
- package/skills/cloudflare/references/bot-management/patterns.md +181 -0
- package/skills/cloudflare/references/browser-rendering/README.md +84 -0
- package/skills/cloudflare/references/browser-rendering/api.md +108 -0
- package/skills/cloudflare/references/browser-rendering/configuration.md +78 -0
- package/skills/cloudflare/references/browser-rendering/gotchas.md +91 -0
- package/skills/cloudflare/references/browser-rendering/patterns.md +93 -0
- package/skills/cloudflare/references/c3/README.md +111 -0
- package/skills/cloudflare/references/c3/api.md +71 -0
- package/skills/cloudflare/references/c3/configuration.md +85 -0
- package/skills/cloudflare/references/c3/gotchas.md +97 -0
- package/skills/cloudflare/references/c3/patterns.md +84 -0
- package/skills/cloudflare/references/cache-reserve/README.md +150 -0
- package/skills/cloudflare/references/cache-reserve/api.md +184 -0
- package/skills/cloudflare/references/cache-reserve/configuration.md +170 -0
- package/skills/cloudflare/references/cache-reserve/gotchas.md +136 -0
- package/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
- package/skills/cloudflare/references/containers/README.md +87 -0
- package/skills/cloudflare/references/containers/api.md +197 -0
- package/skills/cloudflare/references/containers/configuration.md +191 -0
- package/skills/cloudflare/references/containers/gotchas.md +182 -0
- package/skills/cloudflare/references/containers/patterns.md +204 -0
- package/skills/cloudflare/references/cron-triggers/README.md +101 -0
- package/skills/cloudflare/references/cron-triggers/api.md +224 -0
- package/skills/cloudflare/references/cron-triggers/configuration.md +190 -0
- package/skills/cloudflare/references/cron-triggers/gotchas.md +207 -0
- package/skills/cloudflare/references/cron-triggers/patterns.md +274 -0
- package/skills/cloudflare/references/d1/README.md +137 -0
- package/skills/cloudflare/references/d1/api.md +213 -0
- package/skills/cloudflare/references/d1/configuration.md +198 -0
- package/skills/cloudflare/references/d1/gotchas.md +98 -0
- package/skills/cloudflare/references/d1/patterns.md +240 -0
- package/skills/cloudflare/references/ddos/README.md +42 -0
- package/skills/cloudflare/references/ddos/api.md +158 -0
- package/skills/cloudflare/references/ddos/configuration.md +94 -0
- package/skills/cloudflare/references/ddos/gotchas.md +114 -0
- package/skills/cloudflare/references/ddos/patterns.md +220 -0
- package/skills/cloudflare/references/decision-trees.md +95 -0
- package/skills/cloudflare/references/do-storage/README.md +79 -0
- package/skills/cloudflare/references/do-storage/api.md +107 -0
- package/skills/cloudflare/references/do-storage/configuration.md +114 -0
- package/skills/cloudflare/references/do-storage/gotchas.md +153 -0
- package/skills/cloudflare/references/do-storage/patterns.md +210 -0
- package/skills/cloudflare/references/do-storage/testing.md +186 -0
- package/skills/cloudflare/references/durable-objects/README.md +194 -0
- package/skills/cloudflare/references/durable-objects/api.md +205 -0
- package/skills/cloudflare/references/durable-objects/configuration.md +160 -0
- package/skills/cloudflare/references/durable-objects/gotchas.md +200 -0
- package/skills/cloudflare/references/durable-objects/patterns.md +205 -0
- package/skills/cloudflare/references/email-routing/README.md +89 -0
- package/skills/cloudflare/references/email-routing/api.md +192 -0
- package/skills/cloudflare/references/email-routing/configuration.md +187 -0
- package/skills/cloudflare/references/email-routing/gotchas.md +203 -0
- package/skills/cloudflare/references/email-routing/patterns.md +241 -0
- package/skills/cloudflare/references/email-workers/README.md +153 -0
- package/skills/cloudflare/references/email-workers/api.md +227 -0
- package/skills/cloudflare/references/email-workers/configuration.md +115 -0
- package/skills/cloudflare/references/email-workers/gotchas.md +133 -0
- package/skills/cloudflare/references/email-workers/patterns.md +108 -0
- package/skills/cloudflare/references/graphql-api/README.md +147 -0
- package/skills/cloudflare/references/graphql-api/api.md +175 -0
- package/skills/cloudflare/references/graphql-api/configuration.md +151 -0
- package/skills/cloudflare/references/graphql-api/gotchas.md +111 -0
- package/skills/cloudflare/references/graphql-api/patterns.md +276 -0
- package/skills/cloudflare/references/hyperdrive/README.md +84 -0
- package/skills/cloudflare/references/hyperdrive/api.md +149 -0
- package/skills/cloudflare/references/hyperdrive/configuration.md +166 -0
- package/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
- package/skills/cloudflare/references/hyperdrive/patterns.md +203 -0
- package/skills/cloudflare/references/images/README.md +65 -0
- package/skills/cloudflare/references/images/api.md +101 -0
- package/skills/cloudflare/references/images/configuration.md +206 -0
- package/skills/cloudflare/references/images/gotchas.md +106 -0
- package/skills/cloudflare/references/images/patterns.md +126 -0
- package/skills/cloudflare/references/kv/README.md +90 -0
- package/skills/cloudflare/references/kv/api.md +163 -0
- package/skills/cloudflare/references/kv/configuration.md +148 -0
- package/skills/cloudflare/references/kv/gotchas.md +133 -0
- package/skills/cloudflare/references/kv/patterns.md +195 -0
- package/skills/cloudflare/references/miniflare/README.md +113 -0
- package/skills/cloudflare/references/miniflare/api.md +204 -0
- package/skills/cloudflare/references/miniflare/configuration.md +174 -0
- package/skills/cloudflare/references/miniflare/gotchas.md +179 -0
- package/skills/cloudflare/references/miniflare/patterns.md +187 -0
- package/skills/cloudflare/references/network-interconnect/README.md +104 -0
- package/skills/cloudflare/references/network-interconnect/api.md +220 -0
- package/skills/cloudflare/references/network-interconnect/configuration.md +123 -0
- package/skills/cloudflare/references/network-interconnect/gotchas.md +175 -0
- package/skills/cloudflare/references/network-interconnect/patterns.md +174 -0
- package/skills/cloudflare/references/observability/README.md +93 -0
- package/skills/cloudflare/references/observability/api.md +168 -0
- package/skills/cloudflare/references/observability/configuration.md +178 -0
- package/skills/cloudflare/references/observability/gotchas.md +125 -0
- package/skills/cloudflare/references/observability/patterns.md +105 -0
- package/skills/cloudflare/references/pages/README.md +92 -0
- package/skills/cloudflare/references/pages/api.md +205 -0
- package/skills/cloudflare/references/pages/configuration.md +216 -0
- package/skills/cloudflare/references/pages/gotchas.md +218 -0
- package/skills/cloudflare/references/pages/patterns.md +215 -0
- package/skills/cloudflare/references/pages-functions/README.md +104 -0
- package/skills/cloudflare/references/pages-functions/api.md +159 -0
- package/skills/cloudflare/references/pages-functions/configuration.md +130 -0
- package/skills/cloudflare/references/pages-functions/gotchas.md +102 -0
- package/skills/cloudflare/references/pages-functions/patterns.md +148 -0
- package/skills/cloudflare/references/pipelines/README.md +109 -0
- package/skills/cloudflare/references/pipelines/api.md +214 -0
- package/skills/cloudflare/references/pipelines/configuration.md +98 -0
- package/skills/cloudflare/references/pipelines/gotchas.md +84 -0
- package/skills/cloudflare/references/pipelines/patterns.md +87 -0
- package/skills/cloudflare/references/product-index.md +112 -0
- package/skills/cloudflare/references/pulumi/README.md +113 -0
- package/skills/cloudflare/references/pulumi/api.md +230 -0
- package/skills/cloudflare/references/pulumi/configuration.md +213 -0
- package/skills/cloudflare/references/pulumi/gotchas.md +205 -0
- package/skills/cloudflare/references/pulumi/patterns.md +260 -0
- package/skills/cloudflare/references/queues/README.md +99 -0
- package/skills/cloudflare/references/queues/api.md +211 -0
- package/skills/cloudflare/references/queues/configuration.md +151 -0
- package/skills/cloudflare/references/queues/gotchas.md +210 -0
- package/skills/cloudflare/references/queues/patterns.md +220 -0
- package/skills/cloudflare/references/r2/README.md +97 -0
- package/skills/cloudflare/references/r2/api.md +235 -0
- package/skills/cloudflare/references/r2/configuration.md +176 -0
- package/skills/cloudflare/references/r2/gotchas.md +190 -0
- package/skills/cloudflare/references/r2/patterns.md +203 -0
- package/skills/cloudflare/references/r2-data-catalog/README.md +157 -0
- package/skills/cloudflare/references/r2-data-catalog/api.md +199 -0
- package/skills/cloudflare/references/r2-data-catalog/configuration.md +205 -0
- package/skills/cloudflare/references/r2-data-catalog/gotchas.md +170 -0
- package/skills/cloudflare/references/r2-data-catalog/patterns.md +191 -0
- package/skills/cloudflare/references/r2-sql/README.md +138 -0
- package/skills/cloudflare/references/r2-sql/SKILL.md.backup +512 -0
- package/skills/cloudflare/references/r2-sql/api.md +159 -0
- package/skills/cloudflare/references/r2-sql/configuration.md +152 -0
- package/skills/cloudflare/references/r2-sql/gotchas.md +228 -0
- package/skills/cloudflare/references/r2-sql/patterns.md +230 -0
- package/skills/cloudflare/references/realtime-sfu/README.md +66 -0
- package/skills/cloudflare/references/realtime-sfu/api.md +164 -0
- package/skills/cloudflare/references/realtime-sfu/configuration.md +141 -0
- package/skills/cloudflare/references/realtime-sfu/gotchas.md +138 -0
- package/skills/cloudflare/references/realtime-sfu/patterns.md +187 -0
- package/skills/cloudflare/references/realtimekit/README.md +118 -0
- package/skills/cloudflare/references/realtimekit/api.md +234 -0
- package/skills/cloudflare/references/realtimekit/configuration.md +226 -0
- package/skills/cloudflare/references/realtimekit/gotchas.md +206 -0
- package/skills/cloudflare/references/realtimekit/patterns.md +240 -0
- package/skills/cloudflare/references/sandbox/README.md +104 -0
- package/skills/cloudflare/references/sandbox/api.md +200 -0
- package/skills/cloudflare/references/sandbox/configuration.md +154 -0
- package/skills/cloudflare/references/sandbox/gotchas.md +201 -0
- package/skills/cloudflare/references/sandbox/patterns.md +195 -0
- package/skills/cloudflare/references/secrets-store/README.md +77 -0
- package/skills/cloudflare/references/secrets-store/api.md +199 -0
- package/skills/cloudflare/references/secrets-store/configuration.md +187 -0
- package/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
- package/skills/cloudflare/references/secrets-store/patterns.md +218 -0
- package/skills/cloudflare/references/smart-placement/README.md +143 -0
- package/skills/cloudflare/references/smart-placement/api.md +192 -0
- package/skills/cloudflare/references/smart-placement/configuration.md +202 -0
- package/skills/cloudflare/references/smart-placement/gotchas.md +180 -0
- package/skills/cloudflare/references/smart-placement/patterns.md +190 -0
- package/skills/cloudflare/references/snippets/README.md +74 -0
- package/skills/cloudflare/references/snippets/api.md +214 -0
- package/skills/cloudflare/references/snippets/configuration.md +239 -0
- package/skills/cloudflare/references/snippets/gotchas.md +104 -0
- package/skills/cloudflare/references/snippets/patterns.md +135 -0
- package/skills/cloudflare/references/spectrum/README.md +52 -0
- package/skills/cloudflare/references/spectrum/api.md +184 -0
- package/skills/cloudflare/references/spectrum/configuration.md +203 -0
- package/skills/cloudflare/references/spectrum/gotchas.md +155 -0
- package/skills/cloudflare/references/spectrum/patterns.md +206 -0
- package/skills/cloudflare/references/static-assets/README.md +65 -0
- package/skills/cloudflare/references/static-assets/api.md +201 -0
- package/skills/cloudflare/references/static-assets/configuration.md +186 -0
- package/skills/cloudflare/references/static-assets/gotchas.md +164 -0
- package/skills/cloudflare/references/static-assets/patterns.md +189 -0
- package/skills/cloudflare/references/stream/README.md +123 -0
- package/skills/cloudflare/references/stream/api-live.md +202 -0
- package/skills/cloudflare/references/stream/api.md +206 -0
- package/skills/cloudflare/references/stream/configuration.md +151 -0
- package/skills/cloudflare/references/stream/gotchas.md +139 -0
- package/skills/cloudflare/references/stream/patterns.md +217 -0
- package/skills/cloudflare/references/tail-workers/README.md +92 -0
- package/skills/cloudflare/references/tail-workers/api.md +203 -0
- package/skills/cloudflare/references/tail-workers/configuration.md +178 -0
- package/skills/cloudflare/references/tail-workers/gotchas.md +206 -0
- package/skills/cloudflare/references/tail-workers/patterns.md +190 -0
- package/skills/cloudflare/references/terraform/README.md +100 -0
- package/skills/cloudflare/references/terraform/api.md +178 -0
- package/skills/cloudflare/references/terraform/configuration.md +197 -0
- package/skills/cloudflare/references/terraform/gotchas.md +150 -0
- package/skills/cloudflare/references/terraform/patterns.md +174 -0
- package/skills/cloudflare/references/tunnel/README.md +137 -0
- package/skills/cloudflare/references/tunnel/api.md +205 -0
- package/skills/cloudflare/references/tunnel/configuration.md +163 -0
- package/skills/cloudflare/references/tunnel/gotchas.md +159 -0
- package/skills/cloudflare/references/tunnel/networking.md +174 -0
- package/skills/cloudflare/references/tunnel/patterns.md +199 -0
- package/skills/cloudflare/references/turn/README.md +86 -0
- package/skills/cloudflare/references/turn/api.md +236 -0
- package/skills/cloudflare/references/turn/configuration.md +181 -0
- package/skills/cloudflare/references/turn/gotchas.md +236 -0
- package/skills/cloudflare/references/turn/patterns.md +228 -0
- package/skills/cloudflare/references/turnstile/README.md +102 -0
- package/skills/cloudflare/references/turnstile/api.md +253 -0
- package/skills/cloudflare/references/turnstile/configuration.md +242 -0
- package/skills/cloudflare/references/turnstile/gotchas.md +253 -0
- package/skills/cloudflare/references/turnstile/patterns.md +195 -0
- package/skills/cloudflare/references/vectorize/README.md +133 -0
- package/skills/cloudflare/references/vectorize/api.md +89 -0
- package/skills/cloudflare/references/vectorize/configuration.md +91 -0
- package/skills/cloudflare/references/vectorize/gotchas.md +83 -0
- package/skills/cloudflare/references/vectorize/patterns.md +92 -0
- package/skills/cloudflare/references/waf/README.md +125 -0
- package/skills/cloudflare/references/waf/api.md +203 -0
- package/skills/cloudflare/references/waf/configuration.md +215 -0
- package/skills/cloudflare/references/waf/gotchas.md +208 -0
- package/skills/cloudflare/references/waf/patterns.md +236 -0
- package/skills/cloudflare/references/web-analytics/README.md +149 -0
- package/skills/cloudflare/references/web-analytics/configuration.md +81 -0
- package/skills/cloudflare/references/web-analytics/gotchas.md +86 -0
- package/skills/cloudflare/references/web-analytics/integration.md +63 -0
- package/skills/cloudflare/references/web-analytics/patterns.md +98 -0
- package/skills/cloudflare/references/workerd/README.md +85 -0
- package/skills/cloudflare/references/workerd/api.md +219 -0
- package/skills/cloudflare/references/workerd/configuration.md +200 -0
- package/skills/cloudflare/references/workerd/gotchas.md +151 -0
- package/skills/cloudflare/references/workerd/patterns.md +205 -0
- package/skills/cloudflare/references/workers/README.md +110 -0
- package/skills/cloudflare/references/workers/api.md +197 -0
- package/skills/cloudflare/references/workers/configuration.md +184 -0
- package/skills/cloudflare/references/workers/frameworks.md +200 -0
- package/skills/cloudflare/references/workers/gotchas.md +145 -0
- package/skills/cloudflare/references/workers/patterns.md +220 -0
- package/skills/cloudflare/references/workers-ai/README.md +206 -0
- package/skills/cloudflare/references/workers-ai/api.md +115 -0
- package/skills/cloudflare/references/workers-ai/configuration.md +98 -0
- package/skills/cloudflare/references/workers-ai/gotchas.md +130 -0
- package/skills/cloudflare/references/workers-ai/patterns.md +122 -0
- package/skills/cloudflare/references/workers-for-platforms/README.md +95 -0
- package/skills/cloudflare/references/workers-for-platforms/api.md +212 -0
- package/skills/cloudflare/references/workers-for-platforms/configuration.md +178 -0
- package/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
- package/skills/cloudflare/references/workers-for-platforms/patterns.md +210 -0
- package/skills/cloudflare/references/workers-playground/README.md +131 -0
- package/skills/cloudflare/references/workers-playground/api.md +101 -0
- package/skills/cloudflare/references/workers-playground/configuration.md +169 -0
- package/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
- package/skills/cloudflare/references/workers-playground/patterns.md +134 -0
- package/skills/cloudflare/references/workers-vpc/README.md +130 -0
- package/skills/cloudflare/references/workers-vpc/api.md +196 -0
- package/skills/cloudflare/references/workers-vpc/configuration.md +151 -0
- package/skills/cloudflare/references/workers-vpc/gotchas.md +171 -0
- package/skills/cloudflare/references/workers-vpc/patterns.md +235 -0
- package/skills/cloudflare/references/workflows/README.md +72 -0
- package/skills/cloudflare/references/workflows/api.md +237 -0
- package/skills/cloudflare/references/workflows/configuration.md +158 -0
- package/skills/cloudflare/references/workflows/gotchas.md +97 -0
- package/skills/cloudflare/references/workflows/patterns.md +245 -0
- package/skills/cloudflare/references/wrangler/README.md +143 -0
- package/skills/cloudflare/references/wrangler/api.md +188 -0
- package/skills/cloudflare/references/wrangler/configuration.md +198 -0
- package/skills/cloudflare/references/wrangler/gotchas.md +212 -0
- package/skills/cloudflare/references/wrangler/patterns.md +211 -0
- package/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +131 -0
- package/skills/cloudflare/references/zaraz/README.md +114 -0
- package/skills/cloudflare/references/zaraz/api.md +118 -0
- package/skills/cloudflare/references/zaraz/configuration.md +94 -0
- package/skills/cloudflare/references/zaraz/gotchas.md +88 -0
- package/skills/cloudflare/references/zaraz/patterns.md +77 -0
- package/skills/docker/SKILL.md +7 -101
- package/skills/docker/references/advanced-examples.md +71 -0
- package/skills/docker/references/templates.md +34 -0
- package/skills/docs-marketer/SKILL.md +178 -0
- package/skills/docs-marketer/references/audit-categories.md +328 -0
- package/skills/docs-marketer/references/copilot-docs-prompts.md +88 -0
- package/skills/docs-marketer/references/copilot-usage.md +16 -0
- package/skills/docs-marketer/references/feedback-loop.md +155 -0
- package/skills/docs-marketer/references/multi-pass-docs-protocol.md +410 -0
- package/skills/drizzle-orm/SKILL.md +82 -0
- package/skills/durable-objects/SKILL.md +167 -0
- package/skills/durable-objects/references/advanced_features.md +29 -0
- package/skills/durable-objects/references/rules.md +300 -0
- package/skills/durable-objects/references/testing.md +261 -0
- package/skills/durable-objects/references/workers.md +336 -0
- package/skills/gcp/SKILL.md +37 -0
- package/skills/github-actions/SKILL.md +5 -58
- package/skills/github-actions/references/templates.md +65 -0
- package/skills/github-commander/SKILL.md +13 -21
- package/skills/github-commander/workflows/copilot-audit.md +12 -12
- package/skills/github-copilot-cli/SKILL.md +21 -26
- package/skills/github-repo-setup/SKILL.md +136 -0
- package/skills/github-repo-setup/references/community-standards.md +136 -0
- package/skills/github-repo-setup/references/github-automation.md +490 -0
- package/skills/github-repo-setup/references/inline-templates.md +205 -0
- package/skills/github-repo-setup/references/project-config.md +320 -0
- package/skills/gitlab/SKILL.md +7 -2
- package/skills/gitlab/package-lock.json +389 -389
- package/skills/golang/SKILL.md +8 -1
- package/skills/graphql/SKILL.md +30 -0
- package/skills/hono/SKILL.md +82 -0
- package/skills/journal-optimizer/SKILL.md +206 -0
- package/skills/journal-optimizer/references/optimizer-scripts.md +169 -0
- package/skills/llm-app-engineering/SKILL.md +18 -0
- package/skills/monorepo/SKILL.md +56 -0
- package/skills/multi-agent-orchestration/SKILL.md +14 -0
- package/skills/mysql/SKILL.md +6 -2
- package/skills/next-best-practices/SKILL.md +86 -0
- package/skills/next-best-practices/references/cache-components-examples.md +234 -0
- package/skills/next-best-practices/references/cache-components.md +210 -0
- package/skills/next-best-practices/references/upgrade-decision-tree.md +33 -0
- package/skills/next-best-practices/references/upgrade.md +43 -0
- package/skills/next-cache-components/SKILL.md +441 -0
- package/skills/next-upgrade/SKILL.md +43 -0
- package/skills/next-upgrade/references/decision-tree.md +33 -0
- package/skills/nodejs/SKILL.md +46 -0
- package/skills/opentelemetry/SKILL.md +62 -0
- package/skills/package.json +39 -4
- package/skills/playwright-standard/SKILL.md +6 -11
- package/skills/playwright-standard/references/locators.md +7 -0
- package/skills/postgres/SKILL.md +6 -1
- package/skills/python/SKILL.md +8 -70
- package/skills/python/references/advanced-patterns.md +37 -0
- package/skills/python/references/config-templates.md +48 -0
- package/skills/rag-pipelines/SKILL.md +14 -0
- package/skills/redis/SKILL.md +31 -0
- package/skills/render/SKILL.md +35 -0
- package/skills/rust/SKILL.md +15 -25
- package/skills/rust/references/borrow-checker.md +13 -0
- package/skills/rust/references/ecosystem.md +11 -0
- package/skills/sandbox-sdk/SKILL.md +186 -0
- package/skills/sandbox-sdk/references/api-quick-ref.md +113 -0
- package/skills/sandbox-sdk/references/examples.md +52 -0
- package/skills/shadcn-ui/SKILL.md +22 -57
- package/skills/skill-builder/SKILL.md +23 -424
- package/skills/skill-builder/references/tutorial.md +457 -0
- package/skills/sqlite/SKILL.md +16 -5
- package/skills/table.md +59 -0
- package/skills/tailwind-css/SKILL.md +11 -60
- package/skills/tailwind-css/references/component-patterns.md +52 -0
- package/skills/trpc/SKILL.md +56 -0
- package/skills/typescript/SKILL.md +30 -433
- package/skills/typescript/references/tutorial.md +453 -0
- package/skills/vercel-ai-sdk/SKILL.md +48 -0
- package/skills/vitest-standard/SKILL.md +5 -11
- package/skills/vitest-standard/references/assertions.md +11 -0
- package/skills/web-perf/SKILL.md +207 -0
- package/skills/workers-best-practices/SKILL.md +120 -0
- package/skills/workers-best-practices/references/anti-patterns.md +18 -0
- package/skills/workers-best-practices/references/review.md +174 -0
- package/skills/workers-best-practices/references/rules.md +485 -0
- package/skills/wrangler/SKILL.md +43 -0
- package/skills/wrangler/references/cli-commands.md +861 -0
- package/skills/zod/SKILL.md +48 -0
- package/dist/tools-P4VGG4FH.js +0 -1
- package/skills/react-best-practices/AGENTS.md +0 -2883
- package/skills/react-best-practices/SKILL.md +0 -138
- /package/skills/{react-best-practices → next-best-practices}/README.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/metadata.json +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/_sections.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/_template.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-event-handler-refs.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-init-once.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-use-latest.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-api-routes.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-defer-await.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-dependencies.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-parallel.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-suspense-boundaries.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-barrel-imports.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-conditional.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-defer-third-party.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-dynamic-imports.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-preload.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-event-listeners.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-localstorage-schema.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-passive-event-listeners.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-swr-dedup.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-batch-dom-css.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-function-results.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-property-access.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-storage.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-combine-iterations.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-early-exit.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-hoist-regexp.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-index-maps.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-length-check-first.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-min-max-loop.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-set-map-lookups.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-tosorted-immutable.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-activity.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-animate-svg-wrapper.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-conditional-render.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-content-visibility.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hoist-jsx.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hydration-no-flicker.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hydration-suppress-warning.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-svg-precision.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-usetransition-loading.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-defer-reads.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-dependencies.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-derived-state-no-effect.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-derived-state.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-functional-setstate.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-lazy-state-init.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-memo-with-default-value.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-memo.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-move-effect-to-event.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-simple-expression-in-memo.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-transitions.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-use-ref-transient-values.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-after-nonblocking.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-auth-actions.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-cache-lru.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-cache-react.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-dedup-props.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-parallel-fetching.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-serialization.md +0 -0
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# D1 Patterns & Best Practices
|
|
2
|
+
|
|
3
|
+
## Pagination
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
async function getUsers({ page, pageSize }: { page: number; pageSize: number }, env: Env) {
|
|
7
|
+
const offset = (page - 1) * pageSize
|
|
8
|
+
const [countResult, dataResult] = await env.DB.batch([
|
|
9
|
+
env.DB.prepare('SELECT COUNT(*) as total FROM users'),
|
|
10
|
+
env.DB.prepare('SELECT * FROM users ORDER BY created_at DESC LIMIT ? OFFSET ?').bind(
|
|
11
|
+
pageSize,
|
|
12
|
+
offset
|
|
13
|
+
),
|
|
14
|
+
])
|
|
15
|
+
return {
|
|
16
|
+
data: dataResult.results,
|
|
17
|
+
total: countResult.results[0].total,
|
|
18
|
+
page,
|
|
19
|
+
pageSize,
|
|
20
|
+
totalPages: Math.ceil(countResult.results[0].total / pageSize),
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Conditional Queries
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
async function searchUsers(filters: { name?: string; email?: string; active?: boolean }, env: Env) {
|
|
29
|
+
const conditions: string[] = [],
|
|
30
|
+
params: (string | number | boolean | null)[] = []
|
|
31
|
+
if (filters.name) {
|
|
32
|
+
conditions.push('name LIKE ?')
|
|
33
|
+
params.push(`%${filters.name}%`)
|
|
34
|
+
}
|
|
35
|
+
if (filters.email) {
|
|
36
|
+
conditions.push('email = ?')
|
|
37
|
+
params.push(filters.email)
|
|
38
|
+
}
|
|
39
|
+
if (filters.active !== undefined) {
|
|
40
|
+
conditions.push('active = ?')
|
|
41
|
+
params.push(filters.active ? 1 : 0)
|
|
42
|
+
}
|
|
43
|
+
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''
|
|
44
|
+
return await env.DB.prepare(`SELECT * FROM users ${whereClause}`)
|
|
45
|
+
.bind(...params)
|
|
46
|
+
.all()
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Bulk Insert
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
async function bulkInsertUsers(users: Array<{ name: string; email: string }>, env: Env) {
|
|
54
|
+
const stmt = env.DB.prepare('INSERT INTO users (name, email) VALUES (?, ?)')
|
|
55
|
+
const batch = users.map((user) => stmt.bind(user.name, user.email))
|
|
56
|
+
return await env.DB.batch(batch)
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Caching with KV
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
async function getCachedUser(userId: number, env: { DB: D1Database; CACHE: KVNamespace }) {
|
|
64
|
+
const cacheKey = `user:${userId}`
|
|
65
|
+
const cached = await env.CACHE?.get(cacheKey, 'json')
|
|
66
|
+
if (cached) return cached
|
|
67
|
+
const user = await env.DB.prepare('SELECT * FROM users WHERE id = ?').bind(userId).first()
|
|
68
|
+
if (user) await env.CACHE?.put(cacheKey, JSON.stringify(user), { expirationTtl: 300 })
|
|
69
|
+
return user
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Query Optimization
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
// ✅ Use indexes in WHERE clauses
|
|
77
|
+
const users = await env.DB.prepare('SELECT * FROM users WHERE email = ?').bind(email).all()
|
|
78
|
+
|
|
79
|
+
// ✅ Limit result sets
|
|
80
|
+
const recentPosts = await env.DB.prepare(
|
|
81
|
+
'SELECT * FROM posts ORDER BY created_at DESC LIMIT 100'
|
|
82
|
+
).all()
|
|
83
|
+
|
|
84
|
+
// ✅ Use batch() for multiple independent queries
|
|
85
|
+
const [user, posts, comments] = await env.DB.batch([
|
|
86
|
+
env.DB.prepare('SELECT * FROM users WHERE id = ?').bind(userId),
|
|
87
|
+
env.DB.prepare('SELECT * FROM posts WHERE user_id = ?').bind(userId),
|
|
88
|
+
env.DB.prepare('SELECT * FROM comments WHERE user_id = ?').bind(userId),
|
|
89
|
+
])
|
|
90
|
+
|
|
91
|
+
// ❌ Avoid N+1 queries
|
|
92
|
+
for (const post of posts) {
|
|
93
|
+
const author = await env.DB.prepare('SELECT * FROM users WHERE id = ?').bind(post.user_id).first() // Bad: multiple round trips
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ✅ Use JOINs instead
|
|
97
|
+
const postsWithAuthors = await env.DB.prepare(
|
|
98
|
+
`
|
|
99
|
+
SELECT posts.*, users.name as author_name
|
|
100
|
+
FROM posts
|
|
101
|
+
JOIN users ON posts.user_id = users.id
|
|
102
|
+
`
|
|
103
|
+
).all()
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Multi-Tenant SaaS
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
// Each tenant gets own database
|
|
110
|
+
export default {
|
|
111
|
+
async fetch(request: Request, env: { [key: `TENANT_${string}`]: D1Database }) {
|
|
112
|
+
const tenantId = request.headers.get('X-Tenant-ID')
|
|
113
|
+
const data = await env[`TENANT_${tenantId}`].prepare('SELECT * FROM records').all()
|
|
114
|
+
return Response.json(data.results)
|
|
115
|
+
},
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Session Storage
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
async function createSession(userId: number, token: string, env: Env) {
|
|
123
|
+
const expiresAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString()
|
|
124
|
+
return await env.DB.prepare('INSERT INTO sessions (user_id, token, expires_at) VALUES (?, ?, ?)')
|
|
125
|
+
.bind(userId, token, expiresAt)
|
|
126
|
+
.run()
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async function validateSession(token: string, env: Env) {
|
|
130
|
+
return await env.DB.prepare(
|
|
131
|
+
'SELECT s.*, u.email FROM sessions s JOIN users u ON s.user_id = u.id WHERE s.token = ? AND s.expires_at > CURRENT_TIMESTAMP'
|
|
132
|
+
)
|
|
133
|
+
.bind(token)
|
|
134
|
+
.first()
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Analytics/Events
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
async function logEvent(event: { type: string; userId?: number; metadata: object }, env: Env) {
|
|
142
|
+
return await env.DB.prepare('INSERT INTO events (type, user_id, metadata) VALUES (?, ?, ?)')
|
|
143
|
+
.bind(event.type, event.userId || null, JSON.stringify(event.metadata))
|
|
144
|
+
.run()
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
async function getEventStats(startDate: string, endDate: string, env: Env) {
|
|
148
|
+
return await env.DB.prepare(
|
|
149
|
+
'SELECT type, COUNT(*) as count FROM events WHERE timestamp BETWEEN ? AND ? GROUP BY type ORDER BY count DESC'
|
|
150
|
+
)
|
|
151
|
+
.bind(startDate, endDate)
|
|
152
|
+
.all()
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Read Replication Pattern (Paid Plans)
|
|
157
|
+
|
|
158
|
+
```typescript
|
|
159
|
+
interface Env {
|
|
160
|
+
DB: D1Database
|
|
161
|
+
DB_REPLICA: D1Database
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export default {
|
|
165
|
+
async fetch(request: Request, env: Env) {
|
|
166
|
+
if (request.method === 'GET') {
|
|
167
|
+
// Reads: use replica for lower latency
|
|
168
|
+
const users = await env.DB_REPLICA.prepare('SELECT * FROM users WHERE active = 1').all()
|
|
169
|
+
return Response.json(users.results)
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (request.method === 'POST') {
|
|
173
|
+
const { name, email } = await request.json()
|
|
174
|
+
const result = await env.DB.prepare('INSERT INTO users (name, email) VALUES (?, ?)')
|
|
175
|
+
.bind(name, email)
|
|
176
|
+
.run()
|
|
177
|
+
|
|
178
|
+
// Read-after-write: use primary for consistency (replication lag <100ms-2s)
|
|
179
|
+
const user = await env.DB.prepare('SELECT * FROM users WHERE id = ?')
|
|
180
|
+
.bind(result.meta.last_row_id)
|
|
181
|
+
.first()
|
|
182
|
+
return Response.json(user, { status: 201 })
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**Use replicas for**: Analytics dashboards, search results, public queries (eventual consistency OK)
|
|
189
|
+
**Use primary for**: Read-after-write, financial transactions, authentication (consistency required)
|
|
190
|
+
|
|
191
|
+
## Sessions API Pattern (Paid Plans)
|
|
192
|
+
|
|
193
|
+
```typescript
|
|
194
|
+
// Migration with long-running session (up to 15 min)
|
|
195
|
+
async function runMigration(env: Env) {
|
|
196
|
+
const session = env.DB.withSession({ timeout: 600 }) // 10 min
|
|
197
|
+
try {
|
|
198
|
+
await session.prepare('CREATE INDEX idx_users_email ON users(email)').run()
|
|
199
|
+
await session.prepare('CREATE INDEX idx_posts_user ON posts(user_id)').run()
|
|
200
|
+
await session.prepare('ANALYZE').run()
|
|
201
|
+
} finally {
|
|
202
|
+
session.close() // Always close to prevent leaks
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Bulk transformation with batching
|
|
207
|
+
async function transformLargeDataset(env: Env) {
|
|
208
|
+
const session = env.DB.withSession({ timeout: 900 }) // 15 min max
|
|
209
|
+
try {
|
|
210
|
+
const BATCH_SIZE = 1000
|
|
211
|
+
let offset = 0
|
|
212
|
+
while (true) {
|
|
213
|
+
const rows = await session
|
|
214
|
+
.prepare('SELECT id, data FROM legacy LIMIT ? OFFSET ?')
|
|
215
|
+
.bind(BATCH_SIZE, offset)
|
|
216
|
+
.all()
|
|
217
|
+
if (rows.results.length === 0) break
|
|
218
|
+
const updates = rows.results.map((row) =>
|
|
219
|
+
session
|
|
220
|
+
.prepare('UPDATE legacy SET new_data = ? WHERE id = ?')
|
|
221
|
+
.bind(transform(row.data), row.id)
|
|
222
|
+
)
|
|
223
|
+
await session.batch(updates)
|
|
224
|
+
offset += BATCH_SIZE
|
|
225
|
+
}
|
|
226
|
+
} finally {
|
|
227
|
+
session.close()
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Time Travel & Backups
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
wrangler d1 time-travel restore <db-name> --timestamp="2024-01-15T14:30:00Z" # Point-in-time
|
|
236
|
+
wrangler d1 time-travel info <db-name> # List restore points (7 days free, 30 days paid)
|
|
237
|
+
wrangler d1 export <db-name> --remote --output=./backup.sql # Full export
|
|
238
|
+
wrangler d1 export <db-name> --remote --no-schema --output=./data.sql # Data only
|
|
239
|
+
wrangler d1 execute <db-name> --remote --file=./backup.sql # Import
|
|
240
|
+
```
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Cloudflare DDoS Protection
|
|
2
|
+
|
|
3
|
+
Autonomous, always-on protection against DDoS attacks across L3/4 and L7.
|
|
4
|
+
|
|
5
|
+
## Protection Types
|
|
6
|
+
|
|
7
|
+
- **HTTP DDoS (L7)**: Protects HTTP/HTTPS traffic, phase `ddos_l7`, zone/account level
|
|
8
|
+
- **Network DDoS (L3/4)**: UDP/SYN/DNS floods, phase `ddos_l4`, account level only
|
|
9
|
+
- **Adaptive DDoS**: Learns 7-day baseline, detects deviations, 4 profile types (Origins, User-Agents, Locations, Protocols)
|
|
10
|
+
|
|
11
|
+
## Plan Availability
|
|
12
|
+
|
|
13
|
+
| Feature | Free | Pro | Business | Enterprise | Enterprise Advanced |
|
|
14
|
+
| ------------------- | ----- | ----- | -------- | ---------- | ------------------- |
|
|
15
|
+
| HTTP DDoS (L7) | ✓ | ✓ | ✓ | ✓ | ✓ |
|
|
16
|
+
| Network DDoS (L3/4) | ✓ | ✓ | ✓ | ✓ | ✓ |
|
|
17
|
+
| Override rules | 1 | 1 | 1 | 1 | 10 |
|
|
18
|
+
| Custom expressions | ✗ | ✗ | ✗ | ✗ | ✓ |
|
|
19
|
+
| Log action | ✗ | ✗ | ✗ | ✗ | ✓ |
|
|
20
|
+
| Adaptive DDoS | ✗ | ✗ | ✗ | ✓ | ✓ |
|
|
21
|
+
| Alert filters | Basic | Basic | Basic | Advanced | Advanced |
|
|
22
|
+
|
|
23
|
+
## Actions & Sensitivity
|
|
24
|
+
|
|
25
|
+
- **Actions**: `block`, `managed_challenge`, `challenge`, `log` (Enterprise Advanced only)
|
|
26
|
+
- **Sensitivity**: `default` (high), `medium`, `low`, `eoff` (essentially off)
|
|
27
|
+
- **Override**: By category/tag or individual rule ID
|
|
28
|
+
- **Scope**: Zone-level overrides take precedence over account-level
|
|
29
|
+
|
|
30
|
+
## Reading Order
|
|
31
|
+
|
|
32
|
+
| File | Purpose | Start Here If... |
|
|
33
|
+
| -------------------------------------- | --------------------------------------------------------- | ----------------------------------------------------------- |
|
|
34
|
+
| [configuration.md](./configuration.md) | Dashboard setup, rule structure, adaptive profiles | You're setting up DDoS protection for the first time |
|
|
35
|
+
| [api.md](./api.md) | API endpoints, SDK usage, ruleset ID discovery | You're automating configuration or need programmatic access |
|
|
36
|
+
| [patterns.md](./patterns.md) | Protection strategies, defense-in-depth, dynamic response | You need implementation patterns or layered security |
|
|
37
|
+
| [gotchas.md](./gotchas.md) | False positives, tuning, error handling | You're troubleshooting or optimizing existing protection |
|
|
38
|
+
|
|
39
|
+
## See Also
|
|
40
|
+
|
|
41
|
+
- [waf](../waf/) - Application-layer security rules
|
|
42
|
+
- [bot-management](../bot-management/) - Bot detection and mitigation
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# DDoS API
|
|
2
|
+
|
|
3
|
+
## Endpoints
|
|
4
|
+
|
|
5
|
+
### HTTP DDoS (L7)
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// Zone-level
|
|
9
|
+
PUT / zones / { zoneId } / rulesets / phases / ddos_l7 / entrypoint
|
|
10
|
+
GET / zones / { zoneId } / rulesets / phases / ddos_l7 / entrypoint
|
|
11
|
+
|
|
12
|
+
// Account-level (Enterprise Advanced)
|
|
13
|
+
PUT / accounts / { accountId } / rulesets / phases / ddos_l7 / entrypoint
|
|
14
|
+
GET / accounts / { accountId } / rulesets / phases / ddos_l7 / entrypoint
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Network DDoS (L3/4)
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
// Account-level only
|
|
21
|
+
PUT / accounts / { accountId } / rulesets / phases / ddos_l4 / entrypoint
|
|
22
|
+
GET / accounts / { accountId } / rulesets / phases / ddos_l4 / entrypoint
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## TypeScript SDK
|
|
26
|
+
|
|
27
|
+
**SDK Version**: Requires `cloudflare` >= 3.0.0 for ruleset phase methods.
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import Cloudflare from 'cloudflare'
|
|
31
|
+
|
|
32
|
+
const client = new Cloudflare({ apiToken: process.env.CLOUDFLARE_API_TOKEN })
|
|
33
|
+
|
|
34
|
+
// STEP 1: Discover managed ruleset ID (required for overrides)
|
|
35
|
+
const allRulesets = await client.rulesets.list({ zone_id: zoneId })
|
|
36
|
+
const ddosRuleset = allRulesets.result.find((r) => r.kind === 'managed' && r.phase === 'ddos_l7')
|
|
37
|
+
if (!ddosRuleset) throw new Error('DDoS managed ruleset not found')
|
|
38
|
+
const managedRulesetId = ddosRuleset.id
|
|
39
|
+
|
|
40
|
+
// STEP 2: Get current HTTP DDoS configuration
|
|
41
|
+
const entrypointRuleset = await client.zones.rulesets.phases.entrypoint.get('ddos_l7', {
|
|
42
|
+
zone_id: zoneId,
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
// STEP 3: Update HTTP DDoS ruleset with overrides
|
|
46
|
+
await client.zones.rulesets.phases.entrypoint.update('ddos_l7', {
|
|
47
|
+
zone_id: zoneId,
|
|
48
|
+
rules: [
|
|
49
|
+
{
|
|
50
|
+
action: 'execute',
|
|
51
|
+
expression: 'true',
|
|
52
|
+
action_parameters: {
|
|
53
|
+
id: managedRulesetId, // From discovery step
|
|
54
|
+
overrides: {
|
|
55
|
+
sensitivity_level: 'medium',
|
|
56
|
+
action: 'managed_challenge',
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
// Network DDoS (account level, L3/4)
|
|
64
|
+
const l4Rulesets = await client.rulesets.list({ account_id: accountId })
|
|
65
|
+
const l4DdosRuleset = l4Rulesets.result.find((r) => r.kind === 'managed' && r.phase === 'ddos_l4')
|
|
66
|
+
const l4Ruleset = await client.accounts.rulesets.phases.entrypoint.get('ddos_l4', {
|
|
67
|
+
account_id: accountId,
|
|
68
|
+
})
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Alert Configuration
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
interface DDoSAlertConfig {
|
|
75
|
+
name: string
|
|
76
|
+
enabled: boolean
|
|
77
|
+
alert_type:
|
|
78
|
+
| 'http_ddos_attack_alert'
|
|
79
|
+
| 'layer_3_4_ddos_attack_alert'
|
|
80
|
+
| 'advanced_http_ddos_attack_alert'
|
|
81
|
+
| 'advanced_layer_3_4_ddos_attack_alert'
|
|
82
|
+
filters?: {
|
|
83
|
+
zones?: string[]
|
|
84
|
+
hostnames?: string[]
|
|
85
|
+
requests_per_second?: number
|
|
86
|
+
packets_per_second?: number
|
|
87
|
+
megabits_per_second?: number
|
|
88
|
+
ip_prefixes?: string[] // CIDR
|
|
89
|
+
ip_addresses?: string[]
|
|
90
|
+
protocols?: string[]
|
|
91
|
+
}
|
|
92
|
+
mechanisms: {
|
|
93
|
+
email?: Array<{ id: string }>
|
|
94
|
+
webhooks?: Array<{ id: string }>
|
|
95
|
+
pagerduty?: Array<{ id: string }>
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Create alert
|
|
100
|
+
await fetch(`https://api.cloudflare.com/client/v4/accounts/${accountId}/alerting/v3/policies`, {
|
|
101
|
+
method: 'POST',
|
|
102
|
+
headers: {
|
|
103
|
+
Authorization: `Bearer ${apiToken}`,
|
|
104
|
+
'Content-Type': 'application/json',
|
|
105
|
+
},
|
|
106
|
+
body: JSON.stringify(alertConfig),
|
|
107
|
+
})
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Typed Override Examples
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
// Override by category
|
|
114
|
+
interface CategoryOverride {
|
|
115
|
+
action: 'execute'
|
|
116
|
+
expression: string
|
|
117
|
+
action_parameters: {
|
|
118
|
+
id: string
|
|
119
|
+
overrides: {
|
|
120
|
+
categories?: Array<{
|
|
121
|
+
category: 'http-flood' | 'http-anomaly' | 'udp-flood' | 'syn-flood'
|
|
122
|
+
sensitivity_level?: 'default' | 'medium' | 'low' | 'eoff'
|
|
123
|
+
action?: 'block' | 'managed_challenge' | 'challenge' | 'log'
|
|
124
|
+
}>
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Override by rule ID
|
|
130
|
+
interface RuleOverride {
|
|
131
|
+
action: 'execute'
|
|
132
|
+
expression: string
|
|
133
|
+
action_parameters: {
|
|
134
|
+
id: string
|
|
135
|
+
overrides: {
|
|
136
|
+
rules?: Array<{
|
|
137
|
+
id: string
|
|
138
|
+
action?: 'block' | 'managed_challenge' | 'challenge' | 'log'
|
|
139
|
+
sensitivity_level?: 'default' | 'medium' | 'low' | 'eoff'
|
|
140
|
+
}>
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Example: Override specific adaptive rule
|
|
146
|
+
const adaptiveOverride: RuleOverride = {
|
|
147
|
+
action: 'execute',
|
|
148
|
+
expression: 'true',
|
|
149
|
+
action_parameters: {
|
|
150
|
+
id: managedRulesetId,
|
|
151
|
+
overrides: {
|
|
152
|
+
rules: [{ id: '...adaptive-origins-rule-id...', sensitivity_level: 'low' }],
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
See [patterns.md](./patterns.md) for complete implementation patterns.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# DDoS Configuration
|
|
2
|
+
|
|
3
|
+
## Dashboard Setup
|
|
4
|
+
|
|
5
|
+
1. Navigate to Security > DDoS
|
|
6
|
+
2. Select HTTP DDoS or Network-layer DDoS
|
|
7
|
+
3. Configure sensitivity & action per ruleset/category/rule
|
|
8
|
+
4. Apply overrides with optional expressions (Enterprise Advanced)
|
|
9
|
+
5. Enable Adaptive DDoS toggle (Enterprise/Enterprise Advanced, requires 7 days traffic history)
|
|
10
|
+
|
|
11
|
+
## Rule Structure
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
interface DDoSOverride {
|
|
15
|
+
description: string
|
|
16
|
+
rules: Array<{
|
|
17
|
+
action: 'execute'
|
|
18
|
+
expression: string // Custom expression (Enterprise Advanced) or "true" for all
|
|
19
|
+
action_parameters: {
|
|
20
|
+
id: string // Managed ruleset ID (discover via api.md)
|
|
21
|
+
overrides: {
|
|
22
|
+
sensitivity_level?: 'default' | 'medium' | 'low' | 'eoff'
|
|
23
|
+
action?: 'block' | 'managed_challenge' | 'challenge' | 'log' // log = Enterprise Advanced only
|
|
24
|
+
categories?: Array<{
|
|
25
|
+
category: string // e.g., "http-flood", "udp-flood"
|
|
26
|
+
sensitivity_level?: string
|
|
27
|
+
}>
|
|
28
|
+
rules?: Array<{
|
|
29
|
+
id: string
|
|
30
|
+
action?: string
|
|
31
|
+
sensitivity_level?: string
|
|
32
|
+
}>
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}>
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Expression Availability
|
|
40
|
+
|
|
41
|
+
| Plan | Custom Expressions | Example |
|
|
42
|
+
| ------------------- | ------------------ | -------------------------------------------------------- |
|
|
43
|
+
| Free/Pro/Business | ✗ | Use `"true"` only |
|
|
44
|
+
| Enterprise | ✗ | Use `"true"` only |
|
|
45
|
+
| Enterprise Advanced | ✓ | `ip.src in {...}`, `http.request.uri.path matches "..."` |
|
|
46
|
+
|
|
47
|
+
## Sensitivity Mapping
|
|
48
|
+
|
|
49
|
+
| UI | API | Threshold |
|
|
50
|
+
| --------------- | --------- | ------------------ |
|
|
51
|
+
| High | `default` | Most aggressive |
|
|
52
|
+
| Medium | `medium` | Balanced |
|
|
53
|
+
| Low | `low` | Less aggressive |
|
|
54
|
+
| Essentially Off | `eoff` | Minimal mitigation |
|
|
55
|
+
|
|
56
|
+
## Common Categories
|
|
57
|
+
|
|
58
|
+
- `http-flood`, `http-anomaly` (L7)
|
|
59
|
+
- `udp-flood`, `syn-flood`, `dns-flood` (L3/4)
|
|
60
|
+
|
|
61
|
+
## Override Precedence
|
|
62
|
+
|
|
63
|
+
Multiple override layers apply in this order (higher precedence wins):
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
Zone-level > Account-level
|
|
67
|
+
Individual Rule > Category > Global sensitivity/action
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Example**: Zone rule for `/api/*` overrides account-level global settings.
|
|
71
|
+
|
|
72
|
+
## Adaptive DDoS Profiles
|
|
73
|
+
|
|
74
|
+
**Availability**: Enterprise, Enterprise Advanced
|
|
75
|
+
**Learning period**: 7 days of traffic history required
|
|
76
|
+
|
|
77
|
+
| Profile Type | Description | Detects |
|
|
78
|
+
| --------------- | ------------------------------------ | --------------------------------------- |
|
|
79
|
+
| **Origins** | Traffic patterns per origin server | Anomalous requests to specific origins |
|
|
80
|
+
| **User-Agents** | Traffic patterns per User-Agent | Malicious/anomalous user agent strings |
|
|
81
|
+
| **Locations** | Traffic patterns per geo-location | Attacks from specific countries/regions |
|
|
82
|
+
| **Protocols** | Traffic patterns per protocol (L3/4) | Protocol-specific flood attacks |
|
|
83
|
+
|
|
84
|
+
Configure by targeting specific adaptive rule IDs via API (see api.md#typed-override-examples).
|
|
85
|
+
|
|
86
|
+
## Alerting
|
|
87
|
+
|
|
88
|
+
Configure via Notifications:
|
|
89
|
+
|
|
90
|
+
- Alert types: `http_ddos_attack_alert`, `layer_3_4_ddos_attack_alert`, `advanced_*` variants
|
|
91
|
+
- Filters: zones, hostnames, RPS/PPS/Mbps thresholds, IPs, protocols
|
|
92
|
+
- Mechanisms: email, webhooks, PagerDuty
|
|
93
|
+
|
|
94
|
+
See [api.md](./api.md#alert-configuration) for API examples.
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# DDoS Gotchas
|
|
2
|
+
|
|
3
|
+
## Common Errors
|
|
4
|
+
|
|
5
|
+
### "False positives blocking legitimate traffic"
|
|
6
|
+
|
|
7
|
+
**Cause**: Sensitivity too high, wrong action, or missing exceptions
|
|
8
|
+
**Solution**:
|
|
9
|
+
|
|
10
|
+
1. Lower sensitivity for specific rule/category
|
|
11
|
+
2. Use `log` action first to validate (Enterprise Advanced)
|
|
12
|
+
3. Add exception with custom expression (e.g., allowlist IPs)
|
|
13
|
+
4. Query flagged requests via GraphQL Analytics API to identify patterns
|
|
14
|
+
|
|
15
|
+
### "Attacks getting through"
|
|
16
|
+
|
|
17
|
+
**Cause**: Sensitivity too low or wrong action
|
|
18
|
+
**Solution**: Increase to `default` sensitivity and use `block` action:
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
const config = {
|
|
22
|
+
rules: [
|
|
23
|
+
{
|
|
24
|
+
expression: 'true',
|
|
25
|
+
action: 'execute',
|
|
26
|
+
action_parameters: {
|
|
27
|
+
id: managedRulesetId,
|
|
28
|
+
overrides: { sensitivity_level: 'default', action: 'block' },
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### "Adaptive rules not working"
|
|
36
|
+
|
|
37
|
+
**Cause**: Insufficient traffic history (needs 7 days)
|
|
38
|
+
**Solution**: Wait for baseline to establish, check dashboard for adaptive rule status
|
|
39
|
+
|
|
40
|
+
### "Zone override ignored"
|
|
41
|
+
|
|
42
|
+
**Cause**: Account overrides conflict with zone overrides
|
|
43
|
+
**Solution**: Configure at zone level OR remove zone overrides to use account-level
|
|
44
|
+
|
|
45
|
+
### "Log action not available"
|
|
46
|
+
|
|
47
|
+
**Cause**: Not on Enterprise Advanced DDoS plan
|
|
48
|
+
**Solution**: Use `managed_challenge` with low sensitivity for testing
|
|
49
|
+
|
|
50
|
+
### "Rule limit exceeded"
|
|
51
|
+
|
|
52
|
+
**Cause**: Too many override rules (Free/Pro/Business: 1, Enterprise Advanced: 10)
|
|
53
|
+
**Solution**: Combine conditions in single expression using `and`/`or`
|
|
54
|
+
|
|
55
|
+
### "Cannot override rule"
|
|
56
|
+
|
|
57
|
+
**Cause**: Rule is read-only
|
|
58
|
+
**Solution**: Check API response for read-only indicator, use different rule
|
|
59
|
+
|
|
60
|
+
### "Cannot disable DDoS protection"
|
|
61
|
+
|
|
62
|
+
**Cause**: DDoS managed rulesets cannot be fully disabled (always-on protection)
|
|
63
|
+
**Solution**: Set `sensitivity_level: "eoff"` for minimal mitigation
|
|
64
|
+
|
|
65
|
+
### "Expression not allowed"
|
|
66
|
+
|
|
67
|
+
**Cause**: Custom expressions require Enterprise Advanced plan
|
|
68
|
+
**Solution**: Use `expression: "true"` for all traffic, or upgrade plan
|
|
69
|
+
|
|
70
|
+
### "Managed ruleset not found"
|
|
71
|
+
|
|
72
|
+
**Cause**: Zone/account doesn't have DDoS managed ruleset, or incorrect phase
|
|
73
|
+
**Solution**: Verify ruleset exists via `client.rulesets.list()`, check phase name (`ddos_l7` or `ddos_l4`)
|
|
74
|
+
|
|
75
|
+
## API Error Codes
|
|
76
|
+
|
|
77
|
+
| Error Code | Message | Cause | Solution |
|
|
78
|
+
| ---------- | ------------------------- | -------------------------------- | --------------------------------------------------- |
|
|
79
|
+
| 10000 | Authentication error | Invalid/missing API token | Check token has DDoS permissions |
|
|
80
|
+
| 81000 | Ruleset validation failed | Invalid rule structure | Verify `action_parameters.id` is managed ruleset ID |
|
|
81
|
+
| 81020 | Expression not allowed | Custom expressions on wrong plan | Use `"true"` or upgrade to Enterprise Advanced |
|
|
82
|
+
| 81021 | Rule limit exceeded | Too many override rules | Reduce rules or upgrade (Enterprise Advanced: 10) |
|
|
83
|
+
| 81022 | Invalid sensitivity level | Wrong sensitivity value | Use: `default`, `medium`, `low`, `eoff` |
|
|
84
|
+
| 81023 | Invalid action | Wrong action for plan | Enterprise Advanced only: `log` action |
|
|
85
|
+
|
|
86
|
+
## Limits
|
|
87
|
+
|
|
88
|
+
| Resource/Limit | Free/Pro/Business | Enterprise | Enterprise Advanced |
|
|
89
|
+
| ------------------------ | ----------------- | ---------- | ------------------- |
|
|
90
|
+
| Override rules per zone | 1 | 1 | 10 |
|
|
91
|
+
| Custom expressions | ✗ | ✗ | ✓ |
|
|
92
|
+
| Log action | ✗ | ✗ | ✓ |
|
|
93
|
+
| Adaptive DDoS | ✗ | ✓ | ✓ |
|
|
94
|
+
| Traffic history required | - | 7 days | 7 days |
|
|
95
|
+
|
|
96
|
+
## Tuning Strategy
|
|
97
|
+
|
|
98
|
+
1. Start with `log` action + `medium` sensitivity
|
|
99
|
+
2. Monitor for 24-48 hours
|
|
100
|
+
3. Identify false positives, add exceptions
|
|
101
|
+
4. Gradually increase to `default` sensitivity
|
|
102
|
+
5. Change action from `log` → `managed_challenge` → `block`
|
|
103
|
+
6. Document all adjustments
|
|
104
|
+
|
|
105
|
+
## Best Practices
|
|
106
|
+
|
|
107
|
+
- Test during low-traffic periods
|
|
108
|
+
- Use zone-level for per-site tuning
|
|
109
|
+
- Reference IP lists for easier management
|
|
110
|
+
- Set appropriate alert thresholds (avoid noise)
|
|
111
|
+
- Combine with WAF for layered defense
|
|
112
|
+
- Avoid over-tuning (keep config simple)
|
|
113
|
+
|
|
114
|
+
See [patterns.md](./patterns.md) for progressive rollout examples.
|