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,169 @@
|
|
|
1
|
+
# API Operations
|
|
2
|
+
|
|
3
|
+
## Deploy User Worker
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
curl -X PUT \
|
|
7
|
+
"https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/workers/dispatch/namespaces/$NAMESPACE/scripts/$SCRIPT_NAME" \
|
|
8
|
+
-H "Authorization: Bearer $API_TOKEN" \
|
|
9
|
+
-F 'metadata={"main_module": "worker.mjs"};type=application/json' \
|
|
10
|
+
-F 'worker.mjs=@worker.mjs;type=application/javascript+module'
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### TypeScript SDK
|
|
14
|
+
```typescript
|
|
15
|
+
import Cloudflare from "cloudflare";
|
|
16
|
+
|
|
17
|
+
const client = new Cloudflare({ apiToken: process.env.API_TOKEN });
|
|
18
|
+
|
|
19
|
+
const scriptFile = new File([scriptContent], `${scriptName}.mjs`, {
|
|
20
|
+
type: "application/javascript+module",
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
await client.workersForPlatforms.dispatch.namespaces.scripts.update(
|
|
24
|
+
namespace, scriptName,
|
|
25
|
+
{
|
|
26
|
+
account_id: accountId,
|
|
27
|
+
metadata: { main_module: `${scriptName}.mjs` },
|
|
28
|
+
files: [scriptFile],
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Deploy with Bindings
|
|
34
|
+
```bash
|
|
35
|
+
curl -X PUT ".../scripts/$SCRIPT_NAME" \
|
|
36
|
+
-F 'metadata={
|
|
37
|
+
"main_module": "worker.mjs",
|
|
38
|
+
"bindings": [
|
|
39
|
+
{"type": "kv_namespace", "name": "MY_KV", "namespace_id": "'$KV_ID'"}
|
|
40
|
+
],
|
|
41
|
+
"tags": ["customer-123", "production"],
|
|
42
|
+
"compatibility_date": "2024-01-01"
|
|
43
|
+
};type=application/json' \
|
|
44
|
+
-F 'worker.mjs=@worker.mjs;type=application/javascript+module'
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## List/Delete Workers
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# List
|
|
51
|
+
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/workers/dispatch/namespaces/$NAMESPACE/scripts" \
|
|
52
|
+
-H "Authorization: Bearer $API_TOKEN"
|
|
53
|
+
|
|
54
|
+
# Delete by name
|
|
55
|
+
curl -X DELETE ".../scripts/$SCRIPT_NAME" -H "Authorization: Bearer $API_TOKEN"
|
|
56
|
+
|
|
57
|
+
# Delete by tag
|
|
58
|
+
curl -X DELETE ".../scripts?tags=customer-123%3Ayes" -H "Authorization: Bearer $API_TOKEN"
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Static Assets
|
|
62
|
+
|
|
63
|
+
**3-step process:** Create session → Upload files → Deploy Worker
|
|
64
|
+
|
|
65
|
+
### 1. Create Upload Session
|
|
66
|
+
```bash
|
|
67
|
+
curl -X POST ".../scripts/$SCRIPT_NAME/assets-upload-session" \
|
|
68
|
+
-H "Authorization: Bearer $API_TOKEN" \
|
|
69
|
+
-d '{
|
|
70
|
+
"manifest": {
|
|
71
|
+
"/index.html": {"hash": "08f1dfda4574284ab3c21666d1ee8c7d4", "size": 1234}
|
|
72
|
+
}
|
|
73
|
+
}'
|
|
74
|
+
# Returns: jwt, buckets
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Hash:** First 16 bytes (32 hex chars) of SHA-256
|
|
78
|
+
|
|
79
|
+
### 2. Upload Files
|
|
80
|
+
```bash
|
|
81
|
+
curl -X POST ".../workers/assets/upload?base64=true" \
|
|
82
|
+
-H "Authorization: Bearer $UPLOAD_JWT" \
|
|
83
|
+
-F '08f1dfda4574284ab3c21666d1ee8c7d4=<BASE64_CONTENT>'
|
|
84
|
+
# Returns: completion jwt
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 3. Deploy with Assets
|
|
88
|
+
```bash
|
|
89
|
+
curl -X PUT ".../scripts/$SCRIPT_NAME" \
|
|
90
|
+
-F 'metadata={
|
|
91
|
+
"main_module": "index.js",
|
|
92
|
+
"assets": {"jwt": "<COMPLETION_TOKEN>"},
|
|
93
|
+
"bindings": [{"type": "assets", "name": "ASSETS"}]
|
|
94
|
+
};type=application/json' \
|
|
95
|
+
-F 'index.js=export default {...};type=application/javascript+module'
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**Asset Isolation:** Assets shared across namespace. For strict isolation, salt hash:
|
|
99
|
+
```typescript
|
|
100
|
+
const hash = sha256(accountId + fileContents).slice(0, 32);
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Dispatch Workers
|
|
104
|
+
|
|
105
|
+
### Subdomain Routing
|
|
106
|
+
```typescript
|
|
107
|
+
export default {
|
|
108
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
109
|
+
const userWorkerName = new URL(request.url).hostname.split(".")[0];
|
|
110
|
+
const userWorker = env.DISPATCHER.get(userWorkerName);
|
|
111
|
+
return await userWorker.fetch(request);
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Path Routing
|
|
117
|
+
```typescript
|
|
118
|
+
const pathParts = new URL(request.url).pathname.split("/").filter(Boolean);
|
|
119
|
+
const userWorker = env.DISPATCHER.get(pathParts[0]);
|
|
120
|
+
return await userWorker.fetch(request);
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### KV Routing
|
|
124
|
+
```typescript
|
|
125
|
+
const hostname = new URL(request.url).hostname;
|
|
126
|
+
const userWorkerName = await env.ROUTING_KV.get(hostname);
|
|
127
|
+
const userWorker = env.DISPATCHER.get(userWorkerName);
|
|
128
|
+
return await userWorker.fetch(request);
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Outbound Workers
|
|
132
|
+
|
|
133
|
+
Control external fetch from user Workers:
|
|
134
|
+
|
|
135
|
+
### Configure
|
|
136
|
+
```typescript
|
|
137
|
+
const userWorker = env.DISPATCHER.get(
|
|
138
|
+
workerName, {},
|
|
139
|
+
{ outbound: { customer_context: { customer_name: workerName, url: request.url } } }
|
|
140
|
+
);
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Implement
|
|
144
|
+
```typescript
|
|
145
|
+
export default {
|
|
146
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
147
|
+
const customerName = env.customer_name;
|
|
148
|
+
const url = new URL(request.url);
|
|
149
|
+
|
|
150
|
+
// Block domains
|
|
151
|
+
if (["malicious.com"].some(d => url.hostname.includes(d))) {
|
|
152
|
+
return new Response("Blocked", { status: 403 });
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Inject auth
|
|
156
|
+
if (url.hostname === "api.example.com") {
|
|
157
|
+
const headers = new Headers(request.headers);
|
|
158
|
+
headers.set("Authorization", `Bearer ${generateJWT(customerName)}`);
|
|
159
|
+
return fetch(new Request(request, { headers }));
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return fetch(request);
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Note:** Doesn't intercept DO/mTLS fetch.
|
|
168
|
+
|
|
169
|
+
See [README.md](./README.md), [configuration.md](./configuration.md), [patterns.md](./patterns.md), [gotchas.md](./gotchas.md)
|
package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/configuration.md
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# Configuration
|
|
2
|
+
|
|
3
|
+
## Dispatch Namespace Binding
|
|
4
|
+
|
|
5
|
+
### wrangler.jsonc
|
|
6
|
+
```jsonc
|
|
7
|
+
{
|
|
8
|
+
"$schema": "./node_modules/wrangler/config-schema.json",
|
|
9
|
+
"dispatch_namespaces": [{
|
|
10
|
+
"binding": "DISPATCHER",
|
|
11
|
+
"namespace": "production"
|
|
12
|
+
}]
|
|
13
|
+
}
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### wrangler.toml
|
|
17
|
+
```toml
|
|
18
|
+
[[dispatch_namespaces]]
|
|
19
|
+
binding = "DISPATCHER"
|
|
20
|
+
namespace = "production"
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### With Outbound Worker
|
|
24
|
+
```jsonc
|
|
25
|
+
{
|
|
26
|
+
"dispatch_namespaces": [{
|
|
27
|
+
"binding": "DISPATCHER",
|
|
28
|
+
"namespace": "production",
|
|
29
|
+
"outbound": {
|
|
30
|
+
"service": "outbound-worker",
|
|
31
|
+
"parameters": ["customer_context"]
|
|
32
|
+
}
|
|
33
|
+
}]
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Wrangler Commands
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
wrangler dispatch-namespace list
|
|
41
|
+
wrangler dispatch-namespace get production
|
|
42
|
+
wrangler dispatch-namespace create production
|
|
43
|
+
wrangler dispatch-namespace delete staging
|
|
44
|
+
wrangler dispatch-namespace rename old new
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Custom Limits
|
|
48
|
+
|
|
49
|
+
Set CPU time and subrequest limits per invocation:
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
const userWorker = env.DISPATCHER.get(
|
|
53
|
+
workerName,
|
|
54
|
+
{},
|
|
55
|
+
{
|
|
56
|
+
limits: {
|
|
57
|
+
cpuMs: 10, // Max CPU ms
|
|
58
|
+
subRequests: 5 // Max fetch() calls
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
);
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Handle limit violations:
|
|
65
|
+
```typescript
|
|
66
|
+
try {
|
|
67
|
+
return await userWorker.fetch(request);
|
|
68
|
+
} catch (e) {
|
|
69
|
+
if (e.message.includes("CPU time limit")) {
|
|
70
|
+
return new Response("CPU limit exceeded", { status: 429 });
|
|
71
|
+
}
|
|
72
|
+
throw e;
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Static Assets
|
|
77
|
+
|
|
78
|
+
Deploy HTML/CSS/images with Workers. See [api.md](./api.md#static-assets) for upload process.
|
|
79
|
+
|
|
80
|
+
### Wrangler
|
|
81
|
+
```jsonc
|
|
82
|
+
{
|
|
83
|
+
"name": "customer-site",
|
|
84
|
+
"main": "./src/index.js",
|
|
85
|
+
"assets": {
|
|
86
|
+
"directory": "./public",
|
|
87
|
+
"binding": "ASSETS"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
npx wrangler deploy --name customer-site --dispatch-namespace production
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Bindings
|
|
97
|
+
|
|
98
|
+
Supported: KV, D1, R2, Durable Objects, Analytics Engine, Service, Assets
|
|
99
|
+
|
|
100
|
+
Add via API metadata (see [api.md](./api.md#deploy-with-bindings)):
|
|
101
|
+
```json
|
|
102
|
+
{
|
|
103
|
+
"bindings": [
|
|
104
|
+
{"type": "kv_namespace", "name": "USER_KV", "namespace_id": "..."},
|
|
105
|
+
{"type": "r2_bucket", "name": "STORAGE", "bucket_name": "..."},
|
|
106
|
+
{"type": "d1", "name": "DB", "id": "..."}
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Preserve existing bindings:
|
|
112
|
+
```json
|
|
113
|
+
{
|
|
114
|
+
"bindings": [{"type": "r2_bucket", "name": "STORAGE", "bucket_name": "new"}],
|
|
115
|
+
"keep_bindings": ["kv_namespace", "d1"]
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Tags
|
|
120
|
+
|
|
121
|
+
Organize/search Workers (max 8/script):
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
# Set tags
|
|
125
|
+
curl -X PUT ".../tags" -d '["customer-123", "pro", "production"]'
|
|
126
|
+
|
|
127
|
+
# Filter by tag
|
|
128
|
+
curl ".../scripts?tags=production%3Ayes"
|
|
129
|
+
|
|
130
|
+
# Delete by tag
|
|
131
|
+
curl -X DELETE ".../scripts?tags=customer-123%3Ayes"
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Common patterns: `customer-123`, `free|pro|enterprise`, `production|staging`
|
|
135
|
+
|
|
136
|
+
See [README.md](./README.md), [api.md](./api.md), [patterns.md](./patterns.md), [gotchas.md](./gotchas.md)
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# Gotchas & Limits
|
|
2
|
+
|
|
3
|
+
## Limits
|
|
4
|
+
|
|
5
|
+
- **Max 8 tags per Worker**
|
|
6
|
+
- **Upload session JWT valid 1 hour**
|
|
7
|
+
- **Completion token valid 1 hour**
|
|
8
|
+
- **No limits on Workers per namespace** (unlike regular Workers)
|
|
9
|
+
- **User Workers run in untrusted mode** (no `request.cf` access)
|
|
10
|
+
- **Outbound Workers don't intercept DO/mTLS fetch**
|
|
11
|
+
|
|
12
|
+
## Security
|
|
13
|
+
|
|
14
|
+
### User Worker Restrictions
|
|
15
|
+
- Run in untrusted mode
|
|
16
|
+
- No access to `request.cf` object
|
|
17
|
+
- Automatic isolation from other customers
|
|
18
|
+
- Never share cache
|
|
19
|
+
|
|
20
|
+
### Outbound Worker Gaps
|
|
21
|
+
- Doesn't intercept Durable Object fetch
|
|
22
|
+
- Doesn't intercept mTLS binding fetch
|
|
23
|
+
- Plan accordingly for complete egress control
|
|
24
|
+
|
|
25
|
+
### Asset Isolation
|
|
26
|
+
Assets shared across namespace by hash. For strict isolation:
|
|
27
|
+
```typescript
|
|
28
|
+
const hash = sha256(accountId + fileContents).slice(0, 32);
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Never expose upload JWTs to clients.
|
|
32
|
+
|
|
33
|
+
## Error Handling
|
|
34
|
+
|
|
35
|
+
### Worker Not Found
|
|
36
|
+
```typescript
|
|
37
|
+
try {
|
|
38
|
+
const userWorker = env.DISPATCHER.get(name);
|
|
39
|
+
return await userWorker.fetch(request);
|
|
40
|
+
} catch (e) {
|
|
41
|
+
if (e.message.startsWith("Worker not found")) {
|
|
42
|
+
return new Response("Worker not found", { status: 404 });
|
|
43
|
+
}
|
|
44
|
+
return new Response(e.message, { status: 500 });
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Limit Violations
|
|
49
|
+
```typescript
|
|
50
|
+
try {
|
|
51
|
+
return await userWorker.fetch(request);
|
|
52
|
+
} catch (e) {
|
|
53
|
+
if (e.message.includes("CPU time limit")) {
|
|
54
|
+
env.ANALYTICS.writeDataPoint({
|
|
55
|
+
indexes: [workerName],
|
|
56
|
+
blobs: ["cpu_limit_exceeded"],
|
|
57
|
+
});
|
|
58
|
+
return new Response("CPU limit exceeded", { status: 429 });
|
|
59
|
+
}
|
|
60
|
+
throw e;
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Troubleshooting
|
|
65
|
+
|
|
66
|
+
### Hostname Routing Issues
|
|
67
|
+
- Use `*/*` wildcard route to avoid DNS proxy issues
|
|
68
|
+
- Orange-to-orange: Customer proxied through CF → your CF domain
|
|
69
|
+
- Wildcard works regardless of proxy settings
|
|
70
|
+
|
|
71
|
+
### Binding Preservation
|
|
72
|
+
- Use `keep_bindings` to avoid losing existing bindings on update
|
|
73
|
+
- Document which resources bound to which Workers
|
|
74
|
+
|
|
75
|
+
### Tag Filtering
|
|
76
|
+
- URL encode tags: `tags=production%3Ayes`
|
|
77
|
+
- Avoid special chars: `,` and `&`
|
|
78
|
+
|
|
79
|
+
### Deploy Failures
|
|
80
|
+
- ES modules require multipart form upload
|
|
81
|
+
- Must specify `main_module` in metadata
|
|
82
|
+
- File type: `application/javascript+module`
|
|
83
|
+
|
|
84
|
+
### Static Assets
|
|
85
|
+
- Hash must be first 16 bytes (32 hex chars) of SHA-256
|
|
86
|
+
- Upload must happen within 1 hour of session creation
|
|
87
|
+
- Deploy must happen within 1 hour of upload completion
|
|
88
|
+
- Base64 encode file contents for upload
|
|
89
|
+
|
|
90
|
+
## TypeScript Types
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
interface Env {
|
|
94
|
+
DISPATCHER: DispatchNamespace;
|
|
95
|
+
ROUTING_KV: KVNamespace;
|
|
96
|
+
CUSTOMERS_KV: KVNamespace;
|
|
97
|
+
ANALYTICS: AnalyticsEngineDataset;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
interface DispatchNamespace {
|
|
101
|
+
get(
|
|
102
|
+
name: string,
|
|
103
|
+
options?: Record<string, unknown>,
|
|
104
|
+
config?: {
|
|
105
|
+
limits?: {
|
|
106
|
+
cpuMs?: number;
|
|
107
|
+
subRequests?: number;
|
|
108
|
+
};
|
|
109
|
+
outbound?: Record<string, unknown>;
|
|
110
|
+
}
|
|
111
|
+
): Fetcher;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
interface Fetcher {
|
|
115
|
+
fetch(request: Request): Promise<Response>;
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Common Mistakes
|
|
120
|
+
|
|
121
|
+
1. **Creating namespace per customer** → Use one namespace per environment
|
|
122
|
+
2. **Not handling Worker not found** → Always catch and handle gracefully
|
|
123
|
+
3. **Forgetting `keep_bindings`** → Existing bindings lost on update
|
|
124
|
+
4. **Not tagging Workers** → Can't bulk delete/filter
|
|
125
|
+
5. **Exposing upload JWTs** → Keep server-side only
|
|
126
|
+
6. **No limit tracking** → Use Analytics Engine for violations
|
|
127
|
+
7. **Not using wildcard routes** → Hit route limits, DNS issues
|
|
128
|
+
8. **Assuming DO/mTLS interception** → Outbound Worker doesn't catch these
|
|
129
|
+
|
|
130
|
+
See [README.md](./README.md), [configuration.md](./configuration.md), [api.md](./api.md), [patterns.md](./patterns.md)
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# Multi-Tenant Patterns
|
|
2
|
+
|
|
3
|
+
## Billing by Plan
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
interface Env {
|
|
7
|
+
DISPATCHER: DispatchNamespace;
|
|
8
|
+
CUSTOMERS_KV: KVNamespace;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export default {
|
|
12
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
13
|
+
const userWorkerName = new URL(request.url).hostname.split(".")[0];
|
|
14
|
+
const customerPlan = await env.CUSTOMERS_KV.get(userWorkerName);
|
|
15
|
+
|
|
16
|
+
const plans = {
|
|
17
|
+
enterprise: { cpuMs: 50, subRequests: 50 },
|
|
18
|
+
pro: { cpuMs: 20, subRequests: 20 },
|
|
19
|
+
free: { cpuMs: 10, subRequests: 5 },
|
|
20
|
+
};
|
|
21
|
+
const limits = plans[customerPlan as keyof typeof plans] || plans.free;
|
|
22
|
+
|
|
23
|
+
const userWorker = env.DISPATCHER.get(userWorkerName, {}, { limits });
|
|
24
|
+
return await userWorker.fetch(request);
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Resource Isolation
|
|
30
|
+
|
|
31
|
+
**Complete isolation:** Create unique resources per customer
|
|
32
|
+
- KV namespace per customer
|
|
33
|
+
- D1 database per customer
|
|
34
|
+
- R2 bucket per customer
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
const bindings = [{
|
|
38
|
+
type: "kv_namespace",
|
|
39
|
+
name: "USER_KV",
|
|
40
|
+
namespace_id: `customer-${customerId}-kv`
|
|
41
|
+
}];
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Hostname Routing
|
|
45
|
+
|
|
46
|
+
### Wildcard Route (Recommended)
|
|
47
|
+
Configure `*/*` route on SaaS domain → dispatch Worker
|
|
48
|
+
|
|
49
|
+
**Benefits:**
|
|
50
|
+
- Supports subdomains + custom vanity domains
|
|
51
|
+
- No route limits
|
|
52
|
+
- Programmatic control
|
|
53
|
+
- Works with any DNS proxy settings
|
|
54
|
+
|
|
55
|
+
**Setup:**
|
|
56
|
+
1. Cloudflare for SaaS custom hostnames
|
|
57
|
+
2. Fallback origin (dummy `A 192.0.2.0` if Worker is origin)
|
|
58
|
+
3. DNS CNAME to SaaS domain
|
|
59
|
+
4. `*/*` route → dispatch Worker
|
|
60
|
+
5. Routing logic in dispatch Worker
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
export default {
|
|
64
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
65
|
+
const hostname = new URL(request.url).hostname;
|
|
66
|
+
const hostnameData = await env.ROUTING_KV.get(`hostname:${hostname}`, { type: "json" });
|
|
67
|
+
|
|
68
|
+
if (!hostnameData?.workerName) {
|
|
69
|
+
return new Response("Hostname not configured", { status: 404 });
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const userWorker = env.DISPATCHER.get(hostnameData.workerName);
|
|
73
|
+
return await userWorker.fetch(request);
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Subdomain-Only
|
|
79
|
+
1. Wildcard DNS: `*.saas.com` → origin
|
|
80
|
+
2. Route: `*.saas.com/*` → dispatch Worker
|
|
81
|
+
3. Extract subdomain for routing
|
|
82
|
+
|
|
83
|
+
**Orange-to-Orange:** When customers use Cloudflare and CNAME to your domain, use `*/*` wildcard for consistent behavior.
|
|
84
|
+
|
|
85
|
+
## Observability
|
|
86
|
+
|
|
87
|
+
### Logpush
|
|
88
|
+
- Enable on dispatch Worker → captures all user Worker logs
|
|
89
|
+
- Filter by `Outcome` or `Script Name`
|
|
90
|
+
|
|
91
|
+
### Tail Workers
|
|
92
|
+
- Real-time logs with custom formatting
|
|
93
|
+
- Receives HTTP status, `console.log()`, exceptions, diagnostics
|
|
94
|
+
|
|
95
|
+
### Analytics Engine
|
|
96
|
+
```typescript
|
|
97
|
+
// Track violations
|
|
98
|
+
env.ANALYTICS.writeDataPoint({
|
|
99
|
+
indexes: [customerName],
|
|
100
|
+
blobs: ["cpu_limit_exceeded"],
|
|
101
|
+
});
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### GraphQL
|
|
105
|
+
```graphql
|
|
106
|
+
query {
|
|
107
|
+
viewer {
|
|
108
|
+
accounts(filter: {accountTag: $accountId}) {
|
|
109
|
+
workersInvocationsAdaptive(filter: {dispatchNamespaceName: "production"}) {
|
|
110
|
+
sum { requests errors cpuTime }
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Use Case Implementations
|
|
118
|
+
|
|
119
|
+
### AI Code Execution
|
|
120
|
+
```typescript
|
|
121
|
+
async function deployGeneratedCode(name: string, code: string) {
|
|
122
|
+
const file = new File([code], `${name}.mjs`, { type: "application/javascript+module" });
|
|
123
|
+
await client.workersForPlatforms.dispatch.namespaces.scripts.update("production", name, {
|
|
124
|
+
account_id: accountId,
|
|
125
|
+
metadata: { main_module: `${name}.mjs`, tags: [name, "ai-generated"] },
|
|
126
|
+
files: [file],
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Short limits for untrusted code
|
|
131
|
+
const userWorker = env.DISPATCHER.get(sessionId, {}, { limits: { cpuMs: 5, subRequests: 3 } });
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Edge Functions Platform
|
|
135
|
+
```typescript
|
|
136
|
+
// Route: /customer-id/function-name
|
|
137
|
+
const [customerId, functionName] = new URL(request.url).pathname.split("/").filter(Boolean);
|
|
138
|
+
const workerName = `${customerId}-${functionName}`;
|
|
139
|
+
const userWorker = env.DISPATCHER.get(workerName);
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Website Builder
|
|
143
|
+
- Deploy static assets + Worker code
|
|
144
|
+
- See [api.md](./api.md#static-assets) for full implementation
|
|
145
|
+
- Salt hashes for asset isolation
|
|
146
|
+
|
|
147
|
+
## Best Practices
|
|
148
|
+
|
|
149
|
+
### Architecture
|
|
150
|
+
- One namespace per environment (production, staging)
|
|
151
|
+
- Platform logic in dispatch Worker (auth, rate limiting, validation)
|
|
152
|
+
- Isolation automatic (no shared cache, untrusted mode)
|
|
153
|
+
|
|
154
|
+
### Routing
|
|
155
|
+
- Use `*/*` wildcard routes
|
|
156
|
+
- Store mappings in KV
|
|
157
|
+
- Handle missing Workers gracefully
|
|
158
|
+
|
|
159
|
+
### Limits & Security
|
|
160
|
+
- Set custom limits by plan
|
|
161
|
+
- Track violations with Analytics Engine
|
|
162
|
+
- Use outbound Workers for egress control
|
|
163
|
+
- Sanitize responses
|
|
164
|
+
|
|
165
|
+
### Tags
|
|
166
|
+
- Tag all Workers: customer ID, plan, environment
|
|
167
|
+
- Enable bulk operations
|
|
168
|
+
- Filter efficiently
|
|
169
|
+
|
|
170
|
+
See [README.md](./README.md), [configuration.md](./configuration.md), [api.md](./api.md), [gotchas.md](./gotchas.md)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Cloudflare Workers Playground Skill Reference
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Cloudflare Workers Playground is a browser-based sandbox for instantly experimenting with, testing, and deploying Cloudflare Workers without authentication or setup. This skill provides patterns, APIs, and best practices specifically for Workers Playground development....
|
|
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,20 @@
|
|
|
1
|
+
### HTTP Test Panel
|
|
2
|
+
|
|
3
|
+
Switch to **HTTP** tab to test raw HTTP requests:
|
|
4
|
+
- Change HTTP method (GET, POST, PUT, DELETE, etc.)
|
|
5
|
+
- Add/edit headers
|
|
6
|
+
- Modify request body
|
|
7
|
+
- Send request to Worker
|
|
8
|
+
|
|
9
|
+
### Sharing Code
|
|
10
|
+
|
|
11
|
+
Click **Copy Link** to generate shareable URL with embedded code. Links never expire and can be bookmarked.
|
|
12
|
+
|
|
13
|
+
### Deploy from Playground
|
|
14
|
+
|
|
15
|
+
Click **Deploy** button to:
|
|
16
|
+
1. Log in to Cloudflare account (if not already)
|
|
17
|
+
2. Review Worker code
|
|
18
|
+
3. Deploy to Cloudflare's global network
|
|
19
|
+
4. Get unique `*.workers.dev` URL
|
|
20
|
+
5. Add custom domains, bindings, etc. from dashboard
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
## Best Practices
|
|
2
|
+
|
|
3
|
+
### 1. Use Async/Await
|
|
4
|
+
Always use `async/await` for cleaner asynchronous code:
|
|
5
|
+
|
|
6
|
+
```javascript
|
|
7
|
+
// Good
|
|
8
|
+
export default {
|
|
9
|
+
async fetch(request, env, ctx) {
|
|
10
|
+
const response = await fetch('https://api.example.com');
|
|
11
|
+
const data = await response.json();
|
|
12
|
+
return new Response(JSON.stringify(data));
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
// Avoid
|
|
17
|
+
export default {
|
|
18
|
+
fetch(request, env, ctx) {
|
|
19
|
+
return fetch('https://api.example.com')
|
|
20
|
+
.then(response => response.json())
|
|
21
|
+
.then(data => new Response(JSON.stringify(data)));
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### 2. Clone Responses Before Reading
|
|
27
|
+
Response bodies can only be read once:
|
|
28
|
+
|
|
29
|
+
```javascript
|
|
30
|
+
export default {
|
|
31
|
+
async fetch(request, env, ctx) {
|
|
32
|
+
const response = await fetch('https://api.example.com');
|
|
33
|
+
|
|
34
|
+
// Clone before caching
|
|
35
|
+
ctx.waitUntil(cach
|