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,216 @@
|
|
|
1
|
+
# Configuration
|
|
2
|
+
|
|
3
|
+
## wrangler.jsonc
|
|
4
|
+
|
|
5
|
+
```jsonc
|
|
6
|
+
{
|
|
7
|
+
"name": "my-pages-project",
|
|
8
|
+
"pages_build_output_dir": "./dist",
|
|
9
|
+
"compatibility_date": "2026-01-01", // Use current date for new projects
|
|
10
|
+
"compatibility_flags": ["nodejs_compat"],
|
|
11
|
+
"placement": {
|
|
12
|
+
"mode": "smart", // Optional: Enable Smart Placement
|
|
13
|
+
},
|
|
14
|
+
"kv_namespaces": [{ "binding": "KV", "id": "abcd1234..." }],
|
|
15
|
+
"d1_databases": [
|
|
16
|
+
{ "binding": "DB", "database_id": "xxxx-xxxx", "database_name": "production-db" },
|
|
17
|
+
],
|
|
18
|
+
"r2_buckets": [{ "binding": "BUCKET", "bucket_name": "my-bucket" }],
|
|
19
|
+
"durable_objects": {
|
|
20
|
+
"bindings": [{ "name": "COUNTER", "class_name": "Counter", "script_name": "counter-worker" }],
|
|
21
|
+
},
|
|
22
|
+
"services": [{ "binding": "API", "service": "api-worker" }],
|
|
23
|
+
"queues": { "producers": [{ "binding": "QUEUE", "queue": "my-queue" }] },
|
|
24
|
+
"vectorize": [{ "binding": "VECTORIZE", "index_name": "my-index" }],
|
|
25
|
+
"ai": { "binding": "AI" },
|
|
26
|
+
"analytics_engine_datasets": [{ "binding": "ANALYTICS" }],
|
|
27
|
+
"vars": { "API_URL": "https://api.example.com", "ENVIRONMENT": "production" },
|
|
28
|
+
"env": {
|
|
29
|
+
"preview": {
|
|
30
|
+
"vars": { "API_URL": "https://staging-api.example.com" },
|
|
31
|
+
"kv_namespaces": [{ "binding": "KV", "id": "preview-namespace-id" }],
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Build Config
|
|
38
|
+
|
|
39
|
+
**Git deployment**: Dashboard → Project → Settings → Build settings
|
|
40
|
+
Set build command, output dir, env vars. Framework auto-detection configures automatically.
|
|
41
|
+
|
|
42
|
+
## Environment Variables
|
|
43
|
+
|
|
44
|
+
### Local (.dev.vars)
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# .dev.vars (never commit)
|
|
48
|
+
SECRET_KEY="local-secret-key"
|
|
49
|
+
API_TOKEN="dev-token-123"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Production
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
echo "secret-value" | npx wrangler pages secret put SECRET_KEY --project-name=my-project
|
|
56
|
+
npx wrangler pages secret list --project-name=my-project
|
|
57
|
+
npx wrangler pages secret delete SECRET_KEY --project-name=my-project
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Access: `env.SECRET_KEY`
|
|
61
|
+
|
|
62
|
+
## Static Config Files
|
|
63
|
+
|
|
64
|
+
### \_redirects
|
|
65
|
+
|
|
66
|
+
Place in build output (e.g., `dist/_redirects`):
|
|
67
|
+
|
|
68
|
+
```txt
|
|
69
|
+
/old-page /new-page 301 # 301 redirect
|
|
70
|
+
/blog/* /news/:splat 301 # Splat wildcard
|
|
71
|
+
/users/:id /members/:id 301 # Placeholders
|
|
72
|
+
/api/* /api-v2/:splat 200 # Proxy (no redirect)
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Limits**: 2,100 total (2,000 static + 100 dynamic), 1,000 char/line
|
|
76
|
+
**Note**: Functions take precedence
|
|
77
|
+
|
|
78
|
+
### \_headers
|
|
79
|
+
|
|
80
|
+
```txt
|
|
81
|
+
/secure/*
|
|
82
|
+
X-Frame-Options: DENY
|
|
83
|
+
X-Content-Type-Options: nosniff
|
|
84
|
+
|
|
85
|
+
/api/*
|
|
86
|
+
Access-Control-Allow-Origin: *
|
|
87
|
+
|
|
88
|
+
/static/*
|
|
89
|
+
Cache-Control: public, max-age=31536000, immutable
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Limits**: 100 rules, 2,000 char/line
|
|
93
|
+
**Note**: Only static assets; Functions set headers in Response
|
|
94
|
+
|
|
95
|
+
### \_routes.json
|
|
96
|
+
|
|
97
|
+
Controls which requests invoke Functions (auto-generated for most frameworks):
|
|
98
|
+
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"version": 1,
|
|
102
|
+
"include": ["/*"],
|
|
103
|
+
"exclude": ["/build/*", "/static/*", "/assets/*", "/*.{ico,png,jpg,css,js}"]
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Purpose**: Functions are metered; static requests are free. `exclude` takes precedence. Max 100 rules, 100 char/rule.
|
|
108
|
+
|
|
109
|
+
## TypeScript
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
npx wrangler types --path='./functions/types.d.ts'
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Point `types` in `functions/tsconfig.json` to generated file.
|
|
116
|
+
|
|
117
|
+
## Smart Placement
|
|
118
|
+
|
|
119
|
+
Automatically optimizes function execution location based on request patterns.
|
|
120
|
+
|
|
121
|
+
```jsonc
|
|
122
|
+
{
|
|
123
|
+
"placement": {
|
|
124
|
+
"mode": "smart", // Enable optimization (default: off)
|
|
125
|
+
},
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**How it works**: System analyzes traffic over hours/days and places function execution closer to:
|
|
130
|
+
|
|
131
|
+
- User clusters (e.g., regional traffic)
|
|
132
|
+
- Data sources (e.g., D1 database primary location)
|
|
133
|
+
|
|
134
|
+
**Benefits**:
|
|
135
|
+
|
|
136
|
+
- Lower latency for read-heavy apps with centralized databases
|
|
137
|
+
- Better performance for apps with regional traffic patterns
|
|
138
|
+
|
|
139
|
+
**Trade-offs**:
|
|
140
|
+
|
|
141
|
+
- Initial learning period: First requests may be slower while system optimizes
|
|
142
|
+
- Optimization time: Performance improves over 24-48 hours
|
|
143
|
+
|
|
144
|
+
**When to enable**: Global apps with D1/Durable Objects in specific regions, or apps with concentrated geographic traffic.
|
|
145
|
+
|
|
146
|
+
**When to skip**: Evenly distributed global traffic with no data locality constraints.
|
|
147
|
+
|
|
148
|
+
## Remote Bindings (Local Dev)
|
|
149
|
+
|
|
150
|
+
Connect local dev server to production bindings instead of local mocks:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# All bindings remote
|
|
154
|
+
npx wrangler pages dev ./dist --remote
|
|
155
|
+
|
|
156
|
+
# Specific bindings remote (others local)
|
|
157
|
+
npx wrangler pages dev ./dist --remote --kv=KV --d1=DB
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**Use cases**:
|
|
161
|
+
|
|
162
|
+
- Test against production data (read-only operations)
|
|
163
|
+
- Debug binding-specific behavior
|
|
164
|
+
- Validate changes before deployment
|
|
165
|
+
|
|
166
|
+
**⚠️ Warning**:
|
|
167
|
+
|
|
168
|
+
- Writes affect **real production data**
|
|
169
|
+
- Use only for read-heavy debugging or with non-production accounts
|
|
170
|
+
- Consider creating separate preview environments instead
|
|
171
|
+
|
|
172
|
+
**Requirements**: Must be logged in (`npx wrangler login`) with access to bindings.
|
|
173
|
+
|
|
174
|
+
## Local Dev
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
# Basic
|
|
178
|
+
npx wrangler pages dev ./dist
|
|
179
|
+
|
|
180
|
+
# With bindings
|
|
181
|
+
npx wrangler pages dev ./dist --kv KV --d1 DB=local-db-id
|
|
182
|
+
|
|
183
|
+
# Remote bindings (production data)
|
|
184
|
+
npx wrangler pages dev ./dist --remote
|
|
185
|
+
|
|
186
|
+
# Persistence
|
|
187
|
+
npx wrangler pages dev ./dist --persist-to=./.wrangler/state/v3
|
|
188
|
+
|
|
189
|
+
# Proxy mode (SSR frameworks)
|
|
190
|
+
npx wrangler pages dev -- npm run dev
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Limits (as of Jan 2026)
|
|
194
|
+
|
|
195
|
+
| Resource | Free | Paid |
|
|
196
|
+
| ---------------------- | ------------------------------- | ----------------------------- |
|
|
197
|
+
| **Functions Requests** | 100k/day | Unlimited (metered) |
|
|
198
|
+
| **Function CPU Time** | 10ms/req | 30ms/req (Workers Paid) |
|
|
199
|
+
| **Function Memory** | 128MB | 128MB |
|
|
200
|
+
| **Script Size** | 1MB compressed | 10MB compressed |
|
|
201
|
+
| **Deployments** | 500/month | 5,000/month |
|
|
202
|
+
| **Files per Deploy** | 20,000 | 20,000 |
|
|
203
|
+
| **File Size** | 25MB | 25MB |
|
|
204
|
+
| **Build Time** | 20min | 20min |
|
|
205
|
+
| **Redirects** | 2,100 (2k static + 100 dynamic) | Same |
|
|
206
|
+
| **Header Rules** | 100 | 100 |
|
|
207
|
+
| **Route Rules** | 100 | 100 |
|
|
208
|
+
| **Subrequests** | 50/request | 10,000/request (Workers Paid) |
|
|
209
|
+
|
|
210
|
+
**Notes**:
|
|
211
|
+
|
|
212
|
+
- Functions use Workers runtime; Workers Paid plan increases limits
|
|
213
|
+
- Free plan sufficient for most projects
|
|
214
|
+
- Static requests always free (not counted toward limits)
|
|
215
|
+
|
|
216
|
+
[Full limits](https://developers.cloudflare.com/pages/platform/limits/)
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# Gotchas
|
|
2
|
+
|
|
3
|
+
## Functions Not Running
|
|
4
|
+
|
|
5
|
+
**Problem**: Function endpoints return 404 or don't execute
|
|
6
|
+
**Causes**: `_routes.json` excludes path; wrong file extension (`.jsx`/`.tsx`); Functions dir not at output root
|
|
7
|
+
**Solution**: Check `_routes.json`, rename to `.ts`/`.js`, verify build output structure
|
|
8
|
+
|
|
9
|
+
## 404 on Static Assets
|
|
10
|
+
|
|
11
|
+
**Problem**: Static files not serving
|
|
12
|
+
**Causes**: Build output dir misconfigured; Functions catching requests; Advanced mode missing `env.ASSETS.fetch()`
|
|
13
|
+
**Solution**: Verify output dir, add exclusions to `_routes.json`, call `env.ASSETS.fetch()` in `_worker.js`
|
|
14
|
+
|
|
15
|
+
## Bindings Not Working
|
|
16
|
+
|
|
17
|
+
**Problem**: `env.BINDING` undefined or errors
|
|
18
|
+
**Causes**: wrangler.jsonc syntax error; wrong binding IDs; missing `.dev.vars`; out-of-sync types
|
|
19
|
+
**Solution**: Validate config, verify IDs, create `.dev.vars`, run `npx wrangler types`
|
|
20
|
+
|
|
21
|
+
## Build Failures
|
|
22
|
+
|
|
23
|
+
**Problem**: Deployment fails during build
|
|
24
|
+
**Causes**: Wrong build command/output dir; Node version incompatibility; missing env vars; 20min timeout; OOM
|
|
25
|
+
**Solution**: Check Dashboard → Deployments → Build log; verify settings; add `.nvmrc`; optimize build
|
|
26
|
+
|
|
27
|
+
## Middleware Not Running
|
|
28
|
+
|
|
29
|
+
**Problem**: Middleware doesn't execute
|
|
30
|
+
**Causes**: Wrong filename (not `_middleware.ts`); missing `onRequest` export; didn't call `next()`
|
|
31
|
+
**Solution**: Rename file with underscore prefix; export handler; call `next()` or return Response
|
|
32
|
+
|
|
33
|
+
## Headers/Redirects Not Working
|
|
34
|
+
|
|
35
|
+
**Problem**: `_headers` or `_redirects` not applying
|
|
36
|
+
**Causes**: Only work for static assets; Functions override; syntax errors; exceeded limits
|
|
37
|
+
**Solution**: Set headers in Response object for Functions; verify syntax; check limits (100 headers, 2,100 redirects)
|
|
38
|
+
|
|
39
|
+
## TypeScript Errors
|
|
40
|
+
|
|
41
|
+
**Problem**: Type errors in Functions code
|
|
42
|
+
**Causes**: Types not generated; Env interface doesn't match wrangler.jsonc
|
|
43
|
+
**Solution**: Run `npx wrangler types --path='./functions/types.d.ts'`; update Env interface
|
|
44
|
+
|
|
45
|
+
## Local Dev Issues
|
|
46
|
+
|
|
47
|
+
**Problem**: Dev server errors or bindings don't work
|
|
48
|
+
**Causes**: Port conflict; bindings not passed; local vs HTTPS differences
|
|
49
|
+
**Solution**: Use `--port=3000`; pass bindings via CLI or wrangler.jsonc; account for HTTP/HTTPS differences
|
|
50
|
+
|
|
51
|
+
## Performance Issues
|
|
52
|
+
|
|
53
|
+
**Problem**: Slow responses or CPU limit errors
|
|
54
|
+
**Causes**: Functions invoked for static assets; cold starts; 10ms CPU limit; large bundle
|
|
55
|
+
**Solution**: Exclude static via `_routes.json`; optimize hot paths; keep bundle < 1MB
|
|
56
|
+
|
|
57
|
+
## Framework-Specific
|
|
58
|
+
|
|
59
|
+
### ⚠️ Deprecated Frameworks
|
|
60
|
+
|
|
61
|
+
**Next.js**: Official adapter (`@cloudflare/next-on-pages`) **deprecated** and unmaintained.
|
|
62
|
+
|
|
63
|
+
- **Problem**: No updates since 2024; incompatible with Next.js 15+; missing App Router features
|
|
64
|
+
- **Cause**: Cloudflare discontinued official support; community fork exists but limited
|
|
65
|
+
- **Solutions**:
|
|
66
|
+
1. **Recommended**: Use Vercel (official Next.js host)
|
|
67
|
+
2. **Advanced**: Self-host on Workers using custom adapter (complex, unsupported)
|
|
68
|
+
3. **Migration**: Switch to SvelteKit/Nuxt (similar DX, full Pages support)
|
|
69
|
+
|
|
70
|
+
**Remix**: Official adapter (`@remix-run/cloudflare-pages`) **deprecated**.
|
|
71
|
+
|
|
72
|
+
- **Problem**: No maintenance from Remix team; compatibility issues with Remix v2+
|
|
73
|
+
- **Cause**: Remix team deprecated all framework adapters
|
|
74
|
+
- **Solutions**:
|
|
75
|
+
1. **Recommended**: Migrate to SvelteKit (similar file-based routing, better DX)
|
|
76
|
+
2. **Alternative**: Use Astro (static-first with optional SSR)
|
|
77
|
+
3. **Workaround**: Continue using deprecated adapter (no future support)
|
|
78
|
+
|
|
79
|
+
### ✅ Supported Frameworks
|
|
80
|
+
|
|
81
|
+
**SvelteKit**:
|
|
82
|
+
|
|
83
|
+
- Use `@sveltejs/adapter-cloudflare`
|
|
84
|
+
- Access bindings via `platform.env` in server load functions
|
|
85
|
+
- Set `platform: 'cloudflare'` in `svelte.config.js`
|
|
86
|
+
|
|
87
|
+
**Astro**:
|
|
88
|
+
|
|
89
|
+
- Built-in Cloudflare adapter
|
|
90
|
+
- Access bindings via `Astro.locals.runtime.env`
|
|
91
|
+
|
|
92
|
+
**Nuxt**:
|
|
93
|
+
|
|
94
|
+
- Set `nitro.preset: 'cloudflare-pages'` in `nuxt.config.ts`
|
|
95
|
+
- Access bindings via `event.context.cloudflare.env`
|
|
96
|
+
|
|
97
|
+
**Qwik, Solid Start**:
|
|
98
|
+
|
|
99
|
+
- Built-in or official Cloudflare adapters available
|
|
100
|
+
- Check respective framework docs for binding access
|
|
101
|
+
|
|
102
|
+
## Debugging
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
// Log request details
|
|
106
|
+
console.log('Request:', { method: request.method, url: request.url })
|
|
107
|
+
console.log('Env:', Object.keys(env))
|
|
108
|
+
console.log('Params:', params)
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**View logs**: `npx wrangler pages deployment tail --project-name=my-project`
|
|
112
|
+
|
|
113
|
+
## Smart Placement Issues
|
|
114
|
+
|
|
115
|
+
### Increased Cold Start Latency
|
|
116
|
+
|
|
117
|
+
**Problem**: First requests slower after enabling Smart Placement
|
|
118
|
+
**Cause**: Initial optimization period while system learns traffic patterns
|
|
119
|
+
**Solution**: Expected behavior during first 24-48 hours; monitor latency trends over time
|
|
120
|
+
|
|
121
|
+
### Inconsistent Response Times
|
|
122
|
+
|
|
123
|
+
**Problem**: Latency varies significantly across requests during initial deployment
|
|
124
|
+
**Cause**: Smart Placement testing different execution locations to find optimal placement
|
|
125
|
+
**Solution**: Normal during learning phase; stabilizes after traffic patterns emerge (1-2 days)
|
|
126
|
+
|
|
127
|
+
### No Performance Improvement
|
|
128
|
+
|
|
129
|
+
**Problem**: Smart Placement enabled but no latency reduction observed
|
|
130
|
+
**Cause**: Traffic evenly distributed globally, or no data locality constraints
|
|
131
|
+
**Solution**: Smart Placement most effective with centralized data (D1/DO) or regional traffic; disable if no benefit
|
|
132
|
+
|
|
133
|
+
## Remote Bindings Issues
|
|
134
|
+
|
|
135
|
+
### Accidentally Modified Production Data
|
|
136
|
+
|
|
137
|
+
**Problem**: Local dev with `--remote` altered production database/KV
|
|
138
|
+
**Cause**: Remote bindings connect directly to production resources; writes are real
|
|
139
|
+
**Solution**:
|
|
140
|
+
|
|
141
|
+
- Use `--remote` only for read-heavy debugging
|
|
142
|
+
- Create separate preview environments for testing
|
|
143
|
+
- Never use `--remote` for write operations during development
|
|
144
|
+
|
|
145
|
+
### Remote Binding Auth Errors
|
|
146
|
+
|
|
147
|
+
**Problem**: `npx wrangler pages dev --remote` fails with "Unauthorized" or auth error
|
|
148
|
+
**Cause**: Not logged in, session expired, or insufficient account permissions
|
|
149
|
+
**Solution**:
|
|
150
|
+
|
|
151
|
+
1. Run `npx wrangler login` to re-authenticate
|
|
152
|
+
2. Verify account has access to project and bindings
|
|
153
|
+
3. Check binding IDs match production configuration
|
|
154
|
+
|
|
155
|
+
### Slow Local Dev with Remote Bindings
|
|
156
|
+
|
|
157
|
+
**Problem**: Local dev server slow when using `--remote`
|
|
158
|
+
**Cause**: Every request makes network calls to production bindings
|
|
159
|
+
**Solution**: Use local bindings for development; reserve `--remote` for final validation
|
|
160
|
+
|
|
161
|
+
## Common Errors
|
|
162
|
+
|
|
163
|
+
### "Module not found"
|
|
164
|
+
|
|
165
|
+
**Cause**: Dependencies not bundled or build output incorrect
|
|
166
|
+
**Solution**: Check build output directory, ensure dependencies bundled
|
|
167
|
+
|
|
168
|
+
### "Binding not found"
|
|
169
|
+
|
|
170
|
+
**Cause**: Binding not configured or types out of sync
|
|
171
|
+
**Solution**: Verify wrangler.jsonc, run `npx wrangler types`
|
|
172
|
+
|
|
173
|
+
### "Request exceeded CPU limit"
|
|
174
|
+
|
|
175
|
+
**Cause**: Code execution too slow or heavy compute
|
|
176
|
+
**Solution**: Optimize hot paths, upgrade to Workers Paid
|
|
177
|
+
|
|
178
|
+
### "Script too large"
|
|
179
|
+
|
|
180
|
+
**Cause**: Bundle size exceeds limit
|
|
181
|
+
**Solution**: Tree-shake, use dynamic imports, code-split
|
|
182
|
+
|
|
183
|
+
### "Too many subrequests"
|
|
184
|
+
|
|
185
|
+
**Cause**: Exceeded 50 subrequest limit
|
|
186
|
+
**Solution**: Batch or reduce fetch calls
|
|
187
|
+
|
|
188
|
+
### "KV key not found"
|
|
189
|
+
|
|
190
|
+
**Cause**: Key doesn't exist or wrong namespace
|
|
191
|
+
**Solution**: Check namespace matches environment
|
|
192
|
+
|
|
193
|
+
### "D1 error"
|
|
194
|
+
|
|
195
|
+
**Cause**: Wrong database_id or missing migrations
|
|
196
|
+
**Solution**: Verify config, run `wrangler d1 migrations list`
|
|
197
|
+
|
|
198
|
+
## Limits Reference (Jan 2026)
|
|
199
|
+
|
|
200
|
+
| Resource | Free | Paid |
|
|
201
|
+
| ------------------ | --------- | ----------- |
|
|
202
|
+
| Functions Requests | 100k/day | Unlimited |
|
|
203
|
+
| CPU Time | 10ms/req | 30ms/req |
|
|
204
|
+
| Memory | 128MB | 128MB |
|
|
205
|
+
| Script Size | 1MB | 10MB |
|
|
206
|
+
| Subrequests | 50/req | 10,000/req |
|
|
207
|
+
| Deployments | 500/month | 5,000/month |
|
|
208
|
+
|
|
209
|
+
**Tip**: Hitting CPU limit? Optimize hot paths or upgrade to Workers Paid plan.
|
|
210
|
+
|
|
211
|
+
[Full limits](https://developers.cloudflare.com/pages/platform/limits/)
|
|
212
|
+
|
|
213
|
+
## Getting Help
|
|
214
|
+
|
|
215
|
+
1. Check [Pages Docs](https://developers.cloudflare.com/pages/)
|
|
216
|
+
2. Search [Discord #functions](https://discord.com/channels/595317990191398933/910978223968518144)
|
|
217
|
+
3. Review [Workers Examples](https://developers.cloudflare.com/workers/examples/)
|
|
218
|
+
4. Check framework-specific docs/adapters
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# Patterns
|
|
2
|
+
|
|
3
|
+
## API Routes
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
// functions/api/todos/[id].ts
|
|
7
|
+
export const onRequestGet: PagesFunction<Env> = async ({ env, params }) => {
|
|
8
|
+
const todo = await env.DB.prepare('SELECT * FROM todos WHERE id = ?').bind(params.id).first()
|
|
9
|
+
if (!todo) return new Response('Not found', { status: 404 })
|
|
10
|
+
return Response.json(todo)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const onRequestPut: PagesFunction<Env> = async ({ env, params, request }) => {
|
|
14
|
+
const body = await request.json()
|
|
15
|
+
await env.DB.prepare('UPDATE todos SET title = ?, completed = ? WHERE id = ?')
|
|
16
|
+
.bind(body.title, body.completed, params.id)
|
|
17
|
+
.run()
|
|
18
|
+
return Response.json({ success: true })
|
|
19
|
+
}
|
|
20
|
+
// Also: onRequestDelete, onRequestPost
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Auth Middleware
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
// functions/_middleware.ts
|
|
27
|
+
const auth: PagesFunction<Env> = async (context) => {
|
|
28
|
+
if (context.request.url.includes('/public/')) return context.next()
|
|
29
|
+
const authHeader = context.request.headers.get('Authorization')
|
|
30
|
+
if (!authHeader?.startsWith('Bearer ')) {
|
|
31
|
+
return new Response('Unauthorized', { status: 401 })
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
const payload = await verifyJWT(authHeader.substring(7), context.env.JWT_SECRET)
|
|
36
|
+
context.data.user = payload
|
|
37
|
+
return context.next()
|
|
38
|
+
} catch (err) {
|
|
39
|
+
return new Response('Invalid token', { status: 401 })
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export const onRequest = [auth]
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## CORS
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
// functions/api/_middleware.ts
|
|
49
|
+
const corsHeaders = {
|
|
50
|
+
'Access-Control-Allow-Origin': '*',
|
|
51
|
+
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
|
|
52
|
+
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export const onRequest: PagesFunction = async (context) => {
|
|
56
|
+
if (context.request.method === 'OPTIONS') {
|
|
57
|
+
return new Response(null, { headers: corsHeaders })
|
|
58
|
+
}
|
|
59
|
+
const response = await context.next()
|
|
60
|
+
Object.entries(corsHeaders).forEach(([k, v]) => response.headers.set(k, v))
|
|
61
|
+
return response
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Form Handling
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
// functions/api/contact.ts
|
|
69
|
+
export const onRequestPost: PagesFunction<Env> = async ({ request, env }) => {
|
|
70
|
+
const formData = await request.formData()
|
|
71
|
+
await env.QUEUE.send({ name: formData.get('name'), email: formData.get('email') })
|
|
72
|
+
return new Response('<h1>Thanks!</h1>', { headers: { 'Content-Type': 'text/html' } })
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Background Tasks
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
export const onRequestPost: PagesFunction = async ({ request, waitUntil }) => {
|
|
80
|
+
const data = await request.json()
|
|
81
|
+
waitUntil(
|
|
82
|
+
fetch('https://api.example.com/webhook', {
|
|
83
|
+
method: 'POST',
|
|
84
|
+
body: JSON.stringify(data),
|
|
85
|
+
})
|
|
86
|
+
)
|
|
87
|
+
return Response.json({ queued: true })
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Error Handling
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
// functions/_middleware.ts
|
|
95
|
+
const errorHandler: PagesFunction = async (context) => {
|
|
96
|
+
try {
|
|
97
|
+
return await context.next()
|
|
98
|
+
} catch (error) {
|
|
99
|
+
console.error('Error:', error)
|
|
100
|
+
if (context.request.url.includes('/api/')) {
|
|
101
|
+
return Response.json({ error: error.message }, { status: 500 })
|
|
102
|
+
}
|
|
103
|
+
return new Response(`<h1>Error</h1><p>${error.message}</p>`, {
|
|
104
|
+
status: 500,
|
|
105
|
+
headers: { 'Content-Type': 'text/html' },
|
|
106
|
+
})
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export const onRequest = [errorHandler]
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Caching
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
// functions/api/data.ts
|
|
116
|
+
export const onRequestGet: PagesFunction<Env> = async ({ env, request }) => {
|
|
117
|
+
const cacheKey = `data:${new URL(request.url).pathname}`
|
|
118
|
+
const cached = await env.KV.get(cacheKey, 'json')
|
|
119
|
+
if (cached) return Response.json(cached, { headers: { 'X-Cache': 'HIT' } })
|
|
120
|
+
|
|
121
|
+
const data = await env.DB.prepare('SELECT * FROM data').first()
|
|
122
|
+
await env.KV.put(cacheKey, JSON.stringify(data), { expirationTtl: 3600 })
|
|
123
|
+
return Response.json(data, { headers: { 'X-Cache': 'MISS' } })
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Smart Placement for Database Apps
|
|
128
|
+
|
|
129
|
+
Enable Smart Placement for apps with D1 or centralized data sources:
|
|
130
|
+
|
|
131
|
+
```jsonc
|
|
132
|
+
// wrangler.jsonc
|
|
133
|
+
{
|
|
134
|
+
"name": "global-app",
|
|
135
|
+
"placement": {
|
|
136
|
+
"mode": "smart",
|
|
137
|
+
},
|
|
138
|
+
"d1_databases": [
|
|
139
|
+
{
|
|
140
|
+
"binding": "DB",
|
|
141
|
+
"database_id": "your-db-id",
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
// functions/api/data.ts
|
|
149
|
+
export const onRequestGet: PagesFunction<Env> = async ({ env }) => {
|
|
150
|
+
// Smart Placement optimizes execution location over time
|
|
151
|
+
// Balances user location vs database location
|
|
152
|
+
const data = await env.DB.prepare('SELECT * FROM products LIMIT 10').all()
|
|
153
|
+
return Response.json(data)
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**Best for**: Read-heavy apps with D1/Durable Objects in specific regions.
|
|
158
|
+
**Not needed**: Apps without data locality constraints or with evenly distributed traffic.
|
|
159
|
+
|
|
160
|
+
## Framework Integration
|
|
161
|
+
|
|
162
|
+
**Supported** (2026): SvelteKit, Astro, Nuxt, Qwik, Solid Start
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
npm create cloudflare@latest my-app -- --framework=svelte
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### SvelteKit
|
|
169
|
+
|
|
170
|
+
```typescript
|
|
171
|
+
// src/routes/+page.server.ts
|
|
172
|
+
export const load = async ({ platform }) => {
|
|
173
|
+
const todos = await platform.env.DB.prepare('SELECT * FROM todos').all()
|
|
174
|
+
return { todos: todos.results }
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Astro
|
|
179
|
+
|
|
180
|
+
```astro
|
|
181
|
+
---
|
|
182
|
+
const { DB } = Astro.locals.runtime.env;
|
|
183
|
+
const todos = await DB.prepare('SELECT * FROM todos').all();
|
|
184
|
+
---
|
|
185
|
+
<ul>{todos.results.map(t => <li>{t.title}</li>)}</ul>
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Nuxt
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
// server/api/todos.get.ts
|
|
192
|
+
export default defineEventHandler(async (event) => {
|
|
193
|
+
const { DB } = event.context.cloudflare.env
|
|
194
|
+
return await DB.prepare('SELECT * FROM todos').all()
|
|
195
|
+
})
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**⚠️ Framework Status** (2026):
|
|
199
|
+
|
|
200
|
+
- ✅ **Supported**: SvelteKit, Astro, Nuxt, Qwik, Solid Start
|
|
201
|
+
- ❌ **Deprecated**: Next.js (`@cloudflare/next-on-pages`), Remix (`@remix-run/cloudflare-pages`)
|
|
202
|
+
|
|
203
|
+
For deprecated frameworks, see [gotchas.md](./gotchas.md#framework-specific) for migration options.
|
|
204
|
+
|
|
205
|
+
[Framework Guides](https://developers.cloudflare.com/pages/framework-guides/)
|
|
206
|
+
|
|
207
|
+
## Monorepo
|
|
208
|
+
|
|
209
|
+
Dashboard → Settings → Build → Root directory. Set to subproject (e.g., `apps/web`).
|
|
210
|
+
|
|
211
|
+
## Best Practices
|
|
212
|
+
|
|
213
|
+
**Performance**: Exclude static via `_routes.json`; cache with KV; keep bundle < 1MB
|
|
214
|
+
**Security**: Use secrets (not vars); validate inputs; rate limit with KV/DO
|
|
215
|
+
**Workflow**: Preview per branch; local dev with `wrangler pages dev`; instant rollbacks in Dashboard
|