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,986 +0,0 @@
1
- import { describe, test, expect, vi, beforeEach, afterEach } from "vitest";
2
- import { logMessage } from "../../../bundler/log.js";
3
- import {
4
- attemptReadAiState,
5
- readAiStateOrDefault,
6
- writeAiState,
7
- } from "./state.js";
8
- import {
9
- downloadGuidelines,
10
- fetchAgentSkillsCatalog,
11
- fetchAgentSkillsSha,
12
- getVersion,
13
- } from "../versionApi.js";
14
- import fs from "fs";
15
- import os from "os";
16
- import path from "path";
17
- import {
18
- checkAiFilesStalenessAndLog,
19
- installAiFiles,
20
- removeAiFiles,
21
- } from "./index.js";
22
- import { statusAiFiles } from "./status.js";
23
- import {
24
- AGENTS_MD_START_MARKER,
25
- AGENTS_MD_END_MARKER,
26
- } from "../../codegen_templates/agentsmd.js";
27
- import {
28
- CLAUDE_MD_START_MARKER,
29
- CLAUDE_MD_END_MARKER,
30
- } from "../../codegen_templates/claudemd.js";
31
-
32
- // ---------------------------------------------------------------------------
33
- // Mocks
34
- // ---------------------------------------------------------------------------
35
-
36
- vi.mock("@sentry/node", () => ({
37
- captureException: vi.fn(),
38
- captureMessage: vi.fn(),
39
- }));
40
-
41
- vi.mock("../../../bundler/log.js", () => ({
42
- logMessage: vi.fn(),
43
- }));
44
-
45
- vi.mock("./state.js", () => ({
46
- attemptReadAiState: vi.fn(),
47
- readAiStateOrDefault: vi.fn(),
48
- writeAiState: vi.fn(),
49
- hasAiState: vi.fn().mockResolvedValue(false),
50
- }));
51
-
52
- vi.mock("../versionApi.js", () => ({
53
- downloadGuidelines: vi.fn(),
54
- fetchAgentSkillsCatalog: vi.fn(),
55
- fetchAgentSkillsSha: vi.fn(),
56
- getVersion: vi.fn(),
57
- }));
58
-
59
- vi.mock("child_process", () => ({
60
- default: {
61
- spawn: vi.fn(() => {
62
- const emitter = { on: vi.fn() };
63
- emitter.on.mockImplementation(
64
- (event: string, cb: (arg: number) => void) => {
65
- if (event === "close") cb(0);
66
- },
67
- );
68
- return emitter;
69
- }),
70
- },
71
- }));
72
-
73
- const mockLogMessage = vi.mocked(logMessage);
74
- const mockAttemptReadAiState = vi.mocked(attemptReadAiState);
75
- const mockReadAiStateOrDefault = vi.mocked(readAiStateOrDefault);
76
- const mockWriteAiState = vi.mocked(writeAiState);
77
- const mockDownloadGuidelines = vi.mocked(downloadGuidelines);
78
- const mockFetchAgentSkillsCatalog = vi.mocked(fetchAgentSkillsCatalog);
79
- const mockFetchAgentSkillsSha = vi.mocked(fetchAgentSkillsSha);
80
- const mockGetVersion = vi.mocked(getVersion);
81
-
82
- /** Minimal valid state used across tests; includes all required fields. */
83
- const baseState = {
84
- guidelinesHash: null,
85
- agentsMdSectionHash: null,
86
- claudeMdHash: null,
87
- agentSkillsSha: null,
88
- };
89
-
90
- beforeEach(() => {
91
- mockFetchAgentSkillsCatalog.mockResolvedValue({
92
- kind: "ok",
93
- data: {
94
- latestRepoSha: "canonical-sha-abc123",
95
- skills: [
96
- {
97
- skillName: "migration-helper",
98
- status: { kind: "active" },
99
- hash: "hash-a",
100
- lastSeenRepoSha: "canonical-sha-abc123",
101
- lastSeenAt: 123,
102
- },
103
- {
104
- skillName: "schema-builder",
105
- status: { kind: "active" },
106
- hash: "hash-b",
107
- lastSeenRepoSha: "canonical-sha-abc123",
108
- lastSeenAt: 123,
109
- },
110
- ],
111
- },
112
- });
113
- });
114
-
115
- // ---------------------------------------------------------------------------
116
- // checkAiFilesStaleness
117
- // ---------------------------------------------------------------------------
118
-
119
- describe("checkAiFilesStaleness", () => {
120
- beforeEach(() => {
121
- vi.clearAllMocks();
122
- });
123
- afterEach(() => {
124
- vi.unstubAllEnvs();
125
- vi.resetAllMocks();
126
- });
127
-
128
- const dummyProjectDir = "/tmp/test-project";
129
- const dummyConvexDir = "/tmp/test-project/convex";
130
-
131
- test("logs install nudge when no state file exists, even with null canonical values", async () => {
132
- mockAttemptReadAiState.mockResolvedValue({ kind: "no-file" });
133
-
134
- await checkAiFilesStalenessAndLog({
135
- canonicalGuidelinesHash: null,
136
- canonicalAgentSkillsSha: null,
137
- projectDir: dummyProjectDir,
138
- convexDir: dummyConvexDir,
139
- });
140
-
141
- expect(mockAttemptReadAiState).toHaveBeenCalled();
142
- expect(mockLogMessage).toHaveBeenCalledWith(
143
- expect.stringContaining("npx convex ai-files install"),
144
- );
145
- expect(mockLogMessage).toHaveBeenCalledWith(
146
- expect.stringContaining("not installed"),
147
- );
148
- });
149
-
150
- test("does nothing when both canonical values are null but state exists (version server unavailable)", async () => {
151
- mockAttemptReadAiState.mockResolvedValue({
152
- kind: "ok",
153
- state: { ...baseState, guidelinesHash: "some-hash" },
154
- });
155
-
156
- await checkAiFilesStalenessAndLog({
157
- canonicalGuidelinesHash: null,
158
- canonicalAgentSkillsSha: null,
159
- projectDir: dummyProjectDir,
160
- convexDir: dummyConvexDir,
161
- });
162
-
163
- expect(mockLogMessage).not.toHaveBeenCalled();
164
- });
165
-
166
- test("logs install nudge when no state file exists, even if canonical hashes are available", async () => {
167
- mockAttemptReadAiState.mockResolvedValue({ kind: "no-file" });
168
-
169
- await checkAiFilesStalenessAndLog({
170
- canonicalGuidelinesHash: "canonical-hash",
171
- canonicalAgentSkillsSha: null,
172
- projectDir: dummyProjectDir,
173
- convexDir: dummyConvexDir,
174
- });
175
-
176
- expect(mockLogMessage).toHaveBeenCalledWith(
177
- expect.stringContaining("npx convex ai-files install"),
178
- );
179
- expect(mockLogMessage).toHaveBeenCalledWith(
180
- expect.stringContaining("npx convex ai-files disable"),
181
- );
182
- expect(mockLogMessage).toHaveBeenCalledWith(
183
- expect.stringContaining("not installed"),
184
- );
185
- });
186
-
187
- test("does nothing when config has enabled=false (user opted out)", async () => {
188
- mockAttemptReadAiState.mockResolvedValue({ kind: "no-file" });
189
-
190
- await checkAiFilesStalenessAndLog({
191
- canonicalGuidelinesHash: "canonical-hash",
192
- canonicalAgentSkillsSha: null,
193
- aiFilesConfig: { enabled: false },
194
- projectDir: dummyProjectDir,
195
- convexDir: dummyConvexDir,
196
- });
197
-
198
- expect(mockLogMessage).not.toHaveBeenCalled();
199
- });
200
-
201
- test("does nothing when stored guidelines hash matches canonical", async () => {
202
- mockAttemptReadAiState.mockResolvedValue({
203
- kind: "ok",
204
- state: { ...baseState, guidelinesHash: "same-hash" },
205
- });
206
-
207
- await checkAiFilesStalenessAndLog({
208
- canonicalGuidelinesHash: "same-hash",
209
- canonicalAgentSkillsSha: null,
210
- projectDir: dummyProjectDir,
211
- convexDir: dummyConvexDir,
212
- });
213
-
214
- expect(mockLogMessage).not.toHaveBeenCalled();
215
- });
216
-
217
- test("logs nag message when guidelines hash is stale", async () => {
218
- mockAttemptReadAiState.mockResolvedValue({
219
- kind: "ok",
220
- state: { ...baseState, guidelinesHash: "old-hash" },
221
- });
222
-
223
- await checkAiFilesStalenessAndLog({
224
- canonicalGuidelinesHash: "new-canonical-hash",
225
- canonicalAgentSkillsSha: null,
226
- projectDir: dummyProjectDir,
227
- convexDir: dummyConvexDir,
228
- });
229
-
230
- expect(mockLogMessage).toHaveBeenCalledWith(
231
- expect.stringContaining("npx convex ai-files update"),
232
- );
233
- });
234
-
235
- test("logs nag message when agent skills SHA is stale", async () => {
236
- mockAttemptReadAiState.mockResolvedValue({
237
- kind: "ok",
238
- state: {
239
- ...baseState,
240
- guidelinesHash: "current-hash",
241
- agentSkillsSha: "old-sha",
242
- },
243
- });
244
-
245
- await checkAiFilesStalenessAndLog({
246
- canonicalGuidelinesHash: "current-hash",
247
- canonicalAgentSkillsSha: "new-sha",
248
- projectDir: dummyProjectDir,
249
- convexDir: dummyConvexDir,
250
- });
251
-
252
- expect(mockLogMessage).toHaveBeenCalledWith(
253
- expect.stringContaining("npx convex ai-files update"),
254
- );
255
- });
256
-
257
- test("does nothing when stored guidelinesHash is null (never written)", async () => {
258
- mockAttemptReadAiState.mockResolvedValue({
259
- kind: "ok",
260
- state: baseState,
261
- });
262
-
263
- await checkAiFilesStalenessAndLog({
264
- canonicalGuidelinesHash: "some-hash",
265
- canonicalAgentSkillsSha: "some-sha",
266
- projectDir: dummyProjectDir,
267
- convexDir: dummyConvexDir,
268
- });
269
-
270
- expect(mockLogMessage).not.toHaveBeenCalled();
271
- });
272
- });
273
-
274
- // ---------------------------------------------------------------------------
275
- // installAiFiles
276
- // ---------------------------------------------------------------------------
277
-
278
- describe("installAiFiles", () => {
279
- beforeEach(() => {
280
- vi.clearAllMocks();
281
- mockFetchAgentSkillsSha.mockResolvedValue("canonical-sha-abc123");
282
- mockGetVersion.mockResolvedValue({
283
- kind: "ok",
284
- data: {
285
- message: null,
286
- guidelinesHash: null,
287
- agentSkillsSha: "canonical-sha-abc123",
288
- disableSkillsCli: false,
289
- disableSkillsCliMessage: null,
290
- },
291
- });
292
- });
293
- afterEach(() => vi.resetAllMocks());
294
-
295
- test("runs full init and installs skills when no state exists", async () => {
296
- mockReadAiStateOrDefault.mockResolvedValue(baseState);
297
-
298
- const tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
299
- const convexDir = path.join(tmpDir, "convex");
300
- try {
301
- fs.mkdirSync(convexDir, { recursive: true });
302
- fs.writeFileSync(path.join(convexDir, "schema.ts"), "");
303
-
304
- mockDownloadGuidelines.mockResolvedValue("guidelines content");
305
-
306
- await installAiFiles({ projectDir: tmpDir, convexDir });
307
-
308
- expect(
309
- fs.existsSync(
310
- path.join(convexDir, "_generated", "ai", "guidelines.md"),
311
- ),
312
- ).toBe(true);
313
-
314
- const { default: cp } = await import("child_process");
315
- const spawnCalls = vi.mocked(cp.spawn).mock.calls;
316
- const addCall = spawnCalls.find(
317
- (c) => Array.isArray(c[1]) && c[1].includes("add"),
318
- );
319
- expect(addCall).toBeDefined();
320
- } finally {
321
- fs.rmSync(tmpDir, { recursive: true, force: true });
322
- }
323
- });
324
-
325
- test("logs warning when guidelines download is unavailable", async () => {
326
- const tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
327
- const convexDir = path.join(tmpDir, "convex");
328
- try {
329
- mockReadAiStateOrDefault.mockResolvedValue(baseState);
330
- mockDownloadGuidelines.mockResolvedValue(null);
331
-
332
- await installAiFiles({ projectDir: tmpDir, convexDir });
333
-
334
- expect(mockLogMessage).toHaveBeenCalledWith(
335
- expect.stringContaining("Could not download Convex AI guidelines"),
336
- );
337
- } finally {
338
- fs.rmSync(tmpDir, { recursive: true, force: true });
339
- }
340
- });
341
-
342
- test("skips skills install when server kill switch is enabled", async () => {
343
- const tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
344
- const convexDir = path.join(tmpDir, "convex");
345
- try {
346
- mockReadAiStateOrDefault.mockResolvedValue(baseState);
347
- mockDownloadGuidelines.mockResolvedValue("guidelines content");
348
- mockGetVersion.mockResolvedValue({
349
- kind: "ok",
350
- data: {
351
- message: null,
352
- guidelinesHash: null,
353
- agentSkillsSha: null,
354
- disableSkillsCli: true,
355
- disableSkillsCliMessage: null,
356
- },
357
- });
358
-
359
- await installAiFiles({ projectDir: tmpDir, convexDir });
360
-
361
- const { default: cp } = await import("child_process");
362
- const spawnCalls = vi.mocked(cp.spawn).mock.calls;
363
- const addCall = spawnCalls.find(
364
- (c) => Array.isArray(c[1]) && c[1].includes("add"),
365
- );
366
- expect(addCall).toBeUndefined();
367
- expect(mockLogMessage).toHaveBeenCalledWith(
368
- expect.stringContaining("Agent skills are temporarily disabled."),
369
- );
370
- } finally {
371
- fs.rmSync(tmpDir, { recursive: true, force: true });
372
- }
373
- });
374
-
375
- test("logs the server-provided message when skills are disabled", async () => {
376
- const tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
377
- const convexDir = path.join(tmpDir, "convex");
378
- try {
379
- mockReadAiStateOrDefault.mockResolvedValue(baseState);
380
- mockDownloadGuidelines.mockResolvedValue("guidelines content");
381
- mockGetVersion.mockResolvedValue({
382
- kind: "ok",
383
- data: {
384
- message: null,
385
- guidelinesHash: null,
386
- agentSkillsSha: null,
387
- disableSkillsCli: true,
388
- disableSkillsCliMessage:
389
- "Skills are down for maintenance until 3pm PT.",
390
- },
391
- });
392
-
393
- await installAiFiles({ projectDir: tmpDir, convexDir });
394
-
395
- const { default: cp } = await import("child_process");
396
- const spawnCalls = vi.mocked(cp.spawn).mock.calls;
397
- const addCall = spawnCalls.find(
398
- (c) => Array.isArray(c[1]) && c[1].includes("add"),
399
- );
400
- expect(addCall).toBeUndefined();
401
- expect(mockLogMessage).toHaveBeenCalledWith(
402
- expect.stringContaining(
403
- "Skills are down for maintenance until 3pm PT.",
404
- ),
405
- );
406
- expect(mockLogMessage).not.toHaveBeenCalledWith(
407
- expect.stringContaining("Agent skills are temporarily disabled."),
408
- );
409
- } finally {
410
- fs.rmSync(tmpDir, { recursive: true, force: true });
411
- }
412
- });
413
- });
414
-
415
- // ---------------------------------------------------------------------------
416
- // removeAiFiles
417
- // ---------------------------------------------------------------------------
418
-
419
- describe("removeAiFiles", () => {
420
- let tmpDir: string;
421
- let convexDir: string;
422
-
423
- beforeEach(() => {
424
- vi.clearAllMocks();
425
- mockGetVersion.mockResolvedValue({
426
- kind: "ok",
427
- data: {
428
- message: null,
429
- guidelinesHash: null,
430
- agentSkillsSha: "canonical-sha-abc123",
431
- disableSkillsCli: false,
432
- disableSkillsCliMessage: null,
433
- },
434
- });
435
- tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
436
- convexDir = path.join(tmpDir, "convex");
437
- fs.mkdirSync(path.join(convexDir, "_generated", "ai"), {
438
- recursive: true,
439
- });
440
- });
441
-
442
- afterEach(() => {
443
- fs.rmSync(tmpDir, { recursive: true, force: true });
444
- vi.resetAllMocks();
445
- });
446
-
447
- test("logs removed when canonical skills remove succeeds without local artifacts", async () => {
448
- mockAttemptReadAiState.mockResolvedValue({ kind: "no-file" });
449
- fs.rmSync(path.join(convexDir, "_generated", "ai"), { recursive: true });
450
-
451
- await removeAiFiles({ projectDir: tmpDir, convexDir });
452
-
453
- expect(mockLogMessage).toHaveBeenCalledWith(
454
- expect.stringContaining("Convex AI files removed"),
455
- );
456
- });
457
-
458
- test("removes ai dir even when no state file exists", async () => {
459
- mockAttemptReadAiState.mockResolvedValue({ kind: "no-file" });
460
-
461
- await removeAiFiles({ projectDir: tmpDir, convexDir });
462
-
463
- expect(mockLogMessage).toHaveBeenCalledWith(
464
- expect.stringContaining("Convex AI files removed"),
465
- );
466
- expect(fs.existsSync(path.join(convexDir, "_generated", "ai"))).toBe(false);
467
- });
468
-
469
- test("deletes AGENTS.md if stripping the Convex section leaves it empty", async () => {
470
- mockAttemptReadAiState.mockResolvedValue({
471
- kind: "ok",
472
- state: baseState,
473
- });
474
-
475
- const agentsMdContent = `${AGENTS_MD_START_MARKER}\n## Convex\nGuidelines.\n${AGENTS_MD_END_MARKER}\n`;
476
- fs.writeFileSync(path.join(tmpDir, "AGENTS.md"), agentsMdContent, "utf8");
477
-
478
- await removeAiFiles({ projectDir: tmpDir, convexDir });
479
-
480
- expect(fs.existsSync(path.join(tmpDir, "AGENTS.md"))).toBe(false);
481
- });
482
-
483
- test("strips Convex section from AGENTS.md", async () => {
484
- mockAttemptReadAiState.mockResolvedValue({
485
- kind: "ok",
486
- state: baseState,
487
- });
488
-
489
- const agentsMdContent =
490
- `# My project\n\n` +
491
- `${AGENTS_MD_START_MARKER}\n## Convex\nGuidelines.\n${AGENTS_MD_END_MARKER}\n\n` +
492
- `# After\n`;
493
- fs.writeFileSync(path.join(tmpDir, "AGENTS.md"), agentsMdContent, "utf8");
494
-
495
- await removeAiFiles({ projectDir: tmpDir, convexDir });
496
-
497
- const result = fs.readFileSync(path.join(tmpDir, "AGENTS.md"), "utf8");
498
- expect(result).toContain("# My project");
499
- expect(result).toContain("# After");
500
- expect(result).not.toContain(AGENTS_MD_START_MARKER);
501
- expect(result).not.toContain("## Convex");
502
- });
503
-
504
- test("deletes CLAUDE.md when it only contains the managed section", async () => {
505
- mockAttemptReadAiState.mockResolvedValue({
506
- kind: "ok",
507
- state: baseState,
508
- });
509
- const managed = `${CLAUDE_MD_START_MARKER}\n## Convex\nRead guidelines.\n${CLAUDE_MD_END_MARKER}\n`;
510
- fs.writeFileSync(path.join(tmpDir, "CLAUDE.md"), managed, "utf8");
511
-
512
- await removeAiFiles({ projectDir: tmpDir, convexDir });
513
-
514
- expect(fs.existsSync(path.join(tmpDir, "CLAUDE.md"))).toBe(false);
515
- });
516
-
517
- test("leaves CLAUDE.md when it has no managed markers", async () => {
518
- mockAttemptReadAiState.mockResolvedValue({
519
- kind: "ok",
520
- state: baseState,
521
- });
522
-
523
- fs.writeFileSync(path.join(tmpDir, "CLAUDE.md"), "User content\n", "utf8");
524
-
525
- await removeAiFiles({ projectDir: tmpDir, convexDir });
526
-
527
- expect(fs.existsSync(path.join(tmpDir, "CLAUDE.md"))).toBe(true);
528
- });
529
-
530
- test("strips only the Convex section from CLAUDE.md", async () => {
531
- mockAttemptReadAiState.mockResolvedValue({
532
- kind: "ok",
533
- state: baseState,
534
- });
535
- const managed = `${CLAUDE_MD_START_MARKER}\n## Convex\nRead guidelines.\n${CLAUDE_MD_END_MARKER}`;
536
- fs.writeFileSync(
537
- path.join(tmpDir, "CLAUDE.md"),
538
- `# User header\n\n${managed}\n\n# User footer\n`,
539
- "utf8",
540
- );
541
-
542
- await removeAiFiles({ projectDir: tmpDir, convexDir });
543
-
544
- const content = fs.readFileSync(path.join(tmpDir, "CLAUDE.md"), "utf8");
545
- expect(content).toContain("# User header");
546
- expect(content).toContain("# User footer");
547
- expect(content).not.toContain(CLAUDE_MD_START_MARKER);
548
- expect(content).not.toContain("Read guidelines.");
549
- });
550
-
551
- test("leaves CLAUDE.md alone when it has no managed markers (legacy)", async () => {
552
- mockAttemptReadAiState.mockResolvedValue({
553
- kind: "ok",
554
- state: { ...baseState, claudeMdHash: "some-hash" },
555
- });
556
-
557
- fs.writeFileSync(
558
- path.join(tmpDir, "CLAUDE.md"),
559
- "My custom CLAUDE.md content\n",
560
- "utf8",
561
- );
562
-
563
- await removeAiFiles({ projectDir: tmpDir, convexDir });
564
-
565
- expect(fs.existsSync(path.join(tmpDir, "CLAUDE.md"))).toBe(true);
566
- expect(fs.readFileSync(path.join(tmpDir, "CLAUDE.md"), "utf8")).toBe(
567
- "My custom CLAUDE.md content\n",
568
- );
569
- });
570
-
571
- test("calls skills remove for each canonical catalog skill name", async () => {
572
- const result = await removeAiFiles({ projectDir: tmpDir, convexDir });
573
-
574
- const { default: cp } = await import("child_process");
575
- const spawnCalls = vi.mocked(cp.spawn).mock.calls;
576
- const removeCall = spawnCalls.find(
577
- (c) => Array.isArray(c[1]) && c[1].includes("remove"),
578
- );
579
- expect(result).toEqual({ kind: "success" });
580
- expect(removeCall).toBeDefined();
581
- expect(removeCall![1]).toContain("migration-helper");
582
- expect(removeCall![1]).toContain("schema-builder");
583
- });
584
-
585
- test("returns an error when the canonical catalog cannot be fetched", async () => {
586
- mockFetchAgentSkillsCatalog.mockResolvedValueOnce({ kind: "error" });
587
-
588
- const result = await removeAiFiles({ projectDir: tmpDir, convexDir });
589
-
590
- expect(result).toEqual({
591
- kind: "error",
592
- message:
593
- "Could not fetch canonical agent skills from version.convex.dev. Aborting `convex ai-files remove`.",
594
- });
595
- });
596
-
597
- test("deletes skills-lock.json if it becomes empty after removing our skills", async () => {
598
- const lockfileContent = {
599
- version: 1,
600
- skills: {
601
- "migration-helper": { source: "test" },
602
- },
603
- };
604
- fs.writeFileSync(
605
- path.join(tmpDir, "skills-lock.json"),
606
- JSON.stringify(lockfileContent),
607
- "utf8",
608
- );
609
-
610
- await removeAiFiles({ projectDir: tmpDir, convexDir });
611
-
612
- expect(fs.existsSync(path.join(tmpDir, "skills-lock.json"))).toBe(false);
613
- });
614
-
615
- test("preserves skills-lock.json if it contains other skills", async () => {
616
- const lockfileContent = {
617
- version: 1,
618
- skills: {
619
- "migration-helper": { source: "test" },
620
- "some-other-skill": { source: "other" },
621
- },
622
- };
623
- fs.writeFileSync(
624
- path.join(tmpDir, "skills-lock.json"),
625
- JSON.stringify(lockfileContent),
626
- "utf8",
627
- );
628
-
629
- await removeAiFiles({ projectDir: tmpDir, convexDir });
630
-
631
- expect(fs.existsSync(path.join(tmpDir, "skills-lock.json"))).toBe(true);
632
- });
633
-
634
- test("skips skills remove when server kill switch is enabled", async () => {
635
- mockGetVersion.mockResolvedValue({
636
- kind: "ok",
637
- data: {
638
- message: null,
639
- guidelinesHash: null,
640
- agentSkillsSha: null,
641
- disableSkillsCli: true,
642
- disableSkillsCliMessage: null,
643
- },
644
- });
645
-
646
- await removeAiFiles({ projectDir: tmpDir, convexDir });
647
-
648
- const { default: cp } = await import("child_process");
649
- const spawnCalls = vi.mocked(cp.spawn).mock.calls;
650
- const removeCall = spawnCalls.find(
651
- (c) => Array.isArray(c[1]) && c[1].includes("remove"),
652
- );
653
- expect(removeCall).toBeUndefined();
654
- expect(mockLogMessage).toHaveBeenCalledWith(
655
- expect.stringContaining("Agent skills are temporarily disabled."),
656
- );
657
- });
658
-
659
- test("does NOT write state after plain remove", async () => {
660
- mockAttemptReadAiState.mockResolvedValue({
661
- kind: "ok",
662
- state: baseState,
663
- });
664
-
665
- await removeAiFiles({ projectDir: tmpDir, convexDir });
666
-
667
- expect(mockWriteAiState).not.toHaveBeenCalled();
668
- });
669
- });
670
-
671
- // ---------------------------------------------------------------------------
672
- // statusAiFiles
673
- // ---------------------------------------------------------------------------
674
-
675
- describe("statusAiFiles", () => {
676
- const dummyProjectDir = "/tmp/test-project";
677
- const dummyConvexDir = "/tmp/test-project/convex";
678
-
679
- beforeEach(() => {
680
- vi.clearAllMocks();
681
- mockGetVersion.mockResolvedValue({
682
- kind: "ok",
683
- data: {
684
- message: null,
685
- guidelinesHash: "canonical-guidelines-hash",
686
- agentSkillsSha: "canonical-skills-sha",
687
- disableSkillsCli: false,
688
- disableSkillsCliMessage: null,
689
- },
690
- });
691
- });
692
- afterEach(() => vi.resetAllMocks());
693
-
694
- test("reports not installed when state is missing", async () => {
695
- mockAttemptReadAiState.mockResolvedValue({ kind: "no-file" });
696
-
697
- await statusAiFiles({
698
- projectDir: dummyProjectDir,
699
- convexDir: dummyConvexDir,
700
- });
701
-
702
- expect(mockLogMessage).toHaveBeenCalledWith(
703
- expect.stringContaining("not installed"),
704
- );
705
- expect(mockLogMessage).toHaveBeenCalledWith(
706
- expect.stringContaining("npx convex ai-files install"),
707
- );
708
- });
709
-
710
- test("reports disabled when config has enabled=false", async () => {
711
- await statusAiFiles({
712
- projectDir: dummyProjectDir,
713
- convexDir: dummyConvexDir,
714
- aiFilesConfig: { enabled: false },
715
- });
716
-
717
- expect(mockLogMessage).toHaveBeenCalledWith(
718
- expect.stringContaining("disabled"),
719
- );
720
- expect(mockLogMessage).toHaveBeenCalledWith(
721
- expect.stringContaining("npx convex ai-files enable"),
722
- );
723
- });
724
-
725
- test("reports enabled when state exists and messages are not disabled", async () => {
726
- mockAttemptReadAiState.mockResolvedValue({
727
- kind: "ok",
728
- state: baseState,
729
- });
730
-
731
- await statusAiFiles({
732
- projectDir: dummyProjectDir,
733
- convexDir: dummyConvexDir,
734
- });
735
-
736
- expect(mockLogMessage).toHaveBeenCalledWith(
737
- expect.stringContaining("enabled"),
738
- );
739
- });
740
-
741
- test("reports guidelines as up to date when hash matches canonical", async () => {
742
- const tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
743
- const convexDir = path.join(tmpDir, "convex");
744
- try {
745
- const { hashSha256 } = await import("../utils/hash.js");
746
- const content = "guidelines content";
747
- const hash = hashSha256(content);
748
-
749
- fs.mkdirSync(path.join(convexDir, "_generated", "ai"), {
750
- recursive: true,
751
- });
752
- fs.writeFileSync(
753
- path.join(convexDir, "_generated", "ai", "guidelines.md"),
754
- content,
755
- "utf8",
756
- );
757
-
758
- mockAttemptReadAiState.mockResolvedValue({
759
- kind: "ok",
760
- state: { ...baseState, guidelinesHash: hash },
761
- });
762
- mockGetVersion.mockResolvedValue({
763
- kind: "ok",
764
- data: {
765
- message: null,
766
- guidelinesHash: hash,
767
- agentSkillsSha: null,
768
- disableSkillsCli: false,
769
- disableSkillsCliMessage: null,
770
- },
771
- });
772
-
773
- await statusAiFiles({ projectDir: tmpDir, convexDir });
774
-
775
- const calls = mockLogMessage.mock.calls.map((c) => c[0]);
776
- expect(calls.some((m) => /guidelines\.md.*up to date/.test(m))).toBe(
777
- true,
778
- );
779
- } finally {
780
- fs.rmSync(tmpDir, { recursive: true, force: true });
781
- }
782
- });
783
-
784
- test("reports guidelines as out of date when hash differs from canonical", async () => {
785
- const tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
786
- const convexDir = path.join(tmpDir, "convex");
787
- try {
788
- const { hashSha256 } = await import("../utils/hash.js");
789
- const content = "old guidelines content";
790
-
791
- fs.mkdirSync(path.join(convexDir, "_generated", "ai"), {
792
- recursive: true,
793
- });
794
- fs.writeFileSync(
795
- path.join(convexDir, "_generated", "ai", "guidelines.md"),
796
- content,
797
- "utf8",
798
- );
799
-
800
- mockAttemptReadAiState.mockResolvedValue({
801
- kind: "ok",
802
- state: { ...baseState, guidelinesHash: hashSha256(content) },
803
- });
804
- mockGetVersion.mockResolvedValue({
805
- kind: "ok",
806
- data: {
807
- message: null,
808
- guidelinesHash: "new-canonical-hash",
809
- agentSkillsSha: null,
810
- disableSkillsCli: false,
811
- disableSkillsCliMessage: null,
812
- },
813
- });
814
-
815
- await statusAiFiles({ projectDir: tmpDir, convexDir });
816
-
817
- expect(mockLogMessage).toHaveBeenCalledWith(
818
- expect.stringContaining("out of date"),
819
- );
820
- expect(mockLogMessage).toHaveBeenCalledWith(
821
- expect.stringContaining("npx convex ai-files update"),
822
- );
823
- } finally {
824
- fs.rmSync(tmpDir, { recursive: true, force: true });
825
- }
826
- });
827
-
828
- test("reports guidelines as locally modified when disk hash differs from stored", async () => {
829
- const tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
830
- const convexDir = path.join(tmpDir, "convex");
831
- try {
832
- const { hashSha256 } = await import("../utils/hash.js");
833
-
834
- fs.mkdirSync(path.join(convexDir, "_generated", "ai"), {
835
- recursive: true,
836
- });
837
- fs.writeFileSync(
838
- path.join(convexDir, "_generated", "ai", "guidelines.md"),
839
- "user-modified content",
840
- "utf8",
841
- );
842
-
843
- mockAttemptReadAiState.mockResolvedValue({
844
- kind: "ok",
845
- state: {
846
- ...baseState,
847
- guidelinesHash: hashSha256("original content"),
848
- },
849
- });
850
-
851
- await statusAiFiles({ projectDir: tmpDir, convexDir });
852
-
853
- expect(mockLogMessage).toHaveBeenCalledWith(
854
- expect.stringContaining("modified locally"),
855
- );
856
- } finally {
857
- fs.rmSync(tmpDir, { recursive: true, force: true });
858
- }
859
- });
860
-
861
- test("reports guidelines as missing when guidelines.md is empty", async () => {
862
- const tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
863
- const convexDir = path.join(tmpDir, "convex");
864
- try {
865
- fs.mkdirSync(path.join(convexDir, "_generated", "ai"), {
866
- recursive: true,
867
- });
868
- fs.writeFileSync(
869
- path.join(convexDir, "_generated", "ai", "guidelines.md"),
870
- "",
871
- "utf8",
872
- );
873
-
874
- mockAttemptReadAiState.mockResolvedValue({
875
- kind: "ok",
876
- state: baseState,
877
- });
878
-
879
- await statusAiFiles({ projectDir: tmpDir, convexDir });
880
-
881
- expect(mockLogMessage).toHaveBeenCalledWith(
882
- expect.stringContaining("guidelines.md: not on disk"),
883
- );
884
- } finally {
885
- fs.rmSync(tmpDir, { recursive: true, force: true });
886
- }
887
- });
888
-
889
- test("reports agent skills as out of date when SHA differs from canonical", async () => {
890
- mockAttemptReadAiState.mockResolvedValue({
891
- kind: "ok",
892
- state: {
893
- ...baseState,
894
- agentSkillsSha: "old-sha",
895
- },
896
- });
897
- mockGetVersion.mockResolvedValue({
898
- kind: "ok",
899
- data: {
900
- message: null,
901
- guidelinesHash: null,
902
- agentSkillsSha: "new-sha",
903
- disableSkillsCli: false,
904
- disableSkillsCliMessage: null,
905
- },
906
- });
907
-
908
- await statusAiFiles({
909
- projectDir: dummyProjectDir,
910
- convexDir: dummyConvexDir,
911
- });
912
-
913
- expect(mockLogMessage).toHaveBeenCalledWith(
914
- expect.stringContaining("out of date"),
915
- );
916
- expect(mockLogMessage).toHaveBeenCalledWith(
917
- expect.stringContaining("npx convex ai-files update"),
918
- );
919
- });
920
-
921
- test("skips staleness check when network is unavailable", async () => {
922
- mockAttemptReadAiState.mockResolvedValue({
923
- kind: "ok",
924
- state: {
925
- ...baseState,
926
- guidelinesHash: "old-hash",
927
- agentSkillsSha: "old-sha",
928
- },
929
- });
930
- mockGetVersion.mockResolvedValue({ kind: "error" });
931
-
932
- await statusAiFiles({
933
- projectDir: dummyProjectDir,
934
- convexDir: dummyConvexDir,
935
- });
936
-
937
- const calls = mockLogMessage.mock.calls.map((c) => c[0]);
938
- expect(calls.some((m) => /out of date/.test(m))).toBe(false);
939
- });
940
-
941
- test("reports skills as installed when present", async () => {
942
- mockAttemptReadAiState.mockResolvedValue({
943
- kind: "ok",
944
- state: {
945
- ...baseState,
946
- agentSkillsSha: "canonical-skills-sha",
947
- },
948
- });
949
-
950
- await statusAiFiles({
951
- projectDir: dummyProjectDir,
952
- convexDir: dummyConvexDir,
953
- });
954
-
955
- expect(mockLogMessage).toHaveBeenCalledWith(
956
- expect.stringContaining("Agent skills: installed"),
957
- );
958
- expect(mockLogMessage).toHaveBeenCalledWith(
959
- expect.stringContaining("up to date"),
960
- );
961
- });
962
-
963
- test("reports CLAUDE.md section as missing when file exists without markers", async () => {
964
- const tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
965
- const convexDir = path.join(tmpDir, "convex");
966
- try {
967
- fs.writeFileSync(
968
- path.join(tmpDir, "CLAUDE.md"),
969
- "User content\n",
970
- "utf8",
971
- );
972
- mockAttemptReadAiState.mockResolvedValue({
973
- kind: "ok",
974
- state: baseState,
975
- });
976
-
977
- await statusAiFiles({ projectDir: tmpDir, convexDir });
978
-
979
- expect(mockLogMessage).toHaveBeenCalledWith(
980
- expect.stringContaining("CLAUDE.md: no Convex section present"),
981
- );
982
- } finally {
983
- fs.rmSync(tmpDir, { recursive: true, force: true });
984
- }
985
- });
986
- });