opencodekit 0.15.4 → 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/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,203 @@
|
|
|
1
|
+
# Cache Reserve Gotchas
|
|
2
|
+
|
|
3
|
+
## Common Issues and Solutions
|
|
4
|
+
|
|
5
|
+
### Issue: Assets Not Being Cached in Cache Reserve
|
|
6
|
+
|
|
7
|
+
**Diagnostics:**
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
const debugEligibility = {
|
|
11
|
+
checks: [
|
|
12
|
+
'Verify asset is cacheable (cf-cache-status header)',
|
|
13
|
+
'Check TTL >= 10 hours',
|
|
14
|
+
'Confirm Content-Length header present',
|
|
15
|
+
'Review Cache Rules configuration',
|
|
16
|
+
'Check for Set-Cookie or Vary: * headers'
|
|
17
|
+
],
|
|
18
|
+
|
|
19
|
+
tools: [
|
|
20
|
+
'curl -I https://example.com/asset.jpg',
|
|
21
|
+
'Check cf-cache-status header',
|
|
22
|
+
'Review Cloudflare Trace output',
|
|
23
|
+
'Check Logpush CacheReserveUsed field'
|
|
24
|
+
]
|
|
25
|
+
};
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Solutions:**
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
// 1. Ensure minimum TTL (10+ hours)
|
|
32
|
+
response.headers.set('Cache-Control', 'public, max-age=36000');
|
|
33
|
+
|
|
34
|
+
// Or via Cache Rule:
|
|
35
|
+
const rule = {
|
|
36
|
+
action_parameters: {
|
|
37
|
+
edge_ttl: { mode: 'override_origin', default: 36000 }
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// 2. Add Content-Length
|
|
42
|
+
response.headers.set('Content-Length', bodySize.toString());
|
|
43
|
+
|
|
44
|
+
// 3. Remove blocking headers
|
|
45
|
+
response.headers.delete('Set-Cookie');
|
|
46
|
+
response.headers.set('Vary', 'Accept-Encoding'); // Not *
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Issue: High Class A Operations Costs
|
|
50
|
+
|
|
51
|
+
**Cause**: Frequent cache misses, short TTLs, or frequent revalidation
|
|
52
|
+
|
|
53
|
+
**Solutions:**
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// 1. Increase TTL for stable content
|
|
57
|
+
const optimizedTTL = {
|
|
58
|
+
before: 3600, // 1 hour (not eligible)
|
|
59
|
+
after: 86400 // 24 hours (eligible + fewer rewrites)
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// 2. Enable Tiered Cache (reduces direct Cache Reserve misses)
|
|
63
|
+
|
|
64
|
+
// 3. Use stale-while-revalidate (via fetch, not cache.put)
|
|
65
|
+
response.headers.set(
|
|
66
|
+
'Cache-Control',
|
|
67
|
+
'public, max-age=86400, stale-while-revalidate=86400'
|
|
68
|
+
);
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Issue: Purge Not Working as Expected
|
|
72
|
+
|
|
73
|
+
**Understanding purge behavior:**
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
const purgeBehavior = {
|
|
77
|
+
byURL: {
|
|
78
|
+
cacheReserve: 'Immediately removed',
|
|
79
|
+
edgeCache: 'Immediately removed',
|
|
80
|
+
cost: 'Free'
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
byTag: {
|
|
84
|
+
cacheReserve: 'Revalidation triggered, NOT removed',
|
|
85
|
+
edgeCache: 'Immediately removed',
|
|
86
|
+
storage: 'Continues until TTL expires',
|
|
87
|
+
cost: 'Storage costs continue'
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// Solution: Use purge by URL for immediate removal
|
|
92
|
+
await purgeByURL(['https://example.com/asset.jpg']);
|
|
93
|
+
|
|
94
|
+
// Or: Disable + clear for complete removal
|
|
95
|
+
await disableCacheReserve(zoneId, token);
|
|
96
|
+
await clearAllCacheReserve(zoneId, token);
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Issue: Cache Reserve Disabled But Can't Clear
|
|
100
|
+
|
|
101
|
+
**Error**: "Cache Reserve must be OFF before clearing data"
|
|
102
|
+
|
|
103
|
+
**Solution:**
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
const clearProcess = async (zoneId: string, token: string) => {
|
|
107
|
+
// Step 1: Check current state
|
|
108
|
+
const status = await getCacheReserveStatus(zoneId, token);
|
|
109
|
+
|
|
110
|
+
// Step 2: Disable if enabled
|
|
111
|
+
if (status.result.value !== 'off') {
|
|
112
|
+
await disableCacheReserve(zoneId, token);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Step 3: Wait briefly for propagation
|
|
116
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
117
|
+
|
|
118
|
+
// Step 4: Clear data
|
|
119
|
+
const clearResult = await clearAllCacheReserve(zoneId, token);
|
|
120
|
+
|
|
121
|
+
// Step 5: Monitor clear progress (can take up to 24 hours)
|
|
122
|
+
let clearStatus;
|
|
123
|
+
do {
|
|
124
|
+
await new Promise(resolve => setTimeout(resolve, 60000));
|
|
125
|
+
clearStatus = await getClearStatus(zoneId, token);
|
|
126
|
+
} while (clearStatus.result.state === 'In-progress');
|
|
127
|
+
};
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Troubleshooting
|
|
131
|
+
|
|
132
|
+
### Diagnostic Commands
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
# Check Cache Reserve status
|
|
136
|
+
curl -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/cache/cache_reserve" \
|
|
137
|
+
-H "Authorization: Bearer $API_TOKEN" | jq
|
|
138
|
+
|
|
139
|
+
# Check asset cache status
|
|
140
|
+
curl -I https://example.com/asset.jpg | grep -i cache
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Common Header Patterns
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
// Successful: HIT + max-age >= 36000 + content-length present
|
|
147
|
+
// Not eligible: TTL < 10hrs | missing content-length | has set-cookie | vary: *
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Limits
|
|
151
|
+
|
|
152
|
+
### Minimum Requirements Checklist
|
|
153
|
+
|
|
154
|
+
- [ ] Paid Cache Reserve plan active
|
|
155
|
+
- [ ] Tiered Cache enabled (strongly recommended)
|
|
156
|
+
- [ ] Assets cacheable per standard rules
|
|
157
|
+
- [ ] TTL >= 10 hours (36000 seconds)
|
|
158
|
+
- [ ] Content-Length header present
|
|
159
|
+
- [ ] No Set-Cookie header (or using private directive)
|
|
160
|
+
- [ ] No Vary: * header
|
|
161
|
+
- [ ] Not an image transformation variant
|
|
162
|
+
|
|
163
|
+
### Key Limits
|
|
164
|
+
|
|
165
|
+
```typescript
|
|
166
|
+
const limits = {
|
|
167
|
+
minTTL: 36000, // 10 hours in seconds
|
|
168
|
+
retentionDefault: 2592000, // 30 days in seconds
|
|
169
|
+
maxFileSize: Infinity, // Same as R2 limits
|
|
170
|
+
purgeClearTime: 86400000, // Up to 24 hours in milliseconds
|
|
171
|
+
};
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### API Endpoints
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
const endpoints = {
|
|
178
|
+
status: 'GET /zones/:zone_id/cache/cache_reserve',
|
|
179
|
+
enable: 'PATCH /zones/:zone_id/cache/cache_reserve',
|
|
180
|
+
disable: 'PATCH /zones/:zone_id/cache/cache_reserve',
|
|
181
|
+
clear: 'POST /zones/:zone_id/cache/cache_reserve_clear',
|
|
182
|
+
clearStatus: 'GET /zones/:zone_id/cache/cache_reserve_clear',
|
|
183
|
+
purge: 'POST /zones/:zone_id/purge_cache',
|
|
184
|
+
cacheRules: 'PUT /zones/:zone_id/rulesets/phases/http_request_cache_settings/entrypoint'
|
|
185
|
+
};
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## Additional Resources
|
|
189
|
+
|
|
190
|
+
- **Official Docs**: https://developers.cloudflare.com/cache/advanced-configuration/cache-reserve/
|
|
191
|
+
- **API Reference**: https://developers.cloudflare.com/api/resources/cache/subresources/cache_reserve/
|
|
192
|
+
- **Cache Rules**: https://developers.cloudflare.com/cache/how-to/cache-rules/
|
|
193
|
+
- **Workers Cache API**: https://developers.cloudflare.com/workers/runtime-apis/cache/
|
|
194
|
+
- **R2 Documentation**: https://developers.cloudflare.com/r2/
|
|
195
|
+
- **Smart Shield**: https://developers.cloudflare.com/smart-shield/
|
|
196
|
+
- **Tiered Cache**: https://developers.cloudflare.com/cache/how-to/tiered-cache/
|
|
197
|
+
|
|
198
|
+
## See Also
|
|
199
|
+
|
|
200
|
+
- [README](./README.md) - Overview and core concepts
|
|
201
|
+
- [Configuration](./configuration.md) - Setup and Cache Rules
|
|
202
|
+
- [API Reference](./api.md) - Purging and monitoring
|
|
203
|
+
- [Patterns](./patterns.md) - Best practices and optimization
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# Cache Reserve Patterns
|
|
2
|
+
|
|
3
|
+
## Best Practices
|
|
4
|
+
|
|
5
|
+
### 1. Always Enable Tiered Cache
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// Cache Reserve is designed for use WITH Tiered Cache
|
|
9
|
+
const configuration = {
|
|
10
|
+
tieredCache: 'enabled', // Required for optimal performance
|
|
11
|
+
cacheReserve: 'enabled', // Works best with Tiered Cache
|
|
12
|
+
|
|
13
|
+
hierarchy: [
|
|
14
|
+
'Lower-Tier Cache (visitor)',
|
|
15
|
+
'Upper-Tier Cache (origin region)',
|
|
16
|
+
'Cache Reserve (persistent)',
|
|
17
|
+
'Origin'
|
|
18
|
+
]
|
|
19
|
+
};
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### 2. Set Appropriate Cache-Control Headers
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
// Origin response headers for Cache Reserve eligibility
|
|
26
|
+
const originHeaders = {
|
|
27
|
+
'Cache-Control': 'public, max-age=86400', // 24 hours minimum 10 hours
|
|
28
|
+
'Content-Length': '1024000', // Required for eligibility
|
|
29
|
+
'Cache-Tag': 'images,product-123', // Optional: For purging
|
|
30
|
+
'ETag': '"abc123"', // Optional: Support revalidation
|
|
31
|
+
'Last-Modified': 'Wed, 21 Oct 2025 07:28:00 GMT',
|
|
32
|
+
|
|
33
|
+
// Avoid: Prevents caching
|
|
34
|
+
// 'Set-Cookie': 'session=xyz', // Remove or use private directive
|
|
35
|
+
// 'Vary': '*', // Not compatible
|
|
36
|
+
};
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 3. Use Cache Rules for Fine-Grained Control
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
// Different TTLs for different content types
|
|
43
|
+
const cacheRules = [
|
|
44
|
+
{
|
|
45
|
+
description: 'Long-term cache for immutable assets',
|
|
46
|
+
expression: '(http.request.uri.path matches "^/static/.*\\.[a-f0-9]{8}\\.")',
|
|
47
|
+
action_parameters: {
|
|
48
|
+
cache_reserve: { eligible: true },
|
|
49
|
+
edge_ttl: { mode: 'override_origin', default: 2592000 }, // 30 days
|
|
50
|
+
cache: true
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
description: 'Moderate cache for regular images',
|
|
55
|
+
expression: '(http.request.uri.path matches "\\.(jpg|png|webp)$")',
|
|
56
|
+
action_parameters: {
|
|
57
|
+
cache_reserve: { eligible: true },
|
|
58
|
+
edge_ttl: { mode: 'override_origin', default: 86400 }, // 24 hours
|
|
59
|
+
cache: true
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
description: 'Exclude API from Cache Reserve',
|
|
64
|
+
expression: '(http.request.uri.path matches "^/api/")',
|
|
65
|
+
action_parameters: { cache_reserve: { eligible: false }, cache: false }
|
|
66
|
+
}
|
|
67
|
+
];
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 4. Ensuring Cache Reserve Eligibility in Workers
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
export default {
|
|
74
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
75
|
+
const response = await fetch(request);
|
|
76
|
+
|
|
77
|
+
if (response.ok) {
|
|
78
|
+
const headers = new Headers(response.headers);
|
|
79
|
+
|
|
80
|
+
// Set minimum 10-hour cache
|
|
81
|
+
headers.set('Cache-Control', 'public, max-age=36000');
|
|
82
|
+
|
|
83
|
+
// Remove Set-Cookie if present (prevents caching)
|
|
84
|
+
headers.delete('Set-Cookie');
|
|
85
|
+
|
|
86
|
+
// Ensure Content-Length is present
|
|
87
|
+
if (!headers.has('Content-Length')) {
|
|
88
|
+
const blob = await response.blob();
|
|
89
|
+
headers.set('Content-Length', blob.size.toString());
|
|
90
|
+
|
|
91
|
+
return new Response(blob, {
|
|
92
|
+
status: response.status,
|
|
93
|
+
statusText: response.statusText,
|
|
94
|
+
headers
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return new Response(response.body, {
|
|
99
|
+
status: response.status,
|
|
100
|
+
statusText: response.statusText,
|
|
101
|
+
headers
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return response;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### 5. Hostname Best Practices
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
// ✅ CORRECT: Use Worker's hostname for efficient caching
|
|
114
|
+
export default {
|
|
115
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
116
|
+
return await fetch(request); // Keep the Worker's hostname
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// ❌ WRONG: Overriding hostname causes unnecessary DNS lookups
|
|
121
|
+
export default {
|
|
122
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
123
|
+
const url = new URL(request.url);
|
|
124
|
+
url.hostname = 'different-host.com'; // Avoid this!
|
|
125
|
+
return await fetch(url.toString());
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Architecture Patterns
|
|
131
|
+
|
|
132
|
+
### Multi-Tier Caching + Immutable Assets
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
// Optimal: L1 (visitor) → L2 (region) → L3 (Cache Reserve) → Origin
|
|
136
|
+
// Each miss backfills all upstream layers
|
|
137
|
+
|
|
138
|
+
// Immutable asset optimization with content hashing
|
|
139
|
+
export default {
|
|
140
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
141
|
+
const url = new URL(request.url);
|
|
142
|
+
const isImmutable = /\.[a-f0-9]{8,}\.(js|css|jpg|png|woff2)$/.test(url.pathname);
|
|
143
|
+
|
|
144
|
+
const response = await fetch(request);
|
|
145
|
+
|
|
146
|
+
if (isImmutable) {
|
|
147
|
+
const headers = new Headers(response.headers);
|
|
148
|
+
headers.set('Cache-Control', 'public, max-age=31536000, immutable'); // 1 year
|
|
149
|
+
return new Response(response.body, { status: response.status, headers });
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return response;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Cost Optimization
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
// Typical savings: 50-80% reduction in origin egress
|
|
161
|
+
// Origin cost (AWS: $0.09/GB) vs Cache Reserve ($0.015/GB-month + $0.36/M reads)
|
|
162
|
+
|
|
163
|
+
// 1. Set appropriate TTLs
|
|
164
|
+
const optimizeTTL = {
|
|
165
|
+
tooShort: 3600, // 1 hour - not eligible
|
|
166
|
+
optimal: 86400, // 24 hours - reduces rewrites
|
|
167
|
+
tooLong: 2592000 // 30 days - use cautiously
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
// 2. Cache high-value, stable assets: images, media, fonts, archives
|
|
171
|
+
// 3. Exclude frequently changing: /api/, user-specific, JSON data
|
|
172
|
+
// 4. Note: Cache Reserve requests uncompressed from origin, compresses for visitors
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## See Also
|
|
176
|
+
|
|
177
|
+
- [README](./README.md) - Overview and core concepts
|
|
178
|
+
- [Configuration](./configuration.md) - Setup and Cache Rules
|
|
179
|
+
- [API Reference](./api.md) - Purging and monitoring
|
|
180
|
+
- [Gotchas](./gotchas.md) - Common issues and troubleshooting
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Cloudflare Containers Skill Reference
|
|
2
|
+
|
|
3
|
+
**APPLIES TO: Cloudflare Containers ONLY - NOT general Cloudflare Workers**
|
|
4
|
+
|
|
5
|
+
Use when working with Cloudflare Containers: deploying containerized apps on Workers platform, configuring container-enabled Durable Objects, managing container lifecycle, or implementing stateful/stateless container patter...
|
|
6
|
+
|
|
7
|
+
## In This Reference
|
|
8
|
+
|
|
9
|
+
- **[configuration.md](./configuration.md)** - Setup, deployment, configuration
|
|
10
|
+
- **[api.md](./api.md)** - API endpoints, methods, interfaces
|
|
11
|
+
- **[patterns.md](./patterns.md)** - Common patterns, use cases, examples
|
|
12
|
+
- **[gotchas.md](./gotchas.md)** - Troubleshooting, best practices, limitations
|
|
13
|
+
|
|
14
|
+
## See Also
|
|
15
|
+
|
|
16
|
+
- [Cloudflare Docs](https://developers.cloudflare.com/)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
### HTTP Requests
|
|
2
|
+
|
|
3
|
+
**Default port (recommended):**
|
|
4
|
+
```typescript
|
|
5
|
+
// Uses defaultPort from Container class
|
|
6
|
+
const container = env.MY_CONTAINER.getByName("id");
|
|
7
|
+
const response = await container.fetch(request);
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
**Specific port:**
|
|
11
|
+
```typescript
|
|
12
|
+
const port = this.ctx.container.getTcpPort(8080);
|
|
13
|
+
const response = await port.fetch("http://container/api", {
|
|
14
|
+
method: "POST",
|
|
15
|
+
body: JSON.stringify(data)
|
|
16
|
+
});
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### TCP Connections
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
const port = this.ctx.container.getTcpPort(8080);
|
|
23
|
+
const conn = port.connect('10.0.0.1:8080');
|
|
24
|
+
await conn.opened;
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
if (request.body) {
|
|
28
|
+
await request.body.pipeTo(conn.writable);
|
|
29
|
+
}
|
|
30
|
+
return new Response(conn.readable);
|
|
31
|
+
} catch (err) {
|
|
32
|
+
return new Response("Failed to proxy", { status: 502 });
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### WebSocket Forwarding
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
export default {
|
|
40
|
+
async fetch(request: Request, env: Env) {
|
|
41
|
+
const upgradeHeader = request.headers.get("Upgrade");
|
|
42
|
+
if (upgradeHeader === "websocket") {
|
|
43
|
+
const container = env.MY_CONTAINER.g
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
## Wrangler Configuration
|
|
2
|
+
|
|
3
|
+
### Basic Container Config
|
|
4
|
+
|
|
5
|
+
```jsonc
|
|
6
|
+
{
|
|
7
|
+
"name": "my-worker",
|
|
8
|
+
"main": "src/index.ts",
|
|
9
|
+
"compatibility_date": "2026-01-10",
|
|
10
|
+
"containers": [
|
|
11
|
+
{
|
|
12
|
+
"class_name": "MyContainer",
|
|
13
|
+
"image": "./Dockerfile", // or path to directory with Dockerfile
|
|
14
|
+
"max_instances": 10
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"durable_objects": {
|
|
18
|
+
"bindings": [
|
|
19
|
+
{
|
|
20
|
+
"name": "MY_CONTAINER",
|
|
21
|
+
"class_name": "MyContainer"
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
"migrations": [
|
|
26
|
+
{
|
|
27
|
+
"tag": "v1",
|
|
28
|
+
"new_sqlite_classes": ["MyContainer"] // Must use new_sqlite_classes
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### TOML Format
|
|
35
|
+
|
|
36
|
+
```toml
|
|
37
|
+
name = "my-worker"
|
|
38
|
+
main = "src/index.ts"
|
|
39
|
+
compatibility_date = "2026-01-10"
|
|
40
|
+
|
|
41
|
+
[[containers]]
|
|
42
|
+
class_name = "MyContainer"
|
|
43
|
+
image = "./Dockerfile"
|
|
44
|
+
max_instances = 10
|
|
45
|
+
|
|
46
|
+
[[durable_objects.bindings]]
|
|
47
|
+
name = "MY_CONTAINER"
|
|
48
|
+
class_name = "MyContainer"
|
|
49
|
+
|
|
50
|
+
[[migrations]]
|
|
51
|
+
tag = "v1"
|
|
52
|
+
new_sqlite_classes = ["MyContainer"]
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Key config requirements:
|
|
56
|
+
- `image` - Path to Dockerfile or directory conta
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
## Best Practices
|
|
2
|
+
|
|
3
|
+
1. **Use `@cloudflare/containers` package** - Cleaner API than raw Durable Object methods
|
|
4
|
+
|
|
5
|
+
2. **Set appropriate `sleepAfter`** - Balance resource usage vs cold start latency
|
|
6
|
+
- Short-lived jobs: "5m"
|
|
7
|
+
- Session-based: "30m" - "2h"
|
|
8
|
+
- Long-running services: "2h" or longer
|
|
9
|
+
|
|
10
|
+
3. **Choose routing pattern based on use case:**
|
|
11
|
+
- Stateless services → `getRandom()` load balancing
|
|
12
|
+
- Stateful sessions → `getByName()` with session/user ID
|
|
13
|
+
- Short-lived jobs → Unique IDs with explicit lifecycle control
|
|
14
|
+
|
|
15
|
+
4. **Pass secrets securely:**
|
|
16
|
+
- Use Worker Secrets or Secret Store, not hard-coded values
|
|
17
|
+
- Read KV/secrets asynchronously when starting containers
|
|
18
|
+
- Don't log sensitive environment variables
|
|
19
|
+
|
|
20
|
+
5. **Design for container restarts:**
|
|
21
|
+
- Containers can stop after
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
## Common Use Cases
|
|
2
|
+
|
|
3
|
+
### Stateful Backend (Session-based)
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
import { Container } from "@cloudflare/containers";
|
|
7
|
+
|
|
8
|
+
export class SessionBackend extends Container {
|
|
9
|
+
defaultPort = 3000;
|
|
10
|
+
sleepAfter = "30m";
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export default {
|
|
14
|
+
async fetch(request: Request, env: Env) {
|
|
15
|
+
const { sessionId } = await request.json();
|
|
16
|
+
// Each session gets dedicated container instance
|
|
17
|
+
const container = env.SESSION_BACKEND.getByName(sessionId);
|
|
18
|
+
return container.fetch(request);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Short-Lived Code Execution
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
export class CodeSandbox extends Container {
|
|
27
|
+
defaultPort = 8080;
|
|
28
|
+
sleepAfter = "5m"; // Quick cleanup
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export default {
|
|
32
|
+
async fetch(request: Request, env: Env) {
|
|
33
|
+
const { code, executionId } = await request.json();
|
|
34
|
+
|
|
35
|
+
const container = env.CODE_SANDBOX.getByName(executionId);
|
|
36
|
+
await container.startAndWaitForPorts({
|
|
37
|
+
startOptions: {
|
|
38
|
+
envVars: {
|
|
39
|
+
USER_CODE: Buffer.from(code).toString('base64'),
|
|
40
|
+
TIMEOUT: "3
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Cloudflare Cron Triggers
|
|
2
|
+
|
|
3
|
+
Schedule Workers execution using cron expressions. Runs on Cloudflare's global network during underutilized periods.
|
|
4
|
+
|
|
5
|
+
## Key Features
|
|
6
|
+
|
|
7
|
+
- **UTC-only execution** - All schedules run on UTC time
|
|
8
|
+
- **5-field cron syntax** - Quartz scheduler extensions (L, W, #)
|
|
9
|
+
- **Global propagation** - 15min deployment delay
|
|
10
|
+
- **At-least-once delivery** - Rare duplicate executions possible
|
|
11
|
+
- **Workflow integration** - Trigger long-running multi-step tasks
|
|
12
|
+
|
|
13
|
+
## Cron Syntax
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
┌─────────── minute (0-59)
|
|
17
|
+
│ ┌───────── hour (0-23)
|
|
18
|
+
│ │ ┌─────── day of month (1-31)
|
|
19
|
+
│ │ │ ┌───── month (1-12, JAN-DEC)
|
|
20
|
+
│ │ │ │ ┌─── day of week (1-7, SUN-SAT, 1=Sunday)
|
|
21
|
+
* * * * *
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Special chars:** `*` (any), `,` (list), `-` (range), `/` (step), `L` (last), `W` (weekday), `#` (nth)
|
|
25
|
+
|
|
26
|
+
## Common Schedules
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
*/5 * * * * # Every 5 minutes
|
|
30
|
+
0 * * * * # Hourly
|
|
31
|
+
0 2 * * * # Daily 2am UTC (off-peak)
|
|
32
|
+
0 9 * * MON-FRI # Weekdays 9am UTC
|
|
33
|
+
0 0 1 * * # Monthly 1st midnight UTC
|
|
34
|
+
0 9 L * * # Last day of month 9am UTC
|
|
35
|
+
0 10 * * MON#2 # 2nd Monday 10am UTC
|
|
36
|
+
*/10 9-17 * * MON-FRI # Every 10min, 9am-5pm weekdays
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Quick Start
|
|
40
|
+
|
|
41
|
+
**wrangler.jsonc:**
|
|
42
|
+
```jsonc
|
|
43
|
+
{
|
|
44
|
+
"name": "my-cron-worker",
|
|
45
|
+
"triggers": {
|
|
46
|
+
"crons": ["*/5 * * * *", "0 2 * * *"]
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Handler:**
|
|
52
|
+
```typescript
|
|
53
|
+
export default {
|
|
54
|
+
async scheduled(
|
|
55
|
+
controller: ScheduledController,
|
|
56
|
+
env: Env,
|
|
57
|
+
ctx: ExecutionContext,
|
|
58
|
+
): Promise<void> {
|
|
59
|
+
console.log("Cron:", controller.cron);
|
|
60
|
+
console.log("Time:", new Date(controller.scheduledTime));
|
|
61
|
+
|
|
62
|
+
ctx.waitUntil(asyncTask(env)); // Non-blocking
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Test locally:**
|
|
68
|
+
```bash
|
|
69
|
+
npx wrangler dev
|
|
70
|
+
curl "http://localhost:8787/__scheduled?cron=*/5+*+*+*+*"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Limits
|
|
74
|
+
|
|
75
|
+
- **Free:** 3 triggers/worker, 10ms CPU
|
|
76
|
+
- **Paid:** Unlimited triggers, 50ms CPU
|
|
77
|
+
- **Propagation:** 15min global deployment
|
|
78
|
+
- **Timezone:** UTC only
|
|
79
|
+
|
|
80
|
+
## See Also
|
|
81
|
+
|
|
82
|
+
- [configuration.md](./configuration.md) - wrangler config, env-specific schedules
|
|
83
|
+
- [api.md](./api.md) - ScheduledController, handler params
|
|
84
|
+
- [patterns.md](./patterns.md) - Use cases, batch processing, monitoring
|
|
85
|
+
- [gotchas.md](./gotchas.md) - Timezone issues, debugging, limits
|