opencodekit 0.15.3 → 0.15.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/template/.opencode/AGENTS.md +209 -77
- package/dist/template/.opencode/agent/plan.md +4 -0
- package/dist/template/.opencode/command/cloudflare.md +70 -0
- package/dist/template/.opencode/package.json +1 -1
- package/dist/template/.opencode/skill/cloudflare/SKILL.md +233 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/README.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/api.md +100 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/configuration.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/gotchas.md +59 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/patterns.md +89 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-gateway/README.md +695 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/api.md +38 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/configuration.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/gotchas.md +41 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/patterns.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/api.md +27 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/configuration.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/gotchas.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/patterns.md +36 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/README.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/api.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/configuration.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/gotchas.md +28 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/patterns.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/README.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/api.md +78 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/configuration.md +128 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/gotchas.md +51 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/patterns.md +145 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/api.md +50 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/configuration.md +53 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/gotchas.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/patterns.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/configuration.md +58 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/gotchas.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/patterns.md +37 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/README.md +71 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/api.md +168 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/configuration.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/gotchas.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/patterns.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/api.md +54 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/configuration.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/gotchas.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/patterns.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/c3/README.md +264 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/README.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/api.md +176 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/configuration.md +164 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/gotchas.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/patterns.md +180 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/api.md +43 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/configuration.md +56 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/gotchas.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/patterns.md +40 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/README.md +85 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/api.md +198 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/configuration.md +151 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/gotchas.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/patterns.md +122 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/README.md +92 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/api.md +141 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/gotchas.md +70 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/patterns.md +144 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/README.md +34 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/api.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/configuration.md +67 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/gotchas.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/patterns.md +158 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/api.md +89 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/configuration.md +116 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/gotchas.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/patterns.md +112 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/README.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/api.md +152 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/configuration.md +148 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/gotchas.md +158 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/patterns.md +255 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/api.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/configuration.md +63 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/gotchas.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/patterns.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-workers/README.md +598 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/api.md +137 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/configuration.md +133 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/gotchas.md +184 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/patterns.md +176 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/configuration.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/gotchas.md +23 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/patterns.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/README.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/api.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/configuration.md +92 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/gotchas.md +117 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/patterns.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/README.md +64 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/api.md +144 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/configuration.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/gotchas.md +187 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/patterns.md +211 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/README.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/api.md +240 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/gotchas.md +171 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/patterns.md +171 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/api.md +51 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/configuration.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/gotchas.md +36 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/README.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/api.md +200 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/configuration.md +228 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/gotchas.md +161 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/patterns.md +145 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/README.md +57 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/api.md +201 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/configuration.md +159 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/gotchas.md +151 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/patterns.md +190 -0
- package/dist/template/.opencode/skill/cloudflare/references/pipelines/README.md +664 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/README.md +107 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/api.md +194 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/configuration.md +216 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/gotchas.md +223 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/patterns.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/README.md +69 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/api.md +138 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/configuration.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/gotchas.md +112 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/patterns.md +155 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/README.md +61 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/api.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/configuration.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/gotchas.md +94 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/patterns.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/api.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/configuration.md +39 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/gotchas.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/patterns.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-sql/README.md +512 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/README.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/api.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/configuration.md +63 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/gotchas.md +75 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/patterns.md +102 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/README.md +81 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/api.md +164 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/configuration.md +147 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/gotchas.md +172 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/patterns.md +155 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/README.md +90 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/api.md +178 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/configuration.md +131 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/gotchas.md +156 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/patterns.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/README.md +58 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/api.md +182 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/configuration.md +140 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/gotchas.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/patterns.md +218 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/README.md +91 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/api.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/configuration.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/gotchas.md +87 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/patterns.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/README.md +15 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/api.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/configuration.md +33 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/gotchas.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/patterns.md +34 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/api.md +24 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/configuration.md +43 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/gotchas.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/patterns.md +40 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/configuration.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/gotchas.md +44 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/README.md +103 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/api.md +204 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/gotchas.md +131 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/patterns.md +152 -0
- package/dist/template/.opencode/skill/cloudflare/references/tail-workers/README.md +640 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/README.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/api.md +159 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/configuration.md +156 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/gotchas.md +207 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/patterns.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/README.md +82 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/api.md +105 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/configuration.md +113 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/gotchas.md +115 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/patterns.md +157 -0
- package/dist/template/.opencode/skill/cloudflare/references/turn/README.md +699 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/configuration.md +19 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/gotchas.md +27 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/patterns.md +41 -0
- package/dist/template/.opencode/skill/cloudflare/references/vectorize/README.md +682 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/configuration.md +44 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/gotchas.md +24 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/patterns.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/README.md +19 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/api.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/configuration.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/gotchas.md +28 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/patterns.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/README.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/api.md +199 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/configuration.md +185 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/gotchas.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/patterns.md +216 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/README.md +96 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/api.md +137 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/configuration.md +147 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/gotchas.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/patterns.md +149 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-ai/README.md +116 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/README.md +48 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/api.md +169 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/configuration.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/gotchas.md +130 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/patterns.md +170 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/api.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/configuration.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/gotchas.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-vpc/README.md +579 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/api.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/configuration.md +177 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/gotchas.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/patterns.md +132 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/README.md +90 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/api.md +140 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/configuration.md +128 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/gotchas.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/patterns.md +150 -0
- package/dist/template/.opencode/skill/cloudflare/references/zaraz/README.md +360 -0
- package/dist/template/.opencode/skill/react-best-practices/AGENTS.md +2410 -0
- package/dist/template/.opencode/skill/react-best-practices/README.md +123 -0
- package/dist/template/.opencode/skill/react-best-practices/SKILL.md +125 -0
- package/dist/template/.opencode/skill/react-best-practices/metadata.json +15 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/_sections.md +46 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/_template.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-api-routes.md +38 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-defer-await.md +80 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-dependencies.md +36 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-parallel.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-conditional.md +31 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-preload.md +50 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-event-listeners.md +74 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-storage.md +70 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-early-exit.md +50 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-index-maps.md +37 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-length-check-first.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-activity.md +26 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-memo.md +44 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-transitions.md +40 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-lru.md +41 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-react.md +76 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-serialization.md +38 -0
- package/dist/template/.opencode/skill/supabase/SKILL.md +120 -0
- package/dist/template/.opencode/skill/supabase/mcp.json +27 -0
- package/dist/template/.opencode/skill/vercel-deploy-claimable/SKILL.md +112 -0
- package/dist/template/.opencode/skill/vercel-deploy-claimable/scripts/deploy.sh +249 -0
- package/dist/template/.opencode/skill/web-design-guidelines/SKILL.md +39 -0
- package/package.json +1 -1
|
@@ -0,0 +1,664 @@
|
|
|
1
|
+
# Cloudflare Pipelines Skill
|
|
2
|
+
|
|
3
|
+
Expert guidance for working with Cloudflare Pipelines - ETL streaming data platform for ingesting, transforming, and loading data into R2.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Cloudflare Pipelines ingests events, transforms them with SQL, and delivers to R2 as Apache Iceberg tables or Parquet/JSON files. It provides:
|
|
8
|
+
|
|
9
|
+
- **Streams**: Durable, buffered queues for event ingestion via HTTP or Workers
|
|
10
|
+
- **Pipelines**: SQL-based transformations between streams and sinks
|
|
11
|
+
- **Sinks**: Destinations for processed data (R2 Data Catalog or R2 storage)
|
|
12
|
+
|
|
13
|
+
**Status**: Open beta (Workers Paid plan required)
|
|
14
|
+
**Pricing**: Currently no charge beyond standard R2 storage/operations
|
|
15
|
+
|
|
16
|
+
## Architecture
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
Data Sources → Streams → Pipelines (SQL) → Sinks → R2
|
|
20
|
+
↑ ↓ ↓
|
|
21
|
+
HTTP/Workers Transform Iceberg/Parquet
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Core Components
|
|
25
|
+
|
|
26
|
+
1. **Streams**: Buffer and store incoming events
|
|
27
|
+
- Structured (with schema validation) or unstructured (raw JSON)
|
|
28
|
+
- HTTP endpoints and Worker bindings
|
|
29
|
+
- Can be read by multiple pipelines
|
|
30
|
+
|
|
31
|
+
2. **Pipelines**: Execute SQL transformations
|
|
32
|
+
- Filter, transform, enrich data
|
|
33
|
+
- Cannot be modified after creation (delete/recreate required)
|
|
34
|
+
- SQL reference: SELECT, INSERT, scalar functions
|
|
35
|
+
|
|
36
|
+
3. **Sinks**: Write to destinations
|
|
37
|
+
- **R2 Data Catalog**: Apache Iceberg tables with ACID guarantees
|
|
38
|
+
- **R2 Storage**: Parquet or JSON files
|
|
39
|
+
- Exactly-once delivery guarantee
|
|
40
|
+
|
|
41
|
+
## Common Use Cases
|
|
42
|
+
|
|
43
|
+
- **Analytics pipelines**: Server logs, clickstream, telemetry
|
|
44
|
+
- **Data warehousing**: ETL into queryable Iceberg tables
|
|
45
|
+
- **Event processing**: Mobile/IoT events with enrichment
|
|
46
|
+
- **Ecommerce analytics**: User events, purchases, product views
|
|
47
|
+
- **Log aggregation**: Application/server logs with filtering
|
|
48
|
+
|
|
49
|
+
## Setup & Configuration
|
|
50
|
+
|
|
51
|
+
### Quick Start
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# Interactive setup (recommended)
|
|
55
|
+
npx wrangler pipelines setup
|
|
56
|
+
|
|
57
|
+
# Manual setup
|
|
58
|
+
npx wrangler r2 bucket create my-bucket
|
|
59
|
+
npx wrangler r2 bucket catalog enable my-bucket
|
|
60
|
+
npx wrangler pipelines streams create my-stream --schema-file schema.json
|
|
61
|
+
npx wrangler pipelines sinks create my-sink --type r2-data-catalog \
|
|
62
|
+
--bucket my-bucket --namespace default --table my_table \
|
|
63
|
+
--catalog-token YOUR_TOKEN
|
|
64
|
+
npx wrangler pipelines create my-pipeline \
|
|
65
|
+
--sql "INSERT INTO my_sink SELECT * FROM my_stream"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Schema Definition
|
|
69
|
+
|
|
70
|
+
**Structured streams** (recommended for validation):
|
|
71
|
+
|
|
72
|
+
```json
|
|
73
|
+
{
|
|
74
|
+
"fields": [
|
|
75
|
+
{
|
|
76
|
+
"name": "user_id",
|
|
77
|
+
"type": "string",
|
|
78
|
+
"required": true
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"name": "event_type",
|
|
82
|
+
"type": "string",
|
|
83
|
+
"required": true
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"name": "amount",
|
|
87
|
+
"type": "float64",
|
|
88
|
+
"required": false
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"name": "tags",
|
|
92
|
+
"type": "list",
|
|
93
|
+
"required": false,
|
|
94
|
+
"items": {
|
|
95
|
+
"type": "string"
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"name": "metadata",
|
|
100
|
+
"type": "struct",
|
|
101
|
+
"required": false,
|
|
102
|
+
"fields": [
|
|
103
|
+
{
|
|
104
|
+
"name": "source",
|
|
105
|
+
"type": "string",
|
|
106
|
+
"required": false
|
|
107
|
+
}
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
]
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Supported types**: `string`, `int32`, `int64`, `float32`, `float64`, `bool`, `timestamp`, `json`, `binary`, `list`, `struct`
|
|
115
|
+
|
|
116
|
+
**Unstructured streams** (no validation, single `value` column):
|
|
117
|
+
```bash
|
|
118
|
+
npx wrangler pipelines streams create my-stream
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Writing Data to Streams
|
|
122
|
+
|
|
123
|
+
### Via Workers (Recommended)
|
|
124
|
+
|
|
125
|
+
**Configuration** (`wrangler.toml`):
|
|
126
|
+
```toml
|
|
127
|
+
[[pipelines]]
|
|
128
|
+
pipeline = "<STREAM_ID>"
|
|
129
|
+
binding = "STREAM"
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Or JSON** (`wrangler.jsonc`):
|
|
133
|
+
```jsonc
|
|
134
|
+
{
|
|
135
|
+
"$schema": "./node_modules/wrangler/config-schema.json",
|
|
136
|
+
"pipelines": [
|
|
137
|
+
{
|
|
138
|
+
"pipeline": "<STREAM_ID>",
|
|
139
|
+
"binding": "STREAM"
|
|
140
|
+
}
|
|
141
|
+
]
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**Worker code**:
|
|
146
|
+
```typescript
|
|
147
|
+
export default {
|
|
148
|
+
async fetch(request, env, ctx): Promise<Response> {
|
|
149
|
+
const event = {
|
|
150
|
+
user_id: "12345",
|
|
151
|
+
event_type: "purchase",
|
|
152
|
+
product_id: "widget-001",
|
|
153
|
+
amount: 29.99
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
// Send single or multiple events
|
|
157
|
+
await env.STREAM.send([event]);
|
|
158
|
+
|
|
159
|
+
return new Response('Event sent');
|
|
160
|
+
},
|
|
161
|
+
} satisfies ExportedHandler<Env>;
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**Batch sending**:
|
|
165
|
+
```typescript
|
|
166
|
+
const events = [
|
|
167
|
+
{ user_id: "user1", event_type: "view" },
|
|
168
|
+
{ user_id: "user2", event_type: "purchase", amount: 50 }
|
|
169
|
+
];
|
|
170
|
+
await env.STREAM.send(events);
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Via HTTP
|
|
174
|
+
|
|
175
|
+
**Endpoint format**: `https://{stream-id}.ingest.cloudflare.com`
|
|
176
|
+
|
|
177
|
+
**Without auth** (for testing):
|
|
178
|
+
```bash
|
|
179
|
+
curl -X POST https://{stream-id}.ingest.cloudflare.com \
|
|
180
|
+
-H "Content-Type: application/json" \
|
|
181
|
+
-d '[
|
|
182
|
+
{
|
|
183
|
+
"user_id": "user_12345",
|
|
184
|
+
"event_type": "purchase",
|
|
185
|
+
"product_id": "widget-001",
|
|
186
|
+
"amount": 29.99
|
|
187
|
+
}
|
|
188
|
+
]'
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**With authentication**:
|
|
192
|
+
```bash
|
|
193
|
+
curl -X POST https://{stream-id}.ingest.cloudflare.com \
|
|
194
|
+
-H "Content-Type: application/json" \
|
|
195
|
+
-H "Authorization: Bearer YOUR_API_TOKEN" \
|
|
196
|
+
-d '[{"event": "data"}]'
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**Required permission**: Workers Pipeline Send
|
|
200
|
+
|
|
201
|
+
## SQL Transformations
|
|
202
|
+
|
|
203
|
+
### Basic Patterns
|
|
204
|
+
|
|
205
|
+
**Pass-through**:
|
|
206
|
+
```sql
|
|
207
|
+
INSERT INTO my_sink SELECT * FROM my_stream
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**Filtering**:
|
|
211
|
+
```sql
|
|
212
|
+
INSERT INTO my_sink
|
|
213
|
+
SELECT * FROM my_stream
|
|
214
|
+
WHERE event_type = 'purchase' AND amount > 100
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
**Field selection**:
|
|
218
|
+
```sql
|
|
219
|
+
INSERT INTO my_sink
|
|
220
|
+
SELECT user_id, event_type, timestamp, amount
|
|
221
|
+
FROM my_stream
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**Field transformation**:
|
|
225
|
+
```sql
|
|
226
|
+
INSERT INTO my_sink
|
|
227
|
+
SELECT
|
|
228
|
+
user_id,
|
|
229
|
+
UPPER(event_type) as event_type,
|
|
230
|
+
timestamp,
|
|
231
|
+
amount * 1.1 as amount_with_tax,
|
|
232
|
+
CONCAT(user_id, '_', product_id) as unique_key
|
|
233
|
+
FROM my_stream
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
**Conditional logic**:
|
|
237
|
+
```sql
|
|
238
|
+
INSERT INTO my_sink
|
|
239
|
+
SELECT
|
|
240
|
+
user_id,
|
|
241
|
+
event_type,
|
|
242
|
+
CASE
|
|
243
|
+
WHEN amount > 1000 THEN 'high_value'
|
|
244
|
+
WHEN amount > 100 THEN 'medium_value'
|
|
245
|
+
ELSE 'low_value'
|
|
246
|
+
END as customer_tier
|
|
247
|
+
FROM my_stream
|
|
248
|
+
WHERE event_type IN ('purchase', 'refund')
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
## Sink Configuration
|
|
252
|
+
|
|
253
|
+
### R2 Data Catalog (Iceberg Tables)
|
|
254
|
+
|
|
255
|
+
**Create sink**:
|
|
256
|
+
```bash
|
|
257
|
+
npx wrangler pipelines sinks create my-sink \
|
|
258
|
+
--type r2-data-catalog \
|
|
259
|
+
--bucket my-bucket \
|
|
260
|
+
--namespace my_namespace \
|
|
261
|
+
--table my_table \
|
|
262
|
+
--catalog-token YOUR_CATALOG_TOKEN \
|
|
263
|
+
--compression zstd \
|
|
264
|
+
--roll-interval 60 \
|
|
265
|
+
--roll-size 100
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
**Options**:
|
|
269
|
+
- `--compression`: `zstd` (default), `snappy`, `gzip`, `lz4`, `uncompressed`
|
|
270
|
+
- `--roll-interval`: Seconds between writes (default: 300)
|
|
271
|
+
- `--roll-size`: Max file size in MB before rolling
|
|
272
|
+
- `--target-row-group-size`: Parquet row group size in MB (default: 256)
|
|
273
|
+
|
|
274
|
+
**Querying with R2 SQL**:
|
|
275
|
+
```bash
|
|
276
|
+
export WRANGLER_R2_SQL_AUTH_TOKEN=YOUR_API_TOKEN
|
|
277
|
+
|
|
278
|
+
npx wrangler r2 sql query "warehouse_name" "
|
|
279
|
+
SELECT user_id, event_type, COUNT(*) as event_count
|
|
280
|
+
FROM default.my_table
|
|
281
|
+
WHERE event_type = 'purchase'
|
|
282
|
+
GROUP BY user_id, event_type
|
|
283
|
+
LIMIT 100"
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### R2 Storage (Raw Files)
|
|
287
|
+
|
|
288
|
+
**JSON format**:
|
|
289
|
+
```bash
|
|
290
|
+
npx wrangler pipelines sinks create my-sink \
|
|
291
|
+
--type r2 \
|
|
292
|
+
--bucket my-bucket \
|
|
293
|
+
--format json \
|
|
294
|
+
--path analytics/events \
|
|
295
|
+
--partitioning "year=%Y/month=%m/day=%d" \
|
|
296
|
+
--roll-interval 60 \
|
|
297
|
+
--roll-size 100 \
|
|
298
|
+
--access-key-id YOUR_KEY \
|
|
299
|
+
--secret-access-key YOUR_SECRET
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**Parquet format** (better compression/performance):
|
|
303
|
+
```bash
|
|
304
|
+
npx wrangler pipelines sinks create my-sink \
|
|
305
|
+
--type r2 \
|
|
306
|
+
--bucket my-bucket \
|
|
307
|
+
--format parquet \
|
|
308
|
+
--compression zstd \
|
|
309
|
+
--path analytics/events \
|
|
310
|
+
--partitioning "year=%Y/month=%m/day=%d/hour=%H" \
|
|
311
|
+
--target-row-group-size 256 \
|
|
312
|
+
--roll-interval 300 \
|
|
313
|
+
--roll-size 100 \
|
|
314
|
+
--access-key-id YOUR_KEY \
|
|
315
|
+
--secret-access-key YOUR_SECRET
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
**File organization**:
|
|
319
|
+
```
|
|
320
|
+
bucket/analytics/events/
|
|
321
|
+
year=2025/
|
|
322
|
+
month=01/
|
|
323
|
+
day=11/
|
|
324
|
+
uuid-1.parquet
|
|
325
|
+
uuid-2.parquet
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
## Wrangler Commands Reference
|
|
329
|
+
|
|
330
|
+
### Setup & Management
|
|
331
|
+
|
|
332
|
+
```bash
|
|
333
|
+
# Interactive setup (creates stream, sink, pipeline)
|
|
334
|
+
npx wrangler pipelines setup
|
|
335
|
+
|
|
336
|
+
# List all pipelines
|
|
337
|
+
npx wrangler pipelines list
|
|
338
|
+
|
|
339
|
+
# Get pipeline details
|
|
340
|
+
npx wrangler pipelines get <PIPELINE_ID>
|
|
341
|
+
|
|
342
|
+
# Delete pipeline
|
|
343
|
+
npx wrangler pipelines delete <PIPELINE_ID>
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### Streams
|
|
347
|
+
|
|
348
|
+
```bash
|
|
349
|
+
# Create stream with schema
|
|
350
|
+
npx wrangler pipelines streams create my-stream --schema-file schema.json
|
|
351
|
+
|
|
352
|
+
# Create unstructured stream
|
|
353
|
+
npx wrangler pipelines streams create my-stream
|
|
354
|
+
|
|
355
|
+
# List streams
|
|
356
|
+
npx wrangler pipelines streams list
|
|
357
|
+
|
|
358
|
+
# Get stream details
|
|
359
|
+
npx wrangler pipelines streams get <STREAM_ID>
|
|
360
|
+
|
|
361
|
+
# Delete stream (deletes dependent pipelines and buffered events!)
|
|
362
|
+
npx wrangler pipelines streams delete <STREAM_ID>
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### Sinks
|
|
366
|
+
|
|
367
|
+
```bash
|
|
368
|
+
# Create R2 Data Catalog sink
|
|
369
|
+
npx wrangler pipelines sinks create my-sink \
|
|
370
|
+
--type r2-data-catalog \
|
|
371
|
+
--bucket my-bucket \
|
|
372
|
+
--namespace default \
|
|
373
|
+
--table my_table \
|
|
374
|
+
--catalog-token TOKEN
|
|
375
|
+
|
|
376
|
+
# Create R2 storage sink
|
|
377
|
+
npx wrangler pipelines sinks create my-sink \
|
|
378
|
+
--type r2 \
|
|
379
|
+
--bucket my-bucket \
|
|
380
|
+
--format parquet \
|
|
381
|
+
--compression zstd
|
|
382
|
+
|
|
383
|
+
# List sinks
|
|
384
|
+
npx wrangler pipelines sinks list
|
|
385
|
+
|
|
386
|
+
# Get sink details
|
|
387
|
+
npx wrangler pipelines sinks get <SINK_ID>
|
|
388
|
+
|
|
389
|
+
# Delete sink
|
|
390
|
+
npx wrangler pipelines sinks delete <SINK_ID>
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
### Pipelines
|
|
394
|
+
|
|
395
|
+
```bash
|
|
396
|
+
# Create with inline SQL
|
|
397
|
+
npx wrangler pipelines create my-pipeline \
|
|
398
|
+
--sql "INSERT INTO my_sink SELECT * FROM my_stream"
|
|
399
|
+
|
|
400
|
+
# Create with SQL file
|
|
401
|
+
npx wrangler pipelines create my-pipeline \
|
|
402
|
+
--sql-file transform.sql
|
|
403
|
+
|
|
404
|
+
# View pipeline
|
|
405
|
+
npx wrangler pipelines get <PIPELINE_ID>
|
|
406
|
+
|
|
407
|
+
# List all pipelines
|
|
408
|
+
npx wrangler pipelines list
|
|
409
|
+
|
|
410
|
+
# Delete pipeline
|
|
411
|
+
npx wrangler pipelines delete <PIPELINE_ID>
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
## Authentication & Permissions
|
|
415
|
+
|
|
416
|
+
### R2 Data Catalog Token
|
|
417
|
+
|
|
418
|
+
Required permissions: **R2 Admin Read & Write**
|
|
419
|
+
|
|
420
|
+
Create in dashboard:
|
|
421
|
+
1. Go to R2 > Manage API tokens
|
|
422
|
+
2. Create Account API Token
|
|
423
|
+
3. Select "Admin Read & Write" permission
|
|
424
|
+
4. Save token value
|
|
425
|
+
|
|
426
|
+
### R2 Storage Credentials
|
|
427
|
+
|
|
428
|
+
Required permissions: **Object Read & Write**
|
|
429
|
+
|
|
430
|
+
Create via Wrangler or dashboard for access key ID and secret access key.
|
|
431
|
+
|
|
432
|
+
### HTTP Ingest Token
|
|
433
|
+
|
|
434
|
+
Required permissions: **Workers Pipeline Send**
|
|
435
|
+
|
|
436
|
+
For authenticated HTTP ingestion endpoints.
|
|
437
|
+
|
|
438
|
+
## Best Practices
|
|
439
|
+
|
|
440
|
+
### Schema Design
|
|
441
|
+
- ✅ Use structured streams for validation
|
|
442
|
+
- ✅ Mark critical fields as `required: true`
|
|
443
|
+
- ✅ Use appropriate types (`int64` for timestamps, `float64` for decimals)
|
|
444
|
+
- ❌ Avoid overly nested structs (query performance)
|
|
445
|
+
- ❌ Don't change schemas after creation (recreate stream)
|
|
446
|
+
|
|
447
|
+
### Performance
|
|
448
|
+
- **Low latency**: Set `--roll-interval 10` (smaller files, more frequent)
|
|
449
|
+
- **Query performance**: Set `--roll-interval 300` and `--roll-size 100` (larger files, less frequent)
|
|
450
|
+
- Use `zstd` compression for best ratio, `snappy` for speed
|
|
451
|
+
- Increase `--target-row-group-size` for analytical workloads
|
|
452
|
+
|
|
453
|
+
### SQL Transformations
|
|
454
|
+
- ✅ Filter early (`WHERE` clauses reduce data volume)
|
|
455
|
+
- ✅ Select only needed fields (reduces storage costs)
|
|
456
|
+
- ✅ Use functions for enrichment (CONCAT, UPPER, CASE)
|
|
457
|
+
- ❌ Cannot modify pipelines after creation (plan carefully)
|
|
458
|
+
- ❌ No JOINs across streams (single stream per pipeline)
|
|
459
|
+
|
|
460
|
+
### Workers Integration
|
|
461
|
+
- ✅ Use Worker bindings (no token management)
|
|
462
|
+
- ✅ Batch events when possible (`send([event1, event2, ...])`)
|
|
463
|
+
- ✅ Handle send errors gracefully
|
|
464
|
+
- ❌ Don't await send in critical path if latency matters (use `ctx.waitUntil()`)
|
|
465
|
+
|
|
466
|
+
```typescript
|
|
467
|
+
// Fire-and-forget pattern
|
|
468
|
+
export default {
|
|
469
|
+
async fetch(request, env, ctx) {
|
|
470
|
+
const event = { /* ... */ };
|
|
471
|
+
|
|
472
|
+
// Don't block response on send
|
|
473
|
+
ctx.waitUntil(env.STREAM.send([event]));
|
|
474
|
+
|
|
475
|
+
return new Response('OK');
|
|
476
|
+
}
|
|
477
|
+
};
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
### HTTP Ingestion
|
|
481
|
+
- ✅ Enable auth for production endpoints
|
|
482
|
+
- ✅ Configure CORS if sending from browsers
|
|
483
|
+
- ✅ Send arrays (not single objects) for batch efficiency
|
|
484
|
+
- ✅ Handle 4xx/5xx responses with retries
|
|
485
|
+
|
|
486
|
+
### Monitoring
|
|
487
|
+
- Check stream buffer status (dashboard or API)
|
|
488
|
+
- Monitor pipeline processing rate
|
|
489
|
+
- Review R2 storage growth
|
|
490
|
+
- Query data regularly to verify pipeline health
|
|
491
|
+
|
|
492
|
+
## Limits (Open Beta)
|
|
493
|
+
|
|
494
|
+
| Resource | Limit |
|
|
495
|
+
|----------|-------|
|
|
496
|
+
| Streams per account | 20 |
|
|
497
|
+
| Sinks per account | 20 |
|
|
498
|
+
| Pipelines per account | 20 |
|
|
499
|
+
| Payload size per request | 1 MB |
|
|
500
|
+
| Ingest rate per stream | 5 MB/s |
|
|
501
|
+
|
|
502
|
+
Request increases: [Limit Increase Form](https://forms.gle/ukpeZVLWLnKeixDu7)
|
|
503
|
+
|
|
504
|
+
## Troubleshooting
|
|
505
|
+
|
|
506
|
+
### Events not appearing in R2
|
|
507
|
+
- Wait 10-300 seconds (depends on `--roll-interval`)
|
|
508
|
+
- Check pipeline status: `npx wrangler pipelines get <ID>`
|
|
509
|
+
- Verify stream has data (check dashboard metrics)
|
|
510
|
+
- Confirm sink credentials are valid
|
|
511
|
+
|
|
512
|
+
### Schema validation failures
|
|
513
|
+
- Events accepted but dropped if invalid
|
|
514
|
+
- Check event structure matches schema exactly
|
|
515
|
+
- Verify required fields are present
|
|
516
|
+
- Check data types (e.g., strings not numbers)
|
|
517
|
+
|
|
518
|
+
### Worker binding not found
|
|
519
|
+
- Verify `wrangler.toml`/`wrangler.jsonc` has correct `pipeline` ID
|
|
520
|
+
- Redeploy Worker after adding binding
|
|
521
|
+
- Check binding name matches code (`env.STREAM`)
|
|
522
|
+
|
|
523
|
+
### SQL errors
|
|
524
|
+
- SQL cannot be modified after creation
|
|
525
|
+
- Recreate pipeline with corrected SQL
|
|
526
|
+
- Verify stream and sink names in SQL match actual resources
|
|
527
|
+
- Check SQL syntax against reference docs
|
|
528
|
+
|
|
529
|
+
## Complete Example: Ecommerce Analytics
|
|
530
|
+
|
|
531
|
+
**1. Create schema** (`ecommerce-schema.json`):
|
|
532
|
+
```json
|
|
533
|
+
{
|
|
534
|
+
"fields": [
|
|
535
|
+
{
|
|
536
|
+
"name": "user_id",
|
|
537
|
+
"type": "string",
|
|
538
|
+
"required": true
|
|
539
|
+
},
|
|
540
|
+
{
|
|
541
|
+
"name": "event_type",
|
|
542
|
+
"type": "string",
|
|
543
|
+
"required": true
|
|
544
|
+
},
|
|
545
|
+
{
|
|
546
|
+
"name": "product_id",
|
|
547
|
+
"type": "string",
|
|
548
|
+
"required": false
|
|
549
|
+
},
|
|
550
|
+
{
|
|
551
|
+
"name": "amount",
|
|
552
|
+
"type": "float64",
|
|
553
|
+
"required": false
|
|
554
|
+
},
|
|
555
|
+
{
|
|
556
|
+
"name": "timestamp",
|
|
557
|
+
"type": "timestamp",
|
|
558
|
+
"required": true
|
|
559
|
+
}
|
|
560
|
+
]
|
|
561
|
+
}
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
**2. Setup infrastructure**:
|
|
565
|
+
```bash
|
|
566
|
+
# Create bucket and enable catalog
|
|
567
|
+
npx wrangler r2 bucket create ecommerce-data
|
|
568
|
+
npx wrangler r2 bucket catalog enable ecommerce-data
|
|
569
|
+
|
|
570
|
+
# Create stream
|
|
571
|
+
npx wrangler pipelines streams create ecommerce-stream \
|
|
572
|
+
--schema-file ecommerce-schema.json
|
|
573
|
+
|
|
574
|
+
# Create sink
|
|
575
|
+
npx wrangler pipelines sinks create ecommerce-sink \
|
|
576
|
+
--type r2-data-catalog \
|
|
577
|
+
--bucket ecommerce-data \
|
|
578
|
+
--namespace default \
|
|
579
|
+
--table events \
|
|
580
|
+
--catalog-token $CATALOG_TOKEN \
|
|
581
|
+
--roll-interval 60
|
|
582
|
+
|
|
583
|
+
# Create pipeline with transformation
|
|
584
|
+
npx wrangler pipelines create ecommerce-pipeline \
|
|
585
|
+
--sql "INSERT INTO ecommerce_sink
|
|
586
|
+
SELECT
|
|
587
|
+
user_id,
|
|
588
|
+
UPPER(event_type) as event_type,
|
|
589
|
+
product_id,
|
|
590
|
+
amount,
|
|
591
|
+
timestamp,
|
|
592
|
+
CASE
|
|
593
|
+
WHEN amount > 100 THEN 'high_value'
|
|
594
|
+
ELSE 'standard'
|
|
595
|
+
END as transaction_tier
|
|
596
|
+
FROM ecommerce_stream
|
|
597
|
+
WHERE event_type IN ('purchase', 'add_to_cart', 'view_product')"
|
|
598
|
+
```
|
|
599
|
+
|
|
600
|
+
**3. Configure Worker** (`wrangler.toml`):
|
|
601
|
+
```toml
|
|
602
|
+
name = "ecommerce-api"
|
|
603
|
+
main = "src/index.ts"
|
|
604
|
+
|
|
605
|
+
[[pipelines]]
|
|
606
|
+
pipeline = "<STREAM_ID>"
|
|
607
|
+
binding = "EVENTS"
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
**4. Send events** (`src/index.ts`):
|
|
611
|
+
```typescript
|
|
612
|
+
interface Env {
|
|
613
|
+
EVENTS: Pipeline;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
export default {
|
|
617
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
618
|
+
if (request.method === 'POST') {
|
|
619
|
+
const data = await request.json();
|
|
620
|
+
|
|
621
|
+
const event = {
|
|
622
|
+
user_id: data.userId,
|
|
623
|
+
event_type: data.eventType,
|
|
624
|
+
product_id: data.productId,
|
|
625
|
+
amount: data.amount,
|
|
626
|
+
timestamp: new Date().toISOString()
|
|
627
|
+
};
|
|
628
|
+
|
|
629
|
+
try {
|
|
630
|
+
await env.EVENTS.send([event]);
|
|
631
|
+
return new Response('Event tracked', { status: 200 });
|
|
632
|
+
} catch (error) {
|
|
633
|
+
return new Response('Failed to track event', { status: 500 });
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
return new Response('Method not allowed', { status: 405 });
|
|
638
|
+
}
|
|
639
|
+
} satisfies ExportedHandler<Env>;
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
**5. Query results**:
|
|
643
|
+
```bash
|
|
644
|
+
export WRANGLER_R2_SQL_AUTH_TOKEN=$CATALOG_TOKEN
|
|
645
|
+
|
|
646
|
+
npx wrangler r2 sql query "ecommerce-warehouse" "
|
|
647
|
+
SELECT
|
|
648
|
+
event_type,
|
|
649
|
+
transaction_tier,
|
|
650
|
+
COUNT(*) as event_count,
|
|
651
|
+
SUM(amount) as total_revenue
|
|
652
|
+
FROM default.events
|
|
653
|
+
WHERE event_type = 'PURCHASE'
|
|
654
|
+
GROUP BY event_type, transaction_tier
|
|
655
|
+
ORDER BY total_revenue DESC"
|
|
656
|
+
```
|
|
657
|
+
|
|
658
|
+
## Additional Resources
|
|
659
|
+
|
|
660
|
+
- [Pipelines Documentation](https://developers.cloudflare.com/pipelines/)
|
|
661
|
+
- [SQL Reference](https://developers.cloudflare.com/pipelines/sql-reference/)
|
|
662
|
+
- [R2 Data Catalog](https://developers.cloudflare.com/r2/data-catalog/)
|
|
663
|
+
- [Wrangler Commands](https://developers.cloudflare.com/workers/wrangler/commands/#pipelines)
|
|
664
|
+
- [Apache Iceberg](https://iceberg.apache.org/)
|