opencodekit 0.15.3 → 0.15.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/template/.opencode/AGENTS.md +209 -77
  3. package/dist/template/.opencode/agent/plan.md +4 -0
  4. package/dist/template/.opencode/command/cloudflare.md +70 -0
  5. package/dist/template/.opencode/package.json +1 -1
  6. package/dist/template/.opencode/skill/cloudflare/SKILL.md +233 -0
  7. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/README.md +35 -0
  8. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/api.md +100 -0
  9. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/configuration.md +99 -0
  10. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/gotchas.md +59 -0
  11. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/patterns.md +89 -0
  12. package/dist/template/.opencode/skill/cloudflare/references/ai-gateway/README.md +695 -0
  13. package/dist/template/.opencode/skill/cloudflare/references/ai-search/README.md +14 -0
  14. package/dist/template/.opencode/skill/cloudflare/references/ai-search/api.md +38 -0
  15. package/dist/template/.opencode/skill/cloudflare/references/ai-search/configuration.md +52 -0
  16. package/dist/template/.opencode/skill/cloudflare/references/ai-search/gotchas.md +41 -0
  17. package/dist/template/.opencode/skill/cloudflare/references/ai-search/patterns.md +45 -0
  18. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/README.md +14 -0
  19. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/api.md +27 -0
  20. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/configuration.md +45 -0
  21. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/gotchas.md +3 -0
  22. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/patterns.md +36 -0
  23. package/dist/template/.opencode/skill/cloudflare/references/api/README.md +21 -0
  24. package/dist/template/.opencode/skill/cloudflare/references/api/api.md +31 -0
  25. package/dist/template/.opencode/skill/cloudflare/references/api/configuration.md +20 -0
  26. package/dist/template/.opencode/skill/cloudflare/references/api/gotchas.md +28 -0
  27. package/dist/template/.opencode/skill/cloudflare/references/api/patterns.md +47 -0
  28. package/dist/template/.opencode/skill/cloudflare/references/api-shield/README.md +20 -0
  29. package/dist/template/.opencode/skill/cloudflare/references/api-shield/api.md +78 -0
  30. package/dist/template/.opencode/skill/cloudflare/references/api-shield/configuration.md +128 -0
  31. package/dist/template/.opencode/skill/cloudflare/references/api-shield/gotchas.md +51 -0
  32. package/dist/template/.opencode/skill/cloudflare/references/api-shield/patterns.md +145 -0
  33. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/README.md +16 -0
  34. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/api.md +50 -0
  35. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/configuration.md +53 -0
  36. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/gotchas.md +16 -0
  37. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/patterns.md +45 -0
  38. package/dist/template/.opencode/skill/cloudflare/references/bindings/README.md +14 -0
  39. package/dist/template/.opencode/skill/cloudflare/references/bindings/api.md +3 -0
  40. package/dist/template/.opencode/skill/cloudflare/references/bindings/configuration.md +58 -0
  41. package/dist/template/.opencode/skill/cloudflare/references/bindings/gotchas.md +35 -0
  42. package/dist/template/.opencode/skill/cloudflare/references/bindings/patterns.md +37 -0
  43. package/dist/template/.opencode/skill/cloudflare/references/bot-management/README.md +71 -0
  44. package/dist/template/.opencode/skill/cloudflare/references/bot-management/api.md +168 -0
  45. package/dist/template/.opencode/skill/cloudflare/references/bot-management/configuration.md +114 -0
  46. package/dist/template/.opencode/skill/cloudflare/references/bot-management/gotchas.md +99 -0
  47. package/dist/template/.opencode/skill/cloudflare/references/bot-management/patterns.md +125 -0
  48. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/README.md +16 -0
  49. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/api.md +54 -0
  50. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/configuration.md +47 -0
  51. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/gotchas.md +29 -0
  52. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/patterns.md +29 -0
  53. package/dist/template/.opencode/skill/cloudflare/references/c3/README.md +264 -0
  54. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/README.md +93 -0
  55. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/api.md +176 -0
  56. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/configuration.md +164 -0
  57. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/gotchas.md +203 -0
  58. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/patterns.md +180 -0
  59. package/dist/template/.opencode/skill/cloudflare/references/containers/README.md +16 -0
  60. package/dist/template/.opencode/skill/cloudflare/references/containers/api.md +43 -0
  61. package/dist/template/.opencode/skill/cloudflare/references/containers/configuration.md +56 -0
  62. package/dist/template/.opencode/skill/cloudflare/references/containers/gotchas.md +21 -0
  63. package/dist/template/.opencode/skill/cloudflare/references/containers/patterns.md +40 -0
  64. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/README.md +85 -0
  65. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/api.md +198 -0
  66. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/configuration.md +151 -0
  67. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/gotchas.md +129 -0
  68. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/patterns.md +122 -0
  69. package/dist/template/.opencode/skill/cloudflare/references/d1/README.md +92 -0
  70. package/dist/template/.opencode/skill/cloudflare/references/d1/api.md +141 -0
  71. package/dist/template/.opencode/skill/cloudflare/references/d1/configuration.md +127 -0
  72. package/dist/template/.opencode/skill/cloudflare/references/d1/gotchas.md +70 -0
  73. package/dist/template/.opencode/skill/cloudflare/references/d1/patterns.md +144 -0
  74. package/dist/template/.opencode/skill/cloudflare/references/ddos/README.md +34 -0
  75. package/dist/template/.opencode/skill/cloudflare/references/ddos/api.md +136 -0
  76. package/dist/template/.opencode/skill/cloudflare/references/ddos/configuration.md +67 -0
  77. package/dist/template/.opencode/skill/cloudflare/references/ddos/gotchas.md +114 -0
  78. package/dist/template/.opencode/skill/cloudflare/references/ddos/patterns.md +158 -0
  79. package/dist/template/.opencode/skill/cloudflare/references/do-storage/README.md +62 -0
  80. package/dist/template/.opencode/skill/cloudflare/references/do-storage/api.md +89 -0
  81. package/dist/template/.opencode/skill/cloudflare/references/do-storage/configuration.md +116 -0
  82. package/dist/template/.opencode/skill/cloudflare/references/do-storage/gotchas.md +93 -0
  83. package/dist/template/.opencode/skill/cloudflare/references/do-storage/patterns.md +112 -0
  84. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/README.md +125 -0
  85. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/api.md +152 -0
  86. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/configuration.md +148 -0
  87. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/gotchas.md +158 -0
  88. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/patterns.md +255 -0
  89. package/dist/template/.opencode/skill/cloudflare/references/email-routing/README.md +18 -0
  90. package/dist/template/.opencode/skill/cloudflare/references/email-routing/api.md +46 -0
  91. package/dist/template/.opencode/skill/cloudflare/references/email-routing/configuration.md +63 -0
  92. package/dist/template/.opencode/skill/cloudflare/references/email-routing/gotchas.md +16 -0
  93. package/dist/template/.opencode/skill/cloudflare/references/email-routing/patterns.md +46 -0
  94. package/dist/template/.opencode/skill/cloudflare/references/email-workers/README.md +598 -0
  95. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/README.md +62 -0
  96. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/api.md +137 -0
  97. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/configuration.md +133 -0
  98. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/gotchas.md +184 -0
  99. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/patterns.md +176 -0
  100. package/dist/template/.opencode/skill/cloudflare/references/images/README.md +14 -0
  101. package/dist/template/.opencode/skill/cloudflare/references/images/api.md +3 -0
  102. package/dist/template/.opencode/skill/cloudflare/references/images/configuration.md +45 -0
  103. package/dist/template/.opencode/skill/cloudflare/references/images/gotchas.md +23 -0
  104. package/dist/template/.opencode/skill/cloudflare/references/images/patterns.md +31 -0
  105. package/dist/template/.opencode/skill/cloudflare/references/kv/README.md +60 -0
  106. package/dist/template/.opencode/skill/cloudflare/references/kv/api.md +114 -0
  107. package/dist/template/.opencode/skill/cloudflare/references/kv/configuration.md +92 -0
  108. package/dist/template/.opencode/skill/cloudflare/references/kv/gotchas.md +117 -0
  109. package/dist/template/.opencode/skill/cloudflare/references/kv/patterns.md +139 -0
  110. package/dist/template/.opencode/skill/cloudflare/references/miniflare/README.md +64 -0
  111. package/dist/template/.opencode/skill/cloudflare/references/miniflare/api.md +144 -0
  112. package/dist/template/.opencode/skill/cloudflare/references/miniflare/configuration.md +203 -0
  113. package/dist/template/.opencode/skill/cloudflare/references/miniflare/gotchas.md +187 -0
  114. package/dist/template/.opencode/skill/cloudflare/references/miniflare/patterns.md +211 -0
  115. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/README.md +60 -0
  116. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/api.md +240 -0
  117. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/configuration.md +127 -0
  118. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/gotchas.md +171 -0
  119. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/patterns.md +171 -0
  120. package/dist/template/.opencode/skill/cloudflare/references/observability/README.md +18 -0
  121. package/dist/template/.opencode/skill/cloudflare/references/observability/api.md +51 -0
  122. package/dist/template/.opencode/skill/cloudflare/references/observability/configuration.md +60 -0
  123. package/dist/template/.opencode/skill/cloudflare/references/observability/gotchas.md +36 -0
  124. package/dist/template/.opencode/skill/cloudflare/references/observability/patterns.md +42 -0
  125. package/dist/template/.opencode/skill/cloudflare/references/pages/README.md +76 -0
  126. package/dist/template/.opencode/skill/cloudflare/references/pages/api.md +200 -0
  127. package/dist/template/.opencode/skill/cloudflare/references/pages/configuration.md +228 -0
  128. package/dist/template/.opencode/skill/cloudflare/references/pages/gotchas.md +161 -0
  129. package/dist/template/.opencode/skill/cloudflare/references/pages/patterns.md +145 -0
  130. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/README.md +57 -0
  131. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/api.md +201 -0
  132. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/configuration.md +159 -0
  133. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/gotchas.md +151 -0
  134. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/patterns.md +190 -0
  135. package/dist/template/.opencode/skill/cloudflare/references/pipelines/README.md +664 -0
  136. package/dist/template/.opencode/skill/cloudflare/references/pulumi/README.md +107 -0
  137. package/dist/template/.opencode/skill/cloudflare/references/pulumi/api.md +194 -0
  138. package/dist/template/.opencode/skill/cloudflare/references/pulumi/configuration.md +216 -0
  139. package/dist/template/.opencode/skill/cloudflare/references/pulumi/gotchas.md +223 -0
  140. package/dist/template/.opencode/skill/cloudflare/references/pulumi/patterns.md +139 -0
  141. package/dist/template/.opencode/skill/cloudflare/references/queues/README.md +69 -0
  142. package/dist/template/.opencode/skill/cloudflare/references/queues/api.md +138 -0
  143. package/dist/template/.opencode/skill/cloudflare/references/queues/configuration.md +125 -0
  144. package/dist/template/.opencode/skill/cloudflare/references/queues/gotchas.md +112 -0
  145. package/dist/template/.opencode/skill/cloudflare/references/queues/patterns.md +155 -0
  146. package/dist/template/.opencode/skill/cloudflare/references/r2/README.md +61 -0
  147. package/dist/template/.opencode/skill/cloudflare/references/r2/api.md +127 -0
  148. package/dist/template/.opencode/skill/cloudflare/references/r2/configuration.md +76 -0
  149. package/dist/template/.opencode/skill/cloudflare/references/r2/gotchas.md +94 -0
  150. package/dist/template/.opencode/skill/cloudflare/references/r2/patterns.md +127 -0
  151. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/README.md +18 -0
  152. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/api.md +29 -0
  153. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/configuration.md +39 -0
  154. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/gotchas.md +20 -0
  155. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/patterns.md +46 -0
  156. package/dist/template/.opencode/skill/cloudflare/references/r2-sql/README.md +512 -0
  157. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/README.md +21 -0
  158. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/api.md +135 -0
  159. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/configuration.md +63 -0
  160. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/gotchas.md +75 -0
  161. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/patterns.md +102 -0
  162. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/README.md +81 -0
  163. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/api.md +164 -0
  164. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/configuration.md +147 -0
  165. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/gotchas.md +172 -0
  166. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/patterns.md +155 -0
  167. package/dist/template/.opencode/skill/cloudflare/references/sandbox/README.md +90 -0
  168. package/dist/template/.opencode/skill/cloudflare/references/sandbox/api.md +178 -0
  169. package/dist/template/.opencode/skill/cloudflare/references/sandbox/configuration.md +131 -0
  170. package/dist/template/.opencode/skill/cloudflare/references/sandbox/gotchas.md +156 -0
  171. package/dist/template/.opencode/skill/cloudflare/references/sandbox/patterns.md +203 -0
  172. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/README.md +58 -0
  173. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/api.md +182 -0
  174. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/configuration.md +140 -0
  175. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/gotchas.md +129 -0
  176. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/patterns.md +218 -0
  177. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/README.md +91 -0
  178. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/api.md +139 -0
  179. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/configuration.md +129 -0
  180. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/gotchas.md +87 -0
  181. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/patterns.md +135 -0
  182. package/dist/template/.opencode/skill/cloudflare/references/snippets/README.md +15 -0
  183. package/dist/template/.opencode/skill/cloudflare/references/snippets/api.md +47 -0
  184. package/dist/template/.opencode/skill/cloudflare/references/snippets/configuration.md +33 -0
  185. package/dist/template/.opencode/skill/cloudflare/references/snippets/gotchas.md +21 -0
  186. package/dist/template/.opencode/skill/cloudflare/references/snippets/patterns.md +34 -0
  187. package/dist/template/.opencode/skill/cloudflare/references/spectrum/README.md +16 -0
  188. package/dist/template/.opencode/skill/cloudflare/references/spectrum/api.md +24 -0
  189. package/dist/template/.opencode/skill/cloudflare/references/spectrum/configuration.md +43 -0
  190. package/dist/template/.opencode/skill/cloudflare/references/spectrum/gotchas.md +42 -0
  191. package/dist/template/.opencode/skill/cloudflare/references/spectrum/patterns.md +40 -0
  192. package/dist/template/.opencode/skill/cloudflare/references/static-assets/README.md +14 -0
  193. package/dist/template/.opencode/skill/cloudflare/references/static-assets/api.md +3 -0
  194. package/dist/template/.opencode/skill/cloudflare/references/static-assets/configuration.md +47 -0
  195. package/dist/template/.opencode/skill/cloudflare/references/static-assets/gotchas.md +44 -0
  196. package/dist/template/.opencode/skill/cloudflare/references/static-assets/patterns.md +42 -0
  197. package/dist/template/.opencode/skill/cloudflare/references/stream/README.md +103 -0
  198. package/dist/template/.opencode/skill/cloudflare/references/stream/api.md +204 -0
  199. package/dist/template/.opencode/skill/cloudflare/references/stream/configuration.md +127 -0
  200. package/dist/template/.opencode/skill/cloudflare/references/stream/gotchas.md +131 -0
  201. package/dist/template/.opencode/skill/cloudflare/references/stream/patterns.md +152 -0
  202. package/dist/template/.opencode/skill/cloudflare/references/tail-workers/README.md +640 -0
  203. package/dist/template/.opencode/skill/cloudflare/references/terraform/README.md +76 -0
  204. package/dist/template/.opencode/skill/cloudflare/references/terraform/api.md +159 -0
  205. package/dist/template/.opencode/skill/cloudflare/references/terraform/configuration.md +156 -0
  206. package/dist/template/.opencode/skill/cloudflare/references/terraform/gotchas.md +207 -0
  207. package/dist/template/.opencode/skill/cloudflare/references/terraform/patterns.md +135 -0
  208. package/dist/template/.opencode/skill/cloudflare/references/tunnel/README.md +82 -0
  209. package/dist/template/.opencode/skill/cloudflare/references/tunnel/api.md +105 -0
  210. package/dist/template/.opencode/skill/cloudflare/references/tunnel/configuration.md +113 -0
  211. package/dist/template/.opencode/skill/cloudflare/references/tunnel/gotchas.md +115 -0
  212. package/dist/template/.opencode/skill/cloudflare/references/tunnel/patterns.md +157 -0
  213. package/dist/template/.opencode/skill/cloudflare/references/turn/README.md +699 -0
  214. package/dist/template/.opencode/skill/cloudflare/references/turnstile/README.md +14 -0
  215. package/dist/template/.opencode/skill/cloudflare/references/turnstile/api.md +3 -0
  216. package/dist/template/.opencode/skill/cloudflare/references/turnstile/configuration.md +19 -0
  217. package/dist/template/.opencode/skill/cloudflare/references/turnstile/gotchas.md +27 -0
  218. package/dist/template/.opencode/skill/cloudflare/references/turnstile/patterns.md +41 -0
  219. package/dist/template/.opencode/skill/cloudflare/references/vectorize/README.md +682 -0
  220. package/dist/template/.opencode/skill/cloudflare/references/waf/README.md +14 -0
  221. package/dist/template/.opencode/skill/cloudflare/references/waf/api.md +3 -0
  222. package/dist/template/.opencode/skill/cloudflare/references/waf/configuration.md +44 -0
  223. package/dist/template/.opencode/skill/cloudflare/references/waf/gotchas.md +24 -0
  224. package/dist/template/.opencode/skill/cloudflare/references/waf/patterns.md +29 -0
  225. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/README.md +19 -0
  226. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/api.md +52 -0
  227. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/configuration.md +31 -0
  228. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/gotchas.md +28 -0
  229. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/patterns.md +52 -0
  230. package/dist/template/.opencode/skill/cloudflare/references/workerd/README.md +47 -0
  231. package/dist/template/.opencode/skill/cloudflare/references/workerd/api.md +199 -0
  232. package/dist/template/.opencode/skill/cloudflare/references/workerd/configuration.md +185 -0
  233. package/dist/template/.opencode/skill/cloudflare/references/workerd/gotchas.md +203 -0
  234. package/dist/template/.opencode/skill/cloudflare/references/workerd/patterns.md +216 -0
  235. package/dist/template/.opencode/skill/cloudflare/references/workers/README.md +96 -0
  236. package/dist/template/.opencode/skill/cloudflare/references/workers/api.md +137 -0
  237. package/dist/template/.opencode/skill/cloudflare/references/workers/configuration.md +147 -0
  238. package/dist/template/.opencode/skill/cloudflare/references/workers/gotchas.md +99 -0
  239. package/dist/template/.opencode/skill/cloudflare/references/workers/patterns.md +149 -0
  240. package/dist/template/.opencode/skill/cloudflare/references/workers-ai/README.md +116 -0
  241. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/README.md +48 -0
  242. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/api.md +169 -0
  243. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/configuration.md +136 -0
  244. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/gotchas.md +130 -0
  245. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/patterns.md +170 -0
  246. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/README.md +16 -0
  247. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/api.md +20 -0
  248. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/configuration.md +3 -0
  249. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/gotchas.md +35 -0
  250. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/patterns.md +42 -0
  251. package/dist/template/.opencode/skill/cloudflare/references/workers-vpc/README.md +579 -0
  252. package/dist/template/.opencode/skill/cloudflare/references/workflows/README.md +62 -0
  253. package/dist/template/.opencode/skill/cloudflare/references/workflows/api.md +125 -0
  254. package/dist/template/.opencode/skill/cloudflare/references/workflows/configuration.md +177 -0
  255. package/dist/template/.opencode/skill/cloudflare/references/workflows/gotchas.md +136 -0
  256. package/dist/template/.opencode/skill/cloudflare/references/workflows/patterns.md +132 -0
  257. package/dist/template/.opencode/skill/cloudflare/references/wrangler/README.md +90 -0
  258. package/dist/template/.opencode/skill/cloudflare/references/wrangler/api.md +140 -0
  259. package/dist/template/.opencode/skill/cloudflare/references/wrangler/configuration.md +128 -0
  260. package/dist/template/.opencode/skill/cloudflare/references/wrangler/gotchas.md +93 -0
  261. package/dist/template/.opencode/skill/cloudflare/references/wrangler/patterns.md +150 -0
  262. package/dist/template/.opencode/skill/cloudflare/references/zaraz/README.md +360 -0
  263. package/dist/template/.opencode/skill/react-best-practices/AGENTS.md +2410 -0
  264. package/dist/template/.opencode/skill/react-best-practices/README.md +123 -0
  265. package/dist/template/.opencode/skill/react-best-practices/SKILL.md +125 -0
  266. package/dist/template/.opencode/skill/react-best-practices/metadata.json +15 -0
  267. package/dist/template/.opencode/skill/react-best-practices/rules/_sections.md +46 -0
  268. package/dist/template/.opencode/skill/react-best-practices/rules/_template.md +28 -0
  269. package/dist/template/.opencode/skill/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  270. package/dist/template/.opencode/skill/react-best-practices/rules/advanced-use-latest.md +49 -0
  271. package/dist/template/.opencode/skill/react-best-practices/rules/async-api-routes.md +38 -0
  272. package/dist/template/.opencode/skill/react-best-practices/rules/async-defer-await.md +80 -0
  273. package/dist/template/.opencode/skill/react-best-practices/rules/async-dependencies.md +36 -0
  274. package/dist/template/.opencode/skill/react-best-practices/rules/async-parallel.md +28 -0
  275. package/dist/template/.opencode/skill/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  276. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  277. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-conditional.md +31 -0
  278. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  279. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  280. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-preload.md +50 -0
  281. package/dist/template/.opencode/skill/react-best-practices/rules/client-event-listeners.md +74 -0
  282. package/dist/template/.opencode/skill/react-best-practices/rules/client-localstorage-schema.md +71 -0
  283. package/dist/template/.opencode/skill/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  284. package/dist/template/.opencode/skill/react-best-practices/rules/client-swr-dedup.md +56 -0
  285. package/dist/template/.opencode/skill/react-best-practices/rules/js-batch-dom-css.md +82 -0
  286. package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-function-results.md +80 -0
  287. package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-property-access.md +28 -0
  288. package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-storage.md +70 -0
  289. package/dist/template/.opencode/skill/react-best-practices/rules/js-combine-iterations.md +32 -0
  290. package/dist/template/.opencode/skill/react-best-practices/rules/js-early-exit.md +50 -0
  291. package/dist/template/.opencode/skill/react-best-practices/rules/js-hoist-regexp.md +45 -0
  292. package/dist/template/.opencode/skill/react-best-practices/rules/js-index-maps.md +37 -0
  293. package/dist/template/.opencode/skill/react-best-practices/rules/js-length-check-first.md +49 -0
  294. package/dist/template/.opencode/skill/react-best-practices/rules/js-min-max-loop.md +82 -0
  295. package/dist/template/.opencode/skill/react-best-practices/rules/js-set-map-lookups.md +24 -0
  296. package/dist/template/.opencode/skill/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  297. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-activity.md +26 -0
  298. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  299. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-conditional-render.md +40 -0
  300. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-content-visibility.md +38 -0
  301. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  302. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  303. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-svg-precision.md +28 -0
  304. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-defer-reads.md +39 -0
  305. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-dependencies.md +45 -0
  306. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-derived-state.md +29 -0
  307. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  308. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  309. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-memo.md +44 -0
  310. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-transitions.md +40 -0
  311. package/dist/template/.opencode/skill/react-best-practices/rules/server-after-nonblocking.md +73 -0
  312. package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-lru.md +41 -0
  313. package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-react.md +76 -0
  314. package/dist/template/.opencode/skill/react-best-practices/rules/server-parallel-fetching.md +83 -0
  315. package/dist/template/.opencode/skill/react-best-practices/rules/server-serialization.md +38 -0
  316. package/dist/template/.opencode/skill/supabase/SKILL.md +120 -0
  317. package/dist/template/.opencode/skill/supabase/mcp.json +27 -0
  318. package/dist/template/.opencode/skill/vercel-deploy-claimable/SKILL.md +112 -0
  319. package/dist/template/.opencode/skill/vercel-deploy-claimable/scripts/deploy.sh +249 -0
  320. package/dist/template/.opencode/skill/web-design-guidelines/SKILL.md +39 -0
  321. package/package.json +1 -1
@@ -0,0 +1,145 @@
1
+ # Patterns
2
+
3
+ ## API Routes
4
+
5
+ ```typescript
6
+ // functions/api/todos/[id].ts
7
+ export const onRequestGet: PagesFunction<Env> = async ({ env, params }) => {
8
+ const todo = await env.DB.prepare('SELECT * FROM todos WHERE id = ?').bind(params.id).first();
9
+ if (!todo) return new Response('Not found', { status: 404 });
10
+ return Response.json(todo);
11
+ };
12
+
13
+ export const onRequestPut: PagesFunction<Env> = async ({ env, params, request }) => {
14
+ const body = await request.json();
15
+ await env.DB.prepare('UPDATE todos SET title = ?, completed = ? WHERE id = ?')
16
+ .bind(body.title, body.completed, params.id).run();
17
+ return Response.json({ success: true });
18
+ };
19
+
20
+ export const onRequestDelete: PagesFunction<Env> = async ({ env, params }) => {
21
+ await env.DB.prepare('DELETE FROM todos WHERE id = ?').bind(params.id).run();
22
+ return new Response(null, { status: 204 });
23
+ };
24
+ ```
25
+
26
+ ## Auth Middleware
27
+
28
+ ```typescript
29
+ // functions/_middleware.ts
30
+ const auth: PagesFunction<Env> = async (context) => {
31
+ if (context.request.url.includes('/public/')) return context.next();
32
+ const authHeader = context.request.headers.get('Authorization');
33
+ if (!authHeader?.startsWith('Bearer ')) return new Response('Unauthorized', { status: 401 });
34
+
35
+ try {
36
+ const payload = await verifyJWT(authHeader.substring(7), context.env.JWT_SECRET);
37
+ context.data.user = payload;
38
+ return context.next();
39
+ } catch (err) {
40
+ return new Response('Invalid token', { status: 401 });
41
+ }
42
+ };
43
+ export const onRequest = [auth];
44
+ ```
45
+
46
+ ## CORS
47
+
48
+ ```typescript
49
+ // functions/api/_middleware.ts
50
+ const corsHeaders = {'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type, Authorization'};
51
+ const cors: PagesFunction = async (context) => {
52
+ if (context.request.method === 'OPTIONS') return new Response(null, { headers: corsHeaders });
53
+ const response = await context.next();
54
+ Object.entries(corsHeaders).forEach(([k, v]) => response.headers.set(k, v));
55
+ return response;
56
+ };
57
+ export const onRequest = [cors];
58
+ ```
59
+
60
+ ## Form Handling
61
+
62
+ ```typescript
63
+ // functions/api/contact.ts
64
+ export const onRequestPost: PagesFunction<Env> = async ({ request, env }) => {
65
+ const formData = await request.formData();
66
+ await env.QUEUE.send({name: formData.get('name'), email: formData.get('email'), message: formData.get('message')});
67
+ return new Response('<h1>Thanks!</h1>', { headers: { 'Content-Type': 'text/html' } });
68
+ };
69
+ ```
70
+
71
+ ## Background Tasks
72
+
73
+ ```typescript
74
+ export const onRequestPost: PagesFunction = async ({ request, waitUntil }) => {
75
+ const data = await request.json();
76
+ waitUntil(fetch('https://api.example.com/webhook', {method: 'POST', body: JSON.stringify(data)}));
77
+ return Response.json({ queued: true });
78
+ };
79
+ ```
80
+
81
+ ## Error Handling
82
+
83
+ ```typescript
84
+ // functions/_middleware.ts
85
+ const errorHandler: PagesFunction = async (context) => {
86
+ try {
87
+ return await context.next();
88
+ } catch (error) {
89
+ console.error('Error:', error);
90
+ if (context.request.url.includes('/api/')) return Response.json({ error: error.message }, { status: 500 });
91
+ return new Response(`<html><body><h1>Error</h1><p>${error.message}</p></body></html>`, { status: 500, headers: { 'Content-Type': 'text/html' } });
92
+ }
93
+ };
94
+ export const onRequest = [errorHandler];
95
+ ```
96
+
97
+ ## Caching
98
+
99
+ ```typescript
100
+ // functions/api/data.ts
101
+ export const onRequestGet: PagesFunction<Env> = async ({ env, request }) => {
102
+ const url = new URL(request.url);
103
+ const cacheKey = `data:${url.pathname}`;
104
+ const cached = await env.KV.get(cacheKey, 'json');
105
+ if (cached) return Response.json(cached, { headers: { 'X-Cache': 'HIT' } });
106
+
107
+ const data = await env.DB.prepare('SELECT * FROM data WHERE path = ?').bind(url.pathname).first();
108
+ await env.KV.put(cacheKey, JSON.stringify(data), {expirationTtl: 3600});
109
+ return Response.json(data, {headers: {'X-Cache': 'MISS', 'Cache-Control': 'public, max-age=3600'}});
110
+ };
111
+ ```
112
+
113
+ ## Framework Integration
114
+
115
+ ```bash
116
+ npm create cloudflare@latest my-app -- --framework=<framework>
117
+ # next, svelte, remix, nuxt, astro, qwik
118
+ ```
119
+ [Framework Guides](https://developers.cloudflare.com/pages/framework-guides/)
120
+
121
+ ## Monorepo
122
+
123
+ Dashboard → Project → Settings → Build settings → Root directory
124
+
125
+ Set to subproject path (e.g., `apps/web`). Only builds when files in that dir change.
126
+
127
+ ## Best Practices
128
+
129
+ ### Performance
130
+ 1. Exclude static from Functions via `_routes.json`
131
+ 2. Cache with KV (API responses, rendered content)
132
+ 3. Use Cache API: `await caches.default.match(request)`
133
+ 4. Minimize Function size: tree-shake, dynamic imports, keep < 1MB
134
+
135
+ ### Security
136
+ 1. Set security headers in `_headers` for static
137
+ 2. Use secrets, never commit to wrangler.toml
138
+ 3. Validate all inputs
139
+ 4. Rate limit with KV/DO
140
+
141
+ ### Workflow
142
+ 1. Preview deployments per branch/PR
143
+ 2. Local dev: `npx wrangler pages dev ./dist`
144
+ 3. Environment-specific configs in `wrangler.toml`
145
+ 4. Rollbacks: Dashboard → Deployments → Rollback (instant)
@@ -0,0 +1,57 @@
1
+ # Cloudflare Pages Functions
2
+
3
+ Serverless functions on Cloudflare Pages using Workers runtime. Full-stack dev with file-based routing.
4
+
5
+ ## File-Based Routing
6
+
7
+ ```
8
+ /functions
9
+ ├── index.js → /
10
+ ├── api.js → /api
11
+ ├── users/
12
+ │ ├── index.js → /users/
13
+ │ ├── [user].js → /users/:user
14
+ │ └── [[catchall]].js → /users/*
15
+ └── _middleware.js → runs on all routes
16
+ ```
17
+
18
+ **Rules:**
19
+ - `index.js` → directory root
20
+ - Trailing slash optional
21
+ - Specific routes precede catch-alls
22
+ - Falls back to static if no match
23
+
24
+ ## Dynamic Routes
25
+
26
+ **Single segment** `[param]` → string:
27
+ ```js
28
+ // /functions/users/[user].js
29
+ export function onRequest(context) {
30
+ return new Response(`Hello ${context.params.user}`);
31
+ }
32
+ // Matches: /users/nevi
33
+ ```
34
+
35
+ **Multi-segment** `[[param]]` → array:
36
+ ```js
37
+ // /functions/users/[[catchall]].js
38
+ export function onRequest(context) {
39
+ return new Response(JSON.stringify(context.params.catchall));
40
+ }
41
+ // Matches: /users/nevi/foobar → ["nevi", "foobar"]
42
+ ```
43
+
44
+ ## Key Features
45
+
46
+ - **Method handlers:** `onRequestGet`, `onRequestPost`, etc.
47
+ - **Middleware:** `_middleware.js` for cross-cutting concerns
48
+ - **Bindings:** KV, D1, R2, Durable Objects, Workers AI, Service bindings
49
+ - **TypeScript:** Full type support via `@cloudflare/workers-types`
50
+ - **Advanced mode:** Use `_worker.js` for custom routing logic
51
+
52
+ ## See Also
53
+
54
+ - [configuration.md](./configuration.md) - Routes, headers, redirects, wrangler config
55
+ - [api.md](./api.md) - EventContext, handlers, bindings
56
+ - [patterns.md](./patterns.md) - Auth, CORS, rate limiting, forms, caching
57
+ - [gotchas.md](./gotchas.md) - Common issues, debugging, limits
@@ -0,0 +1,201 @@
1
+ # Function API
2
+
3
+ ## EventContext
4
+
5
+ ```typescript
6
+ interface EventContext<Env = any> {
7
+ request: Request; // Incoming request
8
+ functionPath: string; // Request path
9
+ waitUntil(promise: Promise<any>): void; // Background work
10
+ passThroughOnException(): void; // Fallback on error
11
+ next(input?: Request | string, init?: RequestInit): Promise<Response>;
12
+ env: Env; // Bindings, vars, secrets
13
+ params: Record<string, string | string[]>; // Route params
14
+ data: any; // Middleware shared data
15
+ }
16
+ ```
17
+
18
+ ## Handlers
19
+
20
+ ```typescript
21
+ // Generic (fallback)
22
+ export async function onRequest(context: EventContext): Promise<Response> {
23
+ return new Response('Any method');
24
+ }
25
+
26
+ // Method-specific (takes precedence)
27
+ export async function onRequestGet(context: EventContext): Promise<Response> {
28
+ return new Response('GET request');
29
+ }
30
+
31
+ export async function onRequestPost(context: EventContext): Promise<Response> {
32
+ const body = await context.request.json();
33
+ return Response.json({ received: body });
34
+ }
35
+
36
+ // Also: onRequestPut, onRequestPatch, onRequestDelete, onRequestHead, onRequestOptions
37
+ ```
38
+
39
+ ## Bindings
40
+
41
+ ### KV
42
+
43
+ ```typescript
44
+ interface Env { TODO_LIST: KVNamespace; }
45
+
46
+ export const onRequest: PagesFunction<Env> = async (context) => {
47
+ await context.env.TODO_LIST.put('Task:123', 'Buy milk');
48
+ const task = await context.env.TODO_LIST.get('Task:123');
49
+ await context.env.TODO_LIST.delete('Task:123');
50
+ const keys = await context.env.TODO_LIST.list({ prefix: 'Task:' });
51
+
52
+ // With options
53
+ await context.env.TODO_LIST.put('session', data, { expirationTtl: 3600 });
54
+ const value = await context.env.TODO_LIST.get('key', { type: 'json' });
55
+
56
+ return new Response(task);
57
+ };
58
+ ```
59
+
60
+ ### D1
61
+
62
+ ```typescript
63
+ interface Env { DB: D1Database; }
64
+
65
+ export const onRequest: PagesFunction<Env> = async (context) => {
66
+ // Prepared statements
67
+ const result = await context.env.DB.prepare('SELECT * FROM users WHERE id = ?')
68
+ .bind(123)
69
+ .first();
70
+
71
+ // Batch
72
+ const data = await context.env.DB.batch([
73
+ context.env.DB.prepare('SELECT * FROM users'),
74
+ context.env.DB.prepare('SELECT * FROM posts')
75
+ ]);
76
+
77
+ return Response.json(result);
78
+ };
79
+ ```
80
+
81
+ ### R2
82
+
83
+ ```typescript
84
+ interface Env { BUCKET: R2Bucket; }
85
+
86
+ export const onRequest: PagesFunction<Env> = async (context) => {
87
+ const url = new URL(context.request.url);
88
+ const key = url.pathname.slice(1);
89
+
90
+ // GET
91
+ const obj = await context.env.BUCKET.get(key);
92
+ if (!obj) return new Response('Not found', { status: 404 });
93
+
94
+ // PUT
95
+ await context.env.BUCKET.put(key, context.request.body, {
96
+ httpMetadata: { contentType: 'application/octet-stream' }
97
+ });
98
+
99
+ // DELETE
100
+ await context.env.BUCKET.delete(key);
101
+
102
+ return new Response(obj.body);
103
+ };
104
+ ```
105
+
106
+ ### Durable Objects
107
+
108
+ ```typescript
109
+ interface Env { COUNTER: DurableObjectNamespace; }
110
+
111
+ export const onRequest: PagesFunction<Env> = async (context) => {
112
+ const id = context.env.COUNTER.idFromName('global-counter');
113
+ const stub = context.env.COUNTER.get(id);
114
+ return stub.fetch(context.request);
115
+ };
116
+ ```
117
+
118
+ ### Workers AI
119
+
120
+ ```typescript
121
+ interface Env { AI: Ai; }
122
+
123
+ export const onRequest: PagesFunction<Env> = async (context) => {
124
+ const answer = await context.env.AI.run(
125
+ '@cf/meta/llama-3.1-8b-instruct',
126
+ { prompt: 'Hello, World?' }
127
+ );
128
+ return Response.json(answer);
129
+ };
130
+ ```
131
+
132
+ ### Service Bindings
133
+
134
+ ```typescript
135
+ interface Env { AUTH_SERVICE: Fetcher; }
136
+
137
+ export const onRequest: PagesFunction<Env> = async (context) => {
138
+ // Forward request
139
+ return context.env.AUTH_SERVICE.fetch(context.request);
140
+
141
+ // Custom request
142
+ const req = new Request('https://internal/verify', {
143
+ method: 'POST',
144
+ body: JSON.stringify({ token: 'xyz' })
145
+ });
146
+ return context.env.AUTH_SERVICE.fetch(req);
147
+ };
148
+ ```
149
+
150
+ ### Environment Variables
151
+
152
+ ```typescript
153
+ interface Env {
154
+ API_KEY: string;
155
+ ENVIRONMENT: string;
156
+ }
157
+
158
+ export const onRequest: PagesFunction<Env> = async (context) => {
159
+ const apiKey = context.env.API_KEY;
160
+ const isProd = context.env.ENVIRONMENT === 'production';
161
+ return new Response('OK');
162
+ };
163
+ ```
164
+
165
+ ## TypeScript
166
+
167
+ ```bash
168
+ npm install -D @cloudflare/workers-types
169
+ ```
170
+
171
+ ```json
172
+ // tsconfig.json
173
+ {
174
+ "compilerOptions": {
175
+ "target": "ES2021",
176
+ "module": "ES2022",
177
+ "lib": ["ES2021"],
178
+ "types": ["@cloudflare/workers-types"]
179
+ }
180
+ }
181
+ ```
182
+
183
+ ```typescript
184
+ import type { PagesFunction, EventContext } from '@cloudflare/workers-types';
185
+
186
+ interface Env {
187
+ KV: KVNamespace;
188
+ DB: D1Database;
189
+ }
190
+
191
+ export const onRequest: PagesFunction<Env> = async (context) => {
192
+ // context.env fully typed
193
+ return new Response('OK');
194
+ };
195
+ ```
196
+
197
+ ## See Also
198
+
199
+ - [README.md](./README.md) - Overview
200
+ - [configuration.md](./configuration.md) - wrangler.json
201
+ - [patterns.md](./patterns.md) - Common patterns
@@ -0,0 +1,159 @@
1
+ # Configuration
2
+
3
+ ## wrangler.json / wrangler.toml
4
+
5
+ ```jsonc
6
+ {
7
+ "$schema": "./node_modules/wrangler/config-schema.json",
8
+ "name": "my-pages-app",
9
+ "pages_build_output_dir": "./dist",
10
+ "compatibility_date": "2024-01-15",
11
+ "compatibility_flags": ["nodejs_compat"],
12
+
13
+ "vars": { "API_URL": "https://api.example.com" },
14
+
15
+ "kv_namespaces": [
16
+ { "binding": "KV", "id": "abc123" }
17
+ ],
18
+
19
+ "d1_databases": [{
20
+ "binding": "DB",
21
+ "database_name": "production-db",
22
+ "database_id": "xyz789"
23
+ }],
24
+
25
+ "r2_buckets": [
26
+ { "binding": "BUCKET", "bucket_name": "my-bucket" }
27
+ ],
28
+
29
+ "durable_objects": {
30
+ "bindings": [{
31
+ "name": "COUNTER",
32
+ "class_name": "Counter",
33
+ "script_name": "counter-worker"
34
+ }]
35
+ },
36
+
37
+ "services": [
38
+ { "binding": "AUTH", "service": "auth-worker" }
39
+ ],
40
+
41
+ "ai": { "binding": "AI" },
42
+
43
+ "vectorize": [{
44
+ "binding": "VECTORIZE",
45
+ "index_name": "my-index"
46
+ }],
47
+
48
+ "hyperdrive": [{
49
+ "binding": "HYPERDRIVE",
50
+ "id": "hyperdrive-id"
51
+ }],
52
+
53
+ "analytics_engine_datasets": [{ "binding": "ANALYTICS" }]
54
+ }
55
+ ```
56
+
57
+ ## Environment Overrides
58
+
59
+ ```jsonc
60
+ {
61
+ "name": "my-app",
62
+ "vars": { "API_URL": "http://localhost:8787" },
63
+
64
+ "env": {
65
+ "preview": {
66
+ "vars": { "API_URL": "https://preview.example.com" }
67
+ },
68
+ "production": {
69
+ "vars": { "API_URL": "https://api.example.com" }
70
+ }
71
+ }
72
+ }
73
+ ```
74
+
75
+ **Rules:**
76
+ - Top-level → local dev
77
+ - `env.preview` → preview deployments
78
+ - `env.production` → production
79
+ - **Non-inheritable keys:** If overriding `vars`, `kv_namespaces`, `d1_databases`, etc., ALL must be redefined
80
+
81
+ ## Local Secrets (.dev.vars)
82
+
83
+ ```bash
84
+ # .dev.vars (DO NOT COMMIT)
85
+ SECRET_KEY="my-secret-value"
86
+ API_TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
87
+ ```
88
+
89
+ - Add `.dev.vars*` to `.gitignore`
90
+ - Use `vars` for non-sensitive config
91
+ - Environment-specific: `.dev.vars.preview`, `.dev.vars.production`
92
+
93
+ ## _routes.json (Advanced)
94
+
95
+ Custom routing rules in build output:
96
+
97
+ ```json
98
+ {
99
+ "version": 1,
100
+ "include": ["/api/*"],
101
+ "exclude": ["/static/*"]
102
+ }
103
+ ```
104
+
105
+ ## _headers (Static)
106
+
107
+ ```
108
+ /static/*
109
+ Cache-Control: public, max-age=31536000
110
+ X-Custom: value
111
+
112
+ /api/*
113
+ Access-Control-Allow-Origin: *
114
+ ```
115
+
116
+ ## _redirects (Static)
117
+
118
+ ```
119
+ /old-page /new-page 301
120
+ /docs/* https://docs.example.com/:splat 302
121
+ ```
122
+
123
+ ## Local Dev
124
+
125
+ ```bash
126
+ # Start dev server
127
+ npx wrangler pages dev ./dist
128
+
129
+ # With bindings
130
+ npx wrangler pages dev ./dist \
131
+ --kv=KV \
132
+ --d1=DB=database-id \
133
+ --r2=BUCKET \
134
+ --binding=API_KEY=secret123
135
+
136
+ # Durable Objects (2 terminals)
137
+ cd do-worker && npx wrangler dev
138
+ cd pages-project && npx wrangler pages dev ./dist \
139
+ --do COUNTER=CounterClass@do-worker
140
+ ```
141
+
142
+ ## Deployment
143
+
144
+ ```bash
145
+ # Git push (auto-deploys)
146
+ git push origin main
147
+
148
+ # CLI
149
+ npx wrangler pages deploy ./dist
150
+ npx wrangler pages deploy ./dist --branch preview
151
+
152
+ # Download config from dashboard
153
+ npx wrangler pages download config my-project-name
154
+ ```
155
+
156
+ ## See Also
157
+
158
+ - [README.md](./README.md) - Overview
159
+ - [api.md](./api.md) - EventContext, bindings
@@ -0,0 +1,151 @@
1
+ # Gotchas & Debugging
2
+
3
+ ## Common Issues
4
+
5
+ ### Functions Not Invoking
6
+
7
+ All requests serve static, functions never run.
8
+
9
+ **Fix:**
10
+ - `/functions` in correct location (project root)
11
+ - Check `pages_build_output_dir` in wrangler.json
12
+ - Files have `.js` or `.ts` extension
13
+ - `_routes.json` not excluding paths
14
+
15
+ ### Binding Not Available
16
+
17
+ `context.env.MY_BINDING is undefined`
18
+
19
+ **Fix:**
20
+ - Binding in wrangler.json or dashboard
21
+ - Name matches exactly (case-sensitive)
22
+ - Local dev: pass flags OR configure wrangler.json
23
+ - Redeploy after changes
24
+
25
+ ### TypeScript Errors
26
+
27
+ Type errors for `context.env`
28
+
29
+ **Fix:**
30
+ ```typescript
31
+ interface Env { MY_BINDING: KVNamespace; }
32
+
33
+ export const onRequest: PagesFunction<Env> = async (context) => {
34
+ // context.env.MY_BINDING now typed
35
+ };
36
+ ```
37
+
38
+ ### Middleware Not Running
39
+
40
+ `_middleware.js` not executing
41
+
42
+ **Fix:**
43
+ - Named exactly `_middleware.js`
44
+ - In correct directory for route scope
45
+ - `onRequest` or method handler exported
46
+ - Use `context.next()` to pass control
47
+
48
+ ### Environment Variables Missing
49
+
50
+ `context.env.VAR_NAME is undefined`
51
+
52
+ **Fix:**
53
+ - `vars` in wrangler.json
54
+ - Secrets: `.dev.vars` locally, dashboard/wrangler.json for prod
55
+ - Redeploy after changes
56
+
57
+ ## Debugging
58
+
59
+ ### Console Logging
60
+
61
+ ```typescript
62
+ export async function onRequest(context) {
63
+ console.log('Request:', context.request.method, context.request.url);
64
+ console.log('Headers:', Object.fromEntries(context.request.headers));
65
+
66
+ const response = await context.next();
67
+ console.log('Response status:', response.status);
68
+ return response;
69
+ }
70
+ ```
71
+
72
+ ### Wrangler Tail
73
+
74
+ ```bash
75
+ # Stream real-time logs
76
+ npx wrangler pages deployment tail
77
+
78
+ # Filter
79
+ npx wrangler pages deployment tail --status error
80
+ ```
81
+
82
+ ### Source Maps
83
+
84
+ ```jsonc
85
+ // wrangler.json
86
+ { "upload_source_maps": true }
87
+ ```
88
+
89
+ ## Limits
90
+
91
+ - **CPU:** 10ms (Free), 50ms (Paid)
92
+ - **Memory:** 128 MB
93
+ - **Script size:** 10 MB compressed
94
+ - **Env vars:** 5 KB per var, 64 max
95
+ - **Requests:** 100k free/day, $0.50/million after
96
+
97
+ ## Best Practices
98
+
99
+ **Performance:**
100
+ - Minimize deps for cold starts
101
+ - KV for infrequent reads, D1 for relational, R2 for large files
102
+ - Set `Cache-Control` headers
103
+ - Use prepared statements, batch operations
104
+ - Handle errors gracefully
105
+
106
+ **Security:**
107
+ - Never commit secrets
108
+ - Use secrets (encrypted) not vars for sensitive data
109
+ - Validate all input
110
+ - Sanitize before DB ops
111
+ - Implement auth middleware
112
+ - Set appropriate CORS headers
113
+ - Rate limit per-IP
114
+
115
+ ## Migration
116
+
117
+ ### From Workers
118
+
119
+ ```typescript
120
+ // Worker
121
+ export default {
122
+ fetch(request, env) { }
123
+ }
124
+
125
+ // Pages Function
126
+ export function onRequest(context) {
127
+ const { request, env } = context;
128
+ }
129
+ ```
130
+
131
+ In `_worker.js`: `return env.ASSETS.fetch(request)` for static assets.
132
+
133
+ ### From Other Platforms
134
+
135
+ - `/functions/api/users.js` → `/api/users`
136
+ - Dynamic routes: `[param]` not `:param`
137
+ - Replace deps with Workers APIs or `nodejs_compat` flag
138
+
139
+ ## Resources
140
+
141
+ - [Docs](https://developers.cloudflare.com/pages/functions/)
142
+ - [Workers APIs](https://developers.cloudflare.com/workers/runtime-apis/)
143
+ - [Examples](https://github.com/cloudflare/pages-example-projects)
144
+ - [Discord](https://discord.gg/cloudflaredev)
145
+
146
+ ## See Also
147
+
148
+ - [README.md](./README.md) - Overview
149
+ - [configuration.md](./configuration.md) - wrangler.json
150
+ - [api.md](./api.md) - EventContext, bindings
151
+ - [patterns.md](./patterns.md) - Common patterns