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,10 +1,23 @@
1
- import { vi, test, expect, beforeEach, MockInstance, beforeAll } from "vitest";
1
+ import {
2
+ vi,
3
+ test,
4
+ expect,
5
+ beforeEach,
6
+ afterEach,
7
+ describe,
8
+ MockInstance,
9
+ beforeAll,
10
+ } from "vitest";
11
+ import fs from "fs";
12
+ import os from "os";
13
+ import path from "path";
2
14
  import {
3
15
  parseProjectConfig,
4
- ProjectConfig,
5
- writeProjectConfig,
16
+ type ProjectConfig,
17
+ ensureConvexFunctionsDir,
6
18
  readProjectConfig,
7
19
  resetUnknownKeyWarnings,
20
+ writeAiFilesConfig,
8
21
  } from "./config.js";
9
22
  import { Context, oneoffContext } from "../../bundler/context.js";
10
23
  import { logFailure } from "../../bundler/log.js";
@@ -250,7 +263,7 @@ test("parseProjectConfig - top-level validation", async () => {
250
263
  );
251
264
  });
252
265
 
253
- test("writeProjectConfig - creates functions directory", async () => {
266
+ test("ensureConvexFunctionsDir - creates functions directory", async () => {
254
267
  let mkdirCalled = false;
255
268
  let mkdirPath = "";
256
269
  const testCtx = {
@@ -272,12 +285,12 @@ test("writeProjectConfig - creates functions directory", async () => {
272
285
  codegen: { staticApi: false, staticDataModel: false },
273
286
  };
274
287
 
275
- await writeProjectConfig(testCtx, config);
288
+ await ensureConvexFunctionsDir(testCtx, config);
276
289
  expect(mkdirCalled).toBe(true);
277
290
  expect(mkdirPath).toMatch(/^my-functions[\\/]$/);
278
291
  });
279
292
 
280
- test("writeProjectConfig - does not write to convex.json", async () => {
293
+ test("ensureConvexFunctionsDir - does not write to convex.json", async () => {
281
294
  let writeUtf8FileCalled = false;
282
295
  const testCtx = {
283
296
  ...ctx,
@@ -299,7 +312,7 @@ test("writeProjectConfig - does not write to convex.json", async () => {
299
312
  codegen: { staticApi: true, staticDataModel: true },
300
313
  };
301
314
 
302
- await writeProjectConfig(testCtx, config);
315
+ await ensureConvexFunctionsDir(testCtx, config);
303
316
  expect(writeUtf8FileCalled).toBe(false);
304
317
  });
305
318
 
@@ -431,6 +444,39 @@ test("parseProjectConfig - warns about unknown properties", async () => {
431
444
  expect(stripVTControlCharacters(stderr5)).not.toContain("Unknown");
432
445
  });
433
446
 
447
+ test("parseProjectConfig - aiFiles fields", async () => {
448
+ await assertParses(
449
+ {
450
+ functions: "convex/",
451
+ aiFiles: {
452
+ enabled: false,
453
+ disableStalenessMessage: true,
454
+ skills: {
455
+ agents: ["cursor", "windsurf"],
456
+ },
457
+ },
458
+ },
459
+ {
460
+ functions: "convex/",
461
+ aiFiles: {
462
+ enabled: false,
463
+ disableStalenessMessage: true,
464
+ skills: {
465
+ agents: ["cursor", "windsurf"],
466
+ },
467
+ },
468
+ codegen: {
469
+ staticApi: false,
470
+ staticDataModel: false,
471
+ },
472
+ generateCommonJSApi: false,
473
+ node: {
474
+ externalPackages: [],
475
+ },
476
+ },
477
+ );
478
+ });
479
+
434
480
  // AuthKit configuration tests
435
481
  test("parseProjectConfig - authKit basic valid configs", async () => {
436
482
  // Basic config with no settings
@@ -850,3 +896,134 @@ test("parseProjectConfig - authKit preview and prod restrictions", async () => {
850
896
  },
851
897
  );
852
898
  });
899
+
900
+ // ---------------------------------------------------------------------------
901
+ // writeAiFilesConfig
902
+ // ---------------------------------------------------------------------------
903
+
904
+ describe("writeAiFilesConfig", () => {
905
+ let tmpDir: string;
906
+
907
+ beforeEach(() => {
908
+ tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
909
+ });
910
+
911
+ afterEach(() => {
912
+ fs.rmSync(tmpDir, { recursive: true, force: true });
913
+ });
914
+
915
+ test("creates convex.json with $schema when file does not exist", async () => {
916
+ await writeAiFilesConfig({
917
+ projectDir: tmpDir,
918
+ aiFiles: { enabled: false },
919
+ });
920
+
921
+ const written = JSON.parse(
922
+ fs.readFileSync(path.join(tmpDir, "convex.json"), "utf8"),
923
+ );
924
+ expect(written.$schema).toBe(
925
+ "node_modules/convex/schemas/convex.schema.json",
926
+ );
927
+ expect(written.aiFiles).toEqual({ enabled: false });
928
+ });
929
+
930
+ test("writes aiFiles as-is without merging sub-keys", async () => {
931
+ fs.writeFileSync(
932
+ path.join(tmpDir, "convex.json"),
933
+ JSON.stringify({ aiFiles: { disableStalenessMessage: true } }, null, 2),
934
+ "utf8",
935
+ );
936
+
937
+ await writeAiFilesConfig({
938
+ projectDir: tmpDir,
939
+ aiFiles: { enabled: false },
940
+ });
941
+
942
+ const written = JSON.parse(
943
+ fs.readFileSync(path.join(tmpDir, "convex.json"), "utf8"),
944
+ );
945
+ expect(written.aiFiles).toEqual({ enabled: false });
946
+ });
947
+
948
+ test("preserves other existing fields in convex.json", async () => {
949
+ fs.writeFileSync(
950
+ path.join(tmpDir, "convex.json"),
951
+ JSON.stringify(
952
+ {
953
+ functions: "src/convex/",
954
+ customKey: "preserved",
955
+ aiFiles: { skills: { agents: ["cursor"] } },
956
+ },
957
+ null,
958
+ 2,
959
+ ),
960
+ "utf8",
961
+ );
962
+
963
+ await writeAiFilesConfig({
964
+ projectDir: tmpDir,
965
+ aiFiles: { enabled: false },
966
+ });
967
+
968
+ const written = JSON.parse(
969
+ fs.readFileSync(path.join(tmpDir, "convex.json"), "utf8"),
970
+ );
971
+ expect(written.functions).toBe("src/convex/");
972
+ expect(written.customKey).toBe("preserved");
973
+ expect(written.aiFiles).toEqual({ enabled: false });
974
+ });
975
+
976
+ test("removes aiFiles key when undefined", async () => {
977
+ fs.writeFileSync(
978
+ path.join(tmpDir, "convex.json"),
979
+ JSON.stringify({ aiFiles: { enabled: false } }, null, 2),
980
+ "utf8",
981
+ );
982
+
983
+ await writeAiFilesConfig({
984
+ projectDir: tmpDir,
985
+ aiFiles: undefined,
986
+ });
987
+
988
+ const written = JSON.parse(
989
+ fs.readFileSync(path.join(tmpDir, "convex.json"), "utf8"),
990
+ );
991
+ expect(written.aiFiles).toBeUndefined();
992
+ });
993
+
994
+ test("preserves existing $schema when file already has one", async () => {
995
+ fs.writeFileSync(
996
+ path.join(tmpDir, "convex.json"),
997
+ JSON.stringify({ $schema: "./custom-schema.json" }, null, 2),
998
+ "utf8",
999
+ );
1000
+
1001
+ await writeAiFilesConfig({
1002
+ projectDir: tmpDir,
1003
+ aiFiles: undefined,
1004
+ });
1005
+
1006
+ const written = JSON.parse(
1007
+ fs.readFileSync(path.join(tmpDir, "convex.json"), "utf8"),
1008
+ );
1009
+ expect(written.$schema).toBe("./custom-schema.json");
1010
+ });
1011
+
1012
+ test("handles invalid JSON in existing convex.json gracefully", async () => {
1013
+ fs.writeFileSync(
1014
+ path.join(tmpDir, "convex.json"),
1015
+ "not valid json",
1016
+ "utf8",
1017
+ );
1018
+
1019
+ await writeAiFilesConfig({
1020
+ projectDir: tmpDir,
1021
+ aiFiles: { enabled: false },
1022
+ });
1023
+
1024
+ const written = JSON.parse(
1025
+ fs.readFileSync(path.join(tmpDir, "convex.json"), "utf8"),
1026
+ );
1027
+ expect(written.aiFiles).toEqual({ enabled: false });
1028
+ });
1029
+ });
@@ -1,5 +1,7 @@
1
1
  import { chalkStderr } from "chalk";
2
2
  import path from "path";
3
+ // eslint-disable-next-line no-restricted-imports
4
+ import { promises as nodeFs } from "fs";
3
5
  import { z } from "zod";
4
6
  import { Context } from "../../bundler/context.js";
5
7
  import { TypescriptCompiler } from "./typecheck.js";
@@ -106,6 +108,12 @@ export interface ProjectConfig {
106
108
  enabled?: boolean;
107
109
  // @deprecated use `enabled` instead.
108
110
  disableStalenessMessage?: boolean;
111
+ // Configuration for agent skills installed by Convex.
112
+ skills?: {
113
+ // List of agents to install skills for (e.g. 'claude-code', 'codex', 'cursor').
114
+ // Defaults to ['claude-code', 'codex'].
115
+ agents?: string[];
116
+ };
109
117
  };
110
118
  }
111
119
 
@@ -133,9 +141,9 @@ export function usesTypeScriptCodegen(projectConfig: ProjectConfig): boolean {
133
141
  return projectConfig.codegen.fileType === "ts";
134
142
  }
135
143
 
136
- /** Whether the new component API import style should be used (default is false) */
144
+ /** Whether the new component API import style should be used */
137
145
  export function usesComponentApiImports(projectConfig: ProjectConfig): boolean {
138
- return projectConfig.codegen.legacyComponentApi === false;
146
+ return projectConfig.codegen.legacyComponentApi !== true;
139
147
  }
140
148
 
141
149
  /**
@@ -293,6 +301,11 @@ const BundlerSchema = z.object({
293
301
  const AiFilesSchema = z.object({
294
302
  enabled: z.boolean().optional(),
295
303
  disableStalenessMessage: z.boolean().optional(),
304
+ skills: z
305
+ .object({
306
+ agents: z.array(z.string()).optional(),
307
+ })
308
+ .optional(),
296
309
  });
297
310
 
298
311
  const refineToObject = <T extends z.ZodTypeAny>(schema: T) =>
@@ -744,12 +757,10 @@ export async function readConfig(
744
757
  /**
745
758
  * Ensure the functions directory exists.
746
759
  *
747
- * Note: This function no longer writes to or deletes `convex.json`. The config
748
- * file is now treated as user-owned and is not modified by the CLI. This allows
749
- * users to maintain their preferred formatting and any comments they may add
750
- * (if we later support JSONC parsing).
760
+ * Note: convex.json is treated as user-owned and is not modified by the CLI.
761
+ * Use writeAiFilesConfig() to explicitly patch the aiFiles section.
751
762
  */
752
- export async function writeProjectConfig(
763
+ export async function ensureConvexFunctionsDir(
753
764
  ctx: Context,
754
765
  projectConfig: ProjectConfig,
755
766
  ) {
@@ -1007,3 +1018,52 @@ export async function handlePushConfigError(
1007
1018
  logFailure(defaultMessage);
1008
1019
  return await logAndHandleFetchError(ctx, error);
1009
1020
  }
1021
+
1022
+ export type AiFilesProjectConfig = NonNullable<ProjectConfig["aiFiles"]>;
1023
+
1024
+ function tryParseJson(raw: string): unknown {
1025
+ try {
1026
+ return JSON.parse(raw);
1027
+ } catch {
1028
+ return {};
1029
+ }
1030
+ }
1031
+
1032
+ function toRecord(val: unknown): Record<string, unknown> {
1033
+ if (val !== null && typeof val === "object" && !Array.isArray(val))
1034
+ return val as Record<string, unknown>;
1035
+ return {};
1036
+ }
1037
+
1038
+ /**
1039
+ * Write the `aiFiles` section of `convex.json`, preserving all other keys.
1040
+ * Writes the given object as-is with no merging or default logic.
1041
+ * If `aiFiles` is undefined, the key is removed from the file.
1042
+ */
1043
+ export async function writeAiFilesConfig({
1044
+ projectDir,
1045
+ aiFiles,
1046
+ }: {
1047
+ projectDir: string;
1048
+ aiFiles: AiFilesProjectConfig | undefined;
1049
+ }): Promise<void> {
1050
+ const filePath = path.join(projectDir, "convex.json");
1051
+ const raw = await nodeFs.readFile(filePath, "utf8").catch(() => null);
1052
+ const base = toRecord(raw !== null ? tryParseJson(raw) : {});
1053
+
1054
+ const { $schema, aiFiles: _existing, ...rest } = base;
1055
+
1056
+ const hasContent = aiFiles !== undefined && Object.keys(aiFiles).length > 0;
1057
+
1058
+ const next: Record<string, unknown> = {
1059
+ $schema: $schema ?? "node_modules/convex/schemas/convex.schema.json",
1060
+ ...rest,
1061
+ ...(hasContent ? { aiFiles } : {}),
1062
+ };
1063
+
1064
+ await nodeFs.writeFile(
1065
+ filePath,
1066
+ JSON.stringify(next, null, 2) + "\n",
1067
+ "utf8",
1068
+ );
1069
+ }
@@ -8,7 +8,11 @@ import {
8
8
  showSpinner,
9
9
  } from "../../bundler/log.js";
10
10
  import { spawnSync } from "child_process";
11
- import { deploymentFetch, logAndHandleFetchError } from "./utils/utils.js";
11
+ import {
12
+ deploymentFetch,
13
+ logAndHandleFetchError,
14
+ typedDeploymentClient,
15
+ } from "./utils/utils.js";
12
16
  import {
13
17
  EvaluatePushResponse,
14
18
  evaluatePushResponse,
@@ -31,7 +35,6 @@ import { PushOptions } from "./components.js";
31
35
  import { DeploymentType } from "./api.js";
32
36
  import { runPush } from "./components.js";
33
37
  import { suggestedEnvVarNames } from "./envvars.js";
34
- import { runSystemQuery } from "./run.js";
35
38
  import {
36
39
  handlePushConfigError,
37
40
  readProjectConfig,
@@ -40,7 +43,6 @@ import {
40
43
  import { deploymentDashboardUrlPage } from "./dashboard.js";
41
44
  import { addProgressLinkIfSlow } from "./indexes.js";
42
45
  import { ensureAuthKitProvisionedBeforeBuild } from "./workos/workos.js";
43
- import { fetchDeploymentCanonicalSiteUrl } from "./env.js";
44
46
 
45
47
  const brotli = promisify(zlib.brotliCompress);
46
48
 
@@ -485,14 +487,10 @@ export async function runCommand(
485
487
  deploymentUrl: options.url,
486
488
  adminKey: options.adminKey,
487
489
  };
488
- const canonicalCloudUrl = await fetchDeploymentCanonicalCloudUrl(
489
- ctx,
490
- deployment,
491
- );
492
- const canonicalSiteUrl = await fetchDeploymentCanonicalSiteUrl(
493
- ctx,
494
- deployment,
495
- );
490
+ const {
491
+ convexCloudUrl: canonicalCloudUrl,
492
+ convexSiteUrl: canonicalSiteUrl,
493
+ } = await fetchDeploymentCanonicalUrls(ctx, deployment);
496
494
 
497
495
  const env = { ...process.env };
498
496
  env[urlVar] = canonicalCloudUrl;
@@ -517,22 +515,11 @@ export async function runCommand(
517
515
  );
518
516
  }
519
517
 
520
- export async function fetchDeploymentCanonicalCloudUrl(
518
+ export async function fetchDeploymentCanonicalUrls(
521
519
  ctx: Context,
522
520
  options: { deploymentUrl: string; adminKey: string },
523
- ): Promise<string> {
524
- const result = await runSystemQuery(ctx, {
525
- ...options,
526
- functionName: "_system/cli/convexUrl:cloudUrl",
527
- componentPath: undefined,
528
- args: {},
529
- });
530
- if (typeof result !== "string") {
531
- return await ctx.crash({
532
- exitCode: 1,
533
- errorType: "invalid filesystem or env vars",
534
- printedMessage: "Invalid process.env.CONVEX_CLOUD_URL",
535
- });
536
- }
537
- return result;
521
+ ): Promise<{ convexCloudUrl: string; convexSiteUrl: string }> {
522
+ const client = typedDeploymentClient(ctx, options);
523
+ const result = await client.GET("/get_canonical_urls");
524
+ return result.data!;
538
525
  }
@@ -12,7 +12,10 @@ export const componentArgumentValidator = looseObject({
12
12
  });
13
13
 
14
14
  export const componentDefinitionType = z.union([
15
- looseObject({ type: z.literal("app") }),
15
+ looseObject({
16
+ type: z.literal("app"),
17
+ httpPrefix: z.string().optional(),
18
+ }),
16
19
  looseObject({
17
20
  type: z.literal("childComponent"),
18
21
  name: identifier,
@@ -8,6 +8,7 @@ import {
8
8
  deploymentSelectionWithinProjectFromOptions,
9
9
  DeploymentType,
10
10
  fetchTeamAndProjectForKey,
11
+ getTeamAndProjectSlugForDeployment,
11
12
  validateDeploymentSelectionForExistingDeployment,
12
13
  } from "./api.js";
13
14
  import {
@@ -21,6 +22,8 @@ import {
21
22
  stripDeploymentTypePrefix,
22
23
  } from "./deployment.js";
23
24
  import { parseDeploymentSelector } from "./deploymentSelector.js";
25
+ import { loadProjectLocalConfig } from "./localDeployment/filePaths.js";
26
+ import { chalkStderr } from "chalk";
24
27
  import { getBuildEnvironment } from "./envvars.js";
25
28
  import { readGlobalConfig } from "./utils/globalConfig.js";
26
29
  import {
@@ -381,9 +384,9 @@ async function _getDeploymentSelection(
381
384
  };
382
385
  }
383
386
 
384
- // If --deployment is a fully qualified selector (team:project:ref or a
385
- // deployment name), we don't need a current project context — handle it
386
- // before env var resolution.
387
+ // If --deployment is a fully qualified selector (team:project:ref,
388
+ // deployment name, or "local"), we don't need a current project context
389
+ // → handle it before env var resolution.
387
390
  if (cliArgs.deployment !== undefined) {
388
391
  const parsed = parseDeploymentSelector(cliArgs.deployment);
389
392
  if (parsed.kind === "inTeamProject") {
@@ -414,6 +417,25 @@ async function _getDeploymentSelection(
414
417
  },
415
418
  };
416
419
  }
420
+ if (parsed.kind === "local") {
421
+ const localConfig = loadProjectLocalConfig(ctx);
422
+ if (localConfig !== null) {
423
+ return {
424
+ kind: "deploymentWithinProject",
425
+ targetProject: {
426
+ kind: "deploymentName",
427
+ deploymentName: localConfig.deploymentName,
428
+ deploymentType: "local",
429
+ },
430
+ selectionWithinProject,
431
+ };
432
+ }
433
+ return ctx.crash({
434
+ exitCode: 1,
435
+ errorType: "fatal",
436
+ printedMessage: `No local deployment found. Run ${chalkStderr.bold("npx convex deployment create local")} to create one.`,
437
+ });
438
+ }
417
439
  }
418
440
 
419
441
  if (cliArgs.envFile !== undefined) {
@@ -467,10 +489,12 @@ async function _getDeploymentSelection(
467
489
  }
468
490
  // none of these?
469
491
 
470
- // Check if they're logged in
471
492
  const isLoggedIn = ctx.bigBrainAuth() !== null;
472
493
  if (
473
- (!isLoggedIn || process.env.CONVEX_AGENT_MODE === "anonymous") &&
494
+ (!isLoggedIn ||
495
+ process.env.CONVEX_AGENT_MODE === "anonymous" ||
496
+ !process.stdin.isTTY) &&
497
+ !cliArgs.implicitProd &&
474
498
  shouldAllowAnonymousDevelopment()
475
499
  ) {
476
500
  return {
@@ -654,6 +678,16 @@ async function getDeploymentSelectionFromEnv(
654
678
  };
655
679
  }
656
680
 
681
+ // Overwrite the selection within project
682
+ const newSelectionWithinProject =
683
+ selectionWithinProject.kind === "unspecified" &&
684
+ // Fetching local deployment credentials uses the "unspecified" code path
685
+ targetDeploymentType !== "local"
686
+ ? {
687
+ kind: "deploymentName" as const,
688
+ deploymentName: targetDeploymentName,
689
+ }
690
+ : selectionWithinProject;
657
691
  return {
658
692
  kind: "success",
659
693
  metadata: {
@@ -663,7 +697,7 @@ async function getDeploymentSelectionFromEnv(
663
697
  deploymentName: targetDeploymentName,
664
698
  deploymentType: targetDeploymentType,
665
699
  },
666
- selectionWithinProject,
700
+ selectionWithinProject: newSelectionWithinProject,
667
701
  },
668
702
  };
669
703
  }
@@ -753,6 +787,25 @@ export async function getProjectDetails(
753
787
  ): Promise<PlatformProjectDetails> {
754
788
  switch (projectSelection.kind) {
755
789
  case "deploymentName": {
790
+ if (projectSelection.deploymentType === "local") {
791
+ const result = await getTeamAndProjectSlugForDeployment(ctx, {
792
+ deploymentName: projectSelection.deploymentName,
793
+ });
794
+ if (result === null) {
795
+ return ctx.crash({
796
+ exitCode: 1,
797
+ errorType: "fatal",
798
+ printedMessage:
799
+ "You don't have access to the selected project. Run `npx convex dev` to select a different project.",
800
+ });
801
+ }
802
+ return await getProjectDetails(ctx, {
803
+ kind: "teamAndProjectSlugs",
804
+ teamSlug: result.teamSlug,
805
+ projectSlug: result.projectSlug,
806
+ });
807
+ }
808
+
756
809
  const deployment = (
757
810
  await typedPlatformClient(ctx).GET("/deployments/{deployment_name}", {
758
811
  params: {
@@ -16,6 +16,12 @@ describe("parseDeploymentSelector", () => {
16
16
  });
17
17
  });
18
18
 
19
+ test('"local"', () => {
20
+ expect(parseDeploymentSelector("local")).toEqual({
21
+ kind: "local",
22
+ });
23
+ });
24
+
19
25
  test('"tall-forest-123"', () => {
20
26
  expect(parseDeploymentSelector("tall-forest-123")).toEqual({
21
27
  kind: "deploymentName",
@@ -5,6 +5,7 @@ export type InProjectSelector =
5
5
 
6
6
  export type ParsedDeploymentSelector =
7
7
  | { kind: "deploymentName"; deploymentName: string }
8
+ | { kind: "local" }
8
9
  | { kind: "inCurrentProject"; selector: InProjectSelector }
9
10
  | { kind: "inProject"; projectSlug: string; selector: InProjectSelector }
10
11
  | {
@@ -26,6 +27,7 @@ function parseInProjectSelector(s: string): InProjectSelector {
26
27
  export function parseDeploymentSelector(
27
28
  selector: string,
28
29
  ): ParsedDeploymentSelector {
30
+ if (selector === "local") return { kind: "local" };
29
31
  if (/^[a-z]+-[a-z]+-[0-9]+$/.test(selector)) {
30
32
  return { kind: "deploymentName", deploymentName: selector };
31
33
  }