memory-journal-mcp 7.7.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. package/README.md +126 -56
  2. package/dist/chunk-6OHRCNYW.js +3231 -0
  3. package/dist/chunk-JFMITANR.js +5168 -0
  4. package/dist/{chunk-QCQPAF4I.js → chunk-MWNLAEHR.js} +301 -4321
  5. package/dist/{chunk-ARLYSFSI.js → chunk-UHSO65A4.js} +4242 -6092
  6. package/dist/cli.js +21 -3
  7. package/dist/index.d.ts +16 -13
  8. package/dist/index.js +4 -2
  9. package/dist/resources-IJVKDFGS.js +2 -0
  10. package/dist/tools-44DGXE3V.js +2 -0
  11. package/dist/worker-script.js +201 -20
  12. package/package.json +7 -4
  13. package/skills/README.md +62 -25
  14. package/skills/adversarial-performance/SKILL.md +139 -0
  15. package/skills/adversarial-performance/references/audit-categories.md +462 -0
  16. package/skills/adversarial-performance/references/copilot-performance-prompts.md +44 -0
  17. package/skills/adversarial-performance/references/copilot-usage.md +16 -0
  18. package/skills/adversarial-performance/references/feedback-loop.md +177 -0
  19. package/skills/adversarial-performance/references/multi-pass-performance-protocol.md +398 -0
  20. package/skills/adversarial-planner/SKILL.md +23 -54
  21. package/skills/adversarial-planner/references/copilot-integration.md +25 -40
  22. package/skills/adversarial-planner/references/copilot-usage.md +16 -0
  23. package/skills/adversarial-planner/references/multi-pass-protocol.md +4 -0
  24. package/skills/adversarial-security/SKILL.md +149 -0
  25. package/skills/adversarial-security/references/adversarial-base-protocol.md +44 -0
  26. package/skills/adversarial-security/references/audit-categories.md +723 -0
  27. package/skills/adversarial-security/references/copilot-security-prompts.md +142 -0
  28. package/skills/adversarial-security/references/copilot-usage.md +16 -0
  29. package/skills/adversarial-security/references/feedback-loop.md +206 -0
  30. package/skills/adversarial-security/references/journal-opt-out.md +7 -0
  31. package/skills/adversarial-security/references/multi-pass-security-protocol.md +403 -0
  32. package/skills/adversarial-skill-audit/SKILL.md +118 -0
  33. package/skills/adversarial-skill-audit/references/audit-categories.md +308 -0
  34. package/skills/adversarial-skill-audit/references/copilot-skill-prompts.md +68 -0
  35. package/skills/adversarial-skill-audit/references/copilot-usage.md +16 -0
  36. package/skills/adversarial-skill-audit/references/feedback-loop.md +155 -0
  37. package/skills/adversarial-skill-audit/references/multi-pass-skill-protocol.md +367 -0
  38. package/skills/adversarial-skill-audit/scripts/check-skills.ps1 +48 -0
  39. package/skills/adversarial-skill-audit/scripts/run-copilot.ps1 +52 -0
  40. package/skills/adversarial-workflow-audit/SKILL.md +82 -0
  41. package/skills/adversarial-workflow-audit/references/audit-categories.md +28 -0
  42. package/skills/adversarial-workflow-audit/references/copilot-usage.md +16 -0
  43. package/skills/adversarial-workflow-audit/scripts/check-workflows.ps1 +24 -0
  44. package/skills/agents-sdk/SKILL.md +220 -0
  45. package/skills/agents-sdk/references/callable.md +92 -0
  46. package/skills/agents-sdk/references/codemode.md +209 -0
  47. package/skills/agents-sdk/references/email.md +144 -0
  48. package/skills/agents-sdk/references/mcp/SKILL.md +65 -0
  49. package/skills/agents-sdk/references/mcp/code-mode-reference.md +245 -0
  50. package/skills/agents-sdk/references/mcp/oauth-reference.md +359 -0
  51. package/skills/agents-sdk/references/mcp/references/architecture-reference.md +208 -0
  52. package/skills/agents-sdk/references/mcp/references/cloudflare-quickstart.md +156 -0
  53. package/skills/agents-sdk/references/mcp/references/error-handling.md +343 -0
  54. package/skills/agents-sdk/references/mcp/references/http-security.md +164 -0
  55. package/skills/agents-sdk/references/mcp/references/implementation-guide.md +507 -0
  56. package/skills/agents-sdk/references/mcp/references/testing-reference.md +171 -0
  57. package/skills/agents-sdk/references/mcp.md +157 -0
  58. package/skills/agents-sdk/references/state-scheduling.md +164 -0
  59. package/skills/agents-sdk/references/streaming-chat.md +168 -0
  60. package/skills/agents-sdk/references/workflows.md +136 -0
  61. package/skills/auth-identity/SKILL.md +48 -0
  62. package/skills/autonomous-dev/SKILL.md +46 -23
  63. package/skills/autonomous-dev/references/workflow_orchestration.md +22 -0
  64. package/skills/aws/SKILL.md +39 -0
  65. package/skills/azure/SKILL.md +38 -0
  66. package/skills/bin/sync.js +7 -1
  67. package/skills/biome/SKILL.md +59 -0
  68. package/skills/bun/SKILL.md +8 -2
  69. package/skills/cloudflare/SKILL.md +37 -0
  70. package/skills/cloudflare/references/agents-sdk/README.md +95 -0
  71. package/skills/cloudflare/references/agents-sdk/api.md +195 -0
  72. package/skills/cloudflare/references/agents-sdk/configuration.md +178 -0
  73. package/skills/cloudflare/references/agents-sdk/gotchas.md +173 -0
  74. package/skills/cloudflare/references/agents-sdk/patterns.md +215 -0
  75. package/skills/cloudflare/references/ai-gateway/README.md +176 -0
  76. package/skills/cloudflare/references/ai-gateway/configuration.md +117 -0
  77. package/skills/cloudflare/references/ai-gateway/dynamic-routing.md +88 -0
  78. package/skills/cloudflare/references/ai-gateway/features.md +96 -0
  79. package/skills/cloudflare/references/ai-gateway/sdk-integration.md +110 -0
  80. package/skills/cloudflare/references/ai-gateway/troubleshooting.md +90 -0
  81. package/skills/cloudflare/references/ai-search/README.md +145 -0
  82. package/skills/cloudflare/references/ai-search/api.md +87 -0
  83. package/skills/cloudflare/references/ai-search/configuration.md +91 -0
  84. package/skills/cloudflare/references/ai-search/gotchas.md +92 -0
  85. package/skills/cloudflare/references/ai-search/patterns.md +87 -0
  86. package/skills/cloudflare/references/analytics-engine/README.md +96 -0
  87. package/skills/cloudflare/references/analytics-engine/api.md +112 -0
  88. package/skills/cloudflare/references/analytics-engine/configuration.md +107 -0
  89. package/skills/cloudflare/references/analytics-engine/gotchas.md +87 -0
  90. package/skills/cloudflare/references/analytics-engine/patterns.md +83 -0
  91. package/skills/cloudflare/references/api/README.md +66 -0
  92. package/skills/cloudflare/references/api/api.md +205 -0
  93. package/skills/cloudflare/references/api/configuration.md +158 -0
  94. package/skills/cloudflare/references/api/gotchas.md +231 -0
  95. package/skills/cloudflare/references/api/patterns.md +208 -0
  96. package/skills/cloudflare/references/api-shield/README.md +44 -0
  97. package/skills/cloudflare/references/api-shield/api.md +153 -0
  98. package/skills/cloudflare/references/api-shield/configuration.md +210 -0
  99. package/skills/cloudflare/references/api-shield/gotchas.md +132 -0
  100. package/skills/cloudflare/references/api-shield/patterns.md +185 -0
  101. package/skills/cloudflare/references/argo-smart-routing/README.md +96 -0
  102. package/skills/cloudflare/references/argo-smart-routing/api.md +253 -0
  103. package/skills/cloudflare/references/argo-smart-routing/configuration.md +205 -0
  104. package/skills/cloudflare/references/argo-smart-routing/gotchas.md +115 -0
  105. package/skills/cloudflare/references/argo-smart-routing/patterns.md +107 -0
  106. package/skills/cloudflare/references/bindings/README.md +127 -0
  107. package/skills/cloudflare/references/bindings/api.md +214 -0
  108. package/skills/cloudflare/references/bindings/configuration.md +200 -0
  109. package/skills/cloudflare/references/bindings/gotchas.md +210 -0
  110. package/skills/cloudflare/references/bindings/patterns.md +205 -0
  111. package/skills/cloudflare/references/bot-management/README.md +95 -0
  112. package/skills/cloudflare/references/bot-management/api.md +175 -0
  113. package/skills/cloudflare/references/bot-management/configuration.md +175 -0
  114. package/skills/cloudflare/references/bot-management/gotchas.md +116 -0
  115. package/skills/cloudflare/references/bot-management/patterns.md +181 -0
  116. package/skills/cloudflare/references/browser-rendering/README.md +84 -0
  117. package/skills/cloudflare/references/browser-rendering/api.md +108 -0
  118. package/skills/cloudflare/references/browser-rendering/configuration.md +78 -0
  119. package/skills/cloudflare/references/browser-rendering/gotchas.md +91 -0
  120. package/skills/cloudflare/references/browser-rendering/patterns.md +93 -0
  121. package/skills/cloudflare/references/c3/README.md +111 -0
  122. package/skills/cloudflare/references/c3/api.md +71 -0
  123. package/skills/cloudflare/references/c3/configuration.md +85 -0
  124. package/skills/cloudflare/references/c3/gotchas.md +97 -0
  125. package/skills/cloudflare/references/c3/patterns.md +84 -0
  126. package/skills/cloudflare/references/cache-reserve/README.md +150 -0
  127. package/skills/cloudflare/references/cache-reserve/api.md +184 -0
  128. package/skills/cloudflare/references/cache-reserve/configuration.md +170 -0
  129. package/skills/cloudflare/references/cache-reserve/gotchas.md +136 -0
  130. package/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
  131. package/skills/cloudflare/references/containers/README.md +87 -0
  132. package/skills/cloudflare/references/containers/api.md +197 -0
  133. package/skills/cloudflare/references/containers/configuration.md +191 -0
  134. package/skills/cloudflare/references/containers/gotchas.md +182 -0
  135. package/skills/cloudflare/references/containers/patterns.md +204 -0
  136. package/skills/cloudflare/references/cron-triggers/README.md +101 -0
  137. package/skills/cloudflare/references/cron-triggers/api.md +224 -0
  138. package/skills/cloudflare/references/cron-triggers/configuration.md +190 -0
  139. package/skills/cloudflare/references/cron-triggers/gotchas.md +207 -0
  140. package/skills/cloudflare/references/cron-triggers/patterns.md +274 -0
  141. package/skills/cloudflare/references/d1/README.md +137 -0
  142. package/skills/cloudflare/references/d1/api.md +213 -0
  143. package/skills/cloudflare/references/d1/configuration.md +198 -0
  144. package/skills/cloudflare/references/d1/gotchas.md +98 -0
  145. package/skills/cloudflare/references/d1/patterns.md +240 -0
  146. package/skills/cloudflare/references/ddos/README.md +42 -0
  147. package/skills/cloudflare/references/ddos/api.md +158 -0
  148. package/skills/cloudflare/references/ddos/configuration.md +94 -0
  149. package/skills/cloudflare/references/ddos/gotchas.md +114 -0
  150. package/skills/cloudflare/references/ddos/patterns.md +220 -0
  151. package/skills/cloudflare/references/decision-trees.md +95 -0
  152. package/skills/cloudflare/references/do-storage/README.md +79 -0
  153. package/skills/cloudflare/references/do-storage/api.md +107 -0
  154. package/skills/cloudflare/references/do-storage/configuration.md +114 -0
  155. package/skills/cloudflare/references/do-storage/gotchas.md +153 -0
  156. package/skills/cloudflare/references/do-storage/patterns.md +210 -0
  157. package/skills/cloudflare/references/do-storage/testing.md +186 -0
  158. package/skills/cloudflare/references/durable-objects/README.md +194 -0
  159. package/skills/cloudflare/references/durable-objects/api.md +205 -0
  160. package/skills/cloudflare/references/durable-objects/configuration.md +160 -0
  161. package/skills/cloudflare/references/durable-objects/gotchas.md +200 -0
  162. package/skills/cloudflare/references/durable-objects/patterns.md +205 -0
  163. package/skills/cloudflare/references/email-routing/README.md +89 -0
  164. package/skills/cloudflare/references/email-routing/api.md +192 -0
  165. package/skills/cloudflare/references/email-routing/configuration.md +187 -0
  166. package/skills/cloudflare/references/email-routing/gotchas.md +203 -0
  167. package/skills/cloudflare/references/email-routing/patterns.md +241 -0
  168. package/skills/cloudflare/references/email-workers/README.md +153 -0
  169. package/skills/cloudflare/references/email-workers/api.md +227 -0
  170. package/skills/cloudflare/references/email-workers/configuration.md +115 -0
  171. package/skills/cloudflare/references/email-workers/gotchas.md +133 -0
  172. package/skills/cloudflare/references/email-workers/patterns.md +108 -0
  173. package/skills/cloudflare/references/graphql-api/README.md +147 -0
  174. package/skills/cloudflare/references/graphql-api/api.md +175 -0
  175. package/skills/cloudflare/references/graphql-api/configuration.md +151 -0
  176. package/skills/cloudflare/references/graphql-api/gotchas.md +111 -0
  177. package/skills/cloudflare/references/graphql-api/patterns.md +276 -0
  178. package/skills/cloudflare/references/hyperdrive/README.md +84 -0
  179. package/skills/cloudflare/references/hyperdrive/api.md +149 -0
  180. package/skills/cloudflare/references/hyperdrive/configuration.md +166 -0
  181. package/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
  182. package/skills/cloudflare/references/hyperdrive/patterns.md +203 -0
  183. package/skills/cloudflare/references/images/README.md +65 -0
  184. package/skills/cloudflare/references/images/api.md +101 -0
  185. package/skills/cloudflare/references/images/configuration.md +206 -0
  186. package/skills/cloudflare/references/images/gotchas.md +106 -0
  187. package/skills/cloudflare/references/images/patterns.md +126 -0
  188. package/skills/cloudflare/references/kv/README.md +90 -0
  189. package/skills/cloudflare/references/kv/api.md +163 -0
  190. package/skills/cloudflare/references/kv/configuration.md +148 -0
  191. package/skills/cloudflare/references/kv/gotchas.md +133 -0
  192. package/skills/cloudflare/references/kv/patterns.md +195 -0
  193. package/skills/cloudflare/references/miniflare/README.md +113 -0
  194. package/skills/cloudflare/references/miniflare/api.md +204 -0
  195. package/skills/cloudflare/references/miniflare/configuration.md +174 -0
  196. package/skills/cloudflare/references/miniflare/gotchas.md +179 -0
  197. package/skills/cloudflare/references/miniflare/patterns.md +187 -0
  198. package/skills/cloudflare/references/network-interconnect/README.md +104 -0
  199. package/skills/cloudflare/references/network-interconnect/api.md +220 -0
  200. package/skills/cloudflare/references/network-interconnect/configuration.md +123 -0
  201. package/skills/cloudflare/references/network-interconnect/gotchas.md +175 -0
  202. package/skills/cloudflare/references/network-interconnect/patterns.md +174 -0
  203. package/skills/cloudflare/references/observability/README.md +93 -0
  204. package/skills/cloudflare/references/observability/api.md +168 -0
  205. package/skills/cloudflare/references/observability/configuration.md +178 -0
  206. package/skills/cloudflare/references/observability/gotchas.md +125 -0
  207. package/skills/cloudflare/references/observability/patterns.md +105 -0
  208. package/skills/cloudflare/references/pages/README.md +92 -0
  209. package/skills/cloudflare/references/pages/api.md +205 -0
  210. package/skills/cloudflare/references/pages/configuration.md +216 -0
  211. package/skills/cloudflare/references/pages/gotchas.md +218 -0
  212. package/skills/cloudflare/references/pages/patterns.md +215 -0
  213. package/skills/cloudflare/references/pages-functions/README.md +104 -0
  214. package/skills/cloudflare/references/pages-functions/api.md +159 -0
  215. package/skills/cloudflare/references/pages-functions/configuration.md +130 -0
  216. package/skills/cloudflare/references/pages-functions/gotchas.md +102 -0
  217. package/skills/cloudflare/references/pages-functions/patterns.md +148 -0
  218. package/skills/cloudflare/references/pipelines/README.md +109 -0
  219. package/skills/cloudflare/references/pipelines/api.md +214 -0
  220. package/skills/cloudflare/references/pipelines/configuration.md +98 -0
  221. package/skills/cloudflare/references/pipelines/gotchas.md +84 -0
  222. package/skills/cloudflare/references/pipelines/patterns.md +87 -0
  223. package/skills/cloudflare/references/product-index.md +112 -0
  224. package/skills/cloudflare/references/pulumi/README.md +113 -0
  225. package/skills/cloudflare/references/pulumi/api.md +230 -0
  226. package/skills/cloudflare/references/pulumi/configuration.md +213 -0
  227. package/skills/cloudflare/references/pulumi/gotchas.md +205 -0
  228. package/skills/cloudflare/references/pulumi/patterns.md +260 -0
  229. package/skills/cloudflare/references/queues/README.md +99 -0
  230. package/skills/cloudflare/references/queues/api.md +211 -0
  231. package/skills/cloudflare/references/queues/configuration.md +151 -0
  232. package/skills/cloudflare/references/queues/gotchas.md +210 -0
  233. package/skills/cloudflare/references/queues/patterns.md +220 -0
  234. package/skills/cloudflare/references/r2/README.md +97 -0
  235. package/skills/cloudflare/references/r2/api.md +235 -0
  236. package/skills/cloudflare/references/r2/configuration.md +176 -0
  237. package/skills/cloudflare/references/r2/gotchas.md +190 -0
  238. package/skills/cloudflare/references/r2/patterns.md +203 -0
  239. package/skills/cloudflare/references/r2-data-catalog/README.md +157 -0
  240. package/skills/cloudflare/references/r2-data-catalog/api.md +199 -0
  241. package/skills/cloudflare/references/r2-data-catalog/configuration.md +205 -0
  242. package/skills/cloudflare/references/r2-data-catalog/gotchas.md +170 -0
  243. package/skills/cloudflare/references/r2-data-catalog/patterns.md +191 -0
  244. package/skills/cloudflare/references/r2-sql/README.md +138 -0
  245. package/skills/cloudflare/references/r2-sql/SKILL.md.backup +512 -0
  246. package/skills/cloudflare/references/r2-sql/api.md +159 -0
  247. package/skills/cloudflare/references/r2-sql/configuration.md +152 -0
  248. package/skills/cloudflare/references/r2-sql/gotchas.md +228 -0
  249. package/skills/cloudflare/references/r2-sql/patterns.md +230 -0
  250. package/skills/cloudflare/references/realtime-sfu/README.md +66 -0
  251. package/skills/cloudflare/references/realtime-sfu/api.md +164 -0
  252. package/skills/cloudflare/references/realtime-sfu/configuration.md +141 -0
  253. package/skills/cloudflare/references/realtime-sfu/gotchas.md +138 -0
  254. package/skills/cloudflare/references/realtime-sfu/patterns.md +187 -0
  255. package/skills/cloudflare/references/realtimekit/README.md +118 -0
  256. package/skills/cloudflare/references/realtimekit/api.md +234 -0
  257. package/skills/cloudflare/references/realtimekit/configuration.md +226 -0
  258. package/skills/cloudflare/references/realtimekit/gotchas.md +206 -0
  259. package/skills/cloudflare/references/realtimekit/patterns.md +240 -0
  260. package/skills/cloudflare/references/sandbox/README.md +104 -0
  261. package/skills/cloudflare/references/sandbox/api.md +200 -0
  262. package/skills/cloudflare/references/sandbox/configuration.md +154 -0
  263. package/skills/cloudflare/references/sandbox/gotchas.md +201 -0
  264. package/skills/cloudflare/references/sandbox/patterns.md +195 -0
  265. package/skills/cloudflare/references/secrets-store/README.md +77 -0
  266. package/skills/cloudflare/references/secrets-store/api.md +199 -0
  267. package/skills/cloudflare/references/secrets-store/configuration.md +187 -0
  268. package/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
  269. package/skills/cloudflare/references/secrets-store/patterns.md +218 -0
  270. package/skills/cloudflare/references/smart-placement/README.md +143 -0
  271. package/skills/cloudflare/references/smart-placement/api.md +192 -0
  272. package/skills/cloudflare/references/smart-placement/configuration.md +202 -0
  273. package/skills/cloudflare/references/smart-placement/gotchas.md +180 -0
  274. package/skills/cloudflare/references/smart-placement/patterns.md +190 -0
  275. package/skills/cloudflare/references/snippets/README.md +74 -0
  276. package/skills/cloudflare/references/snippets/api.md +214 -0
  277. package/skills/cloudflare/references/snippets/configuration.md +239 -0
  278. package/skills/cloudflare/references/snippets/gotchas.md +104 -0
  279. package/skills/cloudflare/references/snippets/patterns.md +135 -0
  280. package/skills/cloudflare/references/spectrum/README.md +52 -0
  281. package/skills/cloudflare/references/spectrum/api.md +184 -0
  282. package/skills/cloudflare/references/spectrum/configuration.md +203 -0
  283. package/skills/cloudflare/references/spectrum/gotchas.md +155 -0
  284. package/skills/cloudflare/references/spectrum/patterns.md +206 -0
  285. package/skills/cloudflare/references/static-assets/README.md +65 -0
  286. package/skills/cloudflare/references/static-assets/api.md +201 -0
  287. package/skills/cloudflare/references/static-assets/configuration.md +186 -0
  288. package/skills/cloudflare/references/static-assets/gotchas.md +164 -0
  289. package/skills/cloudflare/references/static-assets/patterns.md +189 -0
  290. package/skills/cloudflare/references/stream/README.md +123 -0
  291. package/skills/cloudflare/references/stream/api-live.md +202 -0
  292. package/skills/cloudflare/references/stream/api.md +206 -0
  293. package/skills/cloudflare/references/stream/configuration.md +151 -0
  294. package/skills/cloudflare/references/stream/gotchas.md +139 -0
  295. package/skills/cloudflare/references/stream/patterns.md +217 -0
  296. package/skills/cloudflare/references/tail-workers/README.md +92 -0
  297. package/skills/cloudflare/references/tail-workers/api.md +203 -0
  298. package/skills/cloudflare/references/tail-workers/configuration.md +178 -0
  299. package/skills/cloudflare/references/tail-workers/gotchas.md +206 -0
  300. package/skills/cloudflare/references/tail-workers/patterns.md +190 -0
  301. package/skills/cloudflare/references/terraform/README.md +100 -0
  302. package/skills/cloudflare/references/terraform/api.md +178 -0
  303. package/skills/cloudflare/references/terraform/configuration.md +197 -0
  304. package/skills/cloudflare/references/terraform/gotchas.md +150 -0
  305. package/skills/cloudflare/references/terraform/patterns.md +174 -0
  306. package/skills/cloudflare/references/tunnel/README.md +137 -0
  307. package/skills/cloudflare/references/tunnel/api.md +205 -0
  308. package/skills/cloudflare/references/tunnel/configuration.md +163 -0
  309. package/skills/cloudflare/references/tunnel/gotchas.md +159 -0
  310. package/skills/cloudflare/references/tunnel/networking.md +174 -0
  311. package/skills/cloudflare/references/tunnel/patterns.md +199 -0
  312. package/skills/cloudflare/references/turn/README.md +86 -0
  313. package/skills/cloudflare/references/turn/api.md +236 -0
  314. package/skills/cloudflare/references/turn/configuration.md +181 -0
  315. package/skills/cloudflare/references/turn/gotchas.md +236 -0
  316. package/skills/cloudflare/references/turn/patterns.md +228 -0
  317. package/skills/cloudflare/references/turnstile/README.md +102 -0
  318. package/skills/cloudflare/references/turnstile/api.md +253 -0
  319. package/skills/cloudflare/references/turnstile/configuration.md +242 -0
  320. package/skills/cloudflare/references/turnstile/gotchas.md +253 -0
  321. package/skills/cloudflare/references/turnstile/patterns.md +195 -0
  322. package/skills/cloudflare/references/vectorize/README.md +133 -0
  323. package/skills/cloudflare/references/vectorize/api.md +89 -0
  324. package/skills/cloudflare/references/vectorize/configuration.md +91 -0
  325. package/skills/cloudflare/references/vectorize/gotchas.md +83 -0
  326. package/skills/cloudflare/references/vectorize/patterns.md +92 -0
  327. package/skills/cloudflare/references/waf/README.md +125 -0
  328. package/skills/cloudflare/references/waf/api.md +203 -0
  329. package/skills/cloudflare/references/waf/configuration.md +215 -0
  330. package/skills/cloudflare/references/waf/gotchas.md +208 -0
  331. package/skills/cloudflare/references/waf/patterns.md +236 -0
  332. package/skills/cloudflare/references/web-analytics/README.md +149 -0
  333. package/skills/cloudflare/references/web-analytics/configuration.md +81 -0
  334. package/skills/cloudflare/references/web-analytics/gotchas.md +86 -0
  335. package/skills/cloudflare/references/web-analytics/integration.md +63 -0
  336. package/skills/cloudflare/references/web-analytics/patterns.md +98 -0
  337. package/skills/cloudflare/references/workerd/README.md +85 -0
  338. package/skills/cloudflare/references/workerd/api.md +219 -0
  339. package/skills/cloudflare/references/workerd/configuration.md +200 -0
  340. package/skills/cloudflare/references/workerd/gotchas.md +151 -0
  341. package/skills/cloudflare/references/workerd/patterns.md +205 -0
  342. package/skills/cloudflare/references/workers/README.md +110 -0
  343. package/skills/cloudflare/references/workers/api.md +197 -0
  344. package/skills/cloudflare/references/workers/configuration.md +184 -0
  345. package/skills/cloudflare/references/workers/frameworks.md +200 -0
  346. package/skills/cloudflare/references/workers/gotchas.md +145 -0
  347. package/skills/cloudflare/references/workers/patterns.md +220 -0
  348. package/skills/cloudflare/references/workers-ai/README.md +206 -0
  349. package/skills/cloudflare/references/workers-ai/api.md +115 -0
  350. package/skills/cloudflare/references/workers-ai/configuration.md +98 -0
  351. package/skills/cloudflare/references/workers-ai/gotchas.md +130 -0
  352. package/skills/cloudflare/references/workers-ai/patterns.md +122 -0
  353. package/skills/cloudflare/references/workers-for-platforms/README.md +95 -0
  354. package/skills/cloudflare/references/workers-for-platforms/api.md +212 -0
  355. package/skills/cloudflare/references/workers-for-platforms/configuration.md +178 -0
  356. package/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
  357. package/skills/cloudflare/references/workers-for-platforms/patterns.md +210 -0
  358. package/skills/cloudflare/references/workers-playground/README.md +131 -0
  359. package/skills/cloudflare/references/workers-playground/api.md +101 -0
  360. package/skills/cloudflare/references/workers-playground/configuration.md +169 -0
  361. package/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
  362. package/skills/cloudflare/references/workers-playground/patterns.md +134 -0
  363. package/skills/cloudflare/references/workers-vpc/README.md +130 -0
  364. package/skills/cloudflare/references/workers-vpc/api.md +196 -0
  365. package/skills/cloudflare/references/workers-vpc/configuration.md +151 -0
  366. package/skills/cloudflare/references/workers-vpc/gotchas.md +171 -0
  367. package/skills/cloudflare/references/workers-vpc/patterns.md +235 -0
  368. package/skills/cloudflare/references/workflows/README.md +72 -0
  369. package/skills/cloudflare/references/workflows/api.md +237 -0
  370. package/skills/cloudflare/references/workflows/configuration.md +158 -0
  371. package/skills/cloudflare/references/workflows/gotchas.md +97 -0
  372. package/skills/cloudflare/references/workflows/patterns.md +245 -0
  373. package/skills/cloudflare/references/wrangler/README.md +143 -0
  374. package/skills/cloudflare/references/wrangler/api.md +188 -0
  375. package/skills/cloudflare/references/wrangler/configuration.md +198 -0
  376. package/skills/cloudflare/references/wrangler/gotchas.md +212 -0
  377. package/skills/cloudflare/references/wrangler/patterns.md +211 -0
  378. package/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +131 -0
  379. package/skills/cloudflare/references/zaraz/README.md +114 -0
  380. package/skills/cloudflare/references/zaraz/api.md +118 -0
  381. package/skills/cloudflare/references/zaraz/configuration.md +94 -0
  382. package/skills/cloudflare/references/zaraz/gotchas.md +88 -0
  383. package/skills/cloudflare/references/zaraz/patterns.md +77 -0
  384. package/skills/docker/SKILL.md +7 -101
  385. package/skills/docker/references/advanced-examples.md +71 -0
  386. package/skills/docker/references/templates.md +34 -0
  387. package/skills/docs-marketer/SKILL.md +178 -0
  388. package/skills/docs-marketer/references/audit-categories.md +328 -0
  389. package/skills/docs-marketer/references/copilot-docs-prompts.md +88 -0
  390. package/skills/docs-marketer/references/copilot-usage.md +16 -0
  391. package/skills/docs-marketer/references/feedback-loop.md +155 -0
  392. package/skills/docs-marketer/references/multi-pass-docs-protocol.md +410 -0
  393. package/skills/drizzle-orm/SKILL.md +82 -0
  394. package/skills/durable-objects/SKILL.md +167 -0
  395. package/skills/durable-objects/references/advanced_features.md +29 -0
  396. package/skills/durable-objects/references/rules.md +300 -0
  397. package/skills/durable-objects/references/testing.md +261 -0
  398. package/skills/durable-objects/references/workers.md +336 -0
  399. package/skills/gcp/SKILL.md +37 -0
  400. package/skills/github-actions/SKILL.md +5 -58
  401. package/skills/github-actions/references/templates.md +65 -0
  402. package/skills/github-commander/SKILL.md +13 -21
  403. package/skills/github-commander/workflows/copilot-audit.md +12 -12
  404. package/skills/github-copilot-cli/SKILL.md +21 -26
  405. package/skills/github-repo-setup/SKILL.md +136 -0
  406. package/skills/github-repo-setup/references/community-standards.md +136 -0
  407. package/skills/github-repo-setup/references/github-automation.md +490 -0
  408. package/skills/github-repo-setup/references/inline-templates.md +205 -0
  409. package/skills/github-repo-setup/references/project-config.md +320 -0
  410. package/skills/gitlab/SKILL.md +7 -2
  411. package/skills/gitlab/package-lock.json +389 -389
  412. package/skills/golang/SKILL.md +8 -1
  413. package/skills/graphql/SKILL.md +30 -0
  414. package/skills/hono/SKILL.md +82 -0
  415. package/skills/journal-optimizer/SKILL.md +206 -0
  416. package/skills/journal-optimizer/references/optimizer-scripts.md +169 -0
  417. package/skills/llm-app-engineering/SKILL.md +18 -0
  418. package/skills/monorepo/SKILL.md +56 -0
  419. package/skills/multi-agent-orchestration/SKILL.md +14 -0
  420. package/skills/mysql/SKILL.md +6 -2
  421. package/skills/next-best-practices/SKILL.md +86 -0
  422. package/skills/next-best-practices/references/cache-components-examples.md +234 -0
  423. package/skills/next-best-practices/references/cache-components.md +210 -0
  424. package/skills/next-best-practices/references/upgrade-decision-tree.md +33 -0
  425. package/skills/next-best-practices/references/upgrade.md +43 -0
  426. package/skills/next-cache-components/SKILL.md +441 -0
  427. package/skills/next-upgrade/SKILL.md +43 -0
  428. package/skills/next-upgrade/references/decision-tree.md +33 -0
  429. package/skills/nodejs/SKILL.md +46 -0
  430. package/skills/opentelemetry/SKILL.md +62 -0
  431. package/skills/package.json +39 -4
  432. package/skills/playwright-standard/SKILL.md +6 -11
  433. package/skills/playwright-standard/references/locators.md +7 -0
  434. package/skills/postgres/SKILL.md +6 -1
  435. package/skills/python/SKILL.md +8 -70
  436. package/skills/python/references/advanced-patterns.md +37 -0
  437. package/skills/python/references/config-templates.md +48 -0
  438. package/skills/rag-pipelines/SKILL.md +14 -0
  439. package/skills/redis/SKILL.md +31 -0
  440. package/skills/render/SKILL.md +35 -0
  441. package/skills/rust/SKILL.md +15 -25
  442. package/skills/rust/references/borrow-checker.md +13 -0
  443. package/skills/rust/references/ecosystem.md +11 -0
  444. package/skills/sandbox-sdk/SKILL.md +186 -0
  445. package/skills/sandbox-sdk/references/api-quick-ref.md +113 -0
  446. package/skills/sandbox-sdk/references/examples.md +52 -0
  447. package/skills/shadcn-ui/SKILL.md +22 -57
  448. package/skills/skill-builder/SKILL.md +23 -424
  449. package/skills/skill-builder/references/tutorial.md +457 -0
  450. package/skills/sqlite/SKILL.md +16 -5
  451. package/skills/table.md +59 -0
  452. package/skills/tailwind-css/SKILL.md +11 -60
  453. package/skills/tailwind-css/references/component-patterns.md +52 -0
  454. package/skills/trpc/SKILL.md +56 -0
  455. package/skills/typescript/SKILL.md +30 -433
  456. package/skills/typescript/references/tutorial.md +453 -0
  457. package/skills/vercel-ai-sdk/SKILL.md +48 -0
  458. package/skills/vitest-standard/SKILL.md +5 -11
  459. package/skills/vitest-standard/references/assertions.md +11 -0
  460. package/skills/web-perf/SKILL.md +207 -0
  461. package/skills/workers-best-practices/SKILL.md +120 -0
  462. package/skills/workers-best-practices/references/anti-patterns.md +18 -0
  463. package/skills/workers-best-practices/references/review.md +174 -0
  464. package/skills/workers-best-practices/references/rules.md +485 -0
  465. package/skills/wrangler/SKILL.md +43 -0
  466. package/skills/wrangler/references/cli-commands.md +861 -0
  467. package/skills/zod/SKILL.md +48 -0
  468. package/dist/tools-P4VGG4FH.js +0 -1
  469. package/skills/react-best-practices/AGENTS.md +0 -2883
  470. package/skills/react-best-practices/SKILL.md +0 -138
  471. /package/skills/{react-best-practices → next-best-practices}/README.md +0 -0
  472. /package/skills/{react-best-practices → next-best-practices}/metadata.json +0 -0
  473. /package/skills/{react-best-practices → next-best-practices}/rules/_sections.md +0 -0
  474. /package/skills/{react-best-practices → next-best-practices}/rules/_template.md +0 -0
  475. /package/skills/{react-best-practices → next-best-practices}/rules/advanced-event-handler-refs.md +0 -0
  476. /package/skills/{react-best-practices → next-best-practices}/rules/advanced-init-once.md +0 -0
  477. /package/skills/{react-best-practices → next-best-practices}/rules/advanced-use-latest.md +0 -0
  478. /package/skills/{react-best-practices → next-best-practices}/rules/async-api-routes.md +0 -0
  479. /package/skills/{react-best-practices → next-best-practices}/rules/async-defer-await.md +0 -0
  480. /package/skills/{react-best-practices → next-best-practices}/rules/async-dependencies.md +0 -0
  481. /package/skills/{react-best-practices → next-best-practices}/rules/async-parallel.md +0 -0
  482. /package/skills/{react-best-practices → next-best-practices}/rules/async-suspense-boundaries.md +0 -0
  483. /package/skills/{react-best-practices → next-best-practices}/rules/bundle-barrel-imports.md +0 -0
  484. /package/skills/{react-best-practices → next-best-practices}/rules/bundle-conditional.md +0 -0
  485. /package/skills/{react-best-practices → next-best-practices}/rules/bundle-defer-third-party.md +0 -0
  486. /package/skills/{react-best-practices → next-best-practices}/rules/bundle-dynamic-imports.md +0 -0
  487. /package/skills/{react-best-practices → next-best-practices}/rules/bundle-preload.md +0 -0
  488. /package/skills/{react-best-practices → next-best-practices}/rules/client-event-listeners.md +0 -0
  489. /package/skills/{react-best-practices → next-best-practices}/rules/client-localstorage-schema.md +0 -0
  490. /package/skills/{react-best-practices → next-best-practices}/rules/client-passive-event-listeners.md +0 -0
  491. /package/skills/{react-best-practices → next-best-practices}/rules/client-swr-dedup.md +0 -0
  492. /package/skills/{react-best-practices → next-best-practices}/rules/js-batch-dom-css.md +0 -0
  493. /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-function-results.md +0 -0
  494. /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-property-access.md +0 -0
  495. /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-storage.md +0 -0
  496. /package/skills/{react-best-practices → next-best-practices}/rules/js-combine-iterations.md +0 -0
  497. /package/skills/{react-best-practices → next-best-practices}/rules/js-early-exit.md +0 -0
  498. /package/skills/{react-best-practices → next-best-practices}/rules/js-hoist-regexp.md +0 -0
  499. /package/skills/{react-best-practices → next-best-practices}/rules/js-index-maps.md +0 -0
  500. /package/skills/{react-best-practices → next-best-practices}/rules/js-length-check-first.md +0 -0
  501. /package/skills/{react-best-practices → next-best-practices}/rules/js-min-max-loop.md +0 -0
  502. /package/skills/{react-best-practices → next-best-practices}/rules/js-set-map-lookups.md +0 -0
  503. /package/skills/{react-best-practices → next-best-practices}/rules/js-tosorted-immutable.md +0 -0
  504. /package/skills/{react-best-practices → next-best-practices}/rules/rendering-activity.md +0 -0
  505. /package/skills/{react-best-practices → next-best-practices}/rules/rendering-animate-svg-wrapper.md +0 -0
  506. /package/skills/{react-best-practices → next-best-practices}/rules/rendering-conditional-render.md +0 -0
  507. /package/skills/{react-best-practices → next-best-practices}/rules/rendering-content-visibility.md +0 -0
  508. /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hoist-jsx.md +0 -0
  509. /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hydration-no-flicker.md +0 -0
  510. /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hydration-suppress-warning.md +0 -0
  511. /package/skills/{react-best-practices → next-best-practices}/rules/rendering-svg-precision.md +0 -0
  512. /package/skills/{react-best-practices → next-best-practices}/rules/rendering-usetransition-loading.md +0 -0
  513. /package/skills/{react-best-practices → next-best-practices}/rules/rerender-defer-reads.md +0 -0
  514. /package/skills/{react-best-practices → next-best-practices}/rules/rerender-dependencies.md +0 -0
  515. /package/skills/{react-best-practices → next-best-practices}/rules/rerender-derived-state-no-effect.md +0 -0
  516. /package/skills/{react-best-practices → next-best-practices}/rules/rerender-derived-state.md +0 -0
  517. /package/skills/{react-best-practices → next-best-practices}/rules/rerender-functional-setstate.md +0 -0
  518. /package/skills/{react-best-practices → next-best-practices}/rules/rerender-lazy-state-init.md +0 -0
  519. /package/skills/{react-best-practices → next-best-practices}/rules/rerender-memo-with-default-value.md +0 -0
  520. /package/skills/{react-best-practices → next-best-practices}/rules/rerender-memo.md +0 -0
  521. /package/skills/{react-best-practices → next-best-practices}/rules/rerender-move-effect-to-event.md +0 -0
  522. /package/skills/{react-best-practices → next-best-practices}/rules/rerender-simple-expression-in-memo.md +0 -0
  523. /package/skills/{react-best-practices → next-best-practices}/rules/rerender-transitions.md +0 -0
  524. /package/skills/{react-best-practices → next-best-practices}/rules/rerender-use-ref-transient-values.md +0 -0
  525. /package/skills/{react-best-practices → next-best-practices}/rules/server-after-nonblocking.md +0 -0
  526. /package/skills/{react-best-practices → next-best-practices}/rules/server-auth-actions.md +0 -0
  527. /package/skills/{react-best-practices → next-best-practices}/rules/server-cache-lru.md +0 -0
  528. /package/skills/{react-best-practices → next-best-practices}/rules/server-cache-react.md +0 -0
  529. /package/skills/{react-best-practices → next-best-practices}/rules/server-dedup-props.md +0 -0
  530. /package/skills/{react-best-practices → next-best-practices}/rules/server-parallel-fetching.md +0 -0
  531. /package/skills/{react-best-practices → next-best-practices}/rules/server-serialization.md +0 -0
@@ -0,0 +1,300 @@
1
+ # Durable Objects Rules & Best Practices
2
+
3
+ ## Design & Sharding
4
+
5
+ ### Model Around Coordination Atoms
6
+
7
+ Create one DO per logical unit needing coordination: chat room, game session, document, user, tenant.
8
+
9
+ ```typescript
10
+ // ✅ Good: One DO per chat room
11
+ const stub = env.CHAT_ROOM.getByName(roomId)
12
+
13
+ // ❌ Bad: Single global DO
14
+ const stub = env.CHAT_ROOM.getByName('global') // Bottleneck!
15
+ ```
16
+
17
+ ### Parent-Child Relationships
18
+
19
+ For hierarchical data, create separate child DOs. Parent tracks references, children handle own state.
20
+
21
+ ```typescript
22
+ // Parent: GameServer tracks match references
23
+ // Children: GameMatch handles individual match state
24
+ async createMatch(name: string): Promise<string> {
25
+ const matchId = crypto.randomUUID();
26
+ this.ctx.storage.sql.exec(
27
+ "INSERT INTO matches (id, name) VALUES (?, ?)",
28
+ matchId, name
29
+ );
30
+ const child = this.env.GAME_MATCH.getByName(matchId);
31
+ await child.init(matchId, name);
32
+ return matchId;
33
+ }
34
+ ```
35
+
36
+ ### Location Hints
37
+
38
+ Influence DO creation location for latency-sensitive apps:
39
+
40
+ ```typescript
41
+ const id = env.GAME.idFromName(gameId, { locationHint: 'wnam' })
42
+ ```
43
+
44
+ Available hints: `wnam`, `enam`, `sam`, `weur`, `eeur`, `apac`, `oc`, `afr`, `me`.
45
+
46
+ ## Storage
47
+
48
+ ### SQLite (Recommended)
49
+
50
+ Configure in wrangler:
51
+
52
+ ```jsonc
53
+ { "migrations": [{ "tag": "v1", "new_sqlite_classes": ["MyDO"] }] }
54
+ ```
55
+
56
+ SQL API is synchronous:
57
+
58
+ ```typescript
59
+ // Write
60
+ this.ctx.storage.sql.exec('INSERT INTO items (name, value) VALUES (?, ?)', name, value)
61
+
62
+ // Read
63
+ const rows = this.ctx.storage.sql
64
+ .exec<{ id: number; name: string }>('SELECT * FROM items WHERE name = ?', name)
65
+ .toArray()
66
+
67
+ // Single row
68
+ const row = this.ctx.storage.sql
69
+ .exec<{ count: number }>('SELECT COUNT(*) as count FROM items')
70
+ .one()
71
+ ```
72
+
73
+ ### Migrations
74
+
75
+ **Note:** `PRAGMA user_version` is **not supported** in Durable Objects SQLite storage. Use a `_sql_schema_migrations` table instead:
76
+
77
+ ```typescript
78
+ constructor(ctx: DurableObjectState, env: Env) {
79
+ super(ctx, env);
80
+ ctx.blockConcurrencyWhile(async () => this.migrate());
81
+ }
82
+
83
+ private migrate() {
84
+ this.ctx.storage.sql.exec(`
85
+ CREATE TABLE IF NOT EXISTS _sql_schema_migrations (
86
+ id INTEGER PRIMARY KEY,
87
+ applied_at TEXT NOT NULL DEFAULT (datetime('now'))
88
+ )
89
+ `);
90
+
91
+ const currentVersion = this.ctx.storage.sql
92
+ .exec<{ version: number }>("SELECT COALESCE(MAX(id), 0) as version FROM _sql_schema_migrations")
93
+ .one().version;
94
+
95
+ if (currentVersion < 1) {
96
+ this.ctx.storage.sql.exec(`
97
+ CREATE TABLE IF NOT EXISTS items (id INTEGER PRIMARY KEY, data TEXT);
98
+ CREATE INDEX IF NOT EXISTS idx_items_data ON items(data);
99
+ INSERT INTO _sql_schema_migrations (id) VALUES (1);
100
+ `);
101
+ }
102
+ if (currentVersion < 2) {
103
+ this.ctx.storage.sql.exec(`
104
+ ALTER TABLE items ADD COLUMN created_at INTEGER;
105
+ INSERT INTO _sql_schema_migrations (id) VALUES (2);
106
+ `);
107
+ }
108
+ }
109
+ ```
110
+
111
+ For production apps, consider [`durable-utils`](https://github.com/lambrospetrou/durable-utils#sqlite-schema-migrations) — provides a `SQLSchemaMigrations` class that tracks executed migrations both in memory and in storage. Also see [`@cloudflare/actors` storage utilities](https://github.com/cloudflare/actors/blob/main/packages/storage/src/sql-schema-migrations.ts) — a reference implementation of the same pattern used by the Cloudflare Actors framework.
112
+
113
+ ### State Types
114
+
115
+ | Type | Speed | Persistence | Use Case |
116
+ | ----------------- | -------- | ----------------- | --------------------------- |
117
+ | Class properties | Fastest | Lost on eviction | Caching, active connections |
118
+ | SQLite storage | Fast | Durable | Primary data |
119
+ | External (R2, D1) | Variable | Durable, cross-DO | Large files, shared data |
120
+
121
+ **Rule**: Always persist critical state to SQLite first, then update in-memory cache.
122
+
123
+ ## Concurrency
124
+
125
+ ### Input/Output Gates
126
+
127
+ Storage operations automatically block other requests (input gates). Responses wait for writes (output gates).
128
+
129
+ ```typescript
130
+ async increment(): Promise<number> {
131
+ // Safe: input gates block interleaving during storage ops
132
+ const val = (await this.ctx.storage.get<number>("count")) ?? 0;
133
+ await this.ctx.storage.put("count", val + 1);
134
+ return val + 1;
135
+ }
136
+ ```
137
+
138
+ ### Write Coalescing
139
+
140
+ Multiple writes without `await` between them are batched atomically:
141
+
142
+ ```typescript
143
+ // ✅ Good: All three writes commit atomically
144
+ this.ctx.storage.sql.exec('UPDATE accounts SET balance = balance - ? WHERE id = ?', amount, fromId)
145
+ this.ctx.storage.sql.exec('UPDATE accounts SET balance = balance + ? WHERE id = ?', amount, toId)
146
+ this.ctx.storage.sql.exec(
147
+ 'INSERT INTO transfers (from_id, to_id, amount) VALUES (?, ?, ?)',
148
+ fromId,
149
+ toId,
150
+ amount
151
+ )
152
+
153
+ // ❌ Bad: await breaks coalescing
154
+ await this.ctx.storage.put('key1', val1)
155
+ await this.ctx.storage.put('key2', val2) // Separate transaction!
156
+ ```
157
+
158
+ ### Race Conditions with External I/O
159
+
160
+ `fetch()` and other non-storage I/O allows interleaving:
161
+
162
+ ```typescript
163
+ // ⚠️ Race condition possible
164
+ async processItem(id: string) {
165
+ const item = await this.ctx.storage.get<Item>(`item:${id}`);
166
+ if (item?.status === "pending") {
167
+ await fetch("https://api.example.com/process"); // Other requests can run here!
168
+ await this.ctx.storage.put(`item:${id}`, { status: "completed" });
169
+ }
170
+ }
171
+ ```
172
+
173
+ **Solution**: Use optimistic locking (version numbers) or `transaction()`.
174
+
175
+ ### blockConcurrencyWhile()
176
+
177
+ Blocks ALL concurrency. Use sparingly - only for initialization:
178
+
179
+ ```typescript
180
+ // ✅ Good: One-time init
181
+ constructor(ctx: DurableObjectState, env: Env) {
182
+ super(ctx, env);
183
+ ctx.blockConcurrencyWhile(async () => this.migrate());
184
+ }
185
+
186
+ // ❌ Bad: On every request (kills throughput)
187
+ async handleRequest() {
188
+ await this.ctx.blockConcurrencyWhile(async () => {
189
+ // ~5ms = max 200 req/sec
190
+ });
191
+ }
192
+ ```
193
+
194
+ **Never** hold across external I/O (fetch, R2, KV).
195
+
196
+ ## RPC Methods
197
+
198
+ Use RPC (compatibility date >= 2024-04-03) instead of fetch() handler:
199
+
200
+ ```typescript
201
+ export class ChatRoom extends DurableObject<Env> {
202
+ async sendMessage(userId: string, content: string): Promise<Message> {
203
+ // Public methods are RPC endpoints
204
+ const result = this.ctx.storage.sql.exec<{ id: number }>(
205
+ 'INSERT INTO messages (user_id, content) VALUES (?, ?) RETURNING id',
206
+ userId,
207
+ content
208
+ )
209
+ return { id: result.one().id, userId, content }
210
+ }
211
+ }
212
+
213
+ // Caller
214
+ const stub = env.CHAT_ROOM.getByName(roomId)
215
+ const msg = await stub.sendMessage('user-123', 'Hello!') // Typed!
216
+ ```
217
+
218
+ ### Explicit init() Method
219
+
220
+ DOs don't know their own ID. Pass identity explicitly:
221
+
222
+ ```typescript
223
+ async init(entityId: string, metadata: Metadata): Promise<void> {
224
+ await this.ctx.storage.put("entityId", entityId);
225
+ await this.ctx.storage.put("metadata", metadata);
226
+ }
227
+ ```
228
+
229
+ ## Alarms
230
+
231
+ One alarm per DO. `setAlarm()` replaces existing.
232
+
233
+ ```typescript
234
+ // Schedule
235
+ await this.ctx.storage.setAlarm(Date.now() + 60_000);
236
+
237
+ // Handler
238
+ async alarm(): Promise<void> {
239
+ const tasks = this.ctx.storage.sql.exec<Task>(
240
+ "SELECT * FROM tasks WHERE due_at <= ?", Date.now()
241
+ ).toArray();
242
+
243
+ for (const task of tasks) {
244
+ await this.processTask(task);
245
+ }
246
+
247
+ // Reschedule if more work
248
+ const next = this.ctx.storage.sql.exec<{ due_at: number }>(
249
+ "SELECT MIN(due_at) as due_at FROM tasks WHERE due_at > ?", Date.now()
250
+ ).one();
251
+ if (next?.due_at) {
252
+ await this.ctx.storage.setAlarm(next.due_at);
253
+ }
254
+ }
255
+
256
+ // Get/Delete
257
+ const alarm = await this.ctx.storage.getAlarm();
258
+ await this.ctx.storage.deleteAlarm();
259
+ ```
260
+
261
+ **Retry**: Alarms auto-retry on failure. Use idempotent handlers.
262
+
263
+ ## WebSockets (Hibernation API)
264
+
265
+ ```typescript
266
+ async fetch(request: Request): Promise<Response> {
267
+ const pair = new WebSocketPair();
268
+ this.ctx.acceptWebSocket(pair[1]);
269
+ return new Response(null, { status: 101, webSocket: pair[0] });
270
+ }
271
+
272
+ async webSocketMessage(ws: WebSocket, message: string | ArrayBuffer) {
273
+ const data = JSON.parse(message as string);
274
+ // Handle message
275
+ ws.send(JSON.stringify({ type: "ack" }));
276
+ }
277
+
278
+ async webSocketClose(ws: WebSocket, code: number, reason: string) {
279
+ // Cleanup
280
+ }
281
+
282
+ // Broadcast
283
+ getWebSockets().forEach(ws => ws.send(JSON.stringify(payload)));
284
+ ```
285
+
286
+ ## Error Handling
287
+
288
+ ```typescript
289
+ async safeOperation(): Promise<Result> {
290
+ try {
291
+ return await this.riskyOperation();
292
+ } catch (error) {
293
+ console.error("Operation failed:", error);
294
+ // Log to external service if needed
295
+ throw error; // Re-throw to signal failure to caller
296
+ }
297
+ }
298
+ ```
299
+
300
+ **Note**: Uncaught exceptions may terminate the DO instance. In-memory state is lost, but SQLite storage persists.
@@ -0,0 +1,261 @@
1
+ # Testing Durable Objects
2
+
3
+ Use `@cloudflare/vitest-pool-workers` to test DOs inside the Workers runtime.
4
+
5
+ ## Setup
6
+
7
+ ### Install Dependencies
8
+
9
+ ```bash
10
+ npm i -D vitest@~3.2.0 @cloudflare/vitest-pool-workers
11
+ ```
12
+
13
+ ### vitest.config.ts
14
+
15
+ ```typescript
16
+ import { defineWorkersConfig } from '@cloudflare/vitest-pool-workers/config'
17
+
18
+ export default defineWorkersConfig({
19
+ test: {
20
+ poolOptions: {
21
+ workers: {
22
+ wrangler: { configPath: './wrangler.toml' },
23
+ },
24
+ },
25
+ },
26
+ })
27
+ ```
28
+
29
+ ### TypeScript Config (test/tsconfig.json)
30
+
31
+ ```jsonc
32
+ {
33
+ "extends": "../tsconfig.json",
34
+ "compilerOptions": {
35
+ "moduleResolution": "bundler",
36
+ "types": ["@cloudflare/vitest-pool-workers"],
37
+ },
38
+ "include": ["./**/*.ts", "../src/worker-configuration.d.ts"],
39
+ }
40
+ ```
41
+
42
+ ### Environment Types (env.d.ts)
43
+
44
+ ```typescript
45
+ declare module 'cloudflare:test' {
46
+ interface ProvidedEnv extends Env {}
47
+ }
48
+ ```
49
+
50
+ ## Unit Tests (Direct DO Access)
51
+
52
+ ```typescript
53
+ import { env } from 'cloudflare:test'
54
+ import { describe, it, expect } from 'vitest'
55
+
56
+ describe('Counter DO', () => {
57
+ it('should increment', async () => {
58
+ const stub = env.COUNTER.getByName('test-counter')
59
+
60
+ expect(await stub.increment()).toBe(1)
61
+ expect(await stub.increment()).toBe(2)
62
+ expect(await stub.getCount()).toBe(2)
63
+ })
64
+
65
+ it('isolates different instances', async () => {
66
+ const stub1 = env.COUNTER.getByName('counter-1')
67
+ const stub2 = env.COUNTER.getByName('counter-2')
68
+
69
+ await stub1.increment()
70
+ await stub1.increment()
71
+ await stub2.increment()
72
+
73
+ expect(await stub1.getCount()).toBe(2)
74
+ expect(await stub2.getCount()).toBe(1)
75
+ })
76
+ })
77
+ ```
78
+
79
+ ## Integration Tests (HTTP via SELF)
80
+
81
+ ```typescript
82
+ import { SELF } from 'cloudflare:test'
83
+ import { describe, it, expect } from 'vitest'
84
+
85
+ describe('Worker HTTP', () => {
86
+ it('should increment via POST', async () => {
87
+ const res = await SELF.fetch('http://example.com?id=test', {
88
+ method: 'POST',
89
+ })
90
+
91
+ expect(res.status).toBe(200)
92
+ const data = await res.json<{ count: number }>()
93
+ expect(data.count).toBe(1)
94
+ })
95
+
96
+ it('should get count via GET', async () => {
97
+ await SELF.fetch('http://example.com?id=get-test', { method: 'POST' })
98
+ await SELF.fetch('http://example.com?id=get-test', { method: 'POST' })
99
+
100
+ const res = await SELF.fetch('http://example.com?id=get-test')
101
+ const data = await res.json<{ count: number }>()
102
+ expect(data.count).toBe(2)
103
+ })
104
+ })
105
+ ```
106
+
107
+ ## Direct Internal Access
108
+
109
+ Use `runInDurableObject()` to access instance internals and storage:
110
+
111
+ ```typescript
112
+ import { env, runInDurableObject } from 'cloudflare:test'
113
+ import { describe, it, expect } from 'vitest'
114
+ import { Counter } from '../src'
115
+
116
+ describe('DO internals', () => {
117
+ it('can verify storage directly', async () => {
118
+ const stub = env.COUNTER.getByName('direct-test')
119
+ await stub.increment()
120
+ await stub.increment()
121
+
122
+ await runInDurableObject(stub, async (instance: Counter, state) => {
123
+ expect(instance).toBeInstanceOf(Counter)
124
+
125
+ const result = state.storage.sql
126
+ .exec<{ value: number }>('SELECT value FROM counters WHERE name = ?', 'default')
127
+ .one()
128
+ expect(result.value).toBe(2)
129
+ })
130
+ })
131
+ })
132
+ ```
133
+
134
+ ## List DO IDs
135
+
136
+ ```typescript
137
+ import { env, listDurableObjectIds } from 'cloudflare:test'
138
+ import { describe, it, expect } from 'vitest'
139
+
140
+ describe('DO listing', () => {
141
+ it('can list all IDs in namespace', async () => {
142
+ const id1 = env.COUNTER.idFromName('list-1')
143
+ const id2 = env.COUNTER.idFromName('list-2')
144
+
145
+ await env.COUNTER.get(id1).increment()
146
+ await env.COUNTER.get(id2).increment()
147
+
148
+ const ids = await listDurableObjectIds(env.COUNTER)
149
+ expect(ids.length).toBe(2)
150
+ expect(ids.some((id) => id.equals(id1))).toBe(true)
151
+ expect(ids.some((id) => id.equals(id2))).toBe(true)
152
+ })
153
+ })
154
+ ```
155
+
156
+ ## Testing Alarms
157
+
158
+ Use `runDurableObjectAlarm()` to trigger alarms immediately:
159
+
160
+ ```typescript
161
+ import { env, runInDurableObject, runDurableObjectAlarm } from 'cloudflare:test'
162
+ import { describe, it, expect } from 'vitest'
163
+
164
+ describe('DO alarms', () => {
165
+ it('can trigger alarms immediately', async () => {
166
+ const stub = env.COUNTER.getByName('alarm-test')
167
+ await stub.increment()
168
+ await stub.increment()
169
+ expect(await stub.getCount()).toBe(2)
170
+
171
+ // Schedule alarm
172
+ await runInDurableObject(stub, async (instance, state) => {
173
+ await state.storage.setAlarm(Date.now() + 60_000)
174
+ })
175
+
176
+ // Execute immediately without waiting
177
+ const ran = await runDurableObjectAlarm(stub)
178
+ expect(ran).toBe(true)
179
+
180
+ // Verify alarm handler ran (if it resets counter)
181
+ expect(await stub.getCount()).toBe(0)
182
+
183
+ // No alarm scheduled now
184
+ const ranAgain = await runDurableObjectAlarm(stub)
185
+ expect(ranAgain).toBe(false)
186
+ })
187
+ })
188
+ ```
189
+
190
+ Example alarm handler:
191
+
192
+ ```typescript
193
+ async alarm(): Promise<void> {
194
+ this.ctx.storage.sql.exec("DELETE FROM counters");
195
+ }
196
+ ```
197
+
198
+ ## Test Isolation
199
+
200
+ Each test gets isolated storage automatically. DOs from one test don't affect others:
201
+
202
+ ```typescript
203
+ describe('Isolation', () => {
204
+ it('first test creates DO', async () => {
205
+ const stub = env.COUNTER.getByName('isolated')
206
+ await stub.increment()
207
+ expect(await stub.getCount()).toBe(1)
208
+ })
209
+
210
+ it('second test has fresh state', async () => {
211
+ const ids = await listDurableObjectIds(env.COUNTER)
212
+ expect(ids.length).toBe(0) // Previous test's DO is gone
213
+
214
+ const stub = env.COUNTER.getByName('isolated')
215
+ expect(await stub.getCount()).toBe(0) // Fresh instance
216
+ })
217
+ })
218
+ ```
219
+
220
+ ## SQLite Storage Testing
221
+
222
+ ```typescript
223
+ describe('SQLite', () => {
224
+ it('can verify SQL storage', async () => {
225
+ const stub = env.COUNTER.getByName('sqlite-test')
226
+ await stub.increment('page-views')
227
+ await stub.increment('page-views')
228
+ await stub.increment('api-calls')
229
+
230
+ await runInDurableObject(stub, async (instance, state) => {
231
+ const rows = state.storage.sql
232
+ .exec<{ name: string; value: number }>('SELECT name, value FROM counters ORDER BY name')
233
+ .toArray()
234
+
235
+ expect(rows).toEqual([
236
+ { name: 'api-calls', value: 1 },
237
+ { name: 'page-views', value: 2 },
238
+ ])
239
+
240
+ expect(state.storage.sql.databaseSize).toBeGreaterThan(0)
241
+ })
242
+ })
243
+ })
244
+ ```
245
+
246
+ ## Running Tests
247
+
248
+ ```bash
249
+ npx vitest # Watch mode
250
+ npx vitest run # Single run
251
+ ```
252
+
253
+ package.json:
254
+
255
+ ```json
256
+ {
257
+ "scripts": {
258
+ "test": "vitest"
259
+ }
260
+ }
261
+ ```