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
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { describe, test, expect, vi, beforeEach, afterEach } from "vitest";
|
|
2
2
|
import { logMessage } from "../../../bundler/log.js";
|
|
3
3
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
} from "./
|
|
4
|
+
attemptReadAiState,
|
|
5
|
+
readAiStateOrDefault,
|
|
6
|
+
writeAiState,
|
|
7
|
+
} from "./state.js";
|
|
8
8
|
import {
|
|
9
9
|
downloadGuidelines,
|
|
10
10
|
fetchAgentSkillsSha,
|
|
@@ -14,10 +14,9 @@ import fs from "fs";
|
|
|
14
14
|
import os from "os";
|
|
15
15
|
import path from "path";
|
|
16
16
|
import {
|
|
17
|
-
|
|
17
|
+
checkAiFilesStalenessAndLog,
|
|
18
18
|
installAiFiles,
|
|
19
19
|
removeAiFiles,
|
|
20
|
-
safelyAttemptToDisableAiFiles,
|
|
21
20
|
} from "./index.js";
|
|
22
21
|
import { statusAiFiles } from "./status.js";
|
|
23
22
|
import {
|
|
@@ -42,10 +41,11 @@ vi.mock("../../../bundler/log.js", () => ({
|
|
|
42
41
|
logMessage: vi.fn(),
|
|
43
42
|
}));
|
|
44
43
|
|
|
45
|
-
vi.mock("./
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
vi.mock("./state.js", () => ({
|
|
45
|
+
attemptReadAiState: vi.fn(),
|
|
46
|
+
readAiStateOrDefault: vi.fn(),
|
|
47
|
+
writeAiState: vi.fn(),
|
|
48
|
+
hasAiState: vi.fn().mockResolvedValue(false),
|
|
49
49
|
}));
|
|
50
50
|
|
|
51
51
|
vi.mock("../versionApi.js", () => ({
|
|
@@ -69,23 +69,20 @@ vi.mock("child_process", () => ({
|
|
|
69
69
|
}));
|
|
70
70
|
|
|
71
71
|
const mockLogMessage = vi.mocked(logMessage);
|
|
72
|
-
const
|
|
73
|
-
const
|
|
74
|
-
const
|
|
75
|
-
writeAiEnabledToProjectConfig,
|
|
76
|
-
);
|
|
72
|
+
const mockAttemptReadAiState = vi.mocked(attemptReadAiState);
|
|
73
|
+
const mockReadAiStateOrDefault = vi.mocked(readAiStateOrDefault);
|
|
74
|
+
const mockWriteAiState = vi.mocked(writeAiState);
|
|
77
75
|
const mockDownloadGuidelines = vi.mocked(downloadGuidelines);
|
|
78
76
|
const mockFetchAgentSkillsSha = vi.mocked(fetchAgentSkillsSha);
|
|
79
77
|
const mockGetVersion = vi.mocked(getVersion);
|
|
80
78
|
|
|
81
|
-
/** Minimal valid
|
|
82
|
-
const
|
|
79
|
+
/** Minimal valid state used across tests; includes all required fields. */
|
|
80
|
+
const baseState = {
|
|
83
81
|
guidelinesHash: null,
|
|
84
82
|
agentsMdSectionHash: null,
|
|
85
83
|
claudeMdHash: null,
|
|
86
84
|
agentSkillsSha: null,
|
|
87
85
|
installedSkillNames: [] as string[],
|
|
88
|
-
enabled: true,
|
|
89
86
|
};
|
|
90
87
|
|
|
91
88
|
// ---------------------------------------------------------------------------
|
|
@@ -93,7 +90,9 @@ const baseConfig = {
|
|
|
93
90
|
// ---------------------------------------------------------------------------
|
|
94
91
|
|
|
95
92
|
describe("checkAiFilesStaleness", () => {
|
|
96
|
-
beforeEach(() =>
|
|
93
|
+
beforeEach(() => {
|
|
94
|
+
vi.clearAllMocks();
|
|
95
|
+
});
|
|
97
96
|
afterEach(() => {
|
|
98
97
|
vi.unstubAllEnvs();
|
|
99
98
|
vi.resetAllMocks();
|
|
@@ -103,16 +102,16 @@ describe("checkAiFilesStaleness", () => {
|
|
|
103
102
|
const dummyConvexDir = "/tmp/test-project/convex";
|
|
104
103
|
|
|
105
104
|
test("logs install nudge when no state file exists, even with null canonical values", async () => {
|
|
106
|
-
|
|
105
|
+
mockAttemptReadAiState.mockResolvedValue({ kind: "no-file" });
|
|
107
106
|
|
|
108
|
-
await
|
|
107
|
+
await checkAiFilesStalenessAndLog({
|
|
109
108
|
canonicalGuidelinesHash: null,
|
|
110
109
|
canonicalAgentSkillsSha: null,
|
|
111
110
|
projectDir: dummyProjectDir,
|
|
112
111
|
convexDir: dummyConvexDir,
|
|
113
112
|
});
|
|
114
113
|
|
|
115
|
-
expect(
|
|
114
|
+
expect(mockAttemptReadAiState).toHaveBeenCalled();
|
|
116
115
|
expect(mockLogMessage).toHaveBeenCalledWith(
|
|
117
116
|
expect.stringContaining("npx convex ai-files install"),
|
|
118
117
|
);
|
|
@@ -121,13 +120,13 @@ describe("checkAiFilesStaleness", () => {
|
|
|
121
120
|
);
|
|
122
121
|
});
|
|
123
122
|
|
|
124
|
-
test("does nothing when both canonical values are null but
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
guidelinesHash: "some-hash",
|
|
123
|
+
test("does nothing when both canonical values are null but state exists (version server unavailable)", async () => {
|
|
124
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
125
|
+
kind: "ok",
|
|
126
|
+
state: { ...baseState, guidelinesHash: "some-hash" },
|
|
128
127
|
});
|
|
129
128
|
|
|
130
|
-
await
|
|
129
|
+
await checkAiFilesStalenessAndLog({
|
|
131
130
|
canonicalGuidelinesHash: null,
|
|
132
131
|
canonicalAgentSkillsSha: null,
|
|
133
132
|
projectDir: dummyProjectDir,
|
|
@@ -138,9 +137,9 @@ describe("checkAiFilesStaleness", () => {
|
|
|
138
137
|
});
|
|
139
138
|
|
|
140
139
|
test("logs install nudge when no state file exists, even if canonical hashes are available", async () => {
|
|
141
|
-
|
|
140
|
+
mockAttemptReadAiState.mockResolvedValue({ kind: "no-file" });
|
|
142
141
|
|
|
143
|
-
await
|
|
142
|
+
await checkAiFilesStalenessAndLog({
|
|
144
143
|
canonicalGuidelinesHash: "canonical-hash",
|
|
145
144
|
canonicalAgentSkillsSha: null,
|
|
146
145
|
projectDir: dummyProjectDir,
|
|
@@ -159,14 +158,12 @@ describe("checkAiFilesStaleness", () => {
|
|
|
159
158
|
});
|
|
160
159
|
|
|
161
160
|
test("does nothing when config has enabled=false (user opted out)", async () => {
|
|
162
|
-
|
|
163
|
-
...baseConfig,
|
|
164
|
-
enabled: false,
|
|
165
|
-
});
|
|
161
|
+
mockAttemptReadAiState.mockResolvedValue({ kind: "no-file" });
|
|
166
162
|
|
|
167
|
-
await
|
|
163
|
+
await checkAiFilesStalenessAndLog({
|
|
168
164
|
canonicalGuidelinesHash: "canonical-hash",
|
|
169
165
|
canonicalAgentSkillsSha: null,
|
|
166
|
+
aiFilesConfig: { enabled: false },
|
|
170
167
|
projectDir: dummyProjectDir,
|
|
171
168
|
convexDir: dummyConvexDir,
|
|
172
169
|
});
|
|
@@ -175,12 +172,12 @@ describe("checkAiFilesStaleness", () => {
|
|
|
175
172
|
});
|
|
176
173
|
|
|
177
174
|
test("does nothing when stored guidelines hash matches canonical", async () => {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
guidelinesHash: "same-hash",
|
|
175
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
176
|
+
kind: "ok",
|
|
177
|
+
state: { ...baseState, guidelinesHash: "same-hash" },
|
|
181
178
|
});
|
|
182
179
|
|
|
183
|
-
await
|
|
180
|
+
await checkAiFilesStalenessAndLog({
|
|
184
181
|
canonicalGuidelinesHash: "same-hash",
|
|
185
182
|
canonicalAgentSkillsSha: null,
|
|
186
183
|
projectDir: dummyProjectDir,
|
|
@@ -191,12 +188,12 @@ describe("checkAiFilesStaleness", () => {
|
|
|
191
188
|
});
|
|
192
189
|
|
|
193
190
|
test("logs nag message when guidelines hash is stale", async () => {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
guidelinesHash: "old-hash",
|
|
191
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
192
|
+
kind: "ok",
|
|
193
|
+
state: { ...baseState, guidelinesHash: "old-hash" },
|
|
197
194
|
});
|
|
198
195
|
|
|
199
|
-
await
|
|
196
|
+
await checkAiFilesStalenessAndLog({
|
|
200
197
|
canonicalGuidelinesHash: "new-canonical-hash",
|
|
201
198
|
canonicalAgentSkillsSha: null,
|
|
202
199
|
projectDir: dummyProjectDir,
|
|
@@ -209,13 +206,16 @@ describe("checkAiFilesStaleness", () => {
|
|
|
209
206
|
});
|
|
210
207
|
|
|
211
208
|
test("logs nag message when agent skills SHA is stale", async () => {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
209
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
210
|
+
kind: "ok",
|
|
211
|
+
state: {
|
|
212
|
+
...baseState,
|
|
213
|
+
guidelinesHash: "current-hash",
|
|
214
|
+
agentSkillsSha: "old-sha",
|
|
215
|
+
},
|
|
216
216
|
});
|
|
217
217
|
|
|
218
|
-
await
|
|
218
|
+
await checkAiFilesStalenessAndLog({
|
|
219
219
|
canonicalGuidelinesHash: "current-hash",
|
|
220
220
|
canonicalAgentSkillsSha: "new-sha",
|
|
221
221
|
projectDir: dummyProjectDir,
|
|
@@ -228,9 +228,12 @@ describe("checkAiFilesStaleness", () => {
|
|
|
228
228
|
});
|
|
229
229
|
|
|
230
230
|
test("does nothing when stored guidelinesHash is null (never written)", async () => {
|
|
231
|
-
|
|
231
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
232
|
+
kind: "ok",
|
|
233
|
+
state: baseState,
|
|
234
|
+
});
|
|
232
235
|
|
|
233
|
-
await
|
|
236
|
+
await checkAiFilesStalenessAndLog({
|
|
234
237
|
canonicalGuidelinesHash: "some-hash",
|
|
235
238
|
canonicalAgentSkillsSha: "some-sha",
|
|
236
239
|
projectDir: dummyProjectDir,
|
|
@@ -261,8 +264,8 @@ describe("installAiFiles", () => {
|
|
|
261
264
|
});
|
|
262
265
|
afterEach(() => vi.resetAllMocks());
|
|
263
266
|
|
|
264
|
-
test("runs full init and installs skills when no
|
|
265
|
-
|
|
267
|
+
test("runs full init and installs skills when no state exists", async () => {
|
|
268
|
+
mockReadAiStateOrDefault.mockResolvedValue(baseState);
|
|
266
269
|
|
|
267
270
|
const tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
|
|
268
271
|
const convexDir = path.join(tmpDir, "convex");
|
|
@@ -309,16 +312,16 @@ describe("installAiFiles", () => {
|
|
|
309
312
|
}
|
|
310
313
|
|
|
311
314
|
mockDownloadGuidelines.mockResolvedValue(null);
|
|
312
|
-
|
|
313
|
-
...
|
|
315
|
+
mockReadAiStateOrDefault.mockResolvedValue({
|
|
316
|
+
...baseState,
|
|
314
317
|
agentSkillsSha: "old-sha",
|
|
315
318
|
});
|
|
316
319
|
|
|
317
320
|
await installAiFiles({ projectDir: tmpDir, convexDir });
|
|
318
321
|
|
|
319
|
-
expect(
|
|
322
|
+
expect(mockWriteAiState).toHaveBeenCalledWith(
|
|
320
323
|
expect.objectContaining({
|
|
321
|
-
|
|
324
|
+
state: expect.objectContaining({
|
|
322
325
|
agentSkillsSha: "canonical-sha-abc123",
|
|
323
326
|
installedSkillNames: ["migration-helper", "schema-builder"],
|
|
324
327
|
}),
|
|
@@ -329,71 +332,11 @@ describe("installAiFiles", () => {
|
|
|
329
332
|
}
|
|
330
333
|
});
|
|
331
334
|
|
|
332
|
-
test("update does not clear enabled=false when set", async () => {
|
|
333
|
-
const tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
|
|
334
|
-
const convexDir = path.join(tmpDir, "convex");
|
|
335
|
-
try {
|
|
336
|
-
mockReadAiConfig.mockResolvedValue({
|
|
337
|
-
...baseConfig,
|
|
338
|
-
enabled: false,
|
|
339
|
-
});
|
|
340
|
-
mockDownloadGuidelines.mockResolvedValue(null);
|
|
341
|
-
|
|
342
|
-
await installAiFiles({ projectDir: tmpDir, convexDir });
|
|
343
|
-
|
|
344
|
-
expect(mockWriteAiConfig).toHaveBeenCalledWith(
|
|
345
|
-
expect.objectContaining({
|
|
346
|
-
config: expect.objectContaining({ enabled: false }),
|
|
347
|
-
}),
|
|
348
|
-
);
|
|
349
|
-
} finally {
|
|
350
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
351
|
-
}
|
|
352
|
-
});
|
|
353
|
-
|
|
354
|
-
test("update recreates convex/_generated/ai when only disable config exists", async () => {
|
|
355
|
-
const tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
|
|
356
|
-
const convexDir = path.join(tmpDir, "convex");
|
|
357
|
-
try {
|
|
358
|
-
fs.mkdirSync(convexDir, { recursive: true });
|
|
359
|
-
fs.writeFileSync(path.join(convexDir, "schema.ts"), "");
|
|
360
|
-
fs.writeFileSync(path.join(tmpDir, "convex.json"), "{}");
|
|
361
|
-
mockReadAiConfig.mockResolvedValue({
|
|
362
|
-
...baseConfig,
|
|
363
|
-
enabled: false,
|
|
364
|
-
guidelinesHash: null,
|
|
365
|
-
});
|
|
366
|
-
mockDownloadGuidelines.mockResolvedValue("fresh guidelines");
|
|
367
|
-
|
|
368
|
-
await installAiFiles({ projectDir: tmpDir, convexDir });
|
|
369
|
-
|
|
370
|
-
expect(fs.existsSync(path.join(convexDir, "_generated", "ai"))).toBe(
|
|
371
|
-
true,
|
|
372
|
-
);
|
|
373
|
-
expect(
|
|
374
|
-
fs.existsSync(
|
|
375
|
-
path.join(convexDir, "_generated", "ai", "guidelines.md"),
|
|
376
|
-
),
|
|
377
|
-
).toBe(true);
|
|
378
|
-
expect(mockWriteAiConfig).toHaveBeenCalledWith(
|
|
379
|
-
expect.objectContaining({
|
|
380
|
-
config: expect.objectContaining({
|
|
381
|
-
enabled: false,
|
|
382
|
-
guidelinesHash: expect.any(String),
|
|
383
|
-
}),
|
|
384
|
-
projectDir: tmpDir,
|
|
385
|
-
}),
|
|
386
|
-
);
|
|
387
|
-
} finally {
|
|
388
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
389
|
-
}
|
|
390
|
-
});
|
|
391
|
-
|
|
392
335
|
test("logs warning when guidelines download is unavailable", async () => {
|
|
393
336
|
const tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
|
|
394
337
|
const convexDir = path.join(tmpDir, "convex");
|
|
395
338
|
try {
|
|
396
|
-
|
|
339
|
+
mockReadAiStateOrDefault.mockResolvedValue(baseState);
|
|
397
340
|
mockDownloadGuidelines.mockResolvedValue(null);
|
|
398
341
|
|
|
399
342
|
await installAiFiles({ projectDir: tmpDir, convexDir });
|
|
@@ -410,7 +353,7 @@ describe("installAiFiles", () => {
|
|
|
410
353
|
const tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
|
|
411
354
|
const convexDir = path.join(tmpDir, "convex");
|
|
412
355
|
try {
|
|
413
|
-
|
|
356
|
+
mockReadAiStateOrDefault.mockResolvedValue(baseState);
|
|
414
357
|
mockDownloadGuidelines.mockResolvedValue("guidelines content");
|
|
415
358
|
mockGetVersion.mockResolvedValue({
|
|
416
359
|
kind: "ok",
|
|
@@ -470,28 +413,33 @@ describe("removeAiFiles", () => {
|
|
|
470
413
|
vi.resetAllMocks();
|
|
471
414
|
});
|
|
472
415
|
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
fs.
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
416
|
+
test("logs nothing-to-remove when no state and no artifacts exist", async () => {
|
|
417
|
+
mockAttemptReadAiState.mockResolvedValue({ kind: "no-file" });
|
|
418
|
+
fs.rmSync(path.join(convexDir, "_generated", "ai"), { recursive: true });
|
|
419
|
+
|
|
420
|
+
await removeAiFiles({ projectDir: tmpDir, convexDir });
|
|
421
|
+
|
|
422
|
+
expect(mockLogMessage).toHaveBeenCalledWith(
|
|
423
|
+
expect.stringContaining("nothing to remove"),
|
|
479
424
|
);
|
|
480
|
-
}
|
|
425
|
+
});
|
|
481
426
|
|
|
482
|
-
test("
|
|
483
|
-
|
|
427
|
+
test("removes ai dir even when no state file exists", async () => {
|
|
428
|
+
mockAttemptReadAiState.mockResolvedValue({ kind: "no-file" });
|
|
484
429
|
|
|
485
430
|
await removeAiFiles({ projectDir: tmpDir, convexDir });
|
|
486
431
|
|
|
487
432
|
expect(mockLogMessage).toHaveBeenCalledWith(
|
|
488
|
-
expect.stringContaining("
|
|
433
|
+
expect.stringContaining("Convex AI files removed"),
|
|
489
434
|
);
|
|
435
|
+
expect(fs.existsSync(path.join(convexDir, "_generated", "ai"))).toBe(false);
|
|
490
436
|
});
|
|
491
437
|
|
|
492
438
|
test("deletes AGENTS.md if stripping the Convex section leaves it empty", async () => {
|
|
493
|
-
|
|
494
|
-
|
|
439
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
440
|
+
kind: "ok",
|
|
441
|
+
state: baseState,
|
|
442
|
+
});
|
|
495
443
|
|
|
496
444
|
const agentsMdContent = `${AGENTS_MD_START_MARKER}\n## Convex\nGuidelines.\n${AGENTS_MD_END_MARKER}\n`;
|
|
497
445
|
fs.writeFileSync(path.join(tmpDir, "AGENTS.md"), agentsMdContent, "utf8");
|
|
@@ -502,8 +450,10 @@ describe("removeAiFiles", () => {
|
|
|
502
450
|
});
|
|
503
451
|
|
|
504
452
|
test("strips Convex section from AGENTS.md", async () => {
|
|
505
|
-
|
|
506
|
-
|
|
453
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
454
|
+
kind: "ok",
|
|
455
|
+
state: baseState,
|
|
456
|
+
});
|
|
507
457
|
|
|
508
458
|
const agentsMdContent =
|
|
509
459
|
`# My project\n\n` +
|
|
@@ -521,8 +471,10 @@ describe("removeAiFiles", () => {
|
|
|
521
471
|
});
|
|
522
472
|
|
|
523
473
|
test("deletes CLAUDE.md when it only contains the managed section", async () => {
|
|
524
|
-
|
|
525
|
-
|
|
474
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
475
|
+
kind: "ok",
|
|
476
|
+
state: baseState,
|
|
477
|
+
});
|
|
526
478
|
const managed = `${CLAUDE_MD_START_MARKER}\n## Convex\nRead guidelines.\n${CLAUDE_MD_END_MARKER}\n`;
|
|
527
479
|
fs.writeFileSync(path.join(tmpDir, "CLAUDE.md"), managed, "utf8");
|
|
528
480
|
|
|
@@ -532,8 +484,10 @@ describe("removeAiFiles", () => {
|
|
|
532
484
|
});
|
|
533
485
|
|
|
534
486
|
test("leaves CLAUDE.md when it has no managed markers", async () => {
|
|
535
|
-
|
|
536
|
-
|
|
487
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
488
|
+
kind: "ok",
|
|
489
|
+
state: baseState,
|
|
490
|
+
});
|
|
537
491
|
|
|
538
492
|
fs.writeFileSync(path.join(tmpDir, "CLAUDE.md"), "User content\n", "utf8");
|
|
539
493
|
|
|
@@ -543,8 +497,10 @@ describe("removeAiFiles", () => {
|
|
|
543
497
|
});
|
|
544
498
|
|
|
545
499
|
test("strips only the Convex section from CLAUDE.md", async () => {
|
|
546
|
-
|
|
547
|
-
|
|
500
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
501
|
+
kind: "ok",
|
|
502
|
+
state: baseState,
|
|
503
|
+
});
|
|
548
504
|
const managed = `${CLAUDE_MD_START_MARKER}\n## Convex\nRead guidelines.\n${CLAUDE_MD_END_MARKER}`;
|
|
549
505
|
fs.writeFileSync(
|
|
550
506
|
path.join(tmpDir, "CLAUDE.md"),
|
|
@@ -562,9 +518,9 @@ describe("removeAiFiles", () => {
|
|
|
562
518
|
});
|
|
563
519
|
|
|
564
520
|
test("leaves CLAUDE.md alone when it has no managed markers (legacy)", async () => {
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
claudeMdHash: "some-hash",
|
|
521
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
522
|
+
kind: "ok",
|
|
523
|
+
state: { ...baseState, claudeMdHash: "some-hash" },
|
|
568
524
|
});
|
|
569
525
|
|
|
570
526
|
fs.writeFileSync(
|
|
@@ -583,9 +539,9 @@ describe("removeAiFiles", () => {
|
|
|
583
539
|
|
|
584
540
|
test("calls skills remove for each tracked skill name", async () => {
|
|
585
541
|
const skillNames = ["migration-helper", "schema-builder"];
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
installedSkillNames: skillNames,
|
|
542
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
543
|
+
kind: "ok",
|
|
544
|
+
state: { ...baseState, installedSkillNames: skillNames },
|
|
589
545
|
});
|
|
590
546
|
|
|
591
547
|
await removeAiFiles({ projectDir: tmpDir, convexDir });
|
|
@@ -602,10 +558,9 @@ describe("removeAiFiles", () => {
|
|
|
602
558
|
|
|
603
559
|
test("deletes skills-lock.json if it becomes empty after removing our skills", async () => {
|
|
604
560
|
const skillNames = ["migration-helper"];
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
...
|
|
608
|
-
installedSkillNames: skillNames,
|
|
561
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
562
|
+
kind: "ok",
|
|
563
|
+
state: { ...baseState, installedSkillNames: skillNames },
|
|
609
564
|
});
|
|
610
565
|
|
|
611
566
|
const lockfileContent = {
|
|
@@ -627,10 +582,9 @@ describe("removeAiFiles", () => {
|
|
|
627
582
|
|
|
628
583
|
test("preserves skills-lock.json if it contains other skills", async () => {
|
|
629
584
|
const skillNames = ["migration-helper"];
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
...
|
|
633
|
-
installedSkillNames: skillNames,
|
|
585
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
586
|
+
kind: "ok",
|
|
587
|
+
state: { ...baseState, installedSkillNames: skillNames },
|
|
634
588
|
});
|
|
635
589
|
|
|
636
590
|
const lockfileContent = {
|
|
@@ -653,9 +607,9 @@ describe("removeAiFiles", () => {
|
|
|
653
607
|
|
|
654
608
|
test("skips skills remove when server kill switch is enabled", async () => {
|
|
655
609
|
const skillNames = ["migration-helper"];
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
installedSkillNames: skillNames,
|
|
610
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
611
|
+
kind: "ok",
|
|
612
|
+
state: { ...baseState, installedSkillNames: skillNames },
|
|
659
613
|
});
|
|
660
614
|
mockGetVersion.mockResolvedValue({
|
|
661
615
|
kind: "ok",
|
|
@@ -680,45 +634,15 @@ describe("removeAiFiles", () => {
|
|
|
680
634
|
);
|
|
681
635
|
});
|
|
682
636
|
|
|
683
|
-
test("does NOT write
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
await removeAiFiles({ projectDir: tmpDir, convexDir });
|
|
688
|
-
|
|
689
|
-
expect(mockWriteAiConfig).not.toHaveBeenCalled();
|
|
690
|
-
});
|
|
691
|
-
|
|
692
|
-
test("safelyAttemptToDisableAiFiles writes enabled=false without removing files", async () => {
|
|
693
|
-
writeConfig({ guidelinesHash: null });
|
|
694
|
-
mockReadAiConfig.mockResolvedValue(baseConfig);
|
|
695
|
-
|
|
696
|
-
fs.writeFileSync(
|
|
697
|
-
path.join(convexDir, "_generated", "ai", "guidelines.md"),
|
|
698
|
-
"guidelines content",
|
|
699
|
-
"utf8",
|
|
700
|
-
);
|
|
701
|
-
|
|
702
|
-
await safelyAttemptToDisableAiFiles(tmpDir);
|
|
703
|
-
|
|
704
|
-
expect(mockWriteAiEnabledToProjectConfig).toHaveBeenCalledWith({
|
|
705
|
-
enabled: false,
|
|
706
|
-
projectDir: tmpDir,
|
|
637
|
+
test("does NOT write state after plain remove", async () => {
|
|
638
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
639
|
+
kind: "ok",
|
|
640
|
+
state: baseState,
|
|
707
641
|
});
|
|
708
|
-
expect(
|
|
709
|
-
fs.existsSync(path.join(convexDir, "_generated", "ai", "guidelines.md")),
|
|
710
|
-
).toBe(true);
|
|
711
|
-
});
|
|
712
|
-
|
|
713
|
-
test("safelyAttemptToDisableAiFiles writes config to project root, not convex dir", async () => {
|
|
714
|
-
mockReadAiConfig.mockResolvedValue(null);
|
|
715
642
|
|
|
716
|
-
await
|
|
643
|
+
await removeAiFiles({ projectDir: tmpDir, convexDir });
|
|
717
644
|
|
|
718
|
-
expect(
|
|
719
|
-
enabled: false,
|
|
720
|
-
projectDir: tmpDir,
|
|
721
|
-
});
|
|
645
|
+
expect(mockWriteAiState).not.toHaveBeenCalled();
|
|
722
646
|
});
|
|
723
647
|
});
|
|
724
648
|
|
|
@@ -744,8 +668,8 @@ describe("statusAiFiles", () => {
|
|
|
744
668
|
});
|
|
745
669
|
afterEach(() => vi.resetAllMocks());
|
|
746
670
|
|
|
747
|
-
test("reports not installed when
|
|
748
|
-
|
|
671
|
+
test("reports not installed when state is missing", async () => {
|
|
672
|
+
mockAttemptReadAiState.mockResolvedValue({ kind: "no-file" });
|
|
749
673
|
|
|
750
674
|
await statusAiFiles({
|
|
751
675
|
projectDir: dummyProjectDir,
|
|
@@ -761,14 +685,10 @@ describe("statusAiFiles", () => {
|
|
|
761
685
|
});
|
|
762
686
|
|
|
763
687
|
test("reports disabled when config has enabled=false", async () => {
|
|
764
|
-
mockReadAiConfig.mockResolvedValue({
|
|
765
|
-
...baseConfig,
|
|
766
|
-
enabled: false,
|
|
767
|
-
});
|
|
768
|
-
|
|
769
688
|
await statusAiFiles({
|
|
770
689
|
projectDir: dummyProjectDir,
|
|
771
690
|
convexDir: dummyConvexDir,
|
|
691
|
+
aiFilesConfig: { enabled: false },
|
|
772
692
|
});
|
|
773
693
|
|
|
774
694
|
expect(mockLogMessage).toHaveBeenCalledWith(
|
|
@@ -779,8 +699,11 @@ describe("statusAiFiles", () => {
|
|
|
779
699
|
);
|
|
780
700
|
});
|
|
781
701
|
|
|
782
|
-
test("reports enabled when
|
|
783
|
-
|
|
702
|
+
test("reports enabled when state exists and messages are not disabled", async () => {
|
|
703
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
704
|
+
kind: "ok",
|
|
705
|
+
state: baseState,
|
|
706
|
+
});
|
|
784
707
|
|
|
785
708
|
await statusAiFiles({
|
|
786
709
|
projectDir: dummyProjectDir,
|
|
@@ -809,9 +732,9 @@ describe("statusAiFiles", () => {
|
|
|
809
732
|
"utf8",
|
|
810
733
|
);
|
|
811
734
|
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
guidelinesHash: hash,
|
|
735
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
736
|
+
kind: "ok",
|
|
737
|
+
state: { ...baseState, guidelinesHash: hash },
|
|
815
738
|
});
|
|
816
739
|
mockGetVersion.mockResolvedValue({
|
|
817
740
|
kind: "ok",
|
|
@@ -850,9 +773,9 @@ describe("statusAiFiles", () => {
|
|
|
850
773
|
"utf8",
|
|
851
774
|
);
|
|
852
775
|
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
guidelinesHash: hashSha256(content),
|
|
776
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
777
|
+
kind: "ok",
|
|
778
|
+
state: { ...baseState, guidelinesHash: hashSha256(content) },
|
|
856
779
|
});
|
|
857
780
|
mockGetVersion.mockResolvedValue({
|
|
858
781
|
kind: "ok",
|
|
@@ -892,9 +815,12 @@ describe("statusAiFiles", () => {
|
|
|
892
815
|
"utf8",
|
|
893
816
|
);
|
|
894
817
|
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
818
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
819
|
+
kind: "ok",
|
|
820
|
+
state: {
|
|
821
|
+
...baseState,
|
|
822
|
+
guidelinesHash: hashSha256("original content"),
|
|
823
|
+
},
|
|
898
824
|
});
|
|
899
825
|
|
|
900
826
|
await statusAiFiles({ projectDir: tmpDir, convexDir });
|
|
@@ -907,11 +833,42 @@ describe("statusAiFiles", () => {
|
|
|
907
833
|
}
|
|
908
834
|
});
|
|
909
835
|
|
|
836
|
+
test("reports guidelines as missing when guidelines.md is empty", async () => {
|
|
837
|
+
const tmpDir = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
|
|
838
|
+
const convexDir = path.join(tmpDir, "convex");
|
|
839
|
+
try {
|
|
840
|
+
fs.mkdirSync(path.join(convexDir, "_generated", "ai"), {
|
|
841
|
+
recursive: true,
|
|
842
|
+
});
|
|
843
|
+
fs.writeFileSync(
|
|
844
|
+
path.join(convexDir, "_generated", "ai", "guidelines.md"),
|
|
845
|
+
"",
|
|
846
|
+
"utf8",
|
|
847
|
+
);
|
|
848
|
+
|
|
849
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
850
|
+
kind: "ok",
|
|
851
|
+
state: baseState,
|
|
852
|
+
});
|
|
853
|
+
|
|
854
|
+
await statusAiFiles({ projectDir: tmpDir, convexDir });
|
|
855
|
+
|
|
856
|
+
expect(mockLogMessage).toHaveBeenCalledWith(
|
|
857
|
+
expect.stringContaining("guidelines.md: not on disk"),
|
|
858
|
+
);
|
|
859
|
+
} finally {
|
|
860
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
861
|
+
}
|
|
862
|
+
});
|
|
863
|
+
|
|
910
864
|
test("reports agent skills as out of date when SHA differs from canonical", async () => {
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
865
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
866
|
+
kind: "ok",
|
|
867
|
+
state: {
|
|
868
|
+
...baseState,
|
|
869
|
+
installedSkillNames: ["migration-helper"],
|
|
870
|
+
agentSkillsSha: "old-sha",
|
|
871
|
+
},
|
|
915
872
|
});
|
|
916
873
|
mockGetVersion.mockResolvedValue({
|
|
917
874
|
kind: "ok",
|
|
@@ -937,11 +894,14 @@ describe("statusAiFiles", () => {
|
|
|
937
894
|
});
|
|
938
895
|
|
|
939
896
|
test("skips staleness check when network is unavailable", async () => {
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
897
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
898
|
+
kind: "ok",
|
|
899
|
+
state: {
|
|
900
|
+
...baseState,
|
|
901
|
+
guidelinesHash: "old-hash",
|
|
902
|
+
agentSkillsSha: "old-sha",
|
|
903
|
+
installedSkillNames: ["migration-helper"],
|
|
904
|
+
},
|
|
945
905
|
});
|
|
946
906
|
mockGetVersion.mockResolvedValue({ kind: "error" });
|
|
947
907
|
|
|
@@ -955,10 +915,13 @@ describe("statusAiFiles", () => {
|
|
|
955
915
|
});
|
|
956
916
|
|
|
957
917
|
test("reports skills with names when installed", async () => {
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
918
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
919
|
+
kind: "ok",
|
|
920
|
+
state: {
|
|
921
|
+
...baseState,
|
|
922
|
+
installedSkillNames: ["migration-helper", "schema-builder"],
|
|
923
|
+
agentSkillsSha: "canonical-skills-sha",
|
|
924
|
+
},
|
|
962
925
|
});
|
|
963
926
|
|
|
964
927
|
await statusAiFiles({
|
|
@@ -983,7 +946,10 @@ describe("statusAiFiles", () => {
|
|
|
983
946
|
"User content\n",
|
|
984
947
|
"utf8",
|
|
985
948
|
);
|
|
986
|
-
|
|
949
|
+
mockAttemptReadAiState.mockResolvedValue({
|
|
950
|
+
kind: "ok",
|
|
951
|
+
state: baseState,
|
|
952
|
+
});
|
|
987
953
|
|
|
988
954
|
await statusAiFiles({ projectDir: tmpDir, convexDir });
|
|
989
955
|
|