opencodekit 0.15.4 → 0.15.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/template/.opencode/command/cloudflare.md +70 -0
  3. package/dist/template/.opencode/package.json +1 -1
  4. package/dist/template/.opencode/skill/cloudflare/SKILL.md +233 -0
  5. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/README.md +35 -0
  6. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/api.md +100 -0
  7. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/configuration.md +99 -0
  8. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/gotchas.md +59 -0
  9. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/patterns.md +89 -0
  10. package/dist/template/.opencode/skill/cloudflare/references/ai-gateway/README.md +695 -0
  11. package/dist/template/.opencode/skill/cloudflare/references/ai-search/README.md +14 -0
  12. package/dist/template/.opencode/skill/cloudflare/references/ai-search/api.md +38 -0
  13. package/dist/template/.opencode/skill/cloudflare/references/ai-search/configuration.md +52 -0
  14. package/dist/template/.opencode/skill/cloudflare/references/ai-search/gotchas.md +41 -0
  15. package/dist/template/.opencode/skill/cloudflare/references/ai-search/patterns.md +45 -0
  16. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/README.md +14 -0
  17. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/api.md +27 -0
  18. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/configuration.md +45 -0
  19. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/gotchas.md +3 -0
  20. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/patterns.md +36 -0
  21. package/dist/template/.opencode/skill/cloudflare/references/api/README.md +21 -0
  22. package/dist/template/.opencode/skill/cloudflare/references/api/api.md +31 -0
  23. package/dist/template/.opencode/skill/cloudflare/references/api/configuration.md +20 -0
  24. package/dist/template/.opencode/skill/cloudflare/references/api/gotchas.md +28 -0
  25. package/dist/template/.opencode/skill/cloudflare/references/api/patterns.md +47 -0
  26. package/dist/template/.opencode/skill/cloudflare/references/api-shield/README.md +20 -0
  27. package/dist/template/.opencode/skill/cloudflare/references/api-shield/api.md +78 -0
  28. package/dist/template/.opencode/skill/cloudflare/references/api-shield/configuration.md +128 -0
  29. package/dist/template/.opencode/skill/cloudflare/references/api-shield/gotchas.md +51 -0
  30. package/dist/template/.opencode/skill/cloudflare/references/api-shield/patterns.md +145 -0
  31. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/README.md +16 -0
  32. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/api.md +50 -0
  33. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/configuration.md +53 -0
  34. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/gotchas.md +16 -0
  35. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/patterns.md +45 -0
  36. package/dist/template/.opencode/skill/cloudflare/references/bindings/README.md +14 -0
  37. package/dist/template/.opencode/skill/cloudflare/references/bindings/api.md +3 -0
  38. package/dist/template/.opencode/skill/cloudflare/references/bindings/configuration.md +58 -0
  39. package/dist/template/.opencode/skill/cloudflare/references/bindings/gotchas.md +35 -0
  40. package/dist/template/.opencode/skill/cloudflare/references/bindings/patterns.md +37 -0
  41. package/dist/template/.opencode/skill/cloudflare/references/bot-management/README.md +71 -0
  42. package/dist/template/.opencode/skill/cloudflare/references/bot-management/api.md +168 -0
  43. package/dist/template/.opencode/skill/cloudflare/references/bot-management/configuration.md +114 -0
  44. package/dist/template/.opencode/skill/cloudflare/references/bot-management/gotchas.md +99 -0
  45. package/dist/template/.opencode/skill/cloudflare/references/bot-management/patterns.md +125 -0
  46. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/README.md +16 -0
  47. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/api.md +54 -0
  48. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/configuration.md +47 -0
  49. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/gotchas.md +29 -0
  50. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/patterns.md +29 -0
  51. package/dist/template/.opencode/skill/cloudflare/references/c3/README.md +264 -0
  52. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/README.md +93 -0
  53. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/api.md +176 -0
  54. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/configuration.md +164 -0
  55. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/gotchas.md +203 -0
  56. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/patterns.md +180 -0
  57. package/dist/template/.opencode/skill/cloudflare/references/containers/README.md +16 -0
  58. package/dist/template/.opencode/skill/cloudflare/references/containers/api.md +43 -0
  59. package/dist/template/.opencode/skill/cloudflare/references/containers/configuration.md +56 -0
  60. package/dist/template/.opencode/skill/cloudflare/references/containers/gotchas.md +21 -0
  61. package/dist/template/.opencode/skill/cloudflare/references/containers/patterns.md +40 -0
  62. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/README.md +85 -0
  63. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/api.md +198 -0
  64. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/configuration.md +151 -0
  65. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/gotchas.md +129 -0
  66. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/patterns.md +122 -0
  67. package/dist/template/.opencode/skill/cloudflare/references/d1/README.md +92 -0
  68. package/dist/template/.opencode/skill/cloudflare/references/d1/api.md +141 -0
  69. package/dist/template/.opencode/skill/cloudflare/references/d1/configuration.md +127 -0
  70. package/dist/template/.opencode/skill/cloudflare/references/d1/gotchas.md +70 -0
  71. package/dist/template/.opencode/skill/cloudflare/references/d1/patterns.md +144 -0
  72. package/dist/template/.opencode/skill/cloudflare/references/ddos/README.md +34 -0
  73. package/dist/template/.opencode/skill/cloudflare/references/ddos/api.md +136 -0
  74. package/dist/template/.opencode/skill/cloudflare/references/ddos/configuration.md +67 -0
  75. package/dist/template/.opencode/skill/cloudflare/references/ddos/gotchas.md +114 -0
  76. package/dist/template/.opencode/skill/cloudflare/references/ddos/patterns.md +158 -0
  77. package/dist/template/.opencode/skill/cloudflare/references/do-storage/README.md +62 -0
  78. package/dist/template/.opencode/skill/cloudflare/references/do-storage/api.md +89 -0
  79. package/dist/template/.opencode/skill/cloudflare/references/do-storage/configuration.md +116 -0
  80. package/dist/template/.opencode/skill/cloudflare/references/do-storage/gotchas.md +93 -0
  81. package/dist/template/.opencode/skill/cloudflare/references/do-storage/patterns.md +112 -0
  82. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/README.md +125 -0
  83. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/api.md +152 -0
  84. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/configuration.md +148 -0
  85. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/gotchas.md +158 -0
  86. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/patterns.md +255 -0
  87. package/dist/template/.opencode/skill/cloudflare/references/email-routing/README.md +18 -0
  88. package/dist/template/.opencode/skill/cloudflare/references/email-routing/api.md +46 -0
  89. package/dist/template/.opencode/skill/cloudflare/references/email-routing/configuration.md +63 -0
  90. package/dist/template/.opencode/skill/cloudflare/references/email-routing/gotchas.md +16 -0
  91. package/dist/template/.opencode/skill/cloudflare/references/email-routing/patterns.md +46 -0
  92. package/dist/template/.opencode/skill/cloudflare/references/email-workers/README.md +598 -0
  93. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/README.md +62 -0
  94. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/api.md +137 -0
  95. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/configuration.md +133 -0
  96. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/gotchas.md +184 -0
  97. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/patterns.md +176 -0
  98. package/dist/template/.opencode/skill/cloudflare/references/images/README.md +14 -0
  99. package/dist/template/.opencode/skill/cloudflare/references/images/api.md +3 -0
  100. package/dist/template/.opencode/skill/cloudflare/references/images/configuration.md +45 -0
  101. package/dist/template/.opencode/skill/cloudflare/references/images/gotchas.md +23 -0
  102. package/dist/template/.opencode/skill/cloudflare/references/images/patterns.md +31 -0
  103. package/dist/template/.opencode/skill/cloudflare/references/kv/README.md +60 -0
  104. package/dist/template/.opencode/skill/cloudflare/references/kv/api.md +114 -0
  105. package/dist/template/.opencode/skill/cloudflare/references/kv/configuration.md +92 -0
  106. package/dist/template/.opencode/skill/cloudflare/references/kv/gotchas.md +117 -0
  107. package/dist/template/.opencode/skill/cloudflare/references/kv/patterns.md +139 -0
  108. package/dist/template/.opencode/skill/cloudflare/references/miniflare/README.md +64 -0
  109. package/dist/template/.opencode/skill/cloudflare/references/miniflare/api.md +144 -0
  110. package/dist/template/.opencode/skill/cloudflare/references/miniflare/configuration.md +203 -0
  111. package/dist/template/.opencode/skill/cloudflare/references/miniflare/gotchas.md +187 -0
  112. package/dist/template/.opencode/skill/cloudflare/references/miniflare/patterns.md +211 -0
  113. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/README.md +60 -0
  114. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/api.md +240 -0
  115. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/configuration.md +127 -0
  116. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/gotchas.md +171 -0
  117. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/patterns.md +171 -0
  118. package/dist/template/.opencode/skill/cloudflare/references/observability/README.md +18 -0
  119. package/dist/template/.opencode/skill/cloudflare/references/observability/api.md +51 -0
  120. package/dist/template/.opencode/skill/cloudflare/references/observability/configuration.md +60 -0
  121. package/dist/template/.opencode/skill/cloudflare/references/observability/gotchas.md +36 -0
  122. package/dist/template/.opencode/skill/cloudflare/references/observability/patterns.md +42 -0
  123. package/dist/template/.opencode/skill/cloudflare/references/pages/README.md +76 -0
  124. package/dist/template/.opencode/skill/cloudflare/references/pages/api.md +200 -0
  125. package/dist/template/.opencode/skill/cloudflare/references/pages/configuration.md +228 -0
  126. package/dist/template/.opencode/skill/cloudflare/references/pages/gotchas.md +161 -0
  127. package/dist/template/.opencode/skill/cloudflare/references/pages/patterns.md +145 -0
  128. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/README.md +57 -0
  129. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/api.md +201 -0
  130. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/configuration.md +159 -0
  131. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/gotchas.md +151 -0
  132. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/patterns.md +190 -0
  133. package/dist/template/.opencode/skill/cloudflare/references/pipelines/README.md +664 -0
  134. package/dist/template/.opencode/skill/cloudflare/references/pulumi/README.md +107 -0
  135. package/dist/template/.opencode/skill/cloudflare/references/pulumi/api.md +194 -0
  136. package/dist/template/.opencode/skill/cloudflare/references/pulumi/configuration.md +216 -0
  137. package/dist/template/.opencode/skill/cloudflare/references/pulumi/gotchas.md +223 -0
  138. package/dist/template/.opencode/skill/cloudflare/references/pulumi/patterns.md +139 -0
  139. package/dist/template/.opencode/skill/cloudflare/references/queues/README.md +69 -0
  140. package/dist/template/.opencode/skill/cloudflare/references/queues/api.md +138 -0
  141. package/dist/template/.opencode/skill/cloudflare/references/queues/configuration.md +125 -0
  142. package/dist/template/.opencode/skill/cloudflare/references/queues/gotchas.md +112 -0
  143. package/dist/template/.opencode/skill/cloudflare/references/queues/patterns.md +155 -0
  144. package/dist/template/.opencode/skill/cloudflare/references/r2/README.md +61 -0
  145. package/dist/template/.opencode/skill/cloudflare/references/r2/api.md +127 -0
  146. package/dist/template/.opencode/skill/cloudflare/references/r2/configuration.md +76 -0
  147. package/dist/template/.opencode/skill/cloudflare/references/r2/gotchas.md +94 -0
  148. package/dist/template/.opencode/skill/cloudflare/references/r2/patterns.md +127 -0
  149. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/README.md +18 -0
  150. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/api.md +29 -0
  151. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/configuration.md +39 -0
  152. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/gotchas.md +20 -0
  153. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/patterns.md +46 -0
  154. package/dist/template/.opencode/skill/cloudflare/references/r2-sql/README.md +512 -0
  155. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/README.md +21 -0
  156. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/api.md +135 -0
  157. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/configuration.md +63 -0
  158. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/gotchas.md +75 -0
  159. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/patterns.md +102 -0
  160. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/README.md +81 -0
  161. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/api.md +164 -0
  162. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/configuration.md +147 -0
  163. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/gotchas.md +172 -0
  164. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/patterns.md +155 -0
  165. package/dist/template/.opencode/skill/cloudflare/references/sandbox/README.md +90 -0
  166. package/dist/template/.opencode/skill/cloudflare/references/sandbox/api.md +178 -0
  167. package/dist/template/.opencode/skill/cloudflare/references/sandbox/configuration.md +131 -0
  168. package/dist/template/.opencode/skill/cloudflare/references/sandbox/gotchas.md +156 -0
  169. package/dist/template/.opencode/skill/cloudflare/references/sandbox/patterns.md +203 -0
  170. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/README.md +58 -0
  171. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/api.md +182 -0
  172. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/configuration.md +140 -0
  173. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/gotchas.md +129 -0
  174. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/patterns.md +218 -0
  175. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/README.md +91 -0
  176. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/api.md +139 -0
  177. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/configuration.md +129 -0
  178. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/gotchas.md +87 -0
  179. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/patterns.md +135 -0
  180. package/dist/template/.opencode/skill/cloudflare/references/snippets/README.md +15 -0
  181. package/dist/template/.opencode/skill/cloudflare/references/snippets/api.md +47 -0
  182. package/dist/template/.opencode/skill/cloudflare/references/snippets/configuration.md +33 -0
  183. package/dist/template/.opencode/skill/cloudflare/references/snippets/gotchas.md +21 -0
  184. package/dist/template/.opencode/skill/cloudflare/references/snippets/patterns.md +34 -0
  185. package/dist/template/.opencode/skill/cloudflare/references/spectrum/README.md +16 -0
  186. package/dist/template/.opencode/skill/cloudflare/references/spectrum/api.md +24 -0
  187. package/dist/template/.opencode/skill/cloudflare/references/spectrum/configuration.md +43 -0
  188. package/dist/template/.opencode/skill/cloudflare/references/spectrum/gotchas.md +42 -0
  189. package/dist/template/.opencode/skill/cloudflare/references/spectrum/patterns.md +40 -0
  190. package/dist/template/.opencode/skill/cloudflare/references/static-assets/README.md +14 -0
  191. package/dist/template/.opencode/skill/cloudflare/references/static-assets/api.md +3 -0
  192. package/dist/template/.opencode/skill/cloudflare/references/static-assets/configuration.md +47 -0
  193. package/dist/template/.opencode/skill/cloudflare/references/static-assets/gotchas.md +44 -0
  194. package/dist/template/.opencode/skill/cloudflare/references/static-assets/patterns.md +42 -0
  195. package/dist/template/.opencode/skill/cloudflare/references/stream/README.md +103 -0
  196. package/dist/template/.opencode/skill/cloudflare/references/stream/api.md +204 -0
  197. package/dist/template/.opencode/skill/cloudflare/references/stream/configuration.md +127 -0
  198. package/dist/template/.opencode/skill/cloudflare/references/stream/gotchas.md +131 -0
  199. package/dist/template/.opencode/skill/cloudflare/references/stream/patterns.md +152 -0
  200. package/dist/template/.opencode/skill/cloudflare/references/tail-workers/README.md +640 -0
  201. package/dist/template/.opencode/skill/cloudflare/references/terraform/README.md +76 -0
  202. package/dist/template/.opencode/skill/cloudflare/references/terraform/api.md +159 -0
  203. package/dist/template/.opencode/skill/cloudflare/references/terraform/configuration.md +156 -0
  204. package/dist/template/.opencode/skill/cloudflare/references/terraform/gotchas.md +207 -0
  205. package/dist/template/.opencode/skill/cloudflare/references/terraform/patterns.md +135 -0
  206. package/dist/template/.opencode/skill/cloudflare/references/tunnel/README.md +82 -0
  207. package/dist/template/.opencode/skill/cloudflare/references/tunnel/api.md +105 -0
  208. package/dist/template/.opencode/skill/cloudflare/references/tunnel/configuration.md +113 -0
  209. package/dist/template/.opencode/skill/cloudflare/references/tunnel/gotchas.md +115 -0
  210. package/dist/template/.opencode/skill/cloudflare/references/tunnel/patterns.md +157 -0
  211. package/dist/template/.opencode/skill/cloudflare/references/turn/README.md +699 -0
  212. package/dist/template/.opencode/skill/cloudflare/references/turnstile/README.md +14 -0
  213. package/dist/template/.opencode/skill/cloudflare/references/turnstile/api.md +3 -0
  214. package/dist/template/.opencode/skill/cloudflare/references/turnstile/configuration.md +19 -0
  215. package/dist/template/.opencode/skill/cloudflare/references/turnstile/gotchas.md +27 -0
  216. package/dist/template/.opencode/skill/cloudflare/references/turnstile/patterns.md +41 -0
  217. package/dist/template/.opencode/skill/cloudflare/references/vectorize/README.md +682 -0
  218. package/dist/template/.opencode/skill/cloudflare/references/waf/README.md +14 -0
  219. package/dist/template/.opencode/skill/cloudflare/references/waf/api.md +3 -0
  220. package/dist/template/.opencode/skill/cloudflare/references/waf/configuration.md +44 -0
  221. package/dist/template/.opencode/skill/cloudflare/references/waf/gotchas.md +24 -0
  222. package/dist/template/.opencode/skill/cloudflare/references/waf/patterns.md +29 -0
  223. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/README.md +19 -0
  224. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/api.md +52 -0
  225. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/configuration.md +31 -0
  226. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/gotchas.md +28 -0
  227. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/patterns.md +52 -0
  228. package/dist/template/.opencode/skill/cloudflare/references/workerd/README.md +47 -0
  229. package/dist/template/.opencode/skill/cloudflare/references/workerd/api.md +199 -0
  230. package/dist/template/.opencode/skill/cloudflare/references/workerd/configuration.md +185 -0
  231. package/dist/template/.opencode/skill/cloudflare/references/workerd/gotchas.md +203 -0
  232. package/dist/template/.opencode/skill/cloudflare/references/workerd/patterns.md +216 -0
  233. package/dist/template/.opencode/skill/cloudflare/references/workers/README.md +96 -0
  234. package/dist/template/.opencode/skill/cloudflare/references/workers/api.md +137 -0
  235. package/dist/template/.opencode/skill/cloudflare/references/workers/configuration.md +147 -0
  236. package/dist/template/.opencode/skill/cloudflare/references/workers/gotchas.md +99 -0
  237. package/dist/template/.opencode/skill/cloudflare/references/workers/patterns.md +149 -0
  238. package/dist/template/.opencode/skill/cloudflare/references/workers-ai/README.md +116 -0
  239. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/README.md +48 -0
  240. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/api.md +169 -0
  241. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/configuration.md +136 -0
  242. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/gotchas.md +130 -0
  243. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/patterns.md +170 -0
  244. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/README.md +16 -0
  245. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/api.md +20 -0
  246. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/configuration.md +3 -0
  247. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/gotchas.md +35 -0
  248. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/patterns.md +42 -0
  249. package/dist/template/.opencode/skill/cloudflare/references/workers-vpc/README.md +579 -0
  250. package/dist/template/.opencode/skill/cloudflare/references/workflows/README.md +62 -0
  251. package/dist/template/.opencode/skill/cloudflare/references/workflows/api.md +125 -0
  252. package/dist/template/.opencode/skill/cloudflare/references/workflows/configuration.md +177 -0
  253. package/dist/template/.opencode/skill/cloudflare/references/workflows/gotchas.md +136 -0
  254. package/dist/template/.opencode/skill/cloudflare/references/workflows/patterns.md +132 -0
  255. package/dist/template/.opencode/skill/cloudflare/references/wrangler/README.md +90 -0
  256. package/dist/template/.opencode/skill/cloudflare/references/wrangler/api.md +140 -0
  257. package/dist/template/.opencode/skill/cloudflare/references/wrangler/configuration.md +128 -0
  258. package/dist/template/.opencode/skill/cloudflare/references/wrangler/gotchas.md +93 -0
  259. package/dist/template/.opencode/skill/cloudflare/references/wrangler/patterns.md +150 -0
  260. package/dist/template/.opencode/skill/cloudflare/references/zaraz/README.md +360 -0
  261. package/dist/template/.opencode/skill/react-best-practices/AGENTS.md +2410 -0
  262. package/dist/template/.opencode/skill/react-best-practices/README.md +123 -0
  263. package/dist/template/.opencode/skill/react-best-practices/SKILL.md +125 -0
  264. package/dist/template/.opencode/skill/react-best-practices/metadata.json +15 -0
  265. package/dist/template/.opencode/skill/react-best-practices/rules/_sections.md +46 -0
  266. package/dist/template/.opencode/skill/react-best-practices/rules/_template.md +28 -0
  267. package/dist/template/.opencode/skill/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  268. package/dist/template/.opencode/skill/react-best-practices/rules/advanced-use-latest.md +49 -0
  269. package/dist/template/.opencode/skill/react-best-practices/rules/async-api-routes.md +38 -0
  270. package/dist/template/.opencode/skill/react-best-practices/rules/async-defer-await.md +80 -0
  271. package/dist/template/.opencode/skill/react-best-practices/rules/async-dependencies.md +36 -0
  272. package/dist/template/.opencode/skill/react-best-practices/rules/async-parallel.md +28 -0
  273. package/dist/template/.opencode/skill/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  274. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  275. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-conditional.md +31 -0
  276. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  277. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  278. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-preload.md +50 -0
  279. package/dist/template/.opencode/skill/react-best-practices/rules/client-event-listeners.md +74 -0
  280. package/dist/template/.opencode/skill/react-best-practices/rules/client-localstorage-schema.md +71 -0
  281. package/dist/template/.opencode/skill/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  282. package/dist/template/.opencode/skill/react-best-practices/rules/client-swr-dedup.md +56 -0
  283. package/dist/template/.opencode/skill/react-best-practices/rules/js-batch-dom-css.md +82 -0
  284. package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-function-results.md +80 -0
  285. package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-property-access.md +28 -0
  286. package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-storage.md +70 -0
  287. package/dist/template/.opencode/skill/react-best-practices/rules/js-combine-iterations.md +32 -0
  288. package/dist/template/.opencode/skill/react-best-practices/rules/js-early-exit.md +50 -0
  289. package/dist/template/.opencode/skill/react-best-practices/rules/js-hoist-regexp.md +45 -0
  290. package/dist/template/.opencode/skill/react-best-practices/rules/js-index-maps.md +37 -0
  291. package/dist/template/.opencode/skill/react-best-practices/rules/js-length-check-first.md +49 -0
  292. package/dist/template/.opencode/skill/react-best-practices/rules/js-min-max-loop.md +82 -0
  293. package/dist/template/.opencode/skill/react-best-practices/rules/js-set-map-lookups.md +24 -0
  294. package/dist/template/.opencode/skill/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  295. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-activity.md +26 -0
  296. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  297. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-conditional-render.md +40 -0
  298. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-content-visibility.md +38 -0
  299. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  300. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  301. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-svg-precision.md +28 -0
  302. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-defer-reads.md +39 -0
  303. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-dependencies.md +45 -0
  304. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-derived-state.md +29 -0
  305. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  306. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  307. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-memo.md +44 -0
  308. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-transitions.md +40 -0
  309. package/dist/template/.opencode/skill/react-best-practices/rules/server-after-nonblocking.md +73 -0
  310. package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-lru.md +41 -0
  311. package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-react.md +76 -0
  312. package/dist/template/.opencode/skill/react-best-practices/rules/server-parallel-fetching.md +83 -0
  313. package/dist/template/.opencode/skill/react-best-practices/rules/server-serialization.md +38 -0
  314. package/dist/template/.opencode/skill/supabase/SKILL.md +120 -0
  315. package/dist/template/.opencode/skill/supabase/mcp.json +27 -0
  316. package/dist/template/.opencode/skill/vercel-deploy-claimable/SKILL.md +112 -0
  317. package/dist/template/.opencode/skill/vercel-deploy-claimable/scripts/deploy.sh +249 -0
  318. package/dist/template/.opencode/skill/web-design-guidelines/SKILL.md +39 -0
  319. package/package.json +1 -1
@@ -0,0 +1,169 @@
1
+ # API Operations
2
+
3
+ ## Deploy User Worker
4
+
5
+ ```bash
6
+ curl -X PUT \
7
+ "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/workers/dispatch/namespaces/$NAMESPACE/scripts/$SCRIPT_NAME" \
8
+ -H "Authorization: Bearer $API_TOKEN" \
9
+ -F 'metadata={"main_module": "worker.mjs"};type=application/json' \
10
+ -F 'worker.mjs=@worker.mjs;type=application/javascript+module'
11
+ ```
12
+
13
+ ### TypeScript SDK
14
+ ```typescript
15
+ import Cloudflare from "cloudflare";
16
+
17
+ const client = new Cloudflare({ apiToken: process.env.API_TOKEN });
18
+
19
+ const scriptFile = new File([scriptContent], `${scriptName}.mjs`, {
20
+ type: "application/javascript+module",
21
+ });
22
+
23
+ await client.workersForPlatforms.dispatch.namespaces.scripts.update(
24
+ namespace, scriptName,
25
+ {
26
+ account_id: accountId,
27
+ metadata: { main_module: `${scriptName}.mjs` },
28
+ files: [scriptFile],
29
+ }
30
+ );
31
+ ```
32
+
33
+ ## Deploy with Bindings
34
+ ```bash
35
+ curl -X PUT ".../scripts/$SCRIPT_NAME" \
36
+ -F 'metadata={
37
+ "main_module": "worker.mjs",
38
+ "bindings": [
39
+ {"type": "kv_namespace", "name": "MY_KV", "namespace_id": "'$KV_ID'"}
40
+ ],
41
+ "tags": ["customer-123", "production"],
42
+ "compatibility_date": "2024-01-01"
43
+ };type=application/json' \
44
+ -F 'worker.mjs=@worker.mjs;type=application/javascript+module'
45
+ ```
46
+
47
+ ## List/Delete Workers
48
+
49
+ ```bash
50
+ # List
51
+ curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/workers/dispatch/namespaces/$NAMESPACE/scripts" \
52
+ -H "Authorization: Bearer $API_TOKEN"
53
+
54
+ # Delete by name
55
+ curl -X DELETE ".../scripts/$SCRIPT_NAME" -H "Authorization: Bearer $API_TOKEN"
56
+
57
+ # Delete by tag
58
+ curl -X DELETE ".../scripts?tags=customer-123%3Ayes" -H "Authorization: Bearer $API_TOKEN"
59
+ ```
60
+
61
+ ## Static Assets
62
+
63
+ **3-step process:** Create session → Upload files → Deploy Worker
64
+
65
+ ### 1. Create Upload Session
66
+ ```bash
67
+ curl -X POST ".../scripts/$SCRIPT_NAME/assets-upload-session" \
68
+ -H "Authorization: Bearer $API_TOKEN" \
69
+ -d '{
70
+ "manifest": {
71
+ "/index.html": {"hash": "08f1dfda4574284ab3c21666d1ee8c7d4", "size": 1234}
72
+ }
73
+ }'
74
+ # Returns: jwt, buckets
75
+ ```
76
+
77
+ **Hash:** First 16 bytes (32 hex chars) of SHA-256
78
+
79
+ ### 2. Upload Files
80
+ ```bash
81
+ curl -X POST ".../workers/assets/upload?base64=true" \
82
+ -H "Authorization: Bearer $UPLOAD_JWT" \
83
+ -F '08f1dfda4574284ab3c21666d1ee8c7d4=<BASE64_CONTENT>'
84
+ # Returns: completion jwt
85
+ ```
86
+
87
+ ### 3. Deploy with Assets
88
+ ```bash
89
+ curl -X PUT ".../scripts/$SCRIPT_NAME" \
90
+ -F 'metadata={
91
+ "main_module": "index.js",
92
+ "assets": {"jwt": "<COMPLETION_TOKEN>"},
93
+ "bindings": [{"type": "assets", "name": "ASSETS"}]
94
+ };type=application/json' \
95
+ -F 'index.js=export default {...};type=application/javascript+module'
96
+ ```
97
+
98
+ **Asset Isolation:** Assets shared across namespace. For strict isolation, salt hash:
99
+ ```typescript
100
+ const hash = sha256(accountId + fileContents).slice(0, 32);
101
+ ```
102
+
103
+ ## Dispatch Workers
104
+
105
+ ### Subdomain Routing
106
+ ```typescript
107
+ export default {
108
+ async fetch(request: Request, env: Env): Promise<Response> {
109
+ const userWorkerName = new URL(request.url).hostname.split(".")[0];
110
+ const userWorker = env.DISPATCHER.get(userWorkerName);
111
+ return await userWorker.fetch(request);
112
+ },
113
+ };
114
+ ```
115
+
116
+ ### Path Routing
117
+ ```typescript
118
+ const pathParts = new URL(request.url).pathname.split("/").filter(Boolean);
119
+ const userWorker = env.DISPATCHER.get(pathParts[0]);
120
+ return await userWorker.fetch(request);
121
+ ```
122
+
123
+ ### KV Routing
124
+ ```typescript
125
+ const hostname = new URL(request.url).hostname;
126
+ const userWorkerName = await env.ROUTING_KV.get(hostname);
127
+ const userWorker = env.DISPATCHER.get(userWorkerName);
128
+ return await userWorker.fetch(request);
129
+ ```
130
+
131
+ ## Outbound Workers
132
+
133
+ Control external fetch from user Workers:
134
+
135
+ ### Configure
136
+ ```typescript
137
+ const userWorker = env.DISPATCHER.get(
138
+ workerName, {},
139
+ { outbound: { customer_context: { customer_name: workerName, url: request.url } } }
140
+ );
141
+ ```
142
+
143
+ ### Implement
144
+ ```typescript
145
+ export default {
146
+ async fetch(request: Request, env: Env): Promise<Response> {
147
+ const customerName = env.customer_name;
148
+ const url = new URL(request.url);
149
+
150
+ // Block domains
151
+ if (["malicious.com"].some(d => url.hostname.includes(d))) {
152
+ return new Response("Blocked", { status: 403 });
153
+ }
154
+
155
+ // Inject auth
156
+ if (url.hostname === "api.example.com") {
157
+ const headers = new Headers(request.headers);
158
+ headers.set("Authorization", `Bearer ${generateJWT(customerName)}`);
159
+ return fetch(new Request(request, { headers }));
160
+ }
161
+
162
+ return fetch(request);
163
+ },
164
+ };
165
+ ```
166
+
167
+ **Note:** Doesn't intercept DO/mTLS fetch.
168
+
169
+ See [README.md](./README.md), [configuration.md](./configuration.md), [patterns.md](./patterns.md), [gotchas.md](./gotchas.md)
@@ -0,0 +1,136 @@
1
+ # Configuration
2
+
3
+ ## Dispatch Namespace Binding
4
+
5
+ ### wrangler.jsonc
6
+ ```jsonc
7
+ {
8
+ "$schema": "./node_modules/wrangler/config-schema.json",
9
+ "dispatch_namespaces": [{
10
+ "binding": "DISPATCHER",
11
+ "namespace": "production"
12
+ }]
13
+ }
14
+ ```
15
+
16
+ ### wrangler.toml
17
+ ```toml
18
+ [[dispatch_namespaces]]
19
+ binding = "DISPATCHER"
20
+ namespace = "production"
21
+ ```
22
+
23
+ ### With Outbound Worker
24
+ ```jsonc
25
+ {
26
+ "dispatch_namespaces": [{
27
+ "binding": "DISPATCHER",
28
+ "namespace": "production",
29
+ "outbound": {
30
+ "service": "outbound-worker",
31
+ "parameters": ["customer_context"]
32
+ }
33
+ }]
34
+ }
35
+ ```
36
+
37
+ ## Wrangler Commands
38
+
39
+ ```bash
40
+ wrangler dispatch-namespace list
41
+ wrangler dispatch-namespace get production
42
+ wrangler dispatch-namespace create production
43
+ wrangler dispatch-namespace delete staging
44
+ wrangler dispatch-namespace rename old new
45
+ ```
46
+
47
+ ## Custom Limits
48
+
49
+ Set CPU time and subrequest limits per invocation:
50
+
51
+ ```typescript
52
+ const userWorker = env.DISPATCHER.get(
53
+ workerName,
54
+ {},
55
+ {
56
+ limits: {
57
+ cpuMs: 10, // Max CPU ms
58
+ subRequests: 5 // Max fetch() calls
59
+ }
60
+ }
61
+ );
62
+ ```
63
+
64
+ Handle limit violations:
65
+ ```typescript
66
+ try {
67
+ return await userWorker.fetch(request);
68
+ } catch (e) {
69
+ if (e.message.includes("CPU time limit")) {
70
+ return new Response("CPU limit exceeded", { status: 429 });
71
+ }
72
+ throw e;
73
+ }
74
+ ```
75
+
76
+ ## Static Assets
77
+
78
+ Deploy HTML/CSS/images with Workers. See [api.md](./api.md#static-assets) for upload process.
79
+
80
+ ### Wrangler
81
+ ```jsonc
82
+ {
83
+ "name": "customer-site",
84
+ "main": "./src/index.js",
85
+ "assets": {
86
+ "directory": "./public",
87
+ "binding": "ASSETS"
88
+ }
89
+ }
90
+ ```
91
+
92
+ ```bash
93
+ npx wrangler deploy --name customer-site --dispatch-namespace production
94
+ ```
95
+
96
+ ## Bindings
97
+
98
+ Supported: KV, D1, R2, Durable Objects, Analytics Engine, Service, Assets
99
+
100
+ Add via API metadata (see [api.md](./api.md#deploy-with-bindings)):
101
+ ```json
102
+ {
103
+ "bindings": [
104
+ {"type": "kv_namespace", "name": "USER_KV", "namespace_id": "..."},
105
+ {"type": "r2_bucket", "name": "STORAGE", "bucket_name": "..."},
106
+ {"type": "d1", "name": "DB", "id": "..."}
107
+ ]
108
+ }
109
+ ```
110
+
111
+ Preserve existing bindings:
112
+ ```json
113
+ {
114
+ "bindings": [{"type": "r2_bucket", "name": "STORAGE", "bucket_name": "new"}],
115
+ "keep_bindings": ["kv_namespace", "d1"]
116
+ }
117
+ ```
118
+
119
+ ## Tags
120
+
121
+ Organize/search Workers (max 8/script):
122
+
123
+ ```bash
124
+ # Set tags
125
+ curl -X PUT ".../tags" -d '["customer-123", "pro", "production"]'
126
+
127
+ # Filter by tag
128
+ curl ".../scripts?tags=production%3Ayes"
129
+
130
+ # Delete by tag
131
+ curl -X DELETE ".../scripts?tags=customer-123%3Ayes"
132
+ ```
133
+
134
+ Common patterns: `customer-123`, `free|pro|enterprise`, `production|staging`
135
+
136
+ See [README.md](./README.md), [api.md](./api.md), [patterns.md](./patterns.md), [gotchas.md](./gotchas.md)
@@ -0,0 +1,130 @@
1
+ # Gotchas & Limits
2
+
3
+ ## Limits
4
+
5
+ - **Max 8 tags per Worker**
6
+ - **Upload session JWT valid 1 hour**
7
+ - **Completion token valid 1 hour**
8
+ - **No limits on Workers per namespace** (unlike regular Workers)
9
+ - **User Workers run in untrusted mode** (no `request.cf` access)
10
+ - **Outbound Workers don't intercept DO/mTLS fetch**
11
+
12
+ ## Security
13
+
14
+ ### User Worker Restrictions
15
+ - Run in untrusted mode
16
+ - No access to `request.cf` object
17
+ - Automatic isolation from other customers
18
+ - Never share cache
19
+
20
+ ### Outbound Worker Gaps
21
+ - Doesn't intercept Durable Object fetch
22
+ - Doesn't intercept mTLS binding fetch
23
+ - Plan accordingly for complete egress control
24
+
25
+ ### Asset Isolation
26
+ Assets shared across namespace by hash. For strict isolation:
27
+ ```typescript
28
+ const hash = sha256(accountId + fileContents).slice(0, 32);
29
+ ```
30
+
31
+ Never expose upload JWTs to clients.
32
+
33
+ ## Error Handling
34
+
35
+ ### Worker Not Found
36
+ ```typescript
37
+ try {
38
+ const userWorker = env.DISPATCHER.get(name);
39
+ return await userWorker.fetch(request);
40
+ } catch (e) {
41
+ if (e.message.startsWith("Worker not found")) {
42
+ return new Response("Worker not found", { status: 404 });
43
+ }
44
+ return new Response(e.message, { status: 500 });
45
+ }
46
+ ```
47
+
48
+ ### Limit Violations
49
+ ```typescript
50
+ try {
51
+ return await userWorker.fetch(request);
52
+ } catch (e) {
53
+ if (e.message.includes("CPU time limit")) {
54
+ env.ANALYTICS.writeDataPoint({
55
+ indexes: [workerName],
56
+ blobs: ["cpu_limit_exceeded"],
57
+ });
58
+ return new Response("CPU limit exceeded", { status: 429 });
59
+ }
60
+ throw e;
61
+ }
62
+ ```
63
+
64
+ ## Troubleshooting
65
+
66
+ ### Hostname Routing Issues
67
+ - Use `*/*` wildcard route to avoid DNS proxy issues
68
+ - Orange-to-orange: Customer proxied through CF → your CF domain
69
+ - Wildcard works regardless of proxy settings
70
+
71
+ ### Binding Preservation
72
+ - Use `keep_bindings` to avoid losing existing bindings on update
73
+ - Document which resources bound to which Workers
74
+
75
+ ### Tag Filtering
76
+ - URL encode tags: `tags=production%3Ayes`
77
+ - Avoid special chars: `,` and `&`
78
+
79
+ ### Deploy Failures
80
+ - ES modules require multipart form upload
81
+ - Must specify `main_module` in metadata
82
+ - File type: `application/javascript+module`
83
+
84
+ ### Static Assets
85
+ - Hash must be first 16 bytes (32 hex chars) of SHA-256
86
+ - Upload must happen within 1 hour of session creation
87
+ - Deploy must happen within 1 hour of upload completion
88
+ - Base64 encode file contents for upload
89
+
90
+ ## TypeScript Types
91
+
92
+ ```typescript
93
+ interface Env {
94
+ DISPATCHER: DispatchNamespace;
95
+ ROUTING_KV: KVNamespace;
96
+ CUSTOMERS_KV: KVNamespace;
97
+ ANALYTICS: AnalyticsEngineDataset;
98
+ }
99
+
100
+ interface DispatchNamespace {
101
+ get(
102
+ name: string,
103
+ options?: Record<string, unknown>,
104
+ config?: {
105
+ limits?: {
106
+ cpuMs?: number;
107
+ subRequests?: number;
108
+ };
109
+ outbound?: Record<string, unknown>;
110
+ }
111
+ ): Fetcher;
112
+ }
113
+
114
+ interface Fetcher {
115
+ fetch(request: Request): Promise<Response>;
116
+ }
117
+ ```
118
+
119
+ ## Common Mistakes
120
+
121
+ 1. **Creating namespace per customer** → Use one namespace per environment
122
+ 2. **Not handling Worker not found** → Always catch and handle gracefully
123
+ 3. **Forgetting `keep_bindings`** → Existing bindings lost on update
124
+ 4. **Not tagging Workers** → Can't bulk delete/filter
125
+ 5. **Exposing upload JWTs** → Keep server-side only
126
+ 6. **No limit tracking** → Use Analytics Engine for violations
127
+ 7. **Not using wildcard routes** → Hit route limits, DNS issues
128
+ 8. **Assuming DO/mTLS interception** → Outbound Worker doesn't catch these
129
+
130
+ See [README.md](./README.md), [configuration.md](./configuration.md), [api.md](./api.md), [patterns.md](./patterns.md)
@@ -0,0 +1,170 @@
1
+ # Multi-Tenant Patterns
2
+
3
+ ## Billing by Plan
4
+
5
+ ```typescript
6
+ interface Env {
7
+ DISPATCHER: DispatchNamespace;
8
+ CUSTOMERS_KV: KVNamespace;
9
+ }
10
+
11
+ export default {
12
+ async fetch(request: Request, env: Env): Promise<Response> {
13
+ const userWorkerName = new URL(request.url).hostname.split(".")[0];
14
+ const customerPlan = await env.CUSTOMERS_KV.get(userWorkerName);
15
+
16
+ const plans = {
17
+ enterprise: { cpuMs: 50, subRequests: 50 },
18
+ pro: { cpuMs: 20, subRequests: 20 },
19
+ free: { cpuMs: 10, subRequests: 5 },
20
+ };
21
+ const limits = plans[customerPlan as keyof typeof plans] || plans.free;
22
+
23
+ const userWorker = env.DISPATCHER.get(userWorkerName, {}, { limits });
24
+ return await userWorker.fetch(request);
25
+ },
26
+ };
27
+ ```
28
+
29
+ ## Resource Isolation
30
+
31
+ **Complete isolation:** Create unique resources per customer
32
+ - KV namespace per customer
33
+ - D1 database per customer
34
+ - R2 bucket per customer
35
+
36
+ ```typescript
37
+ const bindings = [{
38
+ type: "kv_namespace",
39
+ name: "USER_KV",
40
+ namespace_id: `customer-${customerId}-kv`
41
+ }];
42
+ ```
43
+
44
+ ## Hostname Routing
45
+
46
+ ### Wildcard Route (Recommended)
47
+ Configure `*/*` route on SaaS domain → dispatch Worker
48
+
49
+ **Benefits:**
50
+ - Supports subdomains + custom vanity domains
51
+ - No route limits
52
+ - Programmatic control
53
+ - Works with any DNS proxy settings
54
+
55
+ **Setup:**
56
+ 1. Cloudflare for SaaS custom hostnames
57
+ 2. Fallback origin (dummy `A 192.0.2.0` if Worker is origin)
58
+ 3. DNS CNAME to SaaS domain
59
+ 4. `*/*` route → dispatch Worker
60
+ 5. Routing logic in dispatch Worker
61
+
62
+ ```typescript
63
+ export default {
64
+ async fetch(request: Request, env: Env): Promise<Response> {
65
+ const hostname = new URL(request.url).hostname;
66
+ const hostnameData = await env.ROUTING_KV.get(`hostname:${hostname}`, { type: "json" });
67
+
68
+ if (!hostnameData?.workerName) {
69
+ return new Response("Hostname not configured", { status: 404 });
70
+ }
71
+
72
+ const userWorker = env.DISPATCHER.get(hostnameData.workerName);
73
+ return await userWorker.fetch(request);
74
+ },
75
+ };
76
+ ```
77
+
78
+ ### Subdomain-Only
79
+ 1. Wildcard DNS: `*.saas.com` → origin
80
+ 2. Route: `*.saas.com/*` → dispatch Worker
81
+ 3. Extract subdomain for routing
82
+
83
+ **Orange-to-Orange:** When customers use Cloudflare and CNAME to your domain, use `*/*` wildcard for consistent behavior.
84
+
85
+ ## Observability
86
+
87
+ ### Logpush
88
+ - Enable on dispatch Worker → captures all user Worker logs
89
+ - Filter by `Outcome` or `Script Name`
90
+
91
+ ### Tail Workers
92
+ - Real-time logs with custom formatting
93
+ - Receives HTTP status, `console.log()`, exceptions, diagnostics
94
+
95
+ ### Analytics Engine
96
+ ```typescript
97
+ // Track violations
98
+ env.ANALYTICS.writeDataPoint({
99
+ indexes: [customerName],
100
+ blobs: ["cpu_limit_exceeded"],
101
+ });
102
+ ```
103
+
104
+ ### GraphQL
105
+ ```graphql
106
+ query {
107
+ viewer {
108
+ accounts(filter: {accountTag: $accountId}) {
109
+ workersInvocationsAdaptive(filter: {dispatchNamespaceName: "production"}) {
110
+ sum { requests errors cpuTime }
111
+ }
112
+ }
113
+ }
114
+ }
115
+ ```
116
+
117
+ ## Use Case Implementations
118
+
119
+ ### AI Code Execution
120
+ ```typescript
121
+ async function deployGeneratedCode(name: string, code: string) {
122
+ const file = new File([code], `${name}.mjs`, { type: "application/javascript+module" });
123
+ await client.workersForPlatforms.dispatch.namespaces.scripts.update("production", name, {
124
+ account_id: accountId,
125
+ metadata: { main_module: `${name}.mjs`, tags: [name, "ai-generated"] },
126
+ files: [file],
127
+ });
128
+ }
129
+
130
+ // Short limits for untrusted code
131
+ const userWorker = env.DISPATCHER.get(sessionId, {}, { limits: { cpuMs: 5, subRequests: 3 } });
132
+ ```
133
+
134
+ ### Edge Functions Platform
135
+ ```typescript
136
+ // Route: /customer-id/function-name
137
+ const [customerId, functionName] = new URL(request.url).pathname.split("/").filter(Boolean);
138
+ const workerName = `${customerId}-${functionName}`;
139
+ const userWorker = env.DISPATCHER.get(workerName);
140
+ ```
141
+
142
+ ### Website Builder
143
+ - Deploy static assets + Worker code
144
+ - See [api.md](./api.md#static-assets) for full implementation
145
+ - Salt hashes for asset isolation
146
+
147
+ ## Best Practices
148
+
149
+ ### Architecture
150
+ - One namespace per environment (production, staging)
151
+ - Platform logic in dispatch Worker (auth, rate limiting, validation)
152
+ - Isolation automatic (no shared cache, untrusted mode)
153
+
154
+ ### Routing
155
+ - Use `*/*` wildcard routes
156
+ - Store mappings in KV
157
+ - Handle missing Workers gracefully
158
+
159
+ ### Limits & Security
160
+ - Set custom limits by plan
161
+ - Track violations with Analytics Engine
162
+ - Use outbound Workers for egress control
163
+ - Sanitize responses
164
+
165
+ ### Tags
166
+ - Tag all Workers: customer ID, plan, environment
167
+ - Enable bulk operations
168
+ - Filter efficiently
169
+
170
+ See [README.md](./README.md), [configuration.md](./configuration.md), [api.md](./api.md), [gotchas.md](./gotchas.md)
@@ -0,0 +1,16 @@
1
+ # Cloudflare Workers Playground Skill Reference
2
+
3
+ ## Overview
4
+
5
+ Cloudflare Workers Playground is a browser-based sandbox for instantly experimenting with, testing, and deploying Cloudflare Workers without authentication or setup. This skill provides patterns, APIs, and best practices specifically for Workers Playground development....
6
+
7
+ ## In This Reference
8
+
9
+ - **[configuration.md](./configuration.md)** - Setup, deployment, configuration
10
+ - **[api.md](./api.md)** - API endpoints, methods, interfaces
11
+ - **[patterns.md](./patterns.md)** - Common patterns, use cases, examples
12
+ - **[gotchas.md](./gotchas.md)** - Troubleshooting, best practices, limitations
13
+
14
+ ## See Also
15
+
16
+ - [Cloudflare Docs](https://developers.cloudflare.com/)
@@ -0,0 +1,20 @@
1
+ ### HTTP Test Panel
2
+
3
+ Switch to **HTTP** tab to test raw HTTP requests:
4
+ - Change HTTP method (GET, POST, PUT, DELETE, etc.)
5
+ - Add/edit headers
6
+ - Modify request body
7
+ - Send request to Worker
8
+
9
+ ### Sharing Code
10
+
11
+ Click **Copy Link** to generate shareable URL with embedded code. Links never expire and can be bookmarked.
12
+
13
+ ### Deploy from Playground
14
+
15
+ Click **Deploy** button to:
16
+ 1. Log in to Cloudflare account (if not already)
17
+ 2. Review Worker code
18
+ 3. Deploy to Cloudflare's global network
19
+ 4. Get unique `*.workers.dev` URL
20
+ 5. Add custom domains, bindings, etc. from dashboard
@@ -0,0 +1,3 @@
1
+ # Configuration
2
+
3
+ See main documentation.
@@ -0,0 +1,35 @@
1
+ ## Best Practices
2
+
3
+ ### 1. Use Async/Await
4
+ Always use `async/await` for cleaner asynchronous code:
5
+
6
+ ```javascript
7
+ // Good
8
+ export default {
9
+ async fetch(request, env, ctx) {
10
+ const response = await fetch('https://api.example.com');
11
+ const data = await response.json();
12
+ return new Response(JSON.stringify(data));
13
+ },
14
+ };
15
+
16
+ // Avoid
17
+ export default {
18
+ fetch(request, env, ctx) {
19
+ return fetch('https://api.example.com')
20
+ .then(response => response.json())
21
+ .then(data => new Response(JSON.stringify(data)));
22
+ },
23
+ };
24
+ ```
25
+
26
+ ### 2. Clone Responses Before Reading
27
+ Response bodies can only be read once:
28
+
29
+ ```javascript
30
+ export default {
31
+ async fetch(request, env, ctx) {
32
+ const response = await fetch('https://api.example.com');
33
+
34
+ // Clone before caching
35
+ ctx.waitUntil(cach