opencodekit 0.15.4 → 0.15.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/template/.opencode/command/cloudflare.md +70 -0
- package/dist/template/.opencode/package.json +1 -1
- package/dist/template/.opencode/skill/cloudflare/SKILL.md +233 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/README.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/api.md +100 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/configuration.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/gotchas.md +59 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/patterns.md +89 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-gateway/README.md +695 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/api.md +38 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/configuration.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/gotchas.md +41 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/patterns.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/api.md +27 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/configuration.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/gotchas.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/patterns.md +36 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/README.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/api.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/configuration.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/gotchas.md +28 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/patterns.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/README.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/api.md +78 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/configuration.md +128 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/gotchas.md +51 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/patterns.md +145 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/api.md +50 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/configuration.md +53 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/gotchas.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/patterns.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/configuration.md +58 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/gotchas.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/patterns.md +37 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/README.md +71 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/api.md +168 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/configuration.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/gotchas.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/patterns.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/api.md +54 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/configuration.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/gotchas.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/patterns.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/c3/README.md +264 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/README.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/api.md +176 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/configuration.md +164 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/gotchas.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/patterns.md +180 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/api.md +43 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/configuration.md +56 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/gotchas.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/patterns.md +40 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/README.md +85 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/api.md +198 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/configuration.md +151 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/gotchas.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/patterns.md +122 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/README.md +92 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/api.md +141 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/gotchas.md +70 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/patterns.md +144 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/README.md +34 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/api.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/configuration.md +67 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/gotchas.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/patterns.md +158 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/api.md +89 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/configuration.md +116 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/gotchas.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/patterns.md +112 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/README.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/api.md +152 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/configuration.md +148 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/gotchas.md +158 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/patterns.md +255 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/api.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/configuration.md +63 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/gotchas.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/patterns.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-workers/README.md +598 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/api.md +137 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/configuration.md +133 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/gotchas.md +184 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/patterns.md +176 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/configuration.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/gotchas.md +23 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/patterns.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/README.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/api.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/configuration.md +92 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/gotchas.md +117 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/patterns.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/README.md +64 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/api.md +144 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/configuration.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/gotchas.md +187 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/patterns.md +211 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/README.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/api.md +240 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/gotchas.md +171 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/patterns.md +171 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/api.md +51 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/configuration.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/gotchas.md +36 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/README.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/api.md +200 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/configuration.md +228 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/gotchas.md +161 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/patterns.md +145 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/README.md +57 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/api.md +201 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/configuration.md +159 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/gotchas.md +151 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/patterns.md +190 -0
- package/dist/template/.opencode/skill/cloudflare/references/pipelines/README.md +664 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/README.md +107 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/api.md +194 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/configuration.md +216 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/gotchas.md +223 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/patterns.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/README.md +69 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/api.md +138 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/configuration.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/gotchas.md +112 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/patterns.md +155 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/README.md +61 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/api.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/configuration.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/gotchas.md +94 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/patterns.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/api.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/configuration.md +39 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/gotchas.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/patterns.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-sql/README.md +512 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/README.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/api.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/configuration.md +63 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/gotchas.md +75 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/patterns.md +102 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/README.md +81 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/api.md +164 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/configuration.md +147 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/gotchas.md +172 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/patterns.md +155 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/README.md +90 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/api.md +178 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/configuration.md +131 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/gotchas.md +156 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/patterns.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/README.md +58 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/api.md +182 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/configuration.md +140 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/gotchas.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/patterns.md +218 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/README.md +91 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/api.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/configuration.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/gotchas.md +87 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/patterns.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/README.md +15 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/api.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/configuration.md +33 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/gotchas.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/patterns.md +34 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/api.md +24 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/configuration.md +43 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/gotchas.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/patterns.md +40 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/configuration.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/gotchas.md +44 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/README.md +103 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/api.md +204 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/gotchas.md +131 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/patterns.md +152 -0
- package/dist/template/.opencode/skill/cloudflare/references/tail-workers/README.md +640 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/README.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/api.md +159 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/configuration.md +156 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/gotchas.md +207 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/patterns.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/README.md +82 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/api.md +105 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/configuration.md +113 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/gotchas.md +115 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/patterns.md +157 -0
- package/dist/template/.opencode/skill/cloudflare/references/turn/README.md +699 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/configuration.md +19 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/gotchas.md +27 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/patterns.md +41 -0
- package/dist/template/.opencode/skill/cloudflare/references/vectorize/README.md +682 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/configuration.md +44 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/gotchas.md +24 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/patterns.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/README.md +19 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/api.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/configuration.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/gotchas.md +28 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/patterns.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/README.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/api.md +199 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/configuration.md +185 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/gotchas.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/patterns.md +216 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/README.md +96 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/api.md +137 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/configuration.md +147 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/gotchas.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/patterns.md +149 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-ai/README.md +116 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/README.md +48 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/api.md +169 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/configuration.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/gotchas.md +130 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/patterns.md +170 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/api.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/configuration.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/gotchas.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-vpc/README.md +579 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/api.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/configuration.md +177 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/gotchas.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/patterns.md +132 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/README.md +90 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/api.md +140 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/configuration.md +128 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/gotchas.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/patterns.md +150 -0
- package/dist/template/.opencode/skill/cloudflare/references/zaraz/README.md +360 -0
- package/dist/template/.opencode/skill/react-best-practices/AGENTS.md +2410 -0
- package/dist/template/.opencode/skill/react-best-practices/README.md +123 -0
- package/dist/template/.opencode/skill/react-best-practices/SKILL.md +125 -0
- package/dist/template/.opencode/skill/react-best-practices/metadata.json +15 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/_sections.md +46 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/_template.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-api-routes.md +38 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-defer-await.md +80 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-dependencies.md +36 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-parallel.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-conditional.md +31 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-preload.md +50 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-event-listeners.md +74 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-storage.md +70 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-early-exit.md +50 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-index-maps.md +37 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-length-check-first.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-activity.md +26 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-memo.md +44 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-transitions.md +40 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-lru.md +41 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-react.md +76 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-serialization.md +38 -0
- package/dist/template/.opencode/skill/supabase/SKILL.md +120 -0
- package/dist/template/.opencode/skill/supabase/mcp.json +27 -0
- package/dist/template/.opencode/skill/vercel-deploy-claimable/SKILL.md +112 -0
- package/dist/template/.opencode/skill/vercel-deploy-claimable/scripts/deploy.sh +249 -0
- package/dist/template/.opencode/skill/web-design-guidelines/SKILL.md +39 -0
- package/package.json +1 -1
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# Testing Patterns
|
|
2
|
+
|
|
3
|
+
## Basic Test Setup (node:test)
|
|
4
|
+
|
|
5
|
+
```js
|
|
6
|
+
import assert from "node:assert";
|
|
7
|
+
import test, { after, before } from "node:test";
|
|
8
|
+
import { Miniflare } from "miniflare";
|
|
9
|
+
|
|
10
|
+
let mf;
|
|
11
|
+
|
|
12
|
+
before(async () => {
|
|
13
|
+
mf = new Miniflare({
|
|
14
|
+
modules: true,
|
|
15
|
+
scriptPath: "src/index.js",
|
|
16
|
+
kvNamespaces: ["TEST_KV"],
|
|
17
|
+
bindings: { API_KEY: "test-key" },
|
|
18
|
+
});
|
|
19
|
+
await mf.ready;
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test("fetch returns hello", async () => {
|
|
23
|
+
const res = await mf.dispatchFetch("http://localhost/");
|
|
24
|
+
assert.strictEqual(await res.text(), "Hello World");
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("kv operations", async () => {
|
|
28
|
+
const kv = await mf.getKVNamespace("TEST_KV");
|
|
29
|
+
await kv.put("key", "value");
|
|
30
|
+
|
|
31
|
+
const res = await mf.dispatchFetch("http://localhost/kv");
|
|
32
|
+
assert.strictEqual(await res.text(), "value");
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
after(async () => {
|
|
36
|
+
await mf.dispose();
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Build Before Tests
|
|
41
|
+
|
|
42
|
+
```js
|
|
43
|
+
import { spawnSync } from "node:child_process";
|
|
44
|
+
|
|
45
|
+
before(() => {
|
|
46
|
+
spawnSync("npx wrangler build", { shell: true, stdio: "pipe" });
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Testing Durable Objects
|
|
51
|
+
|
|
52
|
+
```js
|
|
53
|
+
test("durable object state", async () => {
|
|
54
|
+
const ns = await mf.getDurableObjectNamespace("COUNTER");
|
|
55
|
+
const id = ns.idFromName("test-counter");
|
|
56
|
+
const stub = ns.get(id);
|
|
57
|
+
|
|
58
|
+
const res1 = await stub.fetch("http://localhost/increment");
|
|
59
|
+
assert.strictEqual(await res1.text(), "1");
|
|
60
|
+
|
|
61
|
+
const res2 = await stub.fetch("http://localhost/increment");
|
|
62
|
+
assert.strictEqual(await res2.text(), "2");
|
|
63
|
+
|
|
64
|
+
// Direct storage access
|
|
65
|
+
const storage = await mf.getDurableObjectStorage(id);
|
|
66
|
+
const count = await storage.get("count");
|
|
67
|
+
assert.strictEqual(count, 2);
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Testing Queue Handlers
|
|
72
|
+
|
|
73
|
+
```js
|
|
74
|
+
test("queue message processing", async () => {
|
|
75
|
+
const worker = await mf.getWorker();
|
|
76
|
+
|
|
77
|
+
const result = await worker.queue("my-queue", [
|
|
78
|
+
{ id: "msg1", timestamp: new Date(), body: { userId: 123 }, attempts: 1 },
|
|
79
|
+
]);
|
|
80
|
+
|
|
81
|
+
assert.strictEqual(result.outcome, "ok");
|
|
82
|
+
|
|
83
|
+
// Verify side effects
|
|
84
|
+
const kv = await mf.getKVNamespace("QUEUE_LOG");
|
|
85
|
+
const log = await kv.get("msg1");
|
|
86
|
+
assert.ok(log);
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Testing Scheduled Events
|
|
91
|
+
|
|
92
|
+
```js
|
|
93
|
+
test("scheduled cron handler", async () => {
|
|
94
|
+
const worker = await mf.getWorker();
|
|
95
|
+
|
|
96
|
+
const result = await worker.scheduled({
|
|
97
|
+
scheduledTime: new Date("2024-01-01T00:00:00Z"),
|
|
98
|
+
cron: "0 0 * * *",
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
assert.strictEqual(result.outcome, "ok");
|
|
102
|
+
});
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Isolated Test Data
|
|
106
|
+
|
|
107
|
+
```js
|
|
108
|
+
describe("user tests", () => {
|
|
109
|
+
let mf;
|
|
110
|
+
|
|
111
|
+
beforeEach(async () => {
|
|
112
|
+
mf = new Miniflare({
|
|
113
|
+
scriptPath: "worker.js",
|
|
114
|
+
kvNamespaces: ["USERS"],
|
|
115
|
+
// In-memory: no persist
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
afterEach(async () => {
|
|
120
|
+
await mf.dispose();
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test("create user", async () => {
|
|
124
|
+
// Fresh KV per test
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Mock External Services
|
|
130
|
+
|
|
131
|
+
```js
|
|
132
|
+
new Miniflare({
|
|
133
|
+
workers: [
|
|
134
|
+
{
|
|
135
|
+
name: "main",
|
|
136
|
+
serviceBindings: { EXTERNAL_API: "mock-api" },
|
|
137
|
+
script: `/* main worker */`,
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
name: "mock-api",
|
|
141
|
+
script: `
|
|
142
|
+
addEventListener("fetch", (event) => {
|
|
143
|
+
event.respondWith(Response.json({ mocked: true }));
|
|
144
|
+
})
|
|
145
|
+
`,
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Shared Storage Between Workers
|
|
152
|
+
|
|
153
|
+
```js
|
|
154
|
+
new Miniflare({
|
|
155
|
+
kvPersist: "./data",
|
|
156
|
+
workers: [
|
|
157
|
+
{ name: "writer", kvNamespaces: { DATA: "shared" }, script: `...` },
|
|
158
|
+
{ name: "reader", kvNamespaces: { DATA: "shared" }, script: `...` },
|
|
159
|
+
],
|
|
160
|
+
});
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Test Utils Pattern
|
|
164
|
+
|
|
165
|
+
```js
|
|
166
|
+
// test-utils.js
|
|
167
|
+
export async function createTestWorker(overrides = {}) {
|
|
168
|
+
const mf = new Miniflare({
|
|
169
|
+
scriptPath: "dist/worker.js",
|
|
170
|
+
kvNamespaces: ["TEST_KV"],
|
|
171
|
+
bindings: { ENVIRONMENT: "test", ...overrides.bindings },
|
|
172
|
+
...overrides,
|
|
173
|
+
});
|
|
174
|
+
await mf.ready;
|
|
175
|
+
return mf;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// test.js
|
|
179
|
+
test("my test", async () => {
|
|
180
|
+
const mf = await createTestWorker({ bindings: { CUSTOM: "value" } });
|
|
181
|
+
try {
|
|
182
|
+
const res = await mf.dispatchFetch("http://localhost/");
|
|
183
|
+
assert.ok(res.ok);
|
|
184
|
+
} finally {
|
|
185
|
+
await mf.dispose();
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Error Handling Tests
|
|
191
|
+
|
|
192
|
+
```js
|
|
193
|
+
test("handles 404", async () => {
|
|
194
|
+
const res = await mf.dispatchFetch("http://localhost/not-found");
|
|
195
|
+
assert.strictEqual(res.status, 404);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
test("handles invalid input", async () => {
|
|
199
|
+
const res = await mf.dispatchFetch("http://localhost/api", {
|
|
200
|
+
method: "POST",
|
|
201
|
+
body: "invalid json",
|
|
202
|
+
});
|
|
203
|
+
assert.strictEqual(res.status, 400);
|
|
204
|
+
});
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## CI Integration
|
|
208
|
+
|
|
209
|
+
Use in-memory storage (omit persist options) for CI speed. Use `dispatchFetch` instead of HTTP server to avoid port conflicts.
|
|
210
|
+
|
|
211
|
+
See [gotchas.md](./gotchas.md) for troubleshooting common issues.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Cloudflare Network Interconnect (CNI)
|
|
2
|
+
|
|
3
|
+
Private, high-performance connectivity to Cloudflare's network. **Enterprise-only**.
|
|
4
|
+
|
|
5
|
+
## Connection Types
|
|
6
|
+
|
|
7
|
+
**Direct**: Physical fiber in shared datacenter. 10/100 Gbps. You order cross-connect.
|
|
8
|
+
|
|
9
|
+
**Partner**: Virtual via Console Connect, Equinix, Megaport, etc. Managed via partner SDN.
|
|
10
|
+
|
|
11
|
+
**Cloud**: AWS Direct Connect or GCP Cloud Interconnect. Magic WAN only.
|
|
12
|
+
|
|
13
|
+
## Dataplane Versions
|
|
14
|
+
|
|
15
|
+
**v1 (Classic)**: GRE tunnel support, VLAN/BFD/LACP, asymmetric MTU (1500↓/1476↑), peering support.
|
|
16
|
+
|
|
17
|
+
**v2 (Beta)**: No GRE, 1500 MTU both ways, no VLAN/BFD/LACP yet, ECMP instead.
|
|
18
|
+
|
|
19
|
+
## Use Cases
|
|
20
|
+
|
|
21
|
+
- **Magic Transit DSR**: DDoS protection, egress via ISP (v1/v2)
|
|
22
|
+
- **Magic Transit + Egress**: DDoS + egress via CF (v1/v2)
|
|
23
|
+
- **Magic WAN + Zero Trust**: Private backbone (v1 needs GRE, v2 native)
|
|
24
|
+
- **Peering**: Public routes at PoP (v1 only)
|
|
25
|
+
- **App Security**: WAF/Cache/LB (v1/v2 over Magic Transit)
|
|
26
|
+
|
|
27
|
+
## Prerequisites
|
|
28
|
+
|
|
29
|
+
- Enterprise plan
|
|
30
|
+
- IPv4 /24+ or IPv6 /48+ prefixes
|
|
31
|
+
- BGP ASN for v1
|
|
32
|
+
- See [locations PDF](https://developers.cloudflare.com/network-interconnect/static/cni-locations-30-10-2025.pdf)
|
|
33
|
+
|
|
34
|
+
## Specs
|
|
35
|
+
|
|
36
|
+
- /31 point-to-point subnets
|
|
37
|
+
- 10km max optical distance
|
|
38
|
+
- 10G: 10GBASE-LR single-mode
|
|
39
|
+
- 100G: 100GBASE-LR4 single-mode
|
|
40
|
+
- **No SLA** (free service)
|
|
41
|
+
- Backup Internet required
|
|
42
|
+
|
|
43
|
+
## Throughput
|
|
44
|
+
|
|
45
|
+
| Direction | 10G | 100G |
|
|
46
|
+
|-----------|-----|------|
|
|
47
|
+
| CF → Customer | 10 Gbps | 100 Gbps |
|
|
48
|
+
| Customer → CF (peering) | 10 Gbps | 100 Gbps |
|
|
49
|
+
| Customer → CF (Magic) | 1 Gbps/tunnel or CNI | 1 Gbps/tunnel or CNI |
|
|
50
|
+
|
|
51
|
+
## Timeline
|
|
52
|
+
|
|
53
|
+
2-4 weeks typical. Steps: request → config review → order connection → configure → test → enable health checks → activate → monitor.
|
|
54
|
+
|
|
55
|
+
## See Also
|
|
56
|
+
|
|
57
|
+
- [configuration.md](./configuration.md) - BGP, routing, setup
|
|
58
|
+
- [api.md](./api.md) - API endpoints, SDKs
|
|
59
|
+
- [patterns.md](./patterns.md) - HA, hybrid cloud, failover
|
|
60
|
+
- [gotchas.md](./gotchas.md) - Troubleshooting, limits
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# CNI API Reference
|
|
2
|
+
|
|
3
|
+
See [README.md](./README.md) for overview.
|
|
4
|
+
|
|
5
|
+
## Base
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
https://api.cloudflare.com/client/v4
|
|
9
|
+
Auth: Authorization: Bearer <token>
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Interconnects
|
|
13
|
+
|
|
14
|
+
### List
|
|
15
|
+
```http
|
|
16
|
+
GET /accounts/{account_id}/cni/interconnects
|
|
17
|
+
```
|
|
18
|
+
Query: `page`, `per_page`
|
|
19
|
+
|
|
20
|
+
### Create
|
|
21
|
+
```http
|
|
22
|
+
POST /accounts/{account_id}/cni/interconnects
|
|
23
|
+
```
|
|
24
|
+
Body: `account`, `slot_id`, `type`, `facility`, `speed`, `name`, `description`
|
|
25
|
+
|
|
26
|
+
### Get
|
|
27
|
+
```http
|
|
28
|
+
GET /accounts/{account_id}/cni/interconnects/{icon}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Status
|
|
32
|
+
```http
|
|
33
|
+
GET /accounts/{account_id}/cni/interconnects/{icon}/status
|
|
34
|
+
```
|
|
35
|
+
Returns: `active` | `unhealthy` | `pending`
|
|
36
|
+
|
|
37
|
+
### LOA
|
|
38
|
+
```http
|
|
39
|
+
GET /accounts/{account_id}/cni/interconnects/{icon}/loa
|
|
40
|
+
```
|
|
41
|
+
Returns PDF.
|
|
42
|
+
|
|
43
|
+
### Delete
|
|
44
|
+
```http
|
|
45
|
+
DELETE /accounts/{account_id}/cni/interconnects/{icon}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## CNI Objects (BGP config)
|
|
49
|
+
|
|
50
|
+
### List
|
|
51
|
+
```http
|
|
52
|
+
GET /accounts/{account_id}/cni/cnis
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Create
|
|
56
|
+
```http
|
|
57
|
+
POST /accounts/{account_id}/cni/cnis
|
|
58
|
+
```
|
|
59
|
+
Body: `account`, `cust_ip`, `cf_ip`, `bgp_asn`, `bgp_password`, `vlan`
|
|
60
|
+
|
|
61
|
+
### Get/Update/Delete
|
|
62
|
+
```http
|
|
63
|
+
GET /accounts/{account_id}/cni/cnis/{cni}
|
|
64
|
+
PUT /accounts/{account_id}/cni/cnis/{cni}
|
|
65
|
+
DELETE /accounts/{account_id}/cni/cnis/{cni}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Slots
|
|
69
|
+
|
|
70
|
+
### List
|
|
71
|
+
```http
|
|
72
|
+
GET /accounts/{account_id}/cni/slots
|
|
73
|
+
```
|
|
74
|
+
Query: `facility`, `occupied`
|
|
75
|
+
|
|
76
|
+
### Get
|
|
77
|
+
```http
|
|
78
|
+
GET /accounts/{account_id}/cni/slots/{slot}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Settings
|
|
82
|
+
|
|
83
|
+
### Get/Update
|
|
84
|
+
```http
|
|
85
|
+
GET /accounts/{account_id}/cni/settings
|
|
86
|
+
PUT /accounts/{account_id}/cni/settings
|
|
87
|
+
```
|
|
88
|
+
Body: `default_asn`
|
|
89
|
+
|
|
90
|
+
## TypeScript SDK
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
import Cloudflare from 'cloudflare';
|
|
94
|
+
|
|
95
|
+
const client = new Cloudflare({ apiToken: process.env.CF_TOKEN });
|
|
96
|
+
|
|
97
|
+
// List
|
|
98
|
+
await client.networkInterconnects.interconnects.list({ account_id: id });
|
|
99
|
+
|
|
100
|
+
// Create
|
|
101
|
+
await client.networkInterconnects.interconnects.create({
|
|
102
|
+
account_id: id,
|
|
103
|
+
account: id,
|
|
104
|
+
slot_id: 'slot_abc',
|
|
105
|
+
type: 'direct',
|
|
106
|
+
facility: 'EWR1',
|
|
107
|
+
speed: '10G',
|
|
108
|
+
name: 'prod-interconnect',
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// Status
|
|
112
|
+
await client.networkInterconnects.interconnects.get(accountId, iconId);
|
|
113
|
+
|
|
114
|
+
// LOA (use fetch)
|
|
115
|
+
const res = await fetch(`https://api.cloudflare.com/client/v4/accounts/${id}/cni/interconnects/${iconId}/loa`, {
|
|
116
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
117
|
+
});
|
|
118
|
+
await fs.writeFile('loa.pdf', Buffer.from(await res.arrayBuffer()));
|
|
119
|
+
|
|
120
|
+
// CNI object
|
|
121
|
+
await client.networkInterconnects.cnis.create({
|
|
122
|
+
account_id: id,
|
|
123
|
+
account: id,
|
|
124
|
+
cust_ip: '192.0.2.1/31',
|
|
125
|
+
cf_ip: '192.0.2.0/31',
|
|
126
|
+
bgp_asn: 65000,
|
|
127
|
+
vlan: 100,
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// Slots
|
|
131
|
+
await client.networkInterconnects.slots.list({
|
|
132
|
+
account_id: id,
|
|
133
|
+
occupied: false,
|
|
134
|
+
});
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Python SDK
|
|
138
|
+
|
|
139
|
+
```python
|
|
140
|
+
from cloudflare import Cloudflare
|
|
141
|
+
|
|
142
|
+
client = Cloudflare(api_token=os.environ["CF_TOKEN"])
|
|
143
|
+
|
|
144
|
+
# List
|
|
145
|
+
client.network_interconnects.interconnects.list(account_id=id)
|
|
146
|
+
|
|
147
|
+
# Create
|
|
148
|
+
client.network_interconnects.interconnects.create(
|
|
149
|
+
account_id=id,
|
|
150
|
+
account=id,
|
|
151
|
+
slot_id="slot_abc",
|
|
152
|
+
type="direct",
|
|
153
|
+
facility="EWR1",
|
|
154
|
+
speed="10G",
|
|
155
|
+
name="prod-interconnect",
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
# Status
|
|
159
|
+
client.network_interconnects.interconnects.get(account_id=id, icon=icon_id)
|
|
160
|
+
|
|
161
|
+
# LOA
|
|
162
|
+
import requests
|
|
163
|
+
res = requests.get(
|
|
164
|
+
f"https://api.cloudflare.com/client/v4/accounts/{id}/cni/interconnects/{icon_id}/loa",
|
|
165
|
+
headers={"Authorization": f"Bearer {token}"}
|
|
166
|
+
)
|
|
167
|
+
with open("loa.pdf", "wb") as f:
|
|
168
|
+
f.write(res.content)
|
|
169
|
+
|
|
170
|
+
# CNI object
|
|
171
|
+
client.network_interconnects.cnis.create(
|
|
172
|
+
account_id=id,
|
|
173
|
+
account=id,
|
|
174
|
+
cust_ip="192.0.2.1/31",
|
|
175
|
+
cf_ip="192.0.2.0/31",
|
|
176
|
+
bgp_asn=65000,
|
|
177
|
+
vlan=100,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
# Slots
|
|
181
|
+
client.network_interconnects.slots.list(
|
|
182
|
+
account_id=id,
|
|
183
|
+
occupied=False,
|
|
184
|
+
)
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## cURL
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
export CF_TOKEN="token"
|
|
191
|
+
export ACCOUNT_ID="id"
|
|
192
|
+
|
|
193
|
+
# List
|
|
194
|
+
curl "https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/cni/interconnects" \
|
|
195
|
+
-H "Authorization: Bearer ${CF_TOKEN}"
|
|
196
|
+
|
|
197
|
+
# Create
|
|
198
|
+
curl -X POST "https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/cni/interconnects" \
|
|
199
|
+
-H "Authorization: Bearer ${CF_TOKEN}" \
|
|
200
|
+
-H "Content-Type: application/json" \
|
|
201
|
+
-d '{
|
|
202
|
+
"account": "'${ACCOUNT_ID}'",
|
|
203
|
+
"slot_id": "slot_abc",
|
|
204
|
+
"type": "direct",
|
|
205
|
+
"facility": "EWR1",
|
|
206
|
+
"speed": "10G",
|
|
207
|
+
"name": "prod-interconnect"
|
|
208
|
+
}'
|
|
209
|
+
|
|
210
|
+
# Status
|
|
211
|
+
curl "https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/cni/interconnects/${ICON_ID}/status" \
|
|
212
|
+
-H "Authorization: Bearer ${CF_TOKEN}"
|
|
213
|
+
|
|
214
|
+
# LOA
|
|
215
|
+
curl "https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/cni/interconnects/${ICON_ID}/loa" \
|
|
216
|
+
-H "Authorization: Bearer ${CF_TOKEN}" \
|
|
217
|
+
--output loa.pdf
|
|
218
|
+
|
|
219
|
+
# CNI object
|
|
220
|
+
curl -X POST "https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/cni/cnis" \
|
|
221
|
+
-H "Authorization: Bearer ${CF_TOKEN}" \
|
|
222
|
+
-H "Content-Type: application/json" \
|
|
223
|
+
-d '{
|
|
224
|
+
"account": "'${ACCOUNT_ID}'",
|
|
225
|
+
"cust_ip": "192.0.2.1/31",
|
|
226
|
+
"cf_ip": "192.0.2.0/31",
|
|
227
|
+
"bgp_asn": 65000,
|
|
228
|
+
"vlan": 100
|
|
229
|
+
}'
|
|
230
|
+
|
|
231
|
+
# Slots
|
|
232
|
+
curl "https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/cni/slots?occupied=false" \
|
|
233
|
+
-H "Authorization: Bearer ${CF_TOKEN}"
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Resources
|
|
237
|
+
|
|
238
|
+
- [API Docs](https://developers.cloudflare.com/api/resources/network_interconnects/)
|
|
239
|
+
- [TypeScript SDK](https://github.com/cloudflare/cloudflare-typescript)
|
|
240
|
+
- [Python SDK](https://github.com/cloudflare/cloudflare-python)
|
package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/configuration.md
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# CNI Configuration
|
|
2
|
+
|
|
3
|
+
See [README.md](./README.md) for overview.
|
|
4
|
+
|
|
5
|
+
## Workflow (2-4 weeks)
|
|
6
|
+
|
|
7
|
+
1. **Submit request** (Week 1): Contact account team, provide type/location/use case
|
|
8
|
+
2. **Review config** (Week 1-2, v1 only): Approve IP/VLAN/spec doc
|
|
9
|
+
3. **Order connection** (Week 2-3):
|
|
10
|
+
- **Direct**: Get LOA, order cross-connect from facility
|
|
11
|
+
- **Partner**: Order virtual circuit in partner portal
|
|
12
|
+
- **Cloud**: Order Direct Connect/Cloud Interconnect, send LOA+VLAN to CF
|
|
13
|
+
4. **Configure** (Week 3): Both sides configure per doc
|
|
14
|
+
5. **Test** (Week 3-4): Ping, verify BGP, check routes
|
|
15
|
+
6. **Health checks** (Week 4): Configure [Magic Transit](https://developers.cloudflare.com/magic-transit/how-to/configure-tunnel-endpoints/#add-tunnels) or [Magic WAN](https://developers.cloudflare.com/magic-wan/configuration/manually/how-to/configure-tunnel-endpoints/#add-tunnels) health checks
|
|
16
|
+
7. **Activate** (Week 4): Route traffic, verify flow
|
|
17
|
+
8. **Monitor**: Enable [maintenance notifications](https://developers.cloudflare.com/network-interconnect/monitoring-and-alerts/#enable-cloudflare-status-maintenance-notification)
|
|
18
|
+
|
|
19
|
+
## BGP Configuration
|
|
20
|
+
|
|
21
|
+
**v1 Requirements:**
|
|
22
|
+
- BGP ASN (provide during setup)
|
|
23
|
+
- /31 subnet for peering
|
|
24
|
+
- Optional: BGP password
|
|
25
|
+
|
|
26
|
+
**v2:** Simplified, less BGP config needed.
|
|
27
|
+
|
|
28
|
+
**Example v1 BGP:**
|
|
29
|
+
```
|
|
30
|
+
Router ID: 192.0.2.1
|
|
31
|
+
Peer IP: 192.0.2.0
|
|
32
|
+
Remote ASN: 13335
|
|
33
|
+
Local ASN: 65000
|
|
34
|
+
Password: [optional]
|
|
35
|
+
VLAN: 100
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Cloud Interconnect Setup
|
|
39
|
+
|
|
40
|
+
### AWS Direct Connect (Beta)
|
|
41
|
+
|
|
42
|
+
**Requirements:** Magic WAN, AWS Dedicated Direct Connect 1/10 Gbps.
|
|
43
|
+
|
|
44
|
+
**Process:**
|
|
45
|
+
1. Contact CF account team
|
|
46
|
+
2. Choose location
|
|
47
|
+
3. Order in AWS portal
|
|
48
|
+
4. AWS provides LOA + VLAN ID
|
|
49
|
+
5. Send to CF account team
|
|
50
|
+
6. Wait ~4 weeks
|
|
51
|
+
|
|
52
|
+
**Post-setup:** Add [static routes](https://developers.cloudflare.com/magic-wan/configuration/manually/how-to/configure-routes/#configure-static-routes) to Magic WAN. Enable [bidirectional health checks](https://developers.cloudflare.com/magic-wan/configuration/manually/how-to/configure-tunnel-endpoints/#legacy-bidirectional-health-checks).
|
|
53
|
+
|
|
54
|
+
### GCP Cloud Interconnect (Beta)
|
|
55
|
+
|
|
56
|
+
**Setup via Dashboard:**
|
|
57
|
+
1. Interconnects → Create → Cloud Interconnect → Google
|
|
58
|
+
2. Provide name, MTU (match GCP VLAN attachment), speed
|
|
59
|
+
3. Enter VLAN attachment pairing key
|
|
60
|
+
4. Confirm order
|
|
61
|
+
|
|
62
|
+
**Routing to GCP:** Add [static routes](https://developers.cloudflare.com/magic-wan/configuration/manually/how-to/configure-routes/#configure-static-routes). BGP routes from GCP Cloud Router **ignored**.
|
|
63
|
+
|
|
64
|
+
**Routing to CF:** Configure [custom learned routes](https://cloud.google.com/network-connectivity/docs/router/how-to/configure-custom-learned-routes) in Cloud Router. Request prefixes from CF account team.
|
|
65
|
+
|
|
66
|
+
## Monitoring
|
|
67
|
+
|
|
68
|
+
**Dashboard Status:**
|
|
69
|
+
- **Active**: Link up, sufficient light, Ethernet negotiated
|
|
70
|
+
- **Unhealthy**: Link down, no/low light (<-20 dBm), can't negotiate
|
|
71
|
+
- **Pending**: Cross-connect incomplete, device unresponsive, RX/TX swapped
|
|
72
|
+
|
|
73
|
+
**Alerts:**
|
|
74
|
+
|
|
75
|
+
**CNI Connection Maintenance** (Magic Networking only):
|
|
76
|
+
```
|
|
77
|
+
Dashboard → Notifications → Add
|
|
78
|
+
Product: Cloudflare Network Interconnect
|
|
79
|
+
Type: Connection Maintenance Alert
|
|
80
|
+
```
|
|
81
|
+
Warnings up to 2 weeks advance. 6hr delay for new additions.
|
|
82
|
+
|
|
83
|
+
**Cloudflare Status Maintenance** (entire PoP):
|
|
84
|
+
```
|
|
85
|
+
Dashboard → Notifications → Add
|
|
86
|
+
Product: Cloudflare Status
|
|
87
|
+
Filter PoPs: gru,fra,lhr
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Find PoP code:**
|
|
91
|
+
```
|
|
92
|
+
Dashboard → Magic Transit/WAN → Configuration → Interconnects
|
|
93
|
+
Select CNI → Note Data Center (e.g., "gru-b")
|
|
94
|
+
Use first 3 letters: "gru"
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Best Practices
|
|
98
|
+
|
|
99
|
+
**Design:**
|
|
100
|
+
- Choose locations with device diversity
|
|
101
|
+
- Plan redundancy from start
|
|
102
|
+
- Select appropriate dataplane for use case
|
|
103
|
+
- Document capacity + growth
|
|
104
|
+
|
|
105
|
+
**Ordering:**
|
|
106
|
+
- Verify facility codes match LOA
|
|
107
|
+
- Confirm single-mode fiber
|
|
108
|
+
- Check optic types (10GBASE-LR/100GBASE-LR4)
|
|
109
|
+
|
|
110
|
+
**Config:**
|
|
111
|
+
- /31 subnets
|
|
112
|
+
- BGP passwords
|
|
113
|
+
- BFD for v1
|
|
114
|
+
- Test ping before BGP
|
|
115
|
+
|
|
116
|
+
**Production:**
|
|
117
|
+
- Enable maintenance notifications immediately
|
|
118
|
+
- Monitor status programmatically
|
|
119
|
+
- Test backup connectivity regularly
|
|
120
|
+
- Document escalation paths
|
|
121
|
+
|
|
122
|
+
**Security:**
|
|
123
|
+
- Minimum API token permissions
|
|
124
|
+
- Rotate BGP passwords
|
|
125
|
+
- BGP route filtering
|
|
126
|
+
- Monitor unexpected advertisements
|
|
127
|
+
- Use Magic Firewall
|