pi-cloudflare 0.1.0

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 (410) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +67 -0
  3. package/bin/setup.mjs +103 -0
  4. package/dist/auth-flow.d.ts +15 -0
  5. package/dist/auth-flow.d.ts.map +1 -0
  6. package/dist/auth-flow.js +90 -0
  7. package/dist/auth-flow.js.map +1 -0
  8. package/dist/client.d.ts +18 -0
  9. package/dist/client.d.ts.map +1 -0
  10. package/dist/client.js +47 -0
  11. package/dist/client.js.map +1 -0
  12. package/dist/config.d.ts +13 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +10 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/index.d.ts +24 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +109 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/oauth.d.ts +44 -0
  21. package/dist/oauth.d.ts.map +1 -0
  22. package/dist/oauth.js +135 -0
  23. package/dist/oauth.js.map +1 -0
  24. package/dist/proxy.d.ts +29 -0
  25. package/dist/proxy.d.ts.map +1 -0
  26. package/dist/proxy.js +39 -0
  27. package/dist/proxy.js.map +1 -0
  28. package/dist/servers.d.ts +19 -0
  29. package/dist/servers.d.ts.map +1 -0
  30. package/dist/servers.js +40 -0
  31. package/dist/servers.js.map +1 -0
  32. package/dist/token-store.d.ts +23 -0
  33. package/dist/token-store.d.ts.map +1 -0
  34. package/dist/token-store.js +47 -0
  35. package/dist/token-store.js.map +1 -0
  36. package/package.json +67 -0
  37. package/skills/agents-sdk/SKILL.md +221 -0
  38. package/skills/agents-sdk/references/browse-the-web.md +63 -0
  39. package/skills/agents-sdk/references/callable.md +92 -0
  40. package/skills/agents-sdk/references/client-sdk.md +110 -0
  41. package/skills/agents-sdk/references/codemode.md +110 -0
  42. package/skills/agents-sdk/references/configuration.md +72 -0
  43. package/skills/agents-sdk/references/durable-execution.md +51 -0
  44. package/skills/agents-sdk/references/email.md +146 -0
  45. package/skills/agents-sdk/references/human-in-the-loop.md +67 -0
  46. package/skills/agents-sdk/references/mcp.md +188 -0
  47. package/skills/agents-sdk/references/observability.md +44 -0
  48. package/skills/agents-sdk/references/queue-retries.md +79 -0
  49. package/skills/agents-sdk/references/routing.md +75 -0
  50. package/skills/agents-sdk/references/server-driven-messages.md +63 -0
  51. package/skills/agents-sdk/references/state-scheduling.md +171 -0
  52. package/skills/agents-sdk/references/streaming-chat.md +198 -0
  53. package/skills/agents-sdk/references/think.md +112 -0
  54. package/skills/agents-sdk/references/voice.md +68 -0
  55. package/skills/agents-sdk/references/webhooks-push.md +86 -0
  56. package/skills/agents-sdk/references/workflows.md +132 -0
  57. package/skills/cloudflare/SKILL.md +248 -0
  58. package/skills/cloudflare/references/agents-sdk/README.md +89 -0
  59. package/skills/cloudflare/references/agents-sdk/api.md +190 -0
  60. package/skills/cloudflare/references/agents-sdk/configuration.md +182 -0
  61. package/skills/cloudflare/references/agents-sdk/gotchas.md +158 -0
  62. package/skills/cloudflare/references/agents-sdk/patterns.md +192 -0
  63. package/skills/cloudflare/references/ai-gateway/README.md +175 -0
  64. package/skills/cloudflare/references/ai-gateway/configuration.md +111 -0
  65. package/skills/cloudflare/references/ai-gateway/dynamic-routing.md +82 -0
  66. package/skills/cloudflare/references/ai-gateway/features.md +96 -0
  67. package/skills/cloudflare/references/ai-gateway/sdk-integration.md +114 -0
  68. package/skills/cloudflare/references/ai-gateway/troubleshooting.md +88 -0
  69. package/skills/cloudflare/references/ai-search/README.md +138 -0
  70. package/skills/cloudflare/references/ai-search/api.md +87 -0
  71. package/skills/cloudflare/references/ai-search/configuration.md +88 -0
  72. package/skills/cloudflare/references/ai-search/gotchas.md +81 -0
  73. package/skills/cloudflare/references/ai-search/patterns.md +85 -0
  74. package/skills/cloudflare/references/analytics-engine/README.md +94 -0
  75. package/skills/cloudflare/references/analytics-engine/api.md +112 -0
  76. package/skills/cloudflare/references/analytics-engine/configuration.md +112 -0
  77. package/skills/cloudflare/references/analytics-engine/gotchas.md +85 -0
  78. package/skills/cloudflare/references/analytics-engine/patterns.md +83 -0
  79. package/skills/cloudflare/references/api/README.md +66 -0
  80. package/skills/cloudflare/references/api/api.md +204 -0
  81. package/skills/cloudflare/references/api/configuration.md +160 -0
  82. package/skills/cloudflare/references/api/gotchas.md +225 -0
  83. package/skills/cloudflare/references/api/patterns.md +204 -0
  84. package/skills/cloudflare/references/api-shield/README.md +44 -0
  85. package/skills/cloudflare/references/api-shield/api.md +141 -0
  86. package/skills/cloudflare/references/api-shield/configuration.md +192 -0
  87. package/skills/cloudflare/references/api-shield/gotchas.md +125 -0
  88. package/skills/cloudflare/references/api-shield/patterns.md +180 -0
  89. package/skills/cloudflare/references/argo-smart-routing/README.md +90 -0
  90. package/skills/cloudflare/references/argo-smart-routing/api.md +240 -0
  91. package/skills/cloudflare/references/argo-smart-routing/configuration.md +197 -0
  92. package/skills/cloudflare/references/argo-smart-routing/gotchas.md +111 -0
  93. package/skills/cloudflare/references/argo-smart-routing/patterns.md +104 -0
  94. package/skills/cloudflare/references/artifacts/README.md +79 -0
  95. package/skills/cloudflare/references/artifacts/api.md +128 -0
  96. package/skills/cloudflare/references/artifacts/configuration.md +92 -0
  97. package/skills/cloudflare/references/bindings/README.md +122 -0
  98. package/skills/cloudflare/references/bindings/api.md +203 -0
  99. package/skills/cloudflare/references/bindings/configuration.md +188 -0
  100. package/skills/cloudflare/references/bindings/gotchas.md +208 -0
  101. package/skills/cloudflare/references/bindings/patterns.md +200 -0
  102. package/skills/cloudflare/references/bot-management/README.md +94 -0
  103. package/skills/cloudflare/references/bot-management/api.md +169 -0
  104. package/skills/cloudflare/references/bot-management/configuration.md +163 -0
  105. package/skills/cloudflare/references/bot-management/gotchas.md +114 -0
  106. package/skills/cloudflare/references/bot-management/patterns.md +182 -0
  107. package/skills/cloudflare/references/browser-rendering/README.md +78 -0
  108. package/skills/cloudflare/references/browser-rendering/api.md +108 -0
  109. package/skills/cloudflare/references/browser-rendering/configuration.md +78 -0
  110. package/skills/cloudflare/references/browser-rendering/gotchas.md +88 -0
  111. package/skills/cloudflare/references/browser-rendering/patterns.md +91 -0
  112. package/skills/cloudflare/references/c3/README.md +111 -0
  113. package/skills/cloudflare/references/c3/api.md +71 -0
  114. package/skills/cloudflare/references/c3/configuration.md +81 -0
  115. package/skills/cloudflare/references/c3/gotchas.md +92 -0
  116. package/skills/cloudflare/references/c3/patterns.md +82 -0
  117. package/skills/cloudflare/references/cache-reserve/README.md +147 -0
  118. package/skills/cloudflare/references/cache-reserve/api.md +194 -0
  119. package/skills/cloudflare/references/cache-reserve/configuration.md +169 -0
  120. package/skills/cloudflare/references/cache-reserve/gotchas.md +132 -0
  121. package/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
  122. package/skills/cloudflare/references/containers/README.md +85 -0
  123. package/skills/cloudflare/references/containers/api.md +187 -0
  124. package/skills/cloudflare/references/containers/configuration.md +188 -0
  125. package/skills/cloudflare/references/containers/gotchas.md +178 -0
  126. package/skills/cloudflare/references/containers/patterns.md +202 -0
  127. package/skills/cloudflare/references/cron-triggers/README.md +99 -0
  128. package/skills/cloudflare/references/cron-triggers/api.md +196 -0
  129. package/skills/cloudflare/references/cron-triggers/configuration.md +180 -0
  130. package/skills/cloudflare/references/cron-triggers/gotchas.md +199 -0
  131. package/skills/cloudflare/references/cron-triggers/patterns.md +190 -0
  132. package/skills/cloudflare/references/d1/README.md +133 -0
  133. package/skills/cloudflare/references/d1/api.md +196 -0
  134. package/skills/cloudflare/references/d1/configuration.md +191 -0
  135. package/skills/cloudflare/references/d1/gotchas.md +98 -0
  136. package/skills/cloudflare/references/d1/patterns.md +189 -0
  137. package/skills/cloudflare/references/ddos/README.md +41 -0
  138. package/skills/cloudflare/references/ddos/api.md +164 -0
  139. package/skills/cloudflare/references/ddos/configuration.md +93 -0
  140. package/skills/cloudflare/references/ddos/gotchas.md +107 -0
  141. package/skills/cloudflare/references/ddos/patterns.md +174 -0
  142. package/skills/cloudflare/references/do-storage/README.md +75 -0
  143. package/skills/cloudflare/references/do-storage/api.md +102 -0
  144. package/skills/cloudflare/references/do-storage/configuration.md +112 -0
  145. package/skills/cloudflare/references/do-storage/gotchas.md +150 -0
  146. package/skills/cloudflare/references/do-storage/patterns.md +194 -0
  147. package/skills/cloudflare/references/do-storage/testing.md +183 -0
  148. package/skills/cloudflare/references/durable-objects/README.md +185 -0
  149. package/skills/cloudflare/references/durable-objects/api.md +187 -0
  150. package/skills/cloudflare/references/durable-objects/configuration.md +160 -0
  151. package/skills/cloudflare/references/durable-objects/gotchas.md +197 -0
  152. package/skills/cloudflare/references/durable-objects/patterns.md +201 -0
  153. package/skills/cloudflare/references/email-routing/README.md +89 -0
  154. package/skills/cloudflare/references/email-routing/api.md +195 -0
  155. package/skills/cloudflare/references/email-routing/configuration.md +186 -0
  156. package/skills/cloudflare/references/email-routing/gotchas.md +196 -0
  157. package/skills/cloudflare/references/email-routing/patterns.md +229 -0
  158. package/skills/cloudflare/references/email-workers/README.md +151 -0
  159. package/skills/cloudflare/references/email-workers/api.md +237 -0
  160. package/skills/cloudflare/references/email-workers/configuration.md +112 -0
  161. package/skills/cloudflare/references/email-workers/gotchas.md +125 -0
  162. package/skills/cloudflare/references/email-workers/patterns.md +102 -0
  163. package/skills/cloudflare/references/flagship/README.md +59 -0
  164. package/skills/cloudflare/references/flagship/api.md +390 -0
  165. package/skills/cloudflare/references/flagship/configuration.md +202 -0
  166. package/skills/cloudflare/references/flagship/gotchas.md +178 -0
  167. package/skills/cloudflare/references/flagship/patterns.md +469 -0
  168. package/skills/cloudflare/references/graphql-api/README.md +147 -0
  169. package/skills/cloudflare/references/graphql-api/api.md +175 -0
  170. package/skills/cloudflare/references/graphql-api/configuration.md +118 -0
  171. package/skills/cloudflare/references/graphql-api/gotchas.md +110 -0
  172. package/skills/cloudflare/references/graphql-api/patterns.md +225 -0
  173. package/skills/cloudflare/references/hyperdrive/README.md +82 -0
  174. package/skills/cloudflare/references/hyperdrive/api.md +143 -0
  175. package/skills/cloudflare/references/hyperdrive/configuration.md +159 -0
  176. package/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
  177. package/skills/cloudflare/references/hyperdrive/patterns.md +190 -0
  178. package/skills/cloudflare/references/images/README.md +61 -0
  179. package/skills/cloudflare/references/images/api.md +96 -0
  180. package/skills/cloudflare/references/images/configuration.md +211 -0
  181. package/skills/cloudflare/references/images/gotchas.md +99 -0
  182. package/skills/cloudflare/references/images/patterns.md +115 -0
  183. package/skills/cloudflare/references/kv/README.md +89 -0
  184. package/skills/cloudflare/references/kv/api.md +160 -0
  185. package/skills/cloudflare/references/kv/configuration.md +144 -0
  186. package/skills/cloudflare/references/kv/gotchas.md +131 -0
  187. package/skills/cloudflare/references/kv/patterns.md +196 -0
  188. package/skills/cloudflare/references/miniflare/README.md +105 -0
  189. package/skills/cloudflare/references/miniflare/api.md +187 -0
  190. package/skills/cloudflare/references/miniflare/configuration.md +173 -0
  191. package/skills/cloudflare/references/miniflare/gotchas.md +160 -0
  192. package/skills/cloudflare/references/miniflare/patterns.md +181 -0
  193. package/skills/cloudflare/references/network-interconnect/README.md +99 -0
  194. package/skills/cloudflare/references/network-interconnect/api.md +199 -0
  195. package/skills/cloudflare/references/network-interconnect/configuration.md +114 -0
  196. package/skills/cloudflare/references/network-interconnect/gotchas.md +165 -0
  197. package/skills/cloudflare/references/network-interconnect/patterns.md +166 -0
  198. package/skills/cloudflare/references/observability/README.md +88 -0
  199. package/skills/cloudflare/references/observability/api.md +164 -0
  200. package/skills/cloudflare/references/observability/configuration.md +169 -0
  201. package/skills/cloudflare/references/observability/gotchas.md +115 -0
  202. package/skills/cloudflare/references/observability/patterns.md +105 -0
  203. package/skills/cloudflare/references/pages/README.md +88 -0
  204. package/skills/cloudflare/references/pages/api.md +204 -0
  205. package/skills/cloudflare/references/pages/configuration.md +201 -0
  206. package/skills/cloudflare/references/pages/gotchas.md +203 -0
  207. package/skills/cloudflare/references/pages/patterns.md +204 -0
  208. package/skills/cloudflare/references/pages-functions/README.md +98 -0
  209. package/skills/cloudflare/references/pages-functions/api.md +143 -0
  210. package/skills/cloudflare/references/pages-functions/configuration.md +122 -0
  211. package/skills/cloudflare/references/pages-functions/gotchas.md +94 -0
  212. package/skills/cloudflare/references/pages-functions/patterns.md +137 -0
  213. package/skills/cloudflare/references/pipelines/README.md +90 -0
  214. package/skills/cloudflare/references/pipelines/api.md +124 -0
  215. package/skills/cloudflare/references/pipelines/configuration.md +155 -0
  216. package/skills/cloudflare/references/pipelines/gotchas.md +58 -0
  217. package/skills/cloudflare/references/pipelines/patterns.md +130 -0
  218. package/skills/cloudflare/references/pulumi/README.md +100 -0
  219. package/skills/cloudflare/references/pulumi/api.md +200 -0
  220. package/skills/cloudflare/references/pulumi/configuration.md +198 -0
  221. package/skills/cloudflare/references/pulumi/gotchas.md +181 -0
  222. package/skills/cloudflare/references/pulumi/patterns.md +191 -0
  223. package/skills/cloudflare/references/queues/README.md +96 -0
  224. package/skills/cloudflare/references/queues/api.md +206 -0
  225. package/skills/cloudflare/references/queues/configuration.md +144 -0
  226. package/skills/cloudflare/references/queues/gotchas.md +206 -0
  227. package/skills/cloudflare/references/queues/patterns.md +220 -0
  228. package/skills/cloudflare/references/r2/README.md +95 -0
  229. package/skills/cloudflare/references/r2/api.md +200 -0
  230. package/skills/cloudflare/references/r2/configuration.md +165 -0
  231. package/skills/cloudflare/references/r2/gotchas.md +190 -0
  232. package/skills/cloudflare/references/r2/patterns.md +193 -0
  233. package/skills/cloudflare/references/r2-data-catalog/README.md +75 -0
  234. package/skills/cloudflare/references/r2-data-catalog/api.md +122 -0
  235. package/skills/cloudflare/references/r2-data-catalog/configuration.md +98 -0
  236. package/skills/cloudflare/references/r2-data-catalog/gotchas.md +55 -0
  237. package/skills/cloudflare/references/r2-data-catalog/patterns.md +122 -0
  238. package/skills/cloudflare/references/r2-sql/README.md +64 -0
  239. package/skills/cloudflare/references/r2-sql/api.md +121 -0
  240. package/skills/cloudflare/references/r2-sql/configuration.md +50 -0
  241. package/skills/cloudflare/references/r2-sql/gotchas.md +39 -0
  242. package/skills/cloudflare/references/r2-sql/patterns.md +118 -0
  243. package/skills/cloudflare/references/realtime-sfu/README.md +65 -0
  244. package/skills/cloudflare/references/realtime-sfu/api.md +158 -0
  245. package/skills/cloudflare/references/realtime-sfu/configuration.md +137 -0
  246. package/skills/cloudflare/references/realtime-sfu/gotchas.md +133 -0
  247. package/skills/cloudflare/references/realtime-sfu/patterns.md +174 -0
  248. package/skills/cloudflare/references/realtimekit/README.md +113 -0
  249. package/skills/cloudflare/references/realtimekit/api.md +212 -0
  250. package/skills/cloudflare/references/realtimekit/configuration.md +203 -0
  251. package/skills/cloudflare/references/realtimekit/gotchas.md +169 -0
  252. package/skills/cloudflare/references/realtimekit/patterns.md +223 -0
  253. package/skills/cloudflare/references/sandbox/README.md +96 -0
  254. package/skills/cloudflare/references/sandbox/api.md +198 -0
  255. package/skills/cloudflare/references/sandbox/configuration.md +143 -0
  256. package/skills/cloudflare/references/sandbox/gotchas.md +194 -0
  257. package/skills/cloudflare/references/sandbox/patterns.md +201 -0
  258. package/skills/cloudflare/references/secrets-store/README.md +74 -0
  259. package/skills/cloudflare/references/secrets-store/api.md +200 -0
  260. package/skills/cloudflare/references/secrets-store/configuration.md +185 -0
  261. package/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
  262. package/skills/cloudflare/references/secrets-store/patterns.md +207 -0
  263. package/skills/cloudflare/references/smart-placement/README.md +138 -0
  264. package/skills/cloudflare/references/smart-placement/api.md +183 -0
  265. package/skills/cloudflare/references/smart-placement/configuration.md +196 -0
  266. package/skills/cloudflare/references/smart-placement/gotchas.md +174 -0
  267. package/skills/cloudflare/references/smart-placement/patterns.md +183 -0
  268. package/skills/cloudflare/references/snippets/README.md +68 -0
  269. package/skills/cloudflare/references/snippets/api.md +198 -0
  270. package/skills/cloudflare/references/snippets/configuration.md +227 -0
  271. package/skills/cloudflare/references/snippets/gotchas.md +86 -0
  272. package/skills/cloudflare/references/snippets/patterns.md +135 -0
  273. package/skills/cloudflare/references/spectrum/README.md +52 -0
  274. package/skills/cloudflare/references/spectrum/api.md +181 -0
  275. package/skills/cloudflare/references/spectrum/configuration.md +194 -0
  276. package/skills/cloudflare/references/spectrum/gotchas.md +145 -0
  277. package/skills/cloudflare/references/spectrum/patterns.md +196 -0
  278. package/skills/cloudflare/references/static-assets/README.md +65 -0
  279. package/skills/cloudflare/references/static-assets/api.md +199 -0
  280. package/skills/cloudflare/references/static-assets/configuration.md +186 -0
  281. package/skills/cloudflare/references/static-assets/gotchas.md +162 -0
  282. package/skills/cloudflare/references/static-assets/patterns.md +189 -0
  283. package/skills/cloudflare/references/stream/README.md +114 -0
  284. package/skills/cloudflare/references/stream/api-live.md +195 -0
  285. package/skills/cloudflare/references/stream/api.md +199 -0
  286. package/skills/cloudflare/references/stream/configuration.md +141 -0
  287. package/skills/cloudflare/references/stream/gotchas.md +130 -0
  288. package/skills/cloudflare/references/stream/patterns.md +184 -0
  289. package/skills/cloudflare/references/tail-workers/README.md +89 -0
  290. package/skills/cloudflare/references/tail-workers/api.md +200 -0
  291. package/skills/cloudflare/references/tail-workers/configuration.md +176 -0
  292. package/skills/cloudflare/references/tail-workers/gotchas.md +192 -0
  293. package/skills/cloudflare/references/tail-workers/patterns.md +180 -0
  294. package/skills/cloudflare/references/terraform/README.md +102 -0
  295. package/skills/cloudflare/references/terraform/api.md +178 -0
  296. package/skills/cloudflare/references/terraform/configuration.md +197 -0
  297. package/skills/cloudflare/references/terraform/gotchas.md +150 -0
  298. package/skills/cloudflare/references/terraform/patterns.md +174 -0
  299. package/skills/cloudflare/references/tunnel/README.md +129 -0
  300. package/skills/cloudflare/references/tunnel/api.md +193 -0
  301. package/skills/cloudflare/references/tunnel/configuration.md +157 -0
  302. package/skills/cloudflare/references/tunnel/gotchas.md +147 -0
  303. package/skills/cloudflare/references/tunnel/networking.md +168 -0
  304. package/skills/cloudflare/references/tunnel/patterns.md +192 -0
  305. package/skills/cloudflare/references/turn/README.md +82 -0
  306. package/skills/cloudflare/references/turn/api.md +239 -0
  307. package/skills/cloudflare/references/turn/configuration.md +179 -0
  308. package/skills/cloudflare/references/turn/gotchas.md +231 -0
  309. package/skills/cloudflare/references/turn/patterns.md +213 -0
  310. package/skills/cloudflare/references/turnstile/README.md +99 -0
  311. package/skills/cloudflare/references/turnstile/api.md +240 -0
  312. package/skills/cloudflare/references/turnstile/configuration.md +222 -0
  313. package/skills/cloudflare/references/turnstile/gotchas.md +218 -0
  314. package/skills/cloudflare/references/turnstile/patterns.md +193 -0
  315. package/skills/cloudflare/references/vectorize/README.md +133 -0
  316. package/skills/cloudflare/references/vectorize/api.md +88 -0
  317. package/skills/cloudflare/references/vectorize/configuration.md +88 -0
  318. package/skills/cloudflare/references/vectorize/gotchas.md +76 -0
  319. package/skills/cloudflare/references/vectorize/patterns.md +90 -0
  320. package/skills/cloudflare/references/waf/README.md +113 -0
  321. package/skills/cloudflare/references/waf/api.md +202 -0
  322. package/skills/cloudflare/references/waf/configuration.md +203 -0
  323. package/skills/cloudflare/references/waf/gotchas.md +204 -0
  324. package/skills/cloudflare/references/waf/patterns.md +197 -0
  325. package/skills/cloudflare/references/web-analytics/README.md +141 -0
  326. package/skills/cloudflare/references/web-analytics/configuration.md +76 -0
  327. package/skills/cloudflare/references/web-analytics/gotchas.md +82 -0
  328. package/skills/cloudflare/references/web-analytics/integration.md +60 -0
  329. package/skills/cloudflare/references/web-analytics/patterns.md +91 -0
  330. package/skills/cloudflare/references/workerd/README.md +78 -0
  331. package/skills/cloudflare/references/workerd/api.md +185 -0
  332. package/skills/cloudflare/references/workerd/configuration.md +183 -0
  333. package/skills/cloudflare/references/workerd/gotchas.md +139 -0
  334. package/skills/cloudflare/references/workerd/patterns.md +192 -0
  335. package/skills/cloudflare/references/workers/README.md +108 -0
  336. package/skills/cloudflare/references/workers/api.md +195 -0
  337. package/skills/cloudflare/references/workers/configuration.md +185 -0
  338. package/skills/cloudflare/references/workers/frameworks.md +197 -0
  339. package/skills/cloudflare/references/workers/gotchas.md +137 -0
  340. package/skills/cloudflare/references/workers/patterns.md +198 -0
  341. package/skills/cloudflare/references/workers-ai/README.md +197 -0
  342. package/skills/cloudflare/references/workers-ai/api.md +112 -0
  343. package/skills/cloudflare/references/workers-ai/configuration.md +97 -0
  344. package/skills/cloudflare/references/workers-ai/gotchas.md +114 -0
  345. package/skills/cloudflare/references/workers-ai/patterns.md +120 -0
  346. package/skills/cloudflare/references/workers-for-platforms/README.md +89 -0
  347. package/skills/cloudflare/references/workers-for-platforms/api.md +196 -0
  348. package/skills/cloudflare/references/workers-for-platforms/configuration.md +167 -0
  349. package/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
  350. package/skills/cloudflare/references/workers-for-platforms/patterns.md +188 -0
  351. package/skills/cloudflare/references/workers-playground/README.md +127 -0
  352. package/skills/cloudflare/references/workers-playground/api.md +101 -0
  353. package/skills/cloudflare/references/workers-playground/configuration.md +163 -0
  354. package/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
  355. package/skills/cloudflare/references/workers-playground/patterns.md +132 -0
  356. package/skills/cloudflare/references/workers-vpc/README.md +127 -0
  357. package/skills/cloudflare/references/workers-vpc/api.md +202 -0
  358. package/skills/cloudflare/references/workers-vpc/configuration.md +147 -0
  359. package/skills/cloudflare/references/workers-vpc/gotchas.md +167 -0
  360. package/skills/cloudflare/references/workers-vpc/patterns.md +209 -0
  361. package/skills/cloudflare/references/workflows/README.md +77 -0
  362. package/skills/cloudflare/references/workflows/api.md +218 -0
  363. package/skills/cloudflare/references/workflows/configuration.md +152 -0
  364. package/skills/cloudflare/references/workflows/gotchas.md +90 -0
  365. package/skills/cloudflare/references/workflows/patterns.md +175 -0
  366. package/skills/cloudflare/references/wrangler/README.md +135 -0
  367. package/skills/cloudflare/references/wrangler/api.md +188 -0
  368. package/skills/cloudflare/references/wrangler/configuration.md +197 -0
  369. package/skills/cloudflare/references/wrangler/gotchas.md +197 -0
  370. package/skills/cloudflare/references/wrangler/patterns.md +209 -0
  371. package/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +121 -0
  372. package/skills/cloudflare/references/zaraz/README.md +111 -0
  373. package/skills/cloudflare/references/zaraz/api.md +112 -0
  374. package/skills/cloudflare/references/zaraz/configuration.md +90 -0
  375. package/skills/cloudflare/references/zaraz/gotchas.md +81 -0
  376. package/skills/cloudflare/references/zaraz/patterns.md +74 -0
  377. package/skills/cloudflare-email-service/SKILL.md +103 -0
  378. package/skills/cloudflare-email-service/references/cli-and-mcp.md +125 -0
  379. package/skills/cloudflare-email-service/references/deliverability.md +285 -0
  380. package/skills/cloudflare-email-service/references/rest-api.md +184 -0
  381. package/skills/cloudflare-email-service/references/routing.md +199 -0
  382. package/skills/cloudflare-email-service/references/sending.md +252 -0
  383. package/skills/cloudflare-one/SKILL.md +176 -0
  384. package/skills/cloudflare-one-migrations/SKILL.md +110 -0
  385. package/skills/durable-objects/SKILL.md +186 -0
  386. package/skills/durable-objects/references/rules.md +295 -0
  387. package/skills/durable-objects/references/testing.md +264 -0
  388. package/skills/durable-objects/references/workers.md +346 -0
  389. package/skills/sandbox-migrate-to-next/SKILL.md +185 -0
  390. package/skills/sandbox-next/SKILL.md +91 -0
  391. package/skills/sandbox-next/references/api-quick-ref.md +94 -0
  392. package/skills/sandbox-next/references/examples.md +15 -0
  393. package/skills/sandbox-stable/SKILL.md +110 -0
  394. package/skills/turnstile-spin/README.md +51 -0
  395. package/skills/turnstile-spin/SKILL.md +330 -0
  396. package/skills/turnstile-spin/references/astro.md +199 -0
  397. package/skills/turnstile-spin/references/hugo.md +114 -0
  398. package/skills/turnstile-spin/references/nextjs-app.md +261 -0
  399. package/skills/turnstile-spin/references/nextjs-pages.md +82 -0
  400. package/skills/turnstile-spin/references/sveltekit.md +191 -0
  401. package/skills/turnstile-spin/references/vanilla-html.md +157 -0
  402. package/skills/turnstile-spin/scripts/auth-probe.sh +285 -0
  403. package/skills/turnstile-spin/scripts/persist-skill.sh +114 -0
  404. package/skills/turnstile-spin/scripts/validate.sh +137 -0
  405. package/skills/turnstile-spin/scripts/widget-create.sh +121 -0
  406. package/skills/turnstile-spin/tests/validation.md +62 -0
  407. package/skills/workers-best-practices/SKILL.md +127 -0
  408. package/skills/workers-best-practices/references/review.md +174 -0
  409. package/skills/workers-best-practices/references/rules.md +467 -0
  410. package/skills/wrangler/SKILL.md +922 -0
@@ -0,0 +1,178 @@
1
+ # Flagship Gotchas & Troubleshooting
2
+
3
+ ## Common Errors
4
+
5
+ ### Flag Always Returns Default Value
6
+
7
+ **Cause:** Flag is disabled (`enabled: false`), or no targeting rules match, or evaluation context is missing expected attributes.
8
+
9
+ **Solution:** Check these in order:
10
+
11
+ 1. Is the flag enabled? (`"enabled": true`)
12
+ 2. Do your targeting rules match the context you're passing?
13
+ 3. Are you passing the right attributes in the evaluation context?
14
+
15
+ ```typescript
16
+ // ❌ BAD — no context, rules can't match
17
+ const val = await env.FLAGS.getBooleanValue("my-flag", false);
18
+
19
+ // ✅ GOOD — pass context attributes that rules reference
20
+ const val = await env.FLAGS.getBooleanValue("my-flag", false, {
21
+ userId: "user-42",
22
+ plan: "enterprise",
23
+ });
24
+ ```
25
+
26
+ ### TYPE_MISMATCH Error in Details
27
+
28
+ **Cause:** Calling a typed method on a flag with a different type (e.g., `getBooleanValue` on a string flag).
29
+
30
+ **Solution:** Use the method matching the flag's variation type.
31
+
32
+ ```typescript
33
+ // ❌ BAD — flag "checkout-flow" has string variations
34
+ const val = await env.FLAGS.getBooleanValue("checkout-flow", false);
35
+
36
+ // ✅ GOOD
37
+ const val = await env.FLAGS.getStringValue("checkout-flow", "original");
38
+ ```
39
+
40
+ ### 409 Conflict on Flag Creation
41
+
42
+ **Cause:** A flag with that key already exists in the app.
43
+
44
+ **Solution:** Use a different key, or GET + PUT to update the existing flag.
45
+
46
+ ### Inconsistent Rollout Results
47
+
48
+ **Cause:** `targetingKey` (or the configured bucketing attribute) is missing from the evaluation context, causing random bucketing on each request.
49
+
50
+ **Solution:** Always pass a stable identifier:
51
+
52
+ ```typescript
53
+ // ❌ BAD — no targetingKey, rollout is random per request
54
+ const val = await env.FLAGS.getBooleanValue("gradual-rollout", false);
55
+
56
+ // ✅ GOOD — stable userId for consistent bucketing
57
+ const val = await env.FLAGS.getBooleanValue("gradual-rollout", false, {
58
+ userId: sessionUserId,
59
+ });
60
+ ```
61
+
62
+ ### Update Overwrites Entire Flag
63
+
64
+ **Cause:** PUT replaces the full `FlagDefinition`. Sending only changed fields deletes the rest.
65
+
66
+ **Solution:** Always read-modify-write:
67
+
68
+ ```bash
69
+ # ❌ BAD — overwrites the entire flag, losing rules/variations
70
+ curl -X PUT -d '{"enabled": true}' ...
71
+
72
+ # ✅ GOOD — GET first, modify, PUT back
73
+ FLAG=$(curl -s -H "Authorization: Bearer $TOKEN" "$URL/flags/my-flag" | jq '.result')
74
+ UPDATED=$(echo "$FLAG" | jq '.enabled = true')
75
+ echo "$UPDATED" | curl -s -X PUT -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d @- "$URL/flags/my-flag"
76
+ ```
77
+
78
+ ### Reading REST Envelope Fields
79
+
80
+ **Cause:** Management endpoints use Cloudflare v4 envelopes, not raw payloads.
81
+
82
+ **Solution:** Read `.result` for successful payloads, `.result_info.cursor` for pagination, and `.errors[].message` for errors.
83
+
84
+ ```bash
85
+ jq '.result'
86
+ jq '.result_info.cursor'
87
+ jq '.errors[].message'
88
+ ```
89
+
90
+ ### Mixing CamelCase and Snake Case in REST Responses
91
+
92
+ **Cause:** Management API responses are public API JSON and use snake_case. Evaluation responses use OpenFeature-style camelCase.
93
+
94
+ **Solution:** For management endpoints use `default_variation`, `serve_variation`, `updated_at`, `updated_by`, and changelog `flag_key`. For `/evaluate`, use `flagKey`, `variant`, and `reason`.
95
+
96
+ ### FLAG_NOT_FOUND in Client Provider
97
+
98
+ **Cause:** Flag key not included in `prefetchFlags` array.
99
+
100
+ **Solution:** Add the flag key to `prefetchFlags` when initializing `FlagshipClientProvider`.
101
+
102
+ ### Client Provider Token Exposure
103
+
104
+ **Cause:** The `authToken` passed to `FlagshipClientProvider` is visible in the browser. It can evaluate flags across all apps in the account.
105
+
106
+ **Solution:** Use a token with minimal permissions (Flagship Evaluate only). Never use a token with write/management permissions in the browser.
107
+
108
+ ---
109
+
110
+ ## Limits
111
+
112
+ | Limit | Value | Notes |
113
+ |-------|-------|-------|
114
+ | Flag key length | 1-64 chars | Alphanumeric, hyphens, underscores only |
115
+ | Flag key pattern | `/^[a-zA-Z0-9_-]+$/` | — |
116
+ | Variation value size | 10KB max | Per variation, serialized |
117
+ | Variation name length | 64 chars max | Alphanumeric, hyphens, underscores |
118
+ | Description length | 512 chars max | Nullable |
119
+ | App name length | 1-64 chars | Alphanumeric, hyphens, underscores |
120
+ | Logical nesting depth | 6 levels | AND/OR conditions |
121
+ | Mutation rate limit | 60 / 60s | Per account:app |
122
+ | Read rate limit | 600 / 60s | Per account:app |
123
+ | Rollout percentage | 0-100 | Integer |
124
+ | Rule priorities | Unique integers >= 1 | Lower = evaluated first |
125
+
126
+ ---
127
+
128
+ ## Anti-Patterns
129
+
130
+ ### Evaluating Flags in a Tight Loop
131
+
132
+ Flag evaluation via the binding is fast but not free. Avoid evaluating the same flag repeatedly in a loop — evaluate once and reuse the result.
133
+
134
+ ```typescript
135
+ // ❌ BAD
136
+ for (const item of items) {
137
+ const enabled = await env.FLAGS.getBooleanValue("my-flag", false, ctx);
138
+ // ...
139
+ }
140
+
141
+ // ✅ GOOD
142
+ const enabled = await env.FLAGS.getBooleanValue("my-flag", false, ctx);
143
+ for (const item of items) {
144
+ // use `enabled`
145
+ }
146
+ ```
147
+
148
+ ### Using the SDK Inside Workers When Binding Is Available
149
+
150
+ The binding avoids HTTP overhead entirely. Only use the SDK inside Workers when you specifically need OpenFeature vendor-neutrality.
151
+
152
+ ```typescript
153
+ // ❌ Unnecessary HTTP overhead inside a Worker
154
+ const provider = new FlagshipServerProvider({
155
+ appId: "...", accountId: "...", authToken: "...",
156
+ });
157
+
158
+ // ✅ Use the binding directly, or pass it to the SDK
159
+ const provider = new FlagshipServerProvider({ binding: env.FLAGS });
160
+ ```
161
+
162
+ ### Partial PUT Updates
163
+
164
+ The flag update API (PUT) requires the complete `FlagDefinition`. Sending only changed fields silently drops everything else. Always GET first, then modify and PUT back the full object.
165
+
166
+ ### Stale Flag Cleanup
167
+
168
+ Flags that are disabled and no longer referenced in code should be deleted. Stale flags clutter the dashboard and make it harder to understand which flags are active. Follow the safe deletion workflow in `patterns.md`.
169
+
170
+ ---
171
+
172
+ ## Propagation Behavior
173
+
174
+ Flag changes propagate globally within seconds. During the brief propagation window, some regions may serve the previous value. After propagation completes, all evaluations return the updated value.
175
+
176
+ - No Worker redeployment needed for flag changes.
177
+ - If the dashboard is temporarily unavailable, evaluation continues using the last propagated configuration.
178
+ - Flag changes made via the REST API and dashboard are equivalent — both trigger propagation.
@@ -0,0 +1,469 @@
1
+ # Flagship Patterns & Best Practices
2
+
3
+ ## Evaluating Flags in Workers (Binding)
4
+
5
+ ### Simple Boolean Toggle
6
+
7
+ ```typescript
8
+ export default {
9
+ async fetch(request: Request, env: Env): Promise<Response> {
10
+ const showNewUI = await env.FLAGS.getBooleanValue("new-ui", false, {
11
+ userId: "user-42",
12
+ });
13
+
14
+ if (showNewUI) {
15
+ return new Response("New UI");
16
+ }
17
+ return new Response("Classic UI");
18
+ },
19
+ };
20
+ ```
21
+
22
+ ### Multi-Variant String Flag
23
+
24
+ ```typescript
25
+ const checkoutFlow = await env.FLAGS.getStringValue(
26
+ "checkout-flow",
27
+ "original",
28
+ { userId, country: "US" },
29
+ );
30
+
31
+ switch (checkoutFlow) {
32
+ case "streamlined":
33
+ return handleStreamlined(request);
34
+ case "one-click":
35
+ return handleOneClick(request);
36
+ default:
37
+ return handleOriginal(request);
38
+ }
39
+ ```
40
+
41
+ ### JSON Config Flag
42
+
43
+ ```typescript
44
+ interface RateLimitConfig {
45
+ rpm: number;
46
+ burst: number;
47
+ }
48
+
49
+ const limits = await env.FLAGS.getObjectValue<RateLimitConfig>(
50
+ "rate-limits",
51
+ { rpm: 100, burst: 20 },
52
+ { plan: userPlan },
53
+ );
54
+ ```
55
+
56
+ ### Using Details for Observability
57
+
58
+ ```typescript
59
+ const details = await env.FLAGS.getBooleanDetails("new-checkout", false, {
60
+ userId: "user-42",
61
+ });
62
+
63
+ console.log(details.value); // true
64
+ console.log(details.variant); // "on"
65
+ console.log(details.reason); // "TARGETING_MATCH"
66
+ console.log(details.errorCode); // undefined (no error)
67
+ ```
68
+
69
+ ---
70
+
71
+ ## Evaluating Flags with OpenFeature (Workers)
72
+
73
+ ### Binding Passthrough (Recommended)
74
+
75
+ ```typescript
76
+ import { OpenFeature } from "@openfeature/server-sdk";
77
+ import { FlagshipServerProvider } from "@cloudflare/flagship";
78
+
79
+ export default {
80
+ async fetch(request: Request, env: Env): Promise<Response> {
81
+ await OpenFeature.setProviderAndWait(
82
+ new FlagshipServerProvider({ binding: env.FLAGS }),
83
+ );
84
+ const client = OpenFeature.getClient();
85
+
86
+ const enabled = await client.getBooleanValue("new-checkout", false, {
87
+ targetingKey: "user-42",
88
+ plan: "enterprise",
89
+ country: "US",
90
+ });
91
+
92
+ return new Response(enabled ? "New checkout" : "Standard checkout");
93
+ },
94
+ };
95
+ ```
96
+
97
+ ### Migration from Another Provider
98
+
99
+ Only the provider initialization changes — evaluation call sites stay the same:
100
+
101
+ ```typescript
102
+ // ❌ Before (LaunchDarkly)
103
+ await OpenFeature.setProviderAndWait(
104
+ new LaunchDarklyProvider({ sdkKey: "..." }),
105
+ );
106
+
107
+ // ✅ After (Flagship)
108
+ await OpenFeature.setProviderAndWait(
109
+ new FlagshipServerProvider({ binding: env.FLAGS }),
110
+ );
111
+
112
+ // Evaluation code is unchanged
113
+ const enabled = await client.getBooleanValue("my-flag", false, {
114
+ targetingKey: "user-42",
115
+ });
116
+ ```
117
+
118
+ ---
119
+
120
+ ## Managing Flags via REST API
121
+
122
+ All examples use `api.cloudflare.com`. Set `CLOUDFLARE_ACCOUNT_ID`, `FLAGSHIP_APP_ID`, and `CLOUDFLARE_API_TOKEN` first.
123
+
124
+ ### Create a Boolean Flag
125
+
126
+ ```bash
127
+ curl -s -X POST \
128
+ -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
129
+ -H "Content-Type: application/json" \
130
+ -d '{
131
+ "key": "new-feature",
132
+ "default_variation": "off",
133
+ "variations": { "on": true, "off": false },
134
+ "rules": [],
135
+ "description": "Enable the new feature",
136
+ "enabled": false
137
+ }' \
138
+ "https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/flagship/apps/$FLAGSHIP_APP_ID/flags" | jq .
139
+ ```
140
+
141
+ ### Create a Flag with Internal-Only Targeting
142
+
143
+ ```bash
144
+ curl -s -X POST \
145
+ -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
146
+ -H "Content-Type: application/json" \
147
+ -d '{
148
+ "key": "beta-feature",
149
+ "default_variation": "off",
150
+ "variations": { "on": true, "off": false },
151
+ "rules": [
152
+ {
153
+ "priority": 1,
154
+ "conditions": [
155
+ { "attribute": "email", "operator": "ends_with", "value": "@cloudflare.com" }
156
+ ],
157
+ "serve_variation": "on"
158
+ }
159
+ ],
160
+ "description": "Beta feature for internal users",
161
+ "enabled": true
162
+ }' \
163
+ "https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/flagship/apps/$FLAGSHIP_APP_ID/flags" | jq .
164
+ ```
165
+
166
+ ### Create a JSON Config Flag
167
+
168
+ ```bash
169
+ curl -s -X POST \
170
+ -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
171
+ -H "Content-Type: application/json" \
172
+ -d '{
173
+ "key": "rate-limits",
174
+ "default_variation": "standard",
175
+ "variations": {
176
+ "standard": { "rpm": 100, "burst": 20 },
177
+ "premium": { "rpm": 1000, "burst": 200 }
178
+ },
179
+ "rules": [
180
+ {
181
+ "priority": 1,
182
+ "conditions": [
183
+ { "attribute": "plan", "operator": "in", "value": ["enterprise", "business"] }
184
+ ],
185
+ "serve_variation": "premium"
186
+ }
187
+ ],
188
+ "description": "Rate limit configuration by plan",
189
+ "enabled": true
190
+ }' \
191
+ "https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/flagship/apps/$FLAGSHIP_APP_ID/flags" | jq .
192
+ ```
193
+
194
+ ### Read a Flag
195
+
196
+ ```bash
197
+ curl -s -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
198
+ "https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/flagship/apps/$FLAGSHIP_APP_ID/flags/new-feature" | jq .
199
+ ```
200
+
201
+ ### List All Flags (with pagination)
202
+
203
+ ```bash
204
+ curl -s -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
205
+ "https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/flagship/apps/$FLAGSHIP_APP_ID/flags?limit=50" | jq .
206
+ ```
207
+
208
+ If `result_info.cursor` is non-null, fetch the next page:
209
+
210
+ ```bash
211
+ curl -s -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
212
+ "https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/flagship/apps/$FLAGSHIP_APP_ID/flags?limit=50&cursor=<cursor>" | jq .
213
+ ```
214
+
215
+ ### Update a Flag (Full Replace)
216
+
217
+ Updates use PUT with the full `FlagDefinition`. Always GET first, modify, then PUT back.
218
+
219
+ ```bash
220
+ # 1. Read current flag
221
+ FLAG=$(curl -s -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
222
+ "https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/flagship/apps/$FLAGSHIP_APP_ID/flags/new-feature" | jq '.result')
223
+
224
+ # 2. Modify (e.g., enable the flag)
225
+ UPDATED=$(echo "$FLAG" | jq '.enabled = true')
226
+
227
+ # 3. PUT back
228
+ echo "$UPDATED" | curl -s -X PUT \
229
+ -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
230
+ -H "Content-Type: application/json" \
231
+ -d @- \
232
+ "https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/flagship/apps/$FLAGSHIP_APP_ID/flags/new-feature" | jq .
233
+ ```
234
+
235
+ ### Toggle a Flag On
236
+
237
+ Read-modify-write to set `enabled: true`:
238
+
239
+ ```bash
240
+ BASE="https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/flagship/apps/$FLAGSHIP_APP_ID/flags"
241
+
242
+ FLAG=$(curl -s -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" "$BASE/new-feature" | jq '.result')
243
+ UPDATED=$(echo "$FLAG" | jq '.enabled = true')
244
+ echo "$UPDATED" | curl -s -X PUT \
245
+ -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
246
+ -H "Content-Type: application/json" \
247
+ -d @- "$BASE/new-feature" | jq .
248
+ ```
249
+
250
+ ### Toggle a Flag Off (Disable)
251
+
252
+ Same pattern, set `enabled: false`. The flag immediately returns its default variation for all evaluations.
253
+
254
+ ```bash
255
+ BASE="https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/flagship/apps/$FLAGSHIP_APP_ID/flags"
256
+
257
+ FLAG=$(curl -s -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" "$BASE/new-feature" | jq '.result')
258
+ UPDATED=$(echo "$FLAG" | jq '.enabled = false')
259
+ echo "$UPDATED" | curl -s -X PUT \
260
+ -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
261
+ -H "Content-Type: application/json" \
262
+ -d @- "$BASE/new-feature" | jq .
263
+ ```
264
+
265
+ ### Add a Targeting Rule to an Existing Flag
266
+
267
+ Append a rule to the existing rules array. Pick a priority that doesn't collide with existing rules.
268
+
269
+ ```bash
270
+ BASE="https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/flagship/apps/$FLAGSHIP_APP_ID/flags"
271
+
272
+ FLAG=$(curl -s -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" "$BASE/new-feature" | jq '.result')
273
+ UPDATED=$(echo "$FLAG" | jq '.rules += [{
274
+ "priority": 2,
275
+ "conditions": [{ "attribute": "plan", "operator": "equals", "value": "enterprise" }],
276
+ "serve_variation": "on"
277
+ }]')
278
+ echo "$UPDATED" | curl -s -X PUT \
279
+ -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
280
+ -H "Content-Type: application/json" \
281
+ -d @- "$BASE/new-feature" | jq .
282
+ ```
283
+
284
+ ### Change Rollout Percentage
285
+
286
+ Update the rollout percentage on an existing rule (e.g., rule at index 0):
287
+
288
+ ```bash
289
+ BASE="https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/flagship/apps/$FLAGSHIP_APP_ID/flags"
290
+
291
+ FLAG=$(curl -s -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" "$BASE/gradual-rollout" | jq '.result')
292
+ UPDATED=$(echo "$FLAG" | jq '.rules[0].rollout.percentage = 50')
293
+ echo "$UPDATED" | curl -s -X PUT \
294
+ -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
295
+ -H "Content-Type: application/json" \
296
+ -d @- "$BASE/gradual-rollout" | jq .
297
+ ```
298
+
299
+ ### Change Default Variation
300
+
301
+ ```bash
302
+ BASE="https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/flagship/apps/$FLAGSHIP_APP_ID/flags"
303
+
304
+ FLAG=$(curl -s -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" "$BASE/new-feature" | jq '.result')
305
+ UPDATED=$(echo "$FLAG" | jq '.default_variation = "on"')
306
+ echo "$UPDATED" | curl -s -X PUT \
307
+ -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
308
+ -H "Content-Type: application/json" \
309
+ -d @- "$BASE/new-feature" | jq .
310
+ ```
311
+
312
+ ### Add a New Variation
313
+
314
+ ```bash
315
+ BASE="https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/flagship/apps/$FLAGSHIP_APP_ID/flags"
316
+
317
+ FLAG=$(curl -s -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" "$BASE/checkout-flow" | jq '.result')
318
+ UPDATED=$(echo "$FLAG" | jq '.variations["treatment-c"] = "minimal"')
319
+ echo "$UPDATED" | curl -s -X PUT \
320
+ -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
321
+ -H "Content-Type: application/json" \
322
+ -d @- "$BASE/checkout-flow" | jq .
323
+ ```
324
+
325
+ ### Remove a Rule
326
+
327
+ Remove a rule by filtering on priority:
328
+
329
+ ```bash
330
+ BASE="https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/flagship/apps/$FLAGSHIP_APP_ID/flags"
331
+
332
+ FLAG=$(curl -s -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" "$BASE/new-feature" | jq '.result')
333
+ UPDATED=$(echo "$FLAG" | jq '.rules = [.rules[] | select(.priority != 2)]')
334
+ echo "$UPDATED" | curl -s -X PUT \
335
+ -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
336
+ -H "Content-Type: application/json" \
337
+ -d @- "$BASE/new-feature" | jq .
338
+ ```
339
+
340
+ ### Delete a Flag
341
+
342
+ ```bash
343
+ curl -s -X DELETE \
344
+ -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
345
+ "https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/flagship/apps/$FLAGSHIP_APP_ID/flags/old-feature" | jq .
346
+ ```
347
+
348
+ ---
349
+
350
+ ## Targeting Rule Patterns
351
+
352
+ ### Enterprise-Only Access
353
+
354
+ ```json
355
+ {
356
+ "priority": 1,
357
+ "conditions": [
358
+ { "attribute": "plan", "operator": "equals", "value": "enterprise" }
359
+ ],
360
+ "serve_variation": "on"
361
+ }
362
+ ```
363
+
364
+ ### Country-Based Targeting with Logical AND/OR
365
+
366
+ Target enterprise users in the US or Canada:
367
+
368
+ ```json
369
+ {
370
+ "priority": 1,
371
+ "conditions": [
372
+ {
373
+ "logical_operator": "AND",
374
+ "clauses": [
375
+ { "attribute": "plan", "operator": "equals", "value": "enterprise" },
376
+ {
377
+ "logical_operator": "OR",
378
+ "clauses": [
379
+ { "attribute": "country", "operator": "equals", "value": "US" },
380
+ { "attribute": "country", "operator": "equals", "value": "CA" }
381
+ ]
382
+ }
383
+ ]
384
+ }
385
+ ],
386
+ "serve_variation": "on"
387
+ }
388
+ ```
389
+
390
+ ### Percentage Rollout
391
+
392
+ Gradually roll out to 10% of users:
393
+
394
+ ```json
395
+ {
396
+ "priority": 1,
397
+ "conditions": [
398
+ { "attribute": "targetingKey", "operator": "not_equals", "value": "" }
399
+ ],
400
+ "serve_variation": "on",
401
+ "rollout": {
402
+ "percentage": 10,
403
+ "attribute": "targetingKey"
404
+ }
405
+ }
406
+ ```
407
+
408
+ ### A/B/n (Multi-Variant) Testing
409
+
410
+ To split traffic across N variants, create one rule per variant with **cumulative** rollout percentages. Flagship evaluates rules in priority order. If a rule's conditions match but the user misses that rule's rollout percentage, evaluation continues to the next rule. Use the same stable rollout attribute on every rule so each user is compared against the same bucket as the thresholds increase.
411
+
412
+ The example uses `conditions: []` because the rules are intended to match every context. For sticky user assignment, callers must still pass the configured bucketing attribute (`targetingKey` here); otherwise Flagship uses a random bucket per request.
413
+
414
+ For example, to split traffic 30% / 40% / 30% across variants A, B, and C:
415
+
416
+ | Variant | Share | Cumulative threshold |
417
+ |---------|-------|----------------------|
418
+ | A | 30% | 30 |
419
+ | B | 40% | 70 |
420
+ | C | 30% | 100 |
421
+
422
+ ```json
423
+ "rules": [
424
+ {
425
+ "priority": 1,
426
+ "conditions": [],
427
+ "serve_variation": "variant-a",
428
+ "rollout": { "percentage": 30, "attribute": "targetingKey" }
429
+ },
430
+ {
431
+ "priority": 2,
432
+ "conditions": [],
433
+ "serve_variation": "variant-b",
434
+ "rollout": { "percentage": 70, "attribute": "targetingKey" }
435
+ },
436
+ {
437
+ "priority": 3,
438
+ "conditions": [],
439
+ "serve_variation": "variant-c",
440
+ "rollout": { "percentage": 100, "attribute": "targetingKey" }
441
+ }
442
+ ]
443
+ ```
444
+
445
+ Key points:
446
+ - Rules are evaluated lowest-priority-number first. A user who falls into rule 1's 0-30% bucket gets `variant-a` and is not evaluated further.
447
+ - Rule 2's 70% threshold covers the next 40% of users (31-70%).
448
+ - Rule 3's 100% threshold catches the remaining 30% (71-100%).
449
+ - Always set the last rule to `100` so every context with the bucketing attribute is assigned a variant.
450
+ - For sticky A/B/n assignment, pass a stable `targetingKey` or configured bucketing attribute. Without it, rollout assignment is random per request, which can be useful for request-level sampling but is usually wrong for user experiments.
451
+ - A percentage rollout match reports reason `SPLIT` in evaluation details.
452
+
453
+ ### Progressive Rollout Workflow
454
+
455
+ 1. Create flag with 5% rollout, enable it
456
+ 2. Monitor metrics
457
+ 3. Increase to 25% → 50% → 100% by updating the `rollout.percentage`
458
+ 4. Once at 100%, remove the rule and set `default_variation` to the winning variation
459
+ 5. Eventually remove the flag and the code branch
460
+
461
+ ---
462
+
463
+ ## Safe Deletion Workflow
464
+
465
+ 1. **Disable** the flag first (`enabled: false`) — confirms nothing depends on it being active
466
+ 2. **Monitor** for unexpected behavior
467
+ 3. **Remove** flag evaluation code from your application
468
+ 4. **Deploy** the code change
469
+ 5. **Delete** the flag via API