convex 1.34.0 → 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 (607) hide show
  1. package/CHANGELOG.md +98 -43
  2. package/dist/browser.bundle.js +13 -10
  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/browser/sync/authentication_manager.js +4 -1
  9. package/dist/cjs/browser/sync/authentication_manager.js.map +2 -2
  10. package/dist/cjs/browser/sync/web_socket_manager.js +1 -7
  11. package/dist/cjs/browser/sync/web_socket_manager.js.map +2 -2
  12. package/dist/cjs/cli/aiFiles.js +39 -20
  13. package/dist/cjs/cli/aiFiles.js.map +3 -3
  14. package/dist/cjs/cli/codegen_templates/readme.js +14 -1
  15. package/dist/cjs/cli/codegen_templates/readme.js.map +2 -2
  16. package/dist/cjs/cli/configure.js +34 -32
  17. package/dist/cjs/cli/configure.js.map +2 -2
  18. package/dist/cjs/cli/deploy.js +7 -8
  19. package/dist/cjs/cli/deploy.js.map +2 -2
  20. package/dist/cjs/cli/deploymentCreate.js +225 -40
  21. package/dist/cjs/cli/deploymentCreate.js.map +3 -3
  22. package/dist/cjs/cli/deploymentSelect.js +14 -13
  23. package/dist/cjs/cli/deploymentSelect.js.map +2 -2
  24. package/dist/cjs/cli/dev.js +30 -11
  25. package/dist/cjs/cli/dev.js.map +2 -2
  26. package/dist/cjs/cli/docs.js +1 -1
  27. package/dist/cjs/cli/docs.js.map +2 -2
  28. package/dist/cjs/cli/init.js +1 -1
  29. package/dist/cjs/cli/init.js.map +2 -2
  30. package/dist/cjs/cli/lib/aiFiles/agentsmd.js +73 -0
  31. package/dist/cjs/cli/lib/aiFiles/agentsmd.js.map +7 -0
  32. package/dist/cjs/cli/lib/aiFiles/claudemd.js +73 -0
  33. package/dist/cjs/cli/lib/aiFiles/claudemd.js.map +7 -0
  34. package/dist/cjs/cli/lib/aiFiles/cursorrules.js +48 -0
  35. package/dist/cjs/cli/lib/aiFiles/cursorrules.js.map +7 -0
  36. package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js +58 -0
  37. package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js.map +7 -0
  38. package/dist/cjs/cli/lib/aiFiles/index.js +215 -0
  39. package/dist/cjs/cli/lib/aiFiles/index.js.map +7 -0
  40. package/dist/cjs/cli/lib/aiFiles/paths.js.map +7 -0
  41. package/dist/cjs/cli/lib/aiFiles/skills.js +196 -0
  42. package/dist/cjs/cli/lib/aiFiles/skills.js.map +7 -0
  43. package/dist/cjs/cli/lib/aiFiles/state.js +96 -0
  44. package/dist/cjs/cli/lib/aiFiles/state.js.map +7 -0
  45. package/dist/cjs/cli/lib/aiFiles/status.js +198 -0
  46. package/dist/cjs/cli/lib/aiFiles/status.js.map +7 -0
  47. package/dist/cjs/cli/lib/aiFiles/utils.js +128 -0
  48. package/dist/cjs/cli/lib/aiFiles/utils.js.map +7 -0
  49. package/dist/cjs/cli/lib/api.js +70 -7
  50. package/dist/cjs/cli/lib/api.js.map +2 -2
  51. package/dist/cjs/cli/lib/command.js +10 -6
  52. package/dist/cjs/cli/lib/command.js.map +2 -2
  53. package/dist/cjs/cli/lib/config.js +43 -7
  54. package/dist/cjs/cli/lib/config.js.map +3 -3
  55. package/dist/cjs/cli/lib/deploy2.js +9 -26
  56. package/dist/cjs/cli/lib/deploy2.js.map +2 -2
  57. package/dist/cjs/cli/lib/deployApi/componentDefinition.js +4 -1
  58. package/dist/cjs/cli/lib/deployApi/componentDefinition.js.map +2 -2
  59. package/dist/cjs/cli/lib/deploymentSelection.js +45 -2
  60. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  61. package/dist/cjs/cli/lib/deploymentSelector.js +1 -0
  62. package/dist/cjs/cli/lib/deploymentSelector.js.map +2 -2
  63. package/dist/cjs/cli/lib/dev.js +162 -117
  64. package/dist/cjs/cli/lib/dev.js.map +2 -2
  65. package/dist/cjs/cli/lib/env.js +1 -13
  66. package/dist/cjs/cli/lib/env.js.map +2 -2
  67. package/dist/cjs/cli/lib/expiration.js +104 -0
  68. package/dist/cjs/cli/lib/expiration.js.map +7 -0
  69. package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
  70. package/dist/cjs/cli/lib/init.js +4 -3
  71. package/dist/cjs/cli/lib/init.js.map +2 -2
  72. package/dist/cjs/cli/lib/insights.js +1 -1
  73. package/dist/cjs/cli/lib/insights.js.map +2 -2
  74. package/dist/cjs/cli/lib/localDeployment/anonymous.js +15 -8
  75. package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +2 -2
  76. package/dist/cjs/cli/lib/localDeployment/localDeployment.js +8 -10
  77. package/dist/cjs/cli/lib/localDeployment/localDeployment.js.map +2 -2
  78. package/dist/cjs/cli/lib/localDeployment/run.js +1 -0
  79. package/dist/cjs/cli/lib/localDeployment/run.js.map +2 -2
  80. package/dist/cjs/cli/lib/localDeployment/upgrade.js +2 -2
  81. package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +2 -2
  82. package/dist/cjs/cli/lib/localDeployment/utils.js +9 -0
  83. package/dist/cjs/cli/lib/localDeployment/utils.js.map +2 -2
  84. package/dist/cjs/cli/lib/mcp/tools/status.js +1 -1
  85. package/dist/cjs/cli/lib/mcp/tools/status.js.map +2 -2
  86. package/dist/cjs/cli/lib/updates.js +12 -13
  87. package/dist/cjs/cli/lib/updates.js.map +2 -2
  88. package/dist/cjs/cli/lib/usage.js +2 -1
  89. package/dist/cjs/cli/lib/usage.js.map +2 -2
  90. package/dist/cjs/cli/lib/utils/prompts.js +2 -1
  91. package/dist/cjs/cli/lib/utils/prompts.js.map +2 -2
  92. package/dist/cjs/cli/lib/utils/utils.js +46 -20
  93. package/dist/cjs/cli/lib/utils/utils.js.map +3 -3
  94. package/dist/cjs/cli/lib/versionApi.js +7 -4
  95. package/dist/cjs/cli/lib/versionApi.js.map +2 -2
  96. package/dist/cjs/cli/lib/workos/workos.js +4 -6
  97. package/dist/cjs/cli/lib/workos/workos.js.map +2 -2
  98. package/dist/cjs/index.js +1 -1
  99. package/dist/cjs/index.js.map +1 -1
  100. package/dist/cjs/react/client.js +43 -6
  101. package/dist/cjs/react/client.js.map +2 -2
  102. package/dist/cjs/react/index.js +2 -0
  103. package/dist/cjs/react/index.js.map +2 -2
  104. package/dist/cjs/react-clerk/ConvexProviderWithClerk.js.map +1 -1
  105. package/dist/cjs/server/api.js.map +2 -2
  106. package/dist/cjs/server/components/definition.js.map +1 -1
  107. package/dist/cjs/server/components/index.js +40 -4
  108. package/dist/cjs/server/components/index.js.map +2 -2
  109. package/dist/cjs/server/data_model.js.map +1 -1
  110. package/dist/cjs/server/impl/meta_impl.js +78 -0
  111. package/dist/cjs/server/impl/meta_impl.js.map +7 -0
  112. package/dist/cjs/server/impl/registration_impl.js +16 -11
  113. package/dist/cjs/server/impl/registration_impl.js.map +2 -2
  114. package/dist/cjs/server/index.js.map +2 -2
  115. package/dist/cjs/server/meta.js +17 -0
  116. package/dist/cjs/server/meta.js.map +7 -0
  117. package/dist/cjs/server/registration.js.map +1 -1
  118. package/dist/cjs-types/browser/index.d.ts +1 -0
  119. package/dist/cjs-types/browser/index.d.ts.map +1 -1
  120. package/dist/cjs-types/browser/query_options.d.ts +12 -9
  121. package/dist/cjs-types/browser/query_options.d.ts.map +1 -1
  122. package/dist/cjs-types/browser/sync/authentication_manager.d.ts.map +1 -1
  123. package/dist/cjs-types/browser/sync/web_socket_manager.d.ts.map +1 -1
  124. package/dist/cjs-types/cli/aiFiles.d.ts.map +1 -1
  125. package/dist/cjs-types/cli/codegen_templates/readme.d.ts.map +1 -1
  126. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  127. package/dist/cjs-types/cli/configure.test.d.ts +2 -0
  128. package/dist/cjs-types/cli/configure.test.d.ts.map +1 -0
  129. package/dist/cjs-types/cli/deploy.d.ts.map +1 -1
  130. package/dist/cjs-types/cli/deploymentCreate.d.ts +1 -0
  131. package/dist/cjs-types/cli/deploymentCreate.d.ts.map +1 -1
  132. package/dist/cjs-types/cli/deploymentSelect.d.ts +2 -1
  133. package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
  134. package/dist/cjs-types/cli/dev.d.ts +3 -1
  135. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  136. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts +19 -0
  137. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -0
  138. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.test.d.ts +2 -0
  139. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.test.d.ts.map +1 -0
  140. package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts +19 -0
  141. package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -0
  142. package/dist/cjs-types/cli/lib/aiFiles/claudemd.test.d.ts +2 -0
  143. package/dist/cjs-types/cli/lib/aiFiles/claudemd.test.d.ts.map +1 -0
  144. package/dist/cjs-types/cli/lib/aiFiles/cursorrules.d.ts +10 -0
  145. package/dist/cjs-types/cli/lib/aiFiles/cursorrules.d.ts.map +1 -0
  146. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts +12 -0
  147. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -0
  148. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.test.d.ts +2 -0
  149. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.test.d.ts.map +1 -0
  150. package/dist/cjs-types/cli/lib/aiFiles/index.d.ts +42 -0
  151. package/dist/cjs-types/cli/lib/aiFiles/index.d.ts.map +1 -0
  152. package/dist/cjs-types/cli/lib/aiFiles/index.test.d.ts.map +1 -0
  153. package/dist/cjs-types/cli/lib/aiFiles/integration.test.d.ts.map +1 -0
  154. package/dist/cjs-types/cli/lib/{ai → aiFiles}/paths.d.ts +4 -0
  155. package/dist/cjs-types/cli/lib/aiFiles/paths.d.ts.map +1 -0
  156. package/dist/cjs-types/cli/lib/aiFiles/prompt.test.d.ts.map +1 -0
  157. package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts +20 -0
  158. package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts.map +1 -0
  159. package/dist/cjs-types/cli/lib/aiFiles/state.d.ts +38 -0
  160. package/dist/cjs-types/cli/lib/aiFiles/state.d.ts.map +1 -0
  161. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts +2 -0
  162. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
  163. package/dist/cjs-types/cli/lib/aiFiles/status.d.ts +6 -0
  164. package/dist/cjs-types/cli/lib/aiFiles/status.d.ts.map +1 -0
  165. package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts +56 -0
  166. package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts.map +1 -0
  167. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
  168. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
  169. package/dist/cjs-types/cli/lib/api.d.ts +3 -3
  170. package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
  171. package/dist/cjs-types/cli/lib/command.d.ts +2 -1
  172. package/dist/cjs-types/cli/lib/command.d.ts.map +1 -1
  173. package/dist/cjs-types/cli/lib/config.d.ts +18 -6
  174. package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
  175. package/dist/cjs-types/cli/lib/deploy2.d.ts +5 -2
  176. package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
  177. package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
  178. package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
  179. package/dist/cjs-types/cli/lib/deployApi/definitionConfig.d.ts +24 -24
  180. package/dist/cjs-types/cli/lib/deployApi/modules.d.ts +14 -14
  181. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +61 -52
  182. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
  183. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  184. package/dist/cjs-types/cli/lib/deploymentSelector.d.ts +2 -0
  185. package/dist/cjs-types/cli/lib/deploymentSelector.d.ts.map +1 -1
  186. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  187. package/dist/cjs-types/cli/lib/env.d.ts +0 -4
  188. package/dist/cjs-types/cli/lib/env.d.ts.map +1 -1
  189. package/dist/cjs-types/cli/lib/expiration.d.ts +35 -0
  190. package/dist/cjs-types/cli/lib/expiration.d.ts.map +1 -0
  191. package/dist/cjs-types/cli/lib/expiration.test.d.ts +2 -0
  192. package/dist/cjs-types/cli/lib/expiration.test.d.ts.map +1 -0
  193. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
  194. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  195. package/dist/cjs-types/cli/lib/init.d.ts.map +1 -1
  196. package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  197. package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  198. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts +15 -0
  199. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  200. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  201. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +7 -0
  202. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  203. package/dist/cjs-types/cli/lib/mcp/requestContext.d.ts +3 -3
  204. package/dist/cjs-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  205. package/dist/cjs-types/cli/lib/updates.d.ts +4 -3
  206. package/dist/cjs-types/cli/lib/updates.d.ts.map +1 -1
  207. package/dist/cjs-types/cli/lib/usage.d.ts.map +1 -1
  208. package/dist/cjs-types/cli/lib/utils/prompts.d.ts +1 -0
  209. package/dist/cjs-types/cli/lib/utils/prompts.d.ts.map +1 -1
  210. package/dist/cjs-types/cli/lib/utils/utils.d.ts +16 -2
  211. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  212. package/dist/cjs-types/cli/lib/versionApi.d.ts +7 -1
  213. package/dist/cjs-types/cli/lib/versionApi.d.ts.map +1 -1
  214. package/dist/cjs-types/cli/lib/workos/workos.d.ts.map +1 -1
  215. package/dist/cjs-types/index.d.ts +1 -1
  216. package/dist/cjs-types/react/client.d.ts +54 -2
  217. package/dist/cjs-types/react/client.d.ts.map +1 -1
  218. package/dist/cjs-types/react/index.d.ts +7 -2
  219. package/dist/cjs-types/react/index.d.ts.map +1 -1
  220. package/dist/cjs-types/react/use_query_object_options.test.d.ts +5 -0
  221. package/dist/cjs-types/react/use_query_object_options.test.d.ts.map +1 -0
  222. package/dist/cjs-types/react/use_query_result.test.d.ts +5 -0
  223. package/dist/cjs-types/react/use_query_result.test.d.ts.map +1 -0
  224. package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
  225. package/dist/cjs-types/server/api.d.ts +5 -1
  226. package/dist/cjs-types/server/api.d.ts.map +1 -1
  227. package/dist/cjs-types/server/components/definition.d.ts +1 -0
  228. package/dist/cjs-types/server/components/definition.d.ts.map +1 -1
  229. package/dist/cjs-types/server/components/index.d.ts +5 -1
  230. package/dist/cjs-types/server/components/index.d.ts.map +1 -1
  231. package/dist/cjs-types/server/data_model.d.ts +2 -1
  232. package/dist/cjs-types/server/data_model.d.ts.map +1 -1
  233. package/dist/cjs-types/server/impl/meta_impl.d.ts +5 -0
  234. package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -0
  235. package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
  236. package/dist/cjs-types/server/index.d.ts +1 -0
  237. package/dist/cjs-types/server/index.d.ts.map +1 -1
  238. package/dist/cjs-types/server/meta.d.ts +72 -0
  239. package/dist/cjs-types/server/meta.d.ts.map +1 -0
  240. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  241. package/dist/cli.bundle.cjs +2446 -1933
  242. package/dist/cli.bundle.cjs.map +4 -4
  243. package/dist/esm/browser/index-node.js +1 -0
  244. package/dist/esm/browser/index.js +1 -0
  245. package/dist/esm/browser/index.js.map +2 -2
  246. package/dist/esm/browser/query_options.js.map +2 -2
  247. package/dist/esm/browser/sync/authentication_manager.js +4 -1
  248. package/dist/esm/browser/sync/authentication_manager.js.map +2 -2
  249. package/dist/esm/browser/sync/web_socket_manager.js +1 -7
  250. package/dist/esm/browser/sync/web_socket_manager.js.map +2 -2
  251. package/dist/esm/cli/aiFiles.js +41 -23
  252. package/dist/esm/cli/aiFiles.js.map +2 -2
  253. package/dist/esm/cli/codegen_templates/readme.js +14 -1
  254. package/dist/esm/cli/codegen_templates/readme.js.map +2 -2
  255. package/dist/esm/cli/configure.js +35 -33
  256. package/dist/esm/cli/configure.js.map +2 -2
  257. package/dist/esm/cli/deploy.js +11 -10
  258. package/dist/esm/cli/deploy.js.map +2 -2
  259. package/dist/esm/cli/deploymentCreate.js +238 -42
  260. package/dist/esm/cli/deploymentCreate.js.map +2 -2
  261. package/dist/esm/cli/deploymentSelect.js +13 -12
  262. package/dist/esm/cli/deploymentSelect.js.map +2 -2
  263. package/dist/esm/cli/dev.js +34 -13
  264. package/dist/esm/cli/dev.js.map +2 -2
  265. package/dist/esm/cli/docs.js +1 -1
  266. package/dist/esm/cli/docs.js.map +2 -2
  267. package/dist/esm/cli/init.js +2 -2
  268. package/dist/esm/cli/init.js.map +2 -2
  269. package/dist/esm/cli/lib/aiFiles/agentsmd.js +56 -0
  270. package/dist/esm/cli/lib/aiFiles/agentsmd.js.map +7 -0
  271. package/dist/esm/cli/lib/aiFiles/claudemd.js +56 -0
  272. package/dist/esm/cli/lib/aiFiles/claudemd.js.map +7 -0
  273. package/dist/esm/cli/lib/aiFiles/cursorrules.js +16 -0
  274. package/dist/esm/cli/lib/aiFiles/cursorrules.js.map +7 -0
  275. package/dist/esm/cli/lib/aiFiles/guidelinesmd.js +35 -0
  276. package/dist/esm/cli/lib/aiFiles/guidelinesmd.js.map +7 -0
  277. package/dist/esm/cli/lib/aiFiles/index.js +193 -0
  278. package/dist/esm/cli/lib/aiFiles/index.js.map +7 -0
  279. package/dist/esm/cli/lib/aiFiles/paths.js.map +7 -0
  280. package/dist/esm/cli/lib/aiFiles/skills.js +163 -0
  281. package/dist/esm/cli/lib/aiFiles/skills.js.map +7 -0
  282. package/dist/esm/cli/lib/aiFiles/state.js +60 -0
  283. package/dist/esm/cli/lib/aiFiles/state.js.map +7 -0
  284. package/dist/esm/cli/lib/aiFiles/status.js +178 -0
  285. package/dist/esm/cli/lib/aiFiles/status.js.map +7 -0
  286. package/dist/esm/cli/lib/aiFiles/utils.js +97 -0
  287. package/dist/esm/cli/lib/aiFiles/utils.js.map +7 -0
  288. package/dist/esm/cli/lib/api.js +70 -7
  289. package/dist/esm/cli/lib/api.js.map +2 -2
  290. package/dist/esm/cli/lib/command.js +10 -6
  291. package/dist/esm/cli/lib/command.js.map +2 -2
  292. package/dist/esm/cli/lib/config.js +41 -6
  293. package/dist/esm/cli/lib/config.js.map +2 -2
  294. package/dist/esm/cli/lib/deploy2.js +13 -26
  295. package/dist/esm/cli/lib/deploy2.js.map +2 -2
  296. package/dist/esm/cli/lib/deployApi/componentDefinition.js +4 -1
  297. package/dist/esm/cli/lib/deployApi/componentDefinition.js.map +2 -2
  298. package/dist/esm/cli/lib/deploymentSelection.js +46 -2
  299. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  300. package/dist/esm/cli/lib/deploymentSelector.js +1 -0
  301. package/dist/esm/cli/lib/deploymentSelector.js.map +2 -2
  302. package/dist/esm/cli/lib/dev.js +162 -118
  303. package/dist/esm/cli/lib/dev.js.map +2 -2
  304. package/dist/esm/cli/lib/env.js +0 -11
  305. package/dist/esm/cli/lib/env.js.map +2 -2
  306. package/dist/esm/cli/lib/expiration.js +80 -0
  307. package/dist/esm/cli/lib/expiration.js.map +7 -0
  308. package/dist/esm/cli/lib/init.js +4 -3
  309. package/dist/esm/cli/lib/init.js.map +2 -2
  310. package/dist/esm/cli/lib/insights.js +1 -1
  311. package/dist/esm/cli/lib/insights.js.map +2 -2
  312. package/dist/esm/cli/lib/localDeployment/anonymous.js +16 -9
  313. package/dist/esm/cli/lib/localDeployment/anonymous.js.map +2 -2
  314. package/dist/esm/cli/lib/localDeployment/localDeployment.js +9 -11
  315. package/dist/esm/cli/lib/localDeployment/localDeployment.js.map +2 -2
  316. package/dist/esm/cli/lib/localDeployment/run.js +1 -1
  317. package/dist/esm/cli/lib/localDeployment/run.js.map +2 -2
  318. package/dist/esm/cli/lib/localDeployment/upgrade.js +2 -2
  319. package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
  320. package/dist/esm/cli/lib/localDeployment/utils.js +8 -0
  321. package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
  322. package/dist/esm/cli/lib/mcp/tools/status.js +1 -1
  323. package/dist/esm/cli/lib/mcp/tools/status.js.map +2 -2
  324. package/dist/esm/cli/lib/updates.js +14 -12
  325. package/dist/esm/cli/lib/updates.js.map +2 -2
  326. package/dist/esm/cli/lib/usage.js +2 -1
  327. package/dist/esm/cli/lib/usage.js.map +2 -2
  328. package/dist/esm/cli/lib/utils/prompts.js +2 -1
  329. package/dist/esm/cli/lib/utils/prompts.js.map +2 -2
  330. package/dist/esm/cli/lib/utils/utils.js +45 -20
  331. package/dist/esm/cli/lib/utils/utils.js.map +3 -3
  332. package/dist/esm/cli/lib/versionApi.js +7 -4
  333. package/dist/esm/cli/lib/versionApi.js.map +2 -2
  334. package/dist/esm/cli/lib/workos/workos.js +4 -6
  335. package/dist/esm/cli/lib/workos/workos.js.map +2 -2
  336. package/dist/esm/index.js +1 -1
  337. package/dist/esm/index.js.map +1 -1
  338. package/dist/esm/react/client.js +43 -6
  339. package/dist/esm/react/client.js.map +2 -2
  340. package/dist/esm/react/index.js +1 -0
  341. package/dist/esm/react/index.js.map +2 -2
  342. package/dist/esm/react-clerk/ConvexProviderWithClerk.js.map +1 -1
  343. package/dist/esm/server/api.js.map +2 -2
  344. package/dist/esm/server/components/index.js +40 -4
  345. package/dist/esm/server/components/index.js.map +2 -2
  346. package/dist/esm/server/impl/meta_impl.js +54 -0
  347. package/dist/esm/server/impl/meta_impl.js.map +7 -0
  348. package/dist/esm/server/impl/registration_impl.js +20 -11
  349. package/dist/esm/server/impl/registration_impl.js.map +2 -2
  350. package/dist/esm/server/index.js.map +2 -2
  351. package/dist/esm/server/meta.js +2 -0
  352. package/dist/esm/server/meta.js.map +7 -0
  353. package/dist/esm-types/browser/index.d.ts +1 -0
  354. package/dist/esm-types/browser/index.d.ts.map +1 -1
  355. package/dist/esm-types/browser/query_options.d.ts +12 -9
  356. package/dist/esm-types/browser/query_options.d.ts.map +1 -1
  357. package/dist/esm-types/browser/sync/authentication_manager.d.ts.map +1 -1
  358. package/dist/esm-types/browser/sync/web_socket_manager.d.ts.map +1 -1
  359. package/dist/esm-types/cli/aiFiles.d.ts.map +1 -1
  360. package/dist/esm-types/cli/codegen_templates/readme.d.ts.map +1 -1
  361. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  362. package/dist/esm-types/cli/configure.test.d.ts +2 -0
  363. package/dist/esm-types/cli/configure.test.d.ts.map +1 -0
  364. package/dist/esm-types/cli/deploy.d.ts.map +1 -1
  365. package/dist/esm-types/cli/deploymentCreate.d.ts +1 -0
  366. package/dist/esm-types/cli/deploymentCreate.d.ts.map +1 -1
  367. package/dist/esm-types/cli/deploymentSelect.d.ts +2 -1
  368. package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
  369. package/dist/esm-types/cli/dev.d.ts +3 -1
  370. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  371. package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts +19 -0
  372. package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -0
  373. package/dist/esm-types/cli/lib/aiFiles/agentsmd.test.d.ts +2 -0
  374. package/dist/esm-types/cli/lib/aiFiles/agentsmd.test.d.ts.map +1 -0
  375. package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts +19 -0
  376. package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -0
  377. package/dist/esm-types/cli/lib/aiFiles/claudemd.test.d.ts +2 -0
  378. package/dist/esm-types/cli/lib/aiFiles/claudemd.test.d.ts.map +1 -0
  379. package/dist/esm-types/cli/lib/aiFiles/cursorrules.d.ts +10 -0
  380. package/dist/esm-types/cli/lib/aiFiles/cursorrules.d.ts.map +1 -0
  381. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts +12 -0
  382. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -0
  383. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.test.d.ts +2 -0
  384. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.test.d.ts.map +1 -0
  385. package/dist/esm-types/cli/lib/aiFiles/index.d.ts +42 -0
  386. package/dist/esm-types/cli/lib/aiFiles/index.d.ts.map +1 -0
  387. package/dist/esm-types/cli/lib/aiFiles/index.test.d.ts.map +1 -0
  388. package/dist/esm-types/cli/lib/aiFiles/integration.test.d.ts.map +1 -0
  389. package/dist/esm-types/cli/lib/{ai → aiFiles}/paths.d.ts +4 -0
  390. package/dist/esm-types/cli/lib/aiFiles/paths.d.ts.map +1 -0
  391. package/dist/esm-types/cli/lib/aiFiles/prompt.test.d.ts.map +1 -0
  392. package/dist/esm-types/cli/lib/aiFiles/skills.d.ts +20 -0
  393. package/dist/esm-types/cli/lib/aiFiles/skills.d.ts.map +1 -0
  394. package/dist/esm-types/cli/lib/aiFiles/state.d.ts +38 -0
  395. package/dist/esm-types/cli/lib/aiFiles/state.d.ts.map +1 -0
  396. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts +2 -0
  397. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
  398. package/dist/esm-types/cli/lib/aiFiles/status.d.ts +6 -0
  399. package/dist/esm-types/cli/lib/aiFiles/status.d.ts.map +1 -0
  400. package/dist/esm-types/cli/lib/aiFiles/utils.d.ts +56 -0
  401. package/dist/esm-types/cli/lib/aiFiles/utils.d.ts.map +1 -0
  402. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
  403. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
  404. package/dist/esm-types/cli/lib/api.d.ts +3 -3
  405. package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
  406. package/dist/esm-types/cli/lib/command.d.ts +2 -1
  407. package/dist/esm-types/cli/lib/command.d.ts.map +1 -1
  408. package/dist/esm-types/cli/lib/config.d.ts +18 -6
  409. package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
  410. package/dist/esm-types/cli/lib/deploy2.d.ts +5 -2
  411. package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
  412. package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
  413. package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
  414. package/dist/esm-types/cli/lib/deployApi/definitionConfig.d.ts +24 -24
  415. package/dist/esm-types/cli/lib/deployApi/modules.d.ts +14 -14
  416. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +61 -52
  417. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
  418. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  419. package/dist/esm-types/cli/lib/deploymentSelector.d.ts +2 -0
  420. package/dist/esm-types/cli/lib/deploymentSelector.d.ts.map +1 -1
  421. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  422. package/dist/esm-types/cli/lib/env.d.ts +0 -4
  423. package/dist/esm-types/cli/lib/env.d.ts.map +1 -1
  424. package/dist/esm-types/cli/lib/expiration.d.ts +35 -0
  425. package/dist/esm-types/cli/lib/expiration.d.ts.map +1 -0
  426. package/dist/esm-types/cli/lib/expiration.test.d.ts +2 -0
  427. package/dist/esm-types/cli/lib/expiration.test.d.ts.map +1 -0
  428. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
  429. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  430. package/dist/esm-types/cli/lib/init.d.ts.map +1 -1
  431. package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  432. package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  433. package/dist/esm-types/cli/lib/localDeployment/run.d.ts +15 -0
  434. package/dist/esm-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  435. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  436. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +7 -0
  437. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  438. package/dist/esm-types/cli/lib/mcp/requestContext.d.ts +3 -3
  439. package/dist/esm-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  440. package/dist/esm-types/cli/lib/updates.d.ts +4 -3
  441. package/dist/esm-types/cli/lib/updates.d.ts.map +1 -1
  442. package/dist/esm-types/cli/lib/usage.d.ts.map +1 -1
  443. package/dist/esm-types/cli/lib/utils/prompts.d.ts +1 -0
  444. package/dist/esm-types/cli/lib/utils/prompts.d.ts.map +1 -1
  445. package/dist/esm-types/cli/lib/utils/utils.d.ts +16 -2
  446. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  447. package/dist/esm-types/cli/lib/versionApi.d.ts +7 -1
  448. package/dist/esm-types/cli/lib/versionApi.d.ts.map +1 -1
  449. package/dist/esm-types/cli/lib/workos/workos.d.ts.map +1 -1
  450. package/dist/esm-types/index.d.ts +1 -1
  451. package/dist/esm-types/react/client.d.ts +54 -2
  452. package/dist/esm-types/react/client.d.ts.map +1 -1
  453. package/dist/esm-types/react/index.d.ts +7 -2
  454. package/dist/esm-types/react/index.d.ts.map +1 -1
  455. package/dist/esm-types/react/use_query_object_options.test.d.ts +5 -0
  456. package/dist/esm-types/react/use_query_object_options.test.d.ts.map +1 -0
  457. package/dist/esm-types/react/use_query_result.test.d.ts +5 -0
  458. package/dist/esm-types/react/use_query_result.test.d.ts.map +1 -0
  459. package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
  460. package/dist/esm-types/server/api.d.ts +5 -1
  461. package/dist/esm-types/server/api.d.ts.map +1 -1
  462. package/dist/esm-types/server/components/definition.d.ts +1 -0
  463. package/dist/esm-types/server/components/definition.d.ts.map +1 -1
  464. package/dist/esm-types/server/components/index.d.ts +5 -1
  465. package/dist/esm-types/server/components/index.d.ts.map +1 -1
  466. package/dist/esm-types/server/data_model.d.ts +2 -1
  467. package/dist/esm-types/server/data_model.d.ts.map +1 -1
  468. package/dist/esm-types/server/impl/meta_impl.d.ts +5 -0
  469. package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -0
  470. package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
  471. package/dist/esm-types/server/index.d.ts +1 -0
  472. package/dist/esm-types/server/index.d.ts.map +1 -1
  473. package/dist/esm-types/server/meta.d.ts +72 -0
  474. package/dist/esm-types/server/meta.d.ts.map +1 -0
  475. package/dist/esm-types/server/registration.d.ts.map +1 -1
  476. package/dist/react.bundle.js +55 -15
  477. package/dist/react.bundle.js.map +3 -3
  478. package/package.json +11 -7
  479. package/schemas/convex.schema.json +22 -3
  480. package/src/browser/index.ts +3 -0
  481. package/src/browser/query_options.test.ts +0 -9
  482. package/src/browser/query_options.ts +36 -15
  483. package/src/browser/sync/authentication_manager.ts +9 -4
  484. package/src/browser/sync/client_node.test.ts +125 -0
  485. package/src/browser/sync/web_socket_manager.ts +1 -7
  486. package/src/cli/aiFiles.ts +56 -33
  487. package/src/cli/codegen_templates/readme.ts +14 -1
  488. package/src/cli/configure.test.ts +138 -0
  489. package/src/cli/configure.ts +62 -55
  490. package/src/cli/deploy.ts +12 -9
  491. package/src/cli/deploymentCreate.test.ts +349 -14
  492. package/src/cli/deploymentCreate.ts +268 -41
  493. package/src/cli/deploymentSelect.test.ts +136 -27
  494. package/src/cli/deploymentSelect.ts +50 -41
  495. package/src/cli/deploymentSelection.test.ts +399 -37
  496. package/src/cli/dev.ts +49 -14
  497. package/src/cli/docs.ts +1 -1
  498. package/src/cli/init.ts +2 -2
  499. package/src/cli/lib/{ai → aiFiles}/MANUAL_TESTING.md +6 -2
  500. package/src/cli/lib/aiFiles/agentsmd.test.ts +133 -0
  501. package/src/cli/lib/aiFiles/agentsmd.ts +81 -0
  502. package/src/cli/lib/aiFiles/claudemd.test.ts +92 -0
  503. package/src/cli/lib/aiFiles/claudemd.ts +81 -0
  504. package/src/cli/lib/aiFiles/cursorrules.ts +25 -0
  505. package/src/cli/lib/aiFiles/guidelinesmd.test.ts +50 -0
  506. package/src/cli/lib/aiFiles/guidelinesmd.ts +49 -0
  507. package/src/cli/lib/{ai → aiFiles}/index.test.ts +343 -516
  508. package/src/cli/lib/aiFiles/index.ts +297 -0
  509. package/src/cli/lib/{ai → aiFiles}/integration.test.ts +195 -158
  510. package/src/cli/lib/{ai → aiFiles}/paths.ts +5 -0
  511. package/src/cli/lib/{ai → aiFiles}/prompt.test.ts +79 -31
  512. package/src/cli/lib/aiFiles/skills.ts +243 -0
  513. package/src/cli/lib/aiFiles/state.test.ts +280 -0
  514. package/src/cli/lib/aiFiles/state.ts +82 -0
  515. package/src/cli/lib/aiFiles/status.ts +246 -0
  516. package/src/cli/lib/aiFiles/utils.test.ts +50 -0
  517. package/src/cli/lib/aiFiles/utils.ts +191 -0
  518. package/src/cli/lib/api.ts +88 -7
  519. package/src/cli/lib/command.ts +18 -8
  520. package/src/cli/lib/config.test.ts +185 -8
  521. package/src/cli/lib/config.ts +73 -12
  522. package/src/cli/lib/deploy2.ts +14 -27
  523. package/src/cli/lib/deployApi/componentDefinition.ts +4 -1
  524. package/src/cli/lib/deploymentSelection.ts +59 -6
  525. package/src/cli/lib/deploymentSelector.test.ts +6 -0
  526. package/src/cli/lib/deploymentSelector.ts +2 -0
  527. package/src/cli/lib/dev.ts +202 -153
  528. package/src/cli/lib/env.ts +0 -15
  529. package/src/cli/lib/expiration.test.ts +159 -0
  530. package/src/cli/lib/expiration.ts +124 -0
  531. package/src/cli/lib/generatedFunctionLogsApi.ts +16 -1
  532. package/src/cli/lib/init.ts +6 -2
  533. package/src/cli/lib/insights.ts +1 -1
  534. package/src/cli/lib/localDeployment/anonymous.ts +19 -9
  535. package/src/cli/lib/localDeployment/localDeployment.ts +9 -11
  536. package/src/cli/lib/localDeployment/run.ts +1 -1
  537. package/src/cli/lib/localDeployment/upgrade.ts +12 -10
  538. package/src/cli/lib/localDeployment/utils.ts +12 -0
  539. package/src/cli/lib/mcp/tools/status.ts +1 -1
  540. package/src/cli/lib/updates.test.ts +97 -60
  541. package/src/cli/lib/updates.ts +17 -15
  542. package/src/cli/lib/usage.ts +3 -1
  543. package/src/cli/lib/utils/prompts.ts +2 -0
  544. package/src/cli/lib/utils/utils.test.ts +6 -6
  545. package/src/cli/lib/utils/utils.ts +66 -27
  546. package/src/cli/lib/versionApi.test.ts +13 -10
  547. package/src/cli/lib/versionApi.ts +13 -5
  548. package/src/cli/lib/workos/workos.ts +4 -5
  549. package/src/index.ts +1 -1
  550. package/src/react/client.test.tsx +65 -0
  551. package/src/react/client.ts +129 -13
  552. package/src/react/index.ts +9 -1
  553. package/src/react/use_query_object_options.test.ts +50 -0
  554. package/src/react/use_query_result.test.ts +41 -0
  555. package/src/react-clerk/ConvexProviderWithClerk.test.tsx +1 -1
  556. package/src/react-clerk/ConvexProviderWithClerk.tsx +1 -1
  557. package/src/server/api.ts +5 -1
  558. package/src/server/components/definition.ts +3 -0
  559. package/src/server/components/index.ts +62 -5
  560. package/src/server/data_model.ts +2 -1
  561. package/src/server/impl/meta_impl.ts +74 -0
  562. package/src/server/impl/registration_impl.ts +21 -9
  563. package/src/server/index.ts +8 -0
  564. package/src/server/meta.ts +76 -0
  565. package/src/server/registration.ts +10 -0
  566. package/src/server/schema.test.ts +78 -1
  567. package/dist/cjs/cli/lib/ai/config.js +0 -144
  568. package/dist/cjs/cli/lib/ai/config.js.map +0 -7
  569. package/dist/cjs/cli/lib/ai/index.js +0 -704
  570. package/dist/cjs/cli/lib/ai/index.js.map +0 -7
  571. package/dist/cjs/cli/lib/ai/paths.js.map +0 -7
  572. package/dist/cjs-types/cli/lib/ai/config.d.ts +0 -50
  573. package/dist/cjs-types/cli/lib/ai/config.d.ts.map +0 -1
  574. package/dist/cjs-types/cli/lib/ai/config.test.d.ts +0 -2
  575. package/dist/cjs-types/cli/lib/ai/config.test.d.ts.map +0 -1
  576. package/dist/cjs-types/cli/lib/ai/index.d.ts +0 -56
  577. package/dist/cjs-types/cli/lib/ai/index.d.ts.map +0 -1
  578. package/dist/cjs-types/cli/lib/ai/index.test.d.ts.map +0 -1
  579. package/dist/cjs-types/cli/lib/ai/integration.test.d.ts.map +0 -1
  580. package/dist/cjs-types/cli/lib/ai/paths.d.ts.map +0 -1
  581. package/dist/cjs-types/cli/lib/ai/prompt.test.d.ts.map +0 -1
  582. package/dist/esm/cli/lib/ai/config.js +0 -109
  583. package/dist/esm/cli/lib/ai/config.js.map +0 -7
  584. package/dist/esm/cli/lib/ai/index.js +0 -684
  585. package/dist/esm/cli/lib/ai/index.js.map +0 -7
  586. package/dist/esm/cli/lib/ai/paths.js.map +0 -7
  587. package/dist/esm-types/cli/lib/ai/config.d.ts +0 -50
  588. package/dist/esm-types/cli/lib/ai/config.d.ts.map +0 -1
  589. package/dist/esm-types/cli/lib/ai/config.test.d.ts +0 -2
  590. package/dist/esm-types/cli/lib/ai/config.test.d.ts.map +0 -1
  591. package/dist/esm-types/cli/lib/ai/index.d.ts +0 -56
  592. package/dist/esm-types/cli/lib/ai/index.d.ts.map +0 -1
  593. package/dist/esm-types/cli/lib/ai/index.test.d.ts.map +0 -1
  594. package/dist/esm-types/cli/lib/ai/integration.test.d.ts.map +0 -1
  595. package/dist/esm-types/cli/lib/ai/paths.d.ts.map +0 -1
  596. package/dist/esm-types/cli/lib/ai/prompt.test.d.ts.map +0 -1
  597. package/src/cli/lib/ai/config.test.ts +0 -338
  598. package/src/cli/lib/ai/config.ts +0 -159
  599. package/src/cli/lib/ai/index.ts +0 -1006
  600. /package/dist/cjs/cli/lib/{ai → aiFiles}/paths.js +0 -0
  601. /package/dist/cjs-types/cli/lib/{ai → aiFiles}/index.test.d.ts +0 -0
  602. /package/dist/cjs-types/cli/lib/{ai → aiFiles}/integration.test.d.ts +0 -0
  603. /package/dist/cjs-types/cli/lib/{ai → aiFiles}/prompt.test.d.ts +0 -0
  604. /package/dist/esm/cli/lib/{ai → aiFiles}/paths.js +0 -0
  605. /package/dist/esm-types/cli/lib/{ai → aiFiles}/index.test.d.ts +0 -0
  606. /package/dist/esm-types/cli/lib/{ai → aiFiles}/integration.test.d.ts +0 -0
  607. /package/dist/esm-types/cli/lib/{ai → aiFiles}/prompt.test.d.ts +0 -0
@@ -3,13 +3,12 @@ import fs from "fs";
3
3
  import os from "os";
4
4
  import path from "path";
5
5
  import {
6
- checkAiFilesStaleness,
7
- disableAiFiles,
6
+ checkAiFilesStalenessAndLog,
8
7
  enableAiFiles,
9
8
  removeAiFiles,
10
- statusAiFiles,
11
- updateAiFiles,
9
+ installAiFiles,
12
10
  } from "./index.js";
11
+ import { statusAiFiles } from "./status.js";
13
12
  import { logMessage } from "../../../bundler/log.js";
14
13
  import { AGENTS_MD_START_MARKER } from "../../codegen_templates/agentsmd.js";
15
14
  import { CLAUDE_MD_START_MARKER } from "../../codegen_templates/claudemd.js";
@@ -22,10 +21,13 @@ vi.mock("../versionApi.js", () => ({
22
21
  downloadGuidelines: vi.fn(async () => "integration guidelines content"),
23
22
  fetchAgentSkillsSha: vi.fn(async () => "integration-sha"),
24
23
  getVersion: vi.fn(async () => ({
25
- message: null,
26
- guidelinesHash: "integration-guidelines-hash",
27
- agentSkillsSha: "integration-agent-skills-sha",
28
- disableSkillsCli: false,
24
+ kind: "ok",
25
+ data: {
26
+ message: null,
27
+ guidelinesHash: "integration-guidelines-hash",
28
+ agentSkillsSha: "integration-agent-skills-sha",
29
+ disableSkillsCli: false,
30
+ },
29
31
  })),
30
32
  }));
31
33
 
@@ -43,6 +45,8 @@ vi.mock("child_process", () => ({
43
45
  },
44
46
  }));
45
47
 
48
+ import child_process from "child_process";
49
+
46
50
  // ---------------------------------------------------------------------------
47
51
  // Shared helpers
48
52
  // ---------------------------------------------------------------------------
@@ -51,6 +55,16 @@ function readJson(filePath: string): any {
51
55
  return JSON.parse(fs.readFileSync(filePath, "utf8"));
52
56
  }
53
57
 
58
+ function patchConvexJson(projectDir: string, patch: object) {
59
+ const filePath = path.join(projectDir, "convex.json");
60
+ const existing = fs.existsSync(filePath) ? readJson(filePath) : {};
61
+ fs.writeFileSync(
62
+ filePath,
63
+ JSON.stringify({ ...existing, ...patch }, null, 2) + "\n",
64
+ "utf8",
65
+ );
66
+ }
67
+
54
68
  function makeTmpDir(): string {
55
69
  return fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
56
70
  }
@@ -80,7 +94,7 @@ describe("ai-files integration with default convex/ directory", () => {
80
94
  });
81
95
 
82
96
  test("install creates guidelines, state, AGENTS.md, and CLAUDE.md", async () => {
83
- await updateAiFiles(tmpDir, convexDir);
97
+ await installAiFiles({ projectDir: tmpDir, convexDir });
84
98
 
85
99
  expect(fs.existsSync(guidelinesPath())).toBe(true);
86
100
  expect(fs.existsSync(statePath())).toBe(true);
@@ -89,6 +103,55 @@ describe("ai-files integration with default convex/ directory", () => {
89
103
  expect(fs.readFileSync(guidelinesPath(), "utf8")).toBe(
90
104
  "integration guidelines content",
91
105
  );
106
+
107
+ // Default agents
108
+ expect(vi.mocked(child_process.spawn)).toHaveBeenCalledWith(
109
+ "npx",
110
+ expect.arrayContaining([
111
+ "add",
112
+ "get-convex/agent-skills",
113
+ "--yes",
114
+ "--agent",
115
+ "claude-code",
116
+ "--agent",
117
+ "codex",
118
+ ]),
119
+ expect.any(Object),
120
+ );
121
+ });
122
+
123
+ test("install respects explicit agent configuration", async () => {
124
+ await installAiFiles({
125
+ projectDir: tmpDir,
126
+ convexDir,
127
+ aiFilesConfig: { skills: { agents: ["cursor", "windsurf"] } },
128
+ });
129
+
130
+ expect(vi.mocked(child_process.spawn)).toHaveBeenCalledWith(
131
+ "npx",
132
+ expect.arrayContaining([
133
+ "add",
134
+ "get-convex/agent-skills",
135
+ "--yes",
136
+ "--agent",
137
+ "cursor",
138
+ "--agent",
139
+ "windsurf",
140
+ ]),
141
+ expect.any(Object),
142
+ );
143
+ });
144
+
145
+ test("install skips skills CLI when configured agents are empty", async () => {
146
+ await installAiFiles({
147
+ projectDir: tmpDir,
148
+ convexDir,
149
+ aiFilesConfig: { skills: { agents: [] } },
150
+ });
151
+
152
+ expect(fs.existsSync(guidelinesPath())).toBe(true);
153
+ expect(fs.existsSync(statePath())).toBe(true);
154
+ expect(vi.mocked(child_process.spawn)).not.toHaveBeenCalled();
92
155
  });
93
156
 
94
157
  test("preserves existing AGENTS.md content and injects managed section", async () => {
@@ -96,7 +159,7 @@ describe("ai-files integration with default convex/ directory", () => {
96
159
  path.join(tmpDir, "AGENTS.md"),
97
160
  "# My Project\n\nImportant team guidelines here.\n",
98
161
  );
99
- await updateAiFiles(tmpDir, convexDir);
162
+ await installAiFiles({ projectDir: tmpDir, convexDir });
100
163
  const content = fs.readFileSync(path.join(tmpDir, "AGENTS.md"), "utf8");
101
164
  expect(content).toContain("# My Project");
102
165
  expect(content).toContain("Important team guidelines here.");
@@ -111,17 +174,17 @@ describe("ai-files integration with default convex/ directory", () => {
111
174
  path.join(tmpDir, "CLAUDE.md"),
112
175
  "My custom CLAUDE.md content\n",
113
176
  );
114
- await updateAiFiles(tmpDir, convexDir);
177
+ await installAiFiles({ projectDir: tmpDir, convexDir });
115
178
  const content = fs.readFileSync(path.join(tmpDir, "CLAUDE.md"), "utf8");
116
179
  expect(content).toContain("My custom CLAUDE.md content");
117
180
  });
118
181
 
119
182
  test("second update is idempotent", async () => {
120
- await updateAiFiles(tmpDir, convexDir);
183
+ await installAiFiles({ projectDir: tmpDir, convexDir });
121
184
  const firstGuidelines = fs.readFileSync(guidelinesPath(), "utf8");
122
185
  const firstState = fs.readFileSync(statePath(), "utf8");
123
186
 
124
- await updateAiFiles(tmpDir, convexDir);
187
+ await installAiFiles({ projectDir: tmpDir, convexDir });
125
188
 
126
189
  expect(fs.readFileSync(guidelinesPath(), "utf8")).toBe(firstGuidelines);
127
190
  expect(fs.readFileSync(statePath(), "utf8")).toBe(firstState);
@@ -133,93 +196,61 @@ describe("ai-files integration with default convex/ directory", () => {
133
196
  path.join(tmpDir, ".cursor", "rules", "convex_rules.mdc"),
134
197
  "legacy",
135
198
  );
136
- await updateAiFiles(tmpDir, convexDir);
199
+ await installAiFiles({ projectDir: tmpDir, convexDir });
137
200
  expect(
138
201
  fs.existsSync(path.join(tmpDir, ".cursor", "rules", "convex_rules.mdc")),
139
202
  ).toBe(false);
140
203
  });
141
204
 
142
- test("skips locally modified guidelines", async () => {
143
- await updateAiFiles(tmpDir, convexDir);
144
- fs.appendFileSync(guidelinesPath(), "\n## My custom note\n");
145
- const state = readJson(statePath());
146
- state.guidelinesHash = "deliberately-stale-hash";
147
- fs.writeFileSync(statePath(), JSON.stringify(state, null, 2) + "\n");
148
-
149
- await updateAiFiles(tmpDir, convexDir);
150
-
151
- expect(fs.readFileSync(guidelinesPath(), "utf8")).toContain(
152
- "My custom note",
153
- );
154
- expect(vi.mocked(logMessage)).toHaveBeenCalledWith(
155
- expect.stringContaining("modified locally"),
156
- );
157
- });
158
-
159
205
  test("staleness check nags when stored hash is stale", async () => {
160
- await updateAiFiles(tmpDir, convexDir);
206
+ await installAiFiles({ projectDir: tmpDir, convexDir });
161
207
  const state = readJson(statePath());
162
208
  state.guidelinesHash = "deliberately-stale-hash";
163
209
  fs.writeFileSync(statePath(), JSON.stringify(state, null, 2) + "\n");
164
210
 
165
- await checkAiFilesStaleness("canonical-hash", null, tmpDir, convexDir);
211
+ await checkAiFilesStalenessAndLog({
212
+ canonicalGuidelinesHash: "canonical-hash",
213
+ canonicalAgentSkillsSha: null,
214
+ projectDir: tmpDir,
215
+ convexDir,
216
+ });
166
217
 
167
218
  expect(vi.mocked(logMessage)).toHaveBeenCalledWith(
168
219
  expect.stringContaining("out of date"),
169
220
  );
170
221
  });
171
222
 
172
- test("staleness check is silent when disabled in convex.json", async () => {
173
- await updateAiFiles(tmpDir, convexDir);
174
- await disableAiFiles(tmpDir);
175
- const state = readJson(statePath());
176
- state.guidelinesHash = "deliberately-stale-hash";
177
- fs.writeFileSync(statePath(), JSON.stringify(state, null, 2) + "\n");
178
- vi.mocked(logMessage).mockClear();
179
-
180
- await checkAiFilesStaleness("canonical-hash", null, tmpDir, convexDir);
181
-
182
- const calls = vi.mocked(logMessage).mock.calls.map((c) => c[0]);
183
- expect(
184
- calls.find((m) => typeof m === "string" && m.includes("out of date")),
185
- ).toBeUndefined();
186
- });
187
-
188
223
  test("disable keeps files but sets convex.json preference", async () => {
189
- await updateAiFiles(tmpDir, convexDir);
190
- await disableAiFiles(tmpDir);
224
+ await installAiFiles({ projectDir: tmpDir, convexDir });
225
+ patchConvexJson(tmpDir, { aiFiles: { enabled: false } });
191
226
 
192
- expect(readJson(projectConfigPath()).aiFiles.disableStalenessMessage).toBe(
193
- true,
194
- );
227
+ expect(readJson(projectConfigPath()).aiFiles.enabled).toBe(false);
195
228
  expect(fs.existsSync(guidelinesPath())).toBe(true);
196
229
  expect(fs.existsSync(path.join(tmpDir, "AGENTS.md"))).toBe(true);
197
230
  expect(fs.existsSync(path.join(tmpDir, "CLAUDE.md"))).toBe(true);
198
231
  });
199
232
 
200
233
  test("disable before install writes only convex.json and no AI state file", async () => {
201
- await disableAiFiles(tmpDir);
234
+ patchConvexJson(tmpDir, { aiFiles: { enabled: false } });
202
235
 
203
- expect(readJson(projectConfigPath()).aiFiles.disableStalenessMessage).toBe(
204
- true,
205
- );
236
+ expect(readJson(projectConfigPath()).aiFiles.enabled).toBe(false);
206
237
  expect(fs.existsSync(statePath())).toBe(false);
207
238
  expect(fs.existsSync(guidelinesPath())).toBe(false);
208
239
  });
209
240
 
210
241
  test("remove deletes ai directory and AGENTS.md managed section", async () => {
211
- await updateAiFiles(tmpDir, convexDir);
212
- await removeAiFiles(tmpDir, convexDir);
242
+ await installAiFiles({ projectDir: tmpDir, convexDir });
243
+ await removeAiFiles({ projectDir: tmpDir, convexDir });
213
244
 
214
245
  expect(fs.existsSync(aiDir())).toBe(false);
215
246
  });
216
247
 
217
248
  test("status reports not installed after remove", async () => {
218
- await updateAiFiles(tmpDir, convexDir);
219
- await removeAiFiles(tmpDir, convexDir);
249
+ await installAiFiles({ projectDir: tmpDir, convexDir });
250
+ await removeAiFiles({ projectDir: tmpDir, convexDir });
220
251
  vi.mocked(logMessage).mockClear();
221
252
 
222
- await statusAiFiles(tmpDir, convexDir);
253
+ await statusAiFiles({ projectDir: tmpDir, convexDir });
223
254
 
224
255
  expect(vi.mocked(logMessage)).toHaveBeenCalledWith(
225
256
  expect.stringContaining("not installed"),
@@ -227,10 +258,10 @@ describe("ai-files integration with default convex/ directory", () => {
227
258
  });
228
259
 
229
260
  test("status reports installed and enabled after install", async () => {
230
- await updateAiFiles(tmpDir, convexDir);
261
+ await installAiFiles({ projectDir: tmpDir, convexDir });
231
262
  vi.mocked(logMessage).mockClear();
232
263
 
233
- await statusAiFiles(tmpDir, convexDir);
264
+ await statusAiFiles({ projectDir: tmpDir, convexDir });
234
265
 
235
266
  expect(vi.mocked(logMessage)).toHaveBeenCalledWith(
236
267
  expect.stringContaining("enabled"),
@@ -238,52 +269,60 @@ describe("ai-files integration with default convex/ directory", () => {
238
269
  });
239
270
 
240
271
  test("disable after CLAUDE.md user edits preserves the file", async () => {
241
- await updateAiFiles(tmpDir, convexDir);
272
+ await installAiFiles({ projectDir: tmpDir, convexDir });
242
273
  fs.appendFileSync(path.join(tmpDir, "CLAUDE.md"), "My custom note\n");
243
- await disableAiFiles(tmpDir);
274
+ patchConvexJson(tmpDir, { aiFiles: { enabled: false } });
244
275
  expect(fs.readFileSync(path.join(tmpDir, "CLAUDE.md"), "utf8")).toContain(
245
276
  "My custom note",
246
277
  );
247
278
  });
248
279
 
249
280
  test("update recreates missing CLAUDE.md", async () => {
250
- await updateAiFiles(tmpDir, convexDir);
281
+ await installAiFiles({ projectDir: tmpDir, convexDir });
251
282
  fs.rmSync(path.join(tmpDir, "CLAUDE.md"), { force: true });
252
283
 
253
- await updateAiFiles(tmpDir, convexDir);
284
+ await installAiFiles({ projectDir: tmpDir, convexDir });
254
285
 
255
286
  expect(fs.readFileSync(path.join(tmpDir, "CLAUDE.md"), "utf8")).toContain(
256
287
  "convex/_generated/ai/guidelines.md",
257
288
  );
258
289
  });
259
290
 
260
- test("enable clears disableStalenessMessage", async () => {
261
- await updateAiFiles(tmpDir, convexDir);
262
- await disableAiFiles(tmpDir);
291
+ test("enable sets enabled flag to true and strips deprecated disableStalenessMessage", async () => {
292
+ await installAiFiles({ projectDir: tmpDir, convexDir });
293
+ patchConvexJson(tmpDir, { aiFiles: { disableStalenessMessage: true } });
263
294
  expect(readJson(projectConfigPath()).aiFiles.disableStalenessMessage).toBe(
264
295
  true,
265
296
  );
266
297
 
267
- await enableAiFiles(tmpDir, convexDir);
298
+ const newAiFiles = await enableAiFiles({
299
+ projectDir: tmpDir,
300
+ convexDir,
301
+ aiFilesConfig: readJson(projectConfigPath()).aiFiles,
302
+ });
303
+ patchConvexJson(tmpDir, { aiFiles: newAiFiles });
268
304
 
269
- expect(readJson(projectConfigPath()).aiFiles.disableStalenessMessage).toBe(
270
- false,
271
- );
305
+ const updatedConfig = readJson(projectConfigPath());
306
+ expect(updatedConfig.aiFiles.enabled).toBe(true);
307
+ expect(updatedConfig.aiFiles.disableStalenessMessage).toBeUndefined();
272
308
  });
273
309
 
274
310
  test("full cycle: disable -> remove -> enable reinstalls everything", async () => {
275
- await updateAiFiles(tmpDir, convexDir);
276
- await disableAiFiles(tmpDir);
277
- await removeAiFiles(tmpDir, convexDir);
311
+ await installAiFiles({ projectDir: tmpDir, convexDir });
312
+ patchConvexJson(tmpDir, { aiFiles: { enabled: false } });
313
+ await removeAiFiles({ projectDir: tmpDir, convexDir });
278
314
  expect(fs.existsSync(aiDir())).toBe(false);
279
315
 
280
- await enableAiFiles(tmpDir, convexDir);
316
+ const newAiFiles = await enableAiFiles({
317
+ projectDir: tmpDir,
318
+ convexDir,
319
+ aiFilesConfig: readJson(projectConfigPath()).aiFiles,
320
+ });
321
+ patchConvexJson(tmpDir, { aiFiles: newAiFiles });
281
322
 
282
323
  expect(fs.existsSync(guidelinesPath())).toBe(true);
283
324
  expect(fs.existsSync(path.join(tmpDir, "AGENTS.md"))).toBe(true);
284
- expect(readJson(projectConfigPath()).aiFiles.disableStalenessMessage).toBe(
285
- false,
286
- );
325
+ expect(readJson(projectConfigPath()).aiFiles.enabled).toBe(true);
287
326
  });
288
327
 
289
328
  test("remove strips managed section from AGENTS.md but preserves user content", async () => {
@@ -291,11 +330,11 @@ describe("ai-files integration with default convex/ directory", () => {
291
330
  path.join(tmpDir, "AGENTS.md"),
292
331
  "# My Project\n\nTeam guidelines here.\n",
293
332
  );
294
- await updateAiFiles(tmpDir, convexDir);
333
+ await installAiFiles({ projectDir: tmpDir, convexDir });
295
334
  const before = fs.readFileSync(path.join(tmpDir, "AGENTS.md"), "utf8");
296
335
  expect(before).toContain(AGENTS_MD_START_MARKER);
297
336
 
298
- await removeAiFiles(tmpDir, convexDir);
337
+ await removeAiFiles({ projectDir: tmpDir, convexDir });
299
338
 
300
339
  const after = fs.readFileSync(path.join(tmpDir, "AGENTS.md"), "utf8");
301
340
  expect(after).toContain("# My Project");
@@ -304,19 +343,19 @@ describe("ai-files integration with default convex/ directory", () => {
304
343
  });
305
344
 
306
345
  test("remove on AGENTS.md with only Convex content deletes the file", async () => {
307
- await updateAiFiles(tmpDir, convexDir);
346
+ await installAiFiles({ projectDir: tmpDir, convexDir });
308
347
  expect(fs.existsSync(path.join(tmpDir, "AGENTS.md"))).toBe(true);
309
348
 
310
- await removeAiFiles(tmpDir, convexDir);
349
+ await removeAiFiles({ projectDir: tmpDir, convexDir });
311
350
 
312
351
  expect(fs.existsSync(path.join(tmpDir, "AGENTS.md"))).toBe(false);
313
352
  });
314
353
 
315
354
  test("remove deletes CLAUDE.md when empty after stripping managed section", async () => {
316
- await updateAiFiles(tmpDir, convexDir);
355
+ await installAiFiles({ projectDir: tmpDir, convexDir });
317
356
  expect(fs.existsSync(path.join(tmpDir, "CLAUDE.md"))).toBe(true);
318
357
 
319
- await removeAiFiles(tmpDir, convexDir);
358
+ await removeAiFiles({ projectDir: tmpDir, convexDir });
320
359
 
321
360
  expect(fs.existsSync(path.join(tmpDir, "CLAUDE.md"))).toBe(false);
322
361
  });
@@ -326,11 +365,11 @@ describe("ai-files integration with default convex/ directory", () => {
326
365
  path.join(tmpDir, "CLAUDE.md"),
327
366
  "My project-specific Claude instructions\n",
328
367
  );
329
- await updateAiFiles(tmpDir, convexDir);
368
+ await installAiFiles({ projectDir: tmpDir, convexDir });
330
369
  const before = fs.readFileSync(path.join(tmpDir, "CLAUDE.md"), "utf8");
331
370
  expect(before).toContain(CLAUDE_MD_START_MARKER);
332
371
 
333
- await removeAiFiles(tmpDir, convexDir);
372
+ await removeAiFiles({ projectDir: tmpDir, convexDir });
334
373
 
335
374
  const after = fs.readFileSync(path.join(tmpDir, "CLAUDE.md"), "utf8");
336
375
  expect(after).toContain("My project-specific Claude instructions");
@@ -340,7 +379,12 @@ describe("ai-files integration with default convex/ directory", () => {
340
379
  test("checkAiFilesStaleness nags when no state file exists", async () => {
341
380
  vi.mocked(logMessage).mockClear();
342
381
 
343
- await checkAiFilesStaleness(null, null, tmpDir, convexDir);
382
+ await checkAiFilesStalenessAndLog({
383
+ canonicalGuidelinesHash: null,
384
+ canonicalAgentSkillsSha: null,
385
+ projectDir: tmpDir,
386
+ convexDir,
387
+ });
344
388
 
345
389
  expect(vi.mocked(logMessage)).toHaveBeenCalledWith(
346
390
  expect.stringContaining("not installed"),
@@ -348,16 +392,16 @@ describe("ai-files integration with default convex/ directory", () => {
348
392
  });
349
393
 
350
394
  test("checkAiFilesStaleness is silent when hashes match", async () => {
351
- await updateAiFiles(tmpDir, convexDir);
395
+ await installAiFiles({ projectDir: tmpDir, convexDir });
352
396
  const state = readJson(statePath());
353
397
  vi.mocked(logMessage).mockClear();
354
398
 
355
- await checkAiFilesStaleness(
356
- state.guidelinesHash,
357
- state.agentSkillsSha,
358
- tmpDir,
399
+ await checkAiFilesStalenessAndLog({
400
+ canonicalGuidelinesHash: state.guidelinesHash,
401
+ canonicalAgentSkillsSha: state.agentSkillsSha,
402
+ projectDir: tmpDir,
359
403
  convexDir,
360
- );
404
+ });
361
405
 
362
406
  const calls = vi.mocked(logMessage).mock.calls.map((c) => c[0]);
363
407
  expect(
@@ -369,9 +413,9 @@ describe("ai-files integration with default convex/ directory", () => {
369
413
  });
370
414
 
371
415
  test("AGENTS.md managed section is replaced not duplicated on repeated updates", async () => {
372
- await updateAiFiles(tmpDir, convexDir);
373
- await updateAiFiles(tmpDir, convexDir);
374
- await updateAiFiles(tmpDir, convexDir);
416
+ await installAiFiles({ projectDir: tmpDir, convexDir });
417
+ await installAiFiles({ projectDir: tmpDir, convexDir });
418
+ await installAiFiles({ projectDir: tmpDir, convexDir });
375
419
 
376
420
  const content = fs.readFileSync(path.join(tmpDir, "AGENTS.md"), "utf8");
377
421
  const markerCount = content.split(AGENTS_MD_START_MARKER).length - 1;
@@ -379,11 +423,15 @@ describe("ai-files integration with default convex/ directory", () => {
379
423
  });
380
424
 
381
425
  test("status reports disabled state after disable", async () => {
382
- await updateAiFiles(tmpDir, convexDir);
383
- await disableAiFiles(tmpDir);
426
+ await installAiFiles({ projectDir: tmpDir, convexDir });
427
+ patchConvexJson(tmpDir, { aiFiles: { enabled: false } });
384
428
  vi.mocked(logMessage).mockClear();
385
429
 
386
- await statusAiFiles(tmpDir, convexDir);
430
+ await statusAiFiles({
431
+ projectDir: tmpDir,
432
+ convexDir,
433
+ aiFilesConfig: readJson(projectConfigPath()).aiFiles,
434
+ });
387
435
 
388
436
  expect(vi.mocked(logMessage)).toHaveBeenCalledWith(
389
437
  expect.stringContaining("disabled"),
@@ -421,7 +469,7 @@ describe("ai-files integration with functions directory override", () => {
421
469
  });
422
470
 
423
471
  test("installs into overridden functions directory, not default convex/", async () => {
424
- await updateAiFiles(tmpDir, convexDir);
472
+ await installAiFiles({ projectDir: tmpDir, convexDir });
425
473
 
426
474
  expect(fs.existsSync(guidelinesPath())).toBe(true);
427
475
  expect(fs.existsSync(statePath())).toBe(true);
@@ -440,7 +488,7 @@ describe("ai-files integration with functions directory override", () => {
440
488
  path.join(tmpDir, "AGENTS.md"),
441
489
  "# Existing\n\nUser content.\n",
442
490
  );
443
- await updateAiFiles(tmpDir, convexDir);
491
+ await installAiFiles({ projectDir: tmpDir, convexDir });
444
492
  const content = fs.readFileSync(path.join(tmpDir, "AGENTS.md"), "utf8");
445
493
  expect(content).toContain("# Existing");
446
494
  expect(content).toContain("User content.");
@@ -456,17 +504,17 @@ describe("ai-files integration with functions directory override", () => {
456
504
  "My custom CLAUDE.md content\n",
457
505
  "utf8",
458
506
  );
459
- await updateAiFiles(tmpDir, convexDir);
507
+ await installAiFiles({ projectDir: tmpDir, convexDir });
460
508
  const content = fs.readFileSync(path.join(tmpDir, "CLAUDE.md"), "utf8");
461
509
  expect(content).toContain("My custom CLAUDE.md content");
462
510
  });
463
511
 
464
512
  test("second update is idempotent", async () => {
465
- await updateAiFiles(tmpDir, convexDir);
513
+ await installAiFiles({ projectDir: tmpDir, convexDir });
466
514
  const firstGuidelines = fs.readFileSync(guidelinesPath(), "utf8");
467
515
  const firstState = fs.readFileSync(statePath(), "utf8");
468
516
 
469
- await updateAiFiles(tmpDir, convexDir);
517
+ await installAiFiles({ projectDir: tmpDir, convexDir });
470
518
 
471
519
  expect(fs.readFileSync(guidelinesPath(), "utf8")).toBe(firstGuidelines);
472
520
  expect(fs.readFileSync(statePath(), "utf8")).toBe(firstState);
@@ -479,36 +527,14 @@ describe("ai-files integration with functions directory override", () => {
479
527
  "legacy",
480
528
  "utf8",
481
529
  );
482
- await updateAiFiles(tmpDir, convexDir);
530
+ await installAiFiles({ projectDir: tmpDir, convexDir });
483
531
  expect(
484
532
  fs.existsSync(path.join(tmpDir, ".cursor", "rules", "convex_rules.mdc")),
485
533
  ).toBe(false);
486
534
  });
487
535
 
488
- test("skips locally modified guidelines when stored hash is stale", async () => {
489
- await updateAiFiles(tmpDir, convexDir);
490
- const localNote = "\n## My custom note\n";
491
- fs.appendFileSync(guidelinesPath(), localNote, "utf8");
492
- const state = readJson(statePath());
493
- state.guidelinesHash = "deliberately-stale-hash";
494
- fs.writeFileSync(
495
- statePath(),
496
- JSON.stringify(state, null, 2) + "\n",
497
- "utf8",
498
- );
499
-
500
- await updateAiFiles(tmpDir, convexDir);
501
-
502
- expect(fs.readFileSync(guidelinesPath(), "utf8")).toContain(
503
- localNote.trim(),
504
- );
505
- expect(vi.mocked(logMessage)).toHaveBeenCalledWith(
506
- expect.stringContaining("modified locally"),
507
- );
508
- });
509
-
510
536
  test("staleness check logs update nag for stale stored hash", async () => {
511
- await updateAiFiles(tmpDir, convexDir);
537
+ await installAiFiles({ projectDir: tmpDir, convexDir });
512
538
  const state = readJson(statePath());
513
539
  state.guidelinesHash = "deliberately-stale-hash";
514
540
  fs.writeFileSync(
@@ -517,7 +543,12 @@ describe("ai-files integration with functions directory override", () => {
517
543
  "utf8",
518
544
  );
519
545
 
520
- await checkAiFilesStaleness("canonical-hash", null, tmpDir, convexDir);
546
+ await checkAiFilesStalenessAndLog({
547
+ canonicalGuidelinesHash: "canonical-hash",
548
+ canonicalAgentSkillsSha: null,
549
+ projectDir: tmpDir,
550
+ convexDir,
551
+ });
521
552
 
522
553
  expect(vi.mocked(logMessage)).toHaveBeenCalledWith(
523
554
  expect.stringContaining("out of date"),
@@ -525,21 +556,19 @@ describe("ai-files integration with functions directory override", () => {
525
556
  });
526
557
 
527
558
  test("disable sets convex.json preference and keeps files", async () => {
528
- await updateAiFiles(tmpDir, convexDir);
529
- await disableAiFiles(tmpDir);
559
+ await installAiFiles({ projectDir: tmpDir, convexDir });
560
+ patchConvexJson(tmpDir, { aiFiles: { enabled: false } });
530
561
 
531
- expect(readJson(projectConfigPath()).aiFiles.disableStalenessMessage).toBe(
532
- true,
533
- );
562
+ expect(readJson(projectConfigPath()).aiFiles.enabled).toBe(false);
534
563
  expect(fs.existsSync(guidelinesPath())).toBe(true);
535
564
  expect(fs.existsSync(path.join(tmpDir, "AGENTS.md"))).toBe(true);
536
565
  expect(fs.existsSync(path.join(tmpDir, "CLAUDE.md"))).toBe(true);
537
566
  });
538
567
 
539
568
  test("remove deletes files and status reports not installed", async () => {
540
- await updateAiFiles(tmpDir, convexDir);
541
- await removeAiFiles(tmpDir, convexDir);
542
- await statusAiFiles(tmpDir, convexDir);
569
+ await installAiFiles({ projectDir: tmpDir, convexDir });
570
+ await removeAiFiles({ projectDir: tmpDir, convexDir });
571
+ await statusAiFiles({ projectDir: tmpDir, convexDir });
543
572
 
544
573
  expect(fs.existsSync(aiDir())).toBe(false);
545
574
  expect(vi.mocked(logMessage)).toHaveBeenCalledWith(
@@ -548,23 +577,23 @@ describe("ai-files integration with functions directory override", () => {
548
577
  });
549
578
 
550
579
  test("disable after CLAUDE.md user edits preserves file", async () => {
551
- await updateAiFiles(tmpDir, convexDir);
580
+ await installAiFiles({ projectDir: tmpDir, convexDir });
552
581
  fs.appendFileSync(
553
582
  path.join(tmpDir, "CLAUDE.md"),
554
583
  "My custom note\n",
555
584
  "utf8",
556
585
  );
557
- await disableAiFiles(tmpDir);
586
+ patchConvexJson(tmpDir, { aiFiles: { enabled: false } });
558
587
  expect(fs.readFileSync(path.join(tmpDir, "CLAUDE.md"), "utf8")).toContain(
559
588
  "My custom note",
560
589
  );
561
590
  });
562
591
 
563
592
  test("update recreates missing CLAUDE.md", async () => {
564
- await updateAiFiles(tmpDir, convexDir);
593
+ await installAiFiles({ projectDir: tmpDir, convexDir });
565
594
  fs.rmSync(path.join(tmpDir, "CLAUDE.md"), { force: true });
566
595
 
567
- await updateAiFiles(tmpDir, convexDir);
596
+ await installAiFiles({ projectDir: tmpDir, convexDir });
568
597
 
569
598
  const content = fs.readFileSync(path.join(tmpDir, "CLAUDE.md"), "utf8");
570
599
  expect(content).toMatch(
@@ -572,30 +601,38 @@ describe("ai-files integration with functions directory override", () => {
572
601
  );
573
602
  });
574
603
 
575
- test("enable clears disableStalenessMessage and re-enables status", async () => {
576
- await updateAiFiles(tmpDir, convexDir);
577
- await disableAiFiles(tmpDir);
578
- await enableAiFiles(tmpDir, convexDir);
579
- await statusAiFiles(tmpDir, convexDir);
604
+ test("enable sets enabled flag to true and re-enables status", async () => {
605
+ await installAiFiles({ projectDir: tmpDir, convexDir });
606
+ patchConvexJson(tmpDir, { aiFiles: { enabled: false } });
607
+ const newAiFiles = await enableAiFiles({
608
+ projectDir: tmpDir,
609
+ convexDir,
610
+ aiFilesConfig: readJson(projectConfigPath()).aiFiles,
611
+ });
612
+ patchConvexJson(tmpDir, { aiFiles: newAiFiles });
613
+ await statusAiFiles({ projectDir: tmpDir, convexDir });
580
614
 
581
- expect(readJson(projectConfigPath()).aiFiles.disableStalenessMessage).toBe(
582
- false,
583
- );
615
+ expect(readJson(projectConfigPath()).aiFiles.enabled).toBe(true);
584
616
  expect(vi.mocked(logMessage)).toHaveBeenCalledWith(
585
617
  expect.stringContaining("enabled"),
586
618
  );
587
619
  });
588
620
 
589
621
  test("disable + remove + enable works with overridden functions directory", async () => {
590
- await updateAiFiles(tmpDir, convexDir);
591
- await disableAiFiles(tmpDir);
592
- await removeAiFiles(tmpDir, convexDir);
622
+ await installAiFiles({ projectDir: tmpDir, convexDir });
623
+ patchConvexJson(tmpDir, { aiFiles: { enabled: false } });
624
+ await removeAiFiles({ projectDir: tmpDir, convexDir });
593
625
 
594
626
  expect(
595
627
  fs.existsSync(path.join(tmpDir, "src", "convex", "_generated", "ai")),
596
628
  ).toBe(false);
597
629
 
598
- await enableAiFiles(tmpDir, convexDir);
630
+ const newAiFiles = await enableAiFiles({
631
+ projectDir: tmpDir,
632
+ convexDir,
633
+ aiFilesConfig: readJson(projectConfigPath()).aiFiles,
634
+ });
635
+ patchConvexJson(tmpDir, { aiFiles: newAiFiles });
599
636
 
600
637
  expect(fs.existsSync(guidelinesPath())).toBe(true);
601
638
  });