convex 1.34.1 → 1.35.1
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 +86 -43
- package/dist/browser.bundle.js +1 -1
- package/dist/browser.bundle.js.map +1 -1
- package/dist/cjs/cli/aiFiles.js +31 -13
- package/dist/cjs/cli/aiFiles.js.map +3 -3
- package/dist/cjs/cli/configure.js +21 -24
- package/dist/cjs/cli/configure.js.map +2 -2
- package/dist/cjs/cli/deploy.js +8 -9
- 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 +14 -10
- package/dist/cjs/cli/lib/aiFiles/agentsmd.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/claudemd.js +14 -10
- package/dist/cjs/cli/lib/aiFiles/claudemd.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js +10 -3
- package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/index.js +70 -86
- package/dist/cjs/cli/lib/aiFiles/index.js.map +3 -3
- package/dist/cjs/cli/lib/aiFiles/skills.js +28 -12
- package/dist/cjs/cli/lib/aiFiles/skills.js.map +2 -2
- 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 +31 -28
- package/dist/cjs/cli/lib/aiFiles/status.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/utils.js +31 -14
- package/dist/cjs/cli/lib/aiFiles/utils.js.map +2 -2
- 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 +4 -5
- package/dist/cjs/cli/lib/command.js.map +2 -2
- package/dist/cjs/cli/lib/config.js +41 -4
- 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/envvars.js +8 -1
- package/dist/cjs/cli/lib/envvars.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 +14 -7
- 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 +8 -9
- 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/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/react-clerk/ConvexProviderWithClerk.js.map +1 -1
- 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/cli/aiFiles.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 +5 -5
- package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts +5 -5
- package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -3
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/index.d.ts +20 -18
- package/dist/cjs-types/cli/lib/aiFiles/index.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts +6 -4
- package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
- 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 +4 -1
- package/dist/cjs-types/cli/lib/aiFiles/status.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts +13 -3
- package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts.map +1 -1
- 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 +17 -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/modules.d.ts +12 -12
- package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +25 -16
- 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/envvars.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/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/index.d.ts +1 -1
- package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts +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 +1665 -1215
- package/dist/cli.bundle.cjs.map +4 -4
- package/dist/esm/cli/aiFiles.js +33 -15
- package/dist/esm/cli/aiFiles.js.map +2 -2
- package/dist/esm/cli/configure.js +23 -26
- package/dist/esm/cli/configure.js.map +2 -2
- package/dist/esm/cli/deploy.js +12 -11
- 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 +13 -9
- package/dist/esm/cli/lib/aiFiles/agentsmd.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/claudemd.js +13 -9
- package/dist/esm/cli/lib/aiFiles/claudemd.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/guidelinesmd.js +12 -5
- package/dist/esm/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/index.js +72 -89
- package/dist/esm/cli/lib/aiFiles/index.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/skills.js +29 -13
- package/dist/esm/cli/lib/aiFiles/skills.js.map +2 -2
- 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 +32 -29
- package/dist/esm/cli/lib/aiFiles/status.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/utils.js +25 -10
- package/dist/esm/cli/lib/aiFiles/utils.js.map +2 -2
- 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 +4 -5
- package/dist/esm/cli/lib/command.js.map +2 -2
- package/dist/esm/cli/lib/config.js +39 -3
- 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/envvars.js +8 -1
- package/dist/esm/cli/lib/envvars.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 +11 -9
- 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/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/react-clerk/ConvexProviderWithClerk.js.map +1 -1
- 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/cli/aiFiles.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 +5 -5
- package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts +5 -5
- package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -3
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/index.d.ts +20 -18
- package/dist/esm-types/cli/lib/aiFiles/index.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/skills.d.ts +6 -4
- package/dist/esm-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
- 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 +4 -1
- package/dist/esm-types/cli/lib/aiFiles/status.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/utils.d.ts +13 -3
- package/dist/esm-types/cli/lib/aiFiles/utils.d.ts.map +1 -1
- 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 +17 -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/modules.d.ts +12 -12
- package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +25 -16
- 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/envvars.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/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/index.d.ts +1 -1
- package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts +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 +1 -1
- package/dist/react.bundle.js.map +1 -1
- package/package.json +11 -7
- package/schemas/convex.schema.json +15 -2
- package/src/cli/aiFiles.ts +44 -14
- package/src/cli/configure.test.ts +138 -0
- package/src/cli/configure.ts +48 -47
- package/src/cli/deploy.ts +13 -10
- 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 +343 -35
- 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/aiFiles/agentsmd.ts +15 -11
- package/src/cli/lib/aiFiles/claudemd.ts +15 -11
- package/src/cli/lib/aiFiles/guidelinesmd.test.ts +12 -2
- package/src/cli/lib/aiFiles/guidelinesmd.ts +15 -7
- package/src/cli/lib/aiFiles/index.test.ts +188 -222
- package/src/cli/lib/aiFiles/index.ts +119 -125
- package/src/cli/lib/aiFiles/integration.test.ts +112 -45
- package/src/cli/lib/aiFiles/prompt.test.ts +6 -6
- package/src/cli/lib/aiFiles/skills.ts +46 -16
- 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 +45 -39
- package/src/cli/lib/aiFiles/utils.test.ts +50 -0
- package/src/cli/lib/aiFiles/utils.ts +38 -10
- package/src/cli/lib/api.ts +88 -7
- package/src/cli/lib/command.ts +12 -7
- package/src/cli/lib/config.test.ts +184 -7
- package/src/cli/lib/config.ts +67 -7
- 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/envvars.ts +16 -1
- 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 +102 -75
- package/src/cli/lib/updates.ts +14 -12
- 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/index.ts +1 -1
- package/src/react-clerk/ConvexProviderWithClerk.test.tsx +1 -1
- package/src/react-clerk/ConvexProviderWithClerk.tsx +1 -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/aiFiles/config.js +0 -171
- package/dist/cjs/cli/lib/aiFiles/config.js.map +0 -7
- package/dist/cjs-types/cli/lib/aiFiles/config.d.ts +0 -46
- package/dist/cjs-types/cli/lib/aiFiles/config.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/aiFiles/config.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/aiFiles/config.test.d.ts.map +0 -1
- package/dist/esm/cli/lib/aiFiles/config.js +0 -135
- package/dist/esm/cli/lib/aiFiles/config.js.map +0 -7
- package/dist/esm-types/cli/lib/aiFiles/config.d.ts +0 -46
- package/dist/esm-types/cli/lib/aiFiles/config.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/aiFiles/config.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/aiFiles/config.test.d.ts.map +0 -1
- package/src/cli/lib/aiFiles/config.test.ts +0 -460
- package/src/cli/lib/aiFiles/config.ts +0 -188
- package/src/values/.claude/settings.local.json +0 -10
|
@@ -19,23 +19,25 @@ import {
|
|
|
19
19
|
claudeMdPath,
|
|
20
20
|
guidelinesPathForConvexDir,
|
|
21
21
|
} from "./paths.js";
|
|
22
|
-
import { type
|
|
23
|
-
import {
|
|
22
|
+
import { type AiFilesState, attemptReadAiState } from "./state.js";
|
|
23
|
+
import { type AiFilesProjectConfig } from "../config.js";
|
|
24
|
+
import { isAiFilesDisabled } from "./index.js";
|
|
25
|
+
import { readFileOrNull } from "./utils.js";
|
|
24
26
|
|
|
25
27
|
function logGuidelinesStatus({
|
|
26
28
|
guidelinesFile,
|
|
27
29
|
guidelinesRelPath,
|
|
28
|
-
|
|
30
|
+
state,
|
|
29
31
|
canonicalGuidelinesHash,
|
|
30
32
|
networkAvailable,
|
|
31
33
|
}: {
|
|
32
34
|
guidelinesFile: string | null;
|
|
33
35
|
guidelinesRelPath: string;
|
|
34
|
-
|
|
36
|
+
state: AiFilesState;
|
|
35
37
|
canonicalGuidelinesHash: string | null;
|
|
36
38
|
networkAvailable: boolean;
|
|
37
39
|
}): void {
|
|
38
|
-
if (guidelinesFile === null) {
|
|
40
|
+
if (guidelinesFile === null || guidelinesFile === "") {
|
|
39
41
|
logMessage(
|
|
40
42
|
` ${chalkStderr.yellow("⚠")} ${guidelinesRelPath}: not on disk — run ${chalkStderr.bold("npx convex ai-files install")} to reinstall`,
|
|
41
43
|
);
|
|
@@ -43,8 +45,8 @@ function logGuidelinesStatus({
|
|
|
43
45
|
}
|
|
44
46
|
|
|
45
47
|
const isLocallyModified =
|
|
46
|
-
|
|
47
|
-
hashSha256(guidelinesFile) !==
|
|
48
|
+
state.guidelinesHash !== null &&
|
|
49
|
+
hashSha256(guidelinesFile) !== state.guidelinesHash;
|
|
48
50
|
|
|
49
51
|
if (isLocallyModified) {
|
|
50
52
|
logMessage(
|
|
@@ -56,8 +58,8 @@ function logGuidelinesStatus({
|
|
|
56
58
|
const isOutOfDate =
|
|
57
59
|
networkAvailable &&
|
|
58
60
|
canonicalGuidelinesHash !== null &&
|
|
59
|
-
|
|
60
|
-
|
|
61
|
+
state.guidelinesHash !== null &&
|
|
62
|
+
state.guidelinesHash !== canonicalGuidelinesHash;
|
|
61
63
|
|
|
62
64
|
if (isOutOfDate) {
|
|
63
65
|
logMessage(
|
|
@@ -73,11 +75,11 @@ function logGuidelinesStatus({
|
|
|
73
75
|
|
|
74
76
|
function logAgentsMdStatus({
|
|
75
77
|
agentsContent,
|
|
76
|
-
|
|
78
|
+
state,
|
|
77
79
|
convexDirName,
|
|
78
80
|
}: {
|
|
79
81
|
agentsContent: string | null;
|
|
80
|
-
|
|
82
|
+
state: AiFilesState;
|
|
81
83
|
convexDirName: string;
|
|
82
84
|
}): void {
|
|
83
85
|
const hasSection =
|
|
@@ -94,8 +96,8 @@ function logAgentsMdStatus({
|
|
|
94
96
|
|
|
95
97
|
const currentHash = hashSha256(agentsMdConvexSection(convexDirName));
|
|
96
98
|
if (
|
|
97
|
-
|
|
98
|
-
|
|
99
|
+
state.agentsMdSectionHash !== null &&
|
|
100
|
+
state.agentsMdSectionHash !== currentHash
|
|
99
101
|
) {
|
|
100
102
|
logMessage(
|
|
101
103
|
` ${chalkStderr.yellow("⚠")} AGENTS.md: Convex section out of date — run ${chalkStderr.bold("npx convex ai-files update")}`,
|
|
@@ -109,11 +111,11 @@ function logAgentsMdStatus({
|
|
|
109
111
|
|
|
110
112
|
function logClaudeMdStatus({
|
|
111
113
|
claudeContent,
|
|
112
|
-
|
|
114
|
+
state,
|
|
113
115
|
convexDirName,
|
|
114
116
|
}: {
|
|
115
117
|
claudeContent: string | null;
|
|
116
|
-
|
|
118
|
+
state: AiFilesState;
|
|
117
119
|
convexDirName: string;
|
|
118
120
|
}): void {
|
|
119
121
|
const hasSection =
|
|
@@ -135,7 +137,7 @@ function logClaudeMdStatus({
|
|
|
135
137
|
}
|
|
136
138
|
|
|
137
139
|
const currentHash = hashSha256(claudeMdConvexSection(convexDirName));
|
|
138
|
-
if (
|
|
140
|
+
if (state.claudeMdHash !== null && state.claudeMdHash !== currentHash) {
|
|
139
141
|
logMessage(
|
|
140
142
|
` ${chalkStderr.yellow("⚠")} CLAUDE.md: Convex section out of date - run ${chalkStderr.bold("npx convex ai-files update")}`,
|
|
141
143
|
);
|
|
@@ -147,27 +149,27 @@ function logClaudeMdStatus({
|
|
|
147
149
|
}
|
|
148
150
|
|
|
149
151
|
function logSkillsStatus({
|
|
150
|
-
|
|
152
|
+
state,
|
|
151
153
|
canonicalAgentSkillsSha,
|
|
152
154
|
networkAvailable,
|
|
153
155
|
}: {
|
|
154
|
-
|
|
156
|
+
state: AiFilesState;
|
|
155
157
|
canonicalAgentSkillsSha: string | null;
|
|
156
158
|
networkAvailable: boolean;
|
|
157
159
|
}): void {
|
|
158
|
-
if (
|
|
160
|
+
if (state.installedSkillNames.length === 0) {
|
|
159
161
|
logMessage(
|
|
160
162
|
` ${chalkStderr.yellow("⚠")} Agent skills: not installed — run ${chalkStderr.bold("npx convex ai-files install")} to install`,
|
|
161
163
|
);
|
|
162
164
|
return;
|
|
163
165
|
}
|
|
164
166
|
|
|
165
|
-
const skillsList =
|
|
167
|
+
const skillsList = state.installedSkillNames.join(", ");
|
|
166
168
|
const isStale =
|
|
167
169
|
networkAvailable &&
|
|
168
170
|
canonicalAgentSkillsSha !== null &&
|
|
169
|
-
|
|
170
|
-
|
|
171
|
+
state.agentSkillsSha !== null &&
|
|
172
|
+
state.agentSkillsSha !== canonicalAgentSkillsSha;
|
|
171
173
|
|
|
172
174
|
if (isStale) {
|
|
173
175
|
logMessage(
|
|
@@ -183,40 +185,44 @@ function logSkillsStatus({
|
|
|
183
185
|
export async function statusAiFiles({
|
|
184
186
|
projectDir,
|
|
185
187
|
convexDir,
|
|
186
|
-
|
|
188
|
+
aiFilesConfig,
|
|
189
|
+
}: AiFilesPaths & {
|
|
190
|
+
aiFilesConfig?: AiFilesProjectConfig | undefined;
|
|
191
|
+
}): Promise<void> {
|
|
187
192
|
const convexDirName = path.relative(projectDir, convexDir);
|
|
188
193
|
const guidelinesRelPath = path.relative(
|
|
189
194
|
projectDir,
|
|
190
195
|
guidelinesPathForConvexDir(convexDir),
|
|
191
196
|
);
|
|
192
197
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
if (config === null) {
|
|
196
|
-
logMessage(`Convex AI files: ${chalkStderr.yellow("not installed")}`);
|
|
198
|
+
if (isAiFilesDisabled(aiFilesConfig)) {
|
|
199
|
+
logMessage(`Convex AI files: ${chalkStderr.yellow("disabled")}`);
|
|
197
200
|
logMessage(
|
|
198
|
-
` Run ${chalkStderr.bold("npx convex ai-files
|
|
199
|
-
`or ${chalkStderr.bold("npx convex ai-files disable")} to opt out.`,
|
|
201
|
+
` Run ${chalkStderr.bold("npx convex ai-files enable")} to re-enable.`,
|
|
200
202
|
);
|
|
201
203
|
return;
|
|
202
204
|
}
|
|
203
205
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
+
const stateResult = await attemptReadAiState(convexDir);
|
|
207
|
+
|
|
208
|
+
if (stateResult.kind !== "ok") {
|
|
209
|
+
logMessage(`Convex AI files: ${chalkStderr.yellow("not installed")}`);
|
|
206
210
|
logMessage(
|
|
207
|
-
`
|
|
211
|
+
`Run ${chalkStderr.bold("npx convex ai-files install")} to get started.`,
|
|
208
212
|
);
|
|
209
213
|
return;
|
|
210
214
|
}
|
|
211
215
|
|
|
216
|
+
const { state } = stateResult;
|
|
217
|
+
|
|
212
218
|
logMessage(`Convex AI files: ${chalkStderr.green("enabled")}`);
|
|
213
219
|
|
|
214
220
|
const [versionData, guidelinesFile, agentsContent, claudeContent] =
|
|
215
221
|
await Promise.all([
|
|
216
222
|
getVersion(),
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
223
|
+
readFileOrNull(guidelinesPathForConvexDir(convexDir)),
|
|
224
|
+
readFileOrNull(agentsMdPath(projectDir)),
|
|
225
|
+
readFileOrNull(claudeMdPath(projectDir)),
|
|
220
226
|
]);
|
|
221
227
|
|
|
222
228
|
const networkAvailable = versionData.kind === "ok";
|
|
@@ -230,11 +236,11 @@ export async function statusAiFiles({
|
|
|
230
236
|
logGuidelinesStatus({
|
|
231
237
|
guidelinesFile,
|
|
232
238
|
guidelinesRelPath,
|
|
233
|
-
|
|
239
|
+
state,
|
|
234
240
|
canonicalGuidelinesHash,
|
|
235
241
|
networkAvailable,
|
|
236
242
|
});
|
|
237
|
-
logAgentsMdStatus({ agentsContent,
|
|
238
|
-
logClaudeMdStatus({ claudeContent,
|
|
239
|
-
logSkillsStatus({
|
|
243
|
+
logAgentsMdStatus({ agentsContent, state, convexDirName });
|
|
244
|
+
logClaudeMdStatus({ claudeContent, state, convexDirName });
|
|
245
|
+
logSkillsStatus({ state, canonicalAgentSkillsSha, networkAvailable });
|
|
240
246
|
}
|
|
@@ -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 { attemptReadFile } from "./utils.js";
|
|
6
|
+
|
|
7
|
+
describe("attemptReadFile", () => {
|
|
8
|
+
let tmpDir: string;
|
|
9
|
+
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
afterEach(() => {
|
|
15
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test("returns content when the file has text", async () => {
|
|
19
|
+
const filePath = path.join(tmpDir, "content.txt");
|
|
20
|
+
fs.writeFileSync(filePath, "hello");
|
|
21
|
+
|
|
22
|
+
const result = await attemptReadFile(filePath);
|
|
23
|
+
|
|
24
|
+
expect(result).toEqual({ kind: "content", content: "hello" });
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("returns empty when the file exists but has no contents", async () => {
|
|
28
|
+
const filePath = path.join(tmpDir, "empty.txt");
|
|
29
|
+
fs.writeFileSync(filePath, "");
|
|
30
|
+
|
|
31
|
+
const result = await attemptReadFile(filePath);
|
|
32
|
+
|
|
33
|
+
expect(result).toEqual({ kind: "empty" });
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test("returns not-found when the file does not exist", async () => {
|
|
37
|
+
const filePath = path.join(tmpDir, "missing.txt");
|
|
38
|
+
|
|
39
|
+
const result = await attemptReadFile(filePath);
|
|
40
|
+
|
|
41
|
+
expect(result).toEqual({ kind: "not-found" });
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test("throws when fs.readFile fails for another reason", async () => {
|
|
45
|
+
const dirPath = path.join(tmpDir, "nested-dir");
|
|
46
|
+
fs.mkdirSync(dirPath);
|
|
47
|
+
|
|
48
|
+
await expect(attemptReadFile(dirPath)).rejects.toThrow();
|
|
49
|
+
});
|
|
50
|
+
});
|
|
@@ -8,14 +8,35 @@ export function isInInteractiveTerminal(): boolean {
|
|
|
8
8
|
return process.stdin.isTTY === true;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
export
|
|
11
|
+
export type ReadFileResult =
|
|
12
|
+
| { kind: "not-found" }
|
|
13
|
+
| { kind: "empty" }
|
|
14
|
+
| { kind: "content"; content: string };
|
|
15
|
+
|
|
16
|
+
export async function attemptReadFile(
|
|
17
|
+
filePath: string,
|
|
18
|
+
): Promise<ReadFileResult> {
|
|
12
19
|
try {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
return
|
|
20
|
+
const content = await fs.readFile(filePath, "utf8");
|
|
21
|
+
if (content.length === 0) return { kind: "empty" };
|
|
22
|
+
return { kind: "content", content };
|
|
23
|
+
} catch (error) {
|
|
24
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT")
|
|
25
|
+
return { kind: "not-found" };
|
|
26
|
+
|
|
27
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
28
|
+
throw error;
|
|
16
29
|
}
|
|
17
30
|
}
|
|
18
31
|
|
|
32
|
+
export async function readFileOrNull(filePath: string): Promise<string | null> {
|
|
33
|
+
const result = await attemptReadFile(filePath);
|
|
34
|
+
if (result.kind === "content") return result.content;
|
|
35
|
+
if (result.kind === "empty") return "";
|
|
36
|
+
if (result.kind === "not-found") return null;
|
|
37
|
+
return exhaustiveCheck(result);
|
|
38
|
+
}
|
|
39
|
+
|
|
19
40
|
/**
|
|
20
41
|
* Attempt to delete a file. Returns `true` if the file was deleted,
|
|
21
42
|
* `false` if it didn't exist or the deletion failed.
|
|
@@ -61,7 +82,7 @@ export async function injectManagedSection(
|
|
|
61
82
|
): Promise<InjectResult> {
|
|
62
83
|
const { filePath, startMarker, endMarker, section } = opts;
|
|
63
84
|
|
|
64
|
-
const existing = (await
|
|
85
|
+
const existing = (await readFileOrNull(filePath)) ?? "";
|
|
65
86
|
|
|
66
87
|
const startIdx = existing.indexOf(startMarker);
|
|
67
88
|
const endIdx = existing.indexOf(endMarker);
|
|
@@ -95,12 +116,12 @@ export type StripResult = "none" | "section" | "file";
|
|
|
95
116
|
* `"section"` if the section was stripped, or `"file"` if the entire
|
|
96
117
|
* file was deleted.
|
|
97
118
|
*/
|
|
98
|
-
export async function
|
|
119
|
+
export async function attemptToStripManagedSection(
|
|
99
120
|
opts: ManagedSectionTarget,
|
|
100
121
|
): Promise<StripResult> {
|
|
101
122
|
const { filePath, startMarker, endMarker } = opts;
|
|
102
123
|
|
|
103
|
-
const content = await
|
|
124
|
+
const content = await readFileOrNull(filePath);
|
|
104
125
|
if (content === null) return "none";
|
|
105
126
|
|
|
106
127
|
const startIdx = content.indexOf(startMarker);
|
|
@@ -122,7 +143,12 @@ export async function stripManagedSection(
|
|
|
122
143
|
return "section";
|
|
123
144
|
}
|
|
124
145
|
|
|
125
|
-
export
|
|
146
|
+
export function exhaustiveCheck(_param: never): never {
|
|
147
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
148
|
+
throw new Error("Internal error: exhaustive check failed.");
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export async function attemptToRemoveMarkdownSection({
|
|
126
152
|
projectDir,
|
|
127
153
|
strip,
|
|
128
154
|
fileName,
|
|
@@ -145,7 +171,9 @@ export async function removeMarkdownSection({
|
|
|
145
171
|
return true;
|
|
146
172
|
}
|
|
147
173
|
|
|
148
|
-
return false;
|
|
174
|
+
if (result === "none") return false;
|
|
175
|
+
|
|
176
|
+
return exhaustiveCheck(result);
|
|
149
177
|
}
|
|
150
178
|
|
|
151
179
|
/**
|
|
@@ -154,7 +182,7 @@ export async function removeMarkdownSection({
|
|
|
154
182
|
export async function hasManagedSection(
|
|
155
183
|
opts: ManagedSectionTarget,
|
|
156
184
|
): Promise<boolean> {
|
|
157
|
-
const content = await
|
|
185
|
+
const content = await readFileOrNull(opts.filePath);
|
|
158
186
|
return (
|
|
159
187
|
content !== null &&
|
|
160
188
|
content.includes(opts.startMarker) &&
|
package/src/cli/lib/api.ts
CHANGED
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
parseDeploymentSelector,
|
|
24
24
|
InProjectSelector,
|
|
25
25
|
} from "./deploymentSelector.js";
|
|
26
|
+
import { loadProjectLocalConfig } from "./localDeployment/filePaths.js";
|
|
26
27
|
import { chalkStderr } from "chalk";
|
|
27
28
|
export type DeploymentName = string;
|
|
28
29
|
export type CloudDeploymentType = "prod" | "dev" | "preview" | "custom";
|
|
@@ -104,7 +105,7 @@ export const deploymentSelectionWithinProjectSchema = z.discriminatedUnion(
|
|
|
104
105
|
z.object({ kind: z.literal("deploymentName"), deploymentName: z.string() }),
|
|
105
106
|
z.object({ kind: z.literal("prod") }),
|
|
106
107
|
z.object({ kind: z.literal("implicitProd") }),
|
|
107
|
-
z.object({ kind: z.literal("
|
|
108
|
+
z.object({ kind: z.literal("unspecified") }),
|
|
108
109
|
z.object({
|
|
109
110
|
kind: z.literal("deploymentSelector"),
|
|
110
111
|
selector: z.string(),
|
|
@@ -152,7 +153,7 @@ export function deploymentSelectionWithinProjectFromOptions(
|
|
|
152
153
|
if (options.implicitProd) {
|
|
153
154
|
return { kind: "implicitProd" };
|
|
154
155
|
}
|
|
155
|
-
return { kind: "
|
|
156
|
+
return { kind: "unspecified" };
|
|
156
157
|
}
|
|
157
158
|
|
|
158
159
|
export async function validateDeploymentSelectionForExistingDeployment(
|
|
@@ -161,7 +162,7 @@ export async function validateDeploymentSelectionForExistingDeployment(
|
|
|
161
162
|
source: "selfHosted" | "deployKey" | "cliArgs",
|
|
162
163
|
) {
|
|
163
164
|
if (
|
|
164
|
-
deploymentSelection.kind === "
|
|
165
|
+
deploymentSelection.kind === "unspecified" ||
|
|
165
166
|
deploymentSelection.kind === "implicitProd"
|
|
166
167
|
) {
|
|
167
168
|
// These are both considered the "default" selection depending on the command, so this is always fine
|
|
@@ -421,6 +422,9 @@ async function fetchExistingDevDeploymentCredentialsOrCrash(
|
|
|
421
422
|
// Helpers for `loadSelectedDeploymentCredentials`
|
|
422
423
|
// ----------------------------------------------------------------------
|
|
423
424
|
|
|
425
|
+
// Returns the user's own dev deployment, which may be a local deployment
|
|
426
|
+
// if one is configured. Used for dev commands (including `npx convex dev`)
|
|
427
|
+
// when no specific deployment is specified.
|
|
424
428
|
async function handleOwnDev(
|
|
425
429
|
ctx: Context,
|
|
426
430
|
projectSelection: ProjectSelection,
|
|
@@ -595,7 +599,9 @@ async function fetchDeploymentCredentialsWithinCurrentProject(
|
|
|
595
599
|
deploymentType: DeploymentType;
|
|
596
600
|
}> {
|
|
597
601
|
switch (deploymentSelection.kind) {
|
|
598
|
-
case "
|
|
602
|
+
case "unspecified": {
|
|
603
|
+
// default to the user's default dev deployment
|
|
604
|
+
// TODO: this currently also handles local dev, but that should probably be split out into a different DeploymenSelection kind
|
|
599
605
|
return await handleOwnDev(ctx, projectSelection);
|
|
600
606
|
}
|
|
601
607
|
case "implicitProd":
|
|
@@ -659,7 +665,7 @@ async function resolveDeploymentNameByReference(
|
|
|
659
665
|
return await ctx.crash({
|
|
660
666
|
exitCode: 1,
|
|
661
667
|
errorType: "fatal",
|
|
662
|
-
printedMessage: `Deployment “${reference}” not found. To create a new deployment, use ${chalkStderr.bold(`npx convex deployment create ${
|
|
668
|
+
printedMessage: `Deployment “${reference}” not found. To create a new deployment, use ${chalkStderr.bold(`npx convex deployment create ${teamSlug}:${projectSlug}:${reference} --select`)}`,
|
|
663
669
|
errForSentry: err,
|
|
664
670
|
});
|
|
665
671
|
}
|
|
@@ -678,8 +684,31 @@ async function handleRefInProject(
|
|
|
678
684
|
deploymentType: DeploymentType;
|
|
679
685
|
}> {
|
|
680
686
|
switch (selector.kind) {
|
|
681
|
-
case "dev":
|
|
682
|
-
|
|
687
|
+
case "dev": {
|
|
688
|
+
const access = await checkAccessToSelectedProject(ctx, projectSelection);
|
|
689
|
+
if (access.kind !== "hasAccess") {
|
|
690
|
+
return await ctx.crash({
|
|
691
|
+
exitCode: 1,
|
|
692
|
+
errorType: "fatal",
|
|
693
|
+
printedMessage:
|
|
694
|
+
"You don't have access to the selected project. Run `npx convex dev` to select a different project.",
|
|
695
|
+
});
|
|
696
|
+
}
|
|
697
|
+
const deploymentName = await resolveDefaultCloudDevDeploymentName(
|
|
698
|
+
ctx,
|
|
699
|
+
access.teamSlug,
|
|
700
|
+
access.projectSlug,
|
|
701
|
+
);
|
|
702
|
+
// Pass teamAndProjectSlugs instead of the original projectSelection,
|
|
703
|
+
// because handleDeploymentName sends projectSelection to Big Brain's
|
|
704
|
+
// authorize_within_current_project endpoint, which doesn't understand
|
|
705
|
+
// deploymentType "local".
|
|
706
|
+
return await handleDeploymentName(ctx, deploymentName, {
|
|
707
|
+
kind: "teamAndProjectSlugs",
|
|
708
|
+
teamSlug: access.teamSlug,
|
|
709
|
+
projectSlug: access.projectSlug,
|
|
710
|
+
});
|
|
711
|
+
}
|
|
683
712
|
case "prod":
|
|
684
713
|
return await handleProd(ctx, projectSelection);
|
|
685
714
|
case "reference": {
|
|
@@ -721,6 +750,26 @@ async function handleDeploymentSelector(
|
|
|
721
750
|
parsed.deploymentName,
|
|
722
751
|
projectSelection,
|
|
723
752
|
);
|
|
753
|
+
case "local": {
|
|
754
|
+
const localConfig = loadProjectLocalConfig(ctx);
|
|
755
|
+
if (localConfig === null) {
|
|
756
|
+
return ctx.crash({
|
|
757
|
+
exitCode: 1,
|
|
758
|
+
errorType: "fatal",
|
|
759
|
+
printedMessage: `No local deployment found. Run ${chalkStderr.bold("npx convex deployment create local")} to create one.`,
|
|
760
|
+
});
|
|
761
|
+
}
|
|
762
|
+
const credentials = await loadLocalDeploymentCredentials(
|
|
763
|
+
ctx,
|
|
764
|
+
localConfig.deploymentName,
|
|
765
|
+
);
|
|
766
|
+
return {
|
|
767
|
+
deploymentName: localConfig.deploymentName,
|
|
768
|
+
adminKey: credentials.adminKey,
|
|
769
|
+
url: credentials.deploymentUrl,
|
|
770
|
+
deploymentType: "local",
|
|
771
|
+
};
|
|
772
|
+
}
|
|
724
773
|
case "inCurrentProject":
|
|
725
774
|
return await handleRefInProject(ctx, parsed.selector, projectSelection);
|
|
726
775
|
case "inProject": {
|
|
@@ -970,3 +1019,35 @@ export async function getTeamsForUser(ctx: Context) {
|
|
|
970
1019
|
);
|
|
971
1020
|
return teams;
|
|
972
1021
|
}
|
|
1022
|
+
|
|
1023
|
+
async function resolveDefaultCloudDevDeploymentName(
|
|
1024
|
+
ctx: Context,
|
|
1025
|
+
teamSlug: string,
|
|
1026
|
+
projectSlug: string,
|
|
1027
|
+
): Promise<string> {
|
|
1028
|
+
try {
|
|
1029
|
+
const result = await typedPlatformClient(ctx, { throw: true }).GET(
|
|
1030
|
+
"/teams/{team_id_or_slug}/projects/{project_slug}/deployment",
|
|
1031
|
+
{
|
|
1032
|
+
params: {
|
|
1033
|
+
path: { team_id_or_slug: teamSlug, project_slug: projectSlug },
|
|
1034
|
+
query: { defaultDev: true },
|
|
1035
|
+
},
|
|
1036
|
+
},
|
|
1037
|
+
);
|
|
1038
|
+
return result.data!.name;
|
|
1039
|
+
} catch (err) {
|
|
1040
|
+
if (
|
|
1041
|
+
err instanceof ThrowingFetchError &&
|
|
1042
|
+
err.serverErrorData?.code === "DeploymentNotFound"
|
|
1043
|
+
) {
|
|
1044
|
+
return await ctx.crash({
|
|
1045
|
+
exitCode: 1,
|
|
1046
|
+
errorType: "fatal",
|
|
1047
|
+
printedMessage: `You don’t have a personal cloud dev deployment in this project. Run ${chalkStderr.bold("npx convex deployment create --type dev --default")} to create one.`,
|
|
1048
|
+
errForSentry: err,
|
|
1049
|
+
});
|
|
1050
|
+
}
|
|
1051
|
+
return await logAndHandleFetchError(ctx, err);
|
|
1052
|
+
}
|
|
1053
|
+
}
|
package/src/cli/lib/command.ts
CHANGED
|
@@ -213,10 +213,14 @@ Command.prototype.addDeploymentSelectionOptions = function (
|
|
|
213
213
|
new Option(
|
|
214
214
|
"--deployment <deployment>",
|
|
215
215
|
action +
|
|
216
|
-
"
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
216
|
+
" a specific deployment. Accepts:\n" +
|
|
217
|
+
"• a deployment name (e.g. joyful-capybara-123)\n" +
|
|
218
|
+
"• a deployment ref (e.g. dev/james)\n" +
|
|
219
|
+
"• `dev` (for your personal dev deployment)\n" +
|
|
220
|
+
"• `prod` (for your project’s default production deployment)\n" +
|
|
221
|
+
"• `local` (for your local dev deployment)." +
|
|
222
|
+
"\nYou can also select deployments in other projects with `project-slug:ref` or `team-slug:project-slug:ref`.",
|
|
223
|
+
).conflicts(["--prod", "--preview-name", "--deployment-name", "--url"]),
|
|
220
224
|
)
|
|
221
225
|
.addOption(
|
|
222
226
|
new Option(
|
|
@@ -243,8 +247,9 @@ export async function normalizeDevOptions(
|
|
|
243
247
|
codegen: "enable" | "disable";
|
|
244
248
|
once?: boolean;
|
|
245
249
|
untilSuccess: boolean;
|
|
246
|
-
|
|
250
|
+
start?: string;
|
|
247
251
|
runSh?: string;
|
|
252
|
+
run?: string | undefined;
|
|
248
253
|
runComponent?: string;
|
|
249
254
|
tailLogs?: string | true;
|
|
250
255
|
traceEvents: boolean;
|
|
@@ -309,10 +314,10 @@ export async function normalizeDevOptions(
|
|
|
309
314
|
name: cmdOptions.run,
|
|
310
315
|
component: cmdOptions.runComponent,
|
|
311
316
|
}
|
|
312
|
-
: cmdOptions.runSh !== undefined
|
|
317
|
+
: (cmdOptions.start ?? cmdOptions.runSh) !== undefined
|
|
313
318
|
? {
|
|
314
319
|
kind: "shell",
|
|
315
|
-
command: cmdOptions.runSh
|
|
320
|
+
command: (cmdOptions.start ?? cmdOptions.runSh)!,
|
|
316
321
|
}
|
|
317
322
|
: undefined,
|
|
318
323
|
tailLogs:
|