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,220 @@
|
|
|
1
|
+
# DDoS Protection Patterns
|
|
2
|
+
|
|
3
|
+
## Allowlist Trusted IPs
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
const config = {
|
|
7
|
+
description: 'Allowlist trusted IPs',
|
|
8
|
+
rules: [
|
|
9
|
+
{
|
|
10
|
+
expression: 'ip.src in { 203.0.113.0/24 192.0.2.1 }',
|
|
11
|
+
action: 'execute',
|
|
12
|
+
action_parameters: {
|
|
13
|
+
id: managedRulesetId,
|
|
14
|
+
overrides: { sensitivity_level: 'eoff' },
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
await client.accounts.rulesets.phases.entrypoint.update('ddos_l7', {
|
|
21
|
+
account_id: accountId,
|
|
22
|
+
...config,
|
|
23
|
+
})
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Route-specific Sensitivity
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
const config = {
|
|
30
|
+
description: 'Route-specific protection',
|
|
31
|
+
rules: [
|
|
32
|
+
{
|
|
33
|
+
expression: 'not http.request.uri.path matches "^/api/"',
|
|
34
|
+
action: 'execute',
|
|
35
|
+
action_parameters: {
|
|
36
|
+
id: managedRulesetId,
|
|
37
|
+
overrides: { sensitivity_level: 'default', action: 'block' },
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
expression: 'http.request.uri.path matches "^/api/"',
|
|
42
|
+
action: 'execute',
|
|
43
|
+
action_parameters: {
|
|
44
|
+
id: managedRulesetId,
|
|
45
|
+
overrides: { sensitivity_level: 'low', action: 'managed_challenge' },
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Progressive Enhancement
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
enum ProtectionLevel {
|
|
56
|
+
MONITORING = 'monitoring',
|
|
57
|
+
LOW = 'low',
|
|
58
|
+
MEDIUM = 'medium',
|
|
59
|
+
HIGH = 'high',
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const levelConfig = {
|
|
63
|
+
[ProtectionLevel.MONITORING]: { action: 'log', sensitivity: 'eoff' },
|
|
64
|
+
[ProtectionLevel.LOW]: { action: 'managed_challenge', sensitivity: 'low' },
|
|
65
|
+
[ProtectionLevel.MEDIUM]: { action: 'managed_challenge', sensitivity: 'medium' },
|
|
66
|
+
[ProtectionLevel.HIGH]: { action: 'block', sensitivity: 'default' },
|
|
67
|
+
} as const
|
|
68
|
+
|
|
69
|
+
async function setProtectionLevel(
|
|
70
|
+
zoneId: string,
|
|
71
|
+
level: ProtectionLevel,
|
|
72
|
+
rulesetId: string,
|
|
73
|
+
client: Cloudflare
|
|
74
|
+
) {
|
|
75
|
+
const settings = levelConfig[level]
|
|
76
|
+
return client.zones.rulesets.phases.entrypoint.update('ddos_l7', {
|
|
77
|
+
zone_id: zoneId,
|
|
78
|
+
rules: [
|
|
79
|
+
{
|
|
80
|
+
expression: 'true',
|
|
81
|
+
action: 'execute',
|
|
82
|
+
action_parameters: {
|
|
83
|
+
id: rulesetId,
|
|
84
|
+
overrides: { action: settings.action, sensitivity_level: settings.sensitivity },
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
})
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Dynamic Response to Attacks
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
interface Env {
|
|
96
|
+
CLOUDFLARE_API_TOKEN: string
|
|
97
|
+
ZONE_ID: string
|
|
98
|
+
KV: KVNamespace
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export default {
|
|
102
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
103
|
+
if (request.url.includes('/attack-detected')) {
|
|
104
|
+
const attackData = await request.json()
|
|
105
|
+
await env.KV.put(`attack:${Date.now()}`, JSON.stringify(attackData), { expirationTtl: 86400 })
|
|
106
|
+
const recentAttacks = await getRecentAttacks(env.KV)
|
|
107
|
+
if (recentAttacks.length > 5) {
|
|
108
|
+
await setProtectionLevel(env.ZONE_ID, ProtectionLevel.HIGH, managedRulesetId, client)
|
|
109
|
+
return new Response('Protection increased')
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return new Response('OK')
|
|
113
|
+
},
|
|
114
|
+
async scheduled(event: ScheduledEvent, env: Env): Promise<void> {
|
|
115
|
+
const recentAttacks = await getRecentAttacks(env.KV)
|
|
116
|
+
if (recentAttacks.length === 0)
|
|
117
|
+
await setProtectionLevel(env.ZONE_ID, ProtectionLevel.MEDIUM, managedRulesetId, client)
|
|
118
|
+
},
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Multi-rule Tiered Protection (Enterprise Advanced)
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
const config = {
|
|
126
|
+
description: 'Multi-tier DDoS protection',
|
|
127
|
+
rules: [
|
|
128
|
+
{
|
|
129
|
+
expression: 'not ip.src in $known_ips and not cf.bot_management.score gt 30',
|
|
130
|
+
action: 'execute',
|
|
131
|
+
action_parameters: {
|
|
132
|
+
id: managedRulesetId,
|
|
133
|
+
overrides: { sensitivity_level: 'default', action: 'block' },
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
expression: 'cf.bot_management.verified_bot',
|
|
138
|
+
action: 'execute',
|
|
139
|
+
action_parameters: {
|
|
140
|
+
id: managedRulesetId,
|
|
141
|
+
overrides: { sensitivity_level: 'medium', action: 'managed_challenge' },
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
expression: 'ip.src in $trusted_ips',
|
|
146
|
+
action: 'execute',
|
|
147
|
+
action_parameters: { id: managedRulesetId, overrides: { sensitivity_level: 'low' } },
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Defense in Depth
|
|
154
|
+
|
|
155
|
+
Layered security stack: DDoS + WAF + Rate Limiting + Bot Management.
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
// Layer 1: DDoS (volumetric attacks)
|
|
159
|
+
await client.zones.rulesets.phases.entrypoint.update('ddos_l7', {
|
|
160
|
+
zone_id: zoneId,
|
|
161
|
+
rules: [
|
|
162
|
+
{
|
|
163
|
+
expression: 'true',
|
|
164
|
+
action: 'execute',
|
|
165
|
+
action_parameters: { id: ddosRulesetId, overrides: { sensitivity_level: 'medium' } },
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
// Layer 2: WAF (exploit protection)
|
|
171
|
+
await client.zones.rulesets.phases.entrypoint.update('http_request_firewall_managed', {
|
|
172
|
+
zone_id: zoneId,
|
|
173
|
+
rules: [{ expression: 'true', action: 'execute', action_parameters: { id: wafRulesetId } }],
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
// Layer 3: Rate Limiting (abuse prevention)
|
|
177
|
+
await client.zones.rulesets.phases.entrypoint.update('http_ratelimit', {
|
|
178
|
+
zone_id: zoneId,
|
|
179
|
+
rules: [
|
|
180
|
+
{
|
|
181
|
+
expression: 'http.request.uri.path eq "/api/login"',
|
|
182
|
+
action: 'block',
|
|
183
|
+
ratelimit: { characteristics: ['ip.src'], period: 60, requests_per_period: 5 },
|
|
184
|
+
},
|
|
185
|
+
],
|
|
186
|
+
})
|
|
187
|
+
|
|
188
|
+
// Layer 4: Bot Management (automation detection)
|
|
189
|
+
await client.zones.rulesets.phases.entrypoint.update('http_request_sbfm', {
|
|
190
|
+
zone_id: zoneId,
|
|
191
|
+
rules: [{ expression: 'cf.bot_management.score lt 30', action: 'managed_challenge' }],
|
|
192
|
+
})
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## Cache Strategy for DDoS Mitigation
|
|
196
|
+
|
|
197
|
+
Exclude query strings from cache key to counter randomized query parameter attacks.
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
const cacheRule = {
|
|
201
|
+
expression: 'http.request.uri.path matches "^/api/"',
|
|
202
|
+
action: 'set_cache_settings',
|
|
203
|
+
action_parameters: {
|
|
204
|
+
cache: true,
|
|
205
|
+
cache_key: {
|
|
206
|
+
ignore_query_strings_order: true,
|
|
207
|
+
custom_key: { query_string: { exclude: { all: true } } },
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
await client.zones.rulesets.phases.entrypoint.update('http_request_cache_settings', {
|
|
213
|
+
zone_id: zoneId,
|
|
214
|
+
rules: [cacheRule],
|
|
215
|
+
})
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**Rationale**: Attackers randomize query strings (`?random=123456`) to bypass cache. Excluding query params ensures cache hits absorb attack traffic.
|
|
219
|
+
|
|
220
|
+
See [configuration.md](./configuration.md) for rule structure details.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
## Quick Decision Trees
|
|
2
|
+
|
|
3
|
+
### "I need to run code"
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
Need to run code?
|
|
7
|
+
├─ Serverless functions at the edge → workers/
|
|
8
|
+
├─ Full-stack web app with Git deploys → pages/
|
|
9
|
+
├─ Stateful coordination/real-time → durable-objects/
|
|
10
|
+
├─ Long-running multi-step jobs → workflows/
|
|
11
|
+
├─ Run containers → containers/
|
|
12
|
+
├─ Multi-tenant (customers deploy code) → workers-for-platforms/
|
|
13
|
+
├─ Scheduled tasks (cron) → cron-triggers/
|
|
14
|
+
├─ Lightweight edge logic (modify HTTP) → snippets/
|
|
15
|
+
├─ Process Worker execution events (logs/observability) → tail-workers/
|
|
16
|
+
└─ Optimize latency to backend infrastructure → smart-placement/
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### "I need to store data"
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
Need storage?
|
|
23
|
+
├─ Key-value (config, sessions, cache) → kv/
|
|
24
|
+
├─ Relational SQL → d1/ (SQLite) or hyperdrive/ (existing Postgres/MySQL)
|
|
25
|
+
├─ Object/file storage (S3-compatible) → r2/
|
|
26
|
+
├─ Message queue (async processing) → queues/
|
|
27
|
+
├─ Vector embeddings (AI/semantic search) → vectorize/
|
|
28
|
+
├─ Strongly-consistent per-entity state → durable-objects/ (DO storage)
|
|
29
|
+
├─ Secrets management → secrets-store/
|
|
30
|
+
├─ Streaming ETL to R2 → pipelines/
|
|
31
|
+
└─ Persistent cache (long-term retention) → cache-reserve/
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### "I need AI/ML"
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
Need AI?
|
|
38
|
+
├─ Run inference (LLMs, embeddings, images) → workers-ai/
|
|
39
|
+
├─ Vector database for RAG/search → vectorize/
|
|
40
|
+
├─ Build stateful AI agents → agents-sdk/
|
|
41
|
+
├─ Gateway for any AI provider (caching, routing) → ai-gateway/
|
|
42
|
+
└─ AI-powered search widget → ai-search/
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### "I need networking/connectivity"
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
Need networking?
|
|
49
|
+
├─ Expose local service to internet → tunnel/
|
|
50
|
+
├─ TCP/UDP proxy (non-HTTP) → spectrum/
|
|
51
|
+
├─ WebRTC TURN server → turn/
|
|
52
|
+
├─ Private network connectivity → network-interconnect/
|
|
53
|
+
├─ Optimize routing → argo-smart-routing/
|
|
54
|
+
├─ Optimize latency to backend (not user) → smart-placement/
|
|
55
|
+
└─ Real-time video/audio → realtimekit/ or realtime-sfu/
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### "I need security"
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
Need security?
|
|
62
|
+
├─ Web Application Firewall → waf/
|
|
63
|
+
├─ DDoS protection → ddos/
|
|
64
|
+
├─ Bot detection/management → bot-management/
|
|
65
|
+
├─ API protection → api-shield/
|
|
66
|
+
├─ CAPTCHA alternative → turnstile/
|
|
67
|
+
└─ Credential leak detection → waf/ (managed ruleset)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### "I need media/content"
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
Need media?
|
|
74
|
+
├─ Image optimization/transformation → images/
|
|
75
|
+
├─ Video streaming/encoding → stream/
|
|
76
|
+
├─ Browser automation/screenshots → browser-rendering/
|
|
77
|
+
└─ Third-party script management → zaraz/
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### "I need analytics/metrics data"
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
Need analytics?
|
|
84
|
+
├─ Query across all Cloudflare products (HTTP, Workers, DNS, etc.) → graphql-api/
|
|
85
|
+
├─ Custom high-cardinality metrics from Workers → analytics-engine/
|
|
86
|
+
├─ Client-side (RUM) performance data → web-analytics/
|
|
87
|
+
├─ Workers Logs and real-time debugging → observability/
|
|
88
|
+
└─ Raw logs (Logpush to external tools) → Cloudflare docs
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### "I need infrastructure-as-code"
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
Need IaC? → pulumi/ (Pulumi), terraform/ (Terraform), or api/ (REST API)
|
|
95
|
+
```
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Cloudflare Durable Objects Storage
|
|
2
|
+
|
|
3
|
+
Persistent storage API for Durable Objects with SQLite and KV backends, PITR, and automatic concurrency control.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
DO Storage provides:
|
|
8
|
+
|
|
9
|
+
- SQLite-backed (recommended) or KV-backed
|
|
10
|
+
- SQL API + synchronous/async KV APIs
|
|
11
|
+
- Automatic input/output gates (race-free)
|
|
12
|
+
- 30-day point-in-time recovery (PITR)
|
|
13
|
+
- Transactions and alarms
|
|
14
|
+
|
|
15
|
+
**Use cases:** Stateful coordination, real-time collaboration, counters, sessions, rate limiters
|
|
16
|
+
|
|
17
|
+
**Billing:** Charged by request, GB-month storage, and rowsRead/rowsWritten for SQL operations
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
export class Counter extends DurableObject {
|
|
23
|
+
sql: SqlStorage
|
|
24
|
+
|
|
25
|
+
constructor(ctx: DurableObjectState, env: Env) {
|
|
26
|
+
super(ctx, env)
|
|
27
|
+
this.sql = ctx.storage.sql
|
|
28
|
+
this.sql.exec('CREATE TABLE IF NOT EXISTS data(key TEXT PRIMARY KEY, value INTEGER)')
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async increment(): Promise<number> {
|
|
32
|
+
const result = this.sql
|
|
33
|
+
.exec(
|
|
34
|
+
'INSERT INTO data VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = value + 1 RETURNING value',
|
|
35
|
+
'counter',
|
|
36
|
+
1
|
|
37
|
+
)
|
|
38
|
+
.one()
|
|
39
|
+
return result?.value || 1
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Storage Backends
|
|
45
|
+
|
|
46
|
+
| Backend | Create Method | APIs | PITR |
|
|
47
|
+
| -------------------- | -------------------- | ------------------------ | ---- |
|
|
48
|
+
| SQLite (recommended) | `new_sqlite_classes` | SQL + sync KV + async KV | ✅ |
|
|
49
|
+
| KV (legacy) | `new_classes` | async KV only | ❌ |
|
|
50
|
+
|
|
51
|
+
## Core APIs
|
|
52
|
+
|
|
53
|
+
- **SQL API** (`ctx.storage.sql`): Full SQLite with extensions (FTS5, JSON, math)
|
|
54
|
+
- **Sync KV** (`ctx.storage.kv`): Synchronous key-value (SQLite only)
|
|
55
|
+
- **Async KV** (`ctx.storage`): Asynchronous key-value (both backends)
|
|
56
|
+
- **Transactions** (`transactionSync()`, `transaction()`)
|
|
57
|
+
- **PITR** (`getBookmarkForTime()`, `onNextSessionRestoreBookmark()`)
|
|
58
|
+
- **Alarms** (`setAlarm()`, `alarm()` handler)
|
|
59
|
+
|
|
60
|
+
## Reading Order
|
|
61
|
+
|
|
62
|
+
**New to DO storage:** configuration.md → api.md → patterns.md → gotchas.md
|
|
63
|
+
**Building features:** patterns.md → api.md → gotchas.md
|
|
64
|
+
**Debugging issues:** gotchas.md → api.md
|
|
65
|
+
**Writing tests:** testing.md
|
|
66
|
+
|
|
67
|
+
## In This Reference
|
|
68
|
+
|
|
69
|
+
- [configuration.md](./configuration.md) - wrangler.jsonc migrations, SQLite vs KV setup, RPC binding
|
|
70
|
+
- [api.md](./api.md) - SQL exec/cursors, KV methods, storage options, transactions, alarms, PITR
|
|
71
|
+
- [patterns.md](./patterns.md) - Schema migrations, caching, rate limiting, batch processing, parent-child coordination
|
|
72
|
+
- [gotchas.md](./gotchas.md) - Concurrency gates, INTEGER precision, transaction rules, SQL limits
|
|
73
|
+
- [testing.md](./testing.md) - vitest-pool-workers setup, testing DOs with SQL/alarms/PITR
|
|
74
|
+
|
|
75
|
+
## See Also
|
|
76
|
+
|
|
77
|
+
- [durable-objects](../durable-objects/) - DO fundamentals and coordination patterns
|
|
78
|
+
- [workers](../workers/) - Worker runtime for DO stubs
|
|
79
|
+
- [d1](../d1/) - Shared database alternative to per-DO storage
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# DO Storage API Reference
|
|
2
|
+
|
|
3
|
+
## SQL API
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
const cursor = this.sql.exec('SELECT * FROM users WHERE email = ?', email)
|
|
7
|
+
for (let row of cursor) {
|
|
8
|
+
} // Objects: { id, name, email }
|
|
9
|
+
cursor.toArray()
|
|
10
|
+
cursor.one() // Single row (throws if != 1)
|
|
11
|
+
for (let row of cursor.raw()) {
|
|
12
|
+
} // Arrays: [1, "Alice", "..."]
|
|
13
|
+
|
|
14
|
+
// Manual iteration
|
|
15
|
+
const iter = cursor[Symbol.iterator]()
|
|
16
|
+
const first = iter.next() // { value: {...}, done: false }
|
|
17
|
+
|
|
18
|
+
cursor.columnNames // ["id", "name", "email"]
|
|
19
|
+
cursor.rowsRead
|
|
20
|
+
cursor.rowsWritten // Billing
|
|
21
|
+
|
|
22
|
+
type User = { id: number; name: string; email: string }
|
|
23
|
+
const user = this.sql.exec<User>('...', userId).one()
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Sync KV API (SQLite only)
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
this.ctx.storage.kv.get('counter') // undefined if missing
|
|
30
|
+
this.ctx.storage.kv.put('counter', 42)
|
|
31
|
+
this.ctx.storage.kv.put('user', { name: 'Alice', age: 30 })
|
|
32
|
+
this.ctx.storage.kv.delete('counter') // true if existed
|
|
33
|
+
|
|
34
|
+
for (let [key, value] of this.ctx.storage.kv.list()) {
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// List options: start, prefix, reverse, limit
|
|
38
|
+
this.ctx.storage.kv.list({ start: 'user:', prefix: 'user:', reverse: true, limit: 100 })
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Async KV API (Both backends)
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
await this.ctx.storage.get('key') // Single
|
|
45
|
+
await this.ctx.storage.get(['key1', 'key2']) // Multiple (max 128)
|
|
46
|
+
await this.ctx.storage.put('key', value) // Single
|
|
47
|
+
await this.ctx.storage.put({ key1: 'v1', key2: { nested: true } }) // Multiple (max 128)
|
|
48
|
+
await this.ctx.storage.delete('key')
|
|
49
|
+
await this.ctx.storage.delete(['key1', 'key2'])
|
|
50
|
+
await this.ctx.storage.list({ prefix: 'user:', limit: 100 })
|
|
51
|
+
|
|
52
|
+
// Options: allowConcurrency, noCache, allowUnconfirmed
|
|
53
|
+
await this.ctx.storage.get('key', { allowConcurrency: true, noCache: true })
|
|
54
|
+
await this.ctx.storage.put('key', value, { allowUnconfirmed: true, noCache: true })
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Storage Options
|
|
58
|
+
|
|
59
|
+
| Option | Methods | Effect | Use Case |
|
|
60
|
+
| ------------------ | -------------- | ------------------------------------------------------------- | ---------------------------------------------------------------- |
|
|
61
|
+
| `allowConcurrency` | get, list | Skip input gate; allow concurrent requests during read | Read-heavy metrics that don't need strict consistency |
|
|
62
|
+
| `noCache` | get, put, list | Skip in-memory cache; always read from disk | Rarely-accessed data or testing storage directly |
|
|
63
|
+
| `allowUnconfirmed` | put, delete | Return before write confirms (still protected by output gate) | Non-critical writes where latency matters more than confirmation |
|
|
64
|
+
|
|
65
|
+
## Transactions
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
// Sync (SQL/sync KV only)
|
|
69
|
+
this.ctx.storage.transactionSync(() => {
|
|
70
|
+
this.sql.exec('UPDATE accounts SET balance = balance - ? WHERE id = ?', 100, 1)
|
|
71
|
+
this.sql.exec('UPDATE accounts SET balance = balance + ? WHERE id = ?', 100, 2)
|
|
72
|
+
return 'result'
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
// Async
|
|
76
|
+
await this.ctx.storage.transaction(async () => {
|
|
77
|
+
const value = await this.ctx.storage.get('counter')
|
|
78
|
+
await this.ctx.storage.put('counter', value + 1)
|
|
79
|
+
if (value > 100) this.ctx.storage.rollback() // Explicit rollback
|
|
80
|
+
})
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Point-in-Time Recovery
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
await this.ctx.storage.getCurrentBookmark()
|
|
87
|
+
await this.ctx.storage.getBookmarkForTime(Date.now() - 2 * 24 * 60 * 60 * 1000)
|
|
88
|
+
await this.ctx.storage.onNextSessionRestoreBookmark(bookmark)
|
|
89
|
+
this.ctx.abort() // Restart to apply; bookmarks lexically comparable (earlier < later)
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Alarms
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
await this.ctx.storage.setAlarm(Date.now() + 60000); // Timestamp or Date
|
|
96
|
+
await this.ctx.storage.getAlarm();
|
|
97
|
+
await this.ctx.storage.deleteAlarm();
|
|
98
|
+
|
|
99
|
+
async alarm() { await this.doScheduledWork(); }
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Misc
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
await this.ctx.storage.deleteAll() // Atomic for SQLite; alarm NOT included
|
|
106
|
+
this.ctx.storage.sql.databaseSize // Bytes
|
|
107
|
+
```
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# DO Storage Configuration
|
|
2
|
+
|
|
3
|
+
## SQLite-backed (Recommended)
|
|
4
|
+
|
|
5
|
+
**wrangler.jsonc:**
|
|
6
|
+
|
|
7
|
+
```jsonc
|
|
8
|
+
{
|
|
9
|
+
"migrations": [
|
|
10
|
+
{
|
|
11
|
+
"tag": "v1",
|
|
12
|
+
"new_sqlite_classes": ["Counter", "Session", "RateLimiter"],
|
|
13
|
+
},
|
|
14
|
+
],
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Migration lifecycle:** Migrations run once per deployment. Existing DO instances get new storage backend on next invocation. Renaming/removing classes requires `renamed_classes` or `deleted_classes` entries.
|
|
19
|
+
|
|
20
|
+
## KV-backed (Legacy)
|
|
21
|
+
|
|
22
|
+
**wrangler.jsonc:**
|
|
23
|
+
|
|
24
|
+
```jsonc
|
|
25
|
+
{
|
|
26
|
+
"migrations": [
|
|
27
|
+
{
|
|
28
|
+
"tag": "v1",
|
|
29
|
+
"new_classes": ["OldCounter"],
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## TypeScript Setup
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
export class MyDurableObject extends DurableObject {
|
|
39
|
+
sql: SqlStorage
|
|
40
|
+
|
|
41
|
+
constructor(ctx: DurableObjectState, env: Env) {
|
|
42
|
+
super(ctx, env)
|
|
43
|
+
this.sql = ctx.storage.sql
|
|
44
|
+
|
|
45
|
+
// Initialize schema
|
|
46
|
+
this.sql.exec(`
|
|
47
|
+
CREATE TABLE IF NOT EXISTS users(
|
|
48
|
+
id INTEGER PRIMARY KEY,
|
|
49
|
+
name TEXT NOT NULL,
|
|
50
|
+
email TEXT UNIQUE
|
|
51
|
+
);
|
|
52
|
+
`)
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Binding
|
|
57
|
+
interface Env {
|
|
58
|
+
MY_DO: DurableObjectNamespace
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export default {
|
|
62
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
63
|
+
const id = env.MY_DO.idFromName('singleton')
|
|
64
|
+
const stub = env.MY_DO.get(id)
|
|
65
|
+
|
|
66
|
+
// Modern RPC: call methods directly (recommended)
|
|
67
|
+
const result = await stub.someMethod()
|
|
68
|
+
return Response.json(result)
|
|
69
|
+
|
|
70
|
+
// Legacy: forward request (still works)
|
|
71
|
+
// return stub.fetch(request);
|
|
72
|
+
},
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## CPU Limits
|
|
77
|
+
|
|
78
|
+
```jsonc
|
|
79
|
+
{
|
|
80
|
+
"limits": {
|
|
81
|
+
"cpu_ms": 300000, // 5 minutes (default 30s)
|
|
82
|
+
},
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Location Control
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
// Jurisdiction (GDPR/FedRAMP)
|
|
90
|
+
const euNamespace = env.MY_DO.jurisdiction('eu')
|
|
91
|
+
const id = euNamespace.newUniqueId()
|
|
92
|
+
const stub = euNamespace.get(id)
|
|
93
|
+
|
|
94
|
+
// Location hint (best effort)
|
|
95
|
+
const stub = env.MY_DO.get(id, { locationHint: 'enam' })
|
|
96
|
+
// Hints: wnam, enam, sam, weur, eeur, apac, oc, afr, me
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Initialization
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
export class Counter extends DurableObject {
|
|
103
|
+
value: number
|
|
104
|
+
|
|
105
|
+
constructor(ctx: DurableObjectState, env: Env) {
|
|
106
|
+
super(ctx, env)
|
|
107
|
+
|
|
108
|
+
// Block concurrent requests during init
|
|
109
|
+
ctx.blockConcurrencyWhile(async () => {
|
|
110
|
+
this.value = (await ctx.storage.get('value')) || 0
|
|
111
|
+
})
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
```
|