convex 1.34.0 → 1.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (607) hide show
  1. package/CHANGELOG.md +98 -43
  2. package/dist/browser.bundle.js +13 -10
  3. package/dist/browser.bundle.js.map +3 -3
  4. package/dist/cjs/browser/index-node.js +3 -1
  5. package/dist/cjs/browser/index.js +3 -1
  6. package/dist/cjs/browser/index.js.map +2 -2
  7. package/dist/cjs/browser/query_options.js.map +2 -2
  8. package/dist/cjs/browser/sync/authentication_manager.js +4 -1
  9. package/dist/cjs/browser/sync/authentication_manager.js.map +2 -2
  10. package/dist/cjs/browser/sync/web_socket_manager.js +1 -7
  11. package/dist/cjs/browser/sync/web_socket_manager.js.map +2 -2
  12. package/dist/cjs/cli/aiFiles.js +39 -20
  13. package/dist/cjs/cli/aiFiles.js.map +3 -3
  14. package/dist/cjs/cli/codegen_templates/readme.js +14 -1
  15. package/dist/cjs/cli/codegen_templates/readme.js.map +2 -2
  16. package/dist/cjs/cli/configure.js +34 -32
  17. package/dist/cjs/cli/configure.js.map +2 -2
  18. package/dist/cjs/cli/deploy.js +7 -8
  19. package/dist/cjs/cli/deploy.js.map +2 -2
  20. package/dist/cjs/cli/deploymentCreate.js +225 -40
  21. package/dist/cjs/cli/deploymentCreate.js.map +3 -3
  22. package/dist/cjs/cli/deploymentSelect.js +14 -13
  23. package/dist/cjs/cli/deploymentSelect.js.map +2 -2
  24. package/dist/cjs/cli/dev.js +30 -11
  25. package/dist/cjs/cli/dev.js.map +2 -2
  26. package/dist/cjs/cli/docs.js +1 -1
  27. package/dist/cjs/cli/docs.js.map +2 -2
  28. package/dist/cjs/cli/init.js +1 -1
  29. package/dist/cjs/cli/init.js.map +2 -2
  30. package/dist/cjs/cli/lib/aiFiles/agentsmd.js +73 -0
  31. package/dist/cjs/cli/lib/aiFiles/agentsmd.js.map +7 -0
  32. package/dist/cjs/cli/lib/aiFiles/claudemd.js +73 -0
  33. package/dist/cjs/cli/lib/aiFiles/claudemd.js.map +7 -0
  34. package/dist/cjs/cli/lib/aiFiles/cursorrules.js +48 -0
  35. package/dist/cjs/cli/lib/aiFiles/cursorrules.js.map +7 -0
  36. package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js +58 -0
  37. package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js.map +7 -0
  38. package/dist/cjs/cli/lib/aiFiles/index.js +215 -0
  39. package/dist/cjs/cli/lib/aiFiles/index.js.map +7 -0
  40. package/dist/cjs/cli/lib/aiFiles/paths.js.map +7 -0
  41. package/dist/cjs/cli/lib/aiFiles/skills.js +196 -0
  42. package/dist/cjs/cli/lib/aiFiles/skills.js.map +7 -0
  43. package/dist/cjs/cli/lib/aiFiles/state.js +96 -0
  44. package/dist/cjs/cli/lib/aiFiles/state.js.map +7 -0
  45. package/dist/cjs/cli/lib/aiFiles/status.js +198 -0
  46. package/dist/cjs/cli/lib/aiFiles/status.js.map +7 -0
  47. package/dist/cjs/cli/lib/aiFiles/utils.js +128 -0
  48. package/dist/cjs/cli/lib/aiFiles/utils.js.map +7 -0
  49. package/dist/cjs/cli/lib/api.js +70 -7
  50. package/dist/cjs/cli/lib/api.js.map +2 -2
  51. package/dist/cjs/cli/lib/command.js +10 -6
  52. package/dist/cjs/cli/lib/command.js.map +2 -2
  53. package/dist/cjs/cli/lib/config.js +43 -7
  54. package/dist/cjs/cli/lib/config.js.map +3 -3
  55. package/dist/cjs/cli/lib/deploy2.js +9 -26
  56. package/dist/cjs/cli/lib/deploy2.js.map +2 -2
  57. package/dist/cjs/cli/lib/deployApi/componentDefinition.js +4 -1
  58. package/dist/cjs/cli/lib/deployApi/componentDefinition.js.map +2 -2
  59. package/dist/cjs/cli/lib/deploymentSelection.js +45 -2
  60. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  61. package/dist/cjs/cli/lib/deploymentSelector.js +1 -0
  62. package/dist/cjs/cli/lib/deploymentSelector.js.map +2 -2
  63. package/dist/cjs/cli/lib/dev.js +162 -117
  64. package/dist/cjs/cli/lib/dev.js.map +2 -2
  65. package/dist/cjs/cli/lib/env.js +1 -13
  66. package/dist/cjs/cli/lib/env.js.map +2 -2
  67. package/dist/cjs/cli/lib/expiration.js +104 -0
  68. package/dist/cjs/cli/lib/expiration.js.map +7 -0
  69. package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
  70. package/dist/cjs/cli/lib/init.js +4 -3
  71. package/dist/cjs/cli/lib/init.js.map +2 -2
  72. package/dist/cjs/cli/lib/insights.js +1 -1
  73. package/dist/cjs/cli/lib/insights.js.map +2 -2
  74. package/dist/cjs/cli/lib/localDeployment/anonymous.js +15 -8
  75. package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +2 -2
  76. package/dist/cjs/cli/lib/localDeployment/localDeployment.js +8 -10
  77. package/dist/cjs/cli/lib/localDeployment/localDeployment.js.map +2 -2
  78. package/dist/cjs/cli/lib/localDeployment/run.js +1 -0
  79. package/dist/cjs/cli/lib/localDeployment/run.js.map +2 -2
  80. package/dist/cjs/cli/lib/localDeployment/upgrade.js +2 -2
  81. package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +2 -2
  82. package/dist/cjs/cli/lib/localDeployment/utils.js +9 -0
  83. package/dist/cjs/cli/lib/localDeployment/utils.js.map +2 -2
  84. package/dist/cjs/cli/lib/mcp/tools/status.js +1 -1
  85. package/dist/cjs/cli/lib/mcp/tools/status.js.map +2 -2
  86. package/dist/cjs/cli/lib/updates.js +12 -13
  87. package/dist/cjs/cli/lib/updates.js.map +2 -2
  88. package/dist/cjs/cli/lib/usage.js +2 -1
  89. package/dist/cjs/cli/lib/usage.js.map +2 -2
  90. package/dist/cjs/cli/lib/utils/prompts.js +2 -1
  91. package/dist/cjs/cli/lib/utils/prompts.js.map +2 -2
  92. package/dist/cjs/cli/lib/utils/utils.js +46 -20
  93. package/dist/cjs/cli/lib/utils/utils.js.map +3 -3
  94. package/dist/cjs/cli/lib/versionApi.js +7 -4
  95. package/dist/cjs/cli/lib/versionApi.js.map +2 -2
  96. package/dist/cjs/cli/lib/workos/workos.js +4 -6
  97. package/dist/cjs/cli/lib/workos/workos.js.map +2 -2
  98. package/dist/cjs/index.js +1 -1
  99. package/dist/cjs/index.js.map +1 -1
  100. package/dist/cjs/react/client.js +43 -6
  101. package/dist/cjs/react/client.js.map +2 -2
  102. package/dist/cjs/react/index.js +2 -0
  103. package/dist/cjs/react/index.js.map +2 -2
  104. package/dist/cjs/react-clerk/ConvexProviderWithClerk.js.map +1 -1
  105. package/dist/cjs/server/api.js.map +2 -2
  106. package/dist/cjs/server/components/definition.js.map +1 -1
  107. package/dist/cjs/server/components/index.js +40 -4
  108. package/dist/cjs/server/components/index.js.map +2 -2
  109. package/dist/cjs/server/data_model.js.map +1 -1
  110. package/dist/cjs/server/impl/meta_impl.js +78 -0
  111. package/dist/cjs/server/impl/meta_impl.js.map +7 -0
  112. package/dist/cjs/server/impl/registration_impl.js +16 -11
  113. package/dist/cjs/server/impl/registration_impl.js.map +2 -2
  114. package/dist/cjs/server/index.js.map +2 -2
  115. package/dist/cjs/server/meta.js +17 -0
  116. package/dist/cjs/server/meta.js.map +7 -0
  117. package/dist/cjs/server/registration.js.map +1 -1
  118. package/dist/cjs-types/browser/index.d.ts +1 -0
  119. package/dist/cjs-types/browser/index.d.ts.map +1 -1
  120. package/dist/cjs-types/browser/query_options.d.ts +12 -9
  121. package/dist/cjs-types/browser/query_options.d.ts.map +1 -1
  122. package/dist/cjs-types/browser/sync/authentication_manager.d.ts.map +1 -1
  123. package/dist/cjs-types/browser/sync/web_socket_manager.d.ts.map +1 -1
  124. package/dist/cjs-types/cli/aiFiles.d.ts.map +1 -1
  125. package/dist/cjs-types/cli/codegen_templates/readme.d.ts.map +1 -1
  126. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  127. package/dist/cjs-types/cli/configure.test.d.ts +2 -0
  128. package/dist/cjs-types/cli/configure.test.d.ts.map +1 -0
  129. package/dist/cjs-types/cli/deploy.d.ts.map +1 -1
  130. package/dist/cjs-types/cli/deploymentCreate.d.ts +1 -0
  131. package/dist/cjs-types/cli/deploymentCreate.d.ts.map +1 -1
  132. package/dist/cjs-types/cli/deploymentSelect.d.ts +2 -1
  133. package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
  134. package/dist/cjs-types/cli/dev.d.ts +3 -1
  135. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  136. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts +19 -0
  137. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -0
  138. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.test.d.ts +2 -0
  139. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.test.d.ts.map +1 -0
  140. package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts +19 -0
  141. package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -0
  142. package/dist/cjs-types/cli/lib/aiFiles/claudemd.test.d.ts +2 -0
  143. package/dist/cjs-types/cli/lib/aiFiles/claudemd.test.d.ts.map +1 -0
  144. package/dist/cjs-types/cli/lib/aiFiles/cursorrules.d.ts +10 -0
  145. package/dist/cjs-types/cli/lib/aiFiles/cursorrules.d.ts.map +1 -0
  146. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts +12 -0
  147. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -0
  148. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.test.d.ts +2 -0
  149. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.test.d.ts.map +1 -0
  150. package/dist/cjs-types/cli/lib/aiFiles/index.d.ts +42 -0
  151. package/dist/cjs-types/cli/lib/aiFiles/index.d.ts.map +1 -0
  152. package/dist/cjs-types/cli/lib/aiFiles/index.test.d.ts.map +1 -0
  153. package/dist/cjs-types/cli/lib/aiFiles/integration.test.d.ts.map +1 -0
  154. package/dist/cjs-types/cli/lib/{ai → aiFiles}/paths.d.ts +4 -0
  155. package/dist/cjs-types/cli/lib/aiFiles/paths.d.ts.map +1 -0
  156. package/dist/cjs-types/cli/lib/aiFiles/prompt.test.d.ts.map +1 -0
  157. package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts +20 -0
  158. package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts.map +1 -0
  159. package/dist/cjs-types/cli/lib/aiFiles/state.d.ts +38 -0
  160. package/dist/cjs-types/cli/lib/aiFiles/state.d.ts.map +1 -0
  161. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts +2 -0
  162. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
  163. package/dist/cjs-types/cli/lib/aiFiles/status.d.ts +6 -0
  164. package/dist/cjs-types/cli/lib/aiFiles/status.d.ts.map +1 -0
  165. package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts +56 -0
  166. package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts.map +1 -0
  167. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
  168. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
  169. package/dist/cjs-types/cli/lib/api.d.ts +3 -3
  170. package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
  171. package/dist/cjs-types/cli/lib/command.d.ts +2 -1
  172. package/dist/cjs-types/cli/lib/command.d.ts.map +1 -1
  173. package/dist/cjs-types/cli/lib/config.d.ts +18 -6
  174. package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
  175. package/dist/cjs-types/cli/lib/deploy2.d.ts +5 -2
  176. package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
  177. package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
  178. package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
  179. package/dist/cjs-types/cli/lib/deployApi/definitionConfig.d.ts +24 -24
  180. package/dist/cjs-types/cli/lib/deployApi/modules.d.ts +14 -14
  181. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +61 -52
  182. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
  183. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  184. package/dist/cjs-types/cli/lib/deploymentSelector.d.ts +2 -0
  185. package/dist/cjs-types/cli/lib/deploymentSelector.d.ts.map +1 -1
  186. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  187. package/dist/cjs-types/cli/lib/env.d.ts +0 -4
  188. package/dist/cjs-types/cli/lib/env.d.ts.map +1 -1
  189. package/dist/cjs-types/cli/lib/expiration.d.ts +35 -0
  190. package/dist/cjs-types/cli/lib/expiration.d.ts.map +1 -0
  191. package/dist/cjs-types/cli/lib/expiration.test.d.ts +2 -0
  192. package/dist/cjs-types/cli/lib/expiration.test.d.ts.map +1 -0
  193. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
  194. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  195. package/dist/cjs-types/cli/lib/init.d.ts.map +1 -1
  196. package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  197. package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  198. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts +15 -0
  199. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  200. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  201. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +7 -0
  202. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  203. package/dist/cjs-types/cli/lib/mcp/requestContext.d.ts +3 -3
  204. package/dist/cjs-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  205. package/dist/cjs-types/cli/lib/updates.d.ts +4 -3
  206. package/dist/cjs-types/cli/lib/updates.d.ts.map +1 -1
  207. package/dist/cjs-types/cli/lib/usage.d.ts.map +1 -1
  208. package/dist/cjs-types/cli/lib/utils/prompts.d.ts +1 -0
  209. package/dist/cjs-types/cli/lib/utils/prompts.d.ts.map +1 -1
  210. package/dist/cjs-types/cli/lib/utils/utils.d.ts +16 -2
  211. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  212. package/dist/cjs-types/cli/lib/versionApi.d.ts +7 -1
  213. package/dist/cjs-types/cli/lib/versionApi.d.ts.map +1 -1
  214. package/dist/cjs-types/cli/lib/workos/workos.d.ts.map +1 -1
  215. package/dist/cjs-types/index.d.ts +1 -1
  216. package/dist/cjs-types/react/client.d.ts +54 -2
  217. package/dist/cjs-types/react/client.d.ts.map +1 -1
  218. package/dist/cjs-types/react/index.d.ts +7 -2
  219. package/dist/cjs-types/react/index.d.ts.map +1 -1
  220. package/dist/cjs-types/react/use_query_object_options.test.d.ts +5 -0
  221. package/dist/cjs-types/react/use_query_object_options.test.d.ts.map +1 -0
  222. package/dist/cjs-types/react/use_query_result.test.d.ts +5 -0
  223. package/dist/cjs-types/react/use_query_result.test.d.ts.map +1 -0
  224. package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
  225. package/dist/cjs-types/server/api.d.ts +5 -1
  226. package/dist/cjs-types/server/api.d.ts.map +1 -1
  227. package/dist/cjs-types/server/components/definition.d.ts +1 -0
  228. package/dist/cjs-types/server/components/definition.d.ts.map +1 -1
  229. package/dist/cjs-types/server/components/index.d.ts +5 -1
  230. package/dist/cjs-types/server/components/index.d.ts.map +1 -1
  231. package/dist/cjs-types/server/data_model.d.ts +2 -1
  232. package/dist/cjs-types/server/data_model.d.ts.map +1 -1
  233. package/dist/cjs-types/server/impl/meta_impl.d.ts +5 -0
  234. package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -0
  235. package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
  236. package/dist/cjs-types/server/index.d.ts +1 -0
  237. package/dist/cjs-types/server/index.d.ts.map +1 -1
  238. package/dist/cjs-types/server/meta.d.ts +72 -0
  239. package/dist/cjs-types/server/meta.d.ts.map +1 -0
  240. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  241. package/dist/cli.bundle.cjs +2446 -1933
  242. package/dist/cli.bundle.cjs.map +4 -4
  243. package/dist/esm/browser/index-node.js +1 -0
  244. package/dist/esm/browser/index.js +1 -0
  245. package/dist/esm/browser/index.js.map +2 -2
  246. package/dist/esm/browser/query_options.js.map +2 -2
  247. package/dist/esm/browser/sync/authentication_manager.js +4 -1
  248. package/dist/esm/browser/sync/authentication_manager.js.map +2 -2
  249. package/dist/esm/browser/sync/web_socket_manager.js +1 -7
  250. package/dist/esm/browser/sync/web_socket_manager.js.map +2 -2
  251. package/dist/esm/cli/aiFiles.js +41 -23
  252. package/dist/esm/cli/aiFiles.js.map +2 -2
  253. package/dist/esm/cli/codegen_templates/readme.js +14 -1
  254. package/dist/esm/cli/codegen_templates/readme.js.map +2 -2
  255. package/dist/esm/cli/configure.js +35 -33
  256. package/dist/esm/cli/configure.js.map +2 -2
  257. package/dist/esm/cli/deploy.js +11 -10
  258. package/dist/esm/cli/deploy.js.map +2 -2
  259. package/dist/esm/cli/deploymentCreate.js +238 -42
  260. package/dist/esm/cli/deploymentCreate.js.map +2 -2
  261. package/dist/esm/cli/deploymentSelect.js +13 -12
  262. package/dist/esm/cli/deploymentSelect.js.map +2 -2
  263. package/dist/esm/cli/dev.js +34 -13
  264. package/dist/esm/cli/dev.js.map +2 -2
  265. package/dist/esm/cli/docs.js +1 -1
  266. package/dist/esm/cli/docs.js.map +2 -2
  267. package/dist/esm/cli/init.js +2 -2
  268. package/dist/esm/cli/init.js.map +2 -2
  269. package/dist/esm/cli/lib/aiFiles/agentsmd.js +56 -0
  270. package/dist/esm/cli/lib/aiFiles/agentsmd.js.map +7 -0
  271. package/dist/esm/cli/lib/aiFiles/claudemd.js +56 -0
  272. package/dist/esm/cli/lib/aiFiles/claudemd.js.map +7 -0
  273. package/dist/esm/cli/lib/aiFiles/cursorrules.js +16 -0
  274. package/dist/esm/cli/lib/aiFiles/cursorrules.js.map +7 -0
  275. package/dist/esm/cli/lib/aiFiles/guidelinesmd.js +35 -0
  276. package/dist/esm/cli/lib/aiFiles/guidelinesmd.js.map +7 -0
  277. package/dist/esm/cli/lib/aiFiles/index.js +193 -0
  278. package/dist/esm/cli/lib/aiFiles/index.js.map +7 -0
  279. package/dist/esm/cli/lib/aiFiles/paths.js.map +7 -0
  280. package/dist/esm/cli/lib/aiFiles/skills.js +163 -0
  281. package/dist/esm/cli/lib/aiFiles/skills.js.map +7 -0
  282. package/dist/esm/cli/lib/aiFiles/state.js +60 -0
  283. package/dist/esm/cli/lib/aiFiles/state.js.map +7 -0
  284. package/dist/esm/cli/lib/aiFiles/status.js +178 -0
  285. package/dist/esm/cli/lib/aiFiles/status.js.map +7 -0
  286. package/dist/esm/cli/lib/aiFiles/utils.js +97 -0
  287. package/dist/esm/cli/lib/aiFiles/utils.js.map +7 -0
  288. package/dist/esm/cli/lib/api.js +70 -7
  289. package/dist/esm/cli/lib/api.js.map +2 -2
  290. package/dist/esm/cli/lib/command.js +10 -6
  291. package/dist/esm/cli/lib/command.js.map +2 -2
  292. package/dist/esm/cli/lib/config.js +41 -6
  293. package/dist/esm/cli/lib/config.js.map +2 -2
  294. package/dist/esm/cli/lib/deploy2.js +13 -26
  295. package/dist/esm/cli/lib/deploy2.js.map +2 -2
  296. package/dist/esm/cli/lib/deployApi/componentDefinition.js +4 -1
  297. package/dist/esm/cli/lib/deployApi/componentDefinition.js.map +2 -2
  298. package/dist/esm/cli/lib/deploymentSelection.js +46 -2
  299. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  300. package/dist/esm/cli/lib/deploymentSelector.js +1 -0
  301. package/dist/esm/cli/lib/deploymentSelector.js.map +2 -2
  302. package/dist/esm/cli/lib/dev.js +162 -118
  303. package/dist/esm/cli/lib/dev.js.map +2 -2
  304. package/dist/esm/cli/lib/env.js +0 -11
  305. package/dist/esm/cli/lib/env.js.map +2 -2
  306. package/dist/esm/cli/lib/expiration.js +80 -0
  307. package/dist/esm/cli/lib/expiration.js.map +7 -0
  308. package/dist/esm/cli/lib/init.js +4 -3
  309. package/dist/esm/cli/lib/init.js.map +2 -2
  310. package/dist/esm/cli/lib/insights.js +1 -1
  311. package/dist/esm/cli/lib/insights.js.map +2 -2
  312. package/dist/esm/cli/lib/localDeployment/anonymous.js +16 -9
  313. package/dist/esm/cli/lib/localDeployment/anonymous.js.map +2 -2
  314. package/dist/esm/cli/lib/localDeployment/localDeployment.js +9 -11
  315. package/dist/esm/cli/lib/localDeployment/localDeployment.js.map +2 -2
  316. package/dist/esm/cli/lib/localDeployment/run.js +1 -1
  317. package/dist/esm/cli/lib/localDeployment/run.js.map +2 -2
  318. package/dist/esm/cli/lib/localDeployment/upgrade.js +2 -2
  319. package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
  320. package/dist/esm/cli/lib/localDeployment/utils.js +8 -0
  321. package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
  322. package/dist/esm/cli/lib/mcp/tools/status.js +1 -1
  323. package/dist/esm/cli/lib/mcp/tools/status.js.map +2 -2
  324. package/dist/esm/cli/lib/updates.js +14 -12
  325. package/dist/esm/cli/lib/updates.js.map +2 -2
  326. package/dist/esm/cli/lib/usage.js +2 -1
  327. package/dist/esm/cli/lib/usage.js.map +2 -2
  328. package/dist/esm/cli/lib/utils/prompts.js +2 -1
  329. package/dist/esm/cli/lib/utils/prompts.js.map +2 -2
  330. package/dist/esm/cli/lib/utils/utils.js +45 -20
  331. package/dist/esm/cli/lib/utils/utils.js.map +3 -3
  332. package/dist/esm/cli/lib/versionApi.js +7 -4
  333. package/dist/esm/cli/lib/versionApi.js.map +2 -2
  334. package/dist/esm/cli/lib/workos/workos.js +4 -6
  335. package/dist/esm/cli/lib/workos/workos.js.map +2 -2
  336. package/dist/esm/index.js +1 -1
  337. package/dist/esm/index.js.map +1 -1
  338. package/dist/esm/react/client.js +43 -6
  339. package/dist/esm/react/client.js.map +2 -2
  340. package/dist/esm/react/index.js +1 -0
  341. package/dist/esm/react/index.js.map +2 -2
  342. package/dist/esm/react-clerk/ConvexProviderWithClerk.js.map +1 -1
  343. package/dist/esm/server/api.js.map +2 -2
  344. package/dist/esm/server/components/index.js +40 -4
  345. package/dist/esm/server/components/index.js.map +2 -2
  346. package/dist/esm/server/impl/meta_impl.js +54 -0
  347. package/dist/esm/server/impl/meta_impl.js.map +7 -0
  348. package/dist/esm/server/impl/registration_impl.js +20 -11
  349. package/dist/esm/server/impl/registration_impl.js.map +2 -2
  350. package/dist/esm/server/index.js.map +2 -2
  351. package/dist/esm/server/meta.js +2 -0
  352. package/dist/esm/server/meta.js.map +7 -0
  353. package/dist/esm-types/browser/index.d.ts +1 -0
  354. package/dist/esm-types/browser/index.d.ts.map +1 -1
  355. package/dist/esm-types/browser/query_options.d.ts +12 -9
  356. package/dist/esm-types/browser/query_options.d.ts.map +1 -1
  357. package/dist/esm-types/browser/sync/authentication_manager.d.ts.map +1 -1
  358. package/dist/esm-types/browser/sync/web_socket_manager.d.ts.map +1 -1
  359. package/dist/esm-types/cli/aiFiles.d.ts.map +1 -1
  360. package/dist/esm-types/cli/codegen_templates/readme.d.ts.map +1 -1
  361. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  362. package/dist/esm-types/cli/configure.test.d.ts +2 -0
  363. package/dist/esm-types/cli/configure.test.d.ts.map +1 -0
  364. package/dist/esm-types/cli/deploy.d.ts.map +1 -1
  365. package/dist/esm-types/cli/deploymentCreate.d.ts +1 -0
  366. package/dist/esm-types/cli/deploymentCreate.d.ts.map +1 -1
  367. package/dist/esm-types/cli/deploymentSelect.d.ts +2 -1
  368. package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
  369. package/dist/esm-types/cli/dev.d.ts +3 -1
  370. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  371. package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts +19 -0
  372. package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -0
  373. package/dist/esm-types/cli/lib/aiFiles/agentsmd.test.d.ts +2 -0
  374. package/dist/esm-types/cli/lib/aiFiles/agentsmd.test.d.ts.map +1 -0
  375. package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts +19 -0
  376. package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -0
  377. package/dist/esm-types/cli/lib/aiFiles/claudemd.test.d.ts +2 -0
  378. package/dist/esm-types/cli/lib/aiFiles/claudemd.test.d.ts.map +1 -0
  379. package/dist/esm-types/cli/lib/aiFiles/cursorrules.d.ts +10 -0
  380. package/dist/esm-types/cli/lib/aiFiles/cursorrules.d.ts.map +1 -0
  381. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts +12 -0
  382. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -0
  383. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.test.d.ts +2 -0
  384. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.test.d.ts.map +1 -0
  385. package/dist/esm-types/cli/lib/aiFiles/index.d.ts +42 -0
  386. package/dist/esm-types/cli/lib/aiFiles/index.d.ts.map +1 -0
  387. package/dist/esm-types/cli/lib/aiFiles/index.test.d.ts.map +1 -0
  388. package/dist/esm-types/cli/lib/aiFiles/integration.test.d.ts.map +1 -0
  389. package/dist/esm-types/cli/lib/{ai → aiFiles}/paths.d.ts +4 -0
  390. package/dist/esm-types/cli/lib/aiFiles/paths.d.ts.map +1 -0
  391. package/dist/esm-types/cli/lib/aiFiles/prompt.test.d.ts.map +1 -0
  392. package/dist/esm-types/cli/lib/aiFiles/skills.d.ts +20 -0
  393. package/dist/esm-types/cli/lib/aiFiles/skills.d.ts.map +1 -0
  394. package/dist/esm-types/cli/lib/aiFiles/state.d.ts +38 -0
  395. package/dist/esm-types/cli/lib/aiFiles/state.d.ts.map +1 -0
  396. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts +2 -0
  397. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
  398. package/dist/esm-types/cli/lib/aiFiles/status.d.ts +6 -0
  399. package/dist/esm-types/cli/lib/aiFiles/status.d.ts.map +1 -0
  400. package/dist/esm-types/cli/lib/aiFiles/utils.d.ts +56 -0
  401. package/dist/esm-types/cli/lib/aiFiles/utils.d.ts.map +1 -0
  402. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
  403. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
  404. package/dist/esm-types/cli/lib/api.d.ts +3 -3
  405. package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
  406. package/dist/esm-types/cli/lib/command.d.ts +2 -1
  407. package/dist/esm-types/cli/lib/command.d.ts.map +1 -1
  408. package/dist/esm-types/cli/lib/config.d.ts +18 -6
  409. package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
  410. package/dist/esm-types/cli/lib/deploy2.d.ts +5 -2
  411. package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
  412. package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
  413. package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
  414. package/dist/esm-types/cli/lib/deployApi/definitionConfig.d.ts +24 -24
  415. package/dist/esm-types/cli/lib/deployApi/modules.d.ts +14 -14
  416. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +61 -52
  417. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
  418. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  419. package/dist/esm-types/cli/lib/deploymentSelector.d.ts +2 -0
  420. package/dist/esm-types/cli/lib/deploymentSelector.d.ts.map +1 -1
  421. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  422. package/dist/esm-types/cli/lib/env.d.ts +0 -4
  423. package/dist/esm-types/cli/lib/env.d.ts.map +1 -1
  424. package/dist/esm-types/cli/lib/expiration.d.ts +35 -0
  425. package/dist/esm-types/cli/lib/expiration.d.ts.map +1 -0
  426. package/dist/esm-types/cli/lib/expiration.test.d.ts +2 -0
  427. package/dist/esm-types/cli/lib/expiration.test.d.ts.map +1 -0
  428. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
  429. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  430. package/dist/esm-types/cli/lib/init.d.ts.map +1 -1
  431. package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  432. package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  433. package/dist/esm-types/cli/lib/localDeployment/run.d.ts +15 -0
  434. package/dist/esm-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  435. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  436. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +7 -0
  437. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  438. package/dist/esm-types/cli/lib/mcp/requestContext.d.ts +3 -3
  439. package/dist/esm-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  440. package/dist/esm-types/cli/lib/updates.d.ts +4 -3
  441. package/dist/esm-types/cli/lib/updates.d.ts.map +1 -1
  442. package/dist/esm-types/cli/lib/usage.d.ts.map +1 -1
  443. package/dist/esm-types/cli/lib/utils/prompts.d.ts +1 -0
  444. package/dist/esm-types/cli/lib/utils/prompts.d.ts.map +1 -1
  445. package/dist/esm-types/cli/lib/utils/utils.d.ts +16 -2
  446. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  447. package/dist/esm-types/cli/lib/versionApi.d.ts +7 -1
  448. package/dist/esm-types/cli/lib/versionApi.d.ts.map +1 -1
  449. package/dist/esm-types/cli/lib/workos/workos.d.ts.map +1 -1
  450. package/dist/esm-types/index.d.ts +1 -1
  451. package/dist/esm-types/react/client.d.ts +54 -2
  452. package/dist/esm-types/react/client.d.ts.map +1 -1
  453. package/dist/esm-types/react/index.d.ts +7 -2
  454. package/dist/esm-types/react/index.d.ts.map +1 -1
  455. package/dist/esm-types/react/use_query_object_options.test.d.ts +5 -0
  456. package/dist/esm-types/react/use_query_object_options.test.d.ts.map +1 -0
  457. package/dist/esm-types/react/use_query_result.test.d.ts +5 -0
  458. package/dist/esm-types/react/use_query_result.test.d.ts.map +1 -0
  459. package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
  460. package/dist/esm-types/server/api.d.ts +5 -1
  461. package/dist/esm-types/server/api.d.ts.map +1 -1
  462. package/dist/esm-types/server/components/definition.d.ts +1 -0
  463. package/dist/esm-types/server/components/definition.d.ts.map +1 -1
  464. package/dist/esm-types/server/components/index.d.ts +5 -1
  465. package/dist/esm-types/server/components/index.d.ts.map +1 -1
  466. package/dist/esm-types/server/data_model.d.ts +2 -1
  467. package/dist/esm-types/server/data_model.d.ts.map +1 -1
  468. package/dist/esm-types/server/impl/meta_impl.d.ts +5 -0
  469. package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -0
  470. package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
  471. package/dist/esm-types/server/index.d.ts +1 -0
  472. package/dist/esm-types/server/index.d.ts.map +1 -1
  473. package/dist/esm-types/server/meta.d.ts +72 -0
  474. package/dist/esm-types/server/meta.d.ts.map +1 -0
  475. package/dist/esm-types/server/registration.d.ts.map +1 -1
  476. package/dist/react.bundle.js +55 -15
  477. package/dist/react.bundle.js.map +3 -3
  478. package/package.json +11 -7
  479. package/schemas/convex.schema.json +22 -3
  480. package/src/browser/index.ts +3 -0
  481. package/src/browser/query_options.test.ts +0 -9
  482. package/src/browser/query_options.ts +36 -15
  483. package/src/browser/sync/authentication_manager.ts +9 -4
  484. package/src/browser/sync/client_node.test.ts +125 -0
  485. package/src/browser/sync/web_socket_manager.ts +1 -7
  486. package/src/cli/aiFiles.ts +56 -33
  487. package/src/cli/codegen_templates/readme.ts +14 -1
  488. package/src/cli/configure.test.ts +138 -0
  489. package/src/cli/configure.ts +62 -55
  490. package/src/cli/deploy.ts +12 -9
  491. package/src/cli/deploymentCreate.test.ts +349 -14
  492. package/src/cli/deploymentCreate.ts +268 -41
  493. package/src/cli/deploymentSelect.test.ts +136 -27
  494. package/src/cli/deploymentSelect.ts +50 -41
  495. package/src/cli/deploymentSelection.test.ts +399 -37
  496. package/src/cli/dev.ts +49 -14
  497. package/src/cli/docs.ts +1 -1
  498. package/src/cli/init.ts +2 -2
  499. package/src/cli/lib/{ai → aiFiles}/MANUAL_TESTING.md +6 -2
  500. package/src/cli/lib/aiFiles/agentsmd.test.ts +133 -0
  501. package/src/cli/lib/aiFiles/agentsmd.ts +81 -0
  502. package/src/cli/lib/aiFiles/claudemd.test.ts +92 -0
  503. package/src/cli/lib/aiFiles/claudemd.ts +81 -0
  504. package/src/cli/lib/aiFiles/cursorrules.ts +25 -0
  505. package/src/cli/lib/aiFiles/guidelinesmd.test.ts +50 -0
  506. package/src/cli/lib/aiFiles/guidelinesmd.ts +49 -0
  507. package/src/cli/lib/{ai → aiFiles}/index.test.ts +343 -516
  508. package/src/cli/lib/aiFiles/index.ts +297 -0
  509. package/src/cli/lib/{ai → aiFiles}/integration.test.ts +195 -158
  510. package/src/cli/lib/{ai → aiFiles}/paths.ts +5 -0
  511. package/src/cli/lib/{ai → aiFiles}/prompt.test.ts +79 -31
  512. package/src/cli/lib/aiFiles/skills.ts +243 -0
  513. package/src/cli/lib/aiFiles/state.test.ts +280 -0
  514. package/src/cli/lib/aiFiles/state.ts +82 -0
  515. package/src/cli/lib/aiFiles/status.ts +246 -0
  516. package/src/cli/lib/aiFiles/utils.test.ts +50 -0
  517. package/src/cli/lib/aiFiles/utils.ts +191 -0
  518. package/src/cli/lib/api.ts +88 -7
  519. package/src/cli/lib/command.ts +18 -8
  520. package/src/cli/lib/config.test.ts +185 -8
  521. package/src/cli/lib/config.ts +73 -12
  522. package/src/cli/lib/deploy2.ts +14 -27
  523. package/src/cli/lib/deployApi/componentDefinition.ts +4 -1
  524. package/src/cli/lib/deploymentSelection.ts +59 -6
  525. package/src/cli/lib/deploymentSelector.test.ts +6 -0
  526. package/src/cli/lib/deploymentSelector.ts +2 -0
  527. package/src/cli/lib/dev.ts +202 -153
  528. package/src/cli/lib/env.ts +0 -15
  529. package/src/cli/lib/expiration.test.ts +159 -0
  530. package/src/cli/lib/expiration.ts +124 -0
  531. package/src/cli/lib/generatedFunctionLogsApi.ts +16 -1
  532. package/src/cli/lib/init.ts +6 -2
  533. package/src/cli/lib/insights.ts +1 -1
  534. package/src/cli/lib/localDeployment/anonymous.ts +19 -9
  535. package/src/cli/lib/localDeployment/localDeployment.ts +9 -11
  536. package/src/cli/lib/localDeployment/run.ts +1 -1
  537. package/src/cli/lib/localDeployment/upgrade.ts +12 -10
  538. package/src/cli/lib/localDeployment/utils.ts +12 -0
  539. package/src/cli/lib/mcp/tools/status.ts +1 -1
  540. package/src/cli/lib/updates.test.ts +97 -60
  541. package/src/cli/lib/updates.ts +17 -15
  542. package/src/cli/lib/usage.ts +3 -1
  543. package/src/cli/lib/utils/prompts.ts +2 -0
  544. package/src/cli/lib/utils/utils.test.ts +6 -6
  545. package/src/cli/lib/utils/utils.ts +66 -27
  546. package/src/cli/lib/versionApi.test.ts +13 -10
  547. package/src/cli/lib/versionApi.ts +13 -5
  548. package/src/cli/lib/workos/workos.ts +4 -5
  549. package/src/index.ts +1 -1
  550. package/src/react/client.test.tsx +65 -0
  551. package/src/react/client.ts +129 -13
  552. package/src/react/index.ts +9 -1
  553. package/src/react/use_query_object_options.test.ts +50 -0
  554. package/src/react/use_query_result.test.ts +41 -0
  555. package/src/react-clerk/ConvexProviderWithClerk.test.tsx +1 -1
  556. package/src/react-clerk/ConvexProviderWithClerk.tsx +1 -1
  557. package/src/server/api.ts +5 -1
  558. package/src/server/components/definition.ts +3 -0
  559. package/src/server/components/index.ts +62 -5
  560. package/src/server/data_model.ts +2 -1
  561. package/src/server/impl/meta_impl.ts +74 -0
  562. package/src/server/impl/registration_impl.ts +21 -9
  563. package/src/server/index.ts +8 -0
  564. package/src/server/meta.ts +76 -0
  565. package/src/server/registration.ts +10 -0
  566. package/src/server/schema.test.ts +78 -1
  567. package/dist/cjs/cli/lib/ai/config.js +0 -144
  568. package/dist/cjs/cli/lib/ai/config.js.map +0 -7
  569. package/dist/cjs/cli/lib/ai/index.js +0 -704
  570. package/dist/cjs/cli/lib/ai/index.js.map +0 -7
  571. package/dist/cjs/cli/lib/ai/paths.js.map +0 -7
  572. package/dist/cjs-types/cli/lib/ai/config.d.ts +0 -50
  573. package/dist/cjs-types/cli/lib/ai/config.d.ts.map +0 -1
  574. package/dist/cjs-types/cli/lib/ai/config.test.d.ts +0 -2
  575. package/dist/cjs-types/cli/lib/ai/config.test.d.ts.map +0 -1
  576. package/dist/cjs-types/cli/lib/ai/index.d.ts +0 -56
  577. package/dist/cjs-types/cli/lib/ai/index.d.ts.map +0 -1
  578. package/dist/cjs-types/cli/lib/ai/index.test.d.ts.map +0 -1
  579. package/dist/cjs-types/cli/lib/ai/integration.test.d.ts.map +0 -1
  580. package/dist/cjs-types/cli/lib/ai/paths.d.ts.map +0 -1
  581. package/dist/cjs-types/cli/lib/ai/prompt.test.d.ts.map +0 -1
  582. package/dist/esm/cli/lib/ai/config.js +0 -109
  583. package/dist/esm/cli/lib/ai/config.js.map +0 -7
  584. package/dist/esm/cli/lib/ai/index.js +0 -684
  585. package/dist/esm/cli/lib/ai/index.js.map +0 -7
  586. package/dist/esm/cli/lib/ai/paths.js.map +0 -7
  587. package/dist/esm-types/cli/lib/ai/config.d.ts +0 -50
  588. package/dist/esm-types/cli/lib/ai/config.d.ts.map +0 -1
  589. package/dist/esm-types/cli/lib/ai/config.test.d.ts +0 -2
  590. package/dist/esm-types/cli/lib/ai/config.test.d.ts.map +0 -1
  591. package/dist/esm-types/cli/lib/ai/index.d.ts +0 -56
  592. package/dist/esm-types/cli/lib/ai/index.d.ts.map +0 -1
  593. package/dist/esm-types/cli/lib/ai/index.test.d.ts.map +0 -1
  594. package/dist/esm-types/cli/lib/ai/integration.test.d.ts.map +0 -1
  595. package/dist/esm-types/cli/lib/ai/paths.d.ts.map +0 -1
  596. package/dist/esm-types/cli/lib/ai/prompt.test.d.ts.map +0 -1
  597. package/src/cli/lib/ai/config.test.ts +0 -338
  598. package/src/cli/lib/ai/config.ts +0 -159
  599. package/src/cli/lib/ai/index.ts +0 -1006
  600. /package/dist/cjs/cli/lib/{ai → aiFiles}/paths.js +0 -0
  601. /package/dist/cjs-types/cli/lib/{ai → aiFiles}/index.test.d.ts +0 -0
  602. /package/dist/cjs-types/cli/lib/{ai → aiFiles}/integration.test.d.ts +0 -0
  603. /package/dist/cjs-types/cli/lib/{ai → aiFiles}/prompt.test.d.ts +0 -0
  604. /package/dist/esm/cli/lib/{ai → aiFiles}/paths.js +0 -0
  605. /package/dist/esm-types/cli/lib/{ai → aiFiles}/index.test.d.ts +0 -0
  606. /package/dist/esm-types/cli/lib/{ai → aiFiles}/integration.test.d.ts +0 -0
  607. /package/dist/esm-types/cli/lib/{ai → aiFiles}/prompt.test.d.ts +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/cli/lib/ai/index.ts"],
4
- "sourcesContent": ["import * as Sentry from \"@sentry/node\";\nimport child_process from \"child_process\";\nimport path from \"path\";\nimport { Context } from \"../../../bundler/context.js\";\n// Use raw fs (not ctx.fs) so these operations run asynchronously and don't\n// interfere with the file-watcher used by `convex dev`.\n// eslint-disable-next-line no-restricted-imports\nimport { promises as fs } from \"fs\";\nimport { chalkStderr } from \"chalk\";\nimport { logMessage } from \"../../../bundler/log.js\";\nimport {\n AGENTS_MD_START_MARKER,\n AGENTS_MD_END_MARKER,\n agentsMdConvexSection,\n} from \"../../codegen_templates/agentsmd.js\";\nimport {\n CLAUDE_MD_END_MARKER,\n CLAUDE_MD_START_MARKER,\n claudeMdConvexSection,\n} from \"../../codegen_templates/claudemd.js\";\nimport {\n downloadGuidelines,\n fetchAgentSkillsSha,\n getVersion,\n} from \"../versionApi.js\";\nimport { promptYesNo } from \"../utils/prompts.js\";\nimport { hashSha256 } from \"../utils/hash.js\";\nimport {\n aiDirForConvexDir,\n agentsMdPath,\n claudeMdPath,\n guidelinesPathForConvexDir,\n} from \"./paths.js\";\nimport {\n type AiFilesConfig,\n readAiConfig,\n writeAiConfig,\n writeAiDisabledToProjectConfig,\n} from \"./config.js\";\n\nfunction isAgentMode(): boolean {\n return process.env.CONVEX_AGENT_MODE !== undefined;\n}\n\n// ---------------------------------------------------------------------------\n// AGENTS.md helpers\n// ---------------------------------------------------------------------------\n\nexport async function injectAgentsMdSection(\n section: string,\n projectDir?: string,\n): Promise<string | null> {\n const filePath = agentsMdPath(projectDir);\n let existing = \"\";\n try {\n existing = await fs.readFile(filePath, \"utf8\");\n } catch {\n // File doesn't exist \u2014 we'll create it.\n }\n\n let updated: string;\n const startIdx = existing.indexOf(AGENTS_MD_START_MARKER);\n const endIdx = existing.indexOf(AGENTS_MD_END_MARKER);\n\n if (startIdx !== -1 && endIdx !== -1) {\n // Replace existing Convex section.\n updated =\n existing.slice(0, startIdx) +\n section +\n existing.slice(endIdx + AGENTS_MD_END_MARKER.length);\n } else if (existing.length > 0) {\n // Append to existing file (with a blank line separator).\n updated = existing.trimEnd() + \"\\n\\n\" + section + \"\\n\";\n } else {\n // Create new file.\n updated = section + \"\\n\";\n }\n\n await fs.writeFile(filePath, updated, \"utf8\");\n return hashSha256(section);\n}\n\ntype InjectClaudeSectionResult = {\n sectionHash: string;\n didWrite: boolean;\n};\n\nexport async function injectClaudeMdSection(\n section: string,\n projectDir?: string,\n): Promise<InjectClaudeSectionResult> {\n const filePath = claudeMdPath(projectDir);\n let existing = \"\";\n try {\n existing = await fs.readFile(filePath, \"utf8\");\n } catch {\n // File doesn't exist - we'll create it.\n }\n\n let updated: string;\n const startIdx = existing.indexOf(CLAUDE_MD_START_MARKER);\n const endIdx = existing.indexOf(CLAUDE_MD_END_MARKER);\n\n if (startIdx !== -1 && endIdx !== -1) {\n // Replace existing Convex section.\n updated =\n existing.slice(0, startIdx) +\n section +\n existing.slice(endIdx + CLAUDE_MD_END_MARKER.length);\n } else if (existing.length > 0) {\n // Append to existing file (with a blank line separator).\n updated = existing.trimEnd() + \"\\n\\n\" + section + \"\\n\";\n } else {\n // Create new file.\n updated = section + \"\\n\";\n }\n\n const didWrite = updated !== existing;\n if (didWrite) {\n await fs.writeFile(filePath, updated, \"utf8\");\n }\n return {\n sectionHash: hashSha256(section),\n didWrite,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Write/update all Convex AI files (guidelines, AGENTS.md, CLAUDE.md, skills).\n *\n * @param convexDir - absolute path to the project's convex functions directory\n * (e.g. `/home/user/myapp/convex`). Used to build the `_generated/ai/` subdirectory.\n */\nexport async function writeAiFiles(\n convexDir: string,\n installSkills: boolean = false,\n skillsOutputMode: \"verbose\" | \"quiet\" = \"verbose\",\n projectDirOverride?: string,\n): Promise<void> {\n const projectDir = path.resolve(\n projectDirOverride ?? path.dirname(convexDir),\n );\n\n try {\n // Ensure convex/_generated/ai/ directory exists.\n await fs.mkdir(aiDirForConvexDir(convexDir), { recursive: true });\n\n const config: AiFilesConfig = {\n disableStalenessMessage: false,\n guidelinesHash: null,\n agentsMdSectionHash: null,\n claudeMdHash: null,\n agentSkillsSha: null,\n installedSkillNames: [],\n };\n\n // Write guidelines.\n const guidelines = await downloadGuidelines();\n if (guidelines !== null) {\n await fs.writeFile(\n guidelinesPathForConvexDir(convexDir),\n guidelines,\n \"utf8\",\n );\n config.guidelinesHash = hashSha256(guidelines);\n } else {\n logMessage(\n chalkStderr.yellow(\n \"Could not download Convex AI guidelines right now. You can retry with: npx convex ai-files install\",\n ),\n );\n }\n\n // Inject Convex section into AGENTS.md.\n const convexDirName = path.relative(projectDir, convexDir);\n const section = agentsMdConvexSection(convexDirName);\n config.agentsMdSectionHash = await injectAgentsMdSection(\n section,\n projectDir,\n );\n\n // Inject Convex section into CLAUDE.md.\n const claudeSection = claudeMdConvexSection(convexDirName);\n const claudeInjectResult = await injectClaudeMdSection(\n claudeSection,\n projectDir,\n );\n config.claudeMdHash = claudeInjectResult.sectionHash;\n\n if (installSkills) {\n if (await shouldRunSkillsCli()) {\n logMessage(\"Installing Convex agent skills...\");\n const skillsOk = await runSkillsAdd(projectDir, skillsOutputMode);\n if (skillsOk) {\n // Record the canonical SHA for staleness detection.\n const sha = await fetchAgentSkillsSha();\n if (sha) {\n config.agentSkillsSha = sha;\n }\n const names = await readInstalledSkillNames(projectDir);\n if (names.length > 0) {\n config.installedSkillNames = names;\n }\n } else {\n logMessage(\n chalkStderr.yellow(\n \"Could not install agent skills. You can retry manually with: npx skills add get-convex/agent-skills\",\n ),\n );\n }\n }\n }\n\n // Clean up the legacy `.cursor/rules/convex_rules.mdc` file if present.\n // It was written by the old cursor rules auto-update and is now superseded\n // by `convex/_generated/ai/guidelines.md`.\n const removedLegacy = await removeLegacyCursorRulesFile(projectDir);\n if (removedLegacy) {\n logMessage(\n `${chalkStderr.green(`\u2714`)} Removed legacy .cursor/rules/convex_rules.mdc (superseded by convex/_generated/ai/guidelines.md).`,\n );\n }\n\n await writeAiConfig(config, projectDir, convexDir);\n\n logMessage(\n `${chalkStderr.green(`\u2714`)} Wrote Convex AI files to ${path.relative(projectDir, aiDirForConvexDir(convexDir))}/`,\n );\n } catch (error) {\n Sentry.captureException(error);\n // Non-fatal \u2014 don't break the init flow.\n }\n}\n\n/**\n * Check whether the Convex AI files are out of date and log a nag message\n * if so.\n */\nexport async function checkAiFilesStaleness(\n canonicalGuidelinesHash: string | null,\n canonicalAgentSkillsSha: string | null,\n projectDir: string,\n convexDir: string,\n): Promise<void> {\n const config = await readAiConfig(projectDir, convexDir);\n\n if (config === null) {\n // No state file means AI files have not been set up yet. Keep nudging until\n // the user either installs them or explicitly disables the nag with\n // `npx convex ai-files disable`.\n logMessage(\n chalkStderr.yellow(\n isAgentMode()\n ? `Convex AI files are not installed. If you are an agent tell the human to run ${chalkStderr.bold(`npx convex ai-files install`)} to get started or ${chalkStderr.bold(`npx convex ai-files disable`)} to hide this message.`\n : `Convex AI files are not installed. Run ${chalkStderr.bold(`npx convex ai-files install`)} to get started or ${chalkStderr.bold(`npx convex ai-files disable`)} to hide this message.`,\n ),\n );\n return;\n }\n\n if (config.disableStalenessMessage) {\n // User explicitly suppressed staleness/install messages.\n return;\n }\n\n // No version data from server \u2014 skip staleness check (non-fatal).\n if (canonicalGuidelinesHash === null && canonicalAgentSkillsSha === null) {\n return;\n }\n\n const guidelinesStale =\n canonicalGuidelinesHash !== null &&\n config.guidelinesHash !== null &&\n config.guidelinesHash !== canonicalGuidelinesHash;\n\n const skillsStale =\n canonicalAgentSkillsSha !== null &&\n config.agentSkillsSha !== null &&\n config.agentSkillsSha !== canonicalAgentSkillsSha;\n\n if (guidelinesStale || skillsStale) {\n logMessage(\n chalkStderr.yellow(\n `Your Convex AI files are out of date. Run ${chalkStderr.bold(`npx convex ai-files update`)} to get the latest.`,\n ),\n );\n }\n}\n\n/**\n * Update all Convex AI files to their latest versions.\n *\n * Files the user has modified (detected via hash comparison) are skipped\n * with a warning rather than silently overwritten.\n *\n * @param projectDir - absolute path to the project root directory.\n * @param convexDir - absolute path to the Convex functions directory.\n */\nexport async function updateAiFiles(\n projectDir: string,\n convexDir: string,\n): Promise<void> {\n const config = await readAiConfig(projectDir, convexDir);\n if (config === null) {\n // No config yet \u2014 run the full init and install skills.\n await writeAiFiles(convexDir, true, \"verbose\", projectDir);\n return;\n }\n\n // Config can exist (for example, disableStalenessMessage in convex.json) even\n // when convex/_generated/ai/ was removed. Recreate it so reinstall/update\n // paths do not fail when writing guidelines/state.\n await fs.mkdir(aiDirForConvexDir(convexDir), { recursive: true });\n\n let updatedCount = 0;\n let skippedCount = 0;\n\n // Update guidelines.\n const guidelines = await downloadGuidelines();\n if (guidelines !== null) {\n const newHash = hashSha256(guidelines);\n if (newHash === config.guidelinesHash) {\n logMessage(\"Convex AI guidelines are already up to date.\");\n } else {\n const currentContent = await readFileSafe(\n guidelinesPathForConvexDir(convexDir),\n );\n if (\n currentContent !== null &&\n config.guidelinesHash !== null &&\n hashSha256(currentContent) !== config.guidelinesHash\n ) {\n logMessage(\n chalkStderr.yellow(\n `Skipping ${path.relative(projectDir, guidelinesPathForConvexDir(convexDir))} \u2014 file has been modified locally.`,\n ),\n );\n skippedCount++;\n } else {\n await fs.writeFile(\n guidelinesPathForConvexDir(convexDir),\n guidelines,\n \"utf8\",\n );\n config.guidelinesHash = newHash;\n updatedCount++;\n }\n }\n } else {\n logMessage(\n chalkStderr.yellow(\n \"Could not download Convex AI guidelines right now. Keeping your existing guidelines file.\",\n ),\n );\n }\n\n // Update AGENTS.md section. The dir name is hardcoded to match paths.ts\n // (the only non-standard case was create-react-app which is dead).\n const convexDirName = path.relative(projectDir, convexDir);\n const section = agentsMdConvexSection(convexDirName);\n const newSectionHash = hashSha256(section);\n\n if (newSectionHash !== config.agentsMdSectionHash) {\n config.agentsMdSectionHash = await injectAgentsMdSection(\n section,\n projectDir,\n );\n updatedCount++;\n }\n\n // The skills CLI streams its own output, so we don't count this in\n // updatedCount.\n if (await shouldRunSkillsCli()) {\n logMessage(\"Installing Convex agent skills...\");\n const skillsOk = await runSkillsAdd(projectDir);\n if (skillsOk) {\n // Record the canonical SHA for staleness detection.\n const sha = await fetchAgentSkillsSha();\n if (sha) {\n config.agentSkillsSha = sha;\n }\n // Track installed skill names so `convex ai-files remove` can pass them\n // to `npx skills remove`.\n const names = await readInstalledSkillNames(projectDir);\n if (names.length > 0) {\n config.installedSkillNames = names;\n }\n } else {\n logMessage(\n chalkStderr.yellow(\n \"Could not install agent skills. You can retry manually with: npx skills add get-convex/agent-skills\",\n ),\n );\n }\n }\n\n // Clean up the legacy `.cursor/rules/convex_rules.mdc` file if present.\n // It was written by the old cursor rules auto-update and is now superseded\n // by `convex/_generated/ai/guidelines.md`.\n const removedLegacy = await removeLegacyCursorRulesFile(projectDir);\n if (removedLegacy) {\n logMessage(\n `${chalkStderr.green(`\u2714`)} Removed legacy .cursor/rules/convex_rules.mdc (superseded by convex/_generated/ai/guidelines.md).`,\n );\n updatedCount++;\n }\n\n // Update/inject the Convex-managed CLAUDE.md section.\n const claudeSection = claudeMdConvexSection(convexDirName);\n const claudeInjectResult = await injectClaudeMdSection(\n claudeSection,\n projectDir,\n );\n config.claudeMdHash = claudeInjectResult.sectionHash;\n if (claudeInjectResult.didWrite) {\n updatedCount++;\n }\n\n await writeAiConfig(config, projectDir, convexDir);\n\n if (updatedCount > 0) {\n logMessage(\n `${chalkStderr.green(`\u2714`)} Updated ${updatedCount} Convex AI file${updatedCount === 1 ? \"\" : \"s\"}.`,\n );\n }\n if (skippedCount > 0) {\n logMessage(\n chalkStderr.yellow(\n `Skipped ${skippedCount} file${skippedCount === 1 ? \"\" : \"s\"} with local modifications.`,\n ),\n );\n }\n if (updatedCount === 0 && skippedCount === 0) {\n logMessage(\"Convex AI files are already up to date.\");\n }\n}\n\nexport async function enableAiFiles(\n projectDir: string,\n convexDir: string,\n): Promise<void> {\n await updateAiFiles(projectDir, convexDir);\n const config = await readAiConfig(projectDir, convexDir);\n if (config === null) {\n return;\n }\n config.disableStalenessMessage = false;\n await writeAiConfig(config, projectDir, convexDir, {\n persistDisabledPreference: \"always\",\n });\n}\n\n/**\n * Remove the Convex-managed section from AGENTS.md (between the start/end\n * markers). If the file becomes empty or only whitespace after removal it is\n * deleted. Returns true if a section was found and removed.\n */\nasync function stripAgentsMdSection(projectDir: string): Promise<boolean> {\n const filePath = agentsMdPath(projectDir);\n let content: string;\n try {\n content = await fs.readFile(filePath, \"utf8\");\n } catch {\n return false;\n }\n const startIdx = content.indexOf(AGENTS_MD_START_MARKER);\n const endIdx = content.indexOf(AGENTS_MD_END_MARKER);\n if (startIdx === -1 || endIdx === -1) {\n return false;\n }\n const before = content.slice(0, startIdx).trimEnd();\n const after = content.slice(endIdx + AGENTS_MD_END_MARKER.length).trimStart();\n const updated = [before, after].filter(Boolean).join(\"\\n\\n\");\n\n if (!updated.trim()) {\n try {\n await fs.unlink(filePath);\n } catch {\n // Ignore errors\n }\n } else {\n await fs.writeFile(filePath, updated + \"\\n\", \"utf8\");\n }\n return true;\n}\n\n/**\n * Remove the Convex-managed section from CLAUDE.md (between start/end markers).\n * If the file becomes empty after removal, delete it.\n */\nasync function stripClaudeMdSection(\n projectDir: string,\n): Promise<\"none\" | \"section\" | \"file\"> {\n const filePath = claudeMdPath(projectDir);\n let content: string;\n try {\n content = await fs.readFile(filePath, \"utf8\");\n } catch {\n return \"none\";\n }\n const startIdx = content.indexOf(CLAUDE_MD_START_MARKER);\n const endIdx = content.indexOf(CLAUDE_MD_END_MARKER);\n if (startIdx === -1 || endIdx === -1) {\n return \"none\";\n }\n const before = content.slice(0, startIdx).trimEnd();\n const after = content.slice(endIdx + CLAUDE_MD_END_MARKER.length).trimStart();\n const updated = [before, after].filter(Boolean).join(\"\\n\\n\");\n\n if (!updated.trim()) {\n try {\n await fs.unlink(filePath);\n } catch {\n // Ignore errors.\n }\n return \"file\";\n }\n await fs.writeFile(filePath, updated + \"\\n\", \"utf8\");\n return \"section\";\n}\n\n/**\n * Remove all Convex AI files from the project.\n * Called by `npx convex ai-files remove`.\n *\n * - Strips the Convex section from AGENTS.md (deletes file if empty)\n * - Strips the Convex section from CLAUDE.md (deletes file if empty)\n * - Runs `npx skills remove <name...> --yes` for each tracked skill\n * - Deletes the `convex/_generated/ai/` directory\n */\nexport async function removeAiFiles(\n projectDir: string,\n convexDir: string,\n): Promise<void> {\n const config = await readAiConfig(projectDir, convexDir);\n\n if (config === null) {\n logMessage(\"No Convex AI files found \u2014 nothing to remove.\");\n return;\n }\n\n let removedCount = 0;\n\n // Strip Convex section from AGENTS.md.\n const stripped = await stripAgentsMdSection(projectDir);\n if (stripped) {\n logMessage(\n `${chalkStderr.green(`\u2714`)} Removed Convex section from AGENTS.md.`,\n );\n removedCount++;\n }\n\n // Strip Convex section from CLAUDE.md if present.\n // If the file is empty after stripping, it's deleted automatically.\n const strippedClaude = await stripClaudeMdSection(projectDir);\n if (strippedClaude === \"section\") {\n logMessage(\n `${chalkStderr.green(`\u2714`)} Removed Convex section from CLAUDE.md.`,\n );\n removedCount++;\n } else if (strippedClaude === \"file\") {\n logMessage(`${chalkStderr.green(`\u2714`)} Deleted CLAUDE.md.`);\n removedCount++;\n }\n\n // Remove installed skills via the skills CLI.\n if (config.installedSkillNames.length > 0) {\n if (await shouldRunSkillsCli()) {\n logMessage(\n `Removing Convex agent skills: ${config.installedSkillNames.join(\", \")}`,\n );\n const skillsOk = await runSkillsRemove(\n projectDir,\n config.installedSkillNames,\n );\n if (!skillsOk) {\n logMessage(\n chalkStderr.yellow(\n \"Could not remove agent skills automatically. Remove them manually with: npx skills remove\",\n ),\n );\n } else {\n const removedLock = await removeSkillsLockIfEmpty(\n projectDir,\n config.installedSkillNames,\n );\n if (removedLock) {\n logMessage(`${chalkStderr.green(`\u2714`)} Deleted skills-lock.json.`);\n removedCount++;\n }\n }\n }\n }\n\n // Clean up the legacy `.cursor/rules/convex_rules.mdc` file if present.\n const removedLegacy = await removeLegacyCursorRulesFile(projectDir);\n if (removedLegacy) {\n logMessage(\n `${chalkStderr.green(`\u2714`)} Removed legacy .cursor/rules/convex_rules.mdc.`,\n );\n removedCount++;\n }\n\n // Delete the convex/_generated/ai/ directory.\n try {\n await fs.rm(aiDirForConvexDir(convexDir), { recursive: true, force: true });\n logMessage(\n `${chalkStderr.green(`\u2714`)} Deleted ${path.relative(projectDir, aiDirForConvexDir(convexDir))}/`,\n );\n removedCount++;\n } catch (error) {\n Sentry.captureException(error);\n logMessage(\n chalkStderr.yellow(\n `Could not delete ${path.relative(projectDir, aiDirForConvexDir(convexDir))}/. Remove it manually.`,\n ),\n );\n }\n\n if (removedCount > 0) {\n logMessage(\"Convex AI files removed.\");\n }\n}\n\n/**\n * Called by `npx convex ai-files disable`.\n *\n * Writes a suppression flag into `convex.json` (`aiFiles.disableStalenessMessage`) so\n * `npx convex dev` stops showing AI files install/staleness messages.\n * Files are left in place - use `remove` to delete them.\n * The user can re-enable at any time with `npx convex ai-files enable`.\n */\nexport async function disableAiFiles(projectDir: string): Promise<void> {\n try {\n await writeAiDisabledToProjectConfig(true, projectDir);\n logMessage(\n `${chalkStderr.green(`\u2714`)} Convex AI file staleness/install messages disabled. Run ${chalkStderr.bold(`npx convex ai-files enable`)} to re-enable.`,\n );\n } catch (error) {\n Sentry.captureException(error);\n logMessage(\n chalkStderr.yellow(\n \"Could not write AI message suppression config. Message may reappear.\",\n ),\n );\n }\n}\n\n/**\n * Print the current status of Convex AI files to the terminal.\n */\nexport async function statusAiFiles(\n projectDir: string,\n convexDir: string,\n): Promise<void> {\n const convexDirName = path.relative(projectDir, convexDir);\n const guidelinesRelPath = path.relative(\n projectDir,\n guidelinesPathForConvexDir(convexDir),\n );\n\n const config = await readAiConfig(projectDir, convexDir);\n\n if (config === null) {\n logMessage(`Convex AI files: ${chalkStderr.yellow(\"not installed\")}`);\n logMessage(\n ` Run ${chalkStderr.bold(\"npx convex ai-files install\")} to get started, ` +\n `or ${chalkStderr.bold(\"npx convex ai-files disable\")} to silence this message.`,\n );\n return;\n }\n\n if (config.disableStalenessMessage) {\n logMessage(\n `Convex AI files: ${chalkStderr.yellow(\"staleness/install messages disabled\")}`,\n );\n logMessage(\n ` Run ${chalkStderr.bold(\"npx convex ai-files enable\")} to re-enable.`,\n );\n return;\n }\n\n logMessage(`Convex AI files: ${chalkStderr.green(\"enabled\")}`);\n\n // Fetch canonical version data in parallel with the file reads below\n // (best-effort \u2014 network may be unavailable in CI or offline envs).\n const [versionData, guidelinesFile, agentsContent, claudeContent] =\n await Promise.all([\n getVersion(),\n readFileSafe(guidelinesPathForConvexDir(convexDir)),\n readFileSafe(agentsMdPath(projectDir)),\n readFileSafe(claudeMdPath(projectDir)),\n ]);\n\n const canonicalGuidelinesHash = versionData?.guidelinesHash ?? null;\n const canonicalAgentSkillsSha = versionData?.agentSkillsSha ?? null;\n const networkAvailable = versionData !== null;\n\n // --- convex/_generated/ai/guidelines.md ---\n if (guidelinesFile === null) {\n logMessage(\n ` ${chalkStderr.yellow(\"\u26A0\")} ${guidelinesRelPath}: not on disk \u2014 run ${chalkStderr.bold(\"npx convex ai-files install\")} to reinstall`,\n );\n } else if (\n config.guidelinesHash !== null &&\n hashSha256(guidelinesFile) !== config.guidelinesHash\n ) {\n logMessage(\n ` ${chalkStderr.yellow(\"\u26A0\")} ${guidelinesRelPath}: installed, modified locally (Convex updates will be skipped)`,\n );\n } else if (\n networkAvailable &&\n canonicalGuidelinesHash !== null &&\n config.guidelinesHash !== null &&\n config.guidelinesHash !== canonicalGuidelinesHash\n ) {\n logMessage(\n ` ${chalkStderr.yellow(\"\u26A0\")} ${guidelinesRelPath}: installed, out of date \u2014 run ${chalkStderr.bold(\"npx convex ai-files update\")}`,\n );\n } else {\n logMessage(\n ` ${chalkStderr.green(\"\u2714\")} ${guidelinesRelPath}: installed${networkAvailable ? \", up to date\" : \"\"}`,\n );\n }\n\n // --- AGENTS.md (Convex section) ---\n const hasAgentsSection =\n agentsContent !== null &&\n agentsContent.includes(AGENTS_MD_START_MARKER) &&\n agentsContent.includes(AGENTS_MD_END_MARKER);\n\n if (!hasAgentsSection) {\n logMessage(\n ` ${chalkStderr.yellow(\"\u26A0\")} AGENTS.md: Convex section missing \u2014 run ${chalkStderr.bold(\"npx convex ai-files install\")} to reinstall`,\n );\n } else {\n // Staleness is locally computable from the template \u2014 no network needed.\n const currentSectionHash = hashSha256(agentsMdConvexSection(convexDirName));\n if (\n config.agentsMdSectionHash !== null &&\n config.agentsMdSectionHash !== currentSectionHash\n ) {\n logMessage(\n ` ${chalkStderr.yellow(\"\u26A0\")} AGENTS.md: Convex section out of date \u2014 run ${chalkStderr.bold(\"npx convex ai-files update\")}`,\n );\n } else {\n logMessage(\n ` ${chalkStderr.green(\"\u2714\")} AGENTS.md: Convex section present, up to date`,\n );\n }\n }\n\n // --- CLAUDE.md (Convex section) ---\n const hasClaudeSection =\n claudeContent !== null &&\n claudeContent.includes(CLAUDE_MD_START_MARKER) &&\n claudeContent.includes(CLAUDE_MD_END_MARKER);\n\n if (!hasClaudeSection) {\n if (claudeContent === null) {\n logMessage(\n ` ${chalkStderr.yellow(\"\u26A0\")} CLAUDE.md: missing - run ${chalkStderr.bold(\"npx convex ai-files install\")} to create it`,\n );\n } else {\n logMessage(\n ` ${chalkStderr.yellow(\"\u26A0\")} CLAUDE.md: no Convex section present - run ${chalkStderr.bold(\"npx convex ai-files update\")} to add it`,\n );\n }\n } else {\n // Staleness is locally computable from the template \u2014 no network needed.\n const currentSectionHash = hashSha256(claudeMdConvexSection(convexDirName));\n if (\n config.claudeMdHash !== null &&\n config.claudeMdHash !== currentSectionHash\n ) {\n logMessage(\n ` ${chalkStderr.yellow(\"\u26A0\")} CLAUDE.md: Convex section out of date - run ${chalkStderr.bold(\"npx convex ai-files update\")}`,\n );\n } else {\n logMessage(\n ` ${chalkStderr.green(\"\u2714\")} CLAUDE.md: Convex section present, up to date`,\n );\n }\n }\n\n // --- Agent skills ---\n if (config.installedSkillNames.length === 0) {\n logMessage(\n ` ${chalkStderr.yellow(\"\u26A0\")} Agent skills: not installed \u2014 run ${chalkStderr.bold(\"npx convex ai-files install\")} to install`,\n );\n } else {\n const skillsStale =\n networkAvailable &&\n canonicalAgentSkillsSha !== null &&\n config.agentSkillsSha !== null &&\n config.agentSkillsSha !== canonicalAgentSkillsSha;\n const skillsList = config.installedSkillNames.join(\", \");\n if (skillsStale) {\n logMessage(\n ` ${chalkStderr.yellow(\"\u26A0\")} Agent skills: ${skillsList} \u2014 out of date, run ${chalkStderr.bold(\"npx convex ai-files update\")}`,\n );\n } else {\n logMessage(\n ` ${chalkStderr.green(\"\u2714\")} Agent skills: ${skillsList}${networkAvailable ? \" (up to date)\" : \"\"}`,\n );\n }\n }\n}\n\nexport async function maybeSetupAiFiles(\n ctx: Context,\n convexDir: string,\n projectDir: string,\n): Promise<void> {\n if (isAgentMode()) {\n return;\n }\n\n // Non-interactive (no TTY) is almost always an AI agent, not CI\n // (CI uses `npx convex deploy`). Default to installing so agents\n // get context automatically.\n let wantsAiFiles = true;\n if (process.stdin.isTTY) {\n wantsAiFiles = await promptYesNo(ctx, {\n message: \"Set up Convex AI files? (guidelines, AGENTS.md, agent skills)\",\n default: true,\n });\n }\n if (wantsAiFiles) {\n await writeAiFiles(convexDir, true, \"quiet\", projectDir);\n }\n}\n\n/**\n * Remove the legacy `.cursor/rules/convex_rules.mdc` file if it exists.\n * This file was written by the old cursor rules auto-update feature (removed\n * in favour of the AI files system). We clean it up unconditionally\n * during `writeAiFiles`, `convex ai-files update`, and `convex ai-files remove` since it was always\n * auto-managed and is now superseded by `convex/_generated/ai/guidelines.md`.\n */\nasync function removeLegacyCursorRulesFile(\n projectDir: string,\n): Promise<boolean> {\n const filePath = path.join(\n projectDir,\n \".cursor\",\n \"rules\",\n \"convex_rules.mdc\",\n );\n try {\n await fs.unlink(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Remove the skills-lock.json file if it only contains skills that we\n * are removing. The `npx skills remove` command leaves the lockfile behind\n * even when it's logically empty.\n */\nasync function removeSkillsLockIfEmpty(\n projectDir: string,\n removedSkillNames: string[],\n): Promise<boolean> {\n const lockPath = path.join(projectDir, \"skills-lock.json\");\n try {\n const content = await fs.readFile(lockPath, \"utf8\");\n const lock = JSON.parse(content);\n\n // If the file doesn't match the expected structure, leave it alone.\n if (\n !lock ||\n typeof lock !== \"object\" ||\n !lock.skills ||\n typeof lock.skills !== \"object\"\n ) {\n return false;\n }\n\n const remainingSkills = Object.keys(lock.skills).filter(\n (name) => !removedSkillNames.includes(name),\n );\n\n if (remainingSkills.length === 0) {\n await fs.unlink(lockPath);\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\n\nasync function readFileSafe(filePath: string): Promise<string | null> {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch {\n return null;\n }\n}\n\n/**\n * Read the frontmatter `name:` values from skills installed by the skills CLI.\n */\nasync function readInstalledSkillNames(projectDir: string): Promise<string[]> {\n const skillsDir = path.join(projectDir, \".agents\", \"skills\");\n let entries: string[];\n try {\n const dirents = await fs.readdir(skillsDir, { withFileTypes: true });\n entries = dirents\n .filter((d) => d.isDirectory() || d.isSymbolicLink())\n .map((d) => d.name);\n } catch {\n return [];\n }\n\n const names: string[] = [];\n for (const entry of entries) {\n const skillMdPath = path.join(skillsDir, entry, \"SKILL.md\");\n const content = await readFileSafe(skillMdPath);\n if (content === null) continue;\n // Extract `name: <value>` from YAML frontmatter (between the --- delimiters).\n const match = content.match(/^---[\\s\\S]*?^name:\\s*(.+?)\\s*$/m);\n if (match) {\n names.push(match[1]);\n }\n }\n return names;\n}\n\n/**\n * Runs `npx skills add get-convex/agent-skills --yes` in the given directory.\n * Output mode controls whether the skills CLI output is streamed live.\n * Returns true on success, false if the process fails or cannot be started.\n */\nfunction runSkillsAdd(\n cwd: string,\n outputMode: \"verbose\" | \"quiet\" = \"verbose\",\n): Promise<boolean> {\n return runSkillsCommand(\n cwd,\n [\"add\", \"get-convex/agent-skills\", \"--yes\"],\n outputMode,\n );\n}\n\n/**\n * Runs `npx skills remove <name...> --yes` to surgically remove only the\n * Convex-managed skills, leaving any skills from other sources intact.\n */\nfunction runSkillsRemove(cwd: string, skillNames: string[]): Promise<boolean> {\n return runSkillsCommand(cwd, [\"remove\", ...skillNames, \"--yes\"]);\n}\n\nasync function shouldRunSkillsCli(): Promise<boolean> {\n const versionData = await getVersion();\n if (versionData === null || versionData === undefined) {\n logMessage(chalkStderr.yellow(`Agent skills are temporarily disabled.`));\n return false;\n }\n if (versionData.disableSkillsCli) {\n logMessage(chalkStderr.yellow(`Agent skills are temporarily disabled.`));\n return false;\n }\n return true;\n}\n\nfunction runSkillsCommand(\n cwd: string,\n args: string[],\n outputMode: \"verbose\" | \"quiet\" = \"verbose\",\n): Promise<boolean> {\n return new Promise((resolve) => {\n const quiet = outputMode === \"quiet\";\n const proc = child_process.spawn(\"npx\", [\"skills@latest\", ...args], {\n cwd,\n stdio: quiet ? \"pipe\" : \"inherit\",\n // shell: true is required on Windows to resolve `npx` from PATH.\n shell: process.platform === \"win32\",\n });\n let capturedOutput = \"\";\n if (quiet) {\n proc.stdout?.on(\"data\", (chunk) => {\n capturedOutput += chunk.toString();\n });\n proc.stderr?.on(\"data\", (chunk) => {\n capturedOutput += chunk.toString();\n });\n }\n proc.on(\"close\", (code) => {\n if (quiet && code !== 0 && capturedOutput.trim().length > 0) {\n const lines = capturedOutput.trim().split(/\\r?\\n/);\n const tail = lines.slice(-10).join(\"\\n\");\n logMessage(chalkStderr.gray(`skills output (tail):\\n${tail}`));\n }\n resolve(code === 0);\n });\n proc.on(\"error\", () => resolve(false));\n });\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/cli/lib/ai/paths.ts"],
4
- "sourcesContent": ["import path from \"path\";\n\nconst AI_FILES_PARENT_DIR = \"_generated\";\nconst AI_FILES_DIR = \"ai\";\n\nexport function aiDirForConvexDir(convexDir: string): string {\n return path.join(convexDir, AI_FILES_PARENT_DIR, AI_FILES_DIR);\n}\n\nexport function guidelinesPathForConvexDir(convexDir: string): string {\n return path.join(aiDirForConvexDir(convexDir), \"guidelines.md\");\n}\n\nexport function aiFilesStatePathForConvexDir(convexDir: string): string {\n return path.join(aiDirForConvexDir(convexDir), \"ai-files.state.json\");\n}\n\nexport function agentsMdPath(projectDir?: string): string {\n return path.join(projectDir ?? process.cwd(), \"AGENTS.md\");\n}\n\nexport function claudeMdPath(projectDir?: string): string {\n return path.join(projectDir ?? process.cwd(), \"CLAUDE.md\");\n}\n"],
5
- "mappings": ";AAAA,OAAO,UAAU;AAEjB,MAAM,sBAAsB;AAC5B,MAAM,eAAe;AAEd,gBAAS,kBAAkB,WAA2B;AAC3D,SAAO,KAAK,KAAK,WAAW,qBAAqB,YAAY;AAC/D;AAEO,gBAAS,2BAA2B,WAA2B;AACpE,SAAO,KAAK,KAAK,kBAAkB,SAAS,GAAG,eAAe;AAChE;AAEO,gBAAS,6BAA6B,WAA2B;AACtE,SAAO,KAAK,KAAK,kBAAkB,SAAS,GAAG,qBAAqB;AACtE;AAEO,gBAAS,aAAa,YAA6B;AACxD,SAAO,KAAK,KAAK,cAAc,QAAQ,IAAI,GAAG,WAAW;AAC3D;AAEO,gBAAS,aAAa,YAA6B;AACxD,SAAO,KAAK,KAAK,cAAc,QAAQ,IAAI,GAAG,WAAW;AAC3D;",
6
- "names": []
7
- }
@@ -1,50 +0,0 @@
1
- import { z } from "zod";
2
- declare const aiFilesStateSchema: z.ZodObject<{
3
- guidelinesHash: z.ZodNullable<z.ZodString>;
4
- agentsMdSectionHash: z.ZodNullable<z.ZodString>;
5
- claudeMdHash: z.ZodNullable<z.ZodString>;
6
- agentSkillsSha: z.ZodNullable<z.ZodString>;
7
- installedSkillNames: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
8
- }, "strip", z.ZodTypeAny, {
9
- guidelinesHash: string | null;
10
- agentsMdSectionHash: string | null;
11
- claudeMdHash: string | null;
12
- agentSkillsSha: string | null;
13
- installedSkillNames: string[];
14
- }, {
15
- guidelinesHash: string | null;
16
- agentsMdSectionHash: string | null;
17
- claudeMdHash: string | null;
18
- agentSkillsSha: string | null;
19
- installedSkillNames?: string[] | undefined;
20
- }>;
21
- export declare const aiFilesSchema: z.ZodObject<{
22
- guidelinesHash: z.ZodNullable<z.ZodString>;
23
- agentsMdSectionHash: z.ZodNullable<z.ZodString>;
24
- claudeMdHash: z.ZodNullable<z.ZodString>;
25
- agentSkillsSha: z.ZodNullable<z.ZodString>;
26
- installedSkillNames: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
27
- }, "strip", z.ZodTypeAny, {
28
- guidelinesHash: string | null;
29
- agentsMdSectionHash: string | null;
30
- claudeMdHash: string | null;
31
- agentSkillsSha: string | null;
32
- installedSkillNames: string[];
33
- }, {
34
- guidelinesHash: string | null;
35
- agentsMdSectionHash: string | null;
36
- claudeMdHash: string | null;
37
- agentSkillsSha: string | null;
38
- installedSkillNames?: string[] | undefined;
39
- }>;
40
- type AiFilesState = z.infer<typeof aiFilesStateSchema>;
41
- export type AiFilesConfig = AiFilesState & {
42
- disableStalenessMessage: boolean;
43
- };
44
- export declare function writeAiDisabledToProjectConfig(disableStalenessMessage: boolean, projectDir: string): Promise<void>;
45
- export declare function readAiConfig(projectDir: string, convexDir: string): Promise<AiFilesConfig | null>;
46
- export declare function writeAiConfig(config: AiFilesConfig, projectDir: string, convexDir: string, options?: {
47
- persistDisabledPreference?: "ifTrue" | "always" | "never";
48
- }): Promise<void>;
49
- export {};
50
- //# sourceMappingURL=config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../src/cli/lib/ai/config.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;EAUtB,CAAC;AAYH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;EAAqB,CAAC;AAEhD,KAAK,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACvD,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG;IACzC,uBAAuB,EAAE,OAAO,CAAC;CAClC,CAAC;AA4BF,wBAAsB,8BAA8B,CAClD,uBAAuB,EAAE,OAAO,EAChC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA0B/B;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,yBAAyB,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAA;CAAE,GACtE,OAAO,CAAC,IAAI,CAAC,CAuBf"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=config.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../../../../src/cli/lib/ai/config.test.ts"],"names":[],"mappings":""}
@@ -1,56 +0,0 @@
1
- import { Context } from "../../../bundler/context.js";
2
- export declare function injectAgentsMdSection(section: string, projectDir?: string): Promise<string | null>;
3
- type InjectClaudeSectionResult = {
4
- sectionHash: string;
5
- didWrite: boolean;
6
- };
7
- export declare function injectClaudeMdSection(section: string, projectDir?: string): Promise<InjectClaudeSectionResult>;
8
- /**
9
- * Write/update all Convex AI files (guidelines, AGENTS.md, CLAUDE.md, skills).
10
- *
11
- * @param convexDir - absolute path to the project's convex functions directory
12
- * (e.g. `/home/user/myapp/convex`). Used to build the `_generated/ai/` subdirectory.
13
- */
14
- export declare function writeAiFiles(convexDir: string, installSkills?: boolean, skillsOutputMode?: "verbose" | "quiet", projectDirOverride?: string): Promise<void>;
15
- /**
16
- * Check whether the Convex AI files are out of date and log a nag message
17
- * if so.
18
- */
19
- export declare function checkAiFilesStaleness(canonicalGuidelinesHash: string | null, canonicalAgentSkillsSha: string | null, projectDir: string, convexDir: string): Promise<void>;
20
- /**
21
- * Update all Convex AI files to their latest versions.
22
- *
23
- * Files the user has modified (detected via hash comparison) are skipped
24
- * with a warning rather than silently overwritten.
25
- *
26
- * @param projectDir - absolute path to the project root directory.
27
- * @param convexDir - absolute path to the Convex functions directory.
28
- */
29
- export declare function updateAiFiles(projectDir: string, convexDir: string): Promise<void>;
30
- export declare function enableAiFiles(projectDir: string, convexDir: string): Promise<void>;
31
- /**
32
- * Remove all Convex AI files from the project.
33
- * Called by `npx convex ai-files remove`.
34
- *
35
- * - Strips the Convex section from AGENTS.md (deletes file if empty)
36
- * - Strips the Convex section from CLAUDE.md (deletes file if empty)
37
- * - Runs `npx skills remove <name...> --yes` for each tracked skill
38
- * - Deletes the `convex/_generated/ai/` directory
39
- */
40
- export declare function removeAiFiles(projectDir: string, convexDir: string): Promise<void>;
41
- /**
42
- * Called by `npx convex ai-files disable`.
43
- *
44
- * Writes a suppression flag into `convex.json` (`aiFiles.disableStalenessMessage`) so
45
- * `npx convex dev` stops showing AI files install/staleness messages.
46
- * Files are left in place - use `remove` to delete them.
47
- * The user can re-enable at any time with `npx convex ai-files enable`.
48
- */
49
- export declare function disableAiFiles(projectDir: string): Promise<void>;
50
- /**
51
- * Print the current status of Convex AI files to the terminal.
52
- */
53
- export declare function statusAiFiles(projectDir: string, convexDir: string): Promise<void>;
54
- export declare function maybeSetupAiFiles(ctx: Context, convexDir: string, projectDir: string): Promise<void>;
55
- export {};
56
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/cli/lib/ai/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AA6CtD,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA6BxB;AAED,KAAK,yBAAyB,GAAG;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,yBAAyB,CAAC,CAmCpC;AAMD;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,aAAa,GAAE,OAAe,EAC9B,gBAAgB,GAAE,SAAS,GAAG,OAAmB,EACjD,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC,CA8Ff;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,uBAAuB,EAAE,MAAM,GAAG,IAAI,EACtC,uBAAuB,EAAE,MAAM,GAAG,IAAI,EACtC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAsIf;AAED,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAUf;AAuED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAyFf;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CActE;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAyJf;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,OAAO,EACZ,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAkBf"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../../../src/cli/lib/ai/index.test.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"integration.test.d.ts","sourceRoot":"","sources":["../../../../../src/cli/lib/ai/integration.test.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../../../src/cli/lib/ai/paths.ts"],"names":[],"mappings":"AAKA,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAExD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt.test.d.ts","sourceRoot":"","sources":["../../../../../src/cli/lib/ai/prompt.test.ts"],"names":[],"mappings":""}
@@ -1,338 +0,0 @@
1
- import { describe, test, expect, vi, beforeEach, afterEach } from "vitest";
2
- import * as Sentry from "@sentry/node";
3
- import { promises as fs } from "fs";
4
- import {
5
- aiFilesSchema,
6
- readAiConfig,
7
- writeAiConfig,
8
- writeAiDisabledToProjectConfig,
9
- } from "./config.js";
10
-
11
- vi.mock("@sentry/node", () => ({
12
- captureException: vi.fn(),
13
- captureMessage: vi.fn(),
14
- }));
15
-
16
- vi.mock("fs", () => ({
17
- promises: {
18
- readFile: vi.fn(),
19
- writeFile: vi.fn(),
20
- },
21
- }));
22
-
23
- const mockFs = vi.mocked(fs);
24
- const mockCaptureException = vi.mocked(Sentry.captureException);
25
-
26
- const dummyProjectDir = "/tmp/test-project";
27
- const dummyConvexDir = "/tmp/test-project/convex";
28
-
29
- describe("aiFilesSchema", () => {
30
- test("accepts a fully populated valid state object", () => {
31
- const result = aiFilesSchema.safeParse({
32
- guidelinesHash: "abc123",
33
- agentsMdSectionHash: "def456",
34
- claudeMdHash: "ghi789",
35
- agentSkillsSha: "deadbeef",
36
- installedSkillNames: ["convex-migrations", "convex-perf-review"],
37
- });
38
- expect(result.success).toBe(true);
39
- });
40
-
41
- test("accepts null hashes", () => {
42
- const result = aiFilesSchema.safeParse({
43
- guidelinesHash: null,
44
- agentsMdSectionHash: null,
45
- claudeMdHash: null,
46
- agentSkillsSha: null,
47
- });
48
- expect(result.success).toBe(true);
49
- });
50
-
51
- test("applies default for installedSkillNames when absent", () => {
52
- const result = aiFilesSchema.safeParse({
53
- guidelinesHash: "abc",
54
- agentsMdSectionHash: null,
55
- claudeMdHash: null,
56
- agentSkillsSha: null,
57
- });
58
- expect(result.success).toBe(true);
59
- if (result.success) {
60
- expect(result.data.installedSkillNames).toEqual([]);
61
- }
62
- });
63
-
64
- test("rejects a number where a string hash is expected", () => {
65
- const result = aiFilesSchema.safeParse({
66
- guidelinesHash: 123,
67
- agentsMdSectionHash: null,
68
- claudeMdHash: null,
69
- agentSkillsSha: null,
70
- });
71
- expect(result.success).toBe(false);
72
- });
73
-
74
- test("rejects missing required fields", () => {
75
- const result = aiFilesSchema.safeParse({
76
- guidelinesHash: "abc",
77
- });
78
- expect(result.success).toBe(false);
79
- });
80
- });
81
-
82
- describe("readAiConfig", () => {
83
- beforeEach(() => vi.clearAllMocks());
84
- afterEach(() => vi.resetAllMocks());
85
-
86
- test("returns null when the file does not exist", async () => {
87
- mockFs.readFile.mockRejectedValue(
88
- Object.assign(new Error("ENOENT"), { code: "ENOENT" }),
89
- );
90
-
91
- const result = await readAiConfig(dummyProjectDir, dummyConvexDir);
92
-
93
- expect(result).toBeNull();
94
- expect(mockCaptureException).not.toHaveBeenCalled();
95
- });
96
-
97
- test("returns parsed state with disableStalenessMessage=false when convex.json is missing", async () => {
98
- mockFs.readFile
99
- .mockRejectedValueOnce(
100
- Object.assign(new Error("ENOENT"), { code: "ENOENT" }),
101
- )
102
- .mockResolvedValueOnce(
103
- JSON.stringify({
104
- guidelinesHash: "abc",
105
- agentsMdSectionHash: "def",
106
- claudeMdHash: null,
107
- agentSkillsSha: null,
108
- }),
109
- );
110
-
111
- const result = await readAiConfig(dummyProjectDir, dummyConvexDir);
112
-
113
- expect(result).toEqual({
114
- guidelinesHash: "abc",
115
- agentsMdSectionHash: "def",
116
- claudeMdHash: null,
117
- agentSkillsSha: null,
118
- installedSkillNames: [],
119
- disableStalenessMessage: false,
120
- });
121
- });
122
-
123
- test("returns empty disabled config when state file is missing and convex.json disables nags", async () => {
124
- mockFs.readFile
125
- .mockResolvedValueOnce(
126
- JSON.stringify({ aiFiles: { disableStalenessMessage: true } }),
127
- )
128
- .mockRejectedValueOnce(
129
- Object.assign(new Error("ENOENT"), { code: "ENOENT" }),
130
- );
131
-
132
- const result = await readAiConfig(dummyProjectDir, dummyConvexDir);
133
-
134
- expect(result).toEqual({
135
- guidelinesHash: null,
136
- agentsMdSectionHash: null,
137
- claudeMdHash: null,
138
- agentSkillsSha: null,
139
- installedSkillNames: [],
140
- disableStalenessMessage: true,
141
- });
142
- });
143
-
144
- test("returns null and captures exception when JSON is invalid", async () => {
145
- mockFs.readFile
146
- .mockResolvedValueOnce(
147
- JSON.stringify({ aiFiles: { disableStalenessMessage: false } }),
148
- )
149
- .mockResolvedValueOnce("not valid json {{{}");
150
-
151
- const result = await readAiConfig(dummyProjectDir, dummyConvexDir);
152
-
153
- expect(result).toBeNull();
154
- expect(mockCaptureException).toHaveBeenCalledWith(expect.any(Error));
155
- });
156
-
157
- test("returns null and captures exception when schema validation fails", async () => {
158
- mockFs.readFile
159
- .mockResolvedValueOnce(
160
- JSON.stringify({ aiFiles: { disableStalenessMessage: false } }),
161
- )
162
- .mockResolvedValueOnce(
163
- JSON.stringify({
164
- guidelinesHash: 99,
165
- agentsMdSectionHash: null,
166
- }),
167
- );
168
-
169
- const result = await readAiConfig(dummyProjectDir, dummyConvexDir);
170
-
171
- expect(result).toBeNull();
172
- expect(mockCaptureException).toHaveBeenCalledWith(expect.any(Error));
173
- });
174
-
175
- test("returns parsed state and reads disableStalenessMessage from convex.json", async () => {
176
- const stored = {
177
- guidelinesHash: "abc",
178
- agentsMdSectionHash: "def",
179
- claudeMdHash: null,
180
- agentSkillsSha: "deadbeef",
181
- };
182
- mockFs.readFile
183
- .mockResolvedValueOnce(
184
- JSON.stringify({ aiFiles: { disableStalenessMessage: true } }),
185
- )
186
- .mockResolvedValueOnce(JSON.stringify(stored));
187
-
188
- const result = await readAiConfig(dummyProjectDir, dummyConvexDir);
189
-
190
- expect(result).toEqual({
191
- ...stored,
192
- installedSkillNames: [],
193
- disableStalenessMessage: true,
194
- });
195
- });
196
- });
197
-
198
- describe("writeAiConfig", () => {
199
- beforeEach(() => vi.clearAllMocks());
200
- afterEach(() => vi.resetAllMocks());
201
-
202
- test("writes state file and does not persist disableStalenessMessage=false by default", async () => {
203
- mockFs.writeFile.mockResolvedValue(undefined);
204
-
205
- const config = {
206
- disableStalenessMessage: false,
207
- guidelinesHash: "abc",
208
- agentsMdSectionHash: "def",
209
- claudeMdHash: null,
210
- agentSkillsSha: null,
211
- installedSkillNames: ["convex-migrations"],
212
- };
213
-
214
- await writeAiConfig(config, dummyProjectDir, dummyConvexDir);
215
-
216
- expect(mockFs.writeFile).toHaveBeenCalledTimes(1);
217
- expect(mockFs.writeFile).toHaveBeenCalledWith(
218
- expect.stringContaining("ai-files.state.json"),
219
- JSON.stringify(
220
- {
221
- guidelinesHash: "abc",
222
- agentsMdSectionHash: "def",
223
- claudeMdHash: null,
224
- agentSkillsSha: null,
225
- installedSkillNames: ["convex-migrations"],
226
- },
227
- null,
228
- 2,
229
- ) + "\n",
230
- "utf8",
231
- );
232
- });
233
-
234
- test("persists disableStalenessMessage=false when requested explicitly", async () => {
235
- mockFs.writeFile.mockResolvedValue(undefined);
236
- mockFs.readFile.mockResolvedValue("{}");
237
-
238
- await writeAiConfig(
239
- {
240
- disableStalenessMessage: false,
241
- guidelinesHash: null,
242
- agentsMdSectionHash: null,
243
- claudeMdHash: null,
244
- agentSkillsSha: null,
245
- installedSkillNames: [],
246
- },
247
- dummyProjectDir,
248
- dummyConvexDir,
249
- { persistDisabledPreference: "always" },
250
- );
251
-
252
- expect(mockFs.writeFile).toHaveBeenNthCalledWith(
253
- 2,
254
- expect.stringContaining("convex.json"),
255
- JSON.stringify(
256
- {
257
- $schema: "node_modules/convex/schemas/convex.schema.json",
258
- aiFiles: {
259
- disableStalenessMessage: false,
260
- },
261
- },
262
- null,
263
- 2,
264
- ) + "\n",
265
- "utf8",
266
- );
267
- });
268
-
269
- test("persists to convex.json by default when disableStalenessMessage is true", async () => {
270
- mockFs.writeFile.mockResolvedValue(undefined);
271
- mockFs.readFile.mockResolvedValue("{}");
272
-
273
- await writeAiConfig(
274
- {
275
- disableStalenessMessage: true,
276
- guidelinesHash: null,
277
- agentsMdSectionHash: null,
278
- claudeMdHash: null,
279
- agentSkillsSha: null,
280
- installedSkillNames: [],
281
- },
282
- dummyProjectDir,
283
- dummyConvexDir,
284
- );
285
-
286
- expect(mockFs.writeFile).toHaveBeenCalledTimes(2);
287
- expect(mockFs.writeFile).toHaveBeenNthCalledWith(
288
- 2,
289
- expect.stringContaining("convex.json"),
290
- expect.stringContaining('"disableStalenessMessage": true'),
291
- "utf8",
292
- );
293
- });
294
-
295
- test("never writes to convex.json when persistDisabledPreference is 'never'", async () => {
296
- mockFs.writeFile.mockResolvedValue(undefined);
297
-
298
- await writeAiConfig(
299
- {
300
- disableStalenessMessage: true,
301
- guidelinesHash: null,
302
- agentsMdSectionHash: null,
303
- claudeMdHash: null,
304
- agentSkillsSha: null,
305
- installedSkillNames: [],
306
- },
307
- dummyProjectDir,
308
- dummyConvexDir,
309
- { persistDisabledPreference: "never" },
310
- );
311
-
312
- expect(mockFs.writeFile).toHaveBeenCalledTimes(1);
313
- expect(mockFs.writeFile).toHaveBeenCalledWith(
314
- expect.stringContaining("ai-files.state.json"),
315
- expect.any(String),
316
- "utf8",
317
- );
318
- });
319
- });
320
-
321
- describe("writeAiDisabledToProjectConfig", () => {
322
- beforeEach(() => vi.clearAllMocks());
323
- afterEach(() => vi.resetAllMocks());
324
-
325
- test("writes only convex.json with disableStalenessMessage=true", async () => {
326
- mockFs.readFile.mockResolvedValue("{}");
327
- mockFs.writeFile.mockResolvedValue(undefined);
328
-
329
- await writeAiDisabledToProjectConfig(true, dummyProjectDir);
330
-
331
- expect(mockFs.writeFile).toHaveBeenCalledTimes(1);
332
- expect(mockFs.writeFile).toHaveBeenCalledWith(
333
- expect.stringContaining("convex.json"),
334
- expect.stringContaining('"disableStalenessMessage": true'),
335
- "utf8",
336
- );
337
- });
338
- });