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
package/src/cli/dev.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Command, Option } from "@commander-js/extra-typings";
|
|
2
|
+
import { chalkStderr } from "chalk";
|
|
2
3
|
import { oneoffContext } from "../bundler/context.js";
|
|
3
4
|
import { logVerbose } from "../bundler/log.js";
|
|
4
5
|
import { deploymentCredentialsOrConfigure } from "./configure.js";
|
|
@@ -9,8 +10,11 @@ import {
|
|
|
9
10
|
CONVEX_DEPLOYMENT_ENV_VAR_NAME,
|
|
10
11
|
CONVEX_SELF_HOSTED_URL_VAR_NAME,
|
|
11
12
|
} from "./lib/utils/utils.js";
|
|
12
|
-
import {
|
|
13
|
-
|
|
13
|
+
import {
|
|
14
|
+
getDeploymentSelection,
|
|
15
|
+
type DeploymentSelection,
|
|
16
|
+
} from "./lib/deploymentSelection.js";
|
|
17
|
+
import { checkVersionAndAiFilesStaleness } from "./lib/updates.js";
|
|
14
18
|
|
|
15
19
|
export const dev = new Command("dev")
|
|
16
20
|
.summary("Develop against a dev deployment, watching for changes")
|
|
@@ -18,7 +22,7 @@ export const dev = new Command("dev")
|
|
|
18
22
|
"Develop against a dev deployment, watching for changes\n\n" +
|
|
19
23
|
" 1. Configures a new or existing project (if needed)\n" +
|
|
20
24
|
" 2. Updates generated types and pushes code to the configured dev deployment\n" +
|
|
21
|
-
" 3. Runs the provided command (if `--
|
|
25
|
+
" 3. Runs the provided command (if `--start` or `--run` is used)\n" +
|
|
22
26
|
" 4. Watches for file changes, and repeats step 2\n",
|
|
23
27
|
)
|
|
24
28
|
.allowExcessArguments(false)
|
|
@@ -59,25 +63,31 @@ export const dev = new Command("dev")
|
|
|
59
63
|
"Execute only the first 3 steps, on failure watch for local and remote changes and retry steps 2 and 3",
|
|
60
64
|
false,
|
|
61
65
|
)
|
|
66
|
+
.addOption(
|
|
67
|
+
new Option(
|
|
68
|
+
"--start <command>",
|
|
69
|
+
"Start a long-running command alongside `convex dev`, like a frontend " +
|
|
70
|
+
"dev server. The command inherits stdin/stdout so you can interact " +
|
|
71
|
+
"with it directly. Example: npx convex dev --start 'vite --open'",
|
|
72
|
+
).conflicts(["--run", "--run-sh"]),
|
|
73
|
+
)
|
|
74
|
+
.addOption(
|
|
75
|
+
new Option("--run-sh <command>", "Deprecated: use --start instead.")
|
|
76
|
+
.conflicts(["--start", "--run"])
|
|
77
|
+
.hideHelp(),
|
|
78
|
+
)
|
|
62
79
|
.addOption(
|
|
63
80
|
new Option(
|
|
64
81
|
"--run <functionName>",
|
|
65
82
|
"The identifier of the function to run in step 3, " +
|
|
66
83
|
"like `api.init.createData` or `myDir/myFile:myFunction`",
|
|
67
|
-
).conflicts(["--
|
|
84
|
+
).conflicts(["--start"]),
|
|
68
85
|
)
|
|
69
86
|
.option(
|
|
70
87
|
"--run-component <functionName>",
|
|
71
88
|
"If --run is used and the function is in a component, the path the component tree defined in convex.config.ts. " +
|
|
72
89
|
"Components are a beta feature. This flag is unstable and may change in subsequent releases.",
|
|
73
90
|
)
|
|
74
|
-
.addOption(
|
|
75
|
-
new Option(
|
|
76
|
-
"--run-sh <command>",
|
|
77
|
-
"A shell command to run in step 3, like `node myScript.js`. " +
|
|
78
|
-
"If you just want to run a Convex function, use `--run` instead.",
|
|
79
|
-
).conflicts(["--run"]),
|
|
80
|
-
)
|
|
81
91
|
.addOption(
|
|
82
92
|
new Option(
|
|
83
93
|
"--tail-logs [mode]",
|
|
@@ -96,7 +106,7 @@ export const dev = new Command("dev")
|
|
|
96
106
|
"Ignore existing configuration and configure new or existing project, interactively or set by --team <team_slug>, --project <project_slug>, and --dev-deployment local|cloud",
|
|
97
107
|
)
|
|
98
108
|
.choices(["new", "existing"] as const)
|
|
99
|
-
.conflicts(["--local", "--cloud"]),
|
|
109
|
+
.conflicts(["--local", "--cloud", "--url", "--admin-key", "--env-file"]),
|
|
100
110
|
)
|
|
101
111
|
.addOption(
|
|
102
112
|
new Option(
|
|
@@ -147,6 +157,7 @@ Same format as .env.local or .env files, and overrides them.`,
|
|
|
147
157
|
.addOption(new Option("--local-site-port <port>").hideHelp())
|
|
148
158
|
.addOption(new Option("--local-backend-version <version>").hideHelp())
|
|
149
159
|
.addOption(new Option("--local-force-upgrade").default(false).hideHelp())
|
|
160
|
+
.addOption(new Option("--deployment <deployment>").hideHelp())
|
|
150
161
|
.addOption(
|
|
151
162
|
new Option(
|
|
152
163
|
"--local",
|
|
@@ -173,6 +184,20 @@ Same format as .env.local or .env files, and overrides them.`,
|
|
|
173
184
|
await ctx.flushAndExit(-2);
|
|
174
185
|
});
|
|
175
186
|
|
|
187
|
+
if (cmdOptions.deployment !== undefined) {
|
|
188
|
+
return await ctx.crash({
|
|
189
|
+
exitCode: 1,
|
|
190
|
+
errorType: "fatal",
|
|
191
|
+
printedMessage:
|
|
192
|
+
"`--deployment` can’t be used with `npx convex dev`. \n\n" +
|
|
193
|
+
" To select this deployment for development, run: \n" +
|
|
194
|
+
chalkStderr.bold(
|
|
195
|
+
` npx convex deployment select ${cmdOptions.deployment}\n`,
|
|
196
|
+
) +
|
|
197
|
+
" Then, run `npx convex dev` again.",
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
|
|
176
201
|
const devOptions = await normalizeDevOptions(ctx, cmdOptions);
|
|
177
202
|
|
|
178
203
|
if (cmdOptions.configure === undefined) {
|
|
@@ -225,7 +250,17 @@ Same format as .env.local or .env files, and overrides them.`,
|
|
|
225
250
|
|
|
226
251
|
const configure =
|
|
227
252
|
cmdOptions.configure === true ? "ask" : (cmdOptions.configure ?? null);
|
|
228
|
-
|
|
253
|
+
// --configure means "pick a project" — skip deployment selection entirely
|
|
254
|
+
const deploymentSelection =
|
|
255
|
+
configure !== null
|
|
256
|
+
? ({
|
|
257
|
+
kind: "chooseProject",
|
|
258
|
+
selectionWithinProject: {
|
|
259
|
+
// For backwards compatibility, allow `--configure --prod`
|
|
260
|
+
kind: cmdOptions.prod ? "prod" : "unspecified",
|
|
261
|
+
},
|
|
262
|
+
} satisfies DeploymentSelection)
|
|
263
|
+
: await getDeploymentSelection(ctx, cmdOptions);
|
|
229
264
|
const credentials = await deploymentCredentialsOrConfigure(
|
|
230
265
|
ctx,
|
|
231
266
|
deploymentSelection,
|
|
@@ -260,7 +295,7 @@ Same format as .env.local or .env files, and overrides them.`,
|
|
|
260
295
|
...(credentials.deploymentFields !== null
|
|
261
296
|
? [
|
|
262
297
|
usageStateWarning(ctx, credentials.deploymentFields.deploymentName),
|
|
263
|
-
|
|
298
|
+
checkVersionAndAiFilesStaleness(ctx),
|
|
264
299
|
]
|
|
265
300
|
: []),
|
|
266
301
|
]);
|
package/src/cli/docs.ts
CHANGED
|
@@ -38,7 +38,7 @@ export const docs = new Command("docs")
|
|
|
38
38
|
`get_cookie/${configuredDeployment}`,
|
|
39
39
|
BIG_BRAIN_URL,
|
|
40
40
|
);
|
|
41
|
-
const fetch =
|
|
41
|
+
const fetch = bigBrainFetch(ctx);
|
|
42
42
|
try {
|
|
43
43
|
const res = await fetch(getCookieUrl);
|
|
44
44
|
deprecationCheckWarning(ctx, res);
|
package/src/cli/init.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { oneoffContext } from "../bundler/context.js";
|
|
|
3
3
|
import { logVerbose } from "../bundler/log.js";
|
|
4
4
|
import { deploymentCredentialsOrConfigure } from "./configure.js";
|
|
5
5
|
import { getDeploymentSelection } from "./lib/deploymentSelection.js";
|
|
6
|
-
import {
|
|
6
|
+
import { checkVersionAndAiFilesStaleness } from "./lib/updates.js";
|
|
7
7
|
import { usageStateWarning } from "./lib/usage.js";
|
|
8
8
|
|
|
9
9
|
// Equivalent to `npx convex dev --once --skip-push`.
|
|
@@ -37,7 +37,7 @@ export const init = new Command("init")
|
|
|
37
37
|
if (credentials.deploymentFields !== null) {
|
|
38
38
|
await Promise.all([
|
|
39
39
|
usageStateWarning(ctx, credentials.deploymentFields.deploymentName),
|
|
40
|
-
|
|
40
|
+
checkVersionAndAiFilesStaleness(ctx),
|
|
41
41
|
]);
|
|
42
42
|
}
|
|
43
43
|
|
|
@@ -27,8 +27,12 @@ After `npx convex ai-files install` (or `update`) verify:
|
|
|
27
27
|
- `.cursor/skills/` (Cursor symlinks)
|
|
28
28
|
- `.claude/skills/` (Claude Code symlinks)
|
|
29
29
|
|
|
30
|
-
Expected skill set
|
|
31
|
-
`convex-
|
|
30
|
+
Expected skill set (as of Mar 2026): `convex-create-component`,
|
|
31
|
+
`convex-migration-helper`, `convex-performance-audit`, `convex-quickstart`,
|
|
32
|
+
`convex-setup-auth`.
|
|
33
|
+
|
|
34
|
+
Note: the live skill set is fetched remotely and may change. Check the current
|
|
35
|
+
list against what `npx convex ai-files status` reports after install.
|
|
32
36
|
|
|
33
37
|
**Why manual:** these paths and symlink behaviors are environment-dependent and
|
|
34
38
|
are mocked in automated tests.
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { describe, test, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import os from "os";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import { injectAgentsMdSection, hasAgentsMdInstalled } from "./agentsmd.js";
|
|
6
|
+
import {
|
|
7
|
+
AGENTS_MD_START_MARKER,
|
|
8
|
+
AGENTS_MD_END_MARKER,
|
|
9
|
+
} from "../../codegen_templates/agentsmd.js";
|
|
10
|
+
|
|
11
|
+
describe("injectAgentsMdSection", () => {
|
|
12
|
+
let tmpDir: string;
|
|
13
|
+
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const section = `${AGENTS_MD_START_MARKER}\n## Convex\nRead guidelines.\n${AGENTS_MD_END_MARKER}`;
|
|
23
|
+
|
|
24
|
+
test("creates AGENTS.md when it does not exist", async () => {
|
|
25
|
+
await injectAgentsMdSection({ section, projectDir: tmpDir });
|
|
26
|
+
|
|
27
|
+
const content = fs.readFileSync(path.join(tmpDir, "AGENTS.md"), "utf8");
|
|
28
|
+
expect(content).toContain(AGENTS_MD_START_MARKER);
|
|
29
|
+
expect(content).toContain(AGENTS_MD_END_MARKER);
|
|
30
|
+
expect(content).toContain("## Convex");
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test("appends to an existing AGENTS.md that has no Convex section", async () => {
|
|
34
|
+
const existing = "# My project\n\nSome existing content.\n";
|
|
35
|
+
fs.writeFileSync(path.join(tmpDir, "AGENTS.md"), existing);
|
|
36
|
+
|
|
37
|
+
await injectAgentsMdSection({ section, projectDir: tmpDir });
|
|
38
|
+
|
|
39
|
+
const content = fs.readFileSync(path.join(tmpDir, "AGENTS.md"), "utf8");
|
|
40
|
+
expect(content).toContain("# My project");
|
|
41
|
+
expect(content).toContain("Some existing content.");
|
|
42
|
+
expect(content).toContain(AGENTS_MD_START_MARKER);
|
|
43
|
+
expect(content).toContain("## Convex");
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test("replaces an existing Convex section when markers are present", async () => {
|
|
47
|
+
const oldSection = `${AGENTS_MD_START_MARKER}\n## Convex\nOld content.\n${AGENTS_MD_END_MARKER}`;
|
|
48
|
+
const existing = `# My project\n\n${oldSection}\n`;
|
|
49
|
+
fs.writeFileSync(path.join(tmpDir, "AGENTS.md"), existing);
|
|
50
|
+
|
|
51
|
+
const newSection = `${AGENTS_MD_START_MARKER}\n## Convex\nNew content.\n${AGENTS_MD_END_MARKER}`;
|
|
52
|
+
await injectAgentsMdSection({ section: newSection, projectDir: tmpDir });
|
|
53
|
+
|
|
54
|
+
const content = fs.readFileSync(path.join(tmpDir, "AGENTS.md"), "utf8");
|
|
55
|
+
expect(content).toContain("New content.");
|
|
56
|
+
expect(content).not.toContain("Old content.");
|
|
57
|
+
expect(content.split(AGENTS_MD_START_MARKER).length - 1).toBe(1);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test("preserves content before and after an existing Convex section", async () => {
|
|
61
|
+
const oldSection = `${AGENTS_MD_START_MARKER}\n## Convex\nOld.\n${AGENTS_MD_END_MARKER}`;
|
|
62
|
+
const existing = `# Before\n\n${oldSection}\n\n# After\n`;
|
|
63
|
+
fs.writeFileSync(path.join(tmpDir, "AGENTS.md"), existing);
|
|
64
|
+
|
|
65
|
+
await injectAgentsMdSection({ section, projectDir: tmpDir });
|
|
66
|
+
|
|
67
|
+
const content = fs.readFileSync(path.join(tmpDir, "AGENTS.md"), "utf8");
|
|
68
|
+
expect(content).toContain("# Before");
|
|
69
|
+
expect(content).toContain("# After");
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test("returns a non-null hash of the written content", async () => {
|
|
73
|
+
const result = await injectAgentsMdSection({ section, projectDir: tmpDir });
|
|
74
|
+
expect(typeof result.sectionHash).toBe("string");
|
|
75
|
+
expect(result.sectionHash.length).toBeGreaterThan(0);
|
|
76
|
+
expect(result.didWrite).toBe(true);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("returns hash of the section content, not the entire file", async () => {
|
|
80
|
+
fs.writeFileSync(
|
|
81
|
+
path.join(tmpDir, "AGENTS.md"),
|
|
82
|
+
"# My project\n\nExisting content.\n",
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
const result = await injectAgentsMdSection({ section, projectDir: tmpDir });
|
|
86
|
+
|
|
87
|
+
const { hashSha256 } = await import("../utils/hash.js");
|
|
88
|
+
expect(result.sectionHash).toBe(hashSha256(section));
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test("does not write when content is unchanged", async () => {
|
|
92
|
+
await injectAgentsMdSection({ section, projectDir: tmpDir });
|
|
93
|
+
const result = await injectAgentsMdSection({ section, projectDir: tmpDir });
|
|
94
|
+
expect(result.didWrite).toBe(false);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
describe("hasAgentsMdInstalled", () => {
|
|
99
|
+
let tmpDir: string;
|
|
100
|
+
|
|
101
|
+
beforeEach(() => {
|
|
102
|
+
tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
afterEach(() => {
|
|
106
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
test("returns false when AGENTS.md does not exist", async () => {
|
|
110
|
+
expect(await hasAgentsMdInstalled(tmpDir)).toBe(false);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test("returns false when AGENTS.md exists but has no managed markers", async () => {
|
|
114
|
+
fs.writeFileSync(path.join(tmpDir, "AGENTS.md"), "User content only\n");
|
|
115
|
+
expect(await hasAgentsMdInstalled(tmpDir)).toBe(false);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test("returns false when only the start marker is present", async () => {
|
|
119
|
+
fs.writeFileSync(
|
|
120
|
+
path.join(tmpDir, "AGENTS.md"),
|
|
121
|
+
`${AGENTS_MD_START_MARKER}\npartial content\n`,
|
|
122
|
+
);
|
|
123
|
+
expect(await hasAgentsMdInstalled(tmpDir)).toBe(false);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
test("returns true when both markers are present", async () => {
|
|
127
|
+
fs.writeFileSync(
|
|
128
|
+
path.join(tmpDir, "AGENTS.md"),
|
|
129
|
+
`# Project\n\n${AGENTS_MD_START_MARKER}\n## Convex\n${AGENTS_MD_END_MARKER}\n`,
|
|
130
|
+
);
|
|
131
|
+
expect(await hasAgentsMdInstalled(tmpDir)).toBe(true);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AGENTS_MD_START_MARKER,
|
|
3
|
+
AGENTS_MD_END_MARKER,
|
|
4
|
+
agentsMdConvexSection,
|
|
5
|
+
} from "../../codegen_templates/agentsmd.js";
|
|
6
|
+
import { agentsMdPath } from "./paths.js";
|
|
7
|
+
import { type AiFilesState } from "./state.js";
|
|
8
|
+
import {
|
|
9
|
+
type ManagedSectionTarget,
|
|
10
|
+
type InjectResult,
|
|
11
|
+
type StripResult,
|
|
12
|
+
injectManagedSection,
|
|
13
|
+
attemptToStripManagedSection,
|
|
14
|
+
hasManagedSection,
|
|
15
|
+
attemptToRemoveMarkdownSection,
|
|
16
|
+
} from "./utils.js";
|
|
17
|
+
import { logMessage } from "../../../bundler/log.js";
|
|
18
|
+
import { chalkStderr } from "chalk";
|
|
19
|
+
|
|
20
|
+
function target(projectDir?: string): ManagedSectionTarget {
|
|
21
|
+
return {
|
|
22
|
+
filePath: agentsMdPath(projectDir),
|
|
23
|
+
startMarker: AGENTS_MD_START_MARKER,
|
|
24
|
+
endMarker: AGENTS_MD_END_MARKER,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export async function injectAgentsMdSection({
|
|
29
|
+
section,
|
|
30
|
+
projectDir,
|
|
31
|
+
}: {
|
|
32
|
+
section: string;
|
|
33
|
+
projectDir?: string;
|
|
34
|
+
}): Promise<InjectResult> {
|
|
35
|
+
return injectManagedSection({ ...target(projectDir), section });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export async function attemptToStripAgentsMdSection(
|
|
39
|
+
projectDir: string,
|
|
40
|
+
): Promise<StripResult> {
|
|
41
|
+
return attemptToStripManagedSection(target(projectDir));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export async function attemptToRemoveAgentsMdSection(
|
|
45
|
+
projectDir: string,
|
|
46
|
+
): Promise<boolean> {
|
|
47
|
+
return attemptToRemoveMarkdownSection({
|
|
48
|
+
projectDir,
|
|
49
|
+
strip: attemptToStripAgentsMdSection,
|
|
50
|
+
fileName: "AGENTS.md",
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export async function hasAgentsMdInstalled(
|
|
55
|
+
projectDir: string,
|
|
56
|
+
): Promise<boolean> {
|
|
57
|
+
return hasManagedSection(target(projectDir));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Inject (or update) the Convex section in AGENTS.md and record the hash.
|
|
62
|
+
* Returns true if the file was actually written.
|
|
63
|
+
*/
|
|
64
|
+
export async function applyAgentsMdSection({
|
|
65
|
+
projectDir,
|
|
66
|
+
state,
|
|
67
|
+
convexDirName,
|
|
68
|
+
}: {
|
|
69
|
+
projectDir: string;
|
|
70
|
+
state: AiFilesState;
|
|
71
|
+
convexDirName: string;
|
|
72
|
+
}): Promise<boolean> {
|
|
73
|
+
const result = await injectAgentsMdSection({
|
|
74
|
+
section: agentsMdConvexSection(convexDirName),
|
|
75
|
+
projectDir,
|
|
76
|
+
});
|
|
77
|
+
if (result.didWrite)
|
|
78
|
+
logMessage(`${chalkStderr.green("✔")} AGENTS.md written`);
|
|
79
|
+
state.agentsMdSectionHash = result.sectionHash;
|
|
80
|
+
return result.didWrite;
|
|
81
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { describe, test, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import os from "os";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import { injectClaudeMdSection, hasClaudeMdInstalled } from "./claudemd.js";
|
|
6
|
+
import {
|
|
7
|
+
CLAUDE_MD_START_MARKER,
|
|
8
|
+
CLAUDE_MD_END_MARKER,
|
|
9
|
+
} from "../../codegen_templates/claudemd.js";
|
|
10
|
+
|
|
11
|
+
describe("injectClaudeMdSection", () => {
|
|
12
|
+
let tmpDir: string;
|
|
13
|
+
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const section = `${CLAUDE_MD_START_MARKER}\n## Convex\nRead guidelines.\n${CLAUDE_MD_END_MARKER}`;
|
|
23
|
+
|
|
24
|
+
test("creates CLAUDE.md when it does not exist", async () => {
|
|
25
|
+
const result = await injectClaudeMdSection({ section, projectDir: tmpDir });
|
|
26
|
+
|
|
27
|
+
const content = fs.readFileSync(path.join(tmpDir, "CLAUDE.md"), "utf8");
|
|
28
|
+
expect(content).toContain(CLAUDE_MD_START_MARKER);
|
|
29
|
+
expect(content).toContain(CLAUDE_MD_END_MARKER);
|
|
30
|
+
expect(result.didWrite).toBe(true);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test("appends managed section to existing CLAUDE.md content", async () => {
|
|
34
|
+
fs.writeFileSync(
|
|
35
|
+
path.join(tmpDir, "CLAUDE.md"),
|
|
36
|
+
"My custom instructions\n",
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
const result = await injectClaudeMdSection({ section, projectDir: tmpDir });
|
|
40
|
+
|
|
41
|
+
const content = fs.readFileSync(path.join(tmpDir, "CLAUDE.md"), "utf8");
|
|
42
|
+
expect(content).toContain("My custom instructions");
|
|
43
|
+
expect(content).toContain(CLAUDE_MD_START_MARKER);
|
|
44
|
+
expect(result.didWrite).toBe(true);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test("replaces managed section without touching user content", async () => {
|
|
48
|
+
const oldSection = `${CLAUDE_MD_START_MARKER}\nOld\n${CLAUDE_MD_END_MARKER}`;
|
|
49
|
+
fs.writeFileSync(
|
|
50
|
+
path.join(tmpDir, "CLAUDE.md"),
|
|
51
|
+
`# Header\n\n${oldSection}\n\n# Footer\n`,
|
|
52
|
+
"utf8",
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
await injectClaudeMdSection({ section, projectDir: tmpDir });
|
|
56
|
+
|
|
57
|
+
const content = fs.readFileSync(path.join(tmpDir, "CLAUDE.md"), "utf8");
|
|
58
|
+
expect(content).toContain("# Header");
|
|
59
|
+
expect(content).toContain("# Footer");
|
|
60
|
+
expect(content).toContain("## Convex");
|
|
61
|
+
expect(content).not.toContain("Old");
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
describe("hasClaudeMdInstalled", () => {
|
|
66
|
+
let tmpDir: string;
|
|
67
|
+
|
|
68
|
+
beforeEach(() => {
|
|
69
|
+
tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
afterEach(() => {
|
|
73
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test("returns false when CLAUDE.md does not exist", async () => {
|
|
77
|
+
expect(await hasClaudeMdInstalled(tmpDir)).toBe(false);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test("returns false when CLAUDE.md exists but has no managed markers", async () => {
|
|
81
|
+
fs.writeFileSync(path.join(tmpDir, "CLAUDE.md"), "User content only\n");
|
|
82
|
+
expect(await hasClaudeMdInstalled(tmpDir)).toBe(false);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test("returns true when both markers are present", async () => {
|
|
86
|
+
fs.writeFileSync(
|
|
87
|
+
path.join(tmpDir, "CLAUDE.md"),
|
|
88
|
+
`${CLAUDE_MD_START_MARKER}\n## Convex\n${CLAUDE_MD_END_MARKER}\n`,
|
|
89
|
+
);
|
|
90
|
+
expect(await hasClaudeMdInstalled(tmpDir)).toBe(true);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CLAUDE_MD_END_MARKER,
|
|
3
|
+
CLAUDE_MD_START_MARKER,
|
|
4
|
+
claudeMdConvexSection,
|
|
5
|
+
} from "../../codegen_templates/claudemd.js";
|
|
6
|
+
import { claudeMdPath } from "./paths.js";
|
|
7
|
+
import { type AiFilesState } from "./state.js";
|
|
8
|
+
import {
|
|
9
|
+
type ManagedSectionTarget,
|
|
10
|
+
type InjectResult,
|
|
11
|
+
type StripResult,
|
|
12
|
+
injectManagedSection,
|
|
13
|
+
attemptToStripManagedSection,
|
|
14
|
+
hasManagedSection,
|
|
15
|
+
attemptToRemoveMarkdownSection,
|
|
16
|
+
} from "./utils.js";
|
|
17
|
+
import { logMessage } from "../../../bundler/log.js";
|
|
18
|
+
import { chalkStderr } from "chalk";
|
|
19
|
+
|
|
20
|
+
function target(projectDir?: string): ManagedSectionTarget {
|
|
21
|
+
return {
|
|
22
|
+
filePath: claudeMdPath(projectDir),
|
|
23
|
+
startMarker: CLAUDE_MD_START_MARKER,
|
|
24
|
+
endMarker: CLAUDE_MD_END_MARKER,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export async function injectClaudeMdSection({
|
|
29
|
+
section,
|
|
30
|
+
projectDir,
|
|
31
|
+
}: {
|
|
32
|
+
section: string;
|
|
33
|
+
projectDir?: string;
|
|
34
|
+
}): Promise<InjectResult> {
|
|
35
|
+
return injectManagedSection({ ...target(projectDir), section });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export async function attemptToStripClaudeMdSection(
|
|
39
|
+
projectDir: string,
|
|
40
|
+
): Promise<StripResult> {
|
|
41
|
+
return attemptToStripManagedSection(target(projectDir));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export async function attemptToRemoveClaudeMdSection(
|
|
45
|
+
projectDir: string,
|
|
46
|
+
): Promise<boolean> {
|
|
47
|
+
return attemptToRemoveMarkdownSection({
|
|
48
|
+
projectDir,
|
|
49
|
+
strip: attemptToStripClaudeMdSection,
|
|
50
|
+
fileName: "CLAUDE.md",
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export async function hasClaudeMdInstalled(
|
|
55
|
+
projectDir: string,
|
|
56
|
+
): Promise<boolean> {
|
|
57
|
+
return hasManagedSection(target(projectDir));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Inject (or update) the Convex section in CLAUDE.md and record the hash.
|
|
62
|
+
* Returns true if the file was actually written.
|
|
63
|
+
*/
|
|
64
|
+
export async function applyClaudeMdSection({
|
|
65
|
+
projectDir,
|
|
66
|
+
state,
|
|
67
|
+
convexDirName,
|
|
68
|
+
}: {
|
|
69
|
+
projectDir: string;
|
|
70
|
+
state: AiFilesState;
|
|
71
|
+
convexDirName: string;
|
|
72
|
+
}): Promise<boolean> {
|
|
73
|
+
const result = await injectClaudeMdSection({
|
|
74
|
+
section: claudeMdConvexSection(convexDirName),
|
|
75
|
+
projectDir,
|
|
76
|
+
});
|
|
77
|
+
if (result.didWrite)
|
|
78
|
+
logMessage(`${chalkStderr.green("✔")} CLAUDE.md written`);
|
|
79
|
+
state.claudeMdHash = result.sectionHash;
|
|
80
|
+
return result.didWrite;
|
|
81
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { chalkStderr } from "chalk";
|
|
3
|
+
import { logMessage } from "../../../bundler/log.js";
|
|
4
|
+
import { safelyDeleteFile } from "./utils.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Remove the legacy `.cursor/rules/convex_rules.mdc` file if it exists.
|
|
8
|
+
* This file was written by the old cursor rules auto-update feature (removed
|
|
9
|
+
* in favour of the AI files system). We clean it up unconditionally
|
|
10
|
+
* during `writeAiFiles`, `convex ai-files update`, and `convex ai-files remove`
|
|
11
|
+
* since it was always auto-managed and is now superseded by
|
|
12
|
+
* `convex/_generated/ai/guidelines.md`.
|
|
13
|
+
*/
|
|
14
|
+
export async function removeLegacyCursorRulesFile(
|
|
15
|
+
projectDir: string,
|
|
16
|
+
): Promise<boolean> {
|
|
17
|
+
const removed = await safelyDeleteFile(
|
|
18
|
+
path.join(projectDir, ".cursor", "rules", "convex_rules.mdc"),
|
|
19
|
+
);
|
|
20
|
+
if (removed)
|
|
21
|
+
logMessage(
|
|
22
|
+
`${chalkStderr.green("✔")} Removed legacy .cursor/rules/convex_rules.mdc (superseded by convex/_generated/ai/guidelines.md).`,
|
|
23
|
+
);
|
|
24
|
+
return removed;
|
|
25
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { describe, test, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import os from "os";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import { hasGuidelinesInstalled } from "./guidelinesmd.js";
|
|
6
|
+
|
|
7
|
+
describe("hasGuidelinesInstalled", () => {
|
|
8
|
+
let tmpDir: string;
|
|
9
|
+
let convexDir: string;
|
|
10
|
+
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
|
|
13
|
+
convexDir = path.join(tmpDir, "convex");
|
|
14
|
+
fs.mkdirSync(path.join(convexDir, "_generated", "ai"), { recursive: true });
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test("returns false when guidelines.md does not exist", async () => {
|
|
22
|
+
expect(await hasGuidelinesInstalled(convexDir)).toBe(false);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test("returns true when guidelines.md exists", async () => {
|
|
26
|
+
fs.writeFileSync(
|
|
27
|
+
path.join(convexDir, "_generated", "ai", "guidelines.md"),
|
|
28
|
+
"some content",
|
|
29
|
+
);
|
|
30
|
+
expect(await hasGuidelinesInstalled(convexDir)).toBe(true);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test("returns false when guidelines.md is empty", async () => {
|
|
34
|
+
fs.writeFileSync(
|
|
35
|
+
path.join(convexDir, "_generated", "ai", "guidelines.md"),
|
|
36
|
+
"",
|
|
37
|
+
);
|
|
38
|
+
expect(await hasGuidelinesInstalled(convexDir)).toBe(false);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test("throws when guidelines.md cannot be read", async () => {
|
|
42
|
+
fs.rmSync(path.join(convexDir, "_generated", "ai", "guidelines.md"), {
|
|
43
|
+
force: true,
|
|
44
|
+
recursive: true,
|
|
45
|
+
});
|
|
46
|
+
fs.mkdirSync(path.join(convexDir, "_generated", "ai", "guidelines.md"));
|
|
47
|
+
|
|
48
|
+
await expect(hasGuidelinesInstalled(convexDir)).rejects.toThrow();
|
|
49
|
+
});
|
|
50
|
+
});
|