convex 1.34.1 → 1.35.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 (512) hide show
  1. package/CHANGELOG.md +86 -43
  2. package/dist/browser.bundle.js +8 -2
  3. package/dist/browser.bundle.js.map +3 -3
  4. package/dist/cjs/browser/index-node.js +3 -1
  5. package/dist/cjs/browser/index.js +3 -1
  6. package/dist/cjs/browser/index.js.map +2 -2
  7. package/dist/cjs/browser/query_options.js.map +2 -2
  8. package/dist/cjs/cli/aiFiles.js +31 -13
  9. package/dist/cjs/cli/aiFiles.js.map +3 -3
  10. package/dist/cjs/cli/codegen_templates/readme.js +14 -1
  11. package/dist/cjs/cli/codegen_templates/readme.js.map +2 -2
  12. package/dist/cjs/cli/configure.js +21 -24
  13. package/dist/cjs/cli/configure.js.map +2 -2
  14. package/dist/cjs/cli/deploy.js +7 -8
  15. package/dist/cjs/cli/deploy.js.map +2 -2
  16. package/dist/cjs/cli/deploymentCreate.js +225 -40
  17. package/dist/cjs/cli/deploymentCreate.js.map +3 -3
  18. package/dist/cjs/cli/deploymentSelect.js +14 -13
  19. package/dist/cjs/cli/deploymentSelect.js.map +2 -2
  20. package/dist/cjs/cli/dev.js +30 -11
  21. package/dist/cjs/cli/dev.js.map +2 -2
  22. package/dist/cjs/cli/docs.js +1 -1
  23. package/dist/cjs/cli/docs.js.map +2 -2
  24. package/dist/cjs/cli/init.js +1 -1
  25. package/dist/cjs/cli/init.js.map +2 -2
  26. package/dist/cjs/cli/lib/aiFiles/agentsmd.js +14 -10
  27. package/dist/cjs/cli/lib/aiFiles/agentsmd.js.map +2 -2
  28. package/dist/cjs/cli/lib/aiFiles/claudemd.js +14 -10
  29. package/dist/cjs/cli/lib/aiFiles/claudemd.js.map +2 -2
  30. package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js +10 -3
  31. package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
  32. package/dist/cjs/cli/lib/aiFiles/index.js +70 -86
  33. package/dist/cjs/cli/lib/aiFiles/index.js.map +3 -3
  34. package/dist/cjs/cli/lib/aiFiles/skills.js +28 -12
  35. package/dist/cjs/cli/lib/aiFiles/skills.js.map +2 -2
  36. package/dist/cjs/cli/lib/aiFiles/state.js +96 -0
  37. package/dist/cjs/cli/lib/aiFiles/state.js.map +7 -0
  38. package/dist/cjs/cli/lib/aiFiles/status.js +31 -28
  39. package/dist/cjs/cli/lib/aiFiles/status.js.map +2 -2
  40. package/dist/cjs/cli/lib/aiFiles/utils.js +31 -14
  41. package/dist/cjs/cli/lib/aiFiles/utils.js.map +2 -2
  42. package/dist/cjs/cli/lib/api.js +70 -7
  43. package/dist/cjs/cli/lib/api.js.map +2 -2
  44. package/dist/cjs/cli/lib/command.js +4 -5
  45. package/dist/cjs/cli/lib/command.js.map +2 -2
  46. package/dist/cjs/cli/lib/config.js +41 -4
  47. package/dist/cjs/cli/lib/config.js.map +3 -3
  48. package/dist/cjs/cli/lib/deploy2.js +9 -26
  49. package/dist/cjs/cli/lib/deploy2.js.map +2 -2
  50. package/dist/cjs/cli/lib/deployApi/componentDefinition.js +4 -1
  51. package/dist/cjs/cli/lib/deployApi/componentDefinition.js.map +2 -2
  52. package/dist/cjs/cli/lib/deploymentSelection.js +45 -2
  53. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  54. package/dist/cjs/cli/lib/deploymentSelector.js +1 -0
  55. package/dist/cjs/cli/lib/deploymentSelector.js.map +2 -2
  56. package/dist/cjs/cli/lib/dev.js +162 -117
  57. package/dist/cjs/cli/lib/dev.js.map +2 -2
  58. package/dist/cjs/cli/lib/env.js +1 -13
  59. package/dist/cjs/cli/lib/env.js.map +2 -2
  60. package/dist/cjs/cli/lib/expiration.js +104 -0
  61. package/dist/cjs/cli/lib/expiration.js.map +7 -0
  62. package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
  63. package/dist/cjs/cli/lib/init.js +4 -3
  64. package/dist/cjs/cli/lib/init.js.map +2 -2
  65. package/dist/cjs/cli/lib/insights.js +1 -1
  66. package/dist/cjs/cli/lib/insights.js.map +2 -2
  67. package/dist/cjs/cli/lib/localDeployment/anonymous.js +14 -7
  68. package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +2 -2
  69. package/dist/cjs/cli/lib/localDeployment/localDeployment.js +8 -10
  70. package/dist/cjs/cli/lib/localDeployment/localDeployment.js.map +2 -2
  71. package/dist/cjs/cli/lib/localDeployment/run.js +1 -0
  72. package/dist/cjs/cli/lib/localDeployment/run.js.map +2 -2
  73. package/dist/cjs/cli/lib/localDeployment/upgrade.js +2 -2
  74. package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +2 -2
  75. package/dist/cjs/cli/lib/localDeployment/utils.js +9 -0
  76. package/dist/cjs/cli/lib/localDeployment/utils.js.map +2 -2
  77. package/dist/cjs/cli/lib/mcp/tools/status.js +1 -1
  78. package/dist/cjs/cli/lib/mcp/tools/status.js.map +2 -2
  79. package/dist/cjs/cli/lib/updates.js +8 -9
  80. package/dist/cjs/cli/lib/updates.js.map +2 -2
  81. package/dist/cjs/cli/lib/usage.js +2 -1
  82. package/dist/cjs/cli/lib/usage.js.map +2 -2
  83. package/dist/cjs/cli/lib/utils/prompts.js +2 -1
  84. package/dist/cjs/cli/lib/utils/prompts.js.map +2 -2
  85. package/dist/cjs/cli/lib/utils/utils.js +46 -20
  86. package/dist/cjs/cli/lib/utils/utils.js.map +3 -3
  87. package/dist/cjs/index.js +1 -1
  88. package/dist/cjs/index.js.map +1 -1
  89. package/dist/cjs/react/client.js +43 -6
  90. package/dist/cjs/react/client.js.map +2 -2
  91. package/dist/cjs/react/index.js +2 -0
  92. package/dist/cjs/react/index.js.map +2 -2
  93. package/dist/cjs/react-clerk/ConvexProviderWithClerk.js.map +1 -1
  94. package/dist/cjs/server/api.js.map +2 -2
  95. package/dist/cjs/server/components/definition.js.map +1 -1
  96. package/dist/cjs/server/components/index.js +40 -4
  97. package/dist/cjs/server/components/index.js.map +2 -2
  98. package/dist/cjs/server/data_model.js.map +1 -1
  99. package/dist/cjs/server/impl/meta_impl.js +78 -0
  100. package/dist/cjs/server/impl/meta_impl.js.map +7 -0
  101. package/dist/cjs/server/impl/registration_impl.js +16 -11
  102. package/dist/cjs/server/impl/registration_impl.js.map +2 -2
  103. package/dist/cjs/server/index.js.map +2 -2
  104. package/dist/cjs/server/meta.js +17 -0
  105. package/dist/cjs/server/meta.js.map +7 -0
  106. package/dist/cjs/server/registration.js.map +1 -1
  107. package/dist/cjs-types/browser/index.d.ts +1 -0
  108. package/dist/cjs-types/browser/index.d.ts.map +1 -1
  109. package/dist/cjs-types/browser/query_options.d.ts +12 -9
  110. package/dist/cjs-types/browser/query_options.d.ts.map +1 -1
  111. package/dist/cjs-types/cli/aiFiles.d.ts.map +1 -1
  112. package/dist/cjs-types/cli/codegen_templates/readme.d.ts.map +1 -1
  113. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  114. package/dist/cjs-types/cli/configure.test.d.ts +2 -0
  115. package/dist/cjs-types/cli/configure.test.d.ts.map +1 -0
  116. package/dist/cjs-types/cli/deploy.d.ts.map +1 -1
  117. package/dist/cjs-types/cli/deploymentCreate.d.ts +1 -0
  118. package/dist/cjs-types/cli/deploymentCreate.d.ts.map +1 -1
  119. package/dist/cjs-types/cli/deploymentSelect.d.ts +2 -1
  120. package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
  121. package/dist/cjs-types/cli/dev.d.ts +3 -1
  122. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  123. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts +5 -5
  124. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -1
  125. package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts +5 -5
  126. package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -1
  127. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -3
  128. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
  129. package/dist/cjs-types/cli/lib/aiFiles/index.d.ts +20 -18
  130. package/dist/cjs-types/cli/lib/aiFiles/index.d.ts.map +1 -1
  131. package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts +6 -4
  132. package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
  133. package/dist/cjs-types/cli/lib/aiFiles/state.d.ts +38 -0
  134. package/dist/cjs-types/cli/lib/aiFiles/state.d.ts.map +1 -0
  135. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts +2 -0
  136. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
  137. package/dist/cjs-types/cli/lib/aiFiles/status.d.ts +4 -1
  138. package/dist/cjs-types/cli/lib/aiFiles/status.d.ts.map +1 -1
  139. package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts +13 -3
  140. package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts.map +1 -1
  141. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
  142. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
  143. package/dist/cjs-types/cli/lib/api.d.ts +3 -3
  144. package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
  145. package/dist/cjs-types/cli/lib/command.d.ts +2 -1
  146. package/dist/cjs-types/cli/lib/command.d.ts.map +1 -1
  147. package/dist/cjs-types/cli/lib/config.d.ts +17 -6
  148. package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
  149. package/dist/cjs-types/cli/lib/deploy2.d.ts +5 -2
  150. package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
  151. package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
  152. package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
  153. package/dist/cjs-types/cli/lib/deployApi/definitionConfig.d.ts +24 -24
  154. package/dist/cjs-types/cli/lib/deployApi/modules.d.ts +14 -14
  155. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +61 -52
  156. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
  157. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  158. package/dist/cjs-types/cli/lib/deploymentSelector.d.ts +2 -0
  159. package/dist/cjs-types/cli/lib/deploymentSelector.d.ts.map +1 -1
  160. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  161. package/dist/cjs-types/cli/lib/env.d.ts +0 -4
  162. package/dist/cjs-types/cli/lib/env.d.ts.map +1 -1
  163. package/dist/cjs-types/cli/lib/expiration.d.ts +35 -0
  164. package/dist/cjs-types/cli/lib/expiration.d.ts.map +1 -0
  165. package/dist/cjs-types/cli/lib/expiration.test.d.ts +2 -0
  166. package/dist/cjs-types/cli/lib/expiration.test.d.ts.map +1 -0
  167. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
  168. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  169. package/dist/cjs-types/cli/lib/init.d.ts.map +1 -1
  170. package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  171. package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  172. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts +15 -0
  173. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  174. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  175. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +7 -0
  176. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  177. package/dist/cjs-types/cli/lib/mcp/requestContext.d.ts +3 -3
  178. package/dist/cjs-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  179. package/dist/cjs-types/cli/lib/updates.d.ts +4 -3
  180. package/dist/cjs-types/cli/lib/updates.d.ts.map +1 -1
  181. package/dist/cjs-types/cli/lib/usage.d.ts.map +1 -1
  182. package/dist/cjs-types/cli/lib/utils/prompts.d.ts +1 -0
  183. package/dist/cjs-types/cli/lib/utils/prompts.d.ts.map +1 -1
  184. package/dist/cjs-types/cli/lib/utils/utils.d.ts +16 -2
  185. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  186. package/dist/cjs-types/index.d.ts +1 -1
  187. package/dist/cjs-types/react/client.d.ts +54 -2
  188. package/dist/cjs-types/react/client.d.ts.map +1 -1
  189. package/dist/cjs-types/react/index.d.ts +7 -2
  190. package/dist/cjs-types/react/index.d.ts.map +1 -1
  191. package/dist/cjs-types/react/use_query_object_options.test.d.ts +5 -0
  192. package/dist/cjs-types/react/use_query_object_options.test.d.ts.map +1 -0
  193. package/dist/cjs-types/react/use_query_result.test.d.ts +5 -0
  194. package/dist/cjs-types/react/use_query_result.test.d.ts.map +1 -0
  195. package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
  196. package/dist/cjs-types/server/api.d.ts +5 -1
  197. package/dist/cjs-types/server/api.d.ts.map +1 -1
  198. package/dist/cjs-types/server/components/definition.d.ts +1 -0
  199. package/dist/cjs-types/server/components/definition.d.ts.map +1 -1
  200. package/dist/cjs-types/server/components/index.d.ts +5 -1
  201. package/dist/cjs-types/server/components/index.d.ts.map +1 -1
  202. package/dist/cjs-types/server/data_model.d.ts +2 -1
  203. package/dist/cjs-types/server/data_model.d.ts.map +1 -1
  204. package/dist/cjs-types/server/impl/meta_impl.d.ts +5 -0
  205. package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -0
  206. package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
  207. package/dist/cjs-types/server/index.d.ts +1 -0
  208. package/dist/cjs-types/server/index.d.ts.map +1 -1
  209. package/dist/cjs-types/server/meta.d.ts +72 -0
  210. package/dist/cjs-types/server/meta.d.ts.map +1 -0
  211. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  212. package/dist/cli.bundle.cjs +1670 -1214
  213. package/dist/cli.bundle.cjs.map +4 -4
  214. package/dist/esm/browser/index-node.js +1 -0
  215. package/dist/esm/browser/index.js +1 -0
  216. package/dist/esm/browser/index.js.map +2 -2
  217. package/dist/esm/browser/query_options.js.map +2 -2
  218. package/dist/esm/cli/aiFiles.js +33 -15
  219. package/dist/esm/cli/aiFiles.js.map +2 -2
  220. package/dist/esm/cli/codegen_templates/readme.js +14 -1
  221. package/dist/esm/cli/codegen_templates/readme.js.map +2 -2
  222. package/dist/esm/cli/configure.js +23 -26
  223. package/dist/esm/cli/configure.js.map +2 -2
  224. package/dist/esm/cli/deploy.js +11 -10
  225. package/dist/esm/cli/deploy.js.map +2 -2
  226. package/dist/esm/cli/deploymentCreate.js +238 -42
  227. package/dist/esm/cli/deploymentCreate.js.map +2 -2
  228. package/dist/esm/cli/deploymentSelect.js +13 -12
  229. package/dist/esm/cli/deploymentSelect.js.map +2 -2
  230. package/dist/esm/cli/dev.js +34 -13
  231. package/dist/esm/cli/dev.js.map +2 -2
  232. package/dist/esm/cli/docs.js +1 -1
  233. package/dist/esm/cli/docs.js.map +2 -2
  234. package/dist/esm/cli/init.js +2 -2
  235. package/dist/esm/cli/init.js.map +2 -2
  236. package/dist/esm/cli/lib/aiFiles/agentsmd.js +13 -9
  237. package/dist/esm/cli/lib/aiFiles/agentsmd.js.map +2 -2
  238. package/dist/esm/cli/lib/aiFiles/claudemd.js +13 -9
  239. package/dist/esm/cli/lib/aiFiles/claudemd.js.map +2 -2
  240. package/dist/esm/cli/lib/aiFiles/guidelinesmd.js +12 -5
  241. package/dist/esm/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
  242. package/dist/esm/cli/lib/aiFiles/index.js +72 -89
  243. package/dist/esm/cli/lib/aiFiles/index.js.map +2 -2
  244. package/dist/esm/cli/lib/aiFiles/skills.js +29 -13
  245. package/dist/esm/cli/lib/aiFiles/skills.js.map +2 -2
  246. package/dist/esm/cli/lib/aiFiles/state.js +60 -0
  247. package/dist/esm/cli/lib/aiFiles/state.js.map +7 -0
  248. package/dist/esm/cli/lib/aiFiles/status.js +32 -29
  249. package/dist/esm/cli/lib/aiFiles/status.js.map +2 -2
  250. package/dist/esm/cli/lib/aiFiles/utils.js +25 -10
  251. package/dist/esm/cli/lib/aiFiles/utils.js.map +2 -2
  252. package/dist/esm/cli/lib/api.js +70 -7
  253. package/dist/esm/cli/lib/api.js.map +2 -2
  254. package/dist/esm/cli/lib/command.js +4 -5
  255. package/dist/esm/cli/lib/command.js.map +2 -2
  256. package/dist/esm/cli/lib/config.js +39 -3
  257. package/dist/esm/cli/lib/config.js.map +2 -2
  258. package/dist/esm/cli/lib/deploy2.js +13 -26
  259. package/dist/esm/cli/lib/deploy2.js.map +2 -2
  260. package/dist/esm/cli/lib/deployApi/componentDefinition.js +4 -1
  261. package/dist/esm/cli/lib/deployApi/componentDefinition.js.map +2 -2
  262. package/dist/esm/cli/lib/deploymentSelection.js +46 -2
  263. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  264. package/dist/esm/cli/lib/deploymentSelector.js +1 -0
  265. package/dist/esm/cli/lib/deploymentSelector.js.map +2 -2
  266. package/dist/esm/cli/lib/dev.js +162 -118
  267. package/dist/esm/cli/lib/dev.js.map +2 -2
  268. package/dist/esm/cli/lib/env.js +0 -11
  269. package/dist/esm/cli/lib/env.js.map +2 -2
  270. package/dist/esm/cli/lib/expiration.js +80 -0
  271. package/dist/esm/cli/lib/expiration.js.map +7 -0
  272. package/dist/esm/cli/lib/init.js +4 -3
  273. package/dist/esm/cli/lib/init.js.map +2 -2
  274. package/dist/esm/cli/lib/insights.js +1 -1
  275. package/dist/esm/cli/lib/insights.js.map +2 -2
  276. package/dist/esm/cli/lib/localDeployment/anonymous.js +16 -9
  277. package/dist/esm/cli/lib/localDeployment/anonymous.js.map +2 -2
  278. package/dist/esm/cli/lib/localDeployment/localDeployment.js +9 -11
  279. package/dist/esm/cli/lib/localDeployment/localDeployment.js.map +2 -2
  280. package/dist/esm/cli/lib/localDeployment/run.js +1 -1
  281. package/dist/esm/cli/lib/localDeployment/run.js.map +2 -2
  282. package/dist/esm/cli/lib/localDeployment/upgrade.js +2 -2
  283. package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
  284. package/dist/esm/cli/lib/localDeployment/utils.js +8 -0
  285. package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
  286. package/dist/esm/cli/lib/mcp/tools/status.js +1 -1
  287. package/dist/esm/cli/lib/mcp/tools/status.js.map +2 -2
  288. package/dist/esm/cli/lib/updates.js +11 -9
  289. package/dist/esm/cli/lib/updates.js.map +2 -2
  290. package/dist/esm/cli/lib/usage.js +2 -1
  291. package/dist/esm/cli/lib/usage.js.map +2 -2
  292. package/dist/esm/cli/lib/utils/prompts.js +2 -1
  293. package/dist/esm/cli/lib/utils/prompts.js.map +2 -2
  294. package/dist/esm/cli/lib/utils/utils.js +45 -20
  295. package/dist/esm/cli/lib/utils/utils.js.map +3 -3
  296. package/dist/esm/index.js +1 -1
  297. package/dist/esm/index.js.map +1 -1
  298. package/dist/esm/react/client.js +43 -6
  299. package/dist/esm/react/client.js.map +2 -2
  300. package/dist/esm/react/index.js +1 -0
  301. package/dist/esm/react/index.js.map +2 -2
  302. package/dist/esm/react-clerk/ConvexProviderWithClerk.js.map +1 -1
  303. package/dist/esm/server/api.js.map +2 -2
  304. package/dist/esm/server/components/index.js +40 -4
  305. package/dist/esm/server/components/index.js.map +2 -2
  306. package/dist/esm/server/impl/meta_impl.js +54 -0
  307. package/dist/esm/server/impl/meta_impl.js.map +7 -0
  308. package/dist/esm/server/impl/registration_impl.js +20 -11
  309. package/dist/esm/server/impl/registration_impl.js.map +2 -2
  310. package/dist/esm/server/index.js.map +2 -2
  311. package/dist/esm/server/meta.js +2 -0
  312. package/dist/esm/server/meta.js.map +7 -0
  313. package/dist/esm-types/browser/index.d.ts +1 -0
  314. package/dist/esm-types/browser/index.d.ts.map +1 -1
  315. package/dist/esm-types/browser/query_options.d.ts +12 -9
  316. package/dist/esm-types/browser/query_options.d.ts.map +1 -1
  317. package/dist/esm-types/cli/aiFiles.d.ts.map +1 -1
  318. package/dist/esm-types/cli/codegen_templates/readme.d.ts.map +1 -1
  319. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  320. package/dist/esm-types/cli/configure.test.d.ts +2 -0
  321. package/dist/esm-types/cli/configure.test.d.ts.map +1 -0
  322. package/dist/esm-types/cli/deploy.d.ts.map +1 -1
  323. package/dist/esm-types/cli/deploymentCreate.d.ts +1 -0
  324. package/dist/esm-types/cli/deploymentCreate.d.ts.map +1 -1
  325. package/dist/esm-types/cli/deploymentSelect.d.ts +2 -1
  326. package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
  327. package/dist/esm-types/cli/dev.d.ts +3 -1
  328. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  329. package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts +5 -5
  330. package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -1
  331. package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts +5 -5
  332. package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -1
  333. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -3
  334. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
  335. package/dist/esm-types/cli/lib/aiFiles/index.d.ts +20 -18
  336. package/dist/esm-types/cli/lib/aiFiles/index.d.ts.map +1 -1
  337. package/dist/esm-types/cli/lib/aiFiles/skills.d.ts +6 -4
  338. package/dist/esm-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
  339. package/dist/esm-types/cli/lib/aiFiles/state.d.ts +38 -0
  340. package/dist/esm-types/cli/lib/aiFiles/state.d.ts.map +1 -0
  341. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts +2 -0
  342. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
  343. package/dist/esm-types/cli/lib/aiFiles/status.d.ts +4 -1
  344. package/dist/esm-types/cli/lib/aiFiles/status.d.ts.map +1 -1
  345. package/dist/esm-types/cli/lib/aiFiles/utils.d.ts +13 -3
  346. package/dist/esm-types/cli/lib/aiFiles/utils.d.ts.map +1 -1
  347. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
  348. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
  349. package/dist/esm-types/cli/lib/api.d.ts +3 -3
  350. package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
  351. package/dist/esm-types/cli/lib/command.d.ts +2 -1
  352. package/dist/esm-types/cli/lib/command.d.ts.map +1 -1
  353. package/dist/esm-types/cli/lib/config.d.ts +17 -6
  354. package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
  355. package/dist/esm-types/cli/lib/deploy2.d.ts +5 -2
  356. package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
  357. package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
  358. package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
  359. package/dist/esm-types/cli/lib/deployApi/definitionConfig.d.ts +24 -24
  360. package/dist/esm-types/cli/lib/deployApi/modules.d.ts +14 -14
  361. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +61 -52
  362. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
  363. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  364. package/dist/esm-types/cli/lib/deploymentSelector.d.ts +2 -0
  365. package/dist/esm-types/cli/lib/deploymentSelector.d.ts.map +1 -1
  366. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  367. package/dist/esm-types/cli/lib/env.d.ts +0 -4
  368. package/dist/esm-types/cli/lib/env.d.ts.map +1 -1
  369. package/dist/esm-types/cli/lib/expiration.d.ts +35 -0
  370. package/dist/esm-types/cli/lib/expiration.d.ts.map +1 -0
  371. package/dist/esm-types/cli/lib/expiration.test.d.ts +2 -0
  372. package/dist/esm-types/cli/lib/expiration.test.d.ts.map +1 -0
  373. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
  374. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  375. package/dist/esm-types/cli/lib/init.d.ts.map +1 -1
  376. package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  377. package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  378. package/dist/esm-types/cli/lib/localDeployment/run.d.ts +15 -0
  379. package/dist/esm-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  380. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  381. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +7 -0
  382. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  383. package/dist/esm-types/cli/lib/mcp/requestContext.d.ts +3 -3
  384. package/dist/esm-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  385. package/dist/esm-types/cli/lib/updates.d.ts +4 -3
  386. package/dist/esm-types/cli/lib/updates.d.ts.map +1 -1
  387. package/dist/esm-types/cli/lib/usage.d.ts.map +1 -1
  388. package/dist/esm-types/cli/lib/utils/prompts.d.ts +1 -0
  389. package/dist/esm-types/cli/lib/utils/prompts.d.ts.map +1 -1
  390. package/dist/esm-types/cli/lib/utils/utils.d.ts +16 -2
  391. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  392. package/dist/esm-types/index.d.ts +1 -1
  393. package/dist/esm-types/react/client.d.ts +54 -2
  394. package/dist/esm-types/react/client.d.ts.map +1 -1
  395. package/dist/esm-types/react/index.d.ts +7 -2
  396. package/dist/esm-types/react/index.d.ts.map +1 -1
  397. package/dist/esm-types/react/use_query_object_options.test.d.ts +5 -0
  398. package/dist/esm-types/react/use_query_object_options.test.d.ts.map +1 -0
  399. package/dist/esm-types/react/use_query_result.test.d.ts +5 -0
  400. package/dist/esm-types/react/use_query_result.test.d.ts.map +1 -0
  401. package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
  402. package/dist/esm-types/server/api.d.ts +5 -1
  403. package/dist/esm-types/server/api.d.ts.map +1 -1
  404. package/dist/esm-types/server/components/definition.d.ts +1 -0
  405. package/dist/esm-types/server/components/definition.d.ts.map +1 -1
  406. package/dist/esm-types/server/components/index.d.ts +5 -1
  407. package/dist/esm-types/server/components/index.d.ts.map +1 -1
  408. package/dist/esm-types/server/data_model.d.ts +2 -1
  409. package/dist/esm-types/server/data_model.d.ts.map +1 -1
  410. package/dist/esm-types/server/impl/meta_impl.d.ts +5 -0
  411. package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -0
  412. package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
  413. package/dist/esm-types/server/index.d.ts +1 -0
  414. package/dist/esm-types/server/index.d.ts.map +1 -1
  415. package/dist/esm-types/server/meta.d.ts +72 -0
  416. package/dist/esm-types/server/meta.d.ts.map +1 -0
  417. package/dist/esm-types/server/registration.d.ts.map +1 -1
  418. package/dist/react.bundle.js +50 -7
  419. package/dist/react.bundle.js.map +3 -3
  420. package/package.json +11 -7
  421. package/schemas/convex.schema.json +15 -2
  422. package/src/browser/index.ts +3 -0
  423. package/src/browser/query_options.test.ts +0 -9
  424. package/src/browser/query_options.ts +36 -15
  425. package/src/cli/aiFiles.ts +44 -14
  426. package/src/cli/codegen_templates/readme.ts +14 -1
  427. package/src/cli/configure.test.ts +138 -0
  428. package/src/cli/configure.ts +48 -47
  429. package/src/cli/deploy.ts +12 -9
  430. package/src/cli/deploymentCreate.test.ts +349 -14
  431. package/src/cli/deploymentCreate.ts +268 -41
  432. package/src/cli/deploymentSelect.test.ts +136 -27
  433. package/src/cli/deploymentSelect.ts +50 -41
  434. package/src/cli/deploymentSelection.test.ts +343 -35
  435. package/src/cli/dev.ts +49 -14
  436. package/src/cli/docs.ts +1 -1
  437. package/src/cli/init.ts +2 -2
  438. package/src/cli/lib/aiFiles/agentsmd.ts +15 -11
  439. package/src/cli/lib/aiFiles/claudemd.ts +15 -11
  440. package/src/cli/lib/aiFiles/guidelinesmd.test.ts +12 -2
  441. package/src/cli/lib/aiFiles/guidelinesmd.ts +15 -7
  442. package/src/cli/lib/aiFiles/index.test.ts +188 -222
  443. package/src/cli/lib/aiFiles/index.ts +119 -125
  444. package/src/cli/lib/aiFiles/integration.test.ts +112 -45
  445. package/src/cli/lib/aiFiles/prompt.test.ts +6 -6
  446. package/src/cli/lib/aiFiles/skills.ts +46 -16
  447. package/src/cli/lib/aiFiles/state.test.ts +280 -0
  448. package/src/cli/lib/aiFiles/state.ts +82 -0
  449. package/src/cli/lib/aiFiles/status.ts +45 -39
  450. package/src/cli/lib/aiFiles/utils.test.ts +50 -0
  451. package/src/cli/lib/aiFiles/utils.ts +38 -10
  452. package/src/cli/lib/api.ts +88 -7
  453. package/src/cli/lib/command.ts +12 -7
  454. package/src/cli/lib/config.test.ts +184 -7
  455. package/src/cli/lib/config.ts +67 -7
  456. package/src/cli/lib/deploy2.ts +14 -27
  457. package/src/cli/lib/deployApi/componentDefinition.ts +4 -1
  458. package/src/cli/lib/deploymentSelection.ts +59 -6
  459. package/src/cli/lib/deploymentSelector.test.ts +6 -0
  460. package/src/cli/lib/deploymentSelector.ts +2 -0
  461. package/src/cli/lib/dev.ts +202 -153
  462. package/src/cli/lib/env.ts +0 -15
  463. package/src/cli/lib/expiration.test.ts +159 -0
  464. package/src/cli/lib/expiration.ts +124 -0
  465. package/src/cli/lib/generatedFunctionLogsApi.ts +16 -1
  466. package/src/cli/lib/init.ts +6 -2
  467. package/src/cli/lib/insights.ts +1 -1
  468. package/src/cli/lib/localDeployment/anonymous.ts +19 -9
  469. package/src/cli/lib/localDeployment/localDeployment.ts +9 -11
  470. package/src/cli/lib/localDeployment/run.ts +1 -1
  471. package/src/cli/lib/localDeployment/upgrade.ts +12 -10
  472. package/src/cli/lib/localDeployment/utils.ts +12 -0
  473. package/src/cli/lib/mcp/tools/status.ts +1 -1
  474. package/src/cli/lib/updates.test.ts +102 -75
  475. package/src/cli/lib/updates.ts +14 -12
  476. package/src/cli/lib/usage.ts +3 -1
  477. package/src/cli/lib/utils/prompts.ts +2 -0
  478. package/src/cli/lib/utils/utils.test.ts +6 -6
  479. package/src/cli/lib/utils/utils.ts +66 -27
  480. package/src/index.ts +1 -1
  481. package/src/react/client.test.tsx +65 -0
  482. package/src/react/client.ts +129 -13
  483. package/src/react/index.ts +9 -1
  484. package/src/react/use_query_object_options.test.ts +50 -0
  485. package/src/react/use_query_result.test.ts +41 -0
  486. package/src/react-clerk/ConvexProviderWithClerk.test.tsx +1 -1
  487. package/src/react-clerk/ConvexProviderWithClerk.tsx +1 -1
  488. package/src/server/api.ts +5 -1
  489. package/src/server/components/definition.ts +3 -0
  490. package/src/server/components/index.ts +62 -5
  491. package/src/server/data_model.ts +2 -1
  492. package/src/server/impl/meta_impl.ts +74 -0
  493. package/src/server/impl/registration_impl.ts +21 -9
  494. package/src/server/index.ts +8 -0
  495. package/src/server/meta.ts +76 -0
  496. package/src/server/registration.ts +10 -0
  497. package/src/server/schema.test.ts +78 -1
  498. package/dist/cjs/cli/lib/aiFiles/config.js +0 -171
  499. package/dist/cjs/cli/lib/aiFiles/config.js.map +0 -7
  500. package/dist/cjs-types/cli/lib/aiFiles/config.d.ts +0 -46
  501. package/dist/cjs-types/cli/lib/aiFiles/config.d.ts.map +0 -1
  502. package/dist/cjs-types/cli/lib/aiFiles/config.test.d.ts +0 -2
  503. package/dist/cjs-types/cli/lib/aiFiles/config.test.d.ts.map +0 -1
  504. package/dist/esm/cli/lib/aiFiles/config.js +0 -135
  505. package/dist/esm/cli/lib/aiFiles/config.js.map +0 -7
  506. package/dist/esm-types/cli/lib/aiFiles/config.d.ts +0 -46
  507. package/dist/esm-types/cli/lib/aiFiles/config.d.ts.map +0 -1
  508. package/dist/esm-types/cli/lib/aiFiles/config.test.d.ts +0 -2
  509. package/dist/esm-types/cli/lib/aiFiles/config.test.d.ts.map +0 -1
  510. package/src/cli/lib/aiFiles/config.test.ts +0 -460
  511. package/src/cli/lib/aiFiles/config.ts +0 -188
  512. package/src/values/.claude/settings.local.json +0 -10
@@ -1,460 +0,0 @@
1
- import { describe, test, expect, vi, beforeEach, afterEach } from "vitest";
2
- import * as Sentry from "@sentry/node";
3
- import { promises as fs } from "fs";
4
- import {
5
- aiFilesStateSchema,
6
- hasAiFilesConfig,
7
- readAiConfig,
8
- writeAiConfig,
9
- writeAiEnabledToProjectConfig,
10
- } from "./config.js";
11
-
12
- vi.mock("@sentry/node", () => ({
13
- captureException: vi.fn(),
14
- captureMessage: vi.fn(),
15
- }));
16
-
17
- vi.mock("fs", () => ({
18
- promises: {
19
- readFile: vi.fn(),
20
- writeFile: vi.fn(),
21
- },
22
- }));
23
-
24
- const mockFs = vi.mocked(fs);
25
- const mockCaptureException = vi.mocked(Sentry.captureException);
26
-
27
- const dummyProjectDir = "/tmp/test-project";
28
- const dummyConvexDir = "/tmp/test-project/convex";
29
-
30
- describe("aiFilesStateSchema", () => {
31
- test("accepts a fully populated valid state object", () => {
32
- const result = aiFilesStateSchema.safeParse({
33
- guidelinesHash: "abc123",
34
- agentsMdSectionHash: "def456",
35
- claudeMdHash: "ghi789",
36
- agentSkillsSha: "deadbeef",
37
- installedSkillNames: ["convex-migrations", "convex-perf-review"],
38
- });
39
- expect(result.success).toBe(true);
40
- });
41
-
42
- test("accepts null hashes", () => {
43
- const result = aiFilesStateSchema.safeParse({
44
- guidelinesHash: null,
45
- agentsMdSectionHash: null,
46
- claudeMdHash: null,
47
- agentSkillsSha: null,
48
- });
49
- expect(result.success).toBe(true);
50
- });
51
-
52
- test("applies default for installedSkillNames when absent", () => {
53
- const result = aiFilesStateSchema.safeParse({
54
- guidelinesHash: "abc",
55
- agentsMdSectionHash: null,
56
- claudeMdHash: null,
57
- agentSkillsSha: null,
58
- });
59
- expect(result.success).toBe(true);
60
- if (result.success) {
61
- expect(result.data.installedSkillNames).toEqual([]);
62
- }
63
- });
64
-
65
- test("rejects a number where a string hash is expected", () => {
66
- const result = aiFilesStateSchema.safeParse({
67
- guidelinesHash: 123,
68
- agentsMdSectionHash: null,
69
- claudeMdHash: null,
70
- agentSkillsSha: null,
71
- });
72
- expect(result.success).toBe(false);
73
- });
74
-
75
- test("rejects missing required fields", () => {
76
- const result = aiFilesStateSchema.safeParse({
77
- guidelinesHash: "abc",
78
- });
79
- expect(result.success).toBe(false);
80
- });
81
- });
82
-
83
- describe("readAiConfig", () => {
84
- beforeEach(() => vi.clearAllMocks());
85
- afterEach(() => vi.resetAllMocks());
86
-
87
- test("returns null when the file does not exist", async () => {
88
- mockFs.readFile.mockRejectedValue(
89
- Object.assign(new Error("ENOENT"), { code: "ENOENT" }),
90
- );
91
-
92
- const result = await readAiConfig({
93
- projectDir: dummyProjectDir,
94
- convexDir: dummyConvexDir,
95
- });
96
-
97
- expect(result).toBeNull();
98
- expect(mockCaptureException).not.toHaveBeenCalled();
99
- });
100
-
101
- test("returns parsed state with enabled=true when convex.json is missing", async () => {
102
- mockFs.readFile
103
- .mockRejectedValueOnce(
104
- Object.assign(new Error("ENOENT"), { code: "ENOENT" }),
105
- )
106
- .mockResolvedValueOnce(
107
- JSON.stringify({
108
- guidelinesHash: "abc",
109
- agentsMdSectionHash: "def",
110
- claudeMdHash: null,
111
- agentSkillsSha: null,
112
- }),
113
- );
114
-
115
- const result = await readAiConfig({
116
- projectDir: dummyProjectDir,
117
- convexDir: dummyConvexDir,
118
- });
119
-
120
- expect(result).toEqual({
121
- guidelinesHash: "abc",
122
- agentsMdSectionHash: "def",
123
- claudeMdHash: null,
124
- agentSkillsSha: null,
125
- installedSkillNames: [],
126
- enabled: true,
127
- });
128
- });
129
-
130
- test("returns empty disabled config when state file is missing and convex.json disables nags", async () => {
131
- mockFs.readFile
132
- .mockResolvedValueOnce(
133
- JSON.stringify({ aiFiles: { disableStalenessMessage: true } }),
134
- )
135
- .mockRejectedValueOnce(
136
- Object.assign(new Error("ENOENT"), { code: "ENOENT" }),
137
- );
138
-
139
- const result = await readAiConfig({
140
- projectDir: dummyProjectDir,
141
- convexDir: dummyConvexDir,
142
- });
143
-
144
- expect(result).toEqual({
145
- guidelinesHash: null,
146
- agentsMdSectionHash: null,
147
- claudeMdHash: null,
148
- agentSkillsSha: null,
149
- installedSkillNames: [],
150
- enabled: false,
151
- });
152
- });
153
-
154
- test("returns null and captures exception when JSON is invalid", async () => {
155
- mockFs.readFile
156
- .mockResolvedValueOnce(
157
- JSON.stringify({ aiFiles: { disableStalenessMessage: false } }),
158
- )
159
- .mockResolvedValueOnce("not valid json {{{}");
160
-
161
- const result = await readAiConfig({
162
- projectDir: dummyProjectDir,
163
- convexDir: dummyConvexDir,
164
- });
165
-
166
- expect(result).toBeNull();
167
- expect(mockCaptureException).toHaveBeenCalledWith(expect.any(Error));
168
- });
169
-
170
- test("returns null and captures exception when schema validation fails", async () => {
171
- mockFs.readFile
172
- .mockResolvedValueOnce(
173
- JSON.stringify({ aiFiles: { disableStalenessMessage: false } }),
174
- )
175
- .mockResolvedValueOnce(
176
- JSON.stringify({
177
- guidelinesHash: 99,
178
- agentsMdSectionHash: null,
179
- }),
180
- );
181
-
182
- const result = await readAiConfig({
183
- projectDir: dummyProjectDir,
184
- convexDir: dummyConvexDir,
185
- });
186
-
187
- expect(result).toBeNull();
188
- expect(mockCaptureException).toHaveBeenCalledWith(expect.any(Error));
189
- });
190
-
191
- test("reads enabled=false from legacy disableStalenessMessage field for backward compat", async () => {
192
- const stored = {
193
- guidelinesHash: "abc",
194
- agentsMdSectionHash: "def",
195
- claudeMdHash: null,
196
- agentSkillsSha: null,
197
- };
198
- mockFs.readFile
199
- .mockResolvedValueOnce(
200
- JSON.stringify({ aiFiles: { disableStalenessMessage: true } }),
201
- )
202
- .mockResolvedValueOnce(JSON.stringify(stored));
203
-
204
- const result = await readAiConfig({
205
- projectDir: dummyProjectDir,
206
- convexDir: dummyConvexDir,
207
- });
208
-
209
- expect(result).toEqual({
210
- ...stored,
211
- installedSkillNames: [],
212
- enabled: false,
213
- });
214
- });
215
-
216
- test("enabled: true takes precedence over legacy disableStalenessMessage: true", async () => {
217
- const stored = {
218
- guidelinesHash: "abc",
219
- agentsMdSectionHash: "def",
220
- claudeMdHash: null,
221
- agentSkillsSha: null,
222
- };
223
- mockFs.readFile
224
- .mockResolvedValueOnce(
225
- JSON.stringify({
226
- aiFiles: { enabled: true, disableStalenessMessage: true },
227
- }),
228
- )
229
- .mockResolvedValueOnce(JSON.stringify(stored));
230
-
231
- const result = await readAiConfig({
232
- projectDir: dummyProjectDir,
233
- convexDir: dummyConvexDir,
234
- });
235
-
236
- expect(result).toEqual({
237
- ...stored,
238
- installedSkillNames: [],
239
- enabled: true,
240
- });
241
- });
242
- });
243
-
244
- describe("hasAiFilesConfig", () => {
245
- beforeEach(() => vi.clearAllMocks());
246
- afterEach(() => vi.resetAllMocks());
247
-
248
- test("returns false when neither convex.json nor state file exists", async () => {
249
- mockFs.readFile.mockRejectedValue(
250
- Object.assign(new Error("ENOENT"), { code: "ENOENT" }),
251
- );
252
-
253
- const result = await hasAiFilesConfig({
254
- projectDir: dummyProjectDir,
255
- convexDir: dummyConvexDir,
256
- });
257
-
258
- expect(result).toBe(false);
259
- expect(mockCaptureException).not.toHaveBeenCalled();
260
- });
261
-
262
- test("returns true when convex.json disables staleness messages", async () => {
263
- mockFs.readFile.mockResolvedValueOnce(
264
- JSON.stringify({ aiFiles: { disableStalenessMessage: true } }),
265
- );
266
-
267
- const result = await hasAiFilesConfig({
268
- projectDir: dummyProjectDir,
269
- convexDir: dummyConvexDir,
270
- });
271
-
272
- expect(result).toBe(true);
273
- });
274
-
275
- test("returns true when a valid state file exists", async () => {
276
- mockFs.readFile
277
- .mockRejectedValueOnce(
278
- Object.assign(new Error("ENOENT"), { code: "ENOENT" }),
279
- )
280
- .mockResolvedValueOnce(
281
- JSON.stringify({
282
- guidelinesHash: "abc",
283
- agentsMdSectionHash: "def",
284
- claudeMdHash: null,
285
- agentSkillsSha: null,
286
- }),
287
- );
288
-
289
- const result = await hasAiFilesConfig({
290
- projectDir: dummyProjectDir,
291
- convexDir: dummyConvexDir,
292
- });
293
-
294
- expect(result).toBe(true);
295
- });
296
-
297
- test("returns false and captures exception when the state file is invalid", async () => {
298
- mockFs.readFile
299
- .mockRejectedValueOnce(
300
- Object.assign(new Error("ENOENT"), { code: "ENOENT" }),
301
- )
302
- .mockResolvedValueOnce("not valid json {{{}");
303
-
304
- const result = await hasAiFilesConfig({
305
- projectDir: dummyProjectDir,
306
- convexDir: dummyConvexDir,
307
- });
308
-
309
- expect(result).toBe(false);
310
- expect(mockCaptureException).toHaveBeenCalledWith(expect.any(Error));
311
- });
312
- });
313
-
314
- describe("writeAiConfig", () => {
315
- beforeEach(() => vi.clearAllMocks());
316
- afterEach(() => vi.resetAllMocks());
317
-
318
- test("writes state file and does not persist enabled=true by default", async () => {
319
- mockFs.writeFile.mockResolvedValue(undefined);
320
-
321
- const config = {
322
- enabled: true,
323
- guidelinesHash: "abc",
324
- agentsMdSectionHash: "def",
325
- claudeMdHash: null,
326
- agentSkillsSha: null,
327
- installedSkillNames: ["convex-migrations"],
328
- };
329
-
330
- await writeAiConfig({
331
- config,
332
- projectDir: dummyProjectDir,
333
- convexDir: dummyConvexDir,
334
- });
335
-
336
- expect(mockFs.writeFile).toHaveBeenCalledTimes(1);
337
- expect(mockFs.writeFile).toHaveBeenCalledWith(
338
- expect.stringContaining("ai-files.state.json"),
339
- JSON.stringify(
340
- {
341
- guidelinesHash: "abc",
342
- agentsMdSectionHash: "def",
343
- claudeMdHash: null,
344
- agentSkillsSha: null,
345
- installedSkillNames: ["convex-migrations"],
346
- },
347
- null,
348
- 2,
349
- ) + "\n",
350
- "utf8",
351
- );
352
- });
353
-
354
- test("persists enabled=true when requested explicitly", async () => {
355
- mockFs.writeFile.mockResolvedValue(undefined);
356
- mockFs.readFile.mockResolvedValue("{}");
357
-
358
- await writeAiConfig({
359
- config: {
360
- enabled: true,
361
- guidelinesHash: null,
362
- agentsMdSectionHash: null,
363
- claudeMdHash: null,
364
- agentSkillsSha: null,
365
- installedSkillNames: [],
366
- },
367
- projectDir: dummyProjectDir,
368
- convexDir: dummyConvexDir,
369
- options: { persistEnabledPreference: "always" },
370
- });
371
-
372
- expect(mockFs.writeFile).toHaveBeenNthCalledWith(
373
- 2,
374
- expect.stringContaining("convex.json"),
375
- JSON.stringify(
376
- {
377
- $schema: "node_modules/convex/schemas/convex.schema.json",
378
- aiFiles: { enabled: true },
379
- },
380
- null,
381
- 2,
382
- ) + "\n",
383
- "utf8",
384
- );
385
- });
386
-
387
- test("persists enabled=false to convex.json by default", async () => {
388
- mockFs.writeFile.mockResolvedValue(undefined);
389
- mockFs.readFile.mockResolvedValue("{}");
390
-
391
- await writeAiConfig({
392
- config: {
393
- enabled: false,
394
- guidelinesHash: null,
395
- agentsMdSectionHash: null,
396
- claudeMdHash: null,
397
- agentSkillsSha: null,
398
- installedSkillNames: [],
399
- },
400
- projectDir: dummyProjectDir,
401
- convexDir: dummyConvexDir,
402
- });
403
-
404
- expect(mockFs.writeFile).toHaveBeenCalledTimes(2);
405
- expect(mockFs.writeFile).toHaveBeenNthCalledWith(
406
- 2,
407
- expect.stringContaining("convex.json"),
408
- expect.stringContaining('"enabled": false'),
409
- "utf8",
410
- );
411
- });
412
-
413
- test("never writes to convex.json when persistEnabledPreference is 'never'", async () => {
414
- mockFs.writeFile.mockResolvedValue(undefined);
415
-
416
- await writeAiConfig({
417
- config: {
418
- enabled: false,
419
- guidelinesHash: null,
420
- agentsMdSectionHash: null,
421
- claudeMdHash: null,
422
- agentSkillsSha: null,
423
- installedSkillNames: [],
424
- },
425
- projectDir: dummyProjectDir,
426
- convexDir: dummyConvexDir,
427
- options: { persistEnabledPreference: "never" },
428
- });
429
-
430
- expect(mockFs.writeFile).toHaveBeenCalledTimes(1);
431
- expect(mockFs.writeFile).toHaveBeenCalledWith(
432
- expect.stringContaining("ai-files.state.json"),
433
- expect.any(String),
434
- "utf8",
435
- );
436
- });
437
- });
438
-
439
- describe("writeAiEnabledToProjectConfig", () => {
440
- beforeEach(() => vi.clearAllMocks());
441
- afterEach(() => vi.resetAllMocks());
442
-
443
- test("writes enabled=false to convex.json and drops legacy disableStalenessMessage", async () => {
444
- mockFs.readFile.mockResolvedValue(
445
- JSON.stringify({ aiFiles: { disableStalenessMessage: true } }),
446
- );
447
- mockFs.writeFile.mockResolvedValue(undefined);
448
-
449
- await writeAiEnabledToProjectConfig({
450
- projectDir: dummyProjectDir,
451
- enabled: false,
452
- });
453
-
454
- expect(mockFs.writeFile).toHaveBeenCalledTimes(1);
455
- const written = mockFs.writeFile.mock.calls[0][1] as string;
456
- const parsed = JSON.parse(written);
457
- expect(parsed.aiFiles.enabled).toBe(false);
458
- expect(parsed.aiFiles.disableStalenessMessage).toBeUndefined();
459
- });
460
- });
@@ -1,188 +0,0 @@
1
- import * as Sentry from "@sentry/node";
2
- // Use raw fs (not ctx.fs) so these operations run asynchronously and don't
3
- // interfere with the file-watcher used by `convex dev`.
4
- // eslint-disable-next-line no-restricted-imports
5
- import { promises as fs } from "fs";
6
- import path from "path";
7
- import { z } from "zod";
8
- import { aiFilesStatePathForConvexDir } from "./paths.js";
9
- import { iife, readFileSafe } from "./utils.js";
10
-
11
- export const aiFilesStateSchema = z.object({
12
- guidelinesHash: z.string().nullable(),
13
- agentsMdSectionHash: z.string().nullable(),
14
- claudeMdHash: z.string().nullable(),
15
- // Commit SHA from get-convex/agent-skills that was current when skills were
16
- // last installed. Used to detect when newer skills are available.
17
- agentSkillsSha: z.string().nullable(),
18
- // Names of skills installed by `npx skills add`, used by `remove` to
19
- // only remove Convex-managed skills.
20
- installedSkillNames: z.array(z.string()).default([]),
21
- });
22
-
23
- const aiFilesProjectConfigSchema = z
24
- .object({
25
- aiFiles: z
26
- .object({
27
- // `enabled` is the canonical field. When present it takes full
28
- // precedence - `enabled: true` will re-enable even if the legacy
29
- // disableStalenessMessage field is still `true` in the file.
30
- enabled: z.boolean().optional(),
31
- // @deprecated - use `enabled` instead. Read for backward compat;
32
- // new writes always emit `enabled` and drop this key.
33
- disableStalenessMessage: z.boolean().optional(),
34
- })
35
- .default({}),
36
- })
37
- .passthrough();
38
-
39
- type AiFilesState = z.infer<typeof aiFilesStateSchema>;
40
- export type AiFilesConfig = AiFilesState & {
41
- enabled: boolean;
42
- };
43
-
44
- const EMPTY_AI_STATE: AiFilesState = {
45
- guidelinesHash: null,
46
- agentsMdSectionHash: null,
47
- claudeMdHash: null,
48
- agentSkillsSha: null,
49
- installedSkillNames: [],
50
- };
51
-
52
- async function readAiEnabledFromProjectConfig(
53
- projectDir: string,
54
- ): Promise<boolean> {
55
- const raw = await readFileSafe(path.join(projectDir, "convex.json"));
56
- if (raw === null) return true;
57
- try {
58
- const parsed = aiFilesProjectConfigSchema.parse(JSON.parse(raw));
59
- // `enabled` takes full precedence when explicitly set.
60
- if (parsed.aiFiles.enabled !== undefined) return parsed.aiFiles.enabled;
61
- // Legacy `disableStalenessMessage` - invert it.
62
- return !(parsed.aiFiles.disableStalenessMessage ?? false);
63
- } catch (err) {
64
- Sentry.captureException(err);
65
- return true;
66
- }
67
- }
68
-
69
- export async function writeAiEnabledToProjectConfig({
70
- projectDir,
71
- enabled,
72
- }: {
73
- projectDir: string;
74
- enabled: boolean;
75
- }): Promise<void> {
76
- const filePath = path.join(projectDir, "convex.json");
77
- const existing = await iife(async () => {
78
- try {
79
- return JSON.parse(await fs.readFile(filePath, "utf8")) as unknown;
80
- } catch {
81
- return {} as unknown;
82
- }
83
- });
84
- const base =
85
- existing !== null &&
86
- typeof existing === "object" &&
87
- !Array.isArray(existing)
88
- ? (existing as Record<string, unknown>)
89
- : {};
90
- const aiFilesValue =
91
- base.aiFiles !== null &&
92
- typeof base.aiFiles === "object" &&
93
- !Array.isArray(base.aiFiles)
94
- ? (base.aiFiles as Record<string, unknown>)
95
- : {};
96
- const { $schema, ...rest } = base;
97
- // Remove legacy keys on every write.
98
- const { disableStalenessMessage: _legacy, ...restAiFiles } = aiFilesValue;
99
- const next: Record<string, unknown> = {
100
- $schema: $schema ?? "node_modules/convex/schemas/convex.schema.json",
101
- ...rest,
102
- aiFiles: { ...restAiFiles, enabled },
103
- };
104
- await fs.writeFile(filePath, JSON.stringify(next, null, 2) + "\n", "utf8");
105
- }
106
-
107
- export async function readAiConfig({
108
- projectDir,
109
- convexDir,
110
- }: {
111
- projectDir: string;
112
- convexDir: string;
113
- }): Promise<AiFilesConfig | null> {
114
- const enabled = await readAiEnabledFromProjectConfig(projectDir);
115
- const rawState = await readFileSafe(aiFilesStatePathForConvexDir(convexDir));
116
- if (rawState === null) {
117
- // No state file means AI files are not installed, unless the user has
118
- // explicitly disabled in convex.json.
119
- return !enabled ? { ...EMPTY_AI_STATE, enabled } : null;
120
- }
121
- try {
122
- const state = aiFilesStateSchema.parse(JSON.parse(rawState));
123
- return { ...state, enabled };
124
- } catch (err) {
125
- Sentry.captureException(err);
126
- return null;
127
- }
128
- }
129
-
130
- export async function hasAiFilesConfig({
131
- projectDir,
132
- convexDir,
133
- }: {
134
- projectDir: string;
135
- convexDir: string;
136
- }): Promise<boolean> {
137
- if (!(await readAiEnabledFromProjectConfig(projectDir))) {
138
- return true;
139
- }
140
- try {
141
- const rawState = await fs.readFile(
142
- aiFilesStatePathForConvexDir(convexDir),
143
- "utf8",
144
- );
145
- aiFilesStateSchema.parse(JSON.parse(rawState));
146
- return true;
147
- } catch (err) {
148
- if ((err as NodeJS.ErrnoException).code !== "ENOENT") {
149
- Sentry.captureException(err);
150
- }
151
- return false;
152
- }
153
- }
154
-
155
- export async function writeAiConfig({
156
- config,
157
- projectDir,
158
- convexDir,
159
- options,
160
- }: {
161
- config: AiFilesConfig;
162
- projectDir: string;
163
- convexDir: string;
164
- options?: { persistEnabledPreference?: "ifFalse" | "always" | "never" };
165
- }): Promise<void> {
166
- const state = aiFilesStateSchema.parse({
167
- guidelinesHash: config.guidelinesHash,
168
- agentsMdSectionHash: config.agentsMdSectionHash,
169
- claudeMdHash: config.claudeMdHash,
170
- agentSkillsSha: config.agentSkillsSha,
171
- installedSkillNames: config.installedSkillNames,
172
- });
173
- await fs.writeFile(
174
- aiFilesStatePathForConvexDir(convexDir),
175
- JSON.stringify(state, null, 2) + "\n",
176
- "utf8",
177
- );
178
-
179
- const persistMode = options?.persistEnabledPreference ?? "ifFalse";
180
- if (
181
- persistMode === "always" ||
182
- (persistMode === "ifFalse" && !config.enabled)
183
- )
184
- await writeAiEnabledToProjectConfig({
185
- projectDir,
186
- enabled: config.enabled,
187
- });
188
- }
@@ -1,10 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Read(//Users/ianmacartney/src/convex-core/npm-packages/convex/**)",
5
- "Bash(npx vitest:*)"
6
- ],
7
- "deny": [],
8
- "ask": []
9
- }
10
- }