opencodekit 0.15.3 → 0.15.5
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/dist/index.js +1 -1
- package/dist/template/.opencode/AGENTS.md +209 -77
- package/dist/template/.opencode/agent/plan.md +4 -0
- package/dist/template/.opencode/command/cloudflare.md +70 -0
- package/dist/template/.opencode/package.json +1 -1
- package/dist/template/.opencode/skill/cloudflare/SKILL.md +233 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/README.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/api.md +100 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/configuration.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/gotchas.md +59 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/patterns.md +89 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-gateway/README.md +695 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/api.md +38 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/configuration.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/gotchas.md +41 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/patterns.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/api.md +27 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/configuration.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/gotchas.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/patterns.md +36 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/README.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/api.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/configuration.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/gotchas.md +28 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/patterns.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/README.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/api.md +78 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/configuration.md +128 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/gotchas.md +51 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/patterns.md +145 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/api.md +50 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/configuration.md +53 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/gotchas.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/patterns.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/configuration.md +58 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/gotchas.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/patterns.md +37 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/README.md +71 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/api.md +168 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/configuration.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/gotchas.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/patterns.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/api.md +54 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/configuration.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/gotchas.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/patterns.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/c3/README.md +264 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/README.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/api.md +176 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/configuration.md +164 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/gotchas.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/patterns.md +180 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/api.md +43 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/configuration.md +56 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/gotchas.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/patterns.md +40 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/README.md +85 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/api.md +198 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/configuration.md +151 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/gotchas.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/patterns.md +122 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/README.md +92 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/api.md +141 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/gotchas.md +70 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/patterns.md +144 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/README.md +34 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/api.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/configuration.md +67 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/gotchas.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/patterns.md +158 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/api.md +89 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/configuration.md +116 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/gotchas.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/patterns.md +112 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/README.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/api.md +152 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/configuration.md +148 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/gotchas.md +158 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/patterns.md +255 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/api.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/configuration.md +63 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/gotchas.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/patterns.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-workers/README.md +598 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/api.md +137 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/configuration.md +133 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/gotchas.md +184 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/patterns.md +176 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/configuration.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/gotchas.md +23 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/patterns.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/README.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/api.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/configuration.md +92 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/gotchas.md +117 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/patterns.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/README.md +64 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/api.md +144 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/configuration.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/gotchas.md +187 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/patterns.md +211 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/README.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/api.md +240 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/gotchas.md +171 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/patterns.md +171 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/api.md +51 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/configuration.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/gotchas.md +36 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/README.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/api.md +200 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/configuration.md +228 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/gotchas.md +161 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/patterns.md +145 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/README.md +57 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/api.md +201 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/configuration.md +159 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/gotchas.md +151 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/patterns.md +190 -0
- package/dist/template/.opencode/skill/cloudflare/references/pipelines/README.md +664 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/README.md +107 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/api.md +194 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/configuration.md +216 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/gotchas.md +223 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/patterns.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/README.md +69 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/api.md +138 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/configuration.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/gotchas.md +112 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/patterns.md +155 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/README.md +61 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/api.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/configuration.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/gotchas.md +94 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/patterns.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/api.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/configuration.md +39 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/gotchas.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/patterns.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-sql/README.md +512 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/README.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/api.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/configuration.md +63 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/gotchas.md +75 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/patterns.md +102 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/README.md +81 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/api.md +164 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/configuration.md +147 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/gotchas.md +172 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/patterns.md +155 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/README.md +90 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/api.md +178 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/configuration.md +131 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/gotchas.md +156 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/patterns.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/README.md +58 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/api.md +182 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/configuration.md +140 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/gotchas.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/patterns.md +218 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/README.md +91 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/api.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/configuration.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/gotchas.md +87 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/patterns.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/README.md +15 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/api.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/configuration.md +33 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/gotchas.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/patterns.md +34 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/api.md +24 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/configuration.md +43 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/gotchas.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/patterns.md +40 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/configuration.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/gotchas.md +44 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/README.md +103 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/api.md +204 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/gotchas.md +131 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/patterns.md +152 -0
- package/dist/template/.opencode/skill/cloudflare/references/tail-workers/README.md +640 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/README.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/api.md +159 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/configuration.md +156 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/gotchas.md +207 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/patterns.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/README.md +82 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/api.md +105 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/configuration.md +113 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/gotchas.md +115 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/patterns.md +157 -0
- package/dist/template/.opencode/skill/cloudflare/references/turn/README.md +699 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/configuration.md +19 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/gotchas.md +27 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/patterns.md +41 -0
- package/dist/template/.opencode/skill/cloudflare/references/vectorize/README.md +682 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/configuration.md +44 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/gotchas.md +24 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/patterns.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/README.md +19 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/api.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/configuration.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/gotchas.md +28 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/patterns.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/README.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/api.md +199 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/configuration.md +185 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/gotchas.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/patterns.md +216 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/README.md +96 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/api.md +137 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/configuration.md +147 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/gotchas.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/patterns.md +149 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-ai/README.md +116 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/README.md +48 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/api.md +169 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/configuration.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/gotchas.md +130 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/patterns.md +170 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/api.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/configuration.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/gotchas.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-vpc/README.md +579 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/api.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/configuration.md +177 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/gotchas.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/patterns.md +132 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/README.md +90 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/api.md +140 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/configuration.md +128 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/gotchas.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/patterns.md +150 -0
- package/dist/template/.opencode/skill/cloudflare/references/zaraz/README.md +360 -0
- package/dist/template/.opencode/skill/react-best-practices/AGENTS.md +2410 -0
- package/dist/template/.opencode/skill/react-best-practices/README.md +123 -0
- package/dist/template/.opencode/skill/react-best-practices/SKILL.md +125 -0
- package/dist/template/.opencode/skill/react-best-practices/metadata.json +15 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/_sections.md +46 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/_template.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-api-routes.md +38 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-defer-await.md +80 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-dependencies.md +36 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-parallel.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-conditional.md +31 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-preload.md +50 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-event-listeners.md +74 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-storage.md +70 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-early-exit.md +50 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-index-maps.md +37 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-length-check-first.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-activity.md +26 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-memo.md +44 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-transitions.md +40 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-lru.md +41 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-react.md +76 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-serialization.md +38 -0
- package/dist/template/.opencode/skill/supabase/SKILL.md +120 -0
- package/dist/template/.opencode/skill/supabase/mcp.json +27 -0
- package/dist/template/.opencode/skill/vercel-deploy-claimable/SKILL.md +112 -0
- package/dist/template/.opencode/skill/vercel-deploy-claimable/scripts/deploy.sh +249 -0
- package/dist/template/.opencode/skill/web-design-guidelines/SKILL.md +39 -0
- package/package.json +1 -1
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# Troubleshooting & Best Practices
|
|
2
|
+
|
|
3
|
+
## Common Errors
|
|
4
|
+
|
|
5
|
+
**1. Account ID Missing**
|
|
6
|
+
```
|
|
7
|
+
error: Missing required property 'accountId'
|
|
8
|
+
```
|
|
9
|
+
Solution: Add to config or pass explicitly.
|
|
10
|
+
|
|
11
|
+
**2. Binding Name Mismatch**
|
|
12
|
+
Worker expects `MY_KV` but binding uses different name.
|
|
13
|
+
Solution: Match binding names in Pulumi and worker code.
|
|
14
|
+
|
|
15
|
+
**3. Resource Not Found**
|
|
16
|
+
```
|
|
17
|
+
error: resource 'abc123' not found
|
|
18
|
+
```
|
|
19
|
+
Solution: Ensure resources exist in correct account/zone.
|
|
20
|
+
|
|
21
|
+
**4. API Token Permissions**
|
|
22
|
+
Solution: Verify token has required permissions (Workers, KV, R2, etc.).
|
|
23
|
+
|
|
24
|
+
## Debugging
|
|
25
|
+
|
|
26
|
+
**Enable verbose logging:**
|
|
27
|
+
```bash
|
|
28
|
+
pulumi up --logtostderr -v=9
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Preview changes:**
|
|
32
|
+
```bash
|
|
33
|
+
pulumi preview
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**View resource state:**
|
|
37
|
+
```bash
|
|
38
|
+
pulumi stack export
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Inspect specific resource:**
|
|
42
|
+
```bash
|
|
43
|
+
pulumi stack --show-urns
|
|
44
|
+
pulumi state delete <urn> # Use with caution
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Best Practices
|
|
48
|
+
|
|
49
|
+
### 1. Use Stack Configuration
|
|
50
|
+
```yaml
|
|
51
|
+
# Pulumi.<stack>.yaml
|
|
52
|
+
config:
|
|
53
|
+
cloudflare:accountId: "abc123"
|
|
54
|
+
cloudflare:apiToken:
|
|
55
|
+
secure: "encrypted-value"
|
|
56
|
+
app:domain: "example.com"
|
|
57
|
+
app:zoneId: "xyz789"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 2. Explicit Provider Configuration
|
|
61
|
+
```typescript
|
|
62
|
+
const devProvider = new cloudflare.Provider("dev", {apiToken: devToken});
|
|
63
|
+
const prodProvider = new cloudflare.Provider("prod", {apiToken: prodToken});
|
|
64
|
+
|
|
65
|
+
const devWorker = new cloudflare.WorkerScript("dev-worker", {
|
|
66
|
+
accountId: devAccountId, name: "worker", content: code,
|
|
67
|
+
}, {provider: devProvider});
|
|
68
|
+
|
|
69
|
+
const prodWorker = new cloudflare.WorkerScript("prod-worker", {
|
|
70
|
+
accountId: prodAccountId, name: "worker", content: code,
|
|
71
|
+
}, {provider: prodProvider});
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 3. Resource Naming Conventions
|
|
75
|
+
```typescript
|
|
76
|
+
const stack = pulumi.getStack();
|
|
77
|
+
const kv = new cloudflare.WorkersKvNamespace(`${stack}-kv`, {accountId, title: `${stack}-my-kv`});
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 4. Protect Production Resources
|
|
81
|
+
```typescript
|
|
82
|
+
const prodDb = new cloudflare.D1Database("prod-db", {accountId, name: "production-database"},
|
|
83
|
+
{protect: true}); // Cannot delete without removing protect
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 5. Use dependsOn for Ordering
|
|
87
|
+
```typescript
|
|
88
|
+
const migration = new command.local.Command("migration", {
|
|
89
|
+
create: pulumi.interpolate`wrangler d1 execute ${db.name} --file ./schema.sql`,
|
|
90
|
+
}, {dependsOn: [db]});
|
|
91
|
+
|
|
92
|
+
const worker = new cloudflare.WorkerScript("worker", {
|
|
93
|
+
accountId, name: "worker", content: code,
|
|
94
|
+
d1DatabaseBindings: [{name: "DB", databaseId: db.id}],
|
|
95
|
+
}, {dependsOn: [migration]}); // Ensure migrations run first
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 6. Resource Tagging Pattern
|
|
99
|
+
```typescript
|
|
100
|
+
function createResource(name: string, type: string) {
|
|
101
|
+
const stack = pulumi.getStack();
|
|
102
|
+
const fullName = `${stack}-${type}-${name}`;
|
|
103
|
+
return new cloudflare.WorkersKvNamespace(fullName, {accountId, title: fullName});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const userCache = createResource("user-cache", "kv");
|
|
107
|
+
const sessionCache = createResource("session-cache", "kv");
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Security
|
|
111
|
+
|
|
112
|
+
### Secrets Management
|
|
113
|
+
```typescript
|
|
114
|
+
const config = new pulumi.Config();
|
|
115
|
+
const apiKey = config.requireSecret("apiKey"); // Encrypted in state
|
|
116
|
+
|
|
117
|
+
const worker = new cloudflare.WorkerScript("worker", {
|
|
118
|
+
accountId, name: "my-worker", content: code,
|
|
119
|
+
secretTextBindings: [{name: "API_KEY", text: apiKey}],
|
|
120
|
+
});
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**Store secrets:**
|
|
124
|
+
```bash
|
|
125
|
+
pulumi config set --secret apiKey "secret-value"
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Use environment variables:**
|
|
129
|
+
```bash
|
|
130
|
+
export CLOUDFLARE_API_TOKEN="..."
|
|
131
|
+
pulumi up
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### API Token Scopes
|
|
135
|
+
Create tokens with minimal permissions:
|
|
136
|
+
- Workers: `Workers Routes:Edit`, `Workers Scripts:Edit`
|
|
137
|
+
- KV: `Workers KV Storage:Edit`
|
|
138
|
+
- R2: `R2:Edit`
|
|
139
|
+
- D1: `D1:Edit`
|
|
140
|
+
- DNS: `Zone:Edit`, `DNS:Edit`
|
|
141
|
+
- Pages: `Pages:Edit`
|
|
142
|
+
|
|
143
|
+
### State Security
|
|
144
|
+
- Use Pulumi Cloud or S3 backend with encryption
|
|
145
|
+
- Never commit state files to VCS
|
|
146
|
+
- Use RBAC to control stack access
|
|
147
|
+
|
|
148
|
+
## Performance
|
|
149
|
+
|
|
150
|
+
### Reduce State Size
|
|
151
|
+
- Avoid storing large files in state
|
|
152
|
+
- Use `ignoreChanges` for frequently changing properties
|
|
153
|
+
- Use external build processes
|
|
154
|
+
|
|
155
|
+
### Parallel Updates
|
|
156
|
+
Pulumi automatically parallelizes independent resource updates.
|
|
157
|
+
|
|
158
|
+
### Refresh Strategy
|
|
159
|
+
```bash
|
|
160
|
+
pulumi refresh --yes # Sync state with actual infrastructure
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Migration
|
|
164
|
+
|
|
165
|
+
### Import Existing Resources
|
|
166
|
+
```bash
|
|
167
|
+
pulumi import cloudflare:index/workerScript:WorkerScript my-worker <account_id>/<worker_name>
|
|
168
|
+
pulumi import cloudflare:index/workersKvNamespace:WorkersKvNamespace my-kv <namespace_id>
|
|
169
|
+
pulumi import cloudflare:index/r2Bucket:R2Bucket my-bucket <account_id>/<bucket_name>
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### From Terraform
|
|
173
|
+
Use `pulumi import` and rewrite configs in Pulumi DSL.
|
|
174
|
+
|
|
175
|
+
### From Wrangler
|
|
176
|
+
1. Create Pulumi resources matching wrangler.toml
|
|
177
|
+
2. Import existing resources
|
|
178
|
+
3. Verify with `pulumi preview`
|
|
179
|
+
4. Switch to Pulumi for deployments
|
|
180
|
+
|
|
181
|
+
## CI/CD
|
|
182
|
+
|
|
183
|
+
**GitHub Actions:**
|
|
184
|
+
```yaml
|
|
185
|
+
name: Deploy
|
|
186
|
+
on: [push]
|
|
187
|
+
jobs:
|
|
188
|
+
deploy:
|
|
189
|
+
runs-on: ubuntu-latest
|
|
190
|
+
steps:
|
|
191
|
+
- uses: actions/checkout@v3
|
|
192
|
+
- uses: pulumi/actions@v4
|
|
193
|
+
with:
|
|
194
|
+
command: up
|
|
195
|
+
stack-name: prod
|
|
196
|
+
env:
|
|
197
|
+
PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }}
|
|
198
|
+
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**GitLab CI:**
|
|
202
|
+
```yaml
|
|
203
|
+
deploy:
|
|
204
|
+
image: pulumi/pulumi:latest
|
|
205
|
+
script:
|
|
206
|
+
- pulumi stack select prod
|
|
207
|
+
- pulumi up --yes
|
|
208
|
+
only:
|
|
209
|
+
- main
|
|
210
|
+
variables:
|
|
211
|
+
CLOUDFLARE_API_TOKEN: $CLOUDFLARE_API_TOKEN
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## Resources
|
|
215
|
+
|
|
216
|
+
- **Pulumi Registry:** https://www.pulumi.com/registry/packages/cloudflare/
|
|
217
|
+
- **API Docs:** https://www.pulumi.com/registry/packages/cloudflare/api-docs/
|
|
218
|
+
- **GitHub:** https://github.com/pulumi/pulumi-cloudflare
|
|
219
|
+
- **Cloudflare Docs:** https://developers.cloudflare.com/
|
|
220
|
+
- **Workers Docs:** https://developers.cloudflare.com/workers/
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
See: [README.md](./README.md), [configuration.md](./configuration.md), [api.md](./api.md), [patterns.md](./patterns.md)
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Architecture Patterns
|
|
2
|
+
|
|
3
|
+
## Component Resources
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
class WorkerApp extends pulumi.ComponentResource {
|
|
7
|
+
constructor(name: string, args: WorkerAppArgs, opts?) {
|
|
8
|
+
super("custom:cloudflare:WorkerApp", name, {}, opts);
|
|
9
|
+
const defaultOpts = {parent: this};
|
|
10
|
+
|
|
11
|
+
this.kv = new cloudflare.WorkersKvNamespace(`${name}-kv`, {accountId: args.accountId, title: `${name}-kv`}, defaultOpts);
|
|
12
|
+
this.worker = new cloudflare.WorkerScript(`${name}-worker`, {
|
|
13
|
+
accountId: args.accountId, name: `${name}-worker`, content: args.workerCode,
|
|
14
|
+
module: true, kvNamespaceBindings: [{name: "KV", namespaceId: this.kv.id}],
|
|
15
|
+
}, defaultOpts);
|
|
16
|
+
this.domain = new cloudflare.WorkersDomain(`${name}-domain`, {
|
|
17
|
+
accountId: args.accountId, hostname: args.domain, service: this.worker.name,
|
|
18
|
+
}, defaultOpts);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Full-Stack Worker App
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
const kv = new cloudflare.WorkersKvNamespace("cache", {accountId, title: "api-cache"});
|
|
27
|
+
const db = new cloudflare.D1Database("db", {accountId, name: "app-database"});
|
|
28
|
+
const bucket = new cloudflare.R2Bucket("assets", {accountId, name: "app-assets"});
|
|
29
|
+
|
|
30
|
+
const apiWorker = new cloudflare.WorkerScript("api", {
|
|
31
|
+
accountId, name: "api-worker", content: fs.readFileSync("./dist/api.js", "utf8"),
|
|
32
|
+
module: true, kvNamespaceBindings: [{name: "CACHE", namespaceId: kv.id}],
|
|
33
|
+
d1DatabaseBindings: [{name: "DB", databaseId: db.id}],
|
|
34
|
+
r2BucketBindings: [{name: "ASSETS", bucketName: bucket.name}],
|
|
35
|
+
});
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Multi-Environment Setup
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
const stack = pulumi.getStack();
|
|
42
|
+
const worker = new cloudflare.WorkerScript(`worker-${stack}`, {
|
|
43
|
+
accountId, name: `my-worker-${stack}`, content: code,
|
|
44
|
+
plainTextBindings: [{name: "ENVIRONMENT", text: stack}],
|
|
45
|
+
});
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Queue-Based Processing
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
const queue = new cloudflare.Queue("processing-queue", {accountId, name: "image-processing"});
|
|
52
|
+
|
|
53
|
+
// Producer: API receives requests
|
|
54
|
+
const apiWorker = new cloudflare.WorkerScript("api", {
|
|
55
|
+
accountId, name: "api-worker", content: apiCode,
|
|
56
|
+
queueBindings: [{name: "PROCESSING_QUEUE", queue: queue.id}],
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// Consumer: Process async
|
|
60
|
+
const processorWorker = new cloudflare.WorkerScript("processor", {
|
|
61
|
+
accountId, name: "processor-worker", content: processorCode,
|
|
62
|
+
queueConsumers: [{queue: queue.name, maxBatchSize: 10, maxRetries: 3, maxWaitTimeMs: 5000}],
|
|
63
|
+
r2BucketBindings: [{name: "OUTPUT_BUCKET", bucketName: outputBucket.name}],
|
|
64
|
+
});
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Microservices with Service Bindings
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
const authWorker = new cloudflare.WorkerScript("auth", {accountId, name: "auth-service", content: authCode});
|
|
71
|
+
const apiWorker = new cloudflare.WorkerScript("api", {
|
|
72
|
+
accountId, name: "api-service", content: apiCode,
|
|
73
|
+
serviceBindings: [{name: "AUTH", service: authWorker.name}],
|
|
74
|
+
});
|
|
75
|
+
// In worker: await env.AUTH.fetch("/verify", {...});
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Event-Driven Architecture
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
const eventQueue = new cloudflare.Queue("events", {accountId, name: "event-bus"});
|
|
82
|
+
const producers = ["api", "webhook"].map(name =>
|
|
83
|
+
new cloudflare.WorkerScript(`${name}-producer`, {
|
|
84
|
+
accountId, name: `${name}-producer`, content: producerCode,
|
|
85
|
+
queueBindings: [{name: "EVENTS", queue: eventQueue.id}],
|
|
86
|
+
})
|
|
87
|
+
);
|
|
88
|
+
const consumers = ["email", "analytics"].map(name =>
|
|
89
|
+
new cloudflare.WorkerScript(`${name}-consumer`, {
|
|
90
|
+
accountId, name: `${name}-consumer`, content: consumerCode,
|
|
91
|
+
queueConsumers: [{queue: eventQueue.name, maxBatchSize: 10}],
|
|
92
|
+
})
|
|
93
|
+
);
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## CDN with Dynamic Content
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
const staticBucket = new cloudflare.R2Bucket("static", {accountId, name: "static-assets"});
|
|
100
|
+
const appWorker = new cloudflare.WorkerScript("app", {
|
|
101
|
+
accountId, name: "app-worker", content: appCode,
|
|
102
|
+
r2BucketBindings: [{name: "STATIC", bucketName: staticBucket.name}],
|
|
103
|
+
});
|
|
104
|
+
const route = new cloudflare.WorkerRoute("route", {zoneId, pattern: `${domain}/*`, scriptName: appWorker.name});
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Wrangler Integration
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
// Match wrangler.toml bindings in Pulumi
|
|
111
|
+
const worker = new cloudflare.WorkerScript("worker", {
|
|
112
|
+
accountId, name: "my-worker", content: code,
|
|
113
|
+
compatibilityDate: "2024-01-01", compatibilityFlags: ["nodejs_compat"],
|
|
114
|
+
kvNamespaceBindings: [{name: "MY_KV", namespaceId: kv.id}], // Must match wrangler.toml
|
|
115
|
+
});
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Dynamic Worker Content
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
import * as command from "@pulumi/command";
|
|
122
|
+
const build = new command.local.Command("build-worker", {create: "npm run build", dir: "./worker"});
|
|
123
|
+
const workerContent = build.stdout.apply(() => fs.readFileSync("./worker/dist/index.js", "utf8"));
|
|
124
|
+
const worker = new cloudflare.WorkerScript("worker", {accountId, name: "my-worker", content: workerContent}, {dependsOn: [build]});
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Conditional Resources
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
const isProd = pulumi.getStack() === "prod";
|
|
131
|
+
const analytics = isProd ? new cloudflare.WorkersKvNamespace("analytics", {accountId, title: "analytics"}) : undefined;
|
|
132
|
+
const worker = new cloudflare.WorkerScript("worker", {
|
|
133
|
+
accountId, name: "worker", content: code,
|
|
134
|
+
kvNamespaceBindings: analytics ? [{name: "ANALYTICS", namespaceId: analytics.id}] : [],
|
|
135
|
+
});
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
See: [README.md](./README.md), [configuration.md](./configuration.md), [api.md](./api.md), [gotchas.md](./gotchas.md)
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Cloudflare Queues
|
|
2
|
+
|
|
3
|
+
Flexible message queuing for async task processing with guaranteed at-least-once delivery and configurable batching.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Queues provide:
|
|
8
|
+
- At-least-once delivery guarantee
|
|
9
|
+
- Push-based (Worker) and pull-based (HTTP) consumers
|
|
10
|
+
- Configurable batching and retries
|
|
11
|
+
- Dead Letter Queues (DLQ)
|
|
12
|
+
- Delays up to 12 hours
|
|
13
|
+
|
|
14
|
+
**Use cases:** Async processing, API buffering, rate limiting, event workflows, deferred jobs
|
|
15
|
+
|
|
16
|
+
## Quick Start
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
wrangler queues create my-queue
|
|
20
|
+
wrangler queues consumer add my-queue my-worker
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
// Producer
|
|
25
|
+
await env.MY_QUEUE.send({ userId: 123, action: 'notify' });
|
|
26
|
+
|
|
27
|
+
// Consumer
|
|
28
|
+
export default {
|
|
29
|
+
async queue(batch: MessageBatch, env: Env): Promise<void> {
|
|
30
|
+
for (const msg of batch.messages) {
|
|
31
|
+
await process(msg.body);
|
|
32
|
+
msg.ack();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Core Operations
|
|
39
|
+
|
|
40
|
+
| Operation | Purpose | Limit |
|
|
41
|
+
|-----------|---------|-------|
|
|
42
|
+
| `send(body, options?)` | Publish message | 128 KB |
|
|
43
|
+
| `sendBatch(messages)` | Bulk publish | 100 msgs/256 KB |
|
|
44
|
+
| `message.ack()` | Acknowledge success | - |
|
|
45
|
+
| `message.retry(options?)` | Retry with delay | - |
|
|
46
|
+
| `batch.ackAll()` | Ack entire batch | - |
|
|
47
|
+
|
|
48
|
+
## Architecture
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
[Producer Worker] → [Queue] → [Consumer Worker/HTTP] → [Processing]
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
- Max 10,000 queues per account
|
|
55
|
+
- 5,000 msgs/second per queue
|
|
56
|
+
- 4-14 day retention (configurable)
|
|
57
|
+
|
|
58
|
+
## In This Reference
|
|
59
|
+
|
|
60
|
+
- [configuration.md](./configuration.md) - wrangler.jsonc setup, producer/consumer config, DLQ
|
|
61
|
+
- [api.md](./api.md) - Send/batch methods, queue handler, ack/retry, pull API
|
|
62
|
+
- [patterns.md](./patterns.md) - Async tasks, buffering, rate limiting, event workflows
|
|
63
|
+
- [gotchas.md](./gotchas.md) - Idempotency, retry limits, content types, cost optimization
|
|
64
|
+
|
|
65
|
+
## See Also
|
|
66
|
+
|
|
67
|
+
- [workers](../workers/) - Worker runtime for producers/consumers
|
|
68
|
+
- [r2](../r2/) - Process R2 event notifications via queues
|
|
69
|
+
- [d1](../d1/) - Batch write to D1 from queue consumers
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Queues API Reference
|
|
2
|
+
|
|
3
|
+
## Producer: Send Messages
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
// Basic send
|
|
7
|
+
await env.MY_QUEUE.send({ url: request.url, timestamp: Date.now() });
|
|
8
|
+
|
|
9
|
+
// Options: delay (max 43200s), contentType (json|text|bytes|v8)
|
|
10
|
+
await env.MY_QUEUE.send(message, { delaySeconds: 600 });
|
|
11
|
+
await env.MY_QUEUE.send(message, { delaySeconds: 0 }); // Override queue default
|
|
12
|
+
|
|
13
|
+
// Batch (up to 100 msgs or 256 KB)
|
|
14
|
+
await env.MY_QUEUE.sendBatch([
|
|
15
|
+
{ body: 'msg1' },
|
|
16
|
+
{ body: 'msg2' },
|
|
17
|
+
{ body: 'msg3', options: { delaySeconds: 300 } }
|
|
18
|
+
]);
|
|
19
|
+
|
|
20
|
+
// Non-blocking
|
|
21
|
+
ctx.waitUntil(env.MY_QUEUE.send({ data: 'async' }));
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Consumer: Push-based (Worker)
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
export default {
|
|
28
|
+
async queue(batch: MessageBatch, env: Env, ctx: ExecutionContext): Promise<void> {
|
|
29
|
+
// batch.queue, batch.messages.length
|
|
30
|
+
for (const msg of batch.messages) {
|
|
31
|
+
// msg.id, msg.body, msg.timestamp, msg.attempts
|
|
32
|
+
try {
|
|
33
|
+
await processMessage(msg.body);
|
|
34
|
+
msg.ack();
|
|
35
|
+
} catch (error) {
|
|
36
|
+
msg.retry({ delaySeconds: 600 });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Batch Operations
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
// Acknowledge entire batch
|
|
47
|
+
try {
|
|
48
|
+
await bulkProcess(batch.messages);
|
|
49
|
+
batch.ackAll();
|
|
50
|
+
} catch (error) {
|
|
51
|
+
batch.retryAll({ delaySeconds: 300 });
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Exponential Backoff
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
async queue(batch: MessageBatch, env: Env): Promise<void> {
|
|
59
|
+
for (const msg of batch.messages) {
|
|
60
|
+
try {
|
|
61
|
+
await processMessage(msg.body);
|
|
62
|
+
msg.ack();
|
|
63
|
+
} catch (error) {
|
|
64
|
+
const delay = Math.min(30 ** msg.attempts, 43200);
|
|
65
|
+
msg.retry({ delaySeconds: delay });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Multiple Queues, Single Consumer
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
export default {
|
|
75
|
+
async queue(batch: MessageBatch, env: Env): Promise<void> {
|
|
76
|
+
switch (batch.queue) {
|
|
77
|
+
case 'high-priority': await processUrgent(batch.messages); break;
|
|
78
|
+
case 'low-priority': await processDeferred(batch.messages); break;
|
|
79
|
+
case 'email': await sendEmails(batch.messages); break;
|
|
80
|
+
default: batch.retryAll();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Consumer: Pull-based (HTTP)
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
// Pull messages
|
|
90
|
+
const response = await fetch(
|
|
91
|
+
`https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/queues/${QUEUE_ID}/messages/pull`,
|
|
92
|
+
{
|
|
93
|
+
method: 'POST',
|
|
94
|
+
headers: { 'authorization': `Bearer ${API_TOKEN}`, 'content-type': 'application/json' },
|
|
95
|
+
body: JSON.stringify({ visibility_timeout_ms: 6000, batch_size: 50 })
|
|
96
|
+
}
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
const data = await response.json();
|
|
100
|
+
|
|
101
|
+
// Acknowledge
|
|
102
|
+
await fetch(
|
|
103
|
+
`https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/queues/${QUEUE_ID}/messages/ack`,
|
|
104
|
+
{
|
|
105
|
+
method: 'POST',
|
|
106
|
+
headers: { 'authorization': `Bearer ${API_TOKEN}`, 'content-type': 'application/json' },
|
|
107
|
+
body: JSON.stringify({
|
|
108
|
+
acks: [{ lease_id: msg.lease_id }],
|
|
109
|
+
retries: [{ lease_id: msg2.lease_id, delay_seconds: 600 }]
|
|
110
|
+
})
|
|
111
|
+
}
|
|
112
|
+
);
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Interfaces
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
interface MessageBatch<Body = unknown> {
|
|
119
|
+
readonly queue: string;
|
|
120
|
+
readonly messages: Message<Body>[];
|
|
121
|
+
ackAll(): void;
|
|
122
|
+
retryAll(options?: QueueRetryOptions): void;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
interface Message<Body = unknown> {
|
|
126
|
+
readonly id: string;
|
|
127
|
+
readonly timestamp: Date;
|
|
128
|
+
readonly body: Body;
|
|
129
|
+
readonly attempts: number;
|
|
130
|
+
ack(): void;
|
|
131
|
+
retry(options?: QueueRetryOptions): void;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
interface QueueSendOptions {
|
|
135
|
+
contentType?: 'text' | 'bytes' | 'json' | 'v8';
|
|
136
|
+
delaySeconds?: number; // 0-43200
|
|
137
|
+
}
|
|
138
|
+
```
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Queues Configuration
|
|
2
|
+
|
|
3
|
+
## Create Queue
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
wrangler queues create my-queue
|
|
7
|
+
wrangler queues create my-queue --retention-period-hours=336 # 14 days
|
|
8
|
+
wrangler queues create my-queue --delivery-delay-secs=300
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Producer Binding
|
|
12
|
+
|
|
13
|
+
**wrangler.jsonc:**
|
|
14
|
+
```jsonc
|
|
15
|
+
{
|
|
16
|
+
"queues": {
|
|
17
|
+
"producers": [
|
|
18
|
+
{
|
|
19
|
+
"queue": "my-queue-name",
|
|
20
|
+
"binding": "MY_QUEUE",
|
|
21
|
+
"delivery_delay": 60 // Optional: default delay in seconds
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**wrangler.toml:**
|
|
29
|
+
```toml
|
|
30
|
+
[[queues.producers]]
|
|
31
|
+
queue = "my-queue-name"
|
|
32
|
+
binding = "MY_QUEUE"
|
|
33
|
+
delivery_delay = 60
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Consumer Configuration (Push-based)
|
|
37
|
+
|
|
38
|
+
**wrangler.jsonc:**
|
|
39
|
+
```jsonc
|
|
40
|
+
{
|
|
41
|
+
"queues": {
|
|
42
|
+
"consumers": [
|
|
43
|
+
{
|
|
44
|
+
"queue": "my-queue-name",
|
|
45
|
+
"max_batch_size": 10, // 1-100, default 10
|
|
46
|
+
"max_batch_timeout": 5, // 0-60s, default 5
|
|
47
|
+
"max_retries": 3, // default 3, max 100
|
|
48
|
+
"dead_letter_queue": "my-dlq", // optional
|
|
49
|
+
"retry_delay": 300 // optional: delay retries in seconds
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**wrangler.toml:**
|
|
57
|
+
```toml
|
|
58
|
+
[[queues.consumers]]
|
|
59
|
+
queue = "my-queue-name"
|
|
60
|
+
max_batch_size = 10
|
|
61
|
+
max_batch_timeout = 5
|
|
62
|
+
max_retries = 3
|
|
63
|
+
dead_letter_queue = "my-dlq"
|
|
64
|
+
retry_delay = 300
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Consumer Configuration (Pull-based)
|
|
68
|
+
|
|
69
|
+
**wrangler.jsonc:**
|
|
70
|
+
```jsonc
|
|
71
|
+
{
|
|
72
|
+
"queues": {
|
|
73
|
+
"consumers": [
|
|
74
|
+
{
|
|
75
|
+
"queue": "my-queue-name",
|
|
76
|
+
"type": "http_pull",
|
|
77
|
+
"visibility_timeout_ms": 5000, // default 30000, max 12h
|
|
78
|
+
"max_retries": 5,
|
|
79
|
+
"dead_letter_queue": "my-dlq"
|
|
80
|
+
}
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## TypeScript Types
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
interface Env {
|
|
90
|
+
MY_QUEUE: Queue<MessageBody>;
|
|
91
|
+
ANALYTICS_QUEUE: Queue<AnalyticsEvent>;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
interface MessageBody {
|
|
95
|
+
id: string;
|
|
96
|
+
action: 'create' | 'update' | 'delete';
|
|
97
|
+
data: Record<string, any>;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export default {
|
|
101
|
+
async queue(batch: MessageBatch<MessageBody>, env: Env): Promise<void> {
|
|
102
|
+
for (const msg of batch.messages) {
|
|
103
|
+
console.log(msg.body.action);
|
|
104
|
+
msg.ack();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
} satisfies ExportedHandler<Env>;
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## CLI Commands
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
# Consumer management
|
|
114
|
+
wrangler queues consumer add my-queue my-worker --batch-size=50 --max-retries=5
|
|
115
|
+
wrangler queues consumer http add my-queue
|
|
116
|
+
wrangler queues consumer worker remove my-queue my-worker
|
|
117
|
+
wrangler queues consumer http remove my-queue
|
|
118
|
+
|
|
119
|
+
# Queue operations
|
|
120
|
+
wrangler queues list
|
|
121
|
+
wrangler queues pause my-queue
|
|
122
|
+
wrangler queues resume my-queue
|
|
123
|
+
wrangler queues purge my-queue
|
|
124
|
+
wrangler queues delete my-queue
|
|
125
|
+
```
|