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.
Files changed (321) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/template/.opencode/AGENTS.md +209 -77
  3. package/dist/template/.opencode/agent/plan.md +4 -0
  4. package/dist/template/.opencode/command/cloudflare.md +70 -0
  5. package/dist/template/.opencode/package.json +1 -1
  6. package/dist/template/.opencode/skill/cloudflare/SKILL.md +233 -0
  7. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/README.md +35 -0
  8. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/api.md +100 -0
  9. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/configuration.md +99 -0
  10. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/gotchas.md +59 -0
  11. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/patterns.md +89 -0
  12. package/dist/template/.opencode/skill/cloudflare/references/ai-gateway/README.md +695 -0
  13. package/dist/template/.opencode/skill/cloudflare/references/ai-search/README.md +14 -0
  14. package/dist/template/.opencode/skill/cloudflare/references/ai-search/api.md +38 -0
  15. package/dist/template/.opencode/skill/cloudflare/references/ai-search/configuration.md +52 -0
  16. package/dist/template/.opencode/skill/cloudflare/references/ai-search/gotchas.md +41 -0
  17. package/dist/template/.opencode/skill/cloudflare/references/ai-search/patterns.md +45 -0
  18. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/README.md +14 -0
  19. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/api.md +27 -0
  20. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/configuration.md +45 -0
  21. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/gotchas.md +3 -0
  22. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/patterns.md +36 -0
  23. package/dist/template/.opencode/skill/cloudflare/references/api/README.md +21 -0
  24. package/dist/template/.opencode/skill/cloudflare/references/api/api.md +31 -0
  25. package/dist/template/.opencode/skill/cloudflare/references/api/configuration.md +20 -0
  26. package/dist/template/.opencode/skill/cloudflare/references/api/gotchas.md +28 -0
  27. package/dist/template/.opencode/skill/cloudflare/references/api/patterns.md +47 -0
  28. package/dist/template/.opencode/skill/cloudflare/references/api-shield/README.md +20 -0
  29. package/dist/template/.opencode/skill/cloudflare/references/api-shield/api.md +78 -0
  30. package/dist/template/.opencode/skill/cloudflare/references/api-shield/configuration.md +128 -0
  31. package/dist/template/.opencode/skill/cloudflare/references/api-shield/gotchas.md +51 -0
  32. package/dist/template/.opencode/skill/cloudflare/references/api-shield/patterns.md +145 -0
  33. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/README.md +16 -0
  34. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/api.md +50 -0
  35. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/configuration.md +53 -0
  36. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/gotchas.md +16 -0
  37. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/patterns.md +45 -0
  38. package/dist/template/.opencode/skill/cloudflare/references/bindings/README.md +14 -0
  39. package/dist/template/.opencode/skill/cloudflare/references/bindings/api.md +3 -0
  40. package/dist/template/.opencode/skill/cloudflare/references/bindings/configuration.md +58 -0
  41. package/dist/template/.opencode/skill/cloudflare/references/bindings/gotchas.md +35 -0
  42. package/dist/template/.opencode/skill/cloudflare/references/bindings/patterns.md +37 -0
  43. package/dist/template/.opencode/skill/cloudflare/references/bot-management/README.md +71 -0
  44. package/dist/template/.opencode/skill/cloudflare/references/bot-management/api.md +168 -0
  45. package/dist/template/.opencode/skill/cloudflare/references/bot-management/configuration.md +114 -0
  46. package/dist/template/.opencode/skill/cloudflare/references/bot-management/gotchas.md +99 -0
  47. package/dist/template/.opencode/skill/cloudflare/references/bot-management/patterns.md +125 -0
  48. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/README.md +16 -0
  49. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/api.md +54 -0
  50. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/configuration.md +47 -0
  51. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/gotchas.md +29 -0
  52. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/patterns.md +29 -0
  53. package/dist/template/.opencode/skill/cloudflare/references/c3/README.md +264 -0
  54. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/README.md +93 -0
  55. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/api.md +176 -0
  56. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/configuration.md +164 -0
  57. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/gotchas.md +203 -0
  58. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/patterns.md +180 -0
  59. package/dist/template/.opencode/skill/cloudflare/references/containers/README.md +16 -0
  60. package/dist/template/.opencode/skill/cloudflare/references/containers/api.md +43 -0
  61. package/dist/template/.opencode/skill/cloudflare/references/containers/configuration.md +56 -0
  62. package/dist/template/.opencode/skill/cloudflare/references/containers/gotchas.md +21 -0
  63. package/dist/template/.opencode/skill/cloudflare/references/containers/patterns.md +40 -0
  64. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/README.md +85 -0
  65. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/api.md +198 -0
  66. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/configuration.md +151 -0
  67. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/gotchas.md +129 -0
  68. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/patterns.md +122 -0
  69. package/dist/template/.opencode/skill/cloudflare/references/d1/README.md +92 -0
  70. package/dist/template/.opencode/skill/cloudflare/references/d1/api.md +141 -0
  71. package/dist/template/.opencode/skill/cloudflare/references/d1/configuration.md +127 -0
  72. package/dist/template/.opencode/skill/cloudflare/references/d1/gotchas.md +70 -0
  73. package/dist/template/.opencode/skill/cloudflare/references/d1/patterns.md +144 -0
  74. package/dist/template/.opencode/skill/cloudflare/references/ddos/README.md +34 -0
  75. package/dist/template/.opencode/skill/cloudflare/references/ddos/api.md +136 -0
  76. package/dist/template/.opencode/skill/cloudflare/references/ddos/configuration.md +67 -0
  77. package/dist/template/.opencode/skill/cloudflare/references/ddos/gotchas.md +114 -0
  78. package/dist/template/.opencode/skill/cloudflare/references/ddos/patterns.md +158 -0
  79. package/dist/template/.opencode/skill/cloudflare/references/do-storage/README.md +62 -0
  80. package/dist/template/.opencode/skill/cloudflare/references/do-storage/api.md +89 -0
  81. package/dist/template/.opencode/skill/cloudflare/references/do-storage/configuration.md +116 -0
  82. package/dist/template/.opencode/skill/cloudflare/references/do-storage/gotchas.md +93 -0
  83. package/dist/template/.opencode/skill/cloudflare/references/do-storage/patterns.md +112 -0
  84. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/README.md +125 -0
  85. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/api.md +152 -0
  86. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/configuration.md +148 -0
  87. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/gotchas.md +158 -0
  88. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/patterns.md +255 -0
  89. package/dist/template/.opencode/skill/cloudflare/references/email-routing/README.md +18 -0
  90. package/dist/template/.opencode/skill/cloudflare/references/email-routing/api.md +46 -0
  91. package/dist/template/.opencode/skill/cloudflare/references/email-routing/configuration.md +63 -0
  92. package/dist/template/.opencode/skill/cloudflare/references/email-routing/gotchas.md +16 -0
  93. package/dist/template/.opencode/skill/cloudflare/references/email-routing/patterns.md +46 -0
  94. package/dist/template/.opencode/skill/cloudflare/references/email-workers/README.md +598 -0
  95. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/README.md +62 -0
  96. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/api.md +137 -0
  97. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/configuration.md +133 -0
  98. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/gotchas.md +184 -0
  99. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/patterns.md +176 -0
  100. package/dist/template/.opencode/skill/cloudflare/references/images/README.md +14 -0
  101. package/dist/template/.opencode/skill/cloudflare/references/images/api.md +3 -0
  102. package/dist/template/.opencode/skill/cloudflare/references/images/configuration.md +45 -0
  103. package/dist/template/.opencode/skill/cloudflare/references/images/gotchas.md +23 -0
  104. package/dist/template/.opencode/skill/cloudflare/references/images/patterns.md +31 -0
  105. package/dist/template/.opencode/skill/cloudflare/references/kv/README.md +60 -0
  106. package/dist/template/.opencode/skill/cloudflare/references/kv/api.md +114 -0
  107. package/dist/template/.opencode/skill/cloudflare/references/kv/configuration.md +92 -0
  108. package/dist/template/.opencode/skill/cloudflare/references/kv/gotchas.md +117 -0
  109. package/dist/template/.opencode/skill/cloudflare/references/kv/patterns.md +139 -0
  110. package/dist/template/.opencode/skill/cloudflare/references/miniflare/README.md +64 -0
  111. package/dist/template/.opencode/skill/cloudflare/references/miniflare/api.md +144 -0
  112. package/dist/template/.opencode/skill/cloudflare/references/miniflare/configuration.md +203 -0
  113. package/dist/template/.opencode/skill/cloudflare/references/miniflare/gotchas.md +187 -0
  114. package/dist/template/.opencode/skill/cloudflare/references/miniflare/patterns.md +211 -0
  115. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/README.md +60 -0
  116. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/api.md +240 -0
  117. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/configuration.md +127 -0
  118. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/gotchas.md +171 -0
  119. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/patterns.md +171 -0
  120. package/dist/template/.opencode/skill/cloudflare/references/observability/README.md +18 -0
  121. package/dist/template/.opencode/skill/cloudflare/references/observability/api.md +51 -0
  122. package/dist/template/.opencode/skill/cloudflare/references/observability/configuration.md +60 -0
  123. package/dist/template/.opencode/skill/cloudflare/references/observability/gotchas.md +36 -0
  124. package/dist/template/.opencode/skill/cloudflare/references/observability/patterns.md +42 -0
  125. package/dist/template/.opencode/skill/cloudflare/references/pages/README.md +76 -0
  126. package/dist/template/.opencode/skill/cloudflare/references/pages/api.md +200 -0
  127. package/dist/template/.opencode/skill/cloudflare/references/pages/configuration.md +228 -0
  128. package/dist/template/.opencode/skill/cloudflare/references/pages/gotchas.md +161 -0
  129. package/dist/template/.opencode/skill/cloudflare/references/pages/patterns.md +145 -0
  130. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/README.md +57 -0
  131. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/api.md +201 -0
  132. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/configuration.md +159 -0
  133. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/gotchas.md +151 -0
  134. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/patterns.md +190 -0
  135. package/dist/template/.opencode/skill/cloudflare/references/pipelines/README.md +664 -0
  136. package/dist/template/.opencode/skill/cloudflare/references/pulumi/README.md +107 -0
  137. package/dist/template/.opencode/skill/cloudflare/references/pulumi/api.md +194 -0
  138. package/dist/template/.opencode/skill/cloudflare/references/pulumi/configuration.md +216 -0
  139. package/dist/template/.opencode/skill/cloudflare/references/pulumi/gotchas.md +223 -0
  140. package/dist/template/.opencode/skill/cloudflare/references/pulumi/patterns.md +139 -0
  141. package/dist/template/.opencode/skill/cloudflare/references/queues/README.md +69 -0
  142. package/dist/template/.opencode/skill/cloudflare/references/queues/api.md +138 -0
  143. package/dist/template/.opencode/skill/cloudflare/references/queues/configuration.md +125 -0
  144. package/dist/template/.opencode/skill/cloudflare/references/queues/gotchas.md +112 -0
  145. package/dist/template/.opencode/skill/cloudflare/references/queues/patterns.md +155 -0
  146. package/dist/template/.opencode/skill/cloudflare/references/r2/README.md +61 -0
  147. package/dist/template/.opencode/skill/cloudflare/references/r2/api.md +127 -0
  148. package/dist/template/.opencode/skill/cloudflare/references/r2/configuration.md +76 -0
  149. package/dist/template/.opencode/skill/cloudflare/references/r2/gotchas.md +94 -0
  150. package/dist/template/.opencode/skill/cloudflare/references/r2/patterns.md +127 -0
  151. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/README.md +18 -0
  152. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/api.md +29 -0
  153. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/configuration.md +39 -0
  154. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/gotchas.md +20 -0
  155. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/patterns.md +46 -0
  156. package/dist/template/.opencode/skill/cloudflare/references/r2-sql/README.md +512 -0
  157. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/README.md +21 -0
  158. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/api.md +135 -0
  159. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/configuration.md +63 -0
  160. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/gotchas.md +75 -0
  161. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/patterns.md +102 -0
  162. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/README.md +81 -0
  163. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/api.md +164 -0
  164. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/configuration.md +147 -0
  165. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/gotchas.md +172 -0
  166. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/patterns.md +155 -0
  167. package/dist/template/.opencode/skill/cloudflare/references/sandbox/README.md +90 -0
  168. package/dist/template/.opencode/skill/cloudflare/references/sandbox/api.md +178 -0
  169. package/dist/template/.opencode/skill/cloudflare/references/sandbox/configuration.md +131 -0
  170. package/dist/template/.opencode/skill/cloudflare/references/sandbox/gotchas.md +156 -0
  171. package/dist/template/.opencode/skill/cloudflare/references/sandbox/patterns.md +203 -0
  172. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/README.md +58 -0
  173. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/api.md +182 -0
  174. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/configuration.md +140 -0
  175. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/gotchas.md +129 -0
  176. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/patterns.md +218 -0
  177. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/README.md +91 -0
  178. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/api.md +139 -0
  179. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/configuration.md +129 -0
  180. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/gotchas.md +87 -0
  181. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/patterns.md +135 -0
  182. package/dist/template/.opencode/skill/cloudflare/references/snippets/README.md +15 -0
  183. package/dist/template/.opencode/skill/cloudflare/references/snippets/api.md +47 -0
  184. package/dist/template/.opencode/skill/cloudflare/references/snippets/configuration.md +33 -0
  185. package/dist/template/.opencode/skill/cloudflare/references/snippets/gotchas.md +21 -0
  186. package/dist/template/.opencode/skill/cloudflare/references/snippets/patterns.md +34 -0
  187. package/dist/template/.opencode/skill/cloudflare/references/spectrum/README.md +16 -0
  188. package/dist/template/.opencode/skill/cloudflare/references/spectrum/api.md +24 -0
  189. package/dist/template/.opencode/skill/cloudflare/references/spectrum/configuration.md +43 -0
  190. package/dist/template/.opencode/skill/cloudflare/references/spectrum/gotchas.md +42 -0
  191. package/dist/template/.opencode/skill/cloudflare/references/spectrum/patterns.md +40 -0
  192. package/dist/template/.opencode/skill/cloudflare/references/static-assets/README.md +14 -0
  193. package/dist/template/.opencode/skill/cloudflare/references/static-assets/api.md +3 -0
  194. package/dist/template/.opencode/skill/cloudflare/references/static-assets/configuration.md +47 -0
  195. package/dist/template/.opencode/skill/cloudflare/references/static-assets/gotchas.md +44 -0
  196. package/dist/template/.opencode/skill/cloudflare/references/static-assets/patterns.md +42 -0
  197. package/dist/template/.opencode/skill/cloudflare/references/stream/README.md +103 -0
  198. package/dist/template/.opencode/skill/cloudflare/references/stream/api.md +204 -0
  199. package/dist/template/.opencode/skill/cloudflare/references/stream/configuration.md +127 -0
  200. package/dist/template/.opencode/skill/cloudflare/references/stream/gotchas.md +131 -0
  201. package/dist/template/.opencode/skill/cloudflare/references/stream/patterns.md +152 -0
  202. package/dist/template/.opencode/skill/cloudflare/references/tail-workers/README.md +640 -0
  203. package/dist/template/.opencode/skill/cloudflare/references/terraform/README.md +76 -0
  204. package/dist/template/.opencode/skill/cloudflare/references/terraform/api.md +159 -0
  205. package/dist/template/.opencode/skill/cloudflare/references/terraform/configuration.md +156 -0
  206. package/dist/template/.opencode/skill/cloudflare/references/terraform/gotchas.md +207 -0
  207. package/dist/template/.opencode/skill/cloudflare/references/terraform/patterns.md +135 -0
  208. package/dist/template/.opencode/skill/cloudflare/references/tunnel/README.md +82 -0
  209. package/dist/template/.opencode/skill/cloudflare/references/tunnel/api.md +105 -0
  210. package/dist/template/.opencode/skill/cloudflare/references/tunnel/configuration.md +113 -0
  211. package/dist/template/.opencode/skill/cloudflare/references/tunnel/gotchas.md +115 -0
  212. package/dist/template/.opencode/skill/cloudflare/references/tunnel/patterns.md +157 -0
  213. package/dist/template/.opencode/skill/cloudflare/references/turn/README.md +699 -0
  214. package/dist/template/.opencode/skill/cloudflare/references/turnstile/README.md +14 -0
  215. package/dist/template/.opencode/skill/cloudflare/references/turnstile/api.md +3 -0
  216. package/dist/template/.opencode/skill/cloudflare/references/turnstile/configuration.md +19 -0
  217. package/dist/template/.opencode/skill/cloudflare/references/turnstile/gotchas.md +27 -0
  218. package/dist/template/.opencode/skill/cloudflare/references/turnstile/patterns.md +41 -0
  219. package/dist/template/.opencode/skill/cloudflare/references/vectorize/README.md +682 -0
  220. package/dist/template/.opencode/skill/cloudflare/references/waf/README.md +14 -0
  221. package/dist/template/.opencode/skill/cloudflare/references/waf/api.md +3 -0
  222. package/dist/template/.opencode/skill/cloudflare/references/waf/configuration.md +44 -0
  223. package/dist/template/.opencode/skill/cloudflare/references/waf/gotchas.md +24 -0
  224. package/dist/template/.opencode/skill/cloudflare/references/waf/patterns.md +29 -0
  225. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/README.md +19 -0
  226. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/api.md +52 -0
  227. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/configuration.md +31 -0
  228. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/gotchas.md +28 -0
  229. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/patterns.md +52 -0
  230. package/dist/template/.opencode/skill/cloudflare/references/workerd/README.md +47 -0
  231. package/dist/template/.opencode/skill/cloudflare/references/workerd/api.md +199 -0
  232. package/dist/template/.opencode/skill/cloudflare/references/workerd/configuration.md +185 -0
  233. package/dist/template/.opencode/skill/cloudflare/references/workerd/gotchas.md +203 -0
  234. package/dist/template/.opencode/skill/cloudflare/references/workerd/patterns.md +216 -0
  235. package/dist/template/.opencode/skill/cloudflare/references/workers/README.md +96 -0
  236. package/dist/template/.opencode/skill/cloudflare/references/workers/api.md +137 -0
  237. package/dist/template/.opencode/skill/cloudflare/references/workers/configuration.md +147 -0
  238. package/dist/template/.opencode/skill/cloudflare/references/workers/gotchas.md +99 -0
  239. package/dist/template/.opencode/skill/cloudflare/references/workers/patterns.md +149 -0
  240. package/dist/template/.opencode/skill/cloudflare/references/workers-ai/README.md +116 -0
  241. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/README.md +48 -0
  242. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/api.md +169 -0
  243. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/configuration.md +136 -0
  244. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/gotchas.md +130 -0
  245. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/patterns.md +170 -0
  246. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/README.md +16 -0
  247. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/api.md +20 -0
  248. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/configuration.md +3 -0
  249. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/gotchas.md +35 -0
  250. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/patterns.md +42 -0
  251. package/dist/template/.opencode/skill/cloudflare/references/workers-vpc/README.md +579 -0
  252. package/dist/template/.opencode/skill/cloudflare/references/workflows/README.md +62 -0
  253. package/dist/template/.opencode/skill/cloudflare/references/workflows/api.md +125 -0
  254. package/dist/template/.opencode/skill/cloudflare/references/workflows/configuration.md +177 -0
  255. package/dist/template/.opencode/skill/cloudflare/references/workflows/gotchas.md +136 -0
  256. package/dist/template/.opencode/skill/cloudflare/references/workflows/patterns.md +132 -0
  257. package/dist/template/.opencode/skill/cloudflare/references/wrangler/README.md +90 -0
  258. package/dist/template/.opencode/skill/cloudflare/references/wrangler/api.md +140 -0
  259. package/dist/template/.opencode/skill/cloudflare/references/wrangler/configuration.md +128 -0
  260. package/dist/template/.opencode/skill/cloudflare/references/wrangler/gotchas.md +93 -0
  261. package/dist/template/.opencode/skill/cloudflare/references/wrangler/patterns.md +150 -0
  262. package/dist/template/.opencode/skill/cloudflare/references/zaraz/README.md +360 -0
  263. package/dist/template/.opencode/skill/react-best-practices/AGENTS.md +2410 -0
  264. package/dist/template/.opencode/skill/react-best-practices/README.md +123 -0
  265. package/dist/template/.opencode/skill/react-best-practices/SKILL.md +125 -0
  266. package/dist/template/.opencode/skill/react-best-practices/metadata.json +15 -0
  267. package/dist/template/.opencode/skill/react-best-practices/rules/_sections.md +46 -0
  268. package/dist/template/.opencode/skill/react-best-practices/rules/_template.md +28 -0
  269. package/dist/template/.opencode/skill/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  270. package/dist/template/.opencode/skill/react-best-practices/rules/advanced-use-latest.md +49 -0
  271. package/dist/template/.opencode/skill/react-best-practices/rules/async-api-routes.md +38 -0
  272. package/dist/template/.opencode/skill/react-best-practices/rules/async-defer-await.md +80 -0
  273. package/dist/template/.opencode/skill/react-best-practices/rules/async-dependencies.md +36 -0
  274. package/dist/template/.opencode/skill/react-best-practices/rules/async-parallel.md +28 -0
  275. package/dist/template/.opencode/skill/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  276. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  277. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-conditional.md +31 -0
  278. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  279. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  280. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-preload.md +50 -0
  281. package/dist/template/.opencode/skill/react-best-practices/rules/client-event-listeners.md +74 -0
  282. package/dist/template/.opencode/skill/react-best-practices/rules/client-localstorage-schema.md +71 -0
  283. package/dist/template/.opencode/skill/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  284. package/dist/template/.opencode/skill/react-best-practices/rules/client-swr-dedup.md +56 -0
  285. package/dist/template/.opencode/skill/react-best-practices/rules/js-batch-dom-css.md +82 -0
  286. package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-function-results.md +80 -0
  287. package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-property-access.md +28 -0
  288. package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-storage.md +70 -0
  289. package/dist/template/.opencode/skill/react-best-practices/rules/js-combine-iterations.md +32 -0
  290. package/dist/template/.opencode/skill/react-best-practices/rules/js-early-exit.md +50 -0
  291. package/dist/template/.opencode/skill/react-best-practices/rules/js-hoist-regexp.md +45 -0
  292. package/dist/template/.opencode/skill/react-best-practices/rules/js-index-maps.md +37 -0
  293. package/dist/template/.opencode/skill/react-best-practices/rules/js-length-check-first.md +49 -0
  294. package/dist/template/.opencode/skill/react-best-practices/rules/js-min-max-loop.md +82 -0
  295. package/dist/template/.opencode/skill/react-best-practices/rules/js-set-map-lookups.md +24 -0
  296. package/dist/template/.opencode/skill/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  297. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-activity.md +26 -0
  298. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  299. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-conditional-render.md +40 -0
  300. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-content-visibility.md +38 -0
  301. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  302. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  303. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-svg-precision.md +28 -0
  304. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-defer-reads.md +39 -0
  305. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-dependencies.md +45 -0
  306. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-derived-state.md +29 -0
  307. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  308. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  309. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-memo.md +44 -0
  310. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-transitions.md +40 -0
  311. package/dist/template/.opencode/skill/react-best-practices/rules/server-after-nonblocking.md +73 -0
  312. package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-lru.md +41 -0
  313. package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-react.md +76 -0
  314. package/dist/template/.opencode/skill/react-best-practices/rules/server-parallel-fetching.md +83 -0
  315. package/dist/template/.opencode/skill/react-best-practices/rules/server-serialization.md +38 -0
  316. package/dist/template/.opencode/skill/supabase/SKILL.md +120 -0
  317. package/dist/template/.opencode/skill/supabase/mcp.json +27 -0
  318. package/dist/template/.opencode/skill/vercel-deploy-claimable/SKILL.md +112 -0
  319. package/dist/template/.opencode/skill/vercel-deploy-claimable/scripts/deploy.sh +249 -0
  320. package/dist/template/.opencode/skill/web-design-guidelines/SKILL.md +39 -0
  321. 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)
@@ -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