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