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,195 @@
1
+ # Email Routing API Reference
2
+
3
+ ## Worker Runtime API
4
+
5
+ ### Email Handler Interface
6
+
7
+ ```typescript
8
+ interface ExportedHandler<Env = unknown> {
9
+ email?(message: ForwardableEmailMessage, env: Env, ctx: ExecutionContext): void | Promise<void>;
10
+ }
11
+ ```
12
+
13
+ ### ForwardableEmailMessage
14
+
15
+ Main interface for incoming emails:
16
+
17
+ ```typescript
18
+ interface ForwardableEmailMessage {
19
+ readonly from: string; // Envelope sender (e.g., "sender@example.com")
20
+ readonly to: string; // Envelope recipient (e.g., "you@yourdomain.com")
21
+ readonly headers: Headers; // Web API Headers object
22
+ readonly raw: ReadableStream; // Raw MIME message stream
23
+
24
+ setReject(reason: string): void;
25
+ forward(rcptTo: string, headers?: Headers): Promise<void>;
26
+ }
27
+ ```
28
+
29
+ **Key Properties:**
30
+
31
+ | Property | Type | Description |
32
+ |----------|------|-------------|
33
+ | `from` | `string` | Envelope sender (MAIL FROM), not header From |
34
+ | `to` | `string` | Envelope recipient (RCPT TO), not header To |
35
+ | `headers` | `Headers` | Email headers (Subject, From, To, etc.) |
36
+ | `raw` | `ReadableStream` | Raw MIME message (consume once only) |
37
+
38
+ **Methods:**
39
+
40
+ - `setReject(reason)`: Reject email with bounce message
41
+ - `forward(rcptTo, headers?)`: Forward to verified destination, optionally add headers
42
+
43
+ ### Headers Object
44
+
45
+ Standard Web API Headers interface:
46
+
47
+ ```typescript
48
+ // Access headers
49
+ const subject = message.headers.get("subject");
50
+ const from = message.headers.get("from");
51
+ const messageId = message.headers.get("message-id");
52
+
53
+ // Check spam score
54
+ const spamScore = parseFloat(message.headers.get("x-cf-spamh-score") || "0");
55
+ if (spamScore > 5) {
56
+ message.setReject("Spam detected");
57
+ }
58
+ ```
59
+
60
+ ### Common Headers
61
+
62
+ `subject`, `from`, `to`, `x-cf-spamh-score` (spam score), `message-id` (deduplication), `dkim-signature` (auth)
63
+
64
+ ### Envelope vs Header Addresses
65
+
66
+ **Critical distinction:**
67
+
68
+ ```typescript
69
+ // Envelope addresses (routing, auth checks)
70
+ message.from // "bounce@sender.com" (actual sender)
71
+ message.to // "you@yourdomain.com" (your address)
72
+
73
+ // Header addresses (display, user-facing)
74
+ message.headers.get("from") // "Alice <alice@sender.com>"
75
+ message.headers.get("to") // "Bob <you@yourdomain.com>"
76
+ ```
77
+
78
+ **Use envelope addresses for:**
79
+ - Authentication/SPF checks
80
+ - Routing decisions
81
+ - Bounce handling
82
+
83
+ **Use header addresses for:**
84
+ - Display to users
85
+ - Reply-To logic
86
+ - User-facing filtering
87
+
88
+ ## SendEmail Binding
89
+
90
+ Outbound email API for transactional messages.
91
+
92
+ ### Configuration
93
+
94
+ ```jsonc
95
+ // wrangler.jsonc
96
+ {
97
+ "send_email": [
98
+ { "name": "EMAIL" }
99
+ ]
100
+ }
101
+ ```
102
+
103
+ ### TypeScript Types
104
+
105
+ ```typescript
106
+ interface Env {
107
+ EMAIL: SendEmail;
108
+ }
109
+
110
+ interface SendEmail {
111
+ send(message: EmailMessage): Promise<void>;
112
+ }
113
+
114
+ interface EmailMessage {
115
+ from: string | { name?: string; email: string };
116
+ to: string | { name?: string; email: string } | Array<string | { name?: string; email: string }>;
117
+ subject: string;
118
+ text?: string;
119
+ html?: string;
120
+ headers?: Headers;
121
+ reply_to?: string | { name?: string; email: string };
122
+ }
123
+ ```
124
+
125
+ ### Send Email Example
126
+
127
+ ```typescript
128
+ interface Env {
129
+ EMAIL: SendEmail;
130
+ }
131
+
132
+ export default {
133
+ async fetch(request, env, ctx): Promise<Response> {
134
+ await env.EMAIL.send({
135
+ from: { name: "Acme Corp", email: "noreply@yourdomain.com" },
136
+ to: [
137
+ { name: "Alice", email: "alice@example.com" },
138
+ "bob@example.com"
139
+ ],
140
+ subject: "Your order #12345 has shipped",
141
+ text: "Track your package at: https://track.example.com/12345",
142
+ html: "<p>Track your package at: <a href='https://track.example.com/12345'>View tracking</a></p>",
143
+ reply_to: { name: "Support", email: "support@yourdomain.com" }
144
+ });
145
+
146
+ return new Response("Email sent");
147
+ }
148
+ } satisfies ExportedHandler<Env>;
149
+ ```
150
+
151
+ ### SendEmail Constraints
152
+
153
+ - **From address**: Must be on verified domain (your domain with Email Routing enabled)
154
+ - **Volume limits**: Transactional only, no bulk/marketing email
155
+ - **Rate limits**: 100 emails/minute on Free plan, higher on Paid
156
+ - **No attachments**: Use links to hosted files instead
157
+ - **No DKIM control**: Cloudflare signs automatically
158
+
159
+ ## REST API Operations
160
+
161
+ Base URL: `https://api.cloudflare.com/client/v4`
162
+
163
+ ### Authentication
164
+
165
+ ```bash
166
+ curl -H "Authorization: Bearer $API_TOKEN" https://api.cloudflare.com/client/v4/...
167
+ ```
168
+
169
+ ### Key Endpoints
170
+
171
+ | Operation | Method | Endpoint |
172
+ |-----------|--------|----------|
173
+ | Enable routing | POST | `/zones/{zone_id}/email/routing/enable` |
174
+ | Disable routing | POST | `/zones/{zone_id}/email/routing/disable` |
175
+ | List rules | GET | `/zones/{zone_id}/email/routing/rules` |
176
+ | Create rule | POST | `/zones/{zone_id}/email/routing/rules` |
177
+ | Verify destination | POST | `/zones/{zone_id}/email/routing/addresses` |
178
+ | List destinations | GET | `/zones/{zone_id}/email/routing/addresses` |
179
+
180
+ ### Create Routing Rule Example
181
+
182
+ ```bash
183
+ curl -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/email/routing/rules" \
184
+ -H "Authorization: Bearer $API_TOKEN" \
185
+ -H "Content-Type: application/json" \
186
+ -d '{
187
+ "enabled": true,
188
+ "name": "Forward sales",
189
+ "matchers": [{"type": "literal", "field": "to", "value": "sales@yourdomain.com"}],
190
+ "actions": [{"type": "forward", "value": ["alice@company.com"]}],
191
+ "priority": 0
192
+ }'
193
+ ```
194
+
195
+ Matcher types: `literal` (exact match), `all` (catch-all).
@@ -0,0 +1,186 @@
1
+ # Email Routing Configuration
2
+
3
+ ## Wrangler Configuration
4
+
5
+ ### Basic Email Worker
6
+
7
+ ```jsonc
8
+ // wrangler.jsonc
9
+ {
10
+ "name": "email-worker",
11
+ "main": "src/index.ts",
12
+ "compatibility_date": "2025-01-01",
13
+ "send_email": [{ "name": "EMAIL" }]
14
+ }
15
+ ```
16
+
17
+ ```typescript
18
+ // src/index.ts
19
+ export default {
20
+ async email(message, env, ctx) {
21
+ await message.forward("destination@example.com");
22
+ }
23
+ } satisfies ExportedHandler;
24
+ ```
25
+
26
+ ### With Storage Bindings
27
+
28
+ ```jsonc
29
+ {
30
+ "name": "email-processor",
31
+ "send_email": [{ "name": "EMAIL" }],
32
+ "kv_namespaces": [{ "binding": "KV", "id": "abc123" }],
33
+ "r2_buckets": [{ "binding": "R2", "bucket_name": "emails" }],
34
+ "d1_databases": [{ "binding": "DB", "database_id": "def456" }]
35
+ }
36
+ ```
37
+
38
+ ```typescript
39
+ interface Env {
40
+ EMAIL: SendEmail;
41
+ KV: KVNamespace;
42
+ R2: R2Bucket;
43
+ DB: D1Database;
44
+ }
45
+ ```
46
+
47
+ ## Local Development
48
+
49
+ ```bash
50
+ npx wrangler dev
51
+
52
+ # Test with curl
53
+ curl -X POST 'http://localhost:8787/__email' \
54
+ --header 'content-type: message/rfc822' \
55
+ --data 'From: test@example.com
56
+ To: you@yourdomain.com
57
+ Subject: Test
58
+
59
+ Body'
60
+ ```
61
+
62
+ ## Deployment
63
+
64
+ ```bash
65
+ npx wrangler deploy
66
+ ```
67
+
68
+ **Connect to Email Routing:**
69
+
70
+ Dashboard: Email > Email Routing > [domain] > Settings > Email Workers > Select worker
71
+
72
+ API:
73
+ ```bash
74
+ curl -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/email/routing/settings" \
75
+ -H "Authorization: Bearer $API_TOKEN" \
76
+ -d '{"enabled": true, "worker": "email-worker"}'
77
+ ```
78
+
79
+ ## DNS (Auto-Created)
80
+
81
+ ```dns
82
+ yourdomain.com. IN MX 1 isaac.mx.cloudflare.net.
83
+ yourdomain.com. IN MX 2 linda.mx.cloudflare.net.
84
+ yourdomain.com. IN MX 3 amir.mx.cloudflare.net.
85
+ yourdomain.com. IN TXT "v=spf1 include:_spf.mx.cloudflare.net ~all"
86
+ ```
87
+
88
+ ## Secrets & Variables
89
+
90
+ ```bash
91
+ # Secrets (encrypted)
92
+ npx wrangler secret put API_KEY
93
+
94
+ # Variables (plain)
95
+ # wrangler.jsonc
96
+ { "vars": { "THRESHOLD": "5.0" } }
97
+ ```
98
+
99
+ ```typescript
100
+ interface Env {
101
+ API_KEY: string;
102
+ THRESHOLD: string;
103
+ }
104
+ ```
105
+
106
+ ## TypeScript Setup
107
+
108
+ ```bash
109
+ npm install --save-dev @cloudflare/workers-types
110
+ ```
111
+
112
+ ```json
113
+ // tsconfig.json
114
+ {
115
+ "compilerOptions": {
116
+ "target": "ES2022",
117
+ "module": "ES2022",
118
+ "lib": ["ES2022"],
119
+ "types": ["@cloudflare/workers-types"],
120
+ "moduleResolution": "bundler",
121
+ "strict": true
122
+ }
123
+ }
124
+ ```
125
+
126
+ ```typescript
127
+ import type { ForwardableEmailMessage } from "@cloudflare/workers-types";
128
+
129
+ export default {
130
+ async email(message: ForwardableEmailMessage, env: Env, ctx: ExecutionContext): Promise<void> {
131
+ await message.forward("dest@example.com");
132
+ }
133
+ } satisfies ExportedHandler<Env>;
134
+ ```
135
+
136
+ ## Dependencies
137
+
138
+ ```bash
139
+ npm install postal-mime
140
+ ```
141
+
142
+ ```typescript
143
+ import PostalMime from 'postal-mime';
144
+
145
+ export default {
146
+ async email(message, env, ctx) {
147
+ const parser = new PostalMime();
148
+ const email = await parser.parse(await message.raw.arrayBuffer());
149
+ console.log(email.subject);
150
+ await message.forward("inbox@corp.com");
151
+ }
152
+ } satisfies ExportedHandler;
153
+ ```
154
+
155
+ ## Multi-Environment
156
+
157
+ ```bash
158
+ # wrangler.dev.jsonc
159
+ { "name": "worker-dev", "vars": { "ENV": "dev" } }
160
+
161
+ # wrangler.prod.jsonc
162
+ { "name": "worker-prod", "vars": { "ENV": "prod" } }
163
+
164
+ npx wrangler deploy --config wrangler.dev.jsonc
165
+ npx wrangler deploy --config wrangler.prod.jsonc
166
+ ```
167
+
168
+ ## CI/CD (GitHub Actions)
169
+
170
+ ```yaml
171
+ # .github/workflows/deploy.yml
172
+ name: Deploy
173
+ on:
174
+ push:
175
+ branches: [main]
176
+ jobs:
177
+ deploy:
178
+ runs-on: ubuntu-latest
179
+ steps:
180
+ - uses: actions/checkout@v3
181
+ - uses: actions/setup-node@v3
182
+ - run: npm ci
183
+ - run: npx wrangler deploy
184
+ env:
185
+ CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
186
+ ```
@@ -0,0 +1,196 @@
1
+ # Gotchas & Troubleshooting
2
+
3
+ ## Critical Pitfalls
4
+
5
+ ### Stream Consumption (MOST COMMON)
6
+
7
+ **Problem:** "stream already consumed" or worker hangs
8
+
9
+ **Cause:** `message.raw` is `ReadableStream` - consume once only
10
+
11
+ **Solution:**
12
+ ```typescript
13
+ // ❌ WRONG
14
+ const email1 = await parser.parse(await message.raw.arrayBuffer());
15
+ const email2 = await parser.parse(await message.raw.arrayBuffer()); // FAILS
16
+
17
+ // ✅ CORRECT
18
+ const raw = await message.raw.arrayBuffer();
19
+ const email = await parser.parse(raw);
20
+ ```
21
+
22
+ Consume `message.raw` immediately before any async operations.
23
+
24
+ ### Destination Verification
25
+
26
+ **Problem:** Emails not forwarding
27
+
28
+ **Cause:** Destination unverified
29
+
30
+ **Solution:** Add destination, check inbox for verification email, click link. Verify status: `GET /zones/{id}/email/routing/addresses`
31
+
32
+ ### Mail Authentication
33
+
34
+ **Problem:** Legitimate emails rejected
35
+
36
+ **Cause:** Missing SPF/DKIM/DMARC on sender domain
37
+
38
+ **Solution:** Configure sender DNS:
39
+ ```dns
40
+ example.com. IN TXT "v=spf1 include:_spf.example.com ~all"
41
+ selector._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=..."
42
+ _dmarc.example.com. IN TXT "v=DMARC1; p=quarantine"
43
+ ```
44
+
45
+ ### Envelope vs Header
46
+
47
+ **Problem:** Filtering on wrong address
48
+
49
+ **Solution:**
50
+ ```typescript
51
+ // Routing/auth: envelope
52
+ if (message.from === "trusted@example.com") { }
53
+
54
+ // Display: headers
55
+ const display = message.headers.get("from");
56
+ ```
57
+
58
+ ### SendEmail Limits
59
+
60
+ | Issue | Limit | Solution |
61
+ |-------|-------|----------|
62
+ | From domain | Must own | Use Email Routing domain |
63
+ | Volume | ~100/min Free | Upgrade or throttle |
64
+ | Attachments | Not supported | Link to R2 |
65
+ | Type | Transactional | No bulk |
66
+
67
+ ## Common Errors
68
+
69
+ ### CPU Time Exceeded
70
+
71
+ **Cause:** Heavy parsing, large emails
72
+
73
+ **Solution:**
74
+ ```typescript
75
+ const size = parseInt(message.headers.get("content-length") || "0") / 1024 / 1024;
76
+ if (size > 20) {
77
+ message.setReject("Too large");
78
+ return;
79
+ }
80
+
81
+ ctx.waitUntil(expensiveWork());
82
+ await message.forward("dest@example.com");
83
+ ```
84
+
85
+ ### Rule Not Triggering
86
+
87
+ **Causes:** Priority conflict, matcher error, catch-all override
88
+
89
+ **Solution:** Check priority (lower=first), verify exact match, confirm destination verified
90
+
91
+ ### Undefined Property
92
+
93
+ **Cause:** Missing header
94
+
95
+ **Solution:**
96
+ ```typescript
97
+ // ❌ WRONG
98
+ const subj = message.headers.get("subject").toLowerCase();
99
+
100
+ // ✅ CORRECT
101
+ const subj = message.headers.get("subject")?.toLowerCase() || "";
102
+ ```
103
+
104
+ ## Limits
105
+
106
+ | Resource | Free | Paid |
107
+ |----------|------|------|
108
+ | Email size | 25 MB | 25 MB |
109
+ | Rules | 200 | 200 |
110
+ | Destinations | 200 | 200 |
111
+ | CPU time | 10ms | 30s (default), 5min (max) |
112
+ | SendEmail | ~100/min | Higher |
113
+
114
+ ## Debugging
115
+
116
+ ### Local
117
+
118
+ ```bash
119
+ npx wrangler dev
120
+
121
+ curl -X POST 'http://localhost:8787/__email' \
122
+ --header 'content-type: message/rfc822' \
123
+ --data 'From: test@example.com
124
+ To: you@yourdomain.com
125
+ Subject: Test
126
+
127
+ Body'
128
+ ```
129
+
130
+ ### Production
131
+
132
+ ```bash
133
+ npx wrangler tail
134
+ ```
135
+
136
+ ### Pattern
137
+
138
+ ```typescript
139
+ export default {
140
+ async email(message, env, ctx) {
141
+ try {
142
+ console.log("From:", message.from);
143
+ await process(message, env);
144
+ } catch (err) {
145
+ console.error(err);
146
+ message.setReject(err.message);
147
+ }
148
+ }
149
+ } satisfies ExportedHandler;
150
+ ```
151
+
152
+ ## Auth Troubleshooting
153
+
154
+ ### Check Status
155
+
156
+ ```typescript
157
+ const auth = message.headers.get("authentication-results") || "";
158
+ console.log({
159
+ spf: auth.includes("spf=pass"),
160
+ dkim: auth.includes("dkim=pass"),
161
+ dmarc: auth.includes("dmarc=pass")
162
+ });
163
+
164
+ if (!auth.includes("pass")) {
165
+ message.setReject("Failed auth");
166
+ return;
167
+ }
168
+ ```
169
+
170
+ ### SPF Issues
171
+
172
+ **Causes:** Forwarding breaks SPF, too many lookups (>10), missing includes
173
+
174
+ **Solution:**
175
+ ```dns
176
+ ; ✅ Good
177
+ example.com. IN TXT "v=spf1 include:_spf.google.com ~all"
178
+
179
+ ; ❌ Bad - too many
180
+ example.com. IN TXT "v=spf1 include:a.com include:b.com ... ~all"
181
+ ```
182
+
183
+ ### DMARC Alignment
184
+
185
+ **Cause:** From domain must match SPF/DKIM domain
186
+
187
+ ## Best Practices
188
+
189
+ 1. Consume `message.raw` immediately
190
+ 2. Verify destinations
191
+ 3. Handle missing headers (`?.`)
192
+ 4. Use envelope for routing
193
+ 5. Check spam scores
194
+ 6. Test locally first
195
+ 7. Use `ctx.waitUntil` for background work
196
+ 8. Size-check early