convex 1.34.0 → 1.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +98 -43
- package/dist/browser.bundle.js +13 -10
- package/dist/browser.bundle.js.map +3 -3
- package/dist/cjs/browser/index-node.js +3 -1
- package/dist/cjs/browser/index.js +3 -1
- package/dist/cjs/browser/index.js.map +2 -2
- package/dist/cjs/browser/query_options.js.map +2 -2
- package/dist/cjs/browser/sync/authentication_manager.js +4 -1
- package/dist/cjs/browser/sync/authentication_manager.js.map +2 -2
- package/dist/cjs/browser/sync/web_socket_manager.js +1 -7
- package/dist/cjs/browser/sync/web_socket_manager.js.map +2 -2
- package/dist/cjs/cli/aiFiles.js +39 -20
- package/dist/cjs/cli/aiFiles.js.map +3 -3
- package/dist/cjs/cli/codegen_templates/readme.js +14 -1
- package/dist/cjs/cli/codegen_templates/readme.js.map +2 -2
- package/dist/cjs/cli/configure.js +34 -32
- package/dist/cjs/cli/configure.js.map +2 -2
- package/dist/cjs/cli/deploy.js +7 -8
- package/dist/cjs/cli/deploy.js.map +2 -2
- package/dist/cjs/cli/deploymentCreate.js +225 -40
- package/dist/cjs/cli/deploymentCreate.js.map +3 -3
- package/dist/cjs/cli/deploymentSelect.js +14 -13
- package/dist/cjs/cli/deploymentSelect.js.map +2 -2
- package/dist/cjs/cli/dev.js +30 -11
- package/dist/cjs/cli/dev.js.map +2 -2
- package/dist/cjs/cli/docs.js +1 -1
- package/dist/cjs/cli/docs.js.map +2 -2
- package/dist/cjs/cli/init.js +1 -1
- package/dist/cjs/cli/init.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/agentsmd.js +73 -0
- package/dist/cjs/cli/lib/aiFiles/agentsmd.js.map +7 -0
- package/dist/cjs/cli/lib/aiFiles/claudemd.js +73 -0
- package/dist/cjs/cli/lib/aiFiles/claudemd.js.map +7 -0
- package/dist/cjs/cli/lib/aiFiles/cursorrules.js +48 -0
- package/dist/cjs/cli/lib/aiFiles/cursorrules.js.map +7 -0
- package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js +58 -0
- package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js.map +7 -0
- package/dist/cjs/cli/lib/aiFiles/index.js +215 -0
- package/dist/cjs/cli/lib/aiFiles/index.js.map +7 -0
- package/dist/cjs/cli/lib/aiFiles/paths.js.map +7 -0
- package/dist/cjs/cli/lib/aiFiles/skills.js +196 -0
- package/dist/cjs/cli/lib/aiFiles/skills.js.map +7 -0
- package/dist/cjs/cli/lib/aiFiles/state.js +96 -0
- package/dist/cjs/cli/lib/aiFiles/state.js.map +7 -0
- package/dist/cjs/cli/lib/aiFiles/status.js +198 -0
- package/dist/cjs/cli/lib/aiFiles/status.js.map +7 -0
- package/dist/cjs/cli/lib/aiFiles/utils.js +128 -0
- package/dist/cjs/cli/lib/aiFiles/utils.js.map +7 -0
- package/dist/cjs/cli/lib/api.js +70 -7
- package/dist/cjs/cli/lib/api.js.map +2 -2
- package/dist/cjs/cli/lib/command.js +10 -6
- package/dist/cjs/cli/lib/command.js.map +2 -2
- package/dist/cjs/cli/lib/config.js +43 -7
- package/dist/cjs/cli/lib/config.js.map +3 -3
- package/dist/cjs/cli/lib/deploy2.js +9 -26
- package/dist/cjs/cli/lib/deploy2.js.map +2 -2
- package/dist/cjs/cli/lib/deployApi/componentDefinition.js +4 -1
- package/dist/cjs/cli/lib/deployApi/componentDefinition.js.map +2 -2
- package/dist/cjs/cli/lib/deploymentSelection.js +45 -2
- package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/cjs/cli/lib/deploymentSelector.js +1 -0
- package/dist/cjs/cli/lib/deploymentSelector.js.map +2 -2
- package/dist/cjs/cli/lib/dev.js +162 -117
- package/dist/cjs/cli/lib/dev.js.map +2 -2
- package/dist/cjs/cli/lib/env.js +1 -13
- package/dist/cjs/cli/lib/env.js.map +2 -2
- package/dist/cjs/cli/lib/expiration.js +104 -0
- package/dist/cjs/cli/lib/expiration.js.map +7 -0
- package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
- package/dist/cjs/cli/lib/init.js +4 -3
- package/dist/cjs/cli/lib/init.js.map +2 -2
- package/dist/cjs/cli/lib/insights.js +1 -1
- package/dist/cjs/cli/lib/insights.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/anonymous.js +15 -8
- package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/localDeployment.js +8 -10
- package/dist/cjs/cli/lib/localDeployment/localDeployment.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/run.js +1 -0
- package/dist/cjs/cli/lib/localDeployment/run.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/upgrade.js +2 -2
- package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/utils.js +9 -0
- package/dist/cjs/cli/lib/localDeployment/utils.js.map +2 -2
- package/dist/cjs/cli/lib/mcp/tools/status.js +1 -1
- package/dist/cjs/cli/lib/mcp/tools/status.js.map +2 -2
- package/dist/cjs/cli/lib/updates.js +12 -13
- package/dist/cjs/cli/lib/updates.js.map +2 -2
- package/dist/cjs/cli/lib/usage.js +2 -1
- package/dist/cjs/cli/lib/usage.js.map +2 -2
- package/dist/cjs/cli/lib/utils/prompts.js +2 -1
- package/dist/cjs/cli/lib/utils/prompts.js.map +2 -2
- package/dist/cjs/cli/lib/utils/utils.js +46 -20
- package/dist/cjs/cli/lib/utils/utils.js.map +3 -3
- package/dist/cjs/cli/lib/versionApi.js +7 -4
- package/dist/cjs/cli/lib/versionApi.js.map +2 -2
- package/dist/cjs/cli/lib/workos/workos.js +4 -6
- package/dist/cjs/cli/lib/workos/workos.js.map +2 -2
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/react/client.js +43 -6
- package/dist/cjs/react/client.js.map +2 -2
- package/dist/cjs/react/index.js +2 -0
- package/dist/cjs/react/index.js.map +2 -2
- package/dist/cjs/react-clerk/ConvexProviderWithClerk.js.map +1 -1
- package/dist/cjs/server/api.js.map +2 -2
- package/dist/cjs/server/components/definition.js.map +1 -1
- package/dist/cjs/server/components/index.js +40 -4
- package/dist/cjs/server/components/index.js.map +2 -2
- package/dist/cjs/server/data_model.js.map +1 -1
- package/dist/cjs/server/impl/meta_impl.js +78 -0
- package/dist/cjs/server/impl/meta_impl.js.map +7 -0
- package/dist/cjs/server/impl/registration_impl.js +16 -11
- package/dist/cjs/server/impl/registration_impl.js.map +2 -2
- package/dist/cjs/server/index.js.map +2 -2
- package/dist/cjs/server/meta.js +17 -0
- package/dist/cjs/server/meta.js.map +7 -0
- package/dist/cjs/server/registration.js.map +1 -1
- package/dist/cjs-types/browser/index.d.ts +1 -0
- package/dist/cjs-types/browser/index.d.ts.map +1 -1
- package/dist/cjs-types/browser/query_options.d.ts +12 -9
- package/dist/cjs-types/browser/query_options.d.ts.map +1 -1
- package/dist/cjs-types/browser/sync/authentication_manager.d.ts.map +1 -1
- package/dist/cjs-types/browser/sync/web_socket_manager.d.ts.map +1 -1
- package/dist/cjs-types/cli/aiFiles.d.ts.map +1 -1
- package/dist/cjs-types/cli/codegen_templates/readme.d.ts.map +1 -1
- package/dist/cjs-types/cli/configure.d.ts.map +1 -1
- package/dist/cjs-types/cli/configure.test.d.ts +2 -0
- package/dist/cjs-types/cli/configure.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/deploy.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentCreate.d.ts +1 -0
- package/dist/cjs-types/cli/deploymentCreate.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentSelect.d.ts +2 -1
- package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
- package/dist/cjs-types/cli/dev.d.ts +3 -1
- package/dist/cjs-types/cli/dev.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts +19 -0
- package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/agentsmd.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/aiFiles/agentsmd.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts +19 -0
- package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/claudemd.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/aiFiles/claudemd.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/cursorrules.d.ts +10 -0
- package/dist/cjs-types/cli/lib/aiFiles/cursorrules.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts +12 -0
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/index.d.ts +42 -0
- package/dist/cjs-types/cli/lib/aiFiles/index.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/index.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/integration.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/{ai → aiFiles}/paths.d.ts +4 -0
- package/dist/cjs-types/cli/lib/aiFiles/paths.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/prompt.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts +20 -0
- package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/state.d.ts +38 -0
- package/dist/cjs-types/cli/lib/aiFiles/state.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/status.d.ts +6 -0
- package/dist/cjs-types/cli/lib/aiFiles/status.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts +56 -0
- package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/api.d.ts +3 -3
- package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/command.d.ts +2 -1
- package/dist/cjs-types/cli/lib/command.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/config.d.ts +18 -6
- package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deploy2.d.ts +5 -2
- package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
- package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployApi/definitionConfig.d.ts +24 -24
- package/dist/cjs-types/cli/lib/deployApi/modules.d.ts +14 -14
- package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +61 -52
- package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deploymentSelector.d.ts +2 -0
- package/dist/cjs-types/cli/lib/deploymentSelector.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/env.d.ts +0 -4
- package/dist/cjs-types/cli/lib/env.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/expiration.d.ts +35 -0
- package/dist/cjs-types/cli/lib/expiration.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/expiration.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/expiration.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
- package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/init.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/run.d.ts +15 -0
- package/dist/cjs-types/cli/lib/localDeployment/run.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +7 -0
- package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/mcp/requestContext.d.ts +3 -3
- package/dist/cjs-types/cli/lib/mcp/tools/insights.d.ts +2 -2
- package/dist/cjs-types/cli/lib/updates.d.ts +4 -3
- package/dist/cjs-types/cli/lib/updates.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/usage.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/utils/prompts.d.ts +1 -0
- package/dist/cjs-types/cli/lib/utils/prompts.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/utils/utils.d.ts +16 -2
- package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/versionApi.d.ts +7 -1
- package/dist/cjs-types/cli/lib/versionApi.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/workos/workos.d.ts.map +1 -1
- package/dist/cjs-types/index.d.ts +1 -1
- package/dist/cjs-types/react/client.d.ts +54 -2
- package/dist/cjs-types/react/client.d.ts.map +1 -1
- package/dist/cjs-types/react/index.d.ts +7 -2
- package/dist/cjs-types/react/index.d.ts.map +1 -1
- package/dist/cjs-types/react/use_query_object_options.test.d.ts +5 -0
- package/dist/cjs-types/react/use_query_object_options.test.d.ts.map +1 -0
- package/dist/cjs-types/react/use_query_result.test.d.ts +5 -0
- package/dist/cjs-types/react/use_query_result.test.d.ts.map +1 -0
- package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
- package/dist/cjs-types/server/api.d.ts +5 -1
- package/dist/cjs-types/server/api.d.ts.map +1 -1
- package/dist/cjs-types/server/components/definition.d.ts +1 -0
- package/dist/cjs-types/server/components/definition.d.ts.map +1 -1
- package/dist/cjs-types/server/components/index.d.ts +5 -1
- package/dist/cjs-types/server/components/index.d.ts.map +1 -1
- package/dist/cjs-types/server/data_model.d.ts +2 -1
- package/dist/cjs-types/server/data_model.d.ts.map +1 -1
- package/dist/cjs-types/server/impl/meta_impl.d.ts +5 -0
- package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -0
- package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/index.d.ts +1 -0
- package/dist/cjs-types/server/index.d.ts.map +1 -1
- package/dist/cjs-types/server/meta.d.ts +72 -0
- package/dist/cjs-types/server/meta.d.ts.map +1 -0
- package/dist/cjs-types/server/registration.d.ts.map +1 -1
- package/dist/cli.bundle.cjs +2446 -1933
- package/dist/cli.bundle.cjs.map +4 -4
- package/dist/esm/browser/index-node.js +1 -0
- package/dist/esm/browser/index.js +1 -0
- package/dist/esm/browser/index.js.map +2 -2
- package/dist/esm/browser/query_options.js.map +2 -2
- package/dist/esm/browser/sync/authentication_manager.js +4 -1
- package/dist/esm/browser/sync/authentication_manager.js.map +2 -2
- package/dist/esm/browser/sync/web_socket_manager.js +1 -7
- package/dist/esm/browser/sync/web_socket_manager.js.map +2 -2
- package/dist/esm/cli/aiFiles.js +41 -23
- package/dist/esm/cli/aiFiles.js.map +2 -2
- package/dist/esm/cli/codegen_templates/readme.js +14 -1
- package/dist/esm/cli/codegen_templates/readme.js.map +2 -2
- package/dist/esm/cli/configure.js +35 -33
- package/dist/esm/cli/configure.js.map +2 -2
- package/dist/esm/cli/deploy.js +11 -10
- package/dist/esm/cli/deploy.js.map +2 -2
- package/dist/esm/cli/deploymentCreate.js +238 -42
- package/dist/esm/cli/deploymentCreate.js.map +2 -2
- package/dist/esm/cli/deploymentSelect.js +13 -12
- package/dist/esm/cli/deploymentSelect.js.map +2 -2
- package/dist/esm/cli/dev.js +34 -13
- package/dist/esm/cli/dev.js.map +2 -2
- package/dist/esm/cli/docs.js +1 -1
- package/dist/esm/cli/docs.js.map +2 -2
- package/dist/esm/cli/init.js +2 -2
- package/dist/esm/cli/init.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/agentsmd.js +56 -0
- package/dist/esm/cli/lib/aiFiles/agentsmd.js.map +7 -0
- package/dist/esm/cli/lib/aiFiles/claudemd.js +56 -0
- package/dist/esm/cli/lib/aiFiles/claudemd.js.map +7 -0
- package/dist/esm/cli/lib/aiFiles/cursorrules.js +16 -0
- package/dist/esm/cli/lib/aiFiles/cursorrules.js.map +7 -0
- package/dist/esm/cli/lib/aiFiles/guidelinesmd.js +35 -0
- package/dist/esm/cli/lib/aiFiles/guidelinesmd.js.map +7 -0
- package/dist/esm/cli/lib/aiFiles/index.js +193 -0
- package/dist/esm/cli/lib/aiFiles/index.js.map +7 -0
- package/dist/esm/cli/lib/aiFiles/paths.js.map +7 -0
- package/dist/esm/cli/lib/aiFiles/skills.js +163 -0
- package/dist/esm/cli/lib/aiFiles/skills.js.map +7 -0
- package/dist/esm/cli/lib/aiFiles/state.js +60 -0
- package/dist/esm/cli/lib/aiFiles/state.js.map +7 -0
- package/dist/esm/cli/lib/aiFiles/status.js +178 -0
- package/dist/esm/cli/lib/aiFiles/status.js.map +7 -0
- package/dist/esm/cli/lib/aiFiles/utils.js +97 -0
- package/dist/esm/cli/lib/aiFiles/utils.js.map +7 -0
- package/dist/esm/cli/lib/api.js +70 -7
- package/dist/esm/cli/lib/api.js.map +2 -2
- package/dist/esm/cli/lib/command.js +10 -6
- package/dist/esm/cli/lib/command.js.map +2 -2
- package/dist/esm/cli/lib/config.js +41 -6
- package/dist/esm/cli/lib/config.js.map +2 -2
- package/dist/esm/cli/lib/deploy2.js +13 -26
- package/dist/esm/cli/lib/deploy2.js.map +2 -2
- package/dist/esm/cli/lib/deployApi/componentDefinition.js +4 -1
- package/dist/esm/cli/lib/deployApi/componentDefinition.js.map +2 -2
- package/dist/esm/cli/lib/deploymentSelection.js +46 -2
- package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/esm/cli/lib/deploymentSelector.js +1 -0
- package/dist/esm/cli/lib/deploymentSelector.js.map +2 -2
- package/dist/esm/cli/lib/dev.js +162 -118
- package/dist/esm/cli/lib/dev.js.map +2 -2
- package/dist/esm/cli/lib/env.js +0 -11
- package/dist/esm/cli/lib/env.js.map +2 -2
- package/dist/esm/cli/lib/expiration.js +80 -0
- package/dist/esm/cli/lib/expiration.js.map +7 -0
- package/dist/esm/cli/lib/init.js +4 -3
- package/dist/esm/cli/lib/init.js.map +2 -2
- package/dist/esm/cli/lib/insights.js +1 -1
- package/dist/esm/cli/lib/insights.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/anonymous.js +16 -9
- package/dist/esm/cli/lib/localDeployment/anonymous.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/localDeployment.js +9 -11
- package/dist/esm/cli/lib/localDeployment/localDeployment.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/run.js +1 -1
- package/dist/esm/cli/lib/localDeployment/run.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/upgrade.js +2 -2
- package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/utils.js +8 -0
- package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
- package/dist/esm/cli/lib/mcp/tools/status.js +1 -1
- package/dist/esm/cli/lib/mcp/tools/status.js.map +2 -2
- package/dist/esm/cli/lib/updates.js +14 -12
- package/dist/esm/cli/lib/updates.js.map +2 -2
- package/dist/esm/cli/lib/usage.js +2 -1
- package/dist/esm/cli/lib/usage.js.map +2 -2
- package/dist/esm/cli/lib/utils/prompts.js +2 -1
- package/dist/esm/cli/lib/utils/prompts.js.map +2 -2
- package/dist/esm/cli/lib/utils/utils.js +45 -20
- package/dist/esm/cli/lib/utils/utils.js.map +3 -3
- package/dist/esm/cli/lib/versionApi.js +7 -4
- package/dist/esm/cli/lib/versionApi.js.map +2 -2
- package/dist/esm/cli/lib/workos/workos.js +4 -6
- package/dist/esm/cli/lib/workos/workos.js.map +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/react/client.js +43 -6
- package/dist/esm/react/client.js.map +2 -2
- package/dist/esm/react/index.js +1 -0
- package/dist/esm/react/index.js.map +2 -2
- package/dist/esm/react-clerk/ConvexProviderWithClerk.js.map +1 -1
- package/dist/esm/server/api.js.map +2 -2
- package/dist/esm/server/components/index.js +40 -4
- package/dist/esm/server/components/index.js.map +2 -2
- package/dist/esm/server/impl/meta_impl.js +54 -0
- package/dist/esm/server/impl/meta_impl.js.map +7 -0
- package/dist/esm/server/impl/registration_impl.js +20 -11
- package/dist/esm/server/impl/registration_impl.js.map +2 -2
- package/dist/esm/server/index.js.map +2 -2
- package/dist/esm/server/meta.js +2 -0
- package/dist/esm/server/meta.js.map +7 -0
- package/dist/esm-types/browser/index.d.ts +1 -0
- package/dist/esm-types/browser/index.d.ts.map +1 -1
- package/dist/esm-types/browser/query_options.d.ts +12 -9
- package/dist/esm-types/browser/query_options.d.ts.map +1 -1
- package/dist/esm-types/browser/sync/authentication_manager.d.ts.map +1 -1
- package/dist/esm-types/browser/sync/web_socket_manager.d.ts.map +1 -1
- package/dist/esm-types/cli/aiFiles.d.ts.map +1 -1
- package/dist/esm-types/cli/codegen_templates/readme.d.ts.map +1 -1
- package/dist/esm-types/cli/configure.d.ts.map +1 -1
- package/dist/esm-types/cli/configure.test.d.ts +2 -0
- package/dist/esm-types/cli/configure.test.d.ts.map +1 -0
- package/dist/esm-types/cli/deploy.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentCreate.d.ts +1 -0
- package/dist/esm-types/cli/deploymentCreate.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentSelect.d.ts +2 -1
- package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
- package/dist/esm-types/cli/dev.d.ts +3 -1
- package/dist/esm-types/cli/dev.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts +19 -0
- package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/agentsmd.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/aiFiles/agentsmd.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts +19 -0
- package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/claudemd.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/aiFiles/claudemd.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/cursorrules.d.ts +10 -0
- package/dist/esm-types/cli/lib/aiFiles/cursorrules.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts +12 -0
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/index.d.ts +42 -0
- package/dist/esm-types/cli/lib/aiFiles/index.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/index.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/integration.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/{ai → aiFiles}/paths.d.ts +4 -0
- package/dist/esm-types/cli/lib/aiFiles/paths.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/prompt.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/skills.d.ts +20 -0
- package/dist/esm-types/cli/lib/aiFiles/skills.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/state.d.ts +38 -0
- package/dist/esm-types/cli/lib/aiFiles/state.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/status.d.ts +6 -0
- package/dist/esm-types/cli/lib/aiFiles/status.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/utils.d.ts +56 -0
- package/dist/esm-types/cli/lib/aiFiles/utils.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/api.d.ts +3 -3
- package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/command.d.ts +2 -1
- package/dist/esm-types/cli/lib/command.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/config.d.ts +18 -6
- package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deploy2.d.ts +5 -2
- package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
- package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployApi/definitionConfig.d.ts +24 -24
- package/dist/esm-types/cli/lib/deployApi/modules.d.ts +14 -14
- package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +61 -52
- package/dist/esm-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deploymentSelector.d.ts +2 -0
- package/dist/esm-types/cli/lib/deploymentSelector.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/env.d.ts +0 -4
- package/dist/esm-types/cli/lib/env.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/expiration.d.ts +35 -0
- package/dist/esm-types/cli/lib/expiration.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/expiration.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/expiration.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
- package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/init.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/run.d.ts +15 -0
- package/dist/esm-types/cli/lib/localDeployment/run.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +7 -0
- package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/mcp/requestContext.d.ts +3 -3
- package/dist/esm-types/cli/lib/mcp/tools/insights.d.ts +2 -2
- package/dist/esm-types/cli/lib/updates.d.ts +4 -3
- package/dist/esm-types/cli/lib/updates.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/usage.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/utils/prompts.d.ts +1 -0
- package/dist/esm-types/cli/lib/utils/prompts.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/utils/utils.d.ts +16 -2
- package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/versionApi.d.ts +7 -1
- package/dist/esm-types/cli/lib/versionApi.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/workos/workos.d.ts.map +1 -1
- package/dist/esm-types/index.d.ts +1 -1
- package/dist/esm-types/react/client.d.ts +54 -2
- package/dist/esm-types/react/client.d.ts.map +1 -1
- package/dist/esm-types/react/index.d.ts +7 -2
- package/dist/esm-types/react/index.d.ts.map +1 -1
- package/dist/esm-types/react/use_query_object_options.test.d.ts +5 -0
- package/dist/esm-types/react/use_query_object_options.test.d.ts.map +1 -0
- package/dist/esm-types/react/use_query_result.test.d.ts +5 -0
- package/dist/esm-types/react/use_query_result.test.d.ts.map +1 -0
- package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
- package/dist/esm-types/server/api.d.ts +5 -1
- package/dist/esm-types/server/api.d.ts.map +1 -1
- package/dist/esm-types/server/components/definition.d.ts +1 -0
- package/dist/esm-types/server/components/definition.d.ts.map +1 -1
- package/dist/esm-types/server/components/index.d.ts +5 -1
- package/dist/esm-types/server/components/index.d.ts.map +1 -1
- package/dist/esm-types/server/data_model.d.ts +2 -1
- package/dist/esm-types/server/data_model.d.ts.map +1 -1
- package/dist/esm-types/server/impl/meta_impl.d.ts +5 -0
- package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -0
- package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
- package/dist/esm-types/server/index.d.ts +1 -0
- package/dist/esm-types/server/index.d.ts.map +1 -1
- package/dist/esm-types/server/meta.d.ts +72 -0
- package/dist/esm-types/server/meta.d.ts.map +1 -0
- package/dist/esm-types/server/registration.d.ts.map +1 -1
- package/dist/react.bundle.js +55 -15
- package/dist/react.bundle.js.map +3 -3
- package/package.json +11 -7
- package/schemas/convex.schema.json +22 -3
- package/src/browser/index.ts +3 -0
- package/src/browser/query_options.test.ts +0 -9
- package/src/browser/query_options.ts +36 -15
- package/src/browser/sync/authentication_manager.ts +9 -4
- package/src/browser/sync/client_node.test.ts +125 -0
- package/src/browser/sync/web_socket_manager.ts +1 -7
- package/src/cli/aiFiles.ts +56 -33
- package/src/cli/codegen_templates/readme.ts +14 -1
- package/src/cli/configure.test.ts +138 -0
- package/src/cli/configure.ts +62 -55
- package/src/cli/deploy.ts +12 -9
- package/src/cli/deploymentCreate.test.ts +349 -14
- package/src/cli/deploymentCreate.ts +268 -41
- package/src/cli/deploymentSelect.test.ts +136 -27
- package/src/cli/deploymentSelect.ts +50 -41
- package/src/cli/deploymentSelection.test.ts +399 -37
- package/src/cli/dev.ts +49 -14
- package/src/cli/docs.ts +1 -1
- package/src/cli/init.ts +2 -2
- package/src/cli/lib/{ai → aiFiles}/MANUAL_TESTING.md +6 -2
- package/src/cli/lib/aiFiles/agentsmd.test.ts +133 -0
- package/src/cli/lib/aiFiles/agentsmd.ts +81 -0
- package/src/cli/lib/aiFiles/claudemd.test.ts +92 -0
- package/src/cli/lib/aiFiles/claudemd.ts +81 -0
- package/src/cli/lib/aiFiles/cursorrules.ts +25 -0
- package/src/cli/lib/aiFiles/guidelinesmd.test.ts +50 -0
- package/src/cli/lib/aiFiles/guidelinesmd.ts +49 -0
- package/src/cli/lib/{ai → aiFiles}/index.test.ts +343 -516
- package/src/cli/lib/aiFiles/index.ts +297 -0
- package/src/cli/lib/{ai → aiFiles}/integration.test.ts +195 -158
- package/src/cli/lib/{ai → aiFiles}/paths.ts +5 -0
- package/src/cli/lib/{ai → aiFiles}/prompt.test.ts +79 -31
- package/src/cli/lib/aiFiles/skills.ts +243 -0
- package/src/cli/lib/aiFiles/state.test.ts +280 -0
- package/src/cli/lib/aiFiles/state.ts +82 -0
- package/src/cli/lib/aiFiles/status.ts +246 -0
- package/src/cli/lib/aiFiles/utils.test.ts +50 -0
- package/src/cli/lib/aiFiles/utils.ts +191 -0
- package/src/cli/lib/api.ts +88 -7
- package/src/cli/lib/command.ts +18 -8
- package/src/cli/lib/config.test.ts +185 -8
- package/src/cli/lib/config.ts +73 -12
- package/src/cli/lib/deploy2.ts +14 -27
- package/src/cli/lib/deployApi/componentDefinition.ts +4 -1
- package/src/cli/lib/deploymentSelection.ts +59 -6
- package/src/cli/lib/deploymentSelector.test.ts +6 -0
- package/src/cli/lib/deploymentSelector.ts +2 -0
- package/src/cli/lib/dev.ts +202 -153
- package/src/cli/lib/env.ts +0 -15
- package/src/cli/lib/expiration.test.ts +159 -0
- package/src/cli/lib/expiration.ts +124 -0
- package/src/cli/lib/generatedFunctionLogsApi.ts +16 -1
- package/src/cli/lib/init.ts +6 -2
- package/src/cli/lib/insights.ts +1 -1
- package/src/cli/lib/localDeployment/anonymous.ts +19 -9
- package/src/cli/lib/localDeployment/localDeployment.ts +9 -11
- package/src/cli/lib/localDeployment/run.ts +1 -1
- package/src/cli/lib/localDeployment/upgrade.ts +12 -10
- package/src/cli/lib/localDeployment/utils.ts +12 -0
- package/src/cli/lib/mcp/tools/status.ts +1 -1
- package/src/cli/lib/updates.test.ts +97 -60
- package/src/cli/lib/updates.ts +17 -15
- package/src/cli/lib/usage.ts +3 -1
- package/src/cli/lib/utils/prompts.ts +2 -0
- package/src/cli/lib/utils/utils.test.ts +6 -6
- package/src/cli/lib/utils/utils.ts +66 -27
- package/src/cli/lib/versionApi.test.ts +13 -10
- package/src/cli/lib/versionApi.ts +13 -5
- package/src/cli/lib/workos/workos.ts +4 -5
- package/src/index.ts +1 -1
- package/src/react/client.test.tsx +65 -0
- package/src/react/client.ts +129 -13
- package/src/react/index.ts +9 -1
- package/src/react/use_query_object_options.test.ts +50 -0
- package/src/react/use_query_result.test.ts +41 -0
- package/src/react-clerk/ConvexProviderWithClerk.test.tsx +1 -1
- package/src/react-clerk/ConvexProviderWithClerk.tsx +1 -1
- package/src/server/api.ts +5 -1
- package/src/server/components/definition.ts +3 -0
- package/src/server/components/index.ts +62 -5
- package/src/server/data_model.ts +2 -1
- package/src/server/impl/meta_impl.ts +74 -0
- package/src/server/impl/registration_impl.ts +21 -9
- package/src/server/index.ts +8 -0
- package/src/server/meta.ts +76 -0
- package/src/server/registration.ts +10 -0
- package/src/server/schema.test.ts +78 -1
- package/dist/cjs/cli/lib/ai/config.js +0 -144
- package/dist/cjs/cli/lib/ai/config.js.map +0 -7
- package/dist/cjs/cli/lib/ai/index.js +0 -704
- package/dist/cjs/cli/lib/ai/index.js.map +0 -7
- package/dist/cjs/cli/lib/ai/paths.js.map +0 -7
- package/dist/cjs-types/cli/lib/ai/config.d.ts +0 -50
- package/dist/cjs-types/cli/lib/ai/config.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/ai/config.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/ai/config.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/ai/index.d.ts +0 -56
- package/dist/cjs-types/cli/lib/ai/index.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/ai/index.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/ai/integration.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/ai/paths.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/ai/prompt.test.d.ts.map +0 -1
- package/dist/esm/cli/lib/ai/config.js +0 -109
- package/dist/esm/cli/lib/ai/config.js.map +0 -7
- package/dist/esm/cli/lib/ai/index.js +0 -684
- package/dist/esm/cli/lib/ai/index.js.map +0 -7
- package/dist/esm/cli/lib/ai/paths.js.map +0 -7
- package/dist/esm-types/cli/lib/ai/config.d.ts +0 -50
- package/dist/esm-types/cli/lib/ai/config.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/ai/config.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/ai/config.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/ai/index.d.ts +0 -56
- package/dist/esm-types/cli/lib/ai/index.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/ai/index.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/ai/integration.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/ai/paths.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/ai/prompt.test.d.ts.map +0 -1
- package/src/cli/lib/ai/config.test.ts +0 -338
- package/src/cli/lib/ai/config.ts +0 -159
- package/src/cli/lib/ai/index.ts +0 -1006
- /package/dist/cjs/cli/lib/{ai → aiFiles}/paths.js +0 -0
- /package/dist/cjs-types/cli/lib/{ai → aiFiles}/index.test.d.ts +0 -0
- /package/dist/cjs-types/cli/lib/{ai → aiFiles}/integration.test.d.ts +0 -0
- /package/dist/cjs-types/cli/lib/{ai → aiFiles}/prompt.test.d.ts +0 -0
- /package/dist/esm/cli/lib/{ai → aiFiles}/paths.js +0 -0
- /package/dist/esm-types/cli/lib/{ai → aiFiles}/index.test.d.ts +0 -0
- /package/dist/esm-types/cli/lib/{ai → aiFiles}/integration.test.d.ts +0 -0
- /package/dist/esm-types/cli/lib/{ai → aiFiles}/prompt.test.d.ts +0 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
import * as Sentry from "@sentry/node";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { promises as fs } from "fs";
|
|
5
|
+
import { chalkStderr } from "chalk";
|
|
6
|
+
import { logMessage } from "../../../bundler/log.js";
|
|
7
|
+
import { promptYesNo } from "../utils/prompts.js";
|
|
8
|
+
import { aiDirForConvexDir } from "./paths.js";
|
|
9
|
+
import {
|
|
10
|
+
installGuidelinesFile,
|
|
11
|
+
hasGuidelinesInstalled
|
|
12
|
+
} from "./guidelinesmd.js";
|
|
13
|
+
import {
|
|
14
|
+
attemptReadAiState,
|
|
15
|
+
readAiStateOrDefault,
|
|
16
|
+
writeAiState,
|
|
17
|
+
hasAiState
|
|
18
|
+
} from "./state.js";
|
|
19
|
+
import { exhaustiveCheck, isInInteractiveTerminal } from "./utils.js";
|
|
20
|
+
import {
|
|
21
|
+
hasAgentsMdInstalled,
|
|
22
|
+
applyAgentsMdSection,
|
|
23
|
+
attemptToRemoveAgentsMdSection
|
|
24
|
+
} from "./agentsmd.js";
|
|
25
|
+
import {
|
|
26
|
+
hasClaudeMdInstalled,
|
|
27
|
+
applyClaudeMdSection,
|
|
28
|
+
attemptToRemoveClaudeMdSection
|
|
29
|
+
} from "./claudemd.js";
|
|
30
|
+
import { installSkills, removeInstalledSkills } from "./skills.js";
|
|
31
|
+
import { removeLegacyCursorRulesFile as removeLegacyCursorRules } from "./cursorrules.js";
|
|
32
|
+
async function hasExistingAiFilesArtifacts({
|
|
33
|
+
projectDir,
|
|
34
|
+
convexDir
|
|
35
|
+
}) {
|
|
36
|
+
return await hasGuidelinesInstalled(convexDir) || await hasAgentsMdInstalled(projectDir) || await hasClaudeMdInstalled(projectDir);
|
|
37
|
+
}
|
|
38
|
+
export async function installAiFiles({
|
|
39
|
+
projectDir,
|
|
40
|
+
convexDir,
|
|
41
|
+
aiFilesConfig
|
|
42
|
+
}) {
|
|
43
|
+
const convexDirName = path.relative(projectDir, convexDir);
|
|
44
|
+
const state = await readAiStateOrDefault(convexDir);
|
|
45
|
+
await installGuidelinesFile({ convexDir, state });
|
|
46
|
+
await applyAgentsMdSection({ projectDir, state, convexDirName });
|
|
47
|
+
await applyClaudeMdSection({ projectDir, state, convexDirName });
|
|
48
|
+
await installSkills({ projectDir, state, aiFilesConfig });
|
|
49
|
+
await removeLegacyCursorRules(projectDir);
|
|
50
|
+
await writeAiState({ state, convexDir });
|
|
51
|
+
}
|
|
52
|
+
async function attemptToInstallAiFiles(opts) {
|
|
53
|
+
try {
|
|
54
|
+
await installAiFiles(opts);
|
|
55
|
+
} catch (error) {
|
|
56
|
+
Sentry.captureException(error);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export function isAiFilesDisabled(aiFilesConfig) {
|
|
60
|
+
if (aiFilesConfig?.enabled !== void 0)
|
|
61
|
+
return aiFilesConfig.enabled === false;
|
|
62
|
+
return aiFilesConfig?.disableStalenessMessage === true;
|
|
63
|
+
}
|
|
64
|
+
async function determineAiFilesStaleness({
|
|
65
|
+
canonicalGuidelinesHash,
|
|
66
|
+
canonicalAgentSkillsSha,
|
|
67
|
+
aiFilesConfig,
|
|
68
|
+
projectDir,
|
|
69
|
+
convexDir
|
|
70
|
+
}) {
|
|
71
|
+
if (isAiFilesDisabled(aiFilesConfig)) return "silent";
|
|
72
|
+
const result = await attemptReadAiState(convexDir);
|
|
73
|
+
if (result.kind === "no-file" || result.kind === "parse-error") {
|
|
74
|
+
const hasArtifacts = await hasExistingAiFilesArtifacts({
|
|
75
|
+
projectDir,
|
|
76
|
+
convexDir
|
|
77
|
+
});
|
|
78
|
+
return hasArtifacts ? "silent" : "not-installed";
|
|
79
|
+
}
|
|
80
|
+
if (result.kind === "ok") {
|
|
81
|
+
const { state } = result;
|
|
82
|
+
if (canonicalGuidelinesHash === null && canonicalAgentSkillsSha === null)
|
|
83
|
+
return "silent";
|
|
84
|
+
const guidelinesStale = canonicalGuidelinesHash !== null && state.guidelinesHash !== null && state.guidelinesHash !== canonicalGuidelinesHash;
|
|
85
|
+
const skillsStale = canonicalAgentSkillsSha !== null && state.agentSkillsSha !== null && state.agentSkillsSha !== canonicalAgentSkillsSha;
|
|
86
|
+
return guidelinesStale || skillsStale ? "stale" : "silent";
|
|
87
|
+
}
|
|
88
|
+
return exhaustiveCheck(result);
|
|
89
|
+
}
|
|
90
|
+
export async function checkAiFilesStalenessAndLog(opts) {
|
|
91
|
+
const status = await determineAiFilesStaleness(opts);
|
|
92
|
+
if (status === "not-installed") {
|
|
93
|
+
logMessage(
|
|
94
|
+
chalkStderr.yellow(
|
|
95
|
+
`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.`
|
|
96
|
+
)
|
|
97
|
+
);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (status === "stale") {
|
|
101
|
+
logMessage(
|
|
102
|
+
chalkStderr.yellow(
|
|
103
|
+
`Your Convex AI files are out of date. Run ${chalkStderr.bold(`npx convex ai-files update`)} to get the latest.`
|
|
104
|
+
)
|
|
105
|
+
);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (status === "silent") return;
|
|
109
|
+
exhaustiveCheck(status);
|
|
110
|
+
}
|
|
111
|
+
export async function enableAiFiles({
|
|
112
|
+
projectDir,
|
|
113
|
+
convexDir,
|
|
114
|
+
aiFilesConfig
|
|
115
|
+
}) {
|
|
116
|
+
await installAiFiles({ projectDir, convexDir, aiFilesConfig });
|
|
117
|
+
const { disableStalenessMessage: _, ...rest } = aiFilesConfig ?? {};
|
|
118
|
+
return { ...rest, enabled: true };
|
|
119
|
+
}
|
|
120
|
+
export function disableAiFiles(aiFilesConfig) {
|
|
121
|
+
const { disableStalenessMessage: _, ...rest } = aiFilesConfig ?? {};
|
|
122
|
+
return { ...rest, enabled: false };
|
|
123
|
+
}
|
|
124
|
+
export async function removeAiFiles({
|
|
125
|
+
projectDir,
|
|
126
|
+
convexDir
|
|
127
|
+
}) {
|
|
128
|
+
const result = await attemptReadAiState(convexDir);
|
|
129
|
+
const installedSkillNames = result.kind === "ok" ? result.state.installedSkillNames : result.kind === "no-file" || result.kind === "parse-error" ? [] : exhaustiveCheck(result);
|
|
130
|
+
const removals = [
|
|
131
|
+
await attemptToRemoveAgentsMdSection(projectDir),
|
|
132
|
+
await attemptToRemoveClaudeMdSection(projectDir),
|
|
133
|
+
await removeInstalledSkills({
|
|
134
|
+
projectDir,
|
|
135
|
+
skillNames: installedSkillNames
|
|
136
|
+
}),
|
|
137
|
+
await removeLegacyCursorRules(projectDir),
|
|
138
|
+
await attemptToDeleteAiDir({ projectDir, convexDir })
|
|
139
|
+
];
|
|
140
|
+
if (removals.some(Boolean)) logMessage("Convex AI files removed.");
|
|
141
|
+
else logMessage("No Convex AI files found \u2014 nothing to remove.");
|
|
142
|
+
}
|
|
143
|
+
async function attemptToDeleteAiDir({
|
|
144
|
+
projectDir,
|
|
145
|
+
convexDir
|
|
146
|
+
}) {
|
|
147
|
+
const aiDir = aiDirForConvexDir(convexDir);
|
|
148
|
+
const relPath = path.relative(projectDir, aiDir);
|
|
149
|
+
try {
|
|
150
|
+
await fs.rm(aiDir, { recursive: true });
|
|
151
|
+
logMessage(`${chalkStderr.green("\u2714")} Deleted ${relPath}/`);
|
|
152
|
+
return true;
|
|
153
|
+
} catch (error) {
|
|
154
|
+
if (error.code === "ENOENT") return false;
|
|
155
|
+
Sentry.captureException(error);
|
|
156
|
+
logMessage(
|
|
157
|
+
chalkStderr.yellow(`Could not delete ${relPath}/. Remove it manually.`)
|
|
158
|
+
);
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async function hasAiFilesBeenInstalledBefore({
|
|
163
|
+
projectDir,
|
|
164
|
+
convexDir,
|
|
165
|
+
aiFilesConfig
|
|
166
|
+
}) {
|
|
167
|
+
if (isAiFilesDisabled(aiFilesConfig)) return false;
|
|
168
|
+
return await hasAiState(convexDir) || await hasExistingAiFilesArtifacts({ projectDir, convexDir });
|
|
169
|
+
}
|
|
170
|
+
export async function attemptSetupAiFiles({
|
|
171
|
+
ctx,
|
|
172
|
+
convexDir,
|
|
173
|
+
projectDir,
|
|
174
|
+
aiFilesConfig
|
|
175
|
+
}) {
|
|
176
|
+
if (!isInInteractiveTerminal()) return;
|
|
177
|
+
if (isAiFilesDisabled(aiFilesConfig)) return;
|
|
178
|
+
if (await hasAiFilesBeenInstalledBefore({
|
|
179
|
+
projectDir,
|
|
180
|
+
convexDir,
|
|
181
|
+
aiFilesConfig
|
|
182
|
+
})) {
|
|
183
|
+
await attemptToInstallAiFiles({ projectDir, convexDir, aiFilesConfig });
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const shouldInstall = await promptYesNo(ctx, {
|
|
187
|
+
message: "Set up Convex AI files? (guidelines, AGENTS.md, agent skills)",
|
|
188
|
+
default: true
|
|
189
|
+
});
|
|
190
|
+
if (shouldInstall)
|
|
191
|
+
await attemptToInstallAiFiles({ projectDir, convexDir, aiFilesConfig });
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/cli/lib/aiFiles/index.ts"],
|
|
4
|
+
"sourcesContent": ["import * as Sentry from \"@sentry/node\";\nimport path from \"path\";\nimport { Context } from \"../../../bundler/context.js\";\n// eslint-disable-next-line no-restricted-imports\nimport { promises as fs } from \"fs\";\nimport { chalkStderr } from \"chalk\";\nimport { logMessage } from \"../../../bundler/log.js\";\nimport { promptYesNo } from \"../utils/prompts.js\";\nimport { type AiFilesPaths, aiDirForConvexDir } from \"./paths.js\";\nimport {\n installGuidelinesFile,\n hasGuidelinesInstalled,\n} from \"./guidelinesmd.js\";\nimport {\n attemptReadAiState,\n readAiStateOrDefault,\n writeAiState,\n hasAiState,\n} from \"./state.js\";\nimport { type AiFilesProjectConfig } from \"../config.js\";\nimport { exhaustiveCheck, isInInteractiveTerminal } from \"./utils.js\";\nimport {\n hasAgentsMdInstalled,\n applyAgentsMdSection,\n attemptToRemoveAgentsMdSection,\n} from \"./agentsmd.js\";\nimport {\n hasClaudeMdInstalled,\n applyClaudeMdSection,\n attemptToRemoveClaudeMdSection,\n} from \"./claudemd.js\";\nimport { installSkills, removeInstalledSkills } from \"./skills.js\";\nimport { removeLegacyCursorRulesFile as removeLegacyCursorRules } from \"./cursorrules.js\";\n\nasync function hasExistingAiFilesArtifacts({\n projectDir,\n convexDir,\n}: AiFilesPaths): Promise<boolean> {\n return (\n (await hasGuidelinesInstalled(convexDir)) ||\n (await hasAgentsMdInstalled(projectDir)) ||\n (await hasClaudeMdInstalled(projectDir))\n );\n}\n\n/**\n * Install or refresh all Convex AI files.\n *\n * Reads the existing state if present, or starts from a blank one for a\n * fresh install.\n */\nexport async function installAiFiles({\n projectDir,\n convexDir,\n aiFilesConfig,\n}: AiFilesPaths & {\n aiFilesConfig?: AiFilesProjectConfig | undefined;\n}): Promise<void> {\n const convexDirName = path.relative(projectDir, convexDir);\n const state = await readAiStateOrDefault(convexDir);\n\n await installGuidelinesFile({ convexDir, state });\n await applyAgentsMdSection({ projectDir, state, convexDirName });\n await applyClaudeMdSection({ projectDir, state, convexDirName });\n await installSkills({ projectDir, state, aiFilesConfig });\n await removeLegacyCursorRules(projectDir);\n await writeAiState({ state, convexDir });\n}\n\nasync function attemptToInstallAiFiles(\n opts: Parameters<typeof installAiFiles>[0],\n): Promise<void> {\n try {\n await installAiFiles(opts);\n } catch (error) {\n Sentry.captureException(error);\n }\n}\n\ntype AiFilesStalenessStatus = \"not-installed\" | \"stale\" | \"silent\";\n\nexport function isAiFilesDisabled(\n aiFilesConfig: AiFilesProjectConfig | undefined,\n): boolean {\n if (aiFilesConfig?.enabled !== undefined)\n return aiFilesConfig.enabled === false;\n return aiFilesConfig?.disableStalenessMessage === true;\n}\n\nasync function determineAiFilesStaleness({\n canonicalGuidelinesHash,\n canonicalAgentSkillsSha,\n aiFilesConfig,\n projectDir,\n convexDir,\n}: {\n canonicalGuidelinesHash: string | null;\n canonicalAgentSkillsSha: string | null;\n aiFilesConfig?: AiFilesProjectConfig | undefined;\n} & AiFilesPaths): Promise<AiFilesStalenessStatus> {\n if (isAiFilesDisabled(aiFilesConfig)) return \"silent\";\n\n const result = await attemptReadAiState(convexDir);\n\n if (result.kind === \"no-file\" || result.kind === \"parse-error\") {\n const hasArtifacts = await hasExistingAiFilesArtifacts({\n projectDir,\n convexDir,\n });\n return hasArtifacts ? \"silent\" : \"not-installed\";\n }\n\n if (result.kind === \"ok\") {\n const { state } = result;\n\n if (canonicalGuidelinesHash === null && canonicalAgentSkillsSha === null)\n return \"silent\";\n\n const guidelinesStale =\n canonicalGuidelinesHash !== null &&\n state.guidelinesHash !== null &&\n state.guidelinesHash !== canonicalGuidelinesHash;\n\n const skillsStale =\n canonicalAgentSkillsSha !== null &&\n state.agentSkillsSha !== null &&\n state.agentSkillsSha !== canonicalAgentSkillsSha;\n\n return guidelinesStale || skillsStale ? \"stale\" : \"silent\";\n }\n\n return exhaustiveCheck(result);\n}\n\n/**\n * Check whether the Convex AI files are out of date and log a nag message\n * if so.\n */\nexport async function checkAiFilesStalenessAndLog(\n opts: {\n canonicalGuidelinesHash: string | null;\n canonicalAgentSkillsSha: string | null;\n aiFilesConfig?: AiFilesProjectConfig | undefined;\n } & AiFilesPaths,\n): Promise<void> {\n const status = await determineAiFilesStaleness(opts);\n\n if (status === \"not-installed\") {\n logMessage(\n chalkStderr.yellow(\n `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.`,\n ),\n );\n return;\n }\n\n if (status === \"stale\") {\n logMessage(\n chalkStderr.yellow(\n `Your Convex AI files are out of date. Run ${chalkStderr.bold(`npx convex ai-files update`)} to get the latest.`,\n ),\n );\n return;\n }\n\n if (status === \"silent\") return;\n\n exhaustiveCheck(status);\n}\n\n/**\n * Installs AI files and returns the aiFiles config to write.\n */\nexport async function enableAiFiles({\n projectDir,\n convexDir,\n aiFilesConfig,\n}: AiFilesPaths & {\n aiFilesConfig?: AiFilesProjectConfig | undefined;\n}): Promise<AiFilesProjectConfig> {\n await installAiFiles({ projectDir, convexDir, aiFilesConfig });\n // Deleting the deprecated disableStalenessMessage key\n const { disableStalenessMessage: _, ...rest } = aiFilesConfig ?? {};\n return { ...rest, enabled: true };\n}\n\n/**\n * Returns the aiFiles config to write when disabling AI files.\n */\nexport function disableAiFiles(\n aiFilesConfig?: AiFilesProjectConfig | undefined,\n): AiFilesProjectConfig {\n // Deleting the deprecated disableStalenessMessage key\n const { disableStalenessMessage: _, ...rest } = aiFilesConfig ?? {};\n return { ...rest, enabled: false };\n}\n\n/**\n * Remove all Convex AI files from the project.\n * Called by `npx convex ai-files remove`.\n */\nexport async function removeAiFiles({\n projectDir,\n convexDir,\n}: AiFilesPaths): Promise<void> {\n const result = await attemptReadAiState(convexDir);\n\n // Skill names are only known when the state file exists and parses.\n // All other artifacts (AGENTS.md, CLAUDE.md sections, ai dir) can exist\n // independently, so we always attempt their removal.\n const installedSkillNames =\n result.kind === \"ok\"\n ? result.state.installedSkillNames\n : result.kind === \"no-file\" || result.kind === \"parse-error\"\n ? []\n : exhaustiveCheck(result);\n\n const removals = [\n await attemptToRemoveAgentsMdSection(projectDir),\n await attemptToRemoveClaudeMdSection(projectDir),\n await removeInstalledSkills({\n projectDir,\n skillNames: installedSkillNames,\n }),\n await removeLegacyCursorRules(projectDir),\n await attemptToDeleteAiDir({ projectDir, convexDir }),\n ];\n\n if (removals.some(Boolean)) logMessage(\"Convex AI files removed.\");\n else logMessage(\"No Convex AI files found \u2014 nothing to remove.\");\n}\n\nasync function attemptToDeleteAiDir({\n projectDir,\n convexDir,\n}: AiFilesPaths): Promise<boolean> {\n const aiDir = aiDirForConvexDir(convexDir);\n const relPath = path.relative(projectDir, aiDir);\n try {\n await fs.rm(aiDir, { recursive: true });\n logMessage(`${chalkStderr.green(\"\u2714\")} Deleted ${relPath}/`);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n Sentry.captureException(error);\n logMessage(\n chalkStderr.yellow(`Could not delete ${relPath}/. Remove it manually.`),\n );\n return false;\n }\n}\n\nasync function hasAiFilesBeenInstalledBefore({\n projectDir,\n convexDir,\n aiFilesConfig,\n}: AiFilesPaths & {\n aiFilesConfig?: AiFilesProjectConfig | undefined;\n}): Promise<boolean> {\n if (isAiFilesDisabled(aiFilesConfig)) return false;\n return (\n (await hasAiState(convexDir)) ||\n (await hasExistingAiFilesArtifacts({ projectDir, convexDir }))\n );\n}\n\nexport async function attemptSetupAiFiles({\n ctx,\n convexDir,\n projectDir,\n aiFilesConfig,\n}: {\n ctx: Context;\n aiFilesConfig?: AiFilesProjectConfig | undefined;\n} & AiFilesPaths): Promise<void> {\n if (!isInInteractiveTerminal()) return;\n if (isAiFilesDisabled(aiFilesConfig)) return;\n\n if (\n await hasAiFilesBeenInstalledBefore({\n projectDir,\n convexDir,\n aiFilesConfig,\n })\n ) {\n await attemptToInstallAiFiles({ projectDir, convexDir, aiFilesConfig });\n return;\n }\n\n const shouldInstall = await promptYesNo(ctx, {\n message: \"Set up Convex AI files? (guidelines, AGENTS.md, agent skills)\",\n default: true,\n });\n\n if (shouldInstall)\n await attemptToInstallAiFiles({ projectDir, convexDir, aiFilesConfig });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/cli/lib/aiFiles/paths.ts"],
|
|
4
|
+
"sourcesContent": ["import path from \"path\";\n\nexport type AiFilesPaths = {\n projectDir: string;\n convexDir: string;\n};\n\nconst AI_FILES_PARENT_DIR = \"_generated\";\nconst AI_FILES_DIR = \"ai\";\n\nexport function aiDirForConvexDir(convexDir: string): string {\n return path.join(convexDir, AI_FILES_PARENT_DIR, AI_FILES_DIR);\n}\n\nexport function guidelinesPathForConvexDir(convexDir: string): string {\n return path.join(aiDirForConvexDir(convexDir), \"guidelines.md\");\n}\n\nexport function aiFilesStatePathForConvexDir(convexDir: string): string {\n return path.join(aiDirForConvexDir(convexDir), \"ai-files.state.json\");\n}\n\nexport function agentsMdPath(projectDir?: string): string {\n return path.join(projectDir ?? process.cwd(), \"AGENTS.md\");\n}\n\nexport function claudeMdPath(projectDir?: string): string {\n return path.join(projectDir ?? process.cwd(), \"CLAUDE.md\");\n}\n"],
|
|
5
|
+
"mappings": ";AAAA,OAAO,UAAU;AAOjB,MAAM,sBAAsB;AAC5B,MAAM,eAAe;AAEd,gBAAS,kBAAkB,WAA2B;AAC3D,SAAO,KAAK,KAAK,WAAW,qBAAqB,YAAY;AAC/D;AAEO,gBAAS,2BAA2B,WAA2B;AACpE,SAAO,KAAK,KAAK,kBAAkB,SAAS,GAAG,eAAe;AAChE;AAEO,gBAAS,6BAA6B,WAA2B;AACtE,SAAO,KAAK,KAAK,kBAAkB,SAAS,GAAG,qBAAqB;AACtE;AAEO,gBAAS,aAAa,YAA6B;AACxD,SAAO,KAAK,KAAK,cAAc,QAAQ,IAAI,GAAG,WAAW;AAC3D;AAEO,gBAAS,aAAa,YAA6B;AACxD,SAAO,KAAK,KAAK,cAAc,QAAQ,IAAI,GAAG,WAAW;AAC3D;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
import child_process from "child_process";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { promises as fs } from "fs";
|
|
5
|
+
import { chalkStderr } from "chalk";
|
|
6
|
+
import { logMessage } from "../../../bundler/log.js";
|
|
7
|
+
import { getVersion, fetchAgentSkillsSha } from "../versionApi.js";
|
|
8
|
+
import { exhaustiveCheck, iife, readFileOrNull } from "./utils.js";
|
|
9
|
+
async function readInstalledSkillNames(projectDir) {
|
|
10
|
+
const skillsDir = path.join(projectDir, ".agents", "skills");
|
|
11
|
+
const entries = await iife(async () => {
|
|
12
|
+
try {
|
|
13
|
+
const dirents = await fs.readdir(skillsDir, { withFileTypes: true });
|
|
14
|
+
return dirents.filter((d) => d.isDirectory() || d.isSymbolicLink()).map((d) => d.name);
|
|
15
|
+
} catch {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
if (entries.length === 0) return [];
|
|
20
|
+
const names = [];
|
|
21
|
+
for (const entry of entries) {
|
|
22
|
+
const skillMdPath = path.join(skillsDir, entry, "SKILL.md");
|
|
23
|
+
const content = await readFileOrNull(skillMdPath);
|
|
24
|
+
if (content === null) continue;
|
|
25
|
+
const match = content.match(/^---[\s\S]*?^name:\s*(.+?)\s*$/m);
|
|
26
|
+
if (match) {
|
|
27
|
+
names.push(match[1]);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return names;
|
|
31
|
+
}
|
|
32
|
+
function configuredSkillAgents(aiFilesConfig) {
|
|
33
|
+
const defaultAgents = ["claude-code", "codex"];
|
|
34
|
+
return aiFilesConfig?.skills?.agents ?? defaultAgents;
|
|
35
|
+
}
|
|
36
|
+
function runSkillsAdd(cwd, agents) {
|
|
37
|
+
const args = ["add", "get-convex/agent-skills", "--yes"];
|
|
38
|
+
for (const agent of agents) {
|
|
39
|
+
args.push("--agent", agent);
|
|
40
|
+
}
|
|
41
|
+
return runSkillsCommand(cwd, args);
|
|
42
|
+
}
|
|
43
|
+
function runSkillsRemove({
|
|
44
|
+
cwd,
|
|
45
|
+
skillNames
|
|
46
|
+
}) {
|
|
47
|
+
return runSkillsCommand(cwd, ["remove", ...skillNames, "--yes"]);
|
|
48
|
+
}
|
|
49
|
+
async function shouldRunSkillsCli() {
|
|
50
|
+
const versionData = await getVersion();
|
|
51
|
+
if (versionData.kind === "error") return true;
|
|
52
|
+
if (versionData.kind === "ok") {
|
|
53
|
+
if (versionData.data.disableSkillsCli) {
|
|
54
|
+
logMessage(chalkStderr.yellow(`Agent skills are temporarily disabled.`));
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
return exhaustiveCheck(versionData);
|
|
60
|
+
}
|
|
61
|
+
async function removeSkillsLockIfEmpty({
|
|
62
|
+
projectDir,
|
|
63
|
+
removedSkillNames
|
|
64
|
+
}) {
|
|
65
|
+
const lockPath = path.join(projectDir, "skills-lock.json");
|
|
66
|
+
try {
|
|
67
|
+
const content = await fs.readFile(lockPath, "utf8");
|
|
68
|
+
const lock = JSON.parse(content);
|
|
69
|
+
if (!lock || typeof lock !== "object" || !lock.skills || typeof lock.skills !== "object") {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
const remainingSkills = Object.keys(lock.skills).filter(
|
|
73
|
+
(name) => !removedSkillNames.includes(name)
|
|
74
|
+
);
|
|
75
|
+
if (remainingSkills.length === 0) {
|
|
76
|
+
await fs.unlink(lockPath);
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
} catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export async function installSkills({
|
|
85
|
+
projectDir,
|
|
86
|
+
state,
|
|
87
|
+
aiFilesConfig
|
|
88
|
+
}) {
|
|
89
|
+
if (!await shouldRunSkillsCli()) return;
|
|
90
|
+
const agents = configuredSkillAgents(aiFilesConfig);
|
|
91
|
+
if (agents.length === 0) return;
|
|
92
|
+
logMessage("Installing Convex agent skills...");
|
|
93
|
+
const skillsOk = await runSkillsAdd(projectDir, agents);
|
|
94
|
+
if (!skillsOk) {
|
|
95
|
+
logMessage(
|
|
96
|
+
chalkStderr.yellow(
|
|
97
|
+
"Could not install agent skills. You can retry manually with: npx skills add get-convex/agent-skills"
|
|
98
|
+
)
|
|
99
|
+
);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const sha = await fetchAgentSkillsSha();
|
|
103
|
+
if (sha) state.agentSkillsSha = sha;
|
|
104
|
+
const names = await readInstalledSkillNames(projectDir);
|
|
105
|
+
if (names.length > 0) state.installedSkillNames = names;
|
|
106
|
+
logMessage(`${chalkStderr.green("\u2714")} Skills installed`);
|
|
107
|
+
}
|
|
108
|
+
export async function removeInstalledSkills({
|
|
109
|
+
projectDir,
|
|
110
|
+
skillNames
|
|
111
|
+
}) {
|
|
112
|
+
if (skillNames.length === 0) return false;
|
|
113
|
+
if (!await shouldRunSkillsCli()) return false;
|
|
114
|
+
logMessage(`Removing Convex agent skills: ${skillNames.join(", ")}`);
|
|
115
|
+
const skillsOk = await runSkillsRemove({ cwd: projectDir, skillNames });
|
|
116
|
+
if (!skillsOk) {
|
|
117
|
+
logMessage(
|
|
118
|
+
chalkStderr.yellow(
|
|
119
|
+
"Could not remove agent skills automatically. Remove them manually with: npx skills remove"
|
|
120
|
+
)
|
|
121
|
+
);
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
const lockRemoved = await removeSkillsLockIfEmpty({
|
|
125
|
+
projectDir,
|
|
126
|
+
removedSkillNames: skillNames
|
|
127
|
+
});
|
|
128
|
+
if (lockRemoved)
|
|
129
|
+
logMessage(`${chalkStderr.green("\u2714")} Deleted skills-lock.json.`);
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
function runSkillsCommand(cwd, args) {
|
|
133
|
+
return new Promise((resolve) => {
|
|
134
|
+
const proc = child_process.spawn(
|
|
135
|
+
"npx",
|
|
136
|
+
["--yes", "skills@latest", ...args],
|
|
137
|
+
{
|
|
138
|
+
cwd,
|
|
139
|
+
stdio: "pipe",
|
|
140
|
+
// .cmd files on Windows require shell execution.
|
|
141
|
+
shell: process.platform === "win32"
|
|
142
|
+
}
|
|
143
|
+
);
|
|
144
|
+
let capturedOutput = "";
|
|
145
|
+
proc.stdout?.on("data", (chunk) => {
|
|
146
|
+
capturedOutput += chunk.toString();
|
|
147
|
+
});
|
|
148
|
+
proc.stderr?.on("data", (chunk) => {
|
|
149
|
+
capturedOutput += chunk.toString();
|
|
150
|
+
});
|
|
151
|
+
proc.on("close", (code) => {
|
|
152
|
+
if (code !== 0 && capturedOutput.trim().length > 0) {
|
|
153
|
+
const lines = capturedOutput.trim().split(/\r?\n/);
|
|
154
|
+
const tail = lines.slice(-10).join("\n");
|
|
155
|
+
logMessage(chalkStderr.gray(`skills output (tail):
|
|
156
|
+
${tail}`));
|
|
157
|
+
}
|
|
158
|
+
resolve(code === 0);
|
|
159
|
+
});
|
|
160
|
+
proc.on("error", () => resolve(false));
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/cli/lib/aiFiles/skills.ts"],
|
|
4
|
+
"sourcesContent": ["import child_process from \"child_process\";\nimport path from \"path\";\n// eslint-disable-next-line no-restricted-imports\nimport { promises as fs } from \"fs\";\nimport { chalkStderr } from \"chalk\";\nimport { logMessage } from \"../../../bundler/log.js\";\nimport { getVersion, fetchAgentSkillsSha } from \"../versionApi.js\";\nimport { type AiFilesState } from \"./state.js\";\nimport { exhaustiveCheck, iife, readFileOrNull } from \"./utils.js\";\n\nimport { type AiFilesProjectConfig } from \"../config.js\";\n\n/**\n * Read the frontmatter `name:` values from skills installed by the skills CLI.\n */\nasync function readInstalledSkillNames(projectDir: string): Promise<string[]> {\n const skillsDir = path.join(projectDir, \".agents\", \"skills\");\n const entries = await iife(async () => {\n try {\n const dirents = await fs.readdir(skillsDir, { withFileTypes: true });\n return dirents\n .filter((d) => d.isDirectory() || d.isSymbolicLink())\n .map((d) => d.name);\n } catch {\n return [] as string[];\n }\n });\n if (entries.length === 0) return [];\n\n const names: string[] = [];\n for (const entry of entries) {\n const skillMdPath = path.join(skillsDir, entry, \"SKILL.md\");\n const content = await readFileOrNull(skillMdPath);\n if (content === null) continue;\n const match = content.match(/^---[\\s\\S]*?^name:\\s*(.+?)\\s*$/m);\n if (match) {\n names.push(match[1]);\n }\n }\n return names;\n}\n\n/**\n * Resolve the configured agent list, falling back to defaults.\n */\nfunction configuredSkillAgents(\n aiFilesConfig?: AiFilesProjectConfig | undefined,\n): string[] {\n // We default to the two most popular agents for now, \"codex\" installs to `.agents` which also\n // covers cursor and many other tools. See: https://github.com/vercel-labs/skills?tab=readme-ov-file#supported-agents\n const defaultAgents = [\"claude-code\", \"codex\"];\n return aiFilesConfig?.skills?.agents ?? defaultAgents;\n}\n\n/**\n * Runs `npx skills add get-convex/agent-skills --yes` in the given directory.\n * Returns true on success, false if the process fails or cannot be started.\n */\nfunction runSkillsAdd(cwd: string, agents: string[]): Promise<boolean> {\n const args = [\"add\", \"get-convex/agent-skills\", \"--yes\"];\n for (const agent of agents) {\n args.push(\"--agent\", agent);\n }\n return runSkillsCommand(cwd, args);\n}\n\n/**\n * Runs `npx skills remove <name...> --yes` to surgically remove only the\n * Convex-managed skills, leaving any skills from other sources intact.\n */\nfunction runSkillsRemove({\n cwd,\n skillNames,\n}: {\n cwd: string;\n skillNames: string[];\n}): Promise<boolean> {\n return runSkillsCommand(cwd, [\"remove\", ...skillNames, \"--yes\"]);\n}\n\n/**\n * This function exists so we have a way to disable skills installs without pushing a new\n * version of the convex CLI\n */\nasync function shouldRunSkillsCli(): Promise<boolean> {\n const versionData = await getVersion();\n\n if (versionData.kind === \"error\") return true;\n\n if (versionData.kind === \"ok\") {\n if (versionData.data.disableSkillsCli) {\n logMessage(chalkStderr.yellow(`Agent skills are temporarily disabled.`));\n return false;\n }\n return true;\n }\n\n return exhaustiveCheck(versionData);\n}\n\n/**\n * Remove the skills-lock.json file if it only contains skills that we\n * are removing. The `npx skills remove` command leaves the lockfile behind\n * even when it's logically empty.\n */\nasync function removeSkillsLockIfEmpty({\n projectDir,\n removedSkillNames,\n}: {\n projectDir: string;\n removedSkillNames: string[];\n}): Promise<boolean> {\n const lockPath = path.join(projectDir, \"skills-lock.json\");\n try {\n const content = await fs.readFile(lockPath, \"utf8\");\n const lock = JSON.parse(content);\n\n if (\n !lock ||\n typeof lock !== \"object\" ||\n !lock.skills ||\n typeof lock.skills !== \"object\"\n ) {\n return false;\n }\n\n const remainingSkills = Object.keys(lock.skills).filter(\n (name) => !removedSkillNames.includes(name),\n );\n\n if (remainingSkills.length === 0) {\n await fs.unlink(lockPath);\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * Install Convex agent skills and record the SHA and names into the state.\n * Handles the kill-switch check and all logging internally.\n */\nexport async function installSkills({\n projectDir,\n state,\n aiFilesConfig,\n}: {\n projectDir: string;\n state: AiFilesState;\n aiFilesConfig?: AiFilesProjectConfig | undefined;\n}): Promise<void> {\n if (!(await shouldRunSkillsCli())) return;\n const agents = configuredSkillAgents(aiFilesConfig);\n if (agents.length === 0) return;\n\n logMessage(\"Installing Convex agent skills...\");\n const skillsOk = await runSkillsAdd(projectDir, agents);\n if (!skillsOk) {\n logMessage(\n chalkStderr.yellow(\n \"Could not install agent skills. You can retry manually with: npx skills add get-convex/agent-skills\",\n ),\n );\n return;\n }\n\n const sha = await fetchAgentSkillsSha();\n if (sha) state.agentSkillsSha = sha;\n\n const names = await readInstalledSkillNames(projectDir);\n if (names.length > 0) state.installedSkillNames = names;\n\n logMessage(`${chalkStderr.green(\"\u2714\")} Skills installed`);\n}\n\n/**\n * Remove Convex-managed agent skills and clean up the lock file if empty.\n * Returns true if any removal occurred.\n */\nexport async function removeInstalledSkills({\n projectDir,\n skillNames,\n}: {\n projectDir: string;\n skillNames: string[];\n}): Promise<boolean> {\n if (skillNames.length === 0) return false;\n if (!(await shouldRunSkillsCli())) return false;\n\n logMessage(`Removing Convex agent skills: ${skillNames.join(\", \")}`);\n const skillsOk = await runSkillsRemove({ cwd: projectDir, skillNames });\n if (!skillsOk) {\n logMessage(\n chalkStderr.yellow(\n \"Could not remove agent skills automatically. Remove them manually with: npx skills remove\",\n ),\n );\n return false;\n }\n\n const lockRemoved = await removeSkillsLockIfEmpty({\n projectDir,\n removedSkillNames: skillNames,\n });\n\n if (lockRemoved)\n logMessage(`${chalkStderr.green(\"\u2714\")} Deleted skills-lock.json.`);\n\n return true;\n}\n\nfunction runSkillsCommand(cwd: string, args: string[]): Promise<boolean> {\n return new Promise((resolve) => {\n const proc = child_process.spawn(\n \"npx\",\n [\"--yes\", \"skills@latest\", ...args],\n {\n cwd,\n stdio: \"pipe\",\n // .cmd files on Windows require shell execution.\n shell: process.platform === \"win32\",\n },\n );\n let capturedOutput = \"\";\n proc.stdout?.on(\"data\", (chunk) => {\n capturedOutput += chunk.toString();\n });\n proc.stderr?.on(\"data\", (chunk) => {\n capturedOutput += chunk.toString();\n });\n proc.on(\"close\", (code) => {\n if (code !== 0 && capturedOutput.trim().length > 0) {\n const lines = capturedOutput.trim().split(/\\r?\\n/);\n const tail = lines.slice(-10).join(\"\\n\");\n logMessage(chalkStderr.gray(`skills output (tail):\\n${tail}`));\n }\n resolve(code === 0);\n });\n proc.on(\"error\", () => resolve(false));\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
import * as Sentry from "@sentry/node";
|
|
3
|
+
import { promises as fs } from "fs";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { aiDirForConvexDir, aiFilesStatePathForConvexDir } from "./paths.js";
|
|
6
|
+
import { attemptReadFile, exhaustiveCheck } from "./utils.js";
|
|
7
|
+
export const aiFilesStateSchema = z.object({
|
|
8
|
+
guidelinesHash: z.string().nullable(),
|
|
9
|
+
agentsMdSectionHash: z.string().nullable(),
|
|
10
|
+
claudeMdHash: z.string().nullable(),
|
|
11
|
+
// Commit SHA from get-convex/agent-skills that was current when skills were
|
|
12
|
+
// last installed. Used to detect when newer skills are available.
|
|
13
|
+
agentSkillsSha: z.string().nullable(),
|
|
14
|
+
// Names of skills installed by `npx skills add`, used by `remove` to
|
|
15
|
+
// only remove Convex-managed skills.
|
|
16
|
+
installedSkillNames: z.array(z.string()).default([])
|
|
17
|
+
});
|
|
18
|
+
const DEFAULT_AI_STATE = {
|
|
19
|
+
guidelinesHash: null,
|
|
20
|
+
agentsMdSectionHash: null,
|
|
21
|
+
claudeMdHash: null,
|
|
22
|
+
agentSkillsSha: null,
|
|
23
|
+
installedSkillNames: []
|
|
24
|
+
};
|
|
25
|
+
export async function attemptReadAiState(convexDir) {
|
|
26
|
+
const result = await attemptReadFile(aiFilesStatePathForConvexDir(convexDir));
|
|
27
|
+
if (result.kind === "not-found" || result.kind === "empty")
|
|
28
|
+
return { kind: "no-file" };
|
|
29
|
+
try {
|
|
30
|
+
const state = aiFilesStateSchema.parse(JSON.parse(result.content));
|
|
31
|
+
return { kind: "ok", state };
|
|
32
|
+
} catch (error) {
|
|
33
|
+
Sentry.captureException(error);
|
|
34
|
+
return { kind: "parse-error", error };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export async function readAiStateOrDefault(convexDir) {
|
|
38
|
+
const result = await attemptReadAiState(convexDir);
|
|
39
|
+
if (result.kind === "ok") return result.state;
|
|
40
|
+
if (result.kind === "no-file") return { ...DEFAULT_AI_STATE };
|
|
41
|
+
if (result.kind === "parse-error") return { ...DEFAULT_AI_STATE };
|
|
42
|
+
return exhaustiveCheck(result);
|
|
43
|
+
}
|
|
44
|
+
export async function hasAiState(convexDir) {
|
|
45
|
+
const result = await attemptReadAiState(convexDir);
|
|
46
|
+
return result.kind === "ok";
|
|
47
|
+
}
|
|
48
|
+
export async function writeAiState({
|
|
49
|
+
state,
|
|
50
|
+
convexDir
|
|
51
|
+
}) {
|
|
52
|
+
const validated = aiFilesStateSchema.parse(state);
|
|
53
|
+
await fs.mkdir(aiDirForConvexDir(convexDir), { recursive: true });
|
|
54
|
+
await fs.writeFile(
|
|
55
|
+
aiFilesStatePathForConvexDir(convexDir),
|
|
56
|
+
JSON.stringify(validated, null, 2) + "\n",
|
|
57
|
+
"utf8"
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/cli/lib/aiFiles/state.ts"],
|
|
4
|
+
"sourcesContent": ["import * as Sentry from \"@sentry/node\";\n// Use raw fs (not ctx.fs) so these operations run asynchronously and don't\n// interfere with the file-watcher used by `convex dev`.\n// eslint-disable-next-line no-restricted-imports\nimport { promises as fs } from \"fs\";\nimport { z } from \"zod\";\nimport { aiDirForConvexDir, aiFilesStatePathForConvexDir } from \"./paths.js\";\nimport { attemptReadFile, exhaustiveCheck } from \"./utils.js\";\n\nexport const aiFilesStateSchema = z.object({\n guidelinesHash: z.string().nullable(),\n agentsMdSectionHash: z.string().nullable(),\n claudeMdHash: z.string().nullable(),\n // Commit SHA from get-convex/agent-skills that was current when skills were\n // last installed. Used to detect when newer skills are available.\n agentSkillsSha: z.string().nullable(),\n // Names of skills installed by `npx skills add`, used by `remove` to\n // only remove Convex-managed skills.\n installedSkillNames: z.array(z.string()).default([]),\n});\n\nexport type AiFilesState = z.infer<typeof aiFilesStateSchema>;\n\nconst DEFAULT_AI_STATE: AiFilesState = {\n guidelinesHash: null,\n agentsMdSectionHash: null,\n claudeMdHash: null,\n agentSkillsSha: null,\n installedSkillNames: [],\n};\n\nexport type AttemptReadAiStateResult =\n | { kind: \"no-file\" }\n | { kind: \"ok\"; state: AiFilesState }\n | { kind: \"parse-error\"; error: unknown };\n\nexport async function attemptReadAiState(\n convexDir: string,\n): Promise<AttemptReadAiStateResult> {\n const result = await attemptReadFile(aiFilesStatePathForConvexDir(convexDir));\n if (result.kind === \"not-found\" || result.kind === \"empty\")\n return { kind: \"no-file\" };\n\n try {\n const state = aiFilesStateSchema.parse(JSON.parse(result.content));\n return { kind: \"ok\", state };\n } catch (error) {\n Sentry.captureException(error);\n return { kind: \"parse-error\", error };\n }\n}\n\nexport async function readAiStateOrDefault(\n convexDir: string,\n): Promise<AiFilesState> {\n const result = await attemptReadAiState(convexDir);\n if (result.kind === \"ok\") return result.state;\n if (result.kind === \"no-file\") return { ...DEFAULT_AI_STATE };\n if (result.kind === \"parse-error\") return { ...DEFAULT_AI_STATE };\n return exhaustiveCheck(result);\n}\n\nexport async function hasAiState(convexDir: string): Promise<boolean> {\n const result = await attemptReadAiState(convexDir);\n return result.kind === \"ok\";\n}\n\nexport async function writeAiState({\n state,\n convexDir,\n}: {\n state: AiFilesState;\n convexDir: string;\n}): Promise<void> {\n const validated = aiFilesStateSchema.parse(state);\n await fs.mkdir(aiDirForConvexDir(convexDir), { recursive: true });\n await fs.writeFile(\n aiFilesStatePathForConvexDir(convexDir),\n JSON.stringify(validated, null, 2) + \"\\n\",\n \"utf8\",\n );\n}\n"],
|
|
5
|
+
"mappings": ";AAAA,YAAY,YAAY;AAIxB,SAAS,YAAY,UAAU;AAC/B,SAAS,SAAS;AAClB,SAAS,mBAAmB,oCAAoC;AAChE,SAAS,iBAAiB,uBAAuB;AAE1C,aAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACpC,qBAAqB,EAAE,OAAO,EAAE,SAAS;AAAA,EACzC,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA,EAGlC,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA,EAGpC,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC;AAID,MAAM,mBAAiC;AAAA,EACrC,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,qBAAqB,CAAC;AACxB;AAOA,sBAAsB,mBACpB,WACmC;AACnC,QAAM,SAAS,MAAM,gBAAgB,6BAA6B,SAAS,CAAC;AAC5E,MAAI,OAAO,SAAS,eAAe,OAAO,SAAS;AACjD,WAAO,EAAE,MAAM,UAAU;AAE3B,MAAI;AACF,UAAM,QAAQ,mBAAmB,MAAM,KAAK,MAAM,OAAO,OAAO,CAAC;AACjE,WAAO,EAAE,MAAM,MAAM,MAAM;AAAA,EAC7B,SAAS,OAAO;AACd,WAAO,iBAAiB,KAAK;AAC7B,WAAO,EAAE,MAAM,eAAe,MAAM;AAAA,EACtC;AACF;AAEA,sBAAsB,qBACpB,WACuB;AACvB,QAAM,SAAS,MAAM,mBAAmB,SAAS;AACjD,MAAI,OAAO,SAAS,KAAM,QAAO,OAAO;AACxC,MAAI,OAAO,SAAS,UAAW,QAAO,EAAE,GAAG,iBAAiB;AAC5D,MAAI,OAAO,SAAS,cAAe,QAAO,EAAE,GAAG,iBAAiB;AAChE,SAAO,gBAAgB,MAAM;AAC/B;AAEA,sBAAsB,WAAW,WAAqC;AACpE,QAAM,SAAS,MAAM,mBAAmB,SAAS;AACjD,SAAO,OAAO,SAAS;AACzB;AAEA,sBAAsB,aAAa;AAAA,EACjC;AAAA,EACA;AACF,GAGkB;AAChB,QAAM,YAAY,mBAAmB,MAAM,KAAK;AAChD,QAAM,GAAG,MAAM,kBAAkB,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AAChE,QAAM,GAAG;AAAA,IACP,6BAA6B,SAAS;AAAA,IACtC,KAAK,UAAU,WAAW,MAAM,CAAC,IAAI;AAAA,IACrC;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|