convex 1.34.1 → 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 +86 -43
- package/dist/browser.bundle.js +8 -2
- 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/cli/aiFiles.js +31 -13
- 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 +21 -24
- 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 +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/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/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/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 +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/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/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 +1670 -1214
- 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/cli/aiFiles.js +33 -15
- 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 +23 -26
- 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 +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/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/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/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 +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/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/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 +50 -7
- package/dist/react.bundle.js.map +3 -3
- package/package.json +11 -7
- package/schemas/convex.schema.json +15 -2
- 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/cli/aiFiles.ts +44 -14
- package/src/cli/codegen_templates/readme.ts +14 -1
- package/src/cli/configure.test.ts +138 -0
- package/src/cli/configure.ts +48 -47
- 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 +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/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/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/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
|
@@ -12,25 +12,26 @@ import {
|
|
|
12
12
|
hasGuidelinesInstalled,
|
|
13
13
|
} from "./guidelinesmd.js";
|
|
14
14
|
import {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
} from "
|
|
21
|
-
import { isInInteractiveTerminal } from "./utils.js";
|
|
15
|
+
attemptReadAiState,
|
|
16
|
+
readAiStateOrDefault,
|
|
17
|
+
writeAiState,
|
|
18
|
+
hasAiState,
|
|
19
|
+
} from "./state.js";
|
|
20
|
+
import { type AiFilesProjectConfig } from "../config.js";
|
|
21
|
+
import { exhaustiveCheck, isInInteractiveTerminal } from "./utils.js";
|
|
22
22
|
import {
|
|
23
23
|
hasAgentsMdInstalled,
|
|
24
24
|
applyAgentsMdSection,
|
|
25
|
-
|
|
25
|
+
attemptToRemoveAgentsMdSection,
|
|
26
26
|
} from "./agentsmd.js";
|
|
27
27
|
import {
|
|
28
28
|
hasClaudeMdInstalled,
|
|
29
29
|
applyClaudeMdSection,
|
|
30
|
-
|
|
30
|
+
attemptToRemoveClaudeMdSection,
|
|
31
31
|
} from "./claudemd.js";
|
|
32
32
|
import { installSkills, removeInstalledSkills } from "./skills.js";
|
|
33
33
|
import { removeLegacyCursorRulesFile as removeLegacyCursorRules } from "./cursorrules.js";
|
|
34
|
+
|
|
34
35
|
async function hasExistingAiFilesArtifacts({
|
|
35
36
|
projectDir,
|
|
36
37
|
convexDir,
|
|
@@ -45,53 +46,25 @@ async function hasExistingAiFilesArtifacts({
|
|
|
45
46
|
/**
|
|
46
47
|
* Install or refresh all Convex AI files.
|
|
47
48
|
*
|
|
48
|
-
* Reads the existing
|
|
49
|
-
* fresh install.
|
|
50
|
-
* flags (all default to true).
|
|
49
|
+
* Reads the existing state if present, or starts from a blank one for a
|
|
50
|
+
* fresh install.
|
|
51
51
|
*/
|
|
52
52
|
export async function installAiFiles({
|
|
53
53
|
projectDir,
|
|
54
54
|
convexDir,
|
|
55
|
-
|
|
56
|
-
shouldWriteAgentsMd = true,
|
|
57
|
-
shouldWriteClaudeMd = true,
|
|
58
|
-
shouldWriteSkills = true,
|
|
55
|
+
aiFilesConfig,
|
|
59
56
|
}: AiFilesPaths & {
|
|
60
|
-
|
|
61
|
-
shouldWriteAgentsMd?: boolean;
|
|
62
|
-
shouldWriteClaudeMd?: boolean;
|
|
63
|
-
shouldWriteSkills?: boolean;
|
|
57
|
+
aiFilesConfig?: AiFilesProjectConfig | undefined;
|
|
64
58
|
}): Promise<void> {
|
|
65
|
-
await fs.mkdir(aiDirForConvexDir(convexDir), { recursive: true });
|
|
66
|
-
|
|
67
|
-
const config: AiFilesConfig = (await readAiConfig({
|
|
68
|
-
projectDir,
|
|
69
|
-
convexDir,
|
|
70
|
-
})) ?? {
|
|
71
|
-
enabled: true,
|
|
72
|
-
guidelinesHash: null,
|
|
73
|
-
agentsMdSectionHash: null,
|
|
74
|
-
claudeMdHash: null,
|
|
75
|
-
agentSkillsSha: null,
|
|
76
|
-
installedSkillNames: [],
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
if (shouldWriteGuidelines) await installGuidelinesFile({ convexDir, config });
|
|
80
|
-
|
|
81
59
|
const convexDirName = path.relative(projectDir, convexDir);
|
|
60
|
+
const state = await readAiStateOrDefault(convexDir);
|
|
82
61
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
await applyClaudeMdSection({ projectDir, config, convexDirName });
|
|
88
|
-
|
|
89
|
-
if (shouldWriteSkills) await installSkills({ projectDir, config });
|
|
90
|
-
|
|
62
|
+
await installGuidelinesFile({ convexDir, state });
|
|
63
|
+
await applyAgentsMdSection({ projectDir, state, convexDirName });
|
|
64
|
+
await applyClaudeMdSection({ projectDir, state, convexDirName });
|
|
65
|
+
await installSkills({ projectDir, state, aiFilesConfig });
|
|
91
66
|
await removeLegacyCursorRules(projectDir);
|
|
92
|
-
await
|
|
93
|
-
|
|
94
|
-
logMessage(`${chalkStderr.green("✔")} Convex AI files installed.`);
|
|
67
|
+
await writeAiState({ state, convexDir });
|
|
95
68
|
}
|
|
96
69
|
|
|
97
70
|
async function attemptToInstallAiFiles(
|
|
@@ -104,58 +77,70 @@ async function attemptToInstallAiFiles(
|
|
|
104
77
|
}
|
|
105
78
|
}
|
|
106
79
|
|
|
107
|
-
type AiFilesStalenessStatus =
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
80
|
+
type AiFilesStalenessStatus = "not-installed" | "stale" | "silent";
|
|
81
|
+
|
|
82
|
+
export function isAiFilesDisabled(
|
|
83
|
+
aiFilesConfig: AiFilesProjectConfig | undefined,
|
|
84
|
+
): boolean {
|
|
85
|
+
if (aiFilesConfig?.enabled !== undefined)
|
|
86
|
+
return aiFilesConfig.enabled === false;
|
|
87
|
+
return aiFilesConfig?.disableStalenessMessage === true;
|
|
88
|
+
}
|
|
113
89
|
|
|
114
90
|
async function determineAiFilesStaleness({
|
|
115
91
|
canonicalGuidelinesHash,
|
|
116
92
|
canonicalAgentSkillsSha,
|
|
93
|
+
aiFilesConfig,
|
|
117
94
|
projectDir,
|
|
118
95
|
convexDir,
|
|
119
96
|
}: {
|
|
120
97
|
canonicalGuidelinesHash: string | null;
|
|
121
98
|
canonicalAgentSkillsSha: string | null;
|
|
99
|
+
aiFilesConfig?: AiFilesProjectConfig | undefined;
|
|
122
100
|
} & AiFilesPaths): Promise<AiFilesStalenessStatus> {
|
|
123
|
-
|
|
101
|
+
if (isAiFilesDisabled(aiFilesConfig)) return "silent";
|
|
102
|
+
|
|
103
|
+
const result = await attemptReadAiState(convexDir);
|
|
124
104
|
|
|
125
|
-
if (
|
|
105
|
+
if (result.kind === "no-file" || result.kind === "parse-error") {
|
|
126
106
|
const hasArtifacts = await hasExistingAiFilesArtifacts({
|
|
127
107
|
projectDir,
|
|
128
108
|
convexDir,
|
|
129
109
|
});
|
|
130
|
-
return hasArtifacts ? "
|
|
110
|
+
return hasArtifacts ? "silent" : "not-installed";
|
|
131
111
|
}
|
|
132
112
|
|
|
133
|
-
if (
|
|
113
|
+
if (result.kind === "ok") {
|
|
114
|
+
const { state } = result;
|
|
115
|
+
|
|
116
|
+
if (canonicalGuidelinesHash === null && canonicalAgentSkillsSha === null)
|
|
117
|
+
return "silent";
|
|
134
118
|
|
|
135
|
-
|
|
136
|
-
|
|
119
|
+
const guidelinesStale =
|
|
120
|
+
canonicalGuidelinesHash !== null &&
|
|
121
|
+
state.guidelinesHash !== null &&
|
|
122
|
+
state.guidelinesHash !== canonicalGuidelinesHash;
|
|
137
123
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
124
|
+
const skillsStale =
|
|
125
|
+
canonicalAgentSkillsSha !== null &&
|
|
126
|
+
state.agentSkillsSha !== null &&
|
|
127
|
+
state.agentSkillsSha !== canonicalAgentSkillsSha;
|
|
142
128
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
config.agentSkillsSha !== null &&
|
|
146
|
-
config.agentSkillsSha !== canonicalAgentSkillsSha;
|
|
129
|
+
return guidelinesStale || skillsStale ? "stale" : "silent";
|
|
130
|
+
}
|
|
147
131
|
|
|
148
|
-
return
|
|
132
|
+
return exhaustiveCheck(result);
|
|
149
133
|
}
|
|
150
134
|
|
|
151
135
|
/**
|
|
152
136
|
* Check whether the Convex AI files are out of date and log a nag message
|
|
153
137
|
* if so.
|
|
154
138
|
*/
|
|
155
|
-
export async function
|
|
139
|
+
export async function checkAiFilesStalenessAndLog(
|
|
156
140
|
opts: {
|
|
157
141
|
canonicalGuidelinesHash: string | null;
|
|
158
142
|
canonicalAgentSkillsSha: string | null;
|
|
143
|
+
aiFilesConfig?: AiFilesProjectConfig | undefined;
|
|
159
144
|
} & AiFilesPaths,
|
|
160
145
|
): Promise<void> {
|
|
161
146
|
const status = await determineAiFilesStaleness(opts);
|
|
@@ -166,6 +151,7 @@ export async function checkAiFilesStaleness(
|
|
|
166
151
|
`Convex AI files are not installed. Run ${chalkStderr.bold(`npx convex ai-files install`)} to get started or ${chalkStderr.bold(`npx convex ai-files disable`)} to hide this message.`,
|
|
167
152
|
),
|
|
168
153
|
);
|
|
154
|
+
return;
|
|
169
155
|
}
|
|
170
156
|
|
|
171
157
|
if (status === "stale") {
|
|
@@ -174,23 +160,39 @@ export async function checkAiFilesStaleness(
|
|
|
174
160
|
`Your Convex AI files are out of date. Run ${chalkStderr.bold(`npx convex ai-files update`)} to get the latest.`,
|
|
175
161
|
),
|
|
176
162
|
);
|
|
163
|
+
return;
|
|
177
164
|
}
|
|
165
|
+
|
|
166
|
+
if (status === "silent") return;
|
|
167
|
+
|
|
168
|
+
exhaustiveCheck(status);
|
|
178
169
|
}
|
|
179
170
|
|
|
171
|
+
/**
|
|
172
|
+
* Installs AI files and returns the aiFiles config to write.
|
|
173
|
+
*/
|
|
180
174
|
export async function enableAiFiles({
|
|
181
175
|
projectDir,
|
|
182
176
|
convexDir,
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
177
|
+
aiFilesConfig,
|
|
178
|
+
}: AiFilesPaths & {
|
|
179
|
+
aiFilesConfig?: AiFilesProjectConfig | undefined;
|
|
180
|
+
}): Promise<AiFilesProjectConfig> {
|
|
181
|
+
await installAiFiles({ projectDir, convexDir, aiFilesConfig });
|
|
182
|
+
// Deleting the deprecated disableStalenessMessage key
|
|
183
|
+
const { disableStalenessMessage: _, ...rest } = aiFilesConfig ?? {};
|
|
184
|
+
return { ...rest, enabled: true };
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Returns the aiFiles config to write when disabling AI files.
|
|
189
|
+
*/
|
|
190
|
+
export function disableAiFiles(
|
|
191
|
+
aiFilesConfig?: AiFilesProjectConfig | undefined,
|
|
192
|
+
): AiFilesProjectConfig {
|
|
193
|
+
// Deleting the deprecated disableStalenessMessage key
|
|
194
|
+
const { disableStalenessMessage: _, ...rest } = aiFilesConfig ?? {};
|
|
195
|
+
return { ...rest, enabled: false };
|
|
194
196
|
}
|
|
195
197
|
|
|
196
198
|
/**
|
|
@@ -201,51 +203,31 @@ export async function removeAiFiles({
|
|
|
201
203
|
projectDir,
|
|
202
204
|
convexDir,
|
|
203
205
|
}: AiFilesPaths): Promise<void> {
|
|
204
|
-
const
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
206
|
+
const result = await attemptReadAiState(convexDir);
|
|
207
|
+
|
|
208
|
+
// Skill names are only known when the state file exists and parses.
|
|
209
|
+
// All other artifacts (AGENTS.md, CLAUDE.md sections, ai dir) can exist
|
|
210
|
+
// independently, so we always attempt their removal.
|
|
211
|
+
const installedSkillNames =
|
|
212
|
+
result.kind === "ok"
|
|
213
|
+
? result.state.installedSkillNames
|
|
214
|
+
: result.kind === "no-file" || result.kind === "parse-error"
|
|
215
|
+
? []
|
|
216
|
+
: exhaustiveCheck(result);
|
|
209
217
|
|
|
210
218
|
const removals = [
|
|
211
|
-
await
|
|
212
|
-
await
|
|
219
|
+
await attemptToRemoveAgentsMdSection(projectDir),
|
|
220
|
+
await attemptToRemoveClaudeMdSection(projectDir),
|
|
213
221
|
await removeInstalledSkills({
|
|
214
222
|
projectDir,
|
|
215
|
-
skillNames:
|
|
223
|
+
skillNames: installedSkillNames,
|
|
216
224
|
}),
|
|
217
225
|
await removeLegacyCursorRules(projectDir),
|
|
218
226
|
await attemptToDeleteAiDir({ projectDir, convexDir }),
|
|
219
227
|
];
|
|
220
228
|
|
|
221
229
|
if (removals.some(Boolean)) logMessage("Convex AI files removed.");
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* Called by `npx convex ai-files disable`.
|
|
226
|
-
*
|
|
227
|
-
* Writes a suppression flag into `convex.json` so `npx convex dev` stops
|
|
228
|
-
* showing AI files install/staleness messages. Files are left in place.
|
|
229
|
-
*/
|
|
230
|
-
export async function safelyAttemptToDisableAiFiles(
|
|
231
|
-
projectDir: string,
|
|
232
|
-
): Promise<void> {
|
|
233
|
-
try {
|
|
234
|
-
await writeAiEnabledToProjectConfig({
|
|
235
|
-
projectDir,
|
|
236
|
-
enabled: false,
|
|
237
|
-
});
|
|
238
|
-
logMessage(
|
|
239
|
-
`${chalkStderr.green(`✔`)} Convex AI files disabled. Run ${chalkStderr.bold(`npx convex ai-files enable`)} to re-enable.`,
|
|
240
|
-
);
|
|
241
|
-
} catch (error) {
|
|
242
|
-
Sentry.captureException(error);
|
|
243
|
-
logMessage(
|
|
244
|
-
chalkStderr.yellow(
|
|
245
|
-
"Could not write AI message suppression config. Message may reappear.",
|
|
246
|
-
),
|
|
247
|
-
);
|
|
248
|
-
}
|
|
230
|
+
else logMessage("No Convex AI files found — nothing to remove.");
|
|
249
231
|
}
|
|
250
232
|
|
|
251
233
|
async function attemptToDeleteAiDir({
|
|
@@ -255,10 +237,11 @@ async function attemptToDeleteAiDir({
|
|
|
255
237
|
const aiDir = aiDirForConvexDir(convexDir);
|
|
256
238
|
const relPath = path.relative(projectDir, aiDir);
|
|
257
239
|
try {
|
|
258
|
-
await fs.rm(aiDir, { recursive: true
|
|
240
|
+
await fs.rm(aiDir, { recursive: true });
|
|
259
241
|
logMessage(`${chalkStderr.green("✔")} Deleted ${relPath}/`);
|
|
260
242
|
return true;
|
|
261
243
|
} catch (error) {
|
|
244
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") return false;
|
|
262
245
|
Sentry.captureException(error);
|
|
263
246
|
logMessage(
|
|
264
247
|
chalkStderr.yellow(`Could not delete ${relPath}/. Remove it manually.`),
|
|
@@ -270,27 +253,37 @@ async function attemptToDeleteAiDir({
|
|
|
270
253
|
async function hasAiFilesBeenInstalledBefore({
|
|
271
254
|
projectDir,
|
|
272
255
|
convexDir,
|
|
273
|
-
|
|
256
|
+
aiFilesConfig,
|
|
257
|
+
}: AiFilesPaths & {
|
|
258
|
+
aiFilesConfig?: AiFilesProjectConfig | undefined;
|
|
259
|
+
}): Promise<boolean> {
|
|
260
|
+
if (isAiFilesDisabled(aiFilesConfig)) return false;
|
|
274
261
|
return (
|
|
275
|
-
(await
|
|
262
|
+
(await hasAiState(convexDir)) ||
|
|
276
263
|
(await hasExistingAiFilesArtifacts({ projectDir, convexDir }))
|
|
277
264
|
);
|
|
278
265
|
}
|
|
279
266
|
|
|
280
|
-
export async function
|
|
267
|
+
export async function attemptSetupAiFiles({
|
|
281
268
|
ctx,
|
|
282
269
|
convexDir,
|
|
283
270
|
projectDir,
|
|
271
|
+
aiFilesConfig,
|
|
284
272
|
}: {
|
|
285
273
|
ctx: Context;
|
|
274
|
+
aiFilesConfig?: AiFilesProjectConfig | undefined;
|
|
286
275
|
} & AiFilesPaths): Promise<void> {
|
|
287
276
|
if (!isInInteractiveTerminal()) return;
|
|
277
|
+
if (isAiFilesDisabled(aiFilesConfig)) return;
|
|
288
278
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
279
|
+
if (
|
|
280
|
+
await hasAiFilesBeenInstalledBefore({
|
|
281
|
+
projectDir,
|
|
282
|
+
convexDir,
|
|
283
|
+
aiFilesConfig,
|
|
284
|
+
})
|
|
285
|
+
) {
|
|
286
|
+
await attemptToInstallAiFiles({ projectDir, convexDir, aiFilesConfig });
|
|
294
287
|
return;
|
|
295
288
|
}
|
|
296
289
|
|
|
@@ -299,5 +292,6 @@ export async function maybeSetupAiFiles({
|
|
|
299
292
|
default: true,
|
|
300
293
|
});
|
|
301
294
|
|
|
302
|
-
if (shouldInstall)
|
|
295
|
+
if (shouldInstall)
|
|
296
|
+
await attemptToInstallAiFiles({ projectDir, convexDir, aiFilesConfig });
|
|
303
297
|
}
|
|
@@ -3,8 +3,7 @@ import fs from "fs";
|
|
|
3
3
|
import os from "os";
|
|
4
4
|
import path from "path";
|
|
5
5
|
import {
|
|
6
|
-
|
|
7
|
-
safelyAttemptToDisableAiFiles,
|
|
6
|
+
checkAiFilesStalenessAndLog,
|
|
8
7
|
enableAiFiles,
|
|
9
8
|
removeAiFiles,
|
|
10
9
|
installAiFiles,
|
|
@@ -46,6 +45,8 @@ vi.mock("child_process", () => ({
|
|
|
46
45
|
},
|
|
47
46
|
}));
|
|
48
47
|
|
|
48
|
+
import child_process from "child_process";
|
|
49
|
+
|
|
49
50
|
// ---------------------------------------------------------------------------
|
|
50
51
|
// Shared helpers
|
|
51
52
|
// ---------------------------------------------------------------------------
|
|
@@ -54,6 +55,16 @@ function readJson(filePath: string): any {
|
|
|
54
55
|
return JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
55
56
|
}
|
|
56
57
|
|
|
58
|
+
function patchConvexJson(projectDir: string, patch: object) {
|
|
59
|
+
const filePath = path.join(projectDir, "convex.json");
|
|
60
|
+
const existing = fs.existsSync(filePath) ? readJson(filePath) : {};
|
|
61
|
+
fs.writeFileSync(
|
|
62
|
+
filePath,
|
|
63
|
+
JSON.stringify({ ...existing, ...patch }, null, 2) + "\n",
|
|
64
|
+
"utf8",
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
57
68
|
function makeTmpDir(): string {
|
|
58
69
|
return fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
|
|
59
70
|
}
|
|
@@ -92,6 +103,55 @@ describe("ai-files integration with default convex/ directory", () => {
|
|
|
92
103
|
expect(fs.readFileSync(guidelinesPath(), "utf8")).toBe(
|
|
93
104
|
"integration guidelines content",
|
|
94
105
|
);
|
|
106
|
+
|
|
107
|
+
// Default agents
|
|
108
|
+
expect(vi.mocked(child_process.spawn)).toHaveBeenCalledWith(
|
|
109
|
+
"npx",
|
|
110
|
+
expect.arrayContaining([
|
|
111
|
+
"add",
|
|
112
|
+
"get-convex/agent-skills",
|
|
113
|
+
"--yes",
|
|
114
|
+
"--agent",
|
|
115
|
+
"claude-code",
|
|
116
|
+
"--agent",
|
|
117
|
+
"codex",
|
|
118
|
+
]),
|
|
119
|
+
expect.any(Object),
|
|
120
|
+
);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test("install respects explicit agent configuration", async () => {
|
|
124
|
+
await installAiFiles({
|
|
125
|
+
projectDir: tmpDir,
|
|
126
|
+
convexDir,
|
|
127
|
+
aiFilesConfig: { skills: { agents: ["cursor", "windsurf"] } },
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
expect(vi.mocked(child_process.spawn)).toHaveBeenCalledWith(
|
|
131
|
+
"npx",
|
|
132
|
+
expect.arrayContaining([
|
|
133
|
+
"add",
|
|
134
|
+
"get-convex/agent-skills",
|
|
135
|
+
"--yes",
|
|
136
|
+
"--agent",
|
|
137
|
+
"cursor",
|
|
138
|
+
"--agent",
|
|
139
|
+
"windsurf",
|
|
140
|
+
]),
|
|
141
|
+
expect.any(Object),
|
|
142
|
+
);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test("install skips skills CLI when configured agents are empty", async () => {
|
|
146
|
+
await installAiFiles({
|
|
147
|
+
projectDir: tmpDir,
|
|
148
|
+
convexDir,
|
|
149
|
+
aiFilesConfig: { skills: { agents: [] } },
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
expect(fs.existsSync(guidelinesPath())).toBe(true);
|
|
153
|
+
expect(fs.existsSync(statePath())).toBe(true);
|
|
154
|
+
expect(vi.mocked(child_process.spawn)).not.toHaveBeenCalled();
|
|
95
155
|
});
|
|
96
156
|
|
|
97
157
|
test("preserves existing AGENTS.md content and injects managed section", async () => {
|
|
@@ -148,7 +208,7 @@ describe("ai-files integration with default convex/ directory", () => {
|
|
|
148
208
|
state.guidelinesHash = "deliberately-stale-hash";
|
|
149
209
|
fs.writeFileSync(statePath(), JSON.stringify(state, null, 2) + "\n");
|
|
150
210
|
|
|
151
|
-
await
|
|
211
|
+
await checkAiFilesStalenessAndLog({
|
|
152
212
|
canonicalGuidelinesHash: "canonical-hash",
|
|
153
213
|
canonicalAgentSkillsSha: null,
|
|
154
214
|
projectDir: tmpDir,
|
|
@@ -160,30 +220,9 @@ describe("ai-files integration with default convex/ directory", () => {
|
|
|
160
220
|
);
|
|
161
221
|
});
|
|
162
222
|
|
|
163
|
-
test("staleness check is silent when disabled in convex.json", async () => {
|
|
164
|
-
await installAiFiles({ projectDir: tmpDir, convexDir });
|
|
165
|
-
await safelyAttemptToDisableAiFiles(tmpDir);
|
|
166
|
-
const state = readJson(statePath());
|
|
167
|
-
state.guidelinesHash = "deliberately-stale-hash";
|
|
168
|
-
fs.writeFileSync(statePath(), JSON.stringify(state, null, 2) + "\n");
|
|
169
|
-
vi.mocked(logMessage).mockClear();
|
|
170
|
-
|
|
171
|
-
await checkAiFilesStaleness({
|
|
172
|
-
canonicalGuidelinesHash: "canonical-hash",
|
|
173
|
-
canonicalAgentSkillsSha: null,
|
|
174
|
-
projectDir: tmpDir,
|
|
175
|
-
convexDir,
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
const calls = vi.mocked(logMessage).mock.calls.map((c) => c[0]);
|
|
179
|
-
expect(
|
|
180
|
-
calls.find((m) => typeof m === "string" && m.includes("out of date")),
|
|
181
|
-
).toBeUndefined();
|
|
182
|
-
});
|
|
183
|
-
|
|
184
223
|
test("disable keeps files but sets convex.json preference", async () => {
|
|
185
224
|
await installAiFiles({ projectDir: tmpDir, convexDir });
|
|
186
|
-
|
|
225
|
+
patchConvexJson(tmpDir, { aiFiles: { enabled: false } });
|
|
187
226
|
|
|
188
227
|
expect(readJson(projectConfigPath()).aiFiles.enabled).toBe(false);
|
|
189
228
|
expect(fs.existsSync(guidelinesPath())).toBe(true);
|
|
@@ -192,7 +231,7 @@ describe("ai-files integration with default convex/ directory", () => {
|
|
|
192
231
|
});
|
|
193
232
|
|
|
194
233
|
test("disable before install writes only convex.json and no AI state file", async () => {
|
|
195
|
-
|
|
234
|
+
patchConvexJson(tmpDir, { aiFiles: { enabled: false } });
|
|
196
235
|
|
|
197
236
|
expect(readJson(projectConfigPath()).aiFiles.enabled).toBe(false);
|
|
198
237
|
expect(fs.existsSync(statePath())).toBe(false);
|
|
@@ -232,7 +271,7 @@ describe("ai-files integration with default convex/ directory", () => {
|
|
|
232
271
|
test("disable after CLAUDE.md user edits preserves the file", async () => {
|
|
233
272
|
await installAiFiles({ projectDir: tmpDir, convexDir });
|
|
234
273
|
fs.appendFileSync(path.join(tmpDir, "CLAUDE.md"), "My custom note\n");
|
|
235
|
-
|
|
274
|
+
patchConvexJson(tmpDir, { aiFiles: { enabled: false } });
|
|
236
275
|
expect(fs.readFileSync(path.join(tmpDir, "CLAUDE.md"), "utf8")).toContain(
|
|
237
276
|
"My custom note",
|
|
238
277
|
);
|
|
@@ -249,23 +288,37 @@ describe("ai-files integration with default convex/ directory", () => {
|
|
|
249
288
|
);
|
|
250
289
|
});
|
|
251
290
|
|
|
252
|
-
test("enable sets enabled flag to true", async () => {
|
|
291
|
+
test("enable sets enabled flag to true and strips deprecated disableStalenessMessage", async () => {
|
|
253
292
|
await installAiFiles({ projectDir: tmpDir, convexDir });
|
|
254
|
-
|
|
255
|
-
expect(readJson(projectConfigPath()).aiFiles.
|
|
293
|
+
patchConvexJson(tmpDir, { aiFiles: { disableStalenessMessage: true } });
|
|
294
|
+
expect(readJson(projectConfigPath()).aiFiles.disableStalenessMessage).toBe(
|
|
295
|
+
true,
|
|
296
|
+
);
|
|
256
297
|
|
|
257
|
-
await enableAiFiles({
|
|
298
|
+
const newAiFiles = await enableAiFiles({
|
|
299
|
+
projectDir: tmpDir,
|
|
300
|
+
convexDir,
|
|
301
|
+
aiFilesConfig: readJson(projectConfigPath()).aiFiles,
|
|
302
|
+
});
|
|
303
|
+
patchConvexJson(tmpDir, { aiFiles: newAiFiles });
|
|
258
304
|
|
|
259
|
-
|
|
305
|
+
const updatedConfig = readJson(projectConfigPath());
|
|
306
|
+
expect(updatedConfig.aiFiles.enabled).toBe(true);
|
|
307
|
+
expect(updatedConfig.aiFiles.disableStalenessMessage).toBeUndefined();
|
|
260
308
|
});
|
|
261
309
|
|
|
262
310
|
test("full cycle: disable -> remove -> enable reinstalls everything", async () => {
|
|
263
311
|
await installAiFiles({ projectDir: tmpDir, convexDir });
|
|
264
|
-
|
|
312
|
+
patchConvexJson(tmpDir, { aiFiles: { enabled: false } });
|
|
265
313
|
await removeAiFiles({ projectDir: tmpDir, convexDir });
|
|
266
314
|
expect(fs.existsSync(aiDir())).toBe(false);
|
|
267
315
|
|
|
268
|
-
await enableAiFiles({
|
|
316
|
+
const newAiFiles = await enableAiFiles({
|
|
317
|
+
projectDir: tmpDir,
|
|
318
|
+
convexDir,
|
|
319
|
+
aiFilesConfig: readJson(projectConfigPath()).aiFiles,
|
|
320
|
+
});
|
|
321
|
+
patchConvexJson(tmpDir, { aiFiles: newAiFiles });
|
|
269
322
|
|
|
270
323
|
expect(fs.existsSync(guidelinesPath())).toBe(true);
|
|
271
324
|
expect(fs.existsSync(path.join(tmpDir, "AGENTS.md"))).toBe(true);
|
|
@@ -326,7 +379,7 @@ describe("ai-files integration with default convex/ directory", () => {
|
|
|
326
379
|
test("checkAiFilesStaleness nags when no state file exists", async () => {
|
|
327
380
|
vi.mocked(logMessage).mockClear();
|
|
328
381
|
|
|
329
|
-
await
|
|
382
|
+
await checkAiFilesStalenessAndLog({
|
|
330
383
|
canonicalGuidelinesHash: null,
|
|
331
384
|
canonicalAgentSkillsSha: null,
|
|
332
385
|
projectDir: tmpDir,
|
|
@@ -343,7 +396,7 @@ describe("ai-files integration with default convex/ directory", () => {
|
|
|
343
396
|
const state = readJson(statePath());
|
|
344
397
|
vi.mocked(logMessage).mockClear();
|
|
345
398
|
|
|
346
|
-
await
|
|
399
|
+
await checkAiFilesStalenessAndLog({
|
|
347
400
|
canonicalGuidelinesHash: state.guidelinesHash,
|
|
348
401
|
canonicalAgentSkillsSha: state.agentSkillsSha,
|
|
349
402
|
projectDir: tmpDir,
|
|
@@ -371,10 +424,14 @@ describe("ai-files integration with default convex/ directory", () => {
|
|
|
371
424
|
|
|
372
425
|
test("status reports disabled state after disable", async () => {
|
|
373
426
|
await installAiFiles({ projectDir: tmpDir, convexDir });
|
|
374
|
-
|
|
427
|
+
patchConvexJson(tmpDir, { aiFiles: { enabled: false } });
|
|
375
428
|
vi.mocked(logMessage).mockClear();
|
|
376
429
|
|
|
377
|
-
await statusAiFiles({
|
|
430
|
+
await statusAiFiles({
|
|
431
|
+
projectDir: tmpDir,
|
|
432
|
+
convexDir,
|
|
433
|
+
aiFilesConfig: readJson(projectConfigPath()).aiFiles,
|
|
434
|
+
});
|
|
378
435
|
|
|
379
436
|
expect(vi.mocked(logMessage)).toHaveBeenCalledWith(
|
|
380
437
|
expect.stringContaining("disabled"),
|
|
@@ -486,7 +543,7 @@ describe("ai-files integration with functions directory override", () => {
|
|
|
486
543
|
"utf8",
|
|
487
544
|
);
|
|
488
545
|
|
|
489
|
-
await
|
|
546
|
+
await checkAiFilesStalenessAndLog({
|
|
490
547
|
canonicalGuidelinesHash: "canonical-hash",
|
|
491
548
|
canonicalAgentSkillsSha: null,
|
|
492
549
|
projectDir: tmpDir,
|
|
@@ -500,7 +557,7 @@ describe("ai-files integration with functions directory override", () => {
|
|
|
500
557
|
|
|
501
558
|
test("disable sets convex.json preference and keeps files", async () => {
|
|
502
559
|
await installAiFiles({ projectDir: tmpDir, convexDir });
|
|
503
|
-
|
|
560
|
+
patchConvexJson(tmpDir, { aiFiles: { enabled: false } });
|
|
504
561
|
|
|
505
562
|
expect(readJson(projectConfigPath()).aiFiles.enabled).toBe(false);
|
|
506
563
|
expect(fs.existsSync(guidelinesPath())).toBe(true);
|
|
@@ -526,7 +583,7 @@ describe("ai-files integration with functions directory override", () => {
|
|
|
526
583
|
"My custom note\n",
|
|
527
584
|
"utf8",
|
|
528
585
|
);
|
|
529
|
-
|
|
586
|
+
patchConvexJson(tmpDir, { aiFiles: { enabled: false } });
|
|
530
587
|
expect(fs.readFileSync(path.join(tmpDir, "CLAUDE.md"), "utf8")).toContain(
|
|
531
588
|
"My custom note",
|
|
532
589
|
);
|
|
@@ -546,8 +603,13 @@ describe("ai-files integration with functions directory override", () => {
|
|
|
546
603
|
|
|
547
604
|
test("enable sets enabled flag to true and re-enables status", async () => {
|
|
548
605
|
await installAiFiles({ projectDir: tmpDir, convexDir });
|
|
549
|
-
|
|
550
|
-
await enableAiFiles({
|
|
606
|
+
patchConvexJson(tmpDir, { aiFiles: { enabled: false } });
|
|
607
|
+
const newAiFiles = await enableAiFiles({
|
|
608
|
+
projectDir: tmpDir,
|
|
609
|
+
convexDir,
|
|
610
|
+
aiFilesConfig: readJson(projectConfigPath()).aiFiles,
|
|
611
|
+
});
|
|
612
|
+
patchConvexJson(tmpDir, { aiFiles: newAiFiles });
|
|
551
613
|
await statusAiFiles({ projectDir: tmpDir, convexDir });
|
|
552
614
|
|
|
553
615
|
expect(readJson(projectConfigPath()).aiFiles.enabled).toBe(true);
|
|
@@ -558,14 +620,19 @@ describe("ai-files integration with functions directory override", () => {
|
|
|
558
620
|
|
|
559
621
|
test("disable + remove + enable works with overridden functions directory", async () => {
|
|
560
622
|
await installAiFiles({ projectDir: tmpDir, convexDir });
|
|
561
|
-
|
|
623
|
+
patchConvexJson(tmpDir, { aiFiles: { enabled: false } });
|
|
562
624
|
await removeAiFiles({ projectDir: tmpDir, convexDir });
|
|
563
625
|
|
|
564
626
|
expect(
|
|
565
627
|
fs.existsSync(path.join(tmpDir, "src", "convex", "_generated", "ai")),
|
|
566
628
|
).toBe(false);
|
|
567
629
|
|
|
568
|
-
await enableAiFiles({
|
|
630
|
+
const newAiFiles = await enableAiFiles({
|
|
631
|
+
projectDir: tmpDir,
|
|
632
|
+
convexDir,
|
|
633
|
+
aiFilesConfig: readJson(projectConfigPath()).aiFiles,
|
|
634
|
+
});
|
|
635
|
+
patchConvexJson(tmpDir, { aiFiles: newAiFiles });
|
|
569
636
|
|
|
570
637
|
expect(fs.existsSync(guidelinesPath())).toBe(true);
|
|
571
638
|
});
|