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