opencodekit 0.15.4 → 0.15.6
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 +2 -2
- package/dist/template/.opencode/agent/explore.md +13 -12
- package/dist/template/.opencode/command/cloudflare.md +70 -0
- package/dist/template/.opencode/memory/observations/2026-01-19-learning-oh-my-opencode-slim-vs-opencodekit-templ.md +27 -0
- package/dist/template/.opencode/package.json +1 -1
- package/dist/template/.opencode/plugin/sessions.ts +38 -4
- 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/dist/template/.opencode/tool/memory-read.ts +64 -44
- package/dist/template/.opencode/tool/memory-search.ts +9 -2
- package/dist/template/.opencode/tool/memory-update.ts +59 -47
- package/dist/template/.opencode/tool/observation.ts +16 -2
- package/package.json +1 -1
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Workers Runtime APIs
|
|
2
|
+
|
|
3
|
+
## Fetch Handler
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export default {
|
|
7
|
+
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
|
|
8
|
+
const url = new URL(request.url);
|
|
9
|
+
if (request.method === 'POST' && url.pathname === '/api') {
|
|
10
|
+
const body = await request.json();
|
|
11
|
+
return new Response(JSON.stringify({ id: 1 }), {
|
|
12
|
+
headers: { 'Content-Type': 'application/json' }
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
return fetch(request); // Subrequest to origin
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Execution Context
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
ctx.waitUntil(logAnalytics(request)); // Background work, don't block response
|
|
24
|
+
ctx.passThroughOnException(); // Failover to origin on error
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Never** `await` background operations - use `ctx.waitUntil()`.
|
|
28
|
+
|
|
29
|
+
## Bindings
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
// KV
|
|
33
|
+
await env.MY_KV.get('key');
|
|
34
|
+
await env.MY_KV.put('key', 'value', { expirationTtl: 3600 });
|
|
35
|
+
|
|
36
|
+
// R2
|
|
37
|
+
const obj = await env.MY_BUCKET.get('file.txt');
|
|
38
|
+
await env.MY_BUCKET.put('file.txt', 'content');
|
|
39
|
+
|
|
40
|
+
// D1
|
|
41
|
+
const result = await env.DB.prepare('SELECT * FROM users WHERE id = ?').bind(1).first();
|
|
42
|
+
|
|
43
|
+
// Queues
|
|
44
|
+
await env.MY_QUEUE.send({ timestamp: Date.now() });
|
|
45
|
+
|
|
46
|
+
// Secrets/vars
|
|
47
|
+
const key = env.API_KEY;
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Cache API
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
const cache = caches.default;
|
|
54
|
+
let response = await cache.match(request);
|
|
55
|
+
|
|
56
|
+
if (!response) {
|
|
57
|
+
response = await fetch(request);
|
|
58
|
+
response = new Response(response.body, response);
|
|
59
|
+
response.headers.set('Cache-Control', 'max-age=3600');
|
|
60
|
+
ctx.waitUntil(cache.put(request, response.clone())); // Clone before caching
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## HTMLRewriter
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
return new HTMLRewriter()
|
|
68
|
+
.on('a[href]', {
|
|
69
|
+
element(el) {
|
|
70
|
+
const href = el.getAttribute('href');
|
|
71
|
+
if (href?.startsWith('http://')) {
|
|
72
|
+
el.setAttribute('href', href.replace('http://', 'https://'));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
.transform(response);
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Use cases**: A/B testing, analytics injection, link rewriting
|
|
80
|
+
|
|
81
|
+
## WebSockets
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
const [client, server] = Object.values(new WebSocketPair());
|
|
85
|
+
|
|
86
|
+
server.accept();
|
|
87
|
+
server.addEventListener('message', event => {
|
|
88
|
+
server.send(`Echo: ${event.data}`);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
return new Response(null, { status: 101, webSocket: client });
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Durable Objects
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
export class Counter {
|
|
98
|
+
private value = 0;
|
|
99
|
+
|
|
100
|
+
constructor(private state: DurableObjectState) {
|
|
101
|
+
state.blockConcurrencyWhile(async () => {
|
|
102
|
+
this.value = (await state.storage.get('value')) || 0;
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async fetch(request: Request): Promise<Response> {
|
|
107
|
+
if (new URL(request.url).pathname === '/increment') {
|
|
108
|
+
await this.state.storage.put('value', ++this.value);
|
|
109
|
+
}
|
|
110
|
+
return new Response(String(this.value));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Usage: const stub = env.COUNTER.get(env.COUNTER.idFromName('global'));
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**When to use**: Real-time collaboration, rate limiting, strongly consistent state
|
|
118
|
+
|
|
119
|
+
## Other Handlers
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
// Cron: async scheduled(event, env, ctx) { ctx.waitUntil(doCleanup(env)); }
|
|
123
|
+
// Queue: async queue(batch) { for (const msg of batch.messages) { await process(msg.body); msg.ack(); } }
|
|
124
|
+
// Tail: async tail(events, env) { for (const e of events) if (e.outcome === 'exception') await log(e); }
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Service Bindings
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
return env.SERVICE_B.fetch(request); // Worker-to-worker RPC, zero latency
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## See Also
|
|
134
|
+
|
|
135
|
+
- [Configuration](./configuration.md) - Binding setup
|
|
136
|
+
- [Patterns](./patterns.md) - Common workflows
|
|
137
|
+
- [KV](../kv/README.md), [D1](../d1/README.md), [R2](../r2/README.md), [Durable Objects](../durable-objects/README.md), [Queues](../queues/README.md)
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Workers Configuration
|
|
2
|
+
|
|
3
|
+
## wrangler.jsonc (Recommended)
|
|
4
|
+
|
|
5
|
+
```jsonc
|
|
6
|
+
{
|
|
7
|
+
"$schema": "./node_modules/wrangler/config-schema.json",
|
|
8
|
+
"name": "my-worker",
|
|
9
|
+
"main": "src/index.ts",
|
|
10
|
+
"compatibility_date": "2025-01-01", // Use current date for new projects
|
|
11
|
+
|
|
12
|
+
// Bindings (non-inheritable)
|
|
13
|
+
"vars": { "ENVIRONMENT": "production" },
|
|
14
|
+
"kv_namespaces": [{ "binding": "MY_KV", "id": "abc123" }],
|
|
15
|
+
"r2_buckets": [{ "binding": "MY_BUCKET", "bucket_name": "my-bucket" }],
|
|
16
|
+
"d1_databases": [{ "binding": "DB", "database_name": "my-db", "database_id": "xyz789" }],
|
|
17
|
+
|
|
18
|
+
// Environments
|
|
19
|
+
"env": {
|
|
20
|
+
"staging": {
|
|
21
|
+
"vars": { "ENVIRONMENT": "staging" },
|
|
22
|
+
"kv_namespaces": [{ "binding": "MY_KV", "id": "staging-id" }]
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Configuration Rules
|
|
29
|
+
|
|
30
|
+
**Inheritable**: `name`, `main`, `compatibility_date`, `routes`, `workers_dev`
|
|
31
|
+
**Non-inheritable**: All bindings (`vars`, `kv_namespaces`, `r2_buckets`, etc.)
|
|
32
|
+
**Top-level only**: `migrations`, `keep_vars`, `send_metrics`
|
|
33
|
+
|
|
34
|
+
**ALWAYS set `compatibility_date` to current date for new projects**
|
|
35
|
+
|
|
36
|
+
## Bindings
|
|
37
|
+
|
|
38
|
+
```jsonc
|
|
39
|
+
{
|
|
40
|
+
// Environment variables - access via env.VAR_NAME
|
|
41
|
+
"vars": { "ENVIRONMENT": "production" },
|
|
42
|
+
|
|
43
|
+
// KV (key-value storage)
|
|
44
|
+
"kv_namespaces": [{ "binding": "MY_KV", "id": "abc123" }],
|
|
45
|
+
|
|
46
|
+
// R2 (object storage)
|
|
47
|
+
"r2_buckets": [{ "binding": "MY_BUCKET", "bucket_name": "my-bucket" }],
|
|
48
|
+
|
|
49
|
+
// D1 (SQL database)
|
|
50
|
+
"d1_databases": [{ "binding": "DB", "database_name": "my-db", "database_id": "xyz789" }],
|
|
51
|
+
|
|
52
|
+
// Durable Objects (stateful coordination)
|
|
53
|
+
"durable_objects": {
|
|
54
|
+
"bindings": [{ "name": "COUNTER", "class_name": "Counter" }]
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
// Queues (message queues)
|
|
58
|
+
"queues": {
|
|
59
|
+
"producers": [{ "binding": "MY_QUEUE", "queue": "my-queue" }],
|
|
60
|
+
"consumers": [{ "queue": "my-queue", "max_batch_size": 10 }]
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
// Service bindings (worker-to-worker RPC)
|
|
64
|
+
"services": [{ "binding": "SERVICE_B", "service": "service-b" }],
|
|
65
|
+
|
|
66
|
+
// Analytics Engine
|
|
67
|
+
"analytics_engine_datasets": [{ "binding": "ANALYTICS" }]
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Secrets
|
|
72
|
+
|
|
73
|
+
Set via CLI (never in config):
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
npx wrangler secret put API_KEY
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Access: `env.API_KEY`
|
|
80
|
+
|
|
81
|
+
### Automatic Provisioning (Beta)
|
|
82
|
+
|
|
83
|
+
Bindings without IDs are auto-created:
|
|
84
|
+
|
|
85
|
+
```jsonc
|
|
86
|
+
{ "kv_namespaces": [{ "binding": "MY_KV" }] } // ID added on deploy
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Routes & Triggers
|
|
90
|
+
|
|
91
|
+
```jsonc
|
|
92
|
+
{
|
|
93
|
+
"routes": [
|
|
94
|
+
{ "pattern": "example.com/*", "zone_name": "example.com" }
|
|
95
|
+
],
|
|
96
|
+
"triggers": {
|
|
97
|
+
"crons": ["0 */6 * * *"] // Every 6 hours
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## TypeScript Setup
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
npm install -D @cloudflare/workers-types
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
`tsconfig.json`: `{ "compilerOptions": { "target": "ES2022", "lib": ["ES2022"], "types": ["@cloudflare/workers-types"] } }`
|
|
109
|
+
|
|
110
|
+
Define environment interface:
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
interface Env {
|
|
114
|
+
MY_KV: KVNamespace;
|
|
115
|
+
DB: D1Database;
|
|
116
|
+
API_KEY: string;
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Advanced Options
|
|
121
|
+
|
|
122
|
+
```jsonc
|
|
123
|
+
{
|
|
124
|
+
// Auto-locate compute near data sources
|
|
125
|
+
"placement": { "mode": "smart" },
|
|
126
|
+
|
|
127
|
+
// Enable Node.js built-ins
|
|
128
|
+
"compatibility_flags": ["nodejs_compat_v2"],
|
|
129
|
+
|
|
130
|
+
// Observability (10% sampling)
|
|
131
|
+
"observability": { "enabled": true, "head_sampling_rate": 0.1 }
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Deployment Commands
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
npx wrangler deploy # Production
|
|
139
|
+
npx wrangler deploy --env staging
|
|
140
|
+
npx wrangler deploy --dry-run # Validate only
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## See Also
|
|
144
|
+
|
|
145
|
+
- [API](./api.md) - Runtime APIs and bindings usage
|
|
146
|
+
- [Patterns](./patterns.md) - Deployment strategies
|
|
147
|
+
- [Wrangler](../wrangler/README.md) - CLI reference
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Workers Gotchas
|
|
2
|
+
|
|
3
|
+
## CPU Time Limits
|
|
4
|
+
|
|
5
|
+
**Standard**: 10ms CPU time
|
|
6
|
+
**Unbound**: 30ms CPU time
|
|
7
|
+
|
|
8
|
+
**Solutions**:
|
|
9
|
+
- Use `ctx.waitUntil()` for background work
|
|
10
|
+
- Offload heavy compute to Durable Objects
|
|
11
|
+
- Consider Workers AI for ML workloads
|
|
12
|
+
|
|
13
|
+
## No Persistent State in Worker
|
|
14
|
+
|
|
15
|
+
Workers are stateless between requests - module-level variables reset unpredictably.
|
|
16
|
+
|
|
17
|
+
**Solution**: Use KV, D1, or Durable Objects for persistent state.
|
|
18
|
+
|
|
19
|
+
## Response Bodies Are Streams
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
// ❌ BAD
|
|
23
|
+
const response = await fetch(url);
|
|
24
|
+
await logBody(response.text()); // First read
|
|
25
|
+
return response; // Body already consumed!
|
|
26
|
+
|
|
27
|
+
// ✅ GOOD
|
|
28
|
+
const response = await fetch(url);
|
|
29
|
+
const text = await response.text();
|
|
30
|
+
await logBody(text);
|
|
31
|
+
return new Response(text, response);
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## No Node.js Built-ins (by default)
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
// ❌ BAD
|
|
38
|
+
import fs from 'fs'; // Not available
|
|
39
|
+
|
|
40
|
+
// ✅ GOOD - use Workers APIs
|
|
41
|
+
const data = await env.MY_BUCKET.get('file.txt');
|
|
42
|
+
|
|
43
|
+
// OR enable Node.js compat
|
|
44
|
+
{ "compatibility_flags": ["nodejs_compat_v2"] }
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Fetch in Global Scope Forbidden
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
// ❌ BAD
|
|
51
|
+
const config = await fetch('/config.json'); // Error!
|
|
52
|
+
|
|
53
|
+
export default {
|
|
54
|
+
async fetch() { return new Response('OK'); },
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
// ✅ GOOD
|
|
58
|
+
export default {
|
|
59
|
+
async fetch() {
|
|
60
|
+
const config = await fetch('/config.json'); // OK
|
|
61
|
+
return new Response('OK');
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Limits
|
|
67
|
+
|
|
68
|
+
| Resource | Limit |
|
|
69
|
+
|----------|-------|
|
|
70
|
+
| Request size | 100 MB |
|
|
71
|
+
| Response size | Unlimited (streaming) |
|
|
72
|
+
| CPU time | 10ms (standard) / 30ms (unbound) |
|
|
73
|
+
| Subrequests | 1000 per request |
|
|
74
|
+
| KV reads | 1000 per request |
|
|
75
|
+
| KV write size | 25 MB |
|
|
76
|
+
| Environment size | 5 MB |
|
|
77
|
+
|
|
78
|
+
## Common Errors
|
|
79
|
+
|
|
80
|
+
### "Error: Body has already been used"
|
|
81
|
+
|
|
82
|
+
**Cause**: Response body read twice
|
|
83
|
+
**Solution**: Clone response before reading: `response.clone()`
|
|
84
|
+
|
|
85
|
+
### "Error: Too much CPU time used"
|
|
86
|
+
|
|
87
|
+
**Cause**: Exceeded CPU limit
|
|
88
|
+
**Solution**: Use `ctx.waitUntil()` for background work
|
|
89
|
+
|
|
90
|
+
### "Error: Subrequest depth limit exceeded"
|
|
91
|
+
|
|
92
|
+
**Cause**: Too many nested subrequests
|
|
93
|
+
**Solution**: Flatten request chain, use service bindings
|
|
94
|
+
|
|
95
|
+
## See Also
|
|
96
|
+
|
|
97
|
+
- [Patterns](./patterns.md) - Best practices
|
|
98
|
+
- [API](./api.md) - Runtime APIs
|
|
99
|
+
- [Configuration](./configuration.md) - Setup
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Workers Patterns
|
|
2
|
+
|
|
3
|
+
## Error Handling
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
class HTTPError extends Error {
|
|
7
|
+
constructor(public status: number, message: string) { super(message); }
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export default {
|
|
11
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
12
|
+
try {
|
|
13
|
+
return await handleRequest(request, env);
|
|
14
|
+
} catch (error) {
|
|
15
|
+
if (error instanceof HTTPError) {
|
|
16
|
+
return new Response(JSON.stringify({ error: error.message }), {
|
|
17
|
+
status: error.status, headers: { 'Content-Type': 'application/json' }
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return new Response('Internal Server Error', { status: 500 });
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## CORS
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
const corsHeaders = {
|
|
30
|
+
'Access-Control-Allow-Origin': '*',
|
|
31
|
+
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
|
|
32
|
+
'Access-Control-Allow-Headers': 'Content-Type',
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
if (request.method === 'OPTIONS') return new Response(null, { headers: corsHeaders });
|
|
36
|
+
// Add corsHeaders to response
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Routing
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
const router = { 'GET /api/users': handleGetUsers, 'POST /api/users': handleCreateUser };
|
|
43
|
+
|
|
44
|
+
const handler = router[`${request.method} ${url.pathname}`];
|
|
45
|
+
return handler ? handler(request, env) : new Response('Not Found', { status: 404 });
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Production**: Use Hono, itty-router, or Worktop
|
|
49
|
+
|
|
50
|
+
## Performance
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
// ❌ Sequential
|
|
54
|
+
const user = await fetch('/api/user/1');
|
|
55
|
+
const posts = await fetch('/api/posts?user=1');
|
|
56
|
+
|
|
57
|
+
// ✅ Parallel
|
|
58
|
+
const [user, posts] = await Promise.all([fetch('/api/user/1'), fetch('/api/posts?user=1')]);
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Streaming
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
const stream = new ReadableStream({
|
|
65
|
+
async start(controller) {
|
|
66
|
+
for (let i = 0; i < 1000; i++) {
|
|
67
|
+
controller.enqueue(new TextEncoder().encode(`Item ${i}\n`));
|
|
68
|
+
if (i % 100 === 0) await new Promise(r => setTimeout(r, 0));
|
|
69
|
+
}
|
|
70
|
+
controller.close();
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Transform Streams
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
response.body.pipeThrough(new TextDecoderStream()).pipeThrough(
|
|
79
|
+
new TransformStream({ transform(chunk, c) { c.enqueue(chunk.toUpperCase()); } })
|
|
80
|
+
).pipeThrough(new TextEncoderStream());
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Testing
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
import { describe, it, expect } from 'vitest';
|
|
87
|
+
import worker from '../src/index';
|
|
88
|
+
|
|
89
|
+
describe('Worker', () => {
|
|
90
|
+
it('returns 200', async () => {
|
|
91
|
+
const req = new Request('http://localhost/');
|
|
92
|
+
const env = { MY_VAR: 'test' };
|
|
93
|
+
const ctx = { waitUntil: () => {}, passThroughOnException: () => {} };
|
|
94
|
+
expect((await worker.fetch(req, env, ctx)).status).toBe(200);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Deployment
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
npx wrangler deploy # production
|
|
103
|
+
npx wrangler deploy --env staging
|
|
104
|
+
npx wrangler versions upload --message "Add feature"
|
|
105
|
+
npx wrangler rollback
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Monitoring
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
const start = Date.now();
|
|
112
|
+
const response = await handleRequest(request, env);
|
|
113
|
+
ctx.waitUntil(env.ANALYTICS.writeDataPoint({
|
|
114
|
+
doubles: [Date.now() - start], blobs: [request.url, String(response.status)]
|
|
115
|
+
}));
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Security
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
// Headers
|
|
122
|
+
const security = {
|
|
123
|
+
'X-Content-Type-Options': 'nosniff',
|
|
124
|
+
'X-Frame-Options': 'DENY',
|
|
125
|
+
'Content-Security-Policy': "default-src 'self'",
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
// Auth
|
|
129
|
+
const auth = request.headers.get('Authorization');
|
|
130
|
+
if (!auth?.startsWith('Bearer ')) return new Response('Unauthorized', { status: 401 });
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Rate Limiting
|
|
134
|
+
|
|
135
|
+
See [Durable Objects](../durable-objects/README.md) for stateful rate limiting patterns.
|
|
136
|
+
|
|
137
|
+
## Gradual Rollouts
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
const hash = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(userId));
|
|
141
|
+
const bucket = new Uint8Array(hash)[0] % 100;
|
|
142
|
+
if (bucket < rolloutPercent) return newFeature(request);
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## See Also
|
|
146
|
+
|
|
147
|
+
- [API](./api.md) - Runtime APIs
|
|
148
|
+
- [Gotchas](./gotchas.md) - Common issues
|
|
149
|
+
- [Configuration](./configuration.md) - Setup
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# Cloudflare Workers AI Skill
|
|
2
|
+
|
|
3
|
+
A comprehensive OpenCode skill for working with Cloudflare Workers AI.
|
|
4
|
+
|
|
5
|
+
## What This Skill Covers
|
|
6
|
+
|
|
7
|
+
This skill focuses **exclusively on Cloudflare Workers AI** - the serverless AI inference platform. It does NOT cover the broader Cloudflare platform (Workers, Pages, CDN, etc.) unless directly related to Workers AI usage.
|
|
8
|
+
|
|
9
|
+
### Topics Included
|
|
10
|
+
|
|
11
|
+
- **Core Concepts**: Bindings, model invocation patterns, naming conventions
|
|
12
|
+
- **Task-Specific Implementations**: Text generation, embeddings, image generation, speech recognition, translation, etc.
|
|
13
|
+
- **REST API Usage**: Authentication, endpoints, OpenAI compatibility
|
|
14
|
+
- **Wrangler Integration**: Setup, configuration, deployment
|
|
15
|
+
- **Pricing & Limits**: Neurons, rate limits, cost optimization
|
|
16
|
+
- **Common Patterns**: RAG, streaming, batch processing, error handling
|
|
17
|
+
- **AI Gateway**: Caching, rate limiting, analytics integration
|
|
18
|
+
- **Function Calling**: Both traditional and embedded approaches
|
|
19
|
+
- **Model Selection**: Guidelines for choosing the right model
|
|
20
|
+
- **TypeScript Support**: Types, interfaces, best practices
|
|
21
|
+
|
|
22
|
+
## How to Use This Skill
|
|
23
|
+
|
|
24
|
+
### Installation
|
|
25
|
+
|
|
26
|
+
1. Place `README.md` in your OpenCode skills directory
|
|
27
|
+
2. Load the skill when working on Workers AI projects
|
|
28
|
+
|
|
29
|
+
### When to Load This Skill
|
|
30
|
+
|
|
31
|
+
Load this skill when:
|
|
32
|
+
- Implementing AI inference in Cloudflare Workers
|
|
33
|
+
- Building RAG systems with Workers AI + Vectorize
|
|
34
|
+
- Optimizing Workers AI costs or performance
|
|
35
|
+
- Debugging Workers AI integration issues
|
|
36
|
+
- Setting up AI Gateway with Workers AI
|
|
37
|
+
- Implementing function calling with LLMs
|
|
38
|
+
|
|
39
|
+
### Example Usage
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# In OpenCode CLI
|
|
43
|
+
load-skill cloudflare-workers-ai
|
|
44
|
+
|
|
45
|
+
# Then ask questions like:
|
|
46
|
+
"How do I implement streaming with Workers AI?"
|
|
47
|
+
"What's the best embedding model for semantic search?"
|
|
48
|
+
"Show me how to do RAG with Vectorize"
|
|
49
|
+
"How do I handle rate limits?"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Skill Structure
|
|
53
|
+
|
|
54
|
+
The skill is organized into these sections:
|
|
55
|
+
|
|
56
|
+
1. **Overview** - What Workers AI is and when to use this skill
|
|
57
|
+
2. **Core Concepts** - Bindings, invocation patterns, model naming
|
|
58
|
+
3. **Task-Specific Patterns** - Code examples for each AI task type
|
|
59
|
+
4. **REST API** - Using Workers AI via HTTP endpoints
|
|
60
|
+
5. **Wrangler CLI** - Setup, config, deployment
|
|
61
|
+
6. **Pricing & Neurons** - Cost model and optimization
|
|
62
|
+
7. **Rate Limits** - Per-task and per-model limits
|
|
63
|
+
8. **RAG Pattern** - Complete retrieval-augmented generation example
|
|
64
|
+
9. **AI Gateway** - Integration patterns
|
|
65
|
+
10. **Common Patterns** - Error handling, streaming, batching, etc.
|
|
66
|
+
11. **Model Selection** - Choosing the right model
|
|
67
|
+
12. **Debugging** - Monitoring and troubleshooting
|
|
68
|
+
13. **Common Issues** - Known problems and solutions
|
|
69
|
+
14. **Pages Integration** - Using Workers AI in Pages Functions
|
|
70
|
+
15. **Advanced Topics** - LoRA adapters
|
|
71
|
+
16. **Architecture Patterns** - System design approaches
|
|
72
|
+
|
|
73
|
+
## Key Features
|
|
74
|
+
|
|
75
|
+
- ✅ **Complete Code Examples**: Every pattern has working code
|
|
76
|
+
- ✅ **TypeScript First**: Proper typing for all examples
|
|
77
|
+
- ✅ **Real-World Patterns**: RAG, streaming, batch processing
|
|
78
|
+
- ✅ **Cost Optimization**: Pricing info and model selection guidance
|
|
79
|
+
- ✅ **Troubleshooting**: Common issues and solutions
|
|
80
|
+
- ✅ **Best Practices**: Error handling, type safety, monitoring
|
|
81
|
+
|
|
82
|
+
## What's NOT Covered
|
|
83
|
+
|
|
84
|
+
This skill does NOT cover:
|
|
85
|
+
- General Cloudflare Workers programming (use Workers skill)
|
|
86
|
+
- Cloudflare Pages (unless specifically Workers AI integration)
|
|
87
|
+
- Cloudflare CDN, DNS, security features
|
|
88
|
+
- Vectorize (unless in context of Workers AI RAG)
|
|
89
|
+
- D1, KV, R2, Durable Objects (unless AI-specific usage)
|
|
90
|
+
|
|
91
|
+
## Maintenance
|
|
92
|
+
|
|
93
|
+
To keep this skill up to date:
|
|
94
|
+
- Check official docs: https://developers.cloudflare.com/workers-ai/
|
|
95
|
+
- Monitor model catalog: https://developers.cloudflare.com/workers-ai/models/
|
|
96
|
+
- Track pricing changes: https://developers.cloudflare.com/workers-ai/platform/pricing/
|
|
97
|
+
|
|
98
|
+
## Contributing
|
|
99
|
+
|
|
100
|
+
Found an issue or want to improve this skill?
|
|
101
|
+
1. Test changes against official Cloudflare Workers AI docs
|
|
102
|
+
2. Verify code examples work with latest Wrangler
|
|
103
|
+
3. Update pricing/limits if changed
|
|
104
|
+
4. Add new model examples as they're released
|
|
105
|
+
|
|
106
|
+
## Version History
|
|
107
|
+
|
|
108
|
+
- **v1.0** (2026-01-11): Initial comprehensive skill
|
|
109
|
+
- Full coverage of Workers AI API
|
|
110
|
+
- Code patterns for all task types
|
|
111
|
+
- Pricing, limits, troubleshooting
|
|
112
|
+
- RAG, streaming, function calling examples
|
|
113
|
+
|
|
114
|
+
## License
|
|
115
|
+
|
|
116
|
+
This skill documentation is provided as-is for use with OpenCode.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Cloudflare Workers for Platforms
|
|
2
|
+
|
|
3
|
+
Multi-tenant platform with isolated customer code execution at scale.
|
|
4
|
+
|
|
5
|
+
## Use Cases
|
|
6
|
+
|
|
7
|
+
- Multi-tenant SaaS running customer code
|
|
8
|
+
- AI-generated code execution in secure sandboxes
|
|
9
|
+
- Programmable platforms with isolated compute
|
|
10
|
+
- Edge functions/serverless platforms
|
|
11
|
+
- Website builders with static + dynamic content
|
|
12
|
+
- Unlimited app deployment at scale
|
|
13
|
+
|
|
14
|
+
**NOT for general Workers** - only for Workers for Platforms architecture.
|
|
15
|
+
|
|
16
|
+
## Architecture
|
|
17
|
+
|
|
18
|
+
**4 Components:**
|
|
19
|
+
1. **Dispatch Namespace** - Container for unlimited customer Workers, automatic isolation, untrusted mode
|
|
20
|
+
2. **Dynamic Dispatch Worker** - Entry point, routes requests, enforces platform logic (auth, limits, validation)
|
|
21
|
+
3. **User Workers** - Customer code in isolated sandboxes, API-deployed, optional bindings (KV/D1/R2/DO)
|
|
22
|
+
4. **Outbound Worker** (optional) - Intercepts external fetch, controls egress, logs subrequests
|
|
23
|
+
|
|
24
|
+
**Request Flow:**
|
|
25
|
+
```
|
|
26
|
+
Request → Dispatch Worker → Determines user Worker → env.DISPATCHER.get("customer")
|
|
27
|
+
→ User Worker executes (Outbound Worker for external fetch) → Response → Dispatch Worker → Client
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Key Features
|
|
31
|
+
|
|
32
|
+
- Unlimited Workers per namespace (no script limits)
|
|
33
|
+
- Automatic tenant isolation
|
|
34
|
+
- Custom CPU/subrequest limits per customer
|
|
35
|
+
- Hostname routing (subdomains/vanity domains)
|
|
36
|
+
- Egress/ingress control
|
|
37
|
+
- Static assets support
|
|
38
|
+
- Tags for bulk operations
|
|
39
|
+
|
|
40
|
+
## Quick Start
|
|
41
|
+
|
|
42
|
+
See [configuration.md](./configuration.md), [api.md](./api.md), [patterns.md](./patterns.md), [gotchas.md](./gotchas.md)
|
|
43
|
+
|
|
44
|
+
## Refs
|
|
45
|
+
|
|
46
|
+
- [Docs](https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/)
|
|
47
|
+
- [Starter Kit](https://github.com/cloudflare/templates/tree/main/worker-publisher-template)
|
|
48
|
+
- [VibeSDK](https://github.com/cloudflare/vibesdk)
|