memory-journal-mcp 7.7.1 → 8.0.1
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-ARLYSFSI.js → chunk-UHSO65A4.js} +4242 -6092
- package/dist/{chunk-6LPTBIB6.js → chunk-V3UTFQQK.js} +318 -4330
- 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 +6 -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,202 @@
|
|
|
1
|
+
# Smart Placement Configuration
|
|
2
|
+
|
|
3
|
+
## wrangler.jsonc Setup
|
|
4
|
+
|
|
5
|
+
```jsonc
|
|
6
|
+
{
|
|
7
|
+
"$schema": "./node_modules/wrangler/config-schema.json",
|
|
8
|
+
"placement": {
|
|
9
|
+
"mode": "smart",
|
|
10
|
+
},
|
|
11
|
+
}
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Placement Mode Values
|
|
15
|
+
|
|
16
|
+
| Mode | Behavior |
|
|
17
|
+
| ------------- | ------------------------------------------------------------------------- |
|
|
18
|
+
| `"smart"` | Enable Smart Placement - automatic optimization based on traffic analysis |
|
|
19
|
+
| `"off"` | Explicitly disable Smart Placement - always run at edge closest to user |
|
|
20
|
+
| Not specified | Default behavior - run at edge closest to user (same as `"off"`) |
|
|
21
|
+
|
|
22
|
+
**Note:** Smart Placement vs Explicit Placement are separate features. Smart Placement (`mode: "smart"`) uses automatic analysis. For manual placement control, see explicit placement options (`region`, `host`, `hostname` fields - not covered in this reference).
|
|
23
|
+
|
|
24
|
+
## Frontend + Backend Split Configuration
|
|
25
|
+
|
|
26
|
+
### Frontend Worker (No Smart Placement)
|
|
27
|
+
|
|
28
|
+
```jsonc
|
|
29
|
+
// frontend-worker/wrangler.jsonc
|
|
30
|
+
{
|
|
31
|
+
"name": "frontend",
|
|
32
|
+
"main": "frontend-worker.ts",
|
|
33
|
+
// No "placement" - runs at edge
|
|
34
|
+
"services": [
|
|
35
|
+
{
|
|
36
|
+
"binding": "BACKEND",
|
|
37
|
+
"service": "backend-api",
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Backend Worker (Smart Placement Enabled)
|
|
44
|
+
|
|
45
|
+
```jsonc
|
|
46
|
+
// backend-api/wrangler.jsonc
|
|
47
|
+
{
|
|
48
|
+
"name": "backend-api",
|
|
49
|
+
"main": "backend-worker.ts",
|
|
50
|
+
"placement": {
|
|
51
|
+
"mode": "smart",
|
|
52
|
+
},
|
|
53
|
+
"d1_databases": [
|
|
54
|
+
{
|
|
55
|
+
"binding": "DATABASE",
|
|
56
|
+
"database_id": "xxx",
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Requirements & Limitations
|
|
63
|
+
|
|
64
|
+
### Requirements
|
|
65
|
+
|
|
66
|
+
- **Wrangler version:** 2.20.0+
|
|
67
|
+
- **Analysis time:** Up to 15 minutes
|
|
68
|
+
- **Traffic requirements:** Consistent multi-location traffic
|
|
69
|
+
- **Workers plan:** All plans (Free, Paid, Enterprise)
|
|
70
|
+
|
|
71
|
+
### What Smart Placement Affects
|
|
72
|
+
|
|
73
|
+
**CRITICAL LIMITATION - Smart Placement ONLY Affects `fetch` Handlers:**
|
|
74
|
+
|
|
75
|
+
Smart Placement is fundamentally limited to Workers with default `fetch` handlers. This is a key architectural constraint.
|
|
76
|
+
|
|
77
|
+
- ✅ **Affects:** `fetch` event handlers ONLY (the default export's fetch method)
|
|
78
|
+
- ❌ **Does NOT affect:**
|
|
79
|
+
- RPC methods (Service Bindings with `WorkerEntrypoint` - see example below)
|
|
80
|
+
- Named entrypoints (exports other than `default`)
|
|
81
|
+
- Workers without `fetch` handlers
|
|
82
|
+
- Queue consumers, scheduled handlers, or other event types
|
|
83
|
+
|
|
84
|
+
**Example - Smart Placement ONLY affects `fetch`:**
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
// ✅ Smart Placement affects this:
|
|
88
|
+
export default {
|
|
89
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
90
|
+
// This runs close to backend when Smart Placement enabled
|
|
91
|
+
const data = await env.DATABASE.prepare('SELECT * FROM users').all()
|
|
92
|
+
return Response.json(data)
|
|
93
|
+
},
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ❌ Smart Placement DOES NOT affect these:
|
|
97
|
+
export class MyRPC extends WorkerEntrypoint {
|
|
98
|
+
async myMethod() {
|
|
99
|
+
// This ALWAYS runs at edge, Smart Placement has NO EFFECT
|
|
100
|
+
const data = await this.env.DATABASE.prepare('SELECT * FROM users').all()
|
|
101
|
+
return data
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export async function scheduled(event: ScheduledEvent, env: Env) {
|
|
106
|
+
// NOT affected by Smart Placement
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Consequence:** If your backend logic uses RPC methods (`WorkerEntrypoint`), Smart Placement cannot optimize those calls. You must use fetch-based patterns for Smart Placement to work.
|
|
111
|
+
|
|
112
|
+
**Solution:** Convert RPC methods to fetch endpoints, or use a wrapper Worker with `fetch` handler that calls your backend RPC (though this adds latency).
|
|
113
|
+
|
|
114
|
+
### Baseline Traffic
|
|
115
|
+
|
|
116
|
+
Smart Placement automatically routes 1% of requests WITHOUT optimization as baseline for performance comparison.
|
|
117
|
+
|
|
118
|
+
### Validation Rules
|
|
119
|
+
|
|
120
|
+
**Mutually exclusive fields:**
|
|
121
|
+
|
|
122
|
+
- `mode` cannot be used with explicit placement fields (`region`, `host`, `hostname`)
|
|
123
|
+
- Choose either Smart Placement OR explicit placement, not both
|
|
124
|
+
|
|
125
|
+
```jsonc
|
|
126
|
+
// ✅ Valid - Smart Placement
|
|
127
|
+
{ "placement": { "mode": "smart" } }
|
|
128
|
+
|
|
129
|
+
// ✅ Valid - Explicit Placement (different feature)
|
|
130
|
+
{ "placement": { "region": "us-east1" } }
|
|
131
|
+
|
|
132
|
+
// ❌ Invalid - Cannot combine
|
|
133
|
+
{ "placement": { "mode": "smart", "region": "us-east1" } }
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Dashboard Configuration
|
|
137
|
+
|
|
138
|
+
**Workers & Pages** → Select Worker → **Settings** → **General** → **Placement: Smart** → Wait 15min → Check **Metrics**
|
|
139
|
+
|
|
140
|
+
## TypeScript Types
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
interface Env {
|
|
144
|
+
BACKEND: Fetcher
|
|
145
|
+
DATABASE: D1Database
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export default {
|
|
149
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
150
|
+
const data = await env.DATABASE.prepare('SELECT * FROM table').all()
|
|
151
|
+
return Response.json(data)
|
|
152
|
+
},
|
|
153
|
+
} satisfies ExportedHandler<Env>
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Cloudflare Pages/Assets Warning
|
|
157
|
+
|
|
158
|
+
**CRITICAL PERFORMANCE ISSUE:** Enabling Smart Placement with `assets.run_worker_first = true` in Pages projects **severely degrades asset serving performance**. This is one of the most common misconfigurations.
|
|
159
|
+
|
|
160
|
+
**Why this is bad:**
|
|
161
|
+
|
|
162
|
+
- Smart Placement routes ALL requests (including static assets) away from edge to remote locations
|
|
163
|
+
- Static assets (HTML, CSS, JS, images) should ALWAYS be served from edge closest to user
|
|
164
|
+
- Result: 2-5x slower asset loading times, poor user experience
|
|
165
|
+
|
|
166
|
+
**Problem:** Smart Placement routes asset requests away from edge, but static assets should always be served from edge closest to user.
|
|
167
|
+
|
|
168
|
+
**Solutions (in order of preference):**
|
|
169
|
+
|
|
170
|
+
1. **Recommended:** Split into separate Workers (frontend at edge + backend with Smart Placement)
|
|
171
|
+
2. Set `"mode": "off"` to explicitly disable Smart Placement for Pages/Assets Workers
|
|
172
|
+
3. Use `assets.run_worker_first = false` (serves assets first, bypasses Worker for static content)
|
|
173
|
+
|
|
174
|
+
```jsonc
|
|
175
|
+
// ❌ BAD - Degrades asset performance by 2-5x
|
|
176
|
+
{
|
|
177
|
+
"name": "pages-app",
|
|
178
|
+
"placement": { "mode": "smart" },
|
|
179
|
+
"assets": { "run_worker_first": true }
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// ✅ GOOD - Frontend at edge, backend optimized
|
|
183
|
+
// frontend-worker/wrangler.jsonc
|
|
184
|
+
{
|
|
185
|
+
"name": "frontend",
|
|
186
|
+
"assets": { "run_worker_first": true }
|
|
187
|
+
// No placement - runs at edge
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// backend-worker/wrangler.jsonc
|
|
191
|
+
{
|
|
192
|
+
"name": "backend-api",
|
|
193
|
+
"placement": { "mode": "smart" },
|
|
194
|
+
"d1_databases": [{ "binding": "DB", "database_id": "xxx" }]
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**Key takeaway:** Never enable Smart Placement on Workers that serve static assets with `run_worker_first = true`.
|
|
199
|
+
|
|
200
|
+
## Local Development
|
|
201
|
+
|
|
202
|
+
Smart Placement does NOT work in `wrangler dev` (local only). Test by deploying: `wrangler deploy --env staging`
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# Smart Placement Gotchas
|
|
2
|
+
|
|
3
|
+
## Common Errors
|
|
4
|
+
|
|
5
|
+
### "INSUFFICIENT_INVOCATIONS"
|
|
6
|
+
|
|
7
|
+
**Cause:** Not enough traffic for Smart Placement to analyze
|
|
8
|
+
**Solution:**
|
|
9
|
+
|
|
10
|
+
- Ensure Worker receives consistent global traffic
|
|
11
|
+
- Wait longer (analysis takes up to 15 minutes)
|
|
12
|
+
- Send test traffic from multiple global locations
|
|
13
|
+
- Check Worker has fetch event handler
|
|
14
|
+
|
|
15
|
+
### "UNSUPPORTED_APPLICATION"
|
|
16
|
+
|
|
17
|
+
**Cause:** Smart Placement made Worker slower rather than faster
|
|
18
|
+
**Reasons:**
|
|
19
|
+
|
|
20
|
+
- Worker doesn't make backend calls (runs faster at edge)
|
|
21
|
+
- Backend calls are cached (network latency to user more important)
|
|
22
|
+
- Backend service has good global distribution
|
|
23
|
+
- Worker serves static assets or Pages content
|
|
24
|
+
|
|
25
|
+
**Solutions:**
|
|
26
|
+
|
|
27
|
+
- Disable Smart Placement: `{ "placement": { "mode": "off" } }`
|
|
28
|
+
- Review whether Worker actually benefits from Smart Placement
|
|
29
|
+
- Consider caching strategy to reduce backend calls
|
|
30
|
+
- For Pages/Assets Workers, use separate backend Worker with Smart Placement
|
|
31
|
+
|
|
32
|
+
### "No request duration metrics"
|
|
33
|
+
|
|
34
|
+
**Cause:** Smart Placement not enabled, insufficient time passed, insufficient traffic, or analysis incomplete
|
|
35
|
+
**Solution:**
|
|
36
|
+
|
|
37
|
+
- Ensure Smart Placement enabled in config
|
|
38
|
+
- Wait 15+ minutes after deployment
|
|
39
|
+
- Verify Worker has sufficient traffic
|
|
40
|
+
- Check `placement_status` is `SUCCESS`
|
|
41
|
+
|
|
42
|
+
### "cf-placement header missing"
|
|
43
|
+
|
|
44
|
+
**Cause:** Smart Placement not enabled, beta feature removed, or Worker not analyzed yet
|
|
45
|
+
**Solution:** Verify Smart Placement enabled, wait for analysis (15min), check if beta feature still available
|
|
46
|
+
|
|
47
|
+
## Pages/Assets + Smart Placement Performance Degradation
|
|
48
|
+
|
|
49
|
+
**Problem:** Static assets load 2-5x slower when Smart Placement enabled with `run_worker_first = true`.
|
|
50
|
+
|
|
51
|
+
**Cause:** Smart Placement routes ALL requests (including static assets like HTML, CSS, JS, images) to remote locations. Static content should ALWAYS be served from edge closest to user.
|
|
52
|
+
|
|
53
|
+
**Solution:** Split into separate Workers OR disable Smart Placement:
|
|
54
|
+
|
|
55
|
+
```jsonc
|
|
56
|
+
// ❌ BAD - Assets routed away from user
|
|
57
|
+
{
|
|
58
|
+
"name": "pages-app",
|
|
59
|
+
"placement": { "mode": "smart" },
|
|
60
|
+
"assets": { "run_worker_first": true }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ✅ GOOD - Assets at edge, API optimized
|
|
64
|
+
// frontend/wrangler.jsonc
|
|
65
|
+
{
|
|
66
|
+
"name": "frontend",
|
|
67
|
+
"assets": { "run_worker_first": true }
|
|
68
|
+
// No placement field - stays at edge
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// backend/wrangler.jsonc
|
|
72
|
+
{
|
|
73
|
+
"name": "backend-api",
|
|
74
|
+
"placement": { "mode": "smart" }
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
This is one of the most common and impactful Smart Placement misconfigurations.
|
|
79
|
+
|
|
80
|
+
## Monolithic Full-Stack Worker
|
|
81
|
+
|
|
82
|
+
**Problem:** Frontend and backend logic in single Worker with Smart Placement enabled.
|
|
83
|
+
|
|
84
|
+
**Cause:** Smart Placement optimizes for backend latency but increases user-facing response time.
|
|
85
|
+
|
|
86
|
+
**Solution:** Split into two Workers:
|
|
87
|
+
|
|
88
|
+
```jsonc
|
|
89
|
+
// frontend/wrangler.jsonc
|
|
90
|
+
{
|
|
91
|
+
"name": "frontend",
|
|
92
|
+
"placement": { "mode": "off" }, // Explicit: stay at edge
|
|
93
|
+
"services": [{ "binding": "BACKEND", "service": "backend-api" }]
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// backend/wrangler.jsonc
|
|
97
|
+
{
|
|
98
|
+
"name": "backend-api",
|
|
99
|
+
"placement": { "mode": "smart" },
|
|
100
|
+
"d1_databases": [{ "binding": "DB", "database_id": "xxx" }]
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Local Development Confusion
|
|
105
|
+
|
|
106
|
+
**Issue:** Smart Placement doesn't work in `wrangler dev`.
|
|
107
|
+
|
|
108
|
+
**Explanation:** Smart Placement only activates in production deployments, not local development.
|
|
109
|
+
|
|
110
|
+
**Solution:** Test Smart Placement in staging environment: `wrangler deploy --env staging`
|
|
111
|
+
|
|
112
|
+
## Baseline Traffic & Analysis Time
|
|
113
|
+
|
|
114
|
+
**Note:** Smart Placement routes 1% of requests WITHOUT optimization for comparison (expected).
|
|
115
|
+
|
|
116
|
+
**Analysis time:** Up to 15 minutes. During analysis, Worker runs at edge. Monitor `placement_status`.
|
|
117
|
+
|
|
118
|
+
## RPC Methods Not Affected (Critical Limitation)
|
|
119
|
+
|
|
120
|
+
**Problem:** Enabled Smart Placement on backend but RPC calls still slow.
|
|
121
|
+
|
|
122
|
+
**Cause:** Smart Placement ONLY affects `fetch` handlers. RPC methods (Service Bindings with `WorkerEntrypoint`) are NEVER affected.
|
|
123
|
+
|
|
124
|
+
**Why:** RPC bypasses `fetch` handler - Smart Placement can only route `fetch` requests.
|
|
125
|
+
|
|
126
|
+
**Solution:** Convert to fetch-based Service Bindings:
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
// ❌ RPC - Smart Placement has NO EFFECT
|
|
130
|
+
export class BackendRPC extends WorkerEntrypoint {
|
|
131
|
+
async getData() {
|
|
132
|
+
// ALWAYS runs at edge
|
|
133
|
+
return await this.env.DATABASE.prepare('SELECT * FROM table').all()
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// ✅ Fetch - Smart Placement WORKS
|
|
138
|
+
export default {
|
|
139
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
140
|
+
// Runs close to DATABASE when Smart Placement enabled
|
|
141
|
+
const data = await env.DATABASE.prepare('SELECT * FROM table').all()
|
|
142
|
+
return Response.json(data)
|
|
143
|
+
},
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Requirements
|
|
148
|
+
|
|
149
|
+
- **Wrangler 2.20.0+** required
|
|
150
|
+
- **Consistent multi-region traffic** needed for analysis
|
|
151
|
+
- **Only affects fetch handlers** - RPC methods and named entrypoints not affected
|
|
152
|
+
|
|
153
|
+
## Limits
|
|
154
|
+
|
|
155
|
+
| Resource/Limit | Value | Notes |
|
|
156
|
+
| -------------------- | ---------------- | --------------------------- |
|
|
157
|
+
| Analysis time | Up to 15 minutes | After enabling |
|
|
158
|
+
| Baseline traffic | 1% | Routed without optimization |
|
|
159
|
+
| Min Wrangler version | 2.20.0+ | Required |
|
|
160
|
+
| Traffic requirement | Multi-region | Consistent needed |
|
|
161
|
+
|
|
162
|
+
## Disabling Smart Placement
|
|
163
|
+
|
|
164
|
+
```jsonc
|
|
165
|
+
{ "placement": { "mode": "off" } } // Explicit disable
|
|
166
|
+
// OR remove "placement" field entirely (same effect)
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Both behaviors identical - Worker runs at edge closest to user.
|
|
170
|
+
|
|
171
|
+
## When NOT to Use Smart Placement
|
|
172
|
+
|
|
173
|
+
- Workers serving only static content or cached responses
|
|
174
|
+
- Workers without significant backend communication
|
|
175
|
+
- Pure edge logic (auth checks, redirects, simple transformations)
|
|
176
|
+
- Workers without fetch event handlers
|
|
177
|
+
- Pages/Assets Workers with `run_worker_first = true`
|
|
178
|
+
- Workers using RPC methods instead of fetch handlers
|
|
179
|
+
|
|
180
|
+
These scenarios won't benefit and may perform worse with Smart Placement.
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# Smart Placement Patterns
|
|
2
|
+
|
|
3
|
+
## Backend Worker with Database Access
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export default {
|
|
7
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
8
|
+
const user = await env.DATABASE.prepare('SELECT * FROM users WHERE id = ?').bind(userId).first()
|
|
9
|
+
const orders = await env.DATABASE.prepare('SELECT * FROM orders WHERE user_id = ?')
|
|
10
|
+
.bind(userId)
|
|
11
|
+
.all()
|
|
12
|
+
return Response.json({ user, orders })
|
|
13
|
+
},
|
|
14
|
+
}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
```jsonc
|
|
18
|
+
{
|
|
19
|
+
"placement": { "mode": "smart" },
|
|
20
|
+
"d1_databases": [{ "binding": "DATABASE", "database_id": "xxx" }],
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Frontend + Backend Split (Service Bindings)
|
|
25
|
+
|
|
26
|
+
**Frontend:** Runs at edge for fast user response
|
|
27
|
+
**Backend:** Smart Placement runs close to database
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
// Frontend Worker - routes requests to backend
|
|
31
|
+
interface Env {
|
|
32
|
+
BACKEND: Fetcher // Service Binding to backend Worker
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export default {
|
|
36
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
37
|
+
if (new URL(request.url).pathname.startsWith('/api/')) {
|
|
38
|
+
return env.BACKEND.fetch(request) // Forward to backend
|
|
39
|
+
}
|
|
40
|
+
return new Response('Frontend content')
|
|
41
|
+
},
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Backend Worker - database operations
|
|
45
|
+
interface BackendEnv {
|
|
46
|
+
DATABASE: D1Database
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export default {
|
|
50
|
+
async fetch(request: Request, env: BackendEnv): Promise<Response> {
|
|
51
|
+
const data = await env.DATABASE.prepare('SELECT * FROM table').all()
|
|
52
|
+
return Response.json(data)
|
|
53
|
+
},
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**CRITICAL:** Use fetch-based Service Bindings (shown above). If using RPC with `WorkerEntrypoint`, Smart Placement will NOT optimize those method calls - only `fetch` handlers are affected.
|
|
58
|
+
|
|
59
|
+
**RPC vs Fetch - CRITICAL:** Smart Placement ONLY works with fetch-based bindings, NOT RPC.
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
// ❌ RPC - Smart Placement has NO EFFECT on backend RPC methods
|
|
63
|
+
export class BackendRPC extends WorkerEntrypoint {
|
|
64
|
+
async getData() {
|
|
65
|
+
// ALWAYS runs at edge, Smart Placement ignored
|
|
66
|
+
return await this.env.DATABASE.prepare('SELECT * FROM table').all()
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// ✅ Fetch - Smart Placement WORKS
|
|
71
|
+
export default {
|
|
72
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
73
|
+
// Runs close to DATABASE when Smart Placement enabled
|
|
74
|
+
const data = await env.DATABASE.prepare('SELECT * FROM table').all()
|
|
75
|
+
return Response.json(data)
|
|
76
|
+
},
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## External API Integration
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
export default {
|
|
84
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
85
|
+
const apiUrl = 'https://api.partner.com'
|
|
86
|
+
const headers = { Authorization: `Bearer ${env.API_KEY}` }
|
|
87
|
+
|
|
88
|
+
const [profile, transactions] = await Promise.all([
|
|
89
|
+
fetch(`${apiUrl}/profile`, { headers }),
|
|
90
|
+
fetch(`${apiUrl}/transactions`, { headers }),
|
|
91
|
+
])
|
|
92
|
+
|
|
93
|
+
return Response.json({
|
|
94
|
+
profile: await profile.json(),
|
|
95
|
+
transactions: await transactions.json(),
|
|
96
|
+
})
|
|
97
|
+
},
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## SSR / API Gateway Pattern
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
// Frontend (edge) - auth/routing close to user
|
|
105
|
+
export default {
|
|
106
|
+
async fetch(request: Request, env: Env) {
|
|
107
|
+
if (!request.headers.get('Authorization')) {
|
|
108
|
+
return new Response('Unauthorized', { status: 401 })
|
|
109
|
+
}
|
|
110
|
+
const data = await env.BACKEND.fetch(request)
|
|
111
|
+
return new Response(renderPage(await data.json()), {
|
|
112
|
+
headers: { 'Content-Type': 'text/html' },
|
|
113
|
+
})
|
|
114
|
+
},
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Backend (Smart Placement) - DB operations close to data
|
|
118
|
+
export default {
|
|
119
|
+
async fetch(request: Request, env: Env) {
|
|
120
|
+
const data = await env.DATABASE.prepare('SELECT * FROM pages WHERE id = ?').bind(pageId).first()
|
|
121
|
+
return Response.json(data)
|
|
122
|
+
},
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Durable Objects with Smart Placement
|
|
127
|
+
|
|
128
|
+
**Key principle:** Smart Placement does NOT control WHERE Durable Objects run. DOs always run in their designated region (based on jurisdiction or smart location hints).
|
|
129
|
+
|
|
130
|
+
**What Smart Placement DOES affect:** The location of the coordinator Worker's `fetch` handler that makes calls to multiple DOs.
|
|
131
|
+
|
|
132
|
+
**Pattern:** Enable Smart Placement on coordinator Worker that aggregates data from multiple DOs:
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
// Worker with Smart Placement - aggregates data from multiple DOs
|
|
136
|
+
export default {
|
|
137
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
138
|
+
const userId = new URL(request.url).searchParams.get('user')
|
|
139
|
+
|
|
140
|
+
// Get DO stubs
|
|
141
|
+
const userDO = env.USER_DO.get(env.USER_DO.idFromName(userId))
|
|
142
|
+
const analyticsID = env.ANALYTICS_DO.idFromName(`analytics-${userId}`)
|
|
143
|
+
const analyticsDO = env.ANALYTICS_DO.get(analyticsID)
|
|
144
|
+
|
|
145
|
+
// Fetch from multiple DOs
|
|
146
|
+
const [userData, analyticsData] = await Promise.all([
|
|
147
|
+
userDO.fetch(new Request('https://do/profile')),
|
|
148
|
+
analyticsDO.fetch(new Request('https://do/stats')),
|
|
149
|
+
])
|
|
150
|
+
|
|
151
|
+
return Response.json({
|
|
152
|
+
user: await userData.json(),
|
|
153
|
+
analytics: await analyticsData.json(),
|
|
154
|
+
})
|
|
155
|
+
},
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
```jsonc
|
|
160
|
+
// wrangler.jsonc
|
|
161
|
+
{
|
|
162
|
+
"placement": { "mode": "smart" },
|
|
163
|
+
"durable_objects": {
|
|
164
|
+
"bindings": [
|
|
165
|
+
{ "name": "USER_DO", "class_name": "UserDO" },
|
|
166
|
+
{ "name": "ANALYTICS_DO", "class_name": "AnalyticsDO" },
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**When this helps:**
|
|
173
|
+
|
|
174
|
+
- Worker's `fetch` handler runs closer to DO regions, reducing network latency for multiple DO calls
|
|
175
|
+
- Most beneficial when DOs are geographically concentrated or in specific jurisdictions
|
|
176
|
+
- Helps when coordinator makes many sequential or parallel DO calls
|
|
177
|
+
|
|
178
|
+
**When this DOESN'T help:**
|
|
179
|
+
|
|
180
|
+
- DOs are globally distributed (no single optimal Worker location)
|
|
181
|
+
- Worker only calls a single DO
|
|
182
|
+
- DO calls are infrequent or cached
|
|
183
|
+
|
|
184
|
+
## Best Practices
|
|
185
|
+
|
|
186
|
+
- Split full-stack apps: frontend at edge, backend with Smart Placement
|
|
187
|
+
- Use fetch-based Service Bindings (not RPC)
|
|
188
|
+
- Enable for backend logic: APIs, data aggregation, DB operations
|
|
189
|
+
- Don't enable for: static content, edge logic, RPC methods, Pages with `run_worker_first`
|
|
190
|
+
- Wait 15+ min for analysis, verify `placement_status = SUCCESS`
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Cloudflare Snippets Skill Reference
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
Expert guidance for **Cloudflare Snippets ONLY** - a lightweight JavaScript-based edge logic platform for modifying HTTP requests and responses. Snippets run as part of the Ruleset Engine and are included at no additional cost on paid plans (Pro, Business, Enterprise).
|
|
6
|
+
|
|
7
|
+
## What Are Snippets?
|
|
8
|
+
|
|
9
|
+
Snippets are JavaScript functions executed at the edge as part of Cloudflare's Ruleset Engine. Key characteristics:
|
|
10
|
+
|
|
11
|
+
- **Execution time**: 5ms CPU limit per request
|
|
12
|
+
- **Size limit**: 32KB per snippet
|
|
13
|
+
- **Runtime**: V8 isolate (subset of Workers APIs)
|
|
14
|
+
- **Subrequests**: 2-5 fetch calls depending on plan
|
|
15
|
+
- **Cost**: Included with Pro/Business/Enterprise plans
|
|
16
|
+
|
|
17
|
+
## Snippets vs Workers Decision Matrix
|
|
18
|
+
|
|
19
|
+
| Factor | Choose Snippets If... | Choose Workers If... |
|
|
20
|
+
| ------------------ | ------------------------------------- | ----------------------------------------------- |
|
|
21
|
+
| **Complexity** | Simple request/response modifications | Complex business logic, routing, middleware |
|
|
22
|
+
| **Execution time** | <5ms sufficient | Need >5ms or variable time |
|
|
23
|
+
| **Subrequests** | 2-5 fetch calls sufficient | Need >5 subrequests or complex orchestration |
|
|
24
|
+
| **Code size** | <32KB sufficient | Need >32KB or npm dependencies |
|
|
25
|
+
| **Cost** | Want zero additional cost | Can afford $5/mo + usage |
|
|
26
|
+
| **APIs** | Need basic fetch, headers, URL | Need KV, D1, R2, Durable Objects, cron triggers |
|
|
27
|
+
| **Deployment** | Need rule-based triggers | Want custom routing logic |
|
|
28
|
+
|
|
29
|
+
**Rule of thumb**: Use Snippets for modifications, Workers for applications.
|
|
30
|
+
|
|
31
|
+
## Execution Model
|
|
32
|
+
|
|
33
|
+
1. Request arrives at Cloudflare edge
|
|
34
|
+
2. Ruleset Engine evaluates snippet rules (filter expressions)
|
|
35
|
+
3. If rule matches, snippet executes within 5ms limit
|
|
36
|
+
4. Modified request/response continues through pipeline
|
|
37
|
+
5. Response returned to client
|
|
38
|
+
|
|
39
|
+
Snippets execute synchronously in the request path - performance is critical.
|
|
40
|
+
|
|
41
|
+
## Reading Order
|
|
42
|
+
|
|
43
|
+
1. **[configuration.md](configuration.md)** - Start here: setup, deployment methods (Dashboard/API/Terraform)
|
|
44
|
+
2. **[api.md](api.md)** - Core APIs: Request, Response, headers, `request.cf` properties
|
|
45
|
+
3. **[patterns.md](patterns.md)** - Real-world examples: geo-routing, A/B tests, security headers
|
|
46
|
+
4. **[gotchas.md](gotchas.md)** - Troubleshooting: common errors, performance tips, API limitations
|
|
47
|
+
|
|
48
|
+
## In This Reference
|
|
49
|
+
|
|
50
|
+
- **[configuration.md](configuration.md)** - Setup, deployment, configuration
|
|
51
|
+
- **[api.md](api.md)** - API endpoints, methods, interfaces
|
|
52
|
+
- **[patterns.md](patterns.md)** - Common patterns, use cases, examples
|
|
53
|
+
- **[gotchas.md](gotchas.md)** - Troubleshooting, best practices, limitations
|
|
54
|
+
|
|
55
|
+
## Quick Start
|
|
56
|
+
|
|
57
|
+
```javascript
|
|
58
|
+
// Snippet: Add security headers
|
|
59
|
+
export default {
|
|
60
|
+
async fetch(request) {
|
|
61
|
+
const response = await fetch(request)
|
|
62
|
+
const newResponse = new Response(response.body, response)
|
|
63
|
+
newResponse.headers.set('X-Frame-Options', 'DENY')
|
|
64
|
+
newResponse.headers.set('X-Content-Type-Options', 'nosniff')
|
|
65
|
+
return newResponse
|
|
66
|
+
},
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Deploy via Dashboard (Rules → Snippets) or API/Terraform. See configuration.md for details.
|
|
71
|
+
|
|
72
|
+
## See Also
|
|
73
|
+
|
|
74
|
+
- [Cloudflare Docs](https://developers.cloudflare.com/rules/snippets/)
|