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,418 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Embed vs Reference Decision Framework
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: "Determines long-term query and update paths in your application data model"
|
|
5
|
+
tags: schema, embedding, referencing, relationships, fundamentals, one-to-one, one-to-few, one-to-many, many-to-many, tree, hierarchy
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Embed vs Reference Decision Framework
|
|
9
|
+
|
|
10
|
+
**This is one of the most important schema decisions you'll make.** Choose embedding or referencing based on access patterns, not just entity relationships.
|
|
11
|
+
|
|
12
|
+
**Embed when:**
|
|
13
|
+
- Data is always accessed together (1:1 or 1:few relationships)
|
|
14
|
+
- Child data doesn't make sense without parent
|
|
15
|
+
- Updates to both happen atomically
|
|
16
|
+
- Child array is clearly bounded by product constraints
|
|
17
|
+
|
|
18
|
+
**Reference when:**
|
|
19
|
+
- Data is accessed independently
|
|
20
|
+
- Many-to-many relationships exist
|
|
21
|
+
- Child data is large relative to the parent or array growth is unbounded
|
|
22
|
+
- Different update frequencies
|
|
23
|
+
|
|
24
|
+
**Decision Matrix:**
|
|
25
|
+
|
|
26
|
+
| Relationship | Cardinality | Access Pattern | Bounded? | Decision |
|
|
27
|
+
|--------------|-------------|----------------|----------|----------|
|
|
28
|
+
| User → Profile | 1:1 | Always together | Yes | **Embed** |
|
|
29
|
+
| User → Addresses | 1:few (1-5) | Usually together | Yes | **Embed array** |
|
|
30
|
+
| Order → Line Items | 1:few (1-50) | Always together | Yes | **Embed array** |
|
|
31
|
+
| Publisher → Books | 1:many (1000+) | Often separate | No | **Reference** |
|
|
32
|
+
| Post → Comments | 1:many (unbounded) | Separate adds | No | **Reference** |
|
|
33
|
+
| Students ↔ Classes | Many-to-many | Both directions | Moderate | **Reference both ways** |
|
|
34
|
+
| Product ↔ Category | Many-to-many | Either way | Moderate | **Embed refs in primary direction** |
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
### One-to-One: embed in the parent document
|
|
39
|
+
|
|
40
|
+
**Embed one-to-one related data directly in the parent when it is consistently co-accessed.** Keeping it in one document eliminates a round-trip and guarantees atomicity.
|
|
41
|
+
|
|
42
|
+
**Incorrect (separate collections for 1:1 data):** Storing user accounts and profiles in separate collections when they are always accessed together requires two queries per lookup, two index lookups, and risks orphaned records.
|
|
43
|
+
|
|
44
|
+
**Correct (embedded):**
|
|
45
|
+
|
|
46
|
+
```javascript
|
|
47
|
+
{
|
|
48
|
+
_id: "user123",
|
|
49
|
+
email: "alice@example.com",
|
|
50
|
+
createdAt: ISODate("2024-01-01"),
|
|
51
|
+
profile: {
|
|
52
|
+
name: "Alice Smith",
|
|
53
|
+
avatar: "https://cdn.example.com/alice.jpg",
|
|
54
|
+
bio: "Developer building cool things"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Single query, atomic updates
|
|
59
|
+
db.users.updateOne(
|
|
60
|
+
{ _id: "user123" },
|
|
61
|
+
{ $set: { "profile.name": "Alice Johnson" } }
|
|
62
|
+
)
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Use subdocuments to logically group related fields — e.g. `auth` (passwordHash, lastLogin), `profile` (name, avatar), `settings` (theme, notifications) — all 1:1 data, logically organized without separate collections.
|
|
66
|
+
|
|
67
|
+
**Common 1:1 relationships to embed:** User/Profile, Country/Capital, Building/Address, Order/ShippingAddress, Product/Dimensions.
|
|
68
|
+
|
|
69
|
+
**When NOT to embed 1:1:**
|
|
70
|
+
- Data accessed independently (profile page separate from auth operations)
|
|
71
|
+
- Different security requirements (auth vs profile)
|
|
72
|
+
- Extreme size difference (embedded doc >10KB, parent <1KB)
|
|
73
|
+
- Different update frequencies (profile hourly, auth rarely)
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
### One-to-Few: embed bounded arrays
|
|
78
|
+
|
|
79
|
+
**Embed bounded, small arrays directly in the parent document.** When a parent has a limited number of children usually accessed together, embedding keeps data in one read path.
|
|
80
|
+
|
|
81
|
+
**Incorrect (separate collection for few items):**
|
|
82
|
+
|
|
83
|
+
```javascript
|
|
84
|
+
// Addresses in separate collection — user typically has 1-3
|
|
85
|
+
{ userId: "user123", type: "home", street: "123 Main", city: "Boston" }
|
|
86
|
+
// Requires $lookup for ~2 addresses, orphan risk on user delete
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Correct (embedded array):**
|
|
90
|
+
|
|
91
|
+
```javascript
|
|
92
|
+
{
|
|
93
|
+
_id: "user123",
|
|
94
|
+
name: "Alice Smith",
|
|
95
|
+
addresses: [
|
|
96
|
+
{ type: "home", street: "123 Main St", city: "Boston", state: "MA", zip: "02101" },
|
|
97
|
+
{ type: "work", street: "456 Oak Ave", city: "Boston", state: "MA", zip: "02102" }
|
|
98
|
+
]
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Add address atomically
|
|
102
|
+
db.users.updateOne(
|
|
103
|
+
{ _id: "user123" },
|
|
104
|
+
{ $push: { addresses: { type: "vacation", street: "789 Beach", city: "Miami" } } }
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
// Update specific address
|
|
108
|
+
db.users.updateOne(
|
|
109
|
+
{ _id: "user123", "addresses.type": "home" },
|
|
110
|
+
{ $set: { "addresses.$.city": "Cambridge" } }
|
|
111
|
+
)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Common one-to-few:** User/Addresses (1-5), User/PhoneNumbers (1-3), Product/Variants (3-10), Author/PenNames (1-3), Order/LineItems (1-50).
|
|
115
|
+
|
|
116
|
+
**Enforce bounds with schema validation:**
|
|
117
|
+
|
|
118
|
+
```javascript
|
|
119
|
+
db.createCollection("users", {
|
|
120
|
+
validator: {
|
|
121
|
+
$jsonSchema: {
|
|
122
|
+
properties: {
|
|
123
|
+
addresses: {
|
|
124
|
+
bsonType: "array",
|
|
125
|
+
maxItems: 10,
|
|
126
|
+
items: {
|
|
127
|
+
bsonType: "object",
|
|
128
|
+
required: ["city"],
|
|
129
|
+
properties: {
|
|
130
|
+
type: { enum: ["home", "work", "billing", "shipping"] },
|
|
131
|
+
city: { bsonType: "string" }
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
})
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
(See fundamental-schema-validation.md for full validation guidance).
|
|
142
|
+
|
|
143
|
+
**When NOT to embed arrays:**
|
|
144
|
+
- Unbounded growth (comments, orders, events) — use separate collection
|
|
145
|
+
- Independent access (addresses queried without user context)
|
|
146
|
+
- Large child documents relative to parent
|
|
147
|
+
- Steadily growing array size approaching unbounded behavior
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
### One-to-Many: reference in child documents
|
|
152
|
+
|
|
153
|
+
**Use references when the "many" side is unbounded or frequently accessed independently.** Store the parent's ID in each child document with an index on that field.
|
|
154
|
+
|
|
155
|
+
**Incorrect (embedding unbounded arrays):** Embedding all 10,000+ books inside a publisher document means adding one book rewrites the entire large document, eventually exceeding 16MB.
|
|
156
|
+
|
|
157
|
+
**Correct (reference in children):**
|
|
158
|
+
|
|
159
|
+
```javascript
|
|
160
|
+
// Publisher stays small and fixed-size
|
|
161
|
+
{ _id: "oreilly", name: "O'Reilly Media", founded: 1978, bookCount: 3500 }
|
|
162
|
+
|
|
163
|
+
// Each book references publisher; index on { publisherId: 1 }
|
|
164
|
+
{ _id: "book001", title: "New MongoDB Book", publisherId: "oreilly" }
|
|
165
|
+
|
|
166
|
+
// Efficient indexed queries
|
|
167
|
+
db.books.find({ publisherId: "oreilly" })
|
|
168
|
+
|
|
169
|
+
// $lookup when you need details from both sides
|
|
170
|
+
db.books.aggregate([
|
|
171
|
+
{ $match: { publisherId: "oreilly" } },
|
|
172
|
+
{ $lookup: {
|
|
173
|
+
from: "publishers",
|
|
174
|
+
localField: "publisherId",
|
|
175
|
+
foreignField: "_id",
|
|
176
|
+
as: "publisher"
|
|
177
|
+
}},
|
|
178
|
+
{ $unwind: "$publisher" }
|
|
179
|
+
])
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
**Hybrid with subset:** Embed a bounded subset (e.g. top 5 featured books with `_id`, `title`, `isbn`) in the publisher for display without `$lookup`. "View all books" queries the books collection.
|
|
183
|
+
|
|
184
|
+
**Keep denormalized counts in sync:**
|
|
185
|
+
|
|
186
|
+
```javascript
|
|
187
|
+
db.books.insertOne({ title: "New Book", publisherId: "oreilly" })
|
|
188
|
+
db.publishers.updateOne({ _id: "oreilly" }, { $inc: { bookCount: 1 } })
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**When to reference:** Unbounded children (Publisher→Books), large child documents (User→Orders), independent queries (Department→Employees), different lifecycles (Author→Articles).
|
|
192
|
+
|
|
193
|
+
**When NOT to reference:** Bounded small arrays (User's 3 addresses), always accessed together (Order→LineItems), never queried without parent.
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
### Many-to-Many: choose a primary query direction
|
|
198
|
+
|
|
199
|
+
**Many-to-many relationships require choosing a primary query direction.** Unlike SQL's join tables, MongoDB favors denormalization toward your most common query pattern.
|
|
200
|
+
|
|
201
|
+
**Incorrect (SQL-style junction table):**
|
|
202
|
+
|
|
203
|
+
```javascript
|
|
204
|
+
// 3 collections, always need joins
|
|
205
|
+
// students: { _id, name } / classes: { _id, name } / enrollments: { studentId, classId }
|
|
206
|
+
// Every query requires aggregation with $lookup
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**Correct (embed in primary query direction):**
|
|
210
|
+
|
|
211
|
+
Embed references on the side you query most. If you primarily query "which classes is this student in," embed class summaries in the student. For the reverse, embed student summaries in the class.
|
|
212
|
+
|
|
213
|
+
**Bidirectional embedding (when both directions are common):**
|
|
214
|
+
|
|
215
|
+
```javascript
|
|
216
|
+
// Book with author summaries
|
|
217
|
+
{
|
|
218
|
+
_id: "book001",
|
|
219
|
+
title: "Cell Biology",
|
|
220
|
+
authors: [
|
|
221
|
+
{ authorId: "author124", name: "Ellie Smith" },
|
|
222
|
+
{ authorId: "author381", name: "John Palmer" }
|
|
223
|
+
]
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Author with book summaries
|
|
227
|
+
{
|
|
228
|
+
_id: "author124",
|
|
229
|
+
name: "Ellie Smith",
|
|
230
|
+
books: [
|
|
231
|
+
{ bookId: "book001", title: "Cell Biology" },
|
|
232
|
+
{ bookId: "book042", title: "Molecular Biology" }
|
|
233
|
+
]
|
|
234
|
+
}
|
|
235
|
+
// Trade-off: data duplication, but fast queries in both directions
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
**Reference-only (for large cardinality):**
|
|
239
|
+
|
|
240
|
+
```javascript
|
|
241
|
+
// Product stores category IDs (small array per product)
|
|
242
|
+
{ _id: "prod123", name: "Laptop", categoryIds: ["cat1", "cat2", "cat3"] }
|
|
243
|
+
// Category has no back-reference array (avoid huge arrays)
|
|
244
|
+
{ _id: "cat1", name: "Electronics" }
|
|
245
|
+
// Products in a category: db.products.find({ categoryIds: "cat1" })
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**Choosing strategy:**
|
|
249
|
+
|
|
250
|
+
| Query Pattern | Cardinality | Strategy |
|
|
251
|
+
|---------------|-------------|----------|
|
|
252
|
+
| Students → Classes | Few classes per student | Embed in student |
|
|
253
|
+
| Classes → Students | Many students per class | Reference only |
|
|
254
|
+
| Both directions common | Moderate both sides | Bidirectional embed |
|
|
255
|
+
| High cardinality both | Large/growing both sides | Reference-only + `$lookup` |
|
|
256
|
+
|
|
257
|
+
**Maintaining bidirectional data — use transactions for atomicity:**
|
|
258
|
+
|
|
259
|
+
```javascript
|
|
260
|
+
const session = client.startSession()
|
|
261
|
+
session.withTransaction(async () => {
|
|
262
|
+
await db.students.updateOne(
|
|
263
|
+
{ _id: "student1" },
|
|
264
|
+
{ $push: { classes: { classId: "class101", name: "Database Systems" } } },
|
|
265
|
+
{ session }
|
|
266
|
+
)
|
|
267
|
+
await db.classes.updateOne(
|
|
268
|
+
{ _id: "class101" },
|
|
269
|
+
{ $push: { students: { studentId: "student1", name: "Alice Smith" } } },
|
|
270
|
+
{ session }
|
|
271
|
+
)
|
|
272
|
+
})
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
### Tree and hierarchical data
|
|
278
|
+
|
|
279
|
+
**Hierarchical data requires choosing a tree pattern based on your primary operations.** MongoDB offers multiple patterns, each with different tradeoffs.
|
|
280
|
+
|
|
281
|
+
**Common hierarchical data:** Category trees, org charts, file/folder structures, comment threads, geographic hierarchies.
|
|
282
|
+
|
|
283
|
+
#### Pattern 1: Parent References
|
|
284
|
+
|
|
285
|
+
**Best for:** Finding parent, updating parent, simple child listing.
|
|
286
|
+
|
|
287
|
+
```javascript
|
|
288
|
+
{ _id: "MongoDB", parent: "Databases" }
|
|
289
|
+
{ _id: "Databases", parent: "Programming" }
|
|
290
|
+
{ _id: "Programming", parent: null }
|
|
291
|
+
|
|
292
|
+
db.categories.createIndex({ parent: 1 })
|
|
293
|
+
db.categories.find({ parent: "Databases" }) // immediate children
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
Con: Finding all descendants requires recursive queries or `$graphLookup`.
|
|
297
|
+
|
|
298
|
+
#### Pattern 2: Child References
|
|
299
|
+
|
|
300
|
+
**Best for:** Finding children, graph-like structures.
|
|
301
|
+
|
|
302
|
+
```javascript
|
|
303
|
+
{ _id: "Databases", children: ["MongoDB", "PostgreSQL", "MySQL"] }
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
Con: Finding ancestors requires recursion; array updates on every child add/remove.
|
|
307
|
+
|
|
308
|
+
#### Pattern 3: Array of Ancestors
|
|
309
|
+
|
|
310
|
+
**Best for:** Breadcrumb navigation, ancestor and descendant lookups.
|
|
311
|
+
|
|
312
|
+
```javascript
|
|
313
|
+
{ _id: "MongoDB", parent: "Databases", ancestors: ["Programming", "Databases"] }
|
|
314
|
+
{ _id: "Atlas", parent: "MongoDB", ancestors: ["Programming", "Databases", "MongoDB"] }
|
|
315
|
+
|
|
316
|
+
db.categories.createIndex({ ancestors: 1 })
|
|
317
|
+
db.categories.find({ ancestors: "Databases" }) // all descendants
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
Including a `parent` field enables `$graphLookup` traversal without application-side recursion.
|
|
321
|
+
|
|
322
|
+
#### Pattern 4: Materialized Paths
|
|
323
|
+
|
|
324
|
+
**Best for:** Subtree queries, regex-based lookups, hierarchy sorting.
|
|
325
|
+
|
|
326
|
+
```javascript
|
|
327
|
+
{ _id: "MongoDB", path: ",Programming,Databases,MongoDB," }
|
|
328
|
+
{ _id: "Atlas", path: ",Programming,Databases,MongoDB,Atlas," }
|
|
329
|
+
|
|
330
|
+
db.categories.createIndex({ path: 1 })
|
|
331
|
+
db.categories.find({ path: /^,Programming,Databases,MongoDB,/ }) // all descendants
|
|
332
|
+
db.categories.find({}).sort({ path: 1 }) // hierarchy display order
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
#### Tree pattern comparison
|
|
336
|
+
|
|
337
|
+
| Pattern | Parent | Children | Descendants | Ancestors | Update Cost |
|
|
338
|
+
|---------|--------|----------|-------------|-----------|-------------|
|
|
339
|
+
| Parent Refs | Direct | Indexed | Recursive/`$graphLookup` | Recursive | Low |
|
|
340
|
+
| Child Refs | Membership query | Direct | Recursive/`$graphLookup` | Recursive | Low–moderate |
|
|
341
|
+
| Array of Ancestors | Via `parent` | Via `parent` | Fast (indexed) | Direct (stored) | Moderate |
|
|
342
|
+
| Materialized Paths | Via path/`parent` | Prefix query | Regex/prefix | From stored path | Moderate |
|
|
343
|
+
|
|
344
|
+
**Recommended by use case:** Category breadcrumbs → Array of Ancestors. File browser → Parent References. Org chart reporting → Materialized Paths. Comment threads → Parent References.
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
### When NOT to embed (summary)
|
|
349
|
+
|
|
350
|
+
- **Unbounded growth**: Comments, logs, events — separate collection.
|
|
351
|
+
- **Large child documents**: If each child is large relative to the parent, references are usually safer.
|
|
352
|
+
- **Independent access**: If you ever query child without parent, reference.
|
|
353
|
+
- **Different lifecycles**: If child data is archived/deleted separately.
|
|
354
|
+
- **Graph-like data**: Multiple parents → use `$graphLookup` or a graph database.
|
|
355
|
+
|
|
356
|
+
## Verify with
|
|
357
|
+
|
|
358
|
+
```javascript
|
|
359
|
+
// Check document sizes for embedded collections
|
|
360
|
+
db.collection.aggregate([
|
|
361
|
+
{ $project: {
|
|
362
|
+
size: { $bsonSize: "$$ROOT" },
|
|
363
|
+
arrayLen: { $size: { $ifNull: ["$items", []] } }
|
|
364
|
+
}},
|
|
365
|
+
{ $match: { size: { $gt: 1000000 } } }
|
|
366
|
+
])
|
|
367
|
+
// Large documents may indicate embedding that should be referencing
|
|
368
|
+
|
|
369
|
+
// Check embedded array sizes (one-to-few validation)
|
|
370
|
+
db.users.aggregate([
|
|
371
|
+
{ $project: { addressCount: { $size: { $ifNull: ["$addresses", []] } } } },
|
|
372
|
+
{ $group: { _id: null, avg: { $avg: "$addressCount" }, max: { $max: "$addressCount" } } }
|
|
373
|
+
])
|
|
374
|
+
// If max keeps growing, consider a separate collection
|
|
375
|
+
|
|
376
|
+
// Check for orphaned references (1:1 that should be embedded)
|
|
377
|
+
db.profiles.aggregate([
|
|
378
|
+
{ $lookup: { from: "users", localField: "userId", foreignField: "_id", as: "user" } },
|
|
379
|
+
{ $match: { user: { $size: 0 } } }
|
|
380
|
+
])
|
|
381
|
+
// Orphans suggest 1:1 data should be embedded
|
|
382
|
+
|
|
383
|
+
// Check for missing indexes on reference fields
|
|
384
|
+
db.books.getIndexes()
|
|
385
|
+
// Must have index on publisherId for efficient child lookups
|
|
386
|
+
|
|
387
|
+
// Verify bidirectional many-to-many consistency
|
|
388
|
+
db.students.aggregate([
|
|
389
|
+
{ $unwind: "$classes" },
|
|
390
|
+
{ $lookup: {
|
|
391
|
+
from: "classes",
|
|
392
|
+
let: { sid: "$_id", cid: "$classes.classId" },
|
|
393
|
+
pipeline: [
|
|
394
|
+
{ $match: { $expr: { $eq: ["$_id", "$$cid"] } } },
|
|
395
|
+
{ $match: { $expr: { $in: ["$$sid", "$students.studentId"] } } }
|
|
396
|
+
],
|
|
397
|
+
as: "match"
|
|
398
|
+
}},
|
|
399
|
+
{ $match: { match: { $size: 0 } } }
|
|
400
|
+
])
|
|
401
|
+
// Mismatches indicate inconsistent bidirectional data
|
|
402
|
+
|
|
403
|
+
// Check tree consistency (no orphaned nodes)
|
|
404
|
+
db.categories.aggregate([
|
|
405
|
+
{ $match: { parent: { $ne: null } } },
|
|
406
|
+
{ $lookup: { from: "categories", localField: "parent", foreignField: "_id", as: "parentDoc" } },
|
|
407
|
+
{ $match: { parentDoc: { $size: 0 } } },
|
|
408
|
+
{ $count: "orphanedNodes" }
|
|
409
|
+
])
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
References:
|
|
413
|
+
- [Embedding vs Referencing](https://mongodb.com/docs/manual/data-modeling/concepts/embedding-vs-references/)
|
|
414
|
+
- [Model One-to-One Relationships](https://mongodb.com/docs/manual/tutorial/model-embedded-one-to-one-relationships-between-documents/)
|
|
415
|
+
- [Model One-to-Many Relationships with Embedded Documents](https://mongodb.com/docs/manual/tutorial/model-embedded-one-to-many-relationships-between-documents/)
|
|
416
|
+
- [Model One-to-Many Relationships with References](https://mongodb.com/docs/manual/tutorial/model-referenced-one-to-many-relationships-between-documents/)
|
|
417
|
+
- [Model Many-to-Many Relationships](https://mongodb.com/docs/manual/tutorial/model-embedded-many-to-many-relationships-between-documents/)
|
|
418
|
+
- [Model Tree Structures](https://mongodb.com/docs/manual/applications/data-models-tree-structures/)
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use Schema Validation
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: "Prevents invalid data at database level, catches bugs before production corruption"
|
|
5
|
+
tags: schema, validation, json-schema, data-integrity, fundamentals
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Use Schema Validation
|
|
9
|
+
|
|
10
|
+
**Enforce document structure with MongoDB's built-in JSON Schema validation.** Catch invalid data before it corrupts your database, not after you've shipped 10,000 malformed documents to production. Schema validation is your last line of defense when application bugs slip through.
|
|
11
|
+
|
|
12
|
+
**Incorrect (no validation):**
|
|
13
|
+
|
|
14
|
+
Without validation, any document shape is accepted: an `email` field can contain a non-email string, an `age` field can hold a string instead of a number, and required fields like `email` can be omitted entirely. These invalid documents are discovered only when downstream consumers crash or return wrong data — often months later.
|
|
15
|
+
|
|
16
|
+
**Correct (schema validation):**
|
|
17
|
+
|
|
18
|
+
```javascript
|
|
19
|
+
// Create collection with validation rules
|
|
20
|
+
db.createCollection("users", {
|
|
21
|
+
validator: {
|
|
22
|
+
$jsonSchema: {
|
|
23
|
+
bsonType: "object",
|
|
24
|
+
required: ["email", "name"],
|
|
25
|
+
properties: {
|
|
26
|
+
email: {
|
|
27
|
+
bsonType: "string",
|
|
28
|
+
pattern: "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
|
|
29
|
+
description: "must be a valid email address"
|
|
30
|
+
},
|
|
31
|
+
name: {
|
|
32
|
+
bsonType: "string",
|
|
33
|
+
minLength: 1,
|
|
34
|
+
maxLength: 100,
|
|
35
|
+
description: "must be 1-100 characters"
|
|
36
|
+
},
|
|
37
|
+
age: {
|
|
38
|
+
bsonType: "int",
|
|
39
|
+
minimum: 0,
|
|
40
|
+
maximum: 150,
|
|
41
|
+
description: "must be integer 0-150"
|
|
42
|
+
},
|
|
43
|
+
status: {
|
|
44
|
+
enum: ["active", "inactive", "pending"],
|
|
45
|
+
description: "must be one of: active, inactive, pending"
|
|
46
|
+
},
|
|
47
|
+
addresses: {
|
|
48
|
+
bsonType: "array",
|
|
49
|
+
maxItems: 10, // Prevent unbounded arrays
|
|
50
|
+
items: {
|
|
51
|
+
bsonType: "object",
|
|
52
|
+
required: ["city"],
|
|
53
|
+
properties: {
|
|
54
|
+
street: { bsonType: "string" },
|
|
55
|
+
city: { bsonType: "string" },
|
|
56
|
+
zip: { bsonType: "string", pattern: "^[0-9]{5}$" }
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
validationLevel: "strict",
|
|
64
|
+
validationAction: "error"
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
// Invalid inserts now fail immediately with clear error
|
|
68
|
+
db.users.insertOne({ email: "not-an-email" })
|
|
69
|
+
// Error: Document failed validation:
|
|
70
|
+
// "email" does not match pattern, "name" is required
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Validation levels and actions:**
|
|
74
|
+
|
|
75
|
+
| validationLevel | Behavior |
|
|
76
|
+
|-----------------|----------|
|
|
77
|
+
| `strict` | Validate ALL inserts and updates (default, recommended) |
|
|
78
|
+
| `moderate` | Only validate documents that already match schema |
|
|
79
|
+
|
|
80
|
+
| validationAction | Behavior |
|
|
81
|
+
|------------------|----------|
|
|
82
|
+
| `error` | Reject invalid documents (default, recommended) |
|
|
83
|
+
| `warn` | Allow but log warning (use during migration only) |
|
|
84
|
+
|
|
85
|
+
**Add validation to existing collection:**
|
|
86
|
+
|
|
87
|
+
```javascript
|
|
88
|
+
// Start with moderate + warn to discover violations
|
|
89
|
+
db.runCommand({
|
|
90
|
+
collMod: "users",
|
|
91
|
+
validator: { $jsonSchema: {...} },
|
|
92
|
+
validationLevel: "moderate", // Don't break existing invalid docs
|
|
93
|
+
validationAction: "warn" // Log violations, don't block
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
// Check for violations using the actual validator shape
|
|
97
|
+
const info = db.getCollectionInfos({ name: "users" })[0]
|
|
98
|
+
const validator = info?.options?.validator
|
|
99
|
+
db.users.find({ $nor: [validator] })
|
|
100
|
+
|
|
101
|
+
// Then switch to strict + error
|
|
102
|
+
db.runCommand({
|
|
103
|
+
collMod: "users",
|
|
104
|
+
validationLevel: "strict",
|
|
105
|
+
validationAction: "error"
|
|
106
|
+
})
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**When NOT to use this pattern:**
|
|
110
|
+
|
|
111
|
+
- **Rapid prototyping**: Skip validation during early development, add before production.
|
|
112
|
+
- **Schema-per-document designs**: Some collections intentionally store varied document shapes.
|
|
113
|
+
- **Log/event collections**: High-write collections where validation overhead matters.
|
|
114
|
+
|
|
115
|
+
## Verify with
|
|
116
|
+
|
|
117
|
+
```javascript
|
|
118
|
+
// Read current validator and validation settings
|
|
119
|
+
const info = db.getCollectionInfos({ name: "users" })[0]
|
|
120
|
+
printjson({
|
|
121
|
+
validationLevel: info?.options?.validationLevel,
|
|
122
|
+
validationAction: info?.options?.validationAction,
|
|
123
|
+
validator: info?.options?.validator
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
// Primary compliance check: find documents that do NOT match validator
|
|
127
|
+
const validator = info?.options?.validator
|
|
128
|
+
db.users.find({ $nor: [validator] })
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Reference: [Schema Validation](https://mongodb.com/docs/manual/core/schema-validation/)
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Approximation Pattern"
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: "Reduces write load by storing approximate values when exact real-time counts are not required"
|
|
5
|
+
tags: schema, patterns, approximation, computed, write-optimization
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Approximation Pattern
|
|
9
|
+
|
|
10
|
+
**Intentionally store approximate values to reduce write load when exact real-time counts are not required.** High-frequency counters (page views, trending scores, social media counters) that increment by +1 per event can create expensive per-event writes. The approximation pattern batches these increments, trading staleness for dramatically lower write volume.
|
|
11
|
+
|
|
12
|
+
**Incorrect (write to database on every event):**
|
|
13
|
+
|
|
14
|
+
```javascript
|
|
15
|
+
// Page view counter - writes to MongoDB on every single view
|
|
16
|
+
function recordPageView(articleId) {
|
|
17
|
+
db.articles.updateOne(
|
|
18
|
+
{ _id: articleId },
|
|
19
|
+
{
|
|
20
|
+
$inc: { viewCount: 1 },
|
|
21
|
+
$set: { lastViewedAt: new Date() }
|
|
22
|
+
}
|
|
23
|
+
)
|
|
24
|
+
}
|
|
25
|
+
// 1M page views/day = 1M database writes/day
|
|
26
|
+
// High write load for a counter that doesn't need real-time accuracy
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Correct (batch writes with threshold):**
|
|
30
|
+
|
|
31
|
+
The document stores an approximate count plus a sync timestamp. The application tracks counts in local memory (e.g. a `Map` keyed by article ID) and writes to the database only when the local counter crosses a threshold (e.g. every 100 views). At threshold=100 this yields ~100× fewer database writes.
|
|
32
|
+
|
|
33
|
+
The document includes `viewCount` (approximate — may lag by up to one threshold) and `lastSyncedAt`. When the local counter reaches the threshold, the application issues a single `$inc` by the threshold amount and updates `lastSyncedAt`. Unsynced local increments are lost on application restart.
|
|
34
|
+
|
|
35
|
+
**Tradeoffs:**
|
|
36
|
+
|
|
37
|
+
| Concern | Impact |
|
|
38
|
+
|---------|--------|
|
|
39
|
+
| Write reduction | ~100x fewer DB writes (at threshold=100) |
|
|
40
|
+
| Staleness | Up to `threshold` events behind |
|
|
41
|
+
| Accuracy | Approximate — never exact real-time |
|
|
42
|
+
| Crash safety | Unsynced local increments lost on restart |
|
|
43
|
+
|
|
44
|
+
**Difference from Computed Pattern:**
|
|
45
|
+
|
|
46
|
+
- **Computed Pattern**: pre-computes expensive aggregations, stores exact results
|
|
47
|
+
- **Approximation Pattern**: intentionally stores inexact values to reduce write frequency
|
|
48
|
+
|
|
49
|
+
Use Approximation when staleness is acceptable. Use Computed when exact values are needed but recalculating each time is too expensive.
|
|
50
|
+
|
|
51
|
+
**When NOT to use this pattern:**
|
|
52
|
+
|
|
53
|
+
- **Financial amounts, inventory counts**: Exact values required — approximation is unacceptable.
|
|
54
|
+
- **Low-frequency updates**: If counter changes rarely, approximation adds complexity without benefit.
|
|
55
|
+
- **Regulatory/audit requirements**: When exact counts are mandated.
|
|
56
|
+
|
|
57
|
+
## Verify with
|
|
58
|
+
|
|
59
|
+
### Check write frequency on counter fields
|
|
60
|
+
|
|
61
|
+
Use codebase if available, ask the user.
|
|
62
|
+
|
|
63
|
+
High count relative to read count on a specific field suggests approximation would help
|
|
64
|
+
|
|
65
|
+
```javascript
|
|
66
|
+
// Compare counter staleness
|
|
67
|
+
db.articles.aggregate([
|
|
68
|
+
{ $sort: { lastSyncedAt: 1 } },
|
|
69
|
+
{ $limit: 10 },
|
|
70
|
+
{ $project: {
|
|
71
|
+
title: 1,
|
|
72
|
+
viewCount: 1,
|
|
73
|
+
lastSyncedAt: 1,
|
|
74
|
+
staleness: { $subtract: ["$$NOW", "$lastSyncedAt"] }
|
|
75
|
+
}}
|
|
76
|
+
])
|
|
77
|
+
// Verify staleness is within acceptable bounds for your use case
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Reference: [Use the Approximation Pattern](https://mongodb.com/docs/manual/data-modeling/design-patterns/computed-values/approximation-schema-pattern/)
|