convex 1.34.1 → 1.35.1

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 (453) hide show
  1. package/CHANGELOG.md +86 -43
  2. package/dist/browser.bundle.js +1 -1
  3. package/dist/browser.bundle.js.map +1 -1
  4. package/dist/cjs/cli/aiFiles.js +31 -13
  5. package/dist/cjs/cli/aiFiles.js.map +3 -3
  6. package/dist/cjs/cli/configure.js +21 -24
  7. package/dist/cjs/cli/configure.js.map +2 -2
  8. package/dist/cjs/cli/deploy.js +8 -9
  9. package/dist/cjs/cli/deploy.js.map +2 -2
  10. package/dist/cjs/cli/deploymentCreate.js +225 -40
  11. package/dist/cjs/cli/deploymentCreate.js.map +3 -3
  12. package/dist/cjs/cli/deploymentSelect.js +14 -13
  13. package/dist/cjs/cli/deploymentSelect.js.map +2 -2
  14. package/dist/cjs/cli/dev.js +30 -11
  15. package/dist/cjs/cli/dev.js.map +2 -2
  16. package/dist/cjs/cli/docs.js +1 -1
  17. package/dist/cjs/cli/docs.js.map +2 -2
  18. package/dist/cjs/cli/init.js +1 -1
  19. package/dist/cjs/cli/init.js.map +2 -2
  20. package/dist/cjs/cli/lib/aiFiles/agentsmd.js +14 -10
  21. package/dist/cjs/cli/lib/aiFiles/agentsmd.js.map +2 -2
  22. package/dist/cjs/cli/lib/aiFiles/claudemd.js +14 -10
  23. package/dist/cjs/cli/lib/aiFiles/claudemd.js.map +2 -2
  24. package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js +10 -3
  25. package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
  26. package/dist/cjs/cli/lib/aiFiles/index.js +70 -86
  27. package/dist/cjs/cli/lib/aiFiles/index.js.map +3 -3
  28. package/dist/cjs/cli/lib/aiFiles/skills.js +28 -12
  29. package/dist/cjs/cli/lib/aiFiles/skills.js.map +2 -2
  30. package/dist/cjs/cli/lib/aiFiles/state.js +96 -0
  31. package/dist/cjs/cli/lib/aiFiles/state.js.map +7 -0
  32. package/dist/cjs/cli/lib/aiFiles/status.js +31 -28
  33. package/dist/cjs/cli/lib/aiFiles/status.js.map +2 -2
  34. package/dist/cjs/cli/lib/aiFiles/utils.js +31 -14
  35. package/dist/cjs/cli/lib/aiFiles/utils.js.map +2 -2
  36. package/dist/cjs/cli/lib/api.js +70 -7
  37. package/dist/cjs/cli/lib/api.js.map +2 -2
  38. package/dist/cjs/cli/lib/command.js +4 -5
  39. package/dist/cjs/cli/lib/command.js.map +2 -2
  40. package/dist/cjs/cli/lib/config.js +41 -4
  41. package/dist/cjs/cli/lib/config.js.map +3 -3
  42. package/dist/cjs/cli/lib/deploy2.js +9 -26
  43. package/dist/cjs/cli/lib/deploy2.js.map +2 -2
  44. package/dist/cjs/cli/lib/deployApi/componentDefinition.js +4 -1
  45. package/dist/cjs/cli/lib/deployApi/componentDefinition.js.map +2 -2
  46. package/dist/cjs/cli/lib/deploymentSelection.js +45 -2
  47. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  48. package/dist/cjs/cli/lib/deploymentSelector.js +1 -0
  49. package/dist/cjs/cli/lib/deploymentSelector.js.map +2 -2
  50. package/dist/cjs/cli/lib/dev.js +162 -117
  51. package/dist/cjs/cli/lib/dev.js.map +2 -2
  52. package/dist/cjs/cli/lib/env.js +1 -13
  53. package/dist/cjs/cli/lib/env.js.map +2 -2
  54. package/dist/cjs/cli/lib/envvars.js +8 -1
  55. package/dist/cjs/cli/lib/envvars.js.map +2 -2
  56. package/dist/cjs/cli/lib/expiration.js +104 -0
  57. package/dist/cjs/cli/lib/expiration.js.map +7 -0
  58. package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
  59. package/dist/cjs/cli/lib/init.js +4 -3
  60. package/dist/cjs/cli/lib/init.js.map +2 -2
  61. package/dist/cjs/cli/lib/insights.js +1 -1
  62. package/dist/cjs/cli/lib/insights.js.map +2 -2
  63. package/dist/cjs/cli/lib/localDeployment/anonymous.js +14 -7
  64. package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +2 -2
  65. package/dist/cjs/cli/lib/localDeployment/localDeployment.js +8 -10
  66. package/dist/cjs/cli/lib/localDeployment/localDeployment.js.map +2 -2
  67. package/dist/cjs/cli/lib/localDeployment/run.js +1 -0
  68. package/dist/cjs/cli/lib/localDeployment/run.js.map +2 -2
  69. package/dist/cjs/cli/lib/localDeployment/upgrade.js +2 -2
  70. package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +2 -2
  71. package/dist/cjs/cli/lib/localDeployment/utils.js +9 -0
  72. package/dist/cjs/cli/lib/localDeployment/utils.js.map +2 -2
  73. package/dist/cjs/cli/lib/mcp/tools/status.js +1 -1
  74. package/dist/cjs/cli/lib/mcp/tools/status.js.map +2 -2
  75. package/dist/cjs/cli/lib/updates.js +8 -9
  76. package/dist/cjs/cli/lib/updates.js.map +2 -2
  77. package/dist/cjs/cli/lib/usage.js +2 -1
  78. package/dist/cjs/cli/lib/usage.js.map +2 -2
  79. package/dist/cjs/cli/lib/utils/prompts.js +2 -1
  80. package/dist/cjs/cli/lib/utils/prompts.js.map +2 -2
  81. package/dist/cjs/cli/lib/utils/utils.js +46 -20
  82. package/dist/cjs/cli/lib/utils/utils.js.map +3 -3
  83. package/dist/cjs/index.js +1 -1
  84. package/dist/cjs/index.js.map +1 -1
  85. package/dist/cjs/react-clerk/ConvexProviderWithClerk.js.map +1 -1
  86. package/dist/cjs/server/components/definition.js.map +1 -1
  87. package/dist/cjs/server/components/index.js +40 -4
  88. package/dist/cjs/server/components/index.js.map +2 -2
  89. package/dist/cjs/server/data_model.js.map +1 -1
  90. package/dist/cjs/server/impl/meta_impl.js +78 -0
  91. package/dist/cjs/server/impl/meta_impl.js.map +7 -0
  92. package/dist/cjs/server/impl/registration_impl.js +16 -11
  93. package/dist/cjs/server/impl/registration_impl.js.map +2 -2
  94. package/dist/cjs/server/index.js.map +2 -2
  95. package/dist/cjs/server/meta.js +17 -0
  96. package/dist/cjs/server/meta.js.map +7 -0
  97. package/dist/cjs/server/registration.js.map +1 -1
  98. package/dist/cjs-types/cli/aiFiles.d.ts.map +1 -1
  99. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  100. package/dist/cjs-types/cli/configure.test.d.ts +2 -0
  101. package/dist/cjs-types/cli/configure.test.d.ts.map +1 -0
  102. package/dist/cjs-types/cli/deploy.d.ts.map +1 -1
  103. package/dist/cjs-types/cli/deploymentCreate.d.ts +1 -0
  104. package/dist/cjs-types/cli/deploymentCreate.d.ts.map +1 -1
  105. package/dist/cjs-types/cli/deploymentSelect.d.ts +2 -1
  106. package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
  107. package/dist/cjs-types/cli/dev.d.ts +3 -1
  108. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  109. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts +5 -5
  110. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -1
  111. package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts +5 -5
  112. package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -1
  113. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -3
  114. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
  115. package/dist/cjs-types/cli/lib/aiFiles/index.d.ts +20 -18
  116. package/dist/cjs-types/cli/lib/aiFiles/index.d.ts.map +1 -1
  117. package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts +6 -4
  118. package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
  119. package/dist/cjs-types/cli/lib/aiFiles/state.d.ts +38 -0
  120. package/dist/cjs-types/cli/lib/aiFiles/state.d.ts.map +1 -0
  121. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts +2 -0
  122. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
  123. package/dist/cjs-types/cli/lib/aiFiles/status.d.ts +4 -1
  124. package/dist/cjs-types/cli/lib/aiFiles/status.d.ts.map +1 -1
  125. package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts +13 -3
  126. package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts.map +1 -1
  127. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
  128. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
  129. package/dist/cjs-types/cli/lib/api.d.ts +3 -3
  130. package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
  131. package/dist/cjs-types/cli/lib/command.d.ts +2 -1
  132. package/dist/cjs-types/cli/lib/command.d.ts.map +1 -1
  133. package/dist/cjs-types/cli/lib/config.d.ts +17 -6
  134. package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
  135. package/dist/cjs-types/cli/lib/deploy2.d.ts +5 -2
  136. package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
  137. package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
  138. package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
  139. package/dist/cjs-types/cli/lib/deployApi/modules.d.ts +12 -12
  140. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +25 -16
  141. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
  142. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  143. package/dist/cjs-types/cli/lib/deploymentSelector.d.ts +2 -0
  144. package/dist/cjs-types/cli/lib/deploymentSelector.d.ts.map +1 -1
  145. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  146. package/dist/cjs-types/cli/lib/env.d.ts +0 -4
  147. package/dist/cjs-types/cli/lib/env.d.ts.map +1 -1
  148. package/dist/cjs-types/cli/lib/envvars.d.ts.map +1 -1
  149. package/dist/cjs-types/cli/lib/expiration.d.ts +35 -0
  150. package/dist/cjs-types/cli/lib/expiration.d.ts.map +1 -0
  151. package/dist/cjs-types/cli/lib/expiration.test.d.ts +2 -0
  152. package/dist/cjs-types/cli/lib/expiration.test.d.ts.map +1 -0
  153. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
  154. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  155. package/dist/cjs-types/cli/lib/init.d.ts.map +1 -1
  156. package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  157. package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  158. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts +15 -0
  159. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  160. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  161. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +7 -0
  162. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  163. package/dist/cjs-types/cli/lib/mcp/requestContext.d.ts +3 -3
  164. package/dist/cjs-types/cli/lib/updates.d.ts +4 -3
  165. package/dist/cjs-types/cli/lib/updates.d.ts.map +1 -1
  166. package/dist/cjs-types/cli/lib/usage.d.ts.map +1 -1
  167. package/dist/cjs-types/cli/lib/utils/prompts.d.ts +1 -0
  168. package/dist/cjs-types/cli/lib/utils/prompts.d.ts.map +1 -1
  169. package/dist/cjs-types/cli/lib/utils/utils.d.ts +16 -2
  170. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  171. package/dist/cjs-types/index.d.ts +1 -1
  172. package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
  173. package/dist/cjs-types/server/components/definition.d.ts +1 -0
  174. package/dist/cjs-types/server/components/definition.d.ts.map +1 -1
  175. package/dist/cjs-types/server/components/index.d.ts +5 -1
  176. package/dist/cjs-types/server/components/index.d.ts.map +1 -1
  177. package/dist/cjs-types/server/data_model.d.ts +2 -1
  178. package/dist/cjs-types/server/data_model.d.ts.map +1 -1
  179. package/dist/cjs-types/server/impl/meta_impl.d.ts +5 -0
  180. package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -0
  181. package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
  182. package/dist/cjs-types/server/index.d.ts +1 -0
  183. package/dist/cjs-types/server/index.d.ts.map +1 -1
  184. package/dist/cjs-types/server/meta.d.ts +72 -0
  185. package/dist/cjs-types/server/meta.d.ts.map +1 -0
  186. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  187. package/dist/cli.bundle.cjs +1665 -1215
  188. package/dist/cli.bundle.cjs.map +4 -4
  189. package/dist/esm/cli/aiFiles.js +33 -15
  190. package/dist/esm/cli/aiFiles.js.map +2 -2
  191. package/dist/esm/cli/configure.js +23 -26
  192. package/dist/esm/cli/configure.js.map +2 -2
  193. package/dist/esm/cli/deploy.js +12 -11
  194. package/dist/esm/cli/deploy.js.map +2 -2
  195. package/dist/esm/cli/deploymentCreate.js +238 -42
  196. package/dist/esm/cli/deploymentCreate.js.map +2 -2
  197. package/dist/esm/cli/deploymentSelect.js +13 -12
  198. package/dist/esm/cli/deploymentSelect.js.map +2 -2
  199. package/dist/esm/cli/dev.js +34 -13
  200. package/dist/esm/cli/dev.js.map +2 -2
  201. package/dist/esm/cli/docs.js +1 -1
  202. package/dist/esm/cli/docs.js.map +2 -2
  203. package/dist/esm/cli/init.js +2 -2
  204. package/dist/esm/cli/init.js.map +2 -2
  205. package/dist/esm/cli/lib/aiFiles/agentsmd.js +13 -9
  206. package/dist/esm/cli/lib/aiFiles/agentsmd.js.map +2 -2
  207. package/dist/esm/cli/lib/aiFiles/claudemd.js +13 -9
  208. package/dist/esm/cli/lib/aiFiles/claudemd.js.map +2 -2
  209. package/dist/esm/cli/lib/aiFiles/guidelinesmd.js +12 -5
  210. package/dist/esm/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
  211. package/dist/esm/cli/lib/aiFiles/index.js +72 -89
  212. package/dist/esm/cli/lib/aiFiles/index.js.map +2 -2
  213. package/dist/esm/cli/lib/aiFiles/skills.js +29 -13
  214. package/dist/esm/cli/lib/aiFiles/skills.js.map +2 -2
  215. package/dist/esm/cli/lib/aiFiles/state.js +60 -0
  216. package/dist/esm/cli/lib/aiFiles/state.js.map +7 -0
  217. package/dist/esm/cli/lib/aiFiles/status.js +32 -29
  218. package/dist/esm/cli/lib/aiFiles/status.js.map +2 -2
  219. package/dist/esm/cli/lib/aiFiles/utils.js +25 -10
  220. package/dist/esm/cli/lib/aiFiles/utils.js.map +2 -2
  221. package/dist/esm/cli/lib/api.js +70 -7
  222. package/dist/esm/cli/lib/api.js.map +2 -2
  223. package/dist/esm/cli/lib/command.js +4 -5
  224. package/dist/esm/cli/lib/command.js.map +2 -2
  225. package/dist/esm/cli/lib/config.js +39 -3
  226. package/dist/esm/cli/lib/config.js.map +2 -2
  227. package/dist/esm/cli/lib/deploy2.js +13 -26
  228. package/dist/esm/cli/lib/deploy2.js.map +2 -2
  229. package/dist/esm/cli/lib/deployApi/componentDefinition.js +4 -1
  230. package/dist/esm/cli/lib/deployApi/componentDefinition.js.map +2 -2
  231. package/dist/esm/cli/lib/deploymentSelection.js +46 -2
  232. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  233. package/dist/esm/cli/lib/deploymentSelector.js +1 -0
  234. package/dist/esm/cli/lib/deploymentSelector.js.map +2 -2
  235. package/dist/esm/cli/lib/dev.js +162 -118
  236. package/dist/esm/cli/lib/dev.js.map +2 -2
  237. package/dist/esm/cli/lib/env.js +0 -11
  238. package/dist/esm/cli/lib/env.js.map +2 -2
  239. package/dist/esm/cli/lib/envvars.js +8 -1
  240. package/dist/esm/cli/lib/envvars.js.map +2 -2
  241. package/dist/esm/cli/lib/expiration.js +80 -0
  242. package/dist/esm/cli/lib/expiration.js.map +7 -0
  243. package/dist/esm/cli/lib/init.js +4 -3
  244. package/dist/esm/cli/lib/init.js.map +2 -2
  245. package/dist/esm/cli/lib/insights.js +1 -1
  246. package/dist/esm/cli/lib/insights.js.map +2 -2
  247. package/dist/esm/cli/lib/localDeployment/anonymous.js +16 -9
  248. package/dist/esm/cli/lib/localDeployment/anonymous.js.map +2 -2
  249. package/dist/esm/cli/lib/localDeployment/localDeployment.js +9 -11
  250. package/dist/esm/cli/lib/localDeployment/localDeployment.js.map +2 -2
  251. package/dist/esm/cli/lib/localDeployment/run.js +1 -1
  252. package/dist/esm/cli/lib/localDeployment/run.js.map +2 -2
  253. package/dist/esm/cli/lib/localDeployment/upgrade.js +2 -2
  254. package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
  255. package/dist/esm/cli/lib/localDeployment/utils.js +8 -0
  256. package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
  257. package/dist/esm/cli/lib/mcp/tools/status.js +1 -1
  258. package/dist/esm/cli/lib/mcp/tools/status.js.map +2 -2
  259. package/dist/esm/cli/lib/updates.js +11 -9
  260. package/dist/esm/cli/lib/updates.js.map +2 -2
  261. package/dist/esm/cli/lib/usage.js +2 -1
  262. package/dist/esm/cli/lib/usage.js.map +2 -2
  263. package/dist/esm/cli/lib/utils/prompts.js +2 -1
  264. package/dist/esm/cli/lib/utils/prompts.js.map +2 -2
  265. package/dist/esm/cli/lib/utils/utils.js +45 -20
  266. package/dist/esm/cli/lib/utils/utils.js.map +3 -3
  267. package/dist/esm/index.js +1 -1
  268. package/dist/esm/index.js.map +1 -1
  269. package/dist/esm/react-clerk/ConvexProviderWithClerk.js.map +1 -1
  270. package/dist/esm/server/components/index.js +40 -4
  271. package/dist/esm/server/components/index.js.map +2 -2
  272. package/dist/esm/server/impl/meta_impl.js +54 -0
  273. package/dist/esm/server/impl/meta_impl.js.map +7 -0
  274. package/dist/esm/server/impl/registration_impl.js +20 -11
  275. package/dist/esm/server/impl/registration_impl.js.map +2 -2
  276. package/dist/esm/server/index.js.map +2 -2
  277. package/dist/esm/server/meta.js +2 -0
  278. package/dist/esm/server/meta.js.map +7 -0
  279. package/dist/esm-types/cli/aiFiles.d.ts.map +1 -1
  280. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  281. package/dist/esm-types/cli/configure.test.d.ts +2 -0
  282. package/dist/esm-types/cli/configure.test.d.ts.map +1 -0
  283. package/dist/esm-types/cli/deploy.d.ts.map +1 -1
  284. package/dist/esm-types/cli/deploymentCreate.d.ts +1 -0
  285. package/dist/esm-types/cli/deploymentCreate.d.ts.map +1 -1
  286. package/dist/esm-types/cli/deploymentSelect.d.ts +2 -1
  287. package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
  288. package/dist/esm-types/cli/dev.d.ts +3 -1
  289. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  290. package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts +5 -5
  291. package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -1
  292. package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts +5 -5
  293. package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -1
  294. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -3
  295. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
  296. package/dist/esm-types/cli/lib/aiFiles/index.d.ts +20 -18
  297. package/dist/esm-types/cli/lib/aiFiles/index.d.ts.map +1 -1
  298. package/dist/esm-types/cli/lib/aiFiles/skills.d.ts +6 -4
  299. package/dist/esm-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
  300. package/dist/esm-types/cli/lib/aiFiles/state.d.ts +38 -0
  301. package/dist/esm-types/cli/lib/aiFiles/state.d.ts.map +1 -0
  302. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts +2 -0
  303. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
  304. package/dist/esm-types/cli/lib/aiFiles/status.d.ts +4 -1
  305. package/dist/esm-types/cli/lib/aiFiles/status.d.ts.map +1 -1
  306. package/dist/esm-types/cli/lib/aiFiles/utils.d.ts +13 -3
  307. package/dist/esm-types/cli/lib/aiFiles/utils.d.ts.map +1 -1
  308. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
  309. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
  310. package/dist/esm-types/cli/lib/api.d.ts +3 -3
  311. package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
  312. package/dist/esm-types/cli/lib/command.d.ts +2 -1
  313. package/dist/esm-types/cli/lib/command.d.ts.map +1 -1
  314. package/dist/esm-types/cli/lib/config.d.ts +17 -6
  315. package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
  316. package/dist/esm-types/cli/lib/deploy2.d.ts +5 -2
  317. package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
  318. package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
  319. package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
  320. package/dist/esm-types/cli/lib/deployApi/modules.d.ts +12 -12
  321. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +25 -16
  322. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
  323. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  324. package/dist/esm-types/cli/lib/deploymentSelector.d.ts +2 -0
  325. package/dist/esm-types/cli/lib/deploymentSelector.d.ts.map +1 -1
  326. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  327. package/dist/esm-types/cli/lib/env.d.ts +0 -4
  328. package/dist/esm-types/cli/lib/env.d.ts.map +1 -1
  329. package/dist/esm-types/cli/lib/envvars.d.ts.map +1 -1
  330. package/dist/esm-types/cli/lib/expiration.d.ts +35 -0
  331. package/dist/esm-types/cli/lib/expiration.d.ts.map +1 -0
  332. package/dist/esm-types/cli/lib/expiration.test.d.ts +2 -0
  333. package/dist/esm-types/cli/lib/expiration.test.d.ts.map +1 -0
  334. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
  335. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  336. package/dist/esm-types/cli/lib/init.d.ts.map +1 -1
  337. package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  338. package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  339. package/dist/esm-types/cli/lib/localDeployment/run.d.ts +15 -0
  340. package/dist/esm-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  341. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  342. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +7 -0
  343. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  344. package/dist/esm-types/cli/lib/mcp/requestContext.d.ts +3 -3
  345. package/dist/esm-types/cli/lib/updates.d.ts +4 -3
  346. package/dist/esm-types/cli/lib/updates.d.ts.map +1 -1
  347. package/dist/esm-types/cli/lib/usage.d.ts.map +1 -1
  348. package/dist/esm-types/cli/lib/utils/prompts.d.ts +1 -0
  349. package/dist/esm-types/cli/lib/utils/prompts.d.ts.map +1 -1
  350. package/dist/esm-types/cli/lib/utils/utils.d.ts +16 -2
  351. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  352. package/dist/esm-types/index.d.ts +1 -1
  353. package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
  354. package/dist/esm-types/server/components/definition.d.ts +1 -0
  355. package/dist/esm-types/server/components/definition.d.ts.map +1 -1
  356. package/dist/esm-types/server/components/index.d.ts +5 -1
  357. package/dist/esm-types/server/components/index.d.ts.map +1 -1
  358. package/dist/esm-types/server/data_model.d.ts +2 -1
  359. package/dist/esm-types/server/data_model.d.ts.map +1 -1
  360. package/dist/esm-types/server/impl/meta_impl.d.ts +5 -0
  361. package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -0
  362. package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
  363. package/dist/esm-types/server/index.d.ts +1 -0
  364. package/dist/esm-types/server/index.d.ts.map +1 -1
  365. package/dist/esm-types/server/meta.d.ts +72 -0
  366. package/dist/esm-types/server/meta.d.ts.map +1 -0
  367. package/dist/esm-types/server/registration.d.ts.map +1 -1
  368. package/dist/react.bundle.js +1 -1
  369. package/dist/react.bundle.js.map +1 -1
  370. package/package.json +11 -7
  371. package/schemas/convex.schema.json +15 -2
  372. package/src/cli/aiFiles.ts +44 -14
  373. package/src/cli/configure.test.ts +138 -0
  374. package/src/cli/configure.ts +48 -47
  375. package/src/cli/deploy.ts +13 -10
  376. package/src/cli/deploymentCreate.test.ts +349 -14
  377. package/src/cli/deploymentCreate.ts +268 -41
  378. package/src/cli/deploymentSelect.test.ts +136 -27
  379. package/src/cli/deploymentSelect.ts +50 -41
  380. package/src/cli/deploymentSelection.test.ts +343 -35
  381. package/src/cli/dev.ts +49 -14
  382. package/src/cli/docs.ts +1 -1
  383. package/src/cli/init.ts +2 -2
  384. package/src/cli/lib/aiFiles/agentsmd.ts +15 -11
  385. package/src/cli/lib/aiFiles/claudemd.ts +15 -11
  386. package/src/cli/lib/aiFiles/guidelinesmd.test.ts +12 -2
  387. package/src/cli/lib/aiFiles/guidelinesmd.ts +15 -7
  388. package/src/cli/lib/aiFiles/index.test.ts +188 -222
  389. package/src/cli/lib/aiFiles/index.ts +119 -125
  390. package/src/cli/lib/aiFiles/integration.test.ts +112 -45
  391. package/src/cli/lib/aiFiles/prompt.test.ts +6 -6
  392. package/src/cli/lib/aiFiles/skills.ts +46 -16
  393. package/src/cli/lib/aiFiles/state.test.ts +280 -0
  394. package/src/cli/lib/aiFiles/state.ts +82 -0
  395. package/src/cli/lib/aiFiles/status.ts +45 -39
  396. package/src/cli/lib/aiFiles/utils.test.ts +50 -0
  397. package/src/cli/lib/aiFiles/utils.ts +38 -10
  398. package/src/cli/lib/api.ts +88 -7
  399. package/src/cli/lib/command.ts +12 -7
  400. package/src/cli/lib/config.test.ts +184 -7
  401. package/src/cli/lib/config.ts +67 -7
  402. package/src/cli/lib/deploy2.ts +14 -27
  403. package/src/cli/lib/deployApi/componentDefinition.ts +4 -1
  404. package/src/cli/lib/deploymentSelection.ts +59 -6
  405. package/src/cli/lib/deploymentSelector.test.ts +6 -0
  406. package/src/cli/lib/deploymentSelector.ts +2 -0
  407. package/src/cli/lib/dev.ts +202 -153
  408. package/src/cli/lib/env.ts +0 -15
  409. package/src/cli/lib/envvars.ts +16 -1
  410. package/src/cli/lib/expiration.test.ts +159 -0
  411. package/src/cli/lib/expiration.ts +124 -0
  412. package/src/cli/lib/generatedFunctionLogsApi.ts +16 -1
  413. package/src/cli/lib/init.ts +6 -2
  414. package/src/cli/lib/insights.ts +1 -1
  415. package/src/cli/lib/localDeployment/anonymous.ts +19 -9
  416. package/src/cli/lib/localDeployment/localDeployment.ts +9 -11
  417. package/src/cli/lib/localDeployment/run.ts +1 -1
  418. package/src/cli/lib/localDeployment/upgrade.ts +12 -10
  419. package/src/cli/lib/localDeployment/utils.ts +12 -0
  420. package/src/cli/lib/mcp/tools/status.ts +1 -1
  421. package/src/cli/lib/updates.test.ts +102 -75
  422. package/src/cli/lib/updates.ts +14 -12
  423. package/src/cli/lib/usage.ts +3 -1
  424. package/src/cli/lib/utils/prompts.ts +2 -0
  425. package/src/cli/lib/utils/utils.test.ts +6 -6
  426. package/src/cli/lib/utils/utils.ts +66 -27
  427. package/src/index.ts +1 -1
  428. package/src/react-clerk/ConvexProviderWithClerk.test.tsx +1 -1
  429. package/src/react-clerk/ConvexProviderWithClerk.tsx +1 -1
  430. package/src/server/components/definition.ts +3 -0
  431. package/src/server/components/index.ts +62 -5
  432. package/src/server/data_model.ts +2 -1
  433. package/src/server/impl/meta_impl.ts +74 -0
  434. package/src/server/impl/registration_impl.ts +21 -9
  435. package/src/server/index.ts +8 -0
  436. package/src/server/meta.ts +76 -0
  437. package/src/server/registration.ts +10 -0
  438. package/src/server/schema.test.ts +78 -1
  439. package/dist/cjs/cli/lib/aiFiles/config.js +0 -171
  440. package/dist/cjs/cli/lib/aiFiles/config.js.map +0 -7
  441. package/dist/cjs-types/cli/lib/aiFiles/config.d.ts +0 -46
  442. package/dist/cjs-types/cli/lib/aiFiles/config.d.ts.map +0 -1
  443. package/dist/cjs-types/cli/lib/aiFiles/config.test.d.ts +0 -2
  444. package/dist/cjs-types/cli/lib/aiFiles/config.test.d.ts.map +0 -1
  445. package/dist/esm/cli/lib/aiFiles/config.js +0 -135
  446. package/dist/esm/cli/lib/aiFiles/config.js.map +0 -7
  447. package/dist/esm-types/cli/lib/aiFiles/config.d.ts +0 -46
  448. package/dist/esm-types/cli/lib/aiFiles/config.d.ts.map +0 -1
  449. package/dist/esm-types/cli/lib/aiFiles/config.test.d.ts +0 -2
  450. package/dist/esm-types/cli/lib/aiFiles/config.test.d.ts.map +0 -1
  451. package/src/cli/lib/aiFiles/config.test.ts +0 -460
  452. package/src/cli/lib/aiFiles/config.ts +0 -188
  453. package/src/values/.claude/settings.local.json +0 -10
@@ -19,23 +19,25 @@ import {
19
19
  claudeMdPath,
20
20
  guidelinesPathForConvexDir,
21
21
  } from "./paths.js";
22
- import { type AiFilesConfig, readAiConfig } from "./config.js";
23
- import { readFileSafe } from "./utils.js";
22
+ import { type AiFilesState, attemptReadAiState } from "./state.js";
23
+ import { type AiFilesProjectConfig } from "../config.js";
24
+ import { isAiFilesDisabled } from "./index.js";
25
+ import { readFileOrNull } from "./utils.js";
24
26
 
25
27
  function logGuidelinesStatus({
26
28
  guidelinesFile,
27
29
  guidelinesRelPath,
28
- config,
30
+ state,
29
31
  canonicalGuidelinesHash,
30
32
  networkAvailable,
31
33
  }: {
32
34
  guidelinesFile: string | null;
33
35
  guidelinesRelPath: string;
34
- config: AiFilesConfig;
36
+ state: AiFilesState;
35
37
  canonicalGuidelinesHash: string | null;
36
38
  networkAvailable: boolean;
37
39
  }): void {
38
- if (guidelinesFile === null) {
40
+ if (guidelinesFile === null || guidelinesFile === "") {
39
41
  logMessage(
40
42
  ` ${chalkStderr.yellow("⚠")} ${guidelinesRelPath}: not on disk — run ${chalkStderr.bold("npx convex ai-files install")} to reinstall`,
41
43
  );
@@ -43,8 +45,8 @@ function logGuidelinesStatus({
43
45
  }
44
46
 
45
47
  const isLocallyModified =
46
- config.guidelinesHash !== null &&
47
- hashSha256(guidelinesFile) !== config.guidelinesHash;
48
+ state.guidelinesHash !== null &&
49
+ hashSha256(guidelinesFile) !== state.guidelinesHash;
48
50
 
49
51
  if (isLocallyModified) {
50
52
  logMessage(
@@ -56,8 +58,8 @@ function logGuidelinesStatus({
56
58
  const isOutOfDate =
57
59
  networkAvailable &&
58
60
  canonicalGuidelinesHash !== null &&
59
- config.guidelinesHash !== null &&
60
- config.guidelinesHash !== canonicalGuidelinesHash;
61
+ state.guidelinesHash !== null &&
62
+ state.guidelinesHash !== canonicalGuidelinesHash;
61
63
 
62
64
  if (isOutOfDate) {
63
65
  logMessage(
@@ -73,11 +75,11 @@ function logGuidelinesStatus({
73
75
 
74
76
  function logAgentsMdStatus({
75
77
  agentsContent,
76
- config,
78
+ state,
77
79
  convexDirName,
78
80
  }: {
79
81
  agentsContent: string | null;
80
- config: AiFilesConfig;
82
+ state: AiFilesState;
81
83
  convexDirName: string;
82
84
  }): void {
83
85
  const hasSection =
@@ -94,8 +96,8 @@ function logAgentsMdStatus({
94
96
 
95
97
  const currentHash = hashSha256(agentsMdConvexSection(convexDirName));
96
98
  if (
97
- config.agentsMdSectionHash !== null &&
98
- config.agentsMdSectionHash !== currentHash
99
+ state.agentsMdSectionHash !== null &&
100
+ state.agentsMdSectionHash !== currentHash
99
101
  ) {
100
102
  logMessage(
101
103
  ` ${chalkStderr.yellow("⚠")} AGENTS.md: Convex section out of date — run ${chalkStderr.bold("npx convex ai-files update")}`,
@@ -109,11 +111,11 @@ function logAgentsMdStatus({
109
111
 
110
112
  function logClaudeMdStatus({
111
113
  claudeContent,
112
- config,
114
+ state,
113
115
  convexDirName,
114
116
  }: {
115
117
  claudeContent: string | null;
116
- config: AiFilesConfig;
118
+ state: AiFilesState;
117
119
  convexDirName: string;
118
120
  }): void {
119
121
  const hasSection =
@@ -135,7 +137,7 @@ function logClaudeMdStatus({
135
137
  }
136
138
 
137
139
  const currentHash = hashSha256(claudeMdConvexSection(convexDirName));
138
- if (config.claudeMdHash !== null && config.claudeMdHash !== currentHash) {
140
+ if (state.claudeMdHash !== null && state.claudeMdHash !== currentHash) {
139
141
  logMessage(
140
142
  ` ${chalkStderr.yellow("⚠")} CLAUDE.md: Convex section out of date - run ${chalkStderr.bold("npx convex ai-files update")}`,
141
143
  );
@@ -147,27 +149,27 @@ function logClaudeMdStatus({
147
149
  }
148
150
 
149
151
  function logSkillsStatus({
150
- config,
152
+ state,
151
153
  canonicalAgentSkillsSha,
152
154
  networkAvailable,
153
155
  }: {
154
- config: AiFilesConfig;
156
+ state: AiFilesState;
155
157
  canonicalAgentSkillsSha: string | null;
156
158
  networkAvailable: boolean;
157
159
  }): void {
158
- if (config.installedSkillNames.length === 0) {
160
+ if (state.installedSkillNames.length === 0) {
159
161
  logMessage(
160
162
  ` ${chalkStderr.yellow("⚠")} Agent skills: not installed — run ${chalkStderr.bold("npx convex ai-files install")} to install`,
161
163
  );
162
164
  return;
163
165
  }
164
166
 
165
- const skillsList = config.installedSkillNames.join(", ");
167
+ const skillsList = state.installedSkillNames.join(", ");
166
168
  const isStale =
167
169
  networkAvailable &&
168
170
  canonicalAgentSkillsSha !== null &&
169
- config.agentSkillsSha !== null &&
170
- config.agentSkillsSha !== canonicalAgentSkillsSha;
171
+ state.agentSkillsSha !== null &&
172
+ state.agentSkillsSha !== canonicalAgentSkillsSha;
171
173
 
172
174
  if (isStale) {
173
175
  logMessage(
@@ -183,40 +185,44 @@ function logSkillsStatus({
183
185
  export async function statusAiFiles({
184
186
  projectDir,
185
187
  convexDir,
186
- }: AiFilesPaths): Promise<void> {
188
+ aiFilesConfig,
189
+ }: AiFilesPaths & {
190
+ aiFilesConfig?: AiFilesProjectConfig | undefined;
191
+ }): Promise<void> {
187
192
  const convexDirName = path.relative(projectDir, convexDir);
188
193
  const guidelinesRelPath = path.relative(
189
194
  projectDir,
190
195
  guidelinesPathForConvexDir(convexDir),
191
196
  );
192
197
 
193
- const config = await readAiConfig({ projectDir, convexDir });
194
-
195
- if (config === null) {
196
- logMessage(`Convex AI files: ${chalkStderr.yellow("not installed")}`);
198
+ if (isAiFilesDisabled(aiFilesConfig)) {
199
+ logMessage(`Convex AI files: ${chalkStderr.yellow("disabled")}`);
197
200
  logMessage(
198
- ` Run ${chalkStderr.bold("npx convex ai-files install")} to get started, ` +
199
- `or ${chalkStderr.bold("npx convex ai-files disable")} to opt out.`,
201
+ ` Run ${chalkStderr.bold("npx convex ai-files enable")} to re-enable.`,
200
202
  );
201
203
  return;
202
204
  }
203
205
 
204
- if (!config.enabled) {
205
- logMessage(`Convex AI files: ${chalkStderr.yellow("disabled")}`);
206
+ const stateResult = await attemptReadAiState(convexDir);
207
+
208
+ if (stateResult.kind !== "ok") {
209
+ logMessage(`Convex AI files: ${chalkStderr.yellow("not installed")}`);
206
210
  logMessage(
207
- ` Run ${chalkStderr.bold("npx convex ai-files enable")} to re-enable.`,
211
+ `Run ${chalkStderr.bold("npx convex ai-files install")} to get started.`,
208
212
  );
209
213
  return;
210
214
  }
211
215
 
216
+ const { state } = stateResult;
217
+
212
218
  logMessage(`Convex AI files: ${chalkStderr.green("enabled")}`);
213
219
 
214
220
  const [versionData, guidelinesFile, agentsContent, claudeContent] =
215
221
  await Promise.all([
216
222
  getVersion(),
217
- readFileSafe(guidelinesPathForConvexDir(convexDir)),
218
- readFileSafe(agentsMdPath(projectDir)),
219
- readFileSafe(claudeMdPath(projectDir)),
223
+ readFileOrNull(guidelinesPathForConvexDir(convexDir)),
224
+ readFileOrNull(agentsMdPath(projectDir)),
225
+ readFileOrNull(claudeMdPath(projectDir)),
220
226
  ]);
221
227
 
222
228
  const networkAvailable = versionData.kind === "ok";
@@ -230,11 +236,11 @@ export async function statusAiFiles({
230
236
  logGuidelinesStatus({
231
237
  guidelinesFile,
232
238
  guidelinesRelPath,
233
- config,
239
+ state,
234
240
  canonicalGuidelinesHash,
235
241
  networkAvailable,
236
242
  });
237
- logAgentsMdStatus({ agentsContent, config, convexDirName });
238
- logClaudeMdStatus({ claudeContent, config, convexDirName });
239
- logSkillsStatus({ config, canonicalAgentSkillsSha, networkAvailable });
243
+ logAgentsMdStatus({ agentsContent, state, convexDirName });
244
+ logClaudeMdStatus({ claudeContent, state, convexDirName });
245
+ logSkillsStatus({ state, canonicalAgentSkillsSha, networkAvailable });
240
246
  }
@@ -0,0 +1,50 @@
1
+ import { describe, test, expect, beforeEach, afterEach } from "vitest";
2
+ import fs from "fs";
3
+ import os from "os";
4
+ import path from "path";
5
+ import { attemptReadFile } from "./utils.js";
6
+
7
+ describe("attemptReadFile", () => {
8
+ let tmpDir: string;
9
+
10
+ beforeEach(() => {
11
+ tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
12
+ });
13
+
14
+ afterEach(() => {
15
+ fs.rmSync(tmpDir, { recursive: true, force: true });
16
+ });
17
+
18
+ test("returns content when the file has text", async () => {
19
+ const filePath = path.join(tmpDir, "content.txt");
20
+ fs.writeFileSync(filePath, "hello");
21
+
22
+ const result = await attemptReadFile(filePath);
23
+
24
+ expect(result).toEqual({ kind: "content", content: "hello" });
25
+ });
26
+
27
+ test("returns empty when the file exists but has no contents", async () => {
28
+ const filePath = path.join(tmpDir, "empty.txt");
29
+ fs.writeFileSync(filePath, "");
30
+
31
+ const result = await attemptReadFile(filePath);
32
+
33
+ expect(result).toEqual({ kind: "empty" });
34
+ });
35
+
36
+ test("returns not-found when the file does not exist", async () => {
37
+ const filePath = path.join(tmpDir, "missing.txt");
38
+
39
+ const result = await attemptReadFile(filePath);
40
+
41
+ expect(result).toEqual({ kind: "not-found" });
42
+ });
43
+
44
+ test("throws when fs.readFile fails for another reason", async () => {
45
+ const dirPath = path.join(tmpDir, "nested-dir");
46
+ fs.mkdirSync(dirPath);
47
+
48
+ await expect(attemptReadFile(dirPath)).rejects.toThrow();
49
+ });
50
+ });
@@ -8,14 +8,35 @@ export function isInInteractiveTerminal(): boolean {
8
8
  return process.stdin.isTTY === true;
9
9
  }
10
10
 
11
- export async function readFileSafe(filePath: string): Promise<string | null> {
11
+ export type ReadFileResult =
12
+ | { kind: "not-found" }
13
+ | { kind: "empty" }
14
+ | { kind: "content"; content: string };
15
+
16
+ export async function attemptReadFile(
17
+ filePath: string,
18
+ ): Promise<ReadFileResult> {
12
19
  try {
13
- return await fs.readFile(filePath, "utf8");
14
- } catch {
15
- return null;
20
+ const content = await fs.readFile(filePath, "utf8");
21
+ if (content.length === 0) return { kind: "empty" };
22
+ return { kind: "content", content };
23
+ } catch (error) {
24
+ if ((error as NodeJS.ErrnoException).code === "ENOENT")
25
+ return { kind: "not-found" };
26
+
27
+ // eslint-disable-next-line no-restricted-syntax
28
+ throw error;
16
29
  }
17
30
  }
18
31
 
32
+ export async function readFileOrNull(filePath: string): Promise<string | null> {
33
+ const result = await attemptReadFile(filePath);
34
+ if (result.kind === "content") return result.content;
35
+ if (result.kind === "empty") return "";
36
+ if (result.kind === "not-found") return null;
37
+ return exhaustiveCheck(result);
38
+ }
39
+
19
40
  /**
20
41
  * Attempt to delete a file. Returns `true` if the file was deleted,
21
42
  * `false` if it didn't exist or the deletion failed.
@@ -61,7 +82,7 @@ export async function injectManagedSection(
61
82
  ): Promise<InjectResult> {
62
83
  const { filePath, startMarker, endMarker, section } = opts;
63
84
 
64
- const existing = (await readFileSafe(filePath)) ?? "";
85
+ const existing = (await readFileOrNull(filePath)) ?? "";
65
86
 
66
87
  const startIdx = existing.indexOf(startMarker);
67
88
  const endIdx = existing.indexOf(endMarker);
@@ -95,12 +116,12 @@ export type StripResult = "none" | "section" | "file";
95
116
  * `"section"` if the section was stripped, or `"file"` if the entire
96
117
  * file was deleted.
97
118
  */
98
- export async function stripManagedSection(
119
+ export async function attemptToStripManagedSection(
99
120
  opts: ManagedSectionTarget,
100
121
  ): Promise<StripResult> {
101
122
  const { filePath, startMarker, endMarker } = opts;
102
123
 
103
- const content = await readFileSafe(filePath);
124
+ const content = await readFileOrNull(filePath);
104
125
  if (content === null) return "none";
105
126
 
106
127
  const startIdx = content.indexOf(startMarker);
@@ -122,7 +143,12 @@ export async function stripManagedSection(
122
143
  return "section";
123
144
  }
124
145
 
125
- export async function removeMarkdownSection({
146
+ export function exhaustiveCheck(_param: never): never {
147
+ // eslint-disable-next-line no-restricted-syntax
148
+ throw new Error("Internal error: exhaustive check failed.");
149
+ }
150
+
151
+ export async function attemptToRemoveMarkdownSection({
126
152
  projectDir,
127
153
  strip,
128
154
  fileName,
@@ -145,7 +171,9 @@ export async function removeMarkdownSection({
145
171
  return true;
146
172
  }
147
173
 
148
- return false;
174
+ if (result === "none") return false;
175
+
176
+ return exhaustiveCheck(result);
149
177
  }
150
178
 
151
179
  /**
@@ -154,7 +182,7 @@ export async function removeMarkdownSection({
154
182
  export async function hasManagedSection(
155
183
  opts: ManagedSectionTarget,
156
184
  ): Promise<boolean> {
157
- const content = await readFileSafe(opts.filePath);
185
+ const content = await readFileOrNull(opts.filePath);
158
186
  return (
159
187
  content !== null &&
160
188
  content.includes(opts.startMarker) &&
@@ -23,6 +23,7 @@ import {
23
23
  parseDeploymentSelector,
24
24
  InProjectSelector,
25
25
  } from "./deploymentSelector.js";
26
+ import { loadProjectLocalConfig } from "./localDeployment/filePaths.js";
26
27
  import { chalkStderr } from "chalk";
27
28
  export type DeploymentName = string;
28
29
  export type CloudDeploymentType = "prod" | "dev" | "preview" | "custom";
@@ -104,7 +105,7 @@ export const deploymentSelectionWithinProjectSchema = z.discriminatedUnion(
104
105
  z.object({ kind: z.literal("deploymentName"), deploymentName: z.string() }),
105
106
  z.object({ kind: z.literal("prod") }),
106
107
  z.object({ kind: z.literal("implicitProd") }),
107
- z.object({ kind: z.literal("ownDev") }),
108
+ z.object({ kind: z.literal("unspecified") }),
108
109
  z.object({
109
110
  kind: z.literal("deploymentSelector"),
110
111
  selector: z.string(),
@@ -152,7 +153,7 @@ export function deploymentSelectionWithinProjectFromOptions(
152
153
  if (options.implicitProd) {
153
154
  return { kind: "implicitProd" };
154
155
  }
155
- return { kind: "ownDev" };
156
+ return { kind: "unspecified" };
156
157
  }
157
158
 
158
159
  export async function validateDeploymentSelectionForExistingDeployment(
@@ -161,7 +162,7 @@ export async function validateDeploymentSelectionForExistingDeployment(
161
162
  source: "selfHosted" | "deployKey" | "cliArgs",
162
163
  ) {
163
164
  if (
164
- deploymentSelection.kind === "ownDev" ||
165
+ deploymentSelection.kind === "unspecified" ||
165
166
  deploymentSelection.kind === "implicitProd"
166
167
  ) {
167
168
  // These are both considered the "default" selection depending on the command, so this is always fine
@@ -421,6 +422,9 @@ async function fetchExistingDevDeploymentCredentialsOrCrash(
421
422
  // Helpers for `loadSelectedDeploymentCredentials`
422
423
  // ----------------------------------------------------------------------
423
424
 
425
+ // Returns the user's own dev deployment, which may be a local deployment
426
+ // if one is configured. Used for dev commands (including `npx convex dev`)
427
+ // when no specific deployment is specified.
424
428
  async function handleOwnDev(
425
429
  ctx: Context,
426
430
  projectSelection: ProjectSelection,
@@ -595,7 +599,9 @@ async function fetchDeploymentCredentialsWithinCurrentProject(
595
599
  deploymentType: DeploymentType;
596
600
  }> {
597
601
  switch (deploymentSelection.kind) {
598
- case "ownDev": {
602
+ case "unspecified": {
603
+ // default to the user's default dev deployment
604
+ // TODO: this currently also handles local dev, but that should probably be split out into a different DeploymenSelection kind
599
605
  return await handleOwnDev(ctx, projectSelection);
600
606
  }
601
607
  case "implicitProd":
@@ -659,7 +665,7 @@ async function resolveDeploymentNameByReference(
659
665
  return await ctx.crash({
660
666
  exitCode: 1,
661
667
  errorType: "fatal",
662
- printedMessage: `Deployment “${reference}” not found. To create a new deployment, use ${chalkStderr.bold(`npx convex deployment create ${reference} --team ${teamSlug} --project ${projectSlug} --select`)}`,
668
+ printedMessage: `Deployment “${reference}” not found. To create a new deployment, use ${chalkStderr.bold(`npx convex deployment create ${teamSlug}:${projectSlug}:${reference} --select`)}`,
663
669
  errForSentry: err,
664
670
  });
665
671
  }
@@ -678,8 +684,31 @@ async function handleRefInProject(
678
684
  deploymentType: DeploymentType;
679
685
  }> {
680
686
  switch (selector.kind) {
681
- case "dev":
682
- return await handleOwnDev(ctx, projectSelection);
687
+ case "dev": {
688
+ const access = await checkAccessToSelectedProject(ctx, projectSelection);
689
+ if (access.kind !== "hasAccess") {
690
+ return await ctx.crash({
691
+ exitCode: 1,
692
+ errorType: "fatal",
693
+ printedMessage:
694
+ "You don't have access to the selected project. Run `npx convex dev` to select a different project.",
695
+ });
696
+ }
697
+ const deploymentName = await resolveDefaultCloudDevDeploymentName(
698
+ ctx,
699
+ access.teamSlug,
700
+ access.projectSlug,
701
+ );
702
+ // Pass teamAndProjectSlugs instead of the original projectSelection,
703
+ // because handleDeploymentName sends projectSelection to Big Brain's
704
+ // authorize_within_current_project endpoint, which doesn't understand
705
+ // deploymentType "local".
706
+ return await handleDeploymentName(ctx, deploymentName, {
707
+ kind: "teamAndProjectSlugs",
708
+ teamSlug: access.teamSlug,
709
+ projectSlug: access.projectSlug,
710
+ });
711
+ }
683
712
  case "prod":
684
713
  return await handleProd(ctx, projectSelection);
685
714
  case "reference": {
@@ -721,6 +750,26 @@ async function handleDeploymentSelector(
721
750
  parsed.deploymentName,
722
751
  projectSelection,
723
752
  );
753
+ case "local": {
754
+ const localConfig = loadProjectLocalConfig(ctx);
755
+ if (localConfig === null) {
756
+ return ctx.crash({
757
+ exitCode: 1,
758
+ errorType: "fatal",
759
+ printedMessage: `No local deployment found. Run ${chalkStderr.bold("npx convex deployment create local")} to create one.`,
760
+ });
761
+ }
762
+ const credentials = await loadLocalDeploymentCredentials(
763
+ ctx,
764
+ localConfig.deploymentName,
765
+ );
766
+ return {
767
+ deploymentName: localConfig.deploymentName,
768
+ adminKey: credentials.adminKey,
769
+ url: credentials.deploymentUrl,
770
+ deploymentType: "local",
771
+ };
772
+ }
724
773
  case "inCurrentProject":
725
774
  return await handleRefInProject(ctx, parsed.selector, projectSelection);
726
775
  case "inProject": {
@@ -970,3 +1019,35 @@ export async function getTeamsForUser(ctx: Context) {
970
1019
  );
971
1020
  return teams;
972
1021
  }
1022
+
1023
+ async function resolveDefaultCloudDevDeploymentName(
1024
+ ctx: Context,
1025
+ teamSlug: string,
1026
+ projectSlug: string,
1027
+ ): Promise<string> {
1028
+ try {
1029
+ const result = await typedPlatformClient(ctx, { throw: true }).GET(
1030
+ "/teams/{team_id_or_slug}/projects/{project_slug}/deployment",
1031
+ {
1032
+ params: {
1033
+ path: { team_id_or_slug: teamSlug, project_slug: projectSlug },
1034
+ query: { defaultDev: true },
1035
+ },
1036
+ },
1037
+ );
1038
+ return result.data!.name;
1039
+ } catch (err) {
1040
+ if (
1041
+ err instanceof ThrowingFetchError &&
1042
+ err.serverErrorData?.code === "DeploymentNotFound"
1043
+ ) {
1044
+ return await ctx.crash({
1045
+ exitCode: 1,
1046
+ errorType: "fatal",
1047
+ printedMessage: `You don’t have a personal cloud dev deployment in this project. Run ${chalkStderr.bold("npx convex deployment create --type dev --default")} to create one.`,
1048
+ errForSentry: err,
1049
+ });
1050
+ }
1051
+ return await logAndHandleFetchError(ctx, err);
1052
+ }
1053
+ }
@@ -213,10 +213,14 @@ Command.prototype.addDeploymentSelectionOptions = function (
213
213
  new Option(
214
214
  "--deployment <deployment>",
215
215
  action +
216
- " the specified deployment. Accepts a deployment name (e.g. joyful-capybara-123), ref (e.g. dev/james), 'dev' (for your personal dev deployment), 'prod' (for your project’s default production deployment). You can also select deployments in other projects with 'project-slug:ref' or 'team-slug:project-slug:ref'.",
217
- )
218
- .conflicts(["--prod", "--preview-name", "--deployment-name", "--url"])
219
- .hideHelp(), // TODO(nicolas) Make this public
216
+ " a specific deployment. Accepts:\n" +
217
+ "• a deployment name (e.g. joyful-capybara-123)\n" +
218
+ " a deployment ref (e.g. dev/james)\n" +
219
+ "• `dev` (for your personal dev deployment)\n" +
220
+ "• `prod` (for your project’s default production deployment)\n" +
221
+ "• `local` (for your local dev deployment)." +
222
+ "\nYou can also select deployments in other projects with `project-slug:ref` or `team-slug:project-slug:ref`.",
223
+ ).conflicts(["--prod", "--preview-name", "--deployment-name", "--url"]),
220
224
  )
221
225
  .addOption(
222
226
  new Option(
@@ -243,8 +247,9 @@ export async function normalizeDevOptions(
243
247
  codegen: "enable" | "disable";
244
248
  once?: boolean;
245
249
  untilSuccess: boolean;
246
- run?: string | undefined;
250
+ start?: string;
247
251
  runSh?: string;
252
+ run?: string | undefined;
248
253
  runComponent?: string;
249
254
  tailLogs?: string | true;
250
255
  traceEvents: boolean;
@@ -309,10 +314,10 @@ export async function normalizeDevOptions(
309
314
  name: cmdOptions.run,
310
315
  component: cmdOptions.runComponent,
311
316
  }
312
- : cmdOptions.runSh !== undefined
317
+ : (cmdOptions.start ?? cmdOptions.runSh) !== undefined
313
318
  ? {
314
319
  kind: "shell",
315
- command: cmdOptions.runSh,
320
+ command: (cmdOptions.start ?? cmdOptions.runSh)!,
316
321
  }
317
322
  : undefined,
318
323
  tailLogs: