vybekiit 0.4.0 → 0.6.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/dist/bin.js +840 -296
- package/dist/global-skills/add-ai/SKILL.md +53 -0
- package/dist/global-skills/add-analytics/SKILL.md +65 -0
- package/dist/global-skills/add-app-clip/SKILL.md +280 -0
- package/dist/global-skills/add-app-clip/agents/openai.yaml +4 -0
- package/dist/global-skills/add-app-clip/references/native-module.md +96 -0
- package/dist/global-skills/add-blog/SKILL.md +49 -0
- package/dist/global-skills/add-crud/SKILL.md +28 -0
- package/dist/global-skills/add-files/SKILL.md +65 -0
- package/dist/global-skills/add-images/SKILL.md +64 -0
- package/dist/global-skills/add-language/SKILL.md +44 -0
- package/dist/global-skills/add-notifications/SKILL.md +61 -0
- package/dist/global-skills/add-realtime/SKILL.md +49 -0
- package/dist/global-skills/add-route/SKILL.md +28 -0
- package/dist/global-skills/add-search/SKILL.md +43 -0
- package/dist/global-skills/add-signin/SKILL.md +78 -0
- package/dist/global-skills/add-teams/SKILL.md +64 -0
- package/dist/global-skills/add-upload/SKILL.md +27 -0
- package/dist/global-skills/aws-cdk/SKILL.md +72 -0
- package/dist/global-skills/aws-cdk/references/bootstrap-and-project-setup.md +257 -0
- package/dist/global-skills/aws-cdk/references/compliance-and-drift.md +193 -0
- package/dist/global-skills/aws-cdk/references/construct-patterns.md +315 -0
- package/dist/global-skills/aws-cdk/references/import-and-migrate.md +184 -0
- package/dist/global-skills/aws-cdk/references/refactor-and-prevent-replacement.md +198 -0
- package/dist/global-skills/aws-cdk/references/troubleshooting-credentials.md +183 -0
- package/dist/global-skills/aws-cdk/references/troubleshooting-deployment.md +293 -0
- package/dist/global-skills/aws-cdk/references/troubleshooting-synth.md +274 -0
- package/dist/global-skills/aws-cdk/references/v1-to-v2-migration.md +119 -0
- package/dist/global-skills/aws-cloudformation/SKILL.md +88 -0
- package/dist/global-skills/aws-cloudformation/references/author-cloudformation-best-practices.script.md +179 -0
- package/dist/global-skills/aws-cloudformation/references/check-cloudformation-template-compliance.script.md +159 -0
- package/dist/global-skills/aws-cloudformation/references/cloudformation-pre-deploy-validation.script.md +217 -0
- package/dist/global-skills/aws-cloudformation/references/deploy-with-express-mode.script.md +271 -0
- package/dist/global-skills/aws-cloudformation/references/lookup-resource-properties.script.md +130 -0
- package/dist/global-skills/aws-cloudformation/references/troubleshoot-deployment.script.md +200 -0
- package/dist/global-skills/aws-cloudformation/references/validate-cloudformation-template.script.md +135 -0
- package/dist/global-skills/aws-serverless/SKILL.md +51 -0
- package/dist/global-skills/aws-serverless/assets/powertools-handler.py +49 -0
- package/dist/global-skills/aws-serverless/references/api-gateway.md +553 -0
- package/dist/global-skills/aws-serverless/references/architecture.md +262 -0
- package/dist/global-skills/aws-serverless/references/concurrency.md +200 -0
- package/dist/global-skills/aws-serverless/references/deployment.md +94 -0
- package/dist/global-skills/aws-serverless/references/event-sources.md +484 -0
- package/dist/global-skills/aws-serverless/references/lambda.md +548 -0
- package/dist/global-skills/aws-serverless/references/orchestration.md +449 -0
- package/dist/global-skills/aws-serverless/references/production.md +493 -0
- package/dist/global-skills/aws-serverless/references/troubleshooting.md +711 -0
- package/dist/global-skills/back-up-my-code/SKILL.md +48 -0
- package/dist/global-skills/better-auth-best-practices/SKILL.md +182 -0
- package/dist/global-skills/better-auth-security-best-practices/SKILL.md +432 -0
- package/dist/global-skills/building-native-ui/SKILL.md +377 -0
- package/dist/global-skills/building-native-ui/agents/openai.yaml +4 -0
- package/dist/global-skills/building-native-ui/references/animations.md +220 -0
- package/dist/global-skills/building-native-ui/references/controls.md +270 -0
- package/dist/global-skills/building-native-ui/references/form-sheet.md +253 -0
- package/dist/global-skills/building-native-ui/references/gradients.md +106 -0
- package/dist/global-skills/building-native-ui/references/icons.md +213 -0
- package/dist/global-skills/building-native-ui/references/media.md +198 -0
- package/dist/global-skills/building-native-ui/references/route-structure.md +229 -0
- package/dist/global-skills/building-native-ui/references/search.md +248 -0
- package/dist/global-skills/building-native-ui/references/storage.md +121 -0
- package/dist/global-skills/building-native-ui/references/tabs.md +433 -0
- package/dist/global-skills/building-native-ui/references/toolbar-and-headers.md +284 -0
- package/dist/global-skills/building-native-ui/references/visual-effects.md +197 -0
- package/dist/global-skills/building-native-ui/references/webgpu-three.md +605 -0
- package/dist/global-skills/building-native-ui/references/zoom-transitions.md +158 -0
- package/dist/global-skills/buy-domain/SKILL.md +64 -0
- package/dist/global-skills/check-safety/SKILL.md +94 -0
- package/dist/global-skills/claimable-postgres/SKILL.md +249 -0
- package/dist/global-skills/configure-capabilities/SKILL.md +38 -0
- package/dist/global-skills/connect-account/SKILL.md +64 -0
- package/dist/global-skills/connect-account-backend/SKILL.md +41 -0
- package/dist/global-skills/create-auth-skill/SKILL.md +321 -0
- package/dist/global-skills/design-my-data/SKILL.md +48 -0
- package/dist/global-skills/doctor/SKILL.md +84 -0
- package/dist/global-skills/eas-app-stores/SKILL.md +152 -0
- package/dist/global-skills/eas-app-stores/agents/openai.yaml +4 -0
- package/dist/global-skills/eas-app-stores/references/app-store-metadata.md +497 -0
- package/dist/global-skills/eas-app-stores/references/ios-app-store.md +371 -0
- package/dist/global-skills/eas-app-stores/references/play-store.md +246 -0
- package/dist/global-skills/eas-app-stores/references/testflight.md +58 -0
- package/dist/global-skills/eas-app-stores/references/workflows.md +120 -0
- package/dist/global-skills/eas-hosting/SKILL.md +423 -0
- package/dist/global-skills/eas-hosting/agents/openai.yaml +4 -0
- package/dist/global-skills/eas-observe/SKILL.md +32 -0
- package/dist/global-skills/eas-observe/agents/openai.yaml +4 -0
- package/dist/global-skills/eas-observe/references/metrics.md +47 -0
- package/dist/global-skills/eas-observe/references/queries.md +342 -0
- package/dist/global-skills/eas-observe/references/setup.md +317 -0
- package/dist/global-skills/eas-simulator/SKILL.md +156 -0
- package/dist/global-skills/eas-simulator/agents/openai.yaml +4 -0
- package/dist/global-skills/eas-simulator/references/controllers.md +67 -0
- package/dist/global-skills/eas-simulator/references/run-your-app.md +185 -0
- package/dist/global-skills/eas-simulator/references/troubleshooting.md +38 -0
- package/dist/global-skills/eas-update-insights/SKILL.md +230 -0
- package/dist/global-skills/eas-update-insights/agents/openai.yaml +4 -0
- package/dist/global-skills/eas-update-insights/references/channel-insights-schema.md +47 -0
- package/dist/global-skills/eas-update-insights/references/update-insights-schema.md +69 -0
- package/dist/global-skills/eas-workflows/SKILL.md +94 -0
- package/dist/global-skills/eas-workflows/agents/openai.yaml +4 -0
- package/dist/global-skills/eas-workflows/scripts/fetch.js +109 -0
- package/dist/global-skills/eas-workflows/scripts/package.json +11 -0
- package/dist/global-skills/eas-workflows/scripts/validate.js +84 -0
- package/dist/global-skills/email-best-practices/SKILL.md +73 -0
- package/dist/global-skills/expo-api-routes/SKILL.md +368 -0
- package/dist/global-skills/expo-api-routes/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-app-clip/SKILL.md +282 -0
- package/dist/global-skills/expo-app-clip/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-app-clip/references/native-module.md +96 -0
- package/dist/global-skills/expo-brownfield/SKILL.md +54 -0
- package/dist/global-skills/expo-brownfield/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-brownfield/references/brownfield-integrated.md +526 -0
- package/dist/global-skills/expo-brownfield/references/brownfield-isolated.md +402 -0
- package/dist/global-skills/expo-brownfield/references/comparison.md +63 -0
- package/dist/global-skills/expo-brownfield/references/troubleshooting.md +88 -0
- package/dist/global-skills/expo-cicd-workflows/SKILL.md +92 -0
- package/dist/global-skills/expo-cicd-workflows/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-cicd-workflows/scripts/fetch.js +109 -0
- package/dist/global-skills/expo-cicd-workflows/scripts/package.json +11 -0
- package/dist/global-skills/expo-cicd-workflows/scripts/validate.js +84 -0
- package/dist/global-skills/expo-data-fetching/SKILL.md +449 -0
- package/dist/global-skills/expo-data-fetching/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-data-fetching/references/expo-router-loaders.md +341 -0
- package/dist/global-skills/expo-data-fetching/references/offline-and-cancellation.md +68 -0
- package/dist/global-skills/expo-deployment/SKILL.md +167 -0
- package/dist/global-skills/expo-deployment/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-deployment/references/app-store-metadata.md +497 -0
- package/dist/global-skills/expo-deployment/references/ios-app-store.md +371 -0
- package/dist/global-skills/expo-deployment/references/play-store.md +246 -0
- package/dist/global-skills/expo-deployment/references/testflight.md +58 -0
- package/dist/global-skills/expo-deployment/references/workflows.md +160 -0
- package/dist/global-skills/expo-dev-client/SKILL.md +174 -0
- package/dist/global-skills/expo-dev-client/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-dom/SKILL.md +417 -0
- package/dist/global-skills/expo-dom/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-examples/SKILL.md +99 -0
- package/dist/global-skills/expo-examples/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-examples/references/catalog.md +105 -0
- package/dist/global-skills/expo-module/SKILL.md +141 -0
- package/dist/global-skills/expo-module/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-module/references/config-plugin.md +90 -0
- package/dist/global-skills/expo-module/references/create-expo-module.md +206 -0
- package/dist/global-skills/expo-module/references/lifecycle.md +127 -0
- package/dist/global-skills/expo-module/references/module-config.md +48 -0
- package/dist/global-skills/expo-module/references/native-module.md +286 -0
- package/dist/global-skills/expo-module/references/native-view.md +171 -0
- package/dist/global-skills/expo-native-ui/SKILL.md +181 -0
- package/dist/global-skills/expo-native-ui/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-native-ui/references/animations.md +220 -0
- package/dist/global-skills/expo-native-ui/references/controls.md +270 -0
- package/dist/global-skills/expo-native-ui/references/gradients.md +106 -0
- package/dist/global-skills/expo-native-ui/references/icons.md +213 -0
- package/dist/global-skills/expo-native-ui/references/media.md +198 -0
- package/dist/global-skills/expo-native-ui/references/storage.md +121 -0
- package/dist/global-skills/expo-native-ui/references/visual-effects.md +197 -0
- package/dist/global-skills/expo-native-ui/references/webgpu-three.md +605 -0
- package/dist/global-skills/expo-observe/SKILL.md +30 -0
- package/dist/global-skills/expo-observe/references/metrics.md +47 -0
- package/dist/global-skills/expo-observe/references/queries.md +342 -0
- package/dist/global-skills/expo-observe/references/setup.md +317 -0
- package/dist/global-skills/expo-router/SKILL.md +230 -0
- package/dist/global-skills/expo-router/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-router/references/form-sheet.md +253 -0
- package/dist/global-skills/expo-router/references/route-structure.md +229 -0
- package/dist/global-skills/expo-router/references/search.md +248 -0
- package/dist/global-skills/expo-router/references/tabs.md +433 -0
- package/dist/global-skills/expo-router/references/toolbar-and-headers.md +284 -0
- package/dist/global-skills/expo-router/references/zoom-transitions.md +158 -0
- package/dist/global-skills/expo-skill-eval/SKILL.md +314 -0
- package/dist/global-skills/expo-skill-eval/agents/visual-grader.md +52 -0
- package/dist/global-skills/expo-skill-eval/references/design-rubric.md +45 -0
- package/dist/global-skills/expo-skill-eval/references/runtime-matrix.md +34 -0
- package/dist/global-skills/expo-skill-eval/scripts/check-static.sh +64 -0
- package/dist/global-skills/expo-skill-eval/scripts/clean-fixture.sh +56 -0
- package/dist/global-skills/expo-skill-eval/scripts/generate_viewer.py +450 -0
- package/dist/global-skills/expo-skill-eval/scripts/latest-sdk.sh +46 -0
- package/dist/global-skills/expo-skill-eval/scripts/make-fixture.sh +95 -0
- package/dist/global-skills/expo-skill-eval/scripts/make-workspace.sh +31 -0
- package/dist/global-skills/expo-skill-eval/scripts/snapshot-android.sh +284 -0
- package/dist/global-skills/expo-skill-eval/scripts/snapshot-ios.sh +132 -0
- package/dist/global-skills/expo-skill-eval/scripts/snapshot-web.sh +61 -0
- package/dist/global-skills/expo-skill-feedback/SKILL.md +54 -0
- package/dist/global-skills/expo-skill-feedback/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-skill-feedback/scripts/skill-event.cjs +180 -0
- package/dist/global-skills/expo-skill-feedback/scripts/skill-feedback.cjs +118 -0
- package/dist/global-skills/expo-skill-feedback/scripts/telemetry.cjs +65 -0
- package/dist/global-skills/expo-skill-feedback/scripts/telemetry_common.cjs +171 -0
- package/dist/global-skills/expo-tailwind-setup/SKILL.md +480 -0
- package/dist/global-skills/expo-tailwind-setup/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-ui/SKILL.md +47 -0
- package/dist/global-skills/expo-ui/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-ui/references/drop-in-replacements.md +27 -0
- package/dist/global-skills/expo-ui/references/jetpack-compose.md +73 -0
- package/dist/global-skills/expo-ui/references/swift-ui.md +73 -0
- package/dist/global-skills/expo-ui/references/universal.md +73 -0
- package/dist/global-skills/expo-ui/scripts/list-components.js +193 -0
- package/dist/global-skills/expo-upgrade/SKILL.md +134 -0
- package/dist/global-skills/expo-upgrade/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-upgrade/references/expo-av-to-audio.md +132 -0
- package/dist/global-skills/expo-upgrade/references/expo-av-to-video.md +160 -0
- package/dist/global-skills/expo-upgrade/references/native-tabs.md +124 -0
- package/dist/global-skills/expo-upgrade/references/new-architecture.md +79 -0
- package/dist/global-skills/expo-upgrade/references/react-19.md +79 -0
- package/dist/global-skills/expo-upgrade/references/react-compiler.md +59 -0
- package/dist/global-skills/expo-upgrade/references/react-navigation-to-expo-router.md +61 -0
- package/dist/global-skills/expo-web-to-native/SKILL.md +83 -0
- package/dist/global-skills/expo-web-to-native/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-web-to-native/references/false-friends.md +119 -0
- package/dist/global-skills/expo-web-to-native/references/native-patterns.md +39 -0
- package/dist/global-skills/expo-web-to-native/references/run-as-goal.md +48 -0
- package/dist/global-skills/expo-web-to-native/references/verify-on-device.md +45 -0
- package/dist/global-skills/firebase-ai-logic-basics/SKILL.md +165 -0
- package/dist/global-skills/firebase-ai-logic-basics/references/flutter_setup.md +95 -0
- package/dist/global-skills/firebase-ai-logic-basics/references/ios_setup.md +156 -0
- package/dist/global-skills/firebase-ai-logic-basics/references/usage_patterns_android.md +157 -0
- package/dist/global-skills/firebase-ai-logic-basics/references/usage_patterns_web.md +186 -0
- package/dist/global-skills/firebase-app-hosting-basics/SKILL.md +73 -0
- package/dist/global-skills/firebase-app-hosting-basics/references/cli_commands.md +85 -0
- package/dist/global-skills/firebase-app-hosting-basics/references/configuration.md +59 -0
- package/dist/global-skills/firebase-app-hosting-basics/references/emulation.md +59 -0
- package/dist/global-skills/firebase-auth-basics/SKILL.md +118 -0
- package/dist/global-skills/firebase-auth-basics/references/client_sdk_android.md +160 -0
- package/dist/global-skills/firebase-auth-basics/references/client_sdk_web.md +301 -0
- package/dist/global-skills/firebase-auth-basics/references/flutter_setup.md +149 -0
- package/dist/global-skills/firebase-auth-basics/references/ios_setup.md +87 -0
- package/dist/global-skills/firebase-auth-basics/references/security_rules.md +49 -0
- package/dist/global-skills/firebase-basics/SKILL.md +148 -0
- package/dist/global-skills/firebase-basics/references/android_setup.md +41 -0
- package/dist/global-skills/firebase-basics/references/firebase-cli-guide.md +18 -0
- package/dist/global-skills/firebase-basics/references/firebase-service-init.md +20 -0
- package/dist/global-skills/firebase-basics/references/flutter_setup.md +143 -0
- package/dist/global-skills/firebase-basics/references/ios_setup.md +113 -0
- package/dist/global-skills/firebase-basics/references/local-env-setup.md +80 -0
- package/dist/global-skills/firebase-basics/references/refresh/android_studio.md +41 -0
- package/dist/global-skills/firebase-basics/references/refresh/antigravity.md +64 -0
- package/dist/global-skills/firebase-basics/references/refresh/claude.md +12 -0
- package/dist/global-skills/firebase-basics/references/refresh/gemini-cli.md +13 -0
- package/dist/global-skills/firebase-basics/references/refresh/other-agents.md +67 -0
- package/dist/global-skills/firebase-basics/references/setup/android_studio.md +23 -0
- package/dist/global-skills/firebase-basics/references/setup/antigravity.md +98 -0
- package/dist/global-skills/firebase-basics/references/setup/claude_code.md +45 -0
- package/dist/global-skills/firebase-basics/references/setup/cursor.md +93 -0
- package/dist/global-skills/firebase-basics/references/setup/gemini_cli.md +53 -0
- package/dist/global-skills/firebase-basics/references/setup/github_copilot.md +104 -0
- package/dist/global-skills/firebase-basics/references/setup/other_agents.md +99 -0
- package/dist/global-skills/firebase-basics/references/web_setup.md +77 -0
- package/dist/global-skills/firebase-crashlytics/SKILL.md +42 -0
- package/dist/global-skills/firebase-crashlytics/references/android_setup.md +152 -0
- package/dist/global-skills/firebase-crashlytics/references/ios_setup.md +115 -0
- package/dist/global-skills/firebase-data-connect/SKILL.md +191 -0
- package/dist/global-skills/firebase-data-connect/examples.md +638 -0
- package/dist/global-skills/firebase-data-connect/reference/cloud_functions.md +184 -0
- package/dist/global-skills/firebase-data-connect/reference/config.md +271 -0
- package/dist/global-skills/firebase-data-connect/reference/data_seeding.md +185 -0
- package/dist/global-skills/firebase-data-connect/reference/native_sql.md +170 -0
- package/dist/global-skills/firebase-data-connect/reference/operations.md +385 -0
- package/dist/global-skills/firebase-data-connect/reference/realtime.md +210 -0
- package/dist/global-skills/firebase-data-connect/reference/schema.md +290 -0
- package/dist/global-skills/firebase-data-connect/reference/sdk_admin_node.md +141 -0
- package/dist/global-skills/firebase-data-connect/reference/sdk_android.md +126 -0
- package/dist/global-skills/firebase-data-connect/reference/sdk_flutter.md +134 -0
- package/dist/global-skills/firebase-data-connect/reference/sdk_ios.md +157 -0
- package/dist/global-skills/firebase-data-connect/reference/sdk_web.md +146 -0
- package/dist/global-skills/firebase-data-connect/reference/search.md +264 -0
- package/dist/global-skills/firebase-data-connect/reference/security.md +295 -0
- package/dist/global-skills/firebase-data-connect/templates.md +318 -0
- package/dist/global-skills/firebase-firestore/SKILL.md +89 -0
- package/dist/global-skills/firebase-firestore/references/enterprise/android_sdk_usage.md +230 -0
- package/dist/global-skills/firebase-firestore/references/enterprise/data_model.md +66 -0
- package/dist/global-skills/firebase-firestore/references/enterprise/flutter_setup.md +180 -0
- package/dist/global-skills/firebase-firestore/references/enterprise/indexes.md +135 -0
- package/dist/global-skills/firebase-firestore/references/enterprise/ios_setup.md +189 -0
- package/dist/global-skills/firebase-firestore/references/enterprise/provisioning.md +118 -0
- package/dist/global-skills/firebase-firestore/references/enterprise/python_sdk_usage.md +138 -0
- package/dist/global-skills/firebase-firestore/references/enterprise/security_rules.md +577 -0
- package/dist/global-skills/firebase-firestore/references/enterprise/web_sdk_usage.md +127 -0
- package/dist/global-skills/firebase-firestore/references/standard/android_sdk_usage.md +193 -0
- package/dist/global-skills/firebase-firestore/references/standard/flutter_setup.md +176 -0
- package/dist/global-skills/firebase-firestore/references/standard/indexes.md +113 -0
- package/dist/global-skills/firebase-firestore/references/standard/ios_setup.md +174 -0
- package/dist/global-skills/firebase-firestore/references/standard/provisioning.md +110 -0
- package/dist/global-skills/firebase-firestore/references/standard/security_rules.md +577 -0
- package/dist/global-skills/firebase-firestore/references/standard/web_sdk_usage.md +192 -0
- package/dist/global-skills/firebase-hosting-basics/SKILL.md +64 -0
- package/dist/global-skills/firebase-hosting-basics/references/configuration.md +115 -0
- package/dist/global-skills/firebase-hosting-basics/references/deploying.md +48 -0
- package/dist/global-skills/firebase-remote-config-basics/SKILL.md +124 -0
- package/dist/global-skills/firebase-remote-config-basics/references/android_setup.md +91 -0
- package/dist/global-skills/firebase-remote-config-basics/references/ios_setup.md +89 -0
- package/dist/global-skills/firebase-security-rules-auditor/SKILL.md +70 -0
- package/dist/global-skills/go-live/SKILL.md +90 -0
- package/dist/global-skills/harden/SKILL.md +101 -0
- package/dist/global-skills/instrument-feature-flags/SKILL.md +88 -0
- package/dist/global-skills/instrument-feature-flags/references/adding-feature-flag-code.md +3578 -0
- package/dist/global-skills/instrument-feature-flags/references/android.md +146 -0
- package/dist/global-skills/instrument-feature-flags/references/api.md +194 -0
- package/dist/global-skills/instrument-feature-flags/references/best-practices.md +231 -0
- package/dist/global-skills/instrument-feature-flags/references/django.md +263 -0
- package/dist/global-skills/instrument-feature-flags/references/dotnet.md +763 -0
- package/dist/global-skills/instrument-feature-flags/references/elixir.md +47 -0
- package/dist/global-skills/instrument-feature-flags/references/flask.md +131 -0
- package/dist/global-skills/instrument-feature-flags/references/flutter.md +212 -0
- package/dist/global-skills/instrument-feature-flags/references/go.md +208 -0
- package/dist/global-skills/instrument-feature-flags/references/ios.md +146 -0
- package/dist/global-skills/instrument-feature-flags/references/java.md +94 -0
- package/dist/global-skills/instrument-feature-flags/references/laravel.md +170 -0
- package/dist/global-skills/instrument-feature-flags/references/next-js.md +383 -0
- package/dist/global-skills/instrument-feature-flags/references/nodejs.md +216 -0
- package/dist/global-skills/instrument-feature-flags/references/php.md +187 -0
- package/dist/global-skills/instrument-feature-flags/references/python.md +191 -0
- package/dist/global-skills/instrument-feature-flags/references/react-native.md +166 -0
- package/dist/global-skills/instrument-feature-flags/references/react.md +302 -0
- package/dist/global-skills/instrument-feature-flags/references/ruby-on-rails.md +604 -0
- package/dist/global-skills/instrument-feature-flags/references/ruby.md +200 -0
- package/dist/global-skills/instrument-feature-flags/references/rust.md +222 -0
- package/dist/global-skills/instrument-feature-flags/references/usage.md +600 -0
- package/dist/global-skills/instrument-feature-flags/references/web.md +193 -0
- package/dist/global-skills/instrument-product-analytics/SKILL.md +139 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-android.md +1639 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-angular.md +944 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-hybrid.md +1001 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-ssr.md +1004 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-static.md +720 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-view-transitions.md +810 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-django.md +1167 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-expo.md +1412 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-fastapi.md +1585 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-flask.md +1208 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-laravel.md +2267 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-next-app-router.md +712 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-next-pages-router.md +767 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-nuxt-3-6.md +939 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-nuxt-4.md +1078 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-php.md +527 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-python.md +481 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-native.md +1823 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-6.md +582 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-7-data.md +892 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-7-declarative.md +649 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-7-framework.md +1218 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-tanstack-router-code-based.md +793 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-tanstack-router-file-based.md +780 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-ruby-on-rails.md +1320 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-ruby.md +452 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-sveltekit.md +854 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-swift.md +665 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-tanstack-start.md +1199 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-vue-3.md +910 -0
- package/dist/global-skills/instrument-product-analytics/references/android.md +811 -0
- package/dist/global-skills/instrument-product-analytics/references/angular.md +376 -0
- package/dist/global-skills/instrument-product-analytics/references/astro.md +165 -0
- package/dist/global-skills/instrument-product-analytics/references/configuration.md +299 -0
- package/dist/global-skills/instrument-product-analytics/references/django.md +263 -0
- package/dist/global-skills/instrument-product-analytics/references/dotnet.md +763 -0
- package/dist/global-skills/instrument-product-analytics/references/elixir.md +414 -0
- package/dist/global-skills/instrument-product-analytics/references/flask.md +131 -0
- package/dist/global-skills/instrument-product-analytics/references/flutter.md +845 -0
- package/dist/global-skills/instrument-product-analytics/references/go.md +567 -0
- package/dist/global-skills/instrument-product-analytics/references/identify-users.md +272 -0
- package/dist/global-skills/instrument-product-analytics/references/ios.md +154 -0
- package/dist/global-skills/instrument-product-analytics/references/laravel.md +170 -0
- package/dist/global-skills/instrument-product-analytics/references/next-js.md +383 -0
- package/dist/global-skills/instrument-product-analytics/references/nuxt-js-3-6.md +244 -0
- package/dist/global-skills/instrument-product-analytics/references/nuxt-js.md +253 -0
- package/dist/global-skills/instrument-product-analytics/references/php.md +646 -0
- package/dist/global-skills/instrument-product-analytics/references/posthog-python.md +1675 -0
- package/dist/global-skills/instrument-product-analytics/references/python.md +898 -0
- package/dist/global-skills/instrument-product-analytics/references/react-native.md +1338 -0
- package/dist/global-skills/instrument-product-analytics/references/react-router-v6.md +376 -0
- package/dist/global-skills/instrument-product-analytics/references/react-router-v7-data-mode.md +364 -0
- package/dist/global-skills/instrument-product-analytics/references/react-router-v7-declarative-mode.md +376 -0
- package/dist/global-skills/instrument-product-analytics/references/react-router-v7-framework-mode.md +479 -0
- package/dist/global-skills/instrument-product-analytics/references/ruby-on-rails.md +604 -0
- package/dist/global-skills/instrument-product-analytics/references/ruby.md +759 -0
- package/dist/global-skills/instrument-product-analytics/references/svelte.md +234 -0
- package/dist/global-skills/instrument-product-analytics/references/tanstack-start.md +193 -0
- package/dist/global-skills/instrument-product-analytics/references/usage.md +600 -0
- package/dist/global-skills/instrument-product-analytics/references/vue-js.md +306 -0
- package/dist/global-skills/manifest.json +125 -0
- package/dist/global-skills/mongodb-atlas-stream-processing/SKILL.md +284 -0
- package/dist/global-skills/mongodb-atlas-stream-processing/references/connection-configs.md +298 -0
- package/dist/global-skills/mongodb-atlas-stream-processing/references/development-workflow.md +304 -0
- package/dist/global-skills/mongodb-atlas-stream-processing/references/mcp-troubleshooting.md +55 -0
- package/dist/global-skills/mongodb-atlas-stream-processing/references/output-diagnostics.md +150 -0
- package/dist/global-skills/mongodb-atlas-stream-processing/references/pipeline-patterns.md +457 -0
- package/dist/global-skills/mongodb-atlas-stream-processing/references/sizing-and-parallelism.md +178 -0
- package/dist/global-skills/mongodb-connection/SKILL.md +201 -0
- package/dist/global-skills/mongodb-connection/references/monitoring-guide.md +191 -0
- package/dist/global-skills/mongodb-mcp-setup/SKILL.md +324 -0
- package/dist/global-skills/mongodb-natural-language-querying/SKILL.md +195 -0
- package/dist/global-skills/mongodb-query-optimizer/SKILL.md +150 -0
- package/dist/global-skills/mongodb-query-optimizer/references/aggregation-optimization.md +210 -0
- package/dist/global-skills/mongodb-query-optimizer/references/antipattern-examples.md +74 -0
- package/dist/global-skills/mongodb-query-optimizer/references/core-indexing-principles.md +134 -0
- package/dist/global-skills/mongodb-query-optimizer/references/update-query-examples.md +39 -0
- package/dist/global-skills/mongodb-schema-design/SKILL.md +181 -0
- package/dist/global-skills/mongodb-schema-design/references/antipattern-excessive-lookups.md +84 -0
- package/dist/global-skills/mongodb-schema-design/references/antipattern-unnecessary-collections.md +91 -0
- package/dist/global-skills/mongodb-schema-design/references/antipattern-unnecessary-indexes.md +95 -0
- package/dist/global-skills/mongodb-schema-design/references/fundamental-document-model.md +91 -0
- package/dist/global-skills/mongodb-schema-design/references/fundamental-document-size.md +226 -0
- package/dist/global-skills/mongodb-schema-design/references/fundamental-embed-vs-reference.md +418 -0
- package/dist/global-skills/mongodb-schema-design/references/fundamental-schema-validation.md +131 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-approximation.md +80 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-archive.md +143 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-attribute.md +77 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-bucket.md +102 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-computed.md +162 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-document-versioning.md +166 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-extended-reference.md +72 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-outlier.md +159 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-polymorphic.md +167 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-schema-versioning.md +273 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-time-series-collections.md +190 -0
- package/dist/global-skills/mongodb-schema-design/references/source-query-stats.md +123 -0
- package/dist/global-skills/mongodb-schema-design/references/source-slow-query-logs.md +63 -0
- package/dist/global-skills/mongodb-search-and-ai/SKILL.md +142 -0
- package/dist/global-skills/mongodb-search-and-ai/references/hybrid-search.md +697 -0
- package/dist/global-skills/mongodb-search-and-ai/references/lexical-search-indexing.md +584 -0
- package/dist/global-skills/mongodb-search-and-ai/references/lexical-search-querying.md +636 -0
- package/dist/global-skills/mongodb-search-and-ai/references/vector-search.md +746 -0
- package/dist/global-skills/native-data-fetching/SKILL.md +505 -0
- package/dist/global-skills/native-data-fetching/agents/openai.yaml +4 -0
- package/dist/global-skills/native-data-fetching/references/expo-router-loaders.md +341 -0
- package/dist/global-skills/neon/SKILL.md +343 -0
- package/dist/global-skills/neon-ai-gateway/SKILL.md +236 -0
- package/dist/global-skills/neon-functions/SKILL.md +490 -0
- package/dist/global-skills/neon-functions/references/ai-sdk.md +139 -0
- package/dist/global-skills/neon-functions/references/hono-websockets.md +145 -0
- package/dist/global-skills/neon-functions/references/mastra-studio.md +127 -0
- package/dist/global-skills/neon-functions/references/mcp.md +137 -0
- package/dist/global-skills/neon-functions/references/sentry.md +131 -0
- package/dist/global-skills/neon-functions/references/sse.md +143 -0
- package/dist/global-skills/neon-object-storage/SKILL.md +197 -0
- package/dist/global-skills/neon-postgres/SKILL.md +376 -0
- package/dist/global-skills/neon-postgres-branches/SKILL.md +281 -0
- package/dist/global-skills/neon-postgres-egress-optimizer/SKILL.md +247 -0
- package/dist/global-skills/onboarding/SKILL.md +101 -0
- package/dist/global-skills/plan-my-idea/SKILL.md +67 -0
- package/dist/global-skills/publish-app/SKILL.md +72 -0
- package/dist/global-skills/publish-extension/SKILL.md +47 -0
- package/dist/global-skills/resend/SKILL.md +294 -0
- package/dist/global-skills/resend/references/api-keys.md +98 -0
- package/dist/global-skills/resend/references/automations.md +228 -0
- package/dist/global-skills/resend/references/broadcasts.md +125 -0
- package/dist/global-skills/resend/references/contact-properties.md +111 -0
- package/dist/global-skills/resend/references/contacts.md +174 -0
- package/dist/global-skills/resend/references/domains.md +179 -0
- package/dist/global-skills/resend/references/events.md +119 -0
- package/dist/global-skills/resend/references/fetch-all-templates.mjs +37 -0
- package/dist/global-skills/resend/references/installation.md +142 -0
- package/dist/global-skills/resend/references/logs.md +161 -0
- package/dist/global-skills/resend/references/receiving.md +287 -0
- package/dist/global-skills/resend/references/segments.md +77 -0
- package/dist/global-skills/resend/references/sending/batch-email-examples.md +807 -0
- package/dist/global-skills/resend/references/sending/best-practices.md +453 -0
- package/dist/global-skills/resend/references/sending/email-management.md +135 -0
- package/dist/global-skills/resend/references/sending/overview.md +209 -0
- package/dist/global-skills/resend/references/sending/single-email-examples.md +470 -0
- package/dist/global-skills/resend/references/templates.md +202 -0
- package/dist/global-skills/resend/references/topics.md +104 -0
- package/dist/global-skills/resend/references/webhooks.md +317 -0
- package/dist/global-skills/reset-password/SKILL.md +59 -0
- package/dist/global-skills/save-data/SKILL.md +70 -0
- package/dist/global-skills/sentry-sdk-setup/SKILL.md +116 -0
- package/dist/global-skills/sentry-workflow/SKILL.md +32 -0
- package/dist/global-skills/setup-email/SKILL.md +69 -0
- package/dist/global-skills/setup-payments/SKILL.md +82 -0
- package/dist/global-skills/setup-sms/SKILL.md +51 -0
- package/dist/global-skills/sign-in-with-email-link/SKILL.md +53 -0
- package/dist/global-skills/sign-in-with-google/SKILL.md +68 -0
- package/dist/global-skills/sign-in-with-phone/SKILL.md +53 -0
- package/dist/global-skills/stripe-best-practices/SKILL.md +48 -0
- package/dist/global-skills/stripe-best-practices/references/billing.md +58 -0
- package/dist/global-skills/stripe-best-practices/references/connect.md +173 -0
- package/dist/global-skills/stripe-best-practices/references/payments.md +79 -0
- package/dist/global-skills/stripe-best-practices/references/security.md +109 -0
- package/dist/global-skills/stripe-best-practices/references/tax.md +37 -0
- package/dist/global-skills/stripe-best-practices/references/treasury.md +16 -0
- package/dist/global-skills/supabase/CHANGELOG.md +53 -0
- package/dist/global-skills/supabase/SKILL.md +145 -0
- package/dist/global-skills/supabase/assets/feedback-issue-template.md +17 -0
- package/dist/global-skills/supabase/references/skill-feedback.md +17 -0
- package/dist/global-skills/supabase-postgres-best-practices/CHANGELOG.md +43 -0
- package/dist/global-skills/supabase-postgres-best-practices/SKILL.md +64 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/_contributing.md +170 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/_sections.md +39 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/_template.md +34 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/security-rls-performance.md +63 -0
- package/dist/global-skills/track-errors/SKILL.md +67 -0
- package/dist/global-skills/update-kit/SKILL.md +75 -0
- package/dist/global-skills/upgrading-expo/SKILL.md +134 -0
- package/dist/global-skills/upgrading-expo/agents/openai.yaml +4 -0
- package/dist/global-skills/upgrading-expo/references/expo-av-to-audio.md +132 -0
- package/dist/global-skills/upgrading-expo/references/expo-av-to-video.md +160 -0
- package/dist/global-skills/upgrading-expo/references/native-tabs.md +124 -0
- package/dist/global-skills/upgrading-expo/references/new-architecture.md +79 -0
- package/dist/global-skills/upgrading-expo/references/react-19.md +79 -0
- package/dist/global-skills/upgrading-expo/references/react-compiler.md +59 -0
- package/dist/global-skills/upgrading-expo/references/react-navigation-to-expo-router.md +61 -0
- package/dist/global-skills/use-dom/SKILL.md +417 -0
- package/dist/global-skills/use-dom/agents/openai.yaml +4 -0
- package/dist/global-skills/use-kit-mcp/SKILL.md +100 -0
- package/dist/global-skills/use-railway/SKILL.md +357 -0
- package/dist/global-skills/use-railway/references/analyze-db-mongo.md +84 -0
- package/dist/global-skills/use-railway/references/analyze-db-mysql.md +254 -0
- package/dist/global-skills/use-railway/references/analyze-db-postgres.md +479 -0
- package/dist/global-skills/use-railway/references/analyze-db-redis.md +208 -0
- package/dist/global-skills/use-railway/references/analyze-db.md +344 -0
- package/dist/global-skills/use-railway/references/configure.md +359 -0
- package/dist/global-skills/use-railway/references/deploy.md +225 -0
- package/dist/global-skills/use-railway/references/feature-flags.md +89 -0
- package/dist/global-skills/use-railway/references/iac.md +108 -0
- package/dist/global-skills/use-railway/references/operate.md +273 -0
- package/dist/global-skills/use-railway/references/request.md +262 -0
- package/dist/global-skills/use-railway/references/sandbox.md +167 -0
- package/dist/global-skills/use-railway/references/setup.md +364 -0
- package/dist/global-skills/use-railway/scripts/analyze-mongo.py +1549 -0
- package/dist/global-skills/use-railway/scripts/analyze-mysql.py +1195 -0
- package/dist/global-skills/use-railway/scripts/analyze-postgres.py +3058 -0
- package/dist/global-skills/use-railway/scripts/analyze-redis.py +1090 -0
- package/dist/global-skills/use-railway/scripts/dal.py +671 -0
- package/dist/global-skills/use-railway/scripts/enable-pg-stats.py +170 -0
- package/dist/global-skills/use-railway/scripts/pg-extensions.py +370 -0
- package/dist/global-skills/use-railway/scripts/railway-api.sh +52 -0
- package/dist/global-skills/vercel-composition-patterns/AGENTS.md +946 -0
- package/dist/global-skills/vercel-composition-patterns/README.md +60 -0
- package/dist/global-skills/vercel-composition-patterns/SKILL.md +89 -0
- package/dist/global-skills/vercel-composition-patterns/metadata.json +11 -0
- package/dist/global-skills/vercel-composition-patterns/rules/_sections.md +29 -0
- package/dist/global-skills/vercel-composition-patterns/rules/_template.md +24 -0
- package/dist/global-skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
- package/dist/global-skills/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
- package/dist/global-skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
- package/dist/global-skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
- package/dist/global-skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
- package/dist/global-skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
- package/dist/global-skills/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
- package/dist/global-skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
- package/dist/global-skills/vercel-react-best-practices/AGENTS.md +3810 -0
- package/dist/global-skills/vercel-react-best-practices/README.md +123 -0
- package/dist/global-skills/vercel-react-best-practices/SKILL.md +149 -0
- package/dist/global-skills/vercel-react-best-practices/metadata.json +15 -0
- package/dist/global-skills/vercel-react-best-practices/rules/_sections.md +46 -0
- package/dist/global-skills/vercel-react-best-practices/rules/_template.md +28 -0
- package/dist/global-skills/vercel-react-best-practices/rules/advanced-effect-event-deps.md +56 -0
- package/dist/global-skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/dist/global-skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/dist/global-skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/dist/global-skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/dist/global-skills/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
- package/dist/global-skills/vercel-react-best-practices/rules/async-defer-await.md +82 -0
- package/dist/global-skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/dist/global-skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/dist/global-skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/dist/global-skills/vercel-react-best-practices/rules/bundle-analyzable-paths.md +63 -0
- package/dist/global-skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
- package/dist/global-skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/dist/global-skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/dist/global-skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/dist/global-skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/dist/global-skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/dist/global-skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/dist/global-skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/dist/global-skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-no-shared-module-state.md +50 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/dist/global-skills/web-to-native/SKILL.md +83 -0
- package/dist/global-skills/web-to-native/references/false-friends.md +119 -0
- package/dist/global-skills/web-to-native/references/native-patterns.md +39 -0
- package/dist/global-skills/web-to-native/references/run-as-goal.md +48 -0
- package/dist/global-skills/web-to-native/references/verify-on-device.md +45 -0
- package/dist/global-skills/wire-auth/SKILL.md +28 -0
- package/dist/global-skills/wire-database/SKILL.md +28 -0
- package/dist/global-skills/wire-email/SKILL.md +27 -0
- package/dist/global-skills/wire-payments/SKILL.md +27 -0
- package/dist/global-skills/workers-best-practices/SKILL.md +127 -0
- package/dist/global-skills/workers-best-practices/references/review.md +174 -0
- package/dist/global-skills/workers-best-practices/references/rules.md +463 -0
- package/dist/global-skills/wrangler/SKILL.md +922 -0
- package/dist/global-skills/xcode-project-setup/SKILL.md +140 -0
- package/dist/global-skills/xcode-project-setup/scripts/xcode_spm_setup/Package.resolved +41 -0
- package/dist/global-skills/xcode-project-setup/scripts/xcode_spm_setup/Package.swift +17 -0
- package/dist/global-skills/xcode-project-setup/scripts/xcode_spm_setup/Sources/main.swift +232 -0
- package/package.json +21 -20
- package/LICENSE.md +0 -47
- package/dist/index.js +0 -21593
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Reduce Excessive $lookup Usage
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
impactDescription: "Can reduce query cost on hot paths by avoiding repeated cross-collection joins"
|
|
5
|
+
tags: schema, lookup, anti-pattern, joins, denormalization, atlas-suggestion
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Reduce Excessive $lookup Usage
|
|
9
|
+
|
|
10
|
+
**Frequent $lookup operations on hot paths can indicate over-normalization.** `$lookup` is useful, but repeated joins can be slower and more resource-intensive than querying a single collection, especially when supporting indexes or match selectivity are weak. If the same related fields are read together often, consider embedding or extended references.
|
|
11
|
+
|
|
12
|
+
**Incorrect (constant $lookup for common operations):**
|
|
13
|
+
|
|
14
|
+
```javascript
|
|
15
|
+
// Every product page requires repeated joins across collections
|
|
16
|
+
db.products.aggregate([
|
|
17
|
+
{ $match: { _id: productId } },
|
|
18
|
+
{ $lookup: {
|
|
19
|
+
from: "categories", // Collection scan #2
|
|
20
|
+
localField: "categoryId",
|
|
21
|
+
foreignField: "_id",
|
|
22
|
+
as: "category"
|
|
23
|
+
}},
|
|
24
|
+
{ $lookup: {
|
|
25
|
+
from: "brands", // Collection scan #3
|
|
26
|
+
localField: "brandId",
|
|
27
|
+
foreignField: "_id",
|
|
28
|
+
as: "brand"
|
|
29
|
+
}},
|
|
30
|
+
{ $unwind: "$category" },
|
|
31
|
+
{ $unwind: "$brand" }
|
|
32
|
+
])
|
|
33
|
+
// Multiple join stages add planning/execution overhead on hot paths
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Join cost depends on cardinality, stage order, index support, and result size. Measure before deciding to embed.
|
|
37
|
+
|
|
38
|
+
**Correct (denormalize frequently-joined data):**
|
|
39
|
+
|
|
40
|
+
Embed data that is always displayed alongside the product directly in the product document: include category fields (`_id`, `name`, `path`) and brand fields (`_id`, `name`, `logo`) as subdocuments. A single indexed query returns complete product data without `$lookup`. Listing queries (e.g. by category) also run against a single collection.
|
|
41
|
+
|
|
42
|
+
**Managing denormalized data updates:**
|
|
43
|
+
|
|
44
|
+
When category data changes (a rare event), use `updateMany` to update all products matching that category’s `_id` with the new field values. For frequently-changing data, keep both a reference ID (`brandId`) and a cache subdocument (`brandCache`) with a `cachedAt` timestamp; refresh the cache when it exceeds a staleness threshold.
|
|
45
|
+
|
|
46
|
+
**When NOT to use this pattern:**
|
|
47
|
+
|
|
48
|
+
- **Data changes frequently and independently**: If brand logos change daily, denormalization creates update overhead.
|
|
49
|
+
- **Rarely-accessed data**: Don't embed review details if only a small fraction of product views load reviews.
|
|
50
|
+
- **Many-to-many with high cardinality**: Avoid embedding large or fast-growing relationship sets.
|
|
51
|
+
- **Analytics queries**: Batch jobs can afford $lookup latency; real-time queries cannot.
|
|
52
|
+
|
|
53
|
+
## Verify with
|
|
54
|
+
|
|
55
|
+
#### Find pipelines with $lookup stages
|
|
56
|
+
|
|
57
|
+
For Atlas M10+ use $queryStats. See [Query Stats](references/source-query-stats.md)
|
|
58
|
+
Use codebase if available, ask the user.
|
|
59
|
+
|
|
60
|
+
```javascript
|
|
61
|
+
|
|
62
|
+
// Check if $lookup foreign fields are indexed
|
|
63
|
+
|
|
64
|
+
// Example A - $indexStats
|
|
65
|
+
db.categories.aggregate([
|
|
66
|
+
{ $indexStats: {} }
|
|
67
|
+
])
|
|
68
|
+
|
|
69
|
+
// Example B - getIndexes()
|
|
70
|
+
db.categories.getIndexes()
|
|
71
|
+
|
|
72
|
+
// Look for index supporting the query (either a direct index on the foreign field or a compound index that has the foreign field as a prefix, note the collation)
|
|
73
|
+
|
|
74
|
+
// Measure $lookup impact
|
|
75
|
+
db.products.aggregate([
|
|
76
|
+
{ $match: { category: "electronics" } },
|
|
77
|
+
{ $lookup: { from: "brands", localField: "brandId", foreignField: "_id", as: "brand" } }
|
|
78
|
+
]).explain("executionStats")
|
|
79
|
+
// Check totalDocsExamined in $lookup stage
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Atlas Schema Suggestions flags: "Reduce $lookup operations"
|
|
83
|
+
|
|
84
|
+
Reference: [Reduce Lookup Operations](https://mongodb.com/docs/manual/data-modeling/design-antipatterns/reduce-lookup-operations/)
|
package/dist/global-skills/mongodb-schema-design/references/antipattern-unnecessary-collections.md
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Reduce Unnecessary Collections
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
impactDescription: "Reduces avoidable joins when related data is repeatedly queried together"
|
|
5
|
+
tags: schema, collections, anti-pattern, embedding, normalization, atlas-suggestion
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Reduce Unnecessary Collections
|
|
9
|
+
|
|
10
|
+
**Collection count alone is not the anti-pattern.** The anti-pattern is using collections as a substitute for indexes — creating one collection per category, time period, or partition key instead of indexing a single collection. Every collection carries a default `_id` index that consumes storage and strains the replica set, and cross-collection queries require `$lookup` or `$unionWith`, adding complexity and overhead.
|
|
11
|
+
|
|
12
|
+
**Incorrect (one collection per day as partitioning strategy):**
|
|
13
|
+
|
|
14
|
+
Creating one collection per time period (e.g. `temperatures_2024_05_10`, `temperatures_2024_05_11`, …) means each collection carries its own default `_id` index (365 collections/year = 365 extra indexes), cross-day queries require `$unionWith` across many collections, schema validation / indexes / TTL must be duplicated on every collection, and application code must dynamically resolve the collection name for each query.
|
|
15
|
+
|
|
16
|
+
**Correct (single collection with an index):**
|
|
17
|
+
|
|
18
|
+
```javascript
|
|
19
|
+
// All readings in one collection — the index does the partitioning work
|
|
20
|
+
{ _id: ObjectId(), timestamp: ISODate("2024-05-10T10:00:00Z"), temperature: 60 }
|
|
21
|
+
{ _id: ObjectId(), timestamp: ISODate("2024-05-10T11:00:00Z"), temperature: 61 }
|
|
22
|
+
{ _id: ObjectId(), timestamp: ISODate("2024-05-11T10:00:00Z"), temperature: 68 }
|
|
23
|
+
|
|
24
|
+
db.temperatures.createIndex({ timestamp: 1 })
|
|
25
|
+
|
|
26
|
+
// Efficient range query — one collection, one index
|
|
27
|
+
db.temperatures.find({
|
|
28
|
+
timestamp: { $gte: ISODate("2024-05-10"), $lt: ISODate("2024-05-11") }
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
// Optional TTL for automatic expiry (e.g. 90 days)
|
|
32
|
+
db.temperatures.createIndex({ timestamp: 1 }, { expireAfterSeconds: 7776000 })
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Even better (bucket pattern or time series collection):**
|
|
36
|
+
|
|
37
|
+
For high-volume time-stamped data, group readings into buckets or use a native time series collection, which is optimized for this workload:
|
|
38
|
+
|
|
39
|
+
```javascript
|
|
40
|
+
// Bucket pattern — one document per day
|
|
41
|
+
{
|
|
42
|
+
_id: ISODate("2024-05-10T00:00:00Z"),
|
|
43
|
+
readings: [
|
|
44
|
+
{ timestamp: ISODate("2024-05-10T10:00:00Z"), temperature: 60 },
|
|
45
|
+
{ timestamp: ISODate("2024-05-10T11:00:00Z"), temperature: 61 },
|
|
46
|
+
{ timestamp: ISODate("2024-05-10T12:00:00Z"), temperature: 64 }
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// In this particular case, a native time series collection
|
|
51
|
+
// is also a good option to consider
|
|
52
|
+
db.createCollection("temperatures", {
|
|
53
|
+
timeseries: { timeField: "timestamp", granularity: "hours" }
|
|
54
|
+
})
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**When to use separate collections:**
|
|
58
|
+
|
|
59
|
+
| Scenario | Separate Collection | Why |
|
|
60
|
+
|----------|--------------------|----|
|
|
61
|
+
| Data accessed independently | Yes | Different query patterns |
|
|
62
|
+
| Unbounded relationships | Yes | Prevents document growth |
|
|
63
|
+
| Many-to-many | Yes | Students ↔ Courses |
|
|
64
|
+
| 1:1 always together | No (embed) | User and profile |
|
|
65
|
+
|
|
66
|
+
**When NOT to use this pattern:**
|
|
67
|
+
|
|
68
|
+
- **Data is genuinely independent**: Products exist separately from orders; don't embed full product catalog in every order.
|
|
69
|
+
- **Frequent independent updates**: If customer email changes shouldn't update all historical orders (it shouldn't).
|
|
70
|
+
- **Data is accessed in different contexts**: Same address entity used for shipping, billing, user profile—keep it separate.
|
|
71
|
+
- **Regulatory requirements**: Some industries require normalized data for audit trails.
|
|
72
|
+
|
|
73
|
+
## Verify with
|
|
74
|
+
|
|
75
|
+
```javascript
|
|
76
|
+
// Count your collections
|
|
77
|
+
for (const d of db.adminCommand({ listDatabases: 1 }).databases) {
|
|
78
|
+
const colls = db.getSiblingDB(d.name).getCollectionNames().length
|
|
79
|
+
print(`${d.name}: ${colls} collections`)
|
|
80
|
+
}
|
|
81
|
+
// Count alone is not sufficient: combine with access and index/storage evidence
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Check if collections are always accessed together.
|
|
85
|
+
|
|
86
|
+
For Atlas M10+ use $queryStats. See [Query Stats](references/source-query-stats.md)
|
|
87
|
+
Use codebase if available, ask the user.
|
|
88
|
+
|
|
89
|
+
Atlas Schema Suggestions flags: "Reduce number of collections"
|
|
90
|
+
|
|
91
|
+
Reference: [Reduce the Number of Collections](https://mongodb.com/docs/manual/data-modeling/design-antipatterns/reduce-collections/)
|
package/dist/global-skills/mongodb-schema-design/references/antipattern-unnecessary-indexes.md
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Avoid Unnecessary Indexes"
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
impactDescription: "Reduces write overhead and WiredTiger cache pressure from unused or redundant indexes"
|
|
5
|
+
tags: schema, antipattern, indexes, performance, atlas-suggestion
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Avoid Unnecessary Indexes
|
|
9
|
+
|
|
10
|
+
**Every index has a write cost.** On insert, update, and delete, MongoDB must update ALL indexes on the collection. Unused or redundant indexes slow down writes with no query benefit, and consume RAM in the WiredTiger cache competing with working set data. Atlas Performance Advisor specifically flags "Redundant Index" and "Unused Index".
|
|
11
|
+
|
|
12
|
+
**Incorrect (indexes created "just in case"):**
|
|
13
|
+
|
|
14
|
+
```javascript
|
|
15
|
+
// Creating indexes speculatively without query evidence
|
|
16
|
+
db.orders.createIndex({ status: 1 }) // never queried by status alone
|
|
17
|
+
db.orders.createIndex({ status: 1, date: 1 }) // already have {status:1,date:1,amount:1}
|
|
18
|
+
db.orders.createIndex({ region: 1 }) // added during development, never used
|
|
19
|
+
|
|
20
|
+
// Problems:
|
|
21
|
+
// 1. Every insert/update/delete must update ALL indexes
|
|
22
|
+
// 2. Redundant {status: 1} is fully covered by {status: 1, date: 1, amount: 1}
|
|
23
|
+
// 3. Unused indexes waste RAM in WiredTiger cache
|
|
24
|
+
// 4. Atlas Performance Advisor flags these but they're never cleaned up
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Correct (audit-driven index management):**
|
|
28
|
+
|
|
29
|
+
```javascript
|
|
30
|
+
// Only create indexes that serve real query patterns
|
|
31
|
+
// Audit before adding new indexes:
|
|
32
|
+
db.orders.aggregate([{ $indexStats: {} }])
|
|
33
|
+
|
|
34
|
+
// Review index list regularly
|
|
35
|
+
db.orders.getIndexes()
|
|
36
|
+
|
|
37
|
+
// A compound index {a: 1, b: 1} makes a single-field index {a: 1} redundant
|
|
38
|
+
// — the compound index serves all queries that {a: 1} alone serves
|
|
39
|
+
db.col.createIndex({ a: 1 }) // drop this — redundant
|
|
40
|
+
db.col.createIndex({ a: 1, b: 1 }) // keep this
|
|
41
|
+
|
|
42
|
+
// NOTE: Different leading field is NOT redundant
|
|
43
|
+
db.col.createIndex({ a: 1, b: 1 })
|
|
44
|
+
db.col.createIndex({ b: 1 }) // NOT covered by above — keep
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Safe removal process (hide → monitor → drop):**
|
|
48
|
+
|
|
49
|
+
```javascript
|
|
50
|
+
// Never drop an index directly in production
|
|
51
|
+
|
|
52
|
+
// Step 1: Hide the index (invisible to query planner but stays on disk)
|
|
53
|
+
db.orders.hideIndex("status_1")
|
|
54
|
+
|
|
55
|
+
// Step 2: Monitor for a full workload cycle (days/weeks)
|
|
56
|
+
// If queries degrade, unhide immediately:
|
|
57
|
+
// db.orders.unhideIndex("status_1")
|
|
58
|
+
|
|
59
|
+
// Step 3: Once confident, permanently drop
|
|
60
|
+
db.orders.dropIndexes(["status_1"])
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Atlas automatically flags:
|
|
64
|
+
- **"Redundant Index"** — a prefix of an existing compound index
|
|
65
|
+
- **"Unused Index"** — zero query usage in the observed window
|
|
66
|
+
|
|
67
|
+
**When NOT to use this pattern:**
|
|
68
|
+
|
|
69
|
+
- **New collections with planned queries**: If you know queries are coming, pre-creating indexes is fine.
|
|
70
|
+
- **Indexes for rare but critical operations**: A backup or compliance query that runs monthly may show low usage but is still needed.
|
|
71
|
+
- **TTL indexes**: These serve data lifecycle purposes even if not used for queries.
|
|
72
|
+
|
|
73
|
+
## Verify with
|
|
74
|
+
|
|
75
|
+
```javascript
|
|
76
|
+
// Find indexes with zero query usage since last restart
|
|
77
|
+
db.orders.aggregate([{ $indexStats: {} }])
|
|
78
|
+
// Look for: accesses.ops: 0
|
|
79
|
+
// Example output:
|
|
80
|
+
// { name: "status_1", accesses: { ops: 0, since: ISODate("...") }, ... }
|
|
81
|
+
// An accesses.ops: 0 after a representative workload period means the index
|
|
82
|
+
// is never used by any query
|
|
83
|
+
|
|
84
|
+
// Check total index count and sizes
|
|
85
|
+
db.orders.stats().indexSizes
|
|
86
|
+
// Large number of indexes or large total index size signals audit opportunity
|
|
87
|
+
|
|
88
|
+
// Find redundant indexes (prefix subsets)
|
|
89
|
+
for (const idx of db.orders.getIndexes()) {
|
|
90
|
+
print(`${idx.name}: ${JSON.stringify(idx.key)}`)
|
|
91
|
+
}
|
|
92
|
+
// Compare index key prefixes — if {a:1} exists alongside {a:1,b:1}, the former is redundant
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Reference: [Remove Unnecessary Indexes](https://mongodb.com/docs/manual/data-modeling/design-antipatterns/unnecessary-indexes/)
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Embrace the Document Model
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: "Aligns schema to aggregate access patterns and minimizes avoidable cross-collection joins"
|
|
5
|
+
tags: schema, document-model, fundamentals, sql-migration
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Embrace the Document Model
|
|
9
|
+
|
|
10
|
+
**Don't recreate SQL tables one-to-one in MongoDB.** The document model is designed to store related data together when it is read and updated together. Naively copying relational boundaries often increases application-side joins and coordination logic.
|
|
11
|
+
|
|
12
|
+
**Incorrect (SQL patterns in MongoDB):**
|
|
13
|
+
|
|
14
|
+
Mirroring a relational schema 1:1 — e.g. separate `customers`, `addresses`, `phones`, and `preferences` collections linked by `customerId` — requires four queries and four index lookups to load one customer profile, plus application-side joining. Updates may require cross-collection coordination or transactions.
|
|
15
|
+
|
|
16
|
+
**Correct (rich document model):**
|
|
17
|
+
|
|
18
|
+
```javascript
|
|
19
|
+
// Customer document contains everything about the customer
|
|
20
|
+
// All data retrieved in single read, updated atomically
|
|
21
|
+
{
|
|
22
|
+
_id: "cust123",
|
|
23
|
+
name: "Alice Smith",
|
|
24
|
+
email: "alice@example.com",
|
|
25
|
+
addresses: [
|
|
26
|
+
{ type: "home", street: "123 Main", city: "Boston", zip: "02101" },
|
|
27
|
+
{ type: "work", street: "456 Oak", city: "Boston", zip: "02102" }
|
|
28
|
+
],
|
|
29
|
+
phones: [
|
|
30
|
+
{ type: "mobile", number: "555-1234" },
|
|
31
|
+
{ type: "work", number: "555-5678" }
|
|
32
|
+
],
|
|
33
|
+
preferences: {
|
|
34
|
+
newsletter: true,
|
|
35
|
+
theme: "dark",
|
|
36
|
+
language: "en"
|
|
37
|
+
},
|
|
38
|
+
createdAt: ISODate("2024-01-01")
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Single query loads complete customer - 1 round-trip
|
|
42
|
+
db.customers.findOne({ _id: "cust123" })
|
|
43
|
+
|
|
44
|
+
// Atomic update - no transaction needed
|
|
45
|
+
db.customers.updateOne(
|
|
46
|
+
{ _id: "cust123" },
|
|
47
|
+
{ $push: { addresses: newAddress }, $set: { "preferences.theme": "light" } }
|
|
48
|
+
)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Common tradeoffs:**
|
|
52
|
+
|
|
53
|
+
| Aspect | SQL-style mapping in MongoDB | Document-first mapping |
|
|
54
|
+
|--------|----------------------------|------------------------|
|
|
55
|
+
| Queries per aggregate view | Often multiple collection reads or `$lookup` | Often one collection read for hot paths |
|
|
56
|
+
| Atomicity for related fields | May require multi-document transaction | Single-document writes are atomic |
|
|
57
|
+
| Schema evolution | More migration/coordination between collections | Often localized changes per document shape |
|
|
58
|
+
| Application logic | More join/merge logic in app | Simpler read model for common operations |
|
|
59
|
+
|
|
60
|
+
**When migrating from SQL:**
|
|
61
|
+
|
|
62
|
+
1. Don't convert tables 1:1 to collections
|
|
63
|
+
2. Identify which tables are always joined together
|
|
64
|
+
3. Denormalize those joins into single documents
|
|
65
|
+
4. Keep separate only what's accessed separately
|
|
66
|
+
|
|
67
|
+
**When NOT to use this pattern:**
|
|
68
|
+
|
|
69
|
+
- **Genuinely independent data**: If addresses are shared across users or accessed independently, keep them separate.
|
|
70
|
+
- **Unbounded relationships**: User with 10,000 orders should NOT embed all orders.
|
|
71
|
+
- **Regulatory requirements**: Some compliance rules require normalized audit trails.
|
|
72
|
+
|
|
73
|
+
## Verify with
|
|
74
|
+
|
|
75
|
+
```javascript
|
|
76
|
+
// Count your collections vs expected entities
|
|
77
|
+
for (const d of db.adminCommand({ listDatabases: 1 }).databases) {
|
|
78
|
+
const colls = db.getSiblingDB(d.name).getCollectionNames().length
|
|
79
|
+
print(`${d.name}: ${colls} collections`)
|
|
80
|
+
}
|
|
81
|
+
// Collection count alone is not enough evidence; inspect query/access patterns too
|
|
82
|
+
|
|
83
|
+
// Check for SQL-style foreign key patterns
|
|
84
|
+
db.addresses.aggregate([
|
|
85
|
+
{ $group: { _id: "$customerId", count: { $sum: 1 } } },
|
|
86
|
+
{ $match: { count: { $gt: 0 } } }
|
|
87
|
+
]).itcount()
|
|
88
|
+
// If addresses always belong to customers, they should be embedded
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Reference: [Schema Design Process](https://mongodb.com/docs/manual/data-modeling/schema-design-process/)
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Keep Documents Small
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
impactDescription: "Hard 16MB BSON limit; oversized documents fail writes and degrade performance long before that"
|
|
5
|
+
tags: schema, fundamentals, document-size, 16mb, bson-limit, arrays, anti-pattern, performance, indexing, subset-pattern, working-set, hot-data, cold-data, atlas-suggestion
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Keep Documents Small
|
|
9
|
+
|
|
10
|
+
**MongoDB documents cannot exceed 16 megabytes.** This is a hard BSON limit, not a guideline — writes fail once a document reaches it.
|
|
11
|
+
|
|
12
|
+
However, practical documents should be **much smaller than 16MB**. As a rule of thumb, aim for documents **under 1MB**. Smaller documents mean:
|
|
13
|
+
|
|
14
|
+
- **Better working-set efficiency** — more documents fit in the WiredTiger cache.
|
|
15
|
+
- **Faster reads and writes** — less data copied, serialized, and transferred per operation.
|
|
16
|
+
- **Lower replication overhead** — smaller oplog entries replicate faster.
|
|
17
|
+
- **Room to grow** — a document well under the limit won't surprise you after a year of appended data.
|
|
18
|
+
|
|
19
|
+
The 16MB ceiling is a safety net, not a design target.
|
|
20
|
+
|
|
21
|
+
### How documents get too large
|
|
22
|
+
|
|
23
|
+
1. **Unbounded arrays** — e.g. an `activityLog` array receiving entries on every user action: 100,000 events × ~150 bytes ≈ 15MB, growing until writes are rejected.
|
|
24
|
+
2. **Large bounded arrays** — even a bounded comments array (5,000 items × ~500 bytes = 2.5MB) is expensive: each `$push` rewrites the growing document, and a multikey index fans out to one entry per element.
|
|
25
|
+
3. **Bloated documents with cold fields** — MongoDB reads full documents, even when queries only need a few fields. A product document carrying name and price (~18 bytes, frequently needed) alongside description (~5KB), full specs (~10KB), base64 images (~500KB), reviews (~100KB), and price history (~50KB) can reach ~665KB. Hot-path queries still load the entire document into cache, reducing working-set density. Even projecting a small field set (e.g. `db.products.find({}, {name: 1, price: 1})`) still reads the full document from storage.
|
|
26
|
+
4. **Large embedded binary** — a `BinData` PDF attachment of 10MB+; additional attachments push the document past the limit.
|
|
27
|
+
5. **Deeply nested objects** — a configuration document with 100+ nesting levels where metadata and keys alone approach 16MB.
|
|
28
|
+
|
|
29
|
+
### Solution 1: move unbounded or large data to a separate collection
|
|
30
|
+
|
|
31
|
+
Keep the parent document small. Store children in their own collection with a reference field and a compound index for efficient queries.
|
|
32
|
+
|
|
33
|
+
```javascript
|
|
34
|
+
// Parent stays lean
|
|
35
|
+
{ _id: "user123", name: "Alice", activityCount: 48210, lastActivity: ISODate("...") }
|
|
36
|
+
|
|
37
|
+
// Children in separate collection with efficient index
|
|
38
|
+
// Index: { userId: 1, ts: -1 }
|
|
39
|
+
{ userId: "user123", action: "login", ts: ISODate("...") }
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
For large binary blobs, use GridFS for in-database storage, or — often more efficient — store them in external object storage and keep only a reference in MongoDB.
|
|
43
|
+
|
|
44
|
+
### Solution 2: split hot and cold fields (Subset Pattern)
|
|
45
|
+
|
|
46
|
+
Keep frequently-accessed (hot) data in the main document; store rarely-accessed (cold) data in a separate collection. This dramatically improves cache density for hot-path queries.
|
|
47
|
+
|
|
48
|
+
**Incorrect (all data in one document):** A movie document with all 10,000 reviews embedded (~1MB of cold data alongside ~1KB of hot data like title, rating, plot) means every page load pulls ~1MB into RAM. Most page views only need title + rating + plot, so this reduces how many movies fit in cache (e.g. 1GB RAM ≈ 1,000 movies instead of ~1,000,000 if only hot data were loaded).
|
|
49
|
+
|
|
50
|
+
**Correct (subset pattern):** The movie document (~2KB) contains only hot fields: `title`, `year`, `rating`, `plot`, `reviewStats` (count, avgRating, distribution), and a bounded `featuredReviews` array (top 5 only, ~500 bytes). Full reviews live in a separate `reviews` collection with `movieId` reference, loaded only when the user clicks "Show all reviews."
|
|
51
|
+
|
|
52
|
+
Similarly, a product document should keep only hot fields in the main document (~500 bytes): name, price, thumbnail URL, avgRating, reviewCount, inStock. Move cold data to separate collections — `products_details` (description, fullSpecs), `products_images` (images array), `products_reviews` (paginated reviews).
|
|
53
|
+
|
|
54
|
+
**How to identify hot vs cold data:**
|
|
55
|
+
|
|
56
|
+
| Hot Data (embed) | Cold Data (separate) |
|
|
57
|
+
|------------------|----------------------|
|
|
58
|
+
| Displayed on every page load | Only on user action (click, scroll) |
|
|
59
|
+
| Used for filtering/sorting | Historical/archival |
|
|
60
|
+
| Small relative size | Large relative size |
|
|
61
|
+
| Bounded small subsets | Large or unbounded sets |
|
|
62
|
+
| Changes rarely | Changes frequently |
|
|
63
|
+
|
|
64
|
+
**Maintaining an embedded subset:**
|
|
65
|
+
|
|
66
|
+
```javascript
|
|
67
|
+
// When a new review is added:
|
|
68
|
+
// 1. Insert full review into reviews collection
|
|
69
|
+
db.reviews.insertOne({ movieId: "movie123", user: "newUser", rating: 5, text: "Amazing!", date: new Date(), helpful: 0 })
|
|
70
|
+
|
|
71
|
+
// 2. Update movie stats
|
|
72
|
+
db.movies.updateOne(
|
|
73
|
+
{ _id: "movie123" },
|
|
74
|
+
{ $inc: { "reviewStats.count": 1, "reviewStats.distribution.5": 1 } }
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
// 3. Periodically refresh featured reviews (background job)
|
|
78
|
+
const topReviews = db.reviews.find({ movieId: "movie123" }).sort({ helpful: -1 }).limit(5).toArray()
|
|
79
|
+
db.movies.updateOne({ _id: "movie123" }, { $set: { featuredReviews: topReviews } })
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
For arrays, atomic `$slice` keeps the embedded subset bounded without a background job:
|
|
83
|
+
|
|
84
|
+
```javascript
|
|
85
|
+
db.posts.updateOne(
|
|
86
|
+
{ _id: "post123" },
|
|
87
|
+
{
|
|
88
|
+
$push: {
|
|
89
|
+
recentComments: {
|
|
90
|
+
$each: [newComment],
|
|
91
|
+
$slice: -20,
|
|
92
|
+
$sort: { ts: -1 }
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
$inc: { commentCount: 1 }
|
|
96
|
+
}
|
|
97
|
+
)
|
|
98
|
+
// Also insert into overflow comments collection
|
|
99
|
+
db.comments.insertOne({ postId: "post123", ...newComment })
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Solution 3: projection (when you can't refactor)
|
|
103
|
+
|
|
104
|
+
```javascript
|
|
105
|
+
// Only transfers ~500 bytes instead of 665KB over the network
|
|
106
|
+
db.products.find(
|
|
107
|
+
{ category: "electronics" },
|
|
108
|
+
{ name: 1, price: 1, thumbnail: 1 }
|
|
109
|
+
)
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Projection reduces network transfer but still loads full documents into memory unless the query is fully covered by an index. For real working-set reduction, split hot and cold data into separate collections.
|
|
113
|
+
|
|
114
|
+
### Prevention strategies
|
|
115
|
+
|
|
116
|
+
```javascript
|
|
117
|
+
// 1. Schema validation with array limits
|
|
118
|
+
db.createCollection("users", {
|
|
119
|
+
validator: {
|
|
120
|
+
$jsonSchema: {
|
|
121
|
+
properties: {
|
|
122
|
+
addresses: { maxItems: 10 },
|
|
123
|
+
tags: { maxItems: 100 }
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
})
|
|
128
|
+
// (See fundamental-schema-validation.md for full validation guidance).
|
|
129
|
+
|
|
130
|
+
// 2. Application-level checks before write
|
|
131
|
+
const doc = await db.users.findOne({ _id: userId })
|
|
132
|
+
const currentSize = BSON.calculateObjectSize(doc)
|
|
133
|
+
if (currentSize > 200 * 1024) { // 200KB warning — well before trouble
|
|
134
|
+
logger.warn("Document size exceeding recommended threshold")
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// 3. Use $slice to cap arrays
|
|
138
|
+
db.users.updateOne(
|
|
139
|
+
{ _id: userId },
|
|
140
|
+
{
|
|
141
|
+
$push: {
|
|
142
|
+
activityLog: {
|
|
143
|
+
$each: [newActivity],
|
|
144
|
+
$slice: -1000 // Keep only last 1000
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Workload signals
|
|
152
|
+
|
|
153
|
+
| Signal | Action |
|
|
154
|
+
|--------|--------|
|
|
155
|
+
| Array cardinality keeps growing | Cap with `$slice` or move to separate collection |
|
|
156
|
+
| Array field is heavily indexed | Review multikey fan-out; move cold data out |
|
|
157
|
+
| Reads only need recent subset | Embed recent N, reference full history |
|
|
158
|
+
| Updates slow as array grows | Switch to referenced write path |
|
|
159
|
+
| Documents routinely exceed ~200KB | Reassess schema — consider splitting hot/cold |
|
|
160
|
+
| WiredTiger cache pressure is high | Check for bloated documents; split candidates |
|
|
161
|
+
|
|
162
|
+
### When keeping data together is fine
|
|
163
|
+
|
|
164
|
+
- **Small, bounded arrays** — tags (max 20), roles (max 5), addresses (max 10) with a hard limit.
|
|
165
|
+
- **Write-once arrays** — built once and never modified; size still affects working set.
|
|
166
|
+
- **Arrays of primitives** — `tags: ["a", "b", "c"]` is much cheaper than arrays of objects.
|
|
167
|
+
- **Small collections that fit in RAM** — if your entire collection is <1GB, document size matters less.
|
|
168
|
+
- **Always need all data** — if every access pattern truly needs the full document, splitting adds overhead.
|
|
169
|
+
|
|
170
|
+
## Verify with
|
|
171
|
+
|
|
172
|
+
```javascript
|
|
173
|
+
// Find largest documents in collection
|
|
174
|
+
db.collection.aggregate([
|
|
175
|
+
{ $project: { size: { $bsonSize: "$$ROOT" } } },
|
|
176
|
+
{ $sort: { size: -1 } },
|
|
177
|
+
{ $limit: 10 }
|
|
178
|
+
])
|
|
179
|
+
|
|
180
|
+
// Check specific field sizes to find bloat
|
|
181
|
+
db.collection.aggregate([
|
|
182
|
+
{ $project: {
|
|
183
|
+
total: { $bsonSize: "$$ROOT" },
|
|
184
|
+
activitySize: { $bsonSize: { $ifNull: ["$activityLog", []] } },
|
|
185
|
+
profileSize: { $bsonSize: { $ifNull: ["$profile", {}] } }
|
|
186
|
+
}}
|
|
187
|
+
])
|
|
188
|
+
|
|
189
|
+
// Find documents with large arrays
|
|
190
|
+
db.collection.aggregate([
|
|
191
|
+
{ $project: {
|
|
192
|
+
size: { $bsonSize: "$$ROOT" },
|
|
193
|
+
arrayLen: { $size: { $ifNull: ["$myArray", []] } }
|
|
194
|
+
}},
|
|
195
|
+
{ $match: { arrayLen: { $gt: 100 } } },
|
|
196
|
+
{ $sort: { arrayLen: -1 } },
|
|
197
|
+
{ $limit: 10 }
|
|
198
|
+
])
|
|
199
|
+
|
|
200
|
+
// Find documents with hot/cold imbalance
|
|
201
|
+
db.collection.aggregate([
|
|
202
|
+
{ $project: {
|
|
203
|
+
totalSize: { $bsonSize: "$$ROOT" },
|
|
204
|
+
coldSize: { $bsonSize: { $ifNull: ["$reviews", []] } },
|
|
205
|
+
hotSize: { $subtract: [
|
|
206
|
+
{ $bsonSize: "$$ROOT" },
|
|
207
|
+
{ $bsonSize: { $ifNull: ["$reviews", []] } }
|
|
208
|
+
]}
|
|
209
|
+
}},
|
|
210
|
+
{ $match: {
|
|
211
|
+
$expr: { $gt: ["$coldSize", { $multiply: ["$hotSize", 10] }] }
|
|
212
|
+
}},
|
|
213
|
+
{ $limit: 10 }
|
|
214
|
+
])
|
|
215
|
+
|
|
216
|
+
// Check working set vs RAM
|
|
217
|
+
db.serverStatus().wiredTiger.cache
|
|
218
|
+
// "bytes currently in the cache" vs "maximum bytes configured"
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Atlas Schema Suggestions flags: "Array field may grow without bound", "Document size exceeds recommended limit"
|
|
222
|
+
|
|
223
|
+
References:
|
|
224
|
+
- [BSON Document Size Limit](https://mongodb.com/docs/manual/reference/limits/#std-label-limit-bson-document-size)
|
|
225
|
+
- [Avoid Unbounded Arrays](https://mongodb.com/docs/manual/data-modeling/design-antipatterns/unbounded-arrays/)
|
|
226
|
+
- [Reduce Bloated Documents](https://mongodb.com/docs/manual/data-modeling/design-antipatterns/bloated-documents/)
|