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,143 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use Archive Pattern for Historical Data
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: "Reduces active collection size, improves query performance, lowers storage costs"
|
|
5
|
+
tags: schema, patterns, archive, data-lifecycle, merge, ttl, online-archive
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Use Archive Pattern for Historical Data
|
|
9
|
+
|
|
10
|
+
**Storing old data alongside recent data degrades performance.** As collections grow with historical data that's rarely accessed, queries slow down, indexes bloat, and working set exceeds RAM. The archive pattern moves old data to separate storage while keeping your active collection fast.
|
|
11
|
+
|
|
12
|
+
**Incorrect (all data in one collection):**
|
|
13
|
+
|
|
14
|
+
A sales collection with 5 years of data (50M documents) where only the recent 6 months are actively queried suffers from: indexes covering the full 50M documents when only ~1M are relevant, working set including old data pages, backups including rarely-accessed history, and hot-tier storage costs for data that could be cold.
|
|
15
|
+
|
|
16
|
+
**Correct (archive old data separately):**
|
|
17
|
+
|
|
18
|
+
```javascript
|
|
19
|
+
// Step 1: Define archive threshold (older than 6 months)
|
|
20
|
+
const sixMonthsAgo = new Date()
|
|
21
|
+
sixMonthsAgo.setMonth(sixMonthsAgo.getMonth() - 6)
|
|
22
|
+
|
|
23
|
+
// Step 2: Move old data to archive collection using $merge
|
|
24
|
+
db.sales.aggregate([
|
|
25
|
+
{ $match: { date: { $lt: sixMonthsAgo } } },
|
|
26
|
+
{ $merge: {
|
|
27
|
+
into: "sales_archive",
|
|
28
|
+
on: "_id",
|
|
29
|
+
whenMatched: "keepExisting", // Don't overwrite if re-run
|
|
30
|
+
whenNotMatched: "insert"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
])
|
|
34
|
+
|
|
35
|
+
// Step 3: Delete archived data from active collection
|
|
36
|
+
db.sales.deleteMany({ date: { $lt: sixMonthsAgo } })
|
|
37
|
+
|
|
38
|
+
// Result:
|
|
39
|
+
// - sales: Recent data, fast queries, small indexes
|
|
40
|
+
// - sales_archive: Historical data, rarely queried
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Archive storage options (best to worst for cost/performance):**
|
|
44
|
+
|
|
45
|
+
1. **External file storage (S3, cloud object storage)** — Best for compliance and long-term retention at lowest cost. Export to JSON/BSON, store in S3, query via Atlas Data Federation when needed.
|
|
46
|
+
2. **Separate, cheaper cluster** — Best for occasional historical queries. Replicate to a lower-tier Atlas cluster at reduced cost.
|
|
47
|
+
3. **Separate collection on same cluster** — Best for simple implementation with frequent historical access. As shown above with `sales_archive`, but still uses the same storage tier.
|
|
48
|
+
4. **Atlas Online Archive (Atlas only)** — MongoDB manages automatic movement to cloud object storage; query via Federated Database Instance.
|
|
49
|
+
|
|
50
|
+
**Design tips for archivable schemas:**
|
|
51
|
+
|
|
52
|
+
```javascript
|
|
53
|
+
// TIP 1: Use embedded data model for archives
|
|
54
|
+
// Archived data must be self-contained
|
|
55
|
+
|
|
56
|
+
// BAD: References that may be deleted
|
|
57
|
+
{
|
|
58
|
+
_id: "order123",
|
|
59
|
+
customerId: "cust456", // Customer may be deleted
|
|
60
|
+
productIds: ["prod1", "prod2"] // Products may change
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// GOOD: Embedded snapshot of related data
|
|
64
|
+
{
|
|
65
|
+
_id: "order123",
|
|
66
|
+
customer: {
|
|
67
|
+
_id: "cust456",
|
|
68
|
+
name: "Jane Doe",
|
|
69
|
+
email: "jane@example.com"
|
|
70
|
+
},
|
|
71
|
+
products: [
|
|
72
|
+
{ _id: "prod1", name: "Widget", price: 29.99 },
|
|
73
|
+
{ _id: "prod2", name: "Gadget", price: 49.99 }
|
|
74
|
+
],
|
|
75
|
+
date: ISODate("2020-01-15")
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// TIP 2: Store age in a single, indexable field
|
|
79
|
+
// Makes archive queries efficient
|
|
80
|
+
{
|
|
81
|
+
date: ISODate("2020-01-15"), // Single field for age
|
|
82
|
+
// NOT: { year: 2020, month: 1, day: 15 }
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// TIP 3: Handle "never expire" documents
|
|
86
|
+
{
|
|
87
|
+
date: ISODate("2025-01-15"),
|
|
88
|
+
retentionPolicy: "permanent" // Or use far-future date
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Archive query excludes permanent records:
|
|
92
|
+
db.sales.aggregate([
|
|
93
|
+
{ $match: {
|
|
94
|
+
date: { $lt: fiveYearsAgo },
|
|
95
|
+
retentionPolicy: { $ne: "permanent" }
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
{ $merge: { into: "sales_archive" } }
|
|
99
|
+
])
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Automated archival with scheduling:**
|
|
103
|
+
|
|
104
|
+
Create a script (run via cron, Atlas Triggers, or an application scheduler) that:
|
|
105
|
+
|
|
106
|
+
1. Counts documents older than the cutoff date (excluding those with `retentionPolicy: "permanent"`).
|
|
107
|
+
2. Processes in batches (e.g. 10,000 IDs at a time) to avoid long-running operations: fetch a batch of `_id` values, pipe them through an aggregation with `$match` and `$merge` into the archive collection, then `deleteMany` the batch from the active collection.
|
|
108
|
+
3. Logs progress after each batch.
|
|
109
|
+
|
|
110
|
+
This reuses the same `$merge`-based archival shown above but throttles work to avoid overloading the cluster.
|
|
111
|
+
|
|
112
|
+
**Atlas Online Archive (Atlas only):**
|
|
113
|
+
|
|
114
|
+
Atlas Online Archive automatically tiers data to MongoDB-managed cloud object storage based on a date-field rule (e.g. archive after 365 days). Archived data is queried transparently via a Federated Database Instance — slightly slower but much cheaper. No application code changes are required.
|
|
115
|
+
|
|
116
|
+
**When NOT to use archive pattern:**
|
|
117
|
+
|
|
118
|
+
- **Small datasets**: If total data fits comfortably in RAM, archiving adds complexity without benefit.
|
|
119
|
+
- **Uniform access patterns**: If old and new data are queried equally.
|
|
120
|
+
- **Compliance requires instant access**: If regulations require sub-second queries on all historical data.
|
|
121
|
+
- **Already using TTL**: If data should be deleted, not archived, use TTL indexes.
|
|
122
|
+
|
|
123
|
+
## Verify with
|
|
124
|
+
|
|
125
|
+
```javascript
|
|
126
|
+
// Analyze archive candidates
|
|
127
|
+
const cutoff = new Date()
|
|
128
|
+
cutoff.setFullYear(cutoff.getFullYear() - 5)
|
|
129
|
+
|
|
130
|
+
db.sales.aggregate([
|
|
131
|
+
{ $facet: {
|
|
132
|
+
total: [{ $count: "count" }],
|
|
133
|
+
old: [
|
|
134
|
+
{ $match: { date: { $lt: cutoff } } },
|
|
135
|
+
{ $count: "count" }
|
|
136
|
+
]
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
])
|
|
140
|
+
// If old documents are >30% of total, archiving can improve performance
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Reference: [Archive Pattern](https://mongodb.com/docs/manual/data-modeling/design-patterns/archive/)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use Attribute Pattern for Sparse or Variable Fields
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: "Reduces sparse indexes and enables efficient search across many optional fields"
|
|
5
|
+
tags: schema, patterns, attribute, sparse-fields, indexing, flexible-schema
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Use Attribute Pattern for Sparse or Variable Fields
|
|
9
|
+
|
|
10
|
+
**If documents have many optional fields, move them into a key-value array.** This avoids dozens of sparse indexes and lets you query across attributes with a single multikey index.
|
|
11
|
+
|
|
12
|
+
**Incorrect (separate field and index per optional attribute):**
|
|
13
|
+
|
|
14
|
+
```javascript
|
|
15
|
+
// Many optional fields - most are missing on any given document
|
|
16
|
+
{
|
|
17
|
+
_id: 1,
|
|
18
|
+
name: "Bottle",
|
|
19
|
+
color: "red",
|
|
20
|
+
size: "M",
|
|
21
|
+
material: "glass",
|
|
22
|
+
// 20+ other optional fields, varying per document
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// One partial index per optional field — correct use of partialFilterExpression,
|
|
26
|
+
// but you end up maintaining dozens of indexes as attributes grow
|
|
27
|
+
db.items.createIndex({ color: 1 }, { partialFilterExpression: { color: { $exists: true } } })
|
|
28
|
+
db.items.createIndex({ size: 1 }, { partialFilterExpression: { size: { $exists: true } } })
|
|
29
|
+
db.items.createIndex({ material: 1 }, { partialFilterExpression: { material: { $exists: true } } })
|
|
30
|
+
// … repeated for every new attribute
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Correct (attribute pattern):**
|
|
34
|
+
|
|
35
|
+
```javascript
|
|
36
|
+
// Store optional fields as key-value pairs
|
|
37
|
+
{
|
|
38
|
+
_id: 1,
|
|
39
|
+
name: "Bottle",
|
|
40
|
+
attributes: [
|
|
41
|
+
{ k: "color", v: "red" },
|
|
42
|
+
{ k: "size", v: "M" },
|
|
43
|
+
{ k: "material", v: "glass" }
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Single multikey index for all attributes
|
|
48
|
+
|
|
49
|
+
db.items.createIndex({ "attributes.k": 1, "attributes.v": 1 })
|
|
50
|
+
|
|
51
|
+
// Query for color = red
|
|
52
|
+
|
|
53
|
+
db.items.find({
|
|
54
|
+
attributes: { $elemMatch: { k: "color", v: "red" } }
|
|
55
|
+
})
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**When NOT to use this pattern:**
|
|
59
|
+
|
|
60
|
+
- **Fixed schema**: If fields are stable and always present.
|
|
61
|
+
- **Type-specific validation**: If each field needs strict schema rules.
|
|
62
|
+
- **Single-field queries only**: A normal field may be simpler and faster.
|
|
63
|
+
- **Atlas Search workloads**: The `{ k, v }` key-value structure cannot be mapped as
|
|
64
|
+
named fields in Atlas Search indexes. If you need full-text search on attribute
|
|
65
|
+
values by key name, use static named fields instead.
|
|
66
|
+
|
|
67
|
+
## Verify with
|
|
68
|
+
|
|
69
|
+
```javascript
|
|
70
|
+
// Ensure queries use the multikey index
|
|
71
|
+
|
|
72
|
+
db.items.find({
|
|
73
|
+
attributes: { $elemMatch: { k: "material", v: "glass" } }
|
|
74
|
+
}).explain("executionStats")
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Reference: [Attribute Pattern](https://mongodb.com/docs/manual/data-modeling/design-patterns/group-data/attribute-pattern/)
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use Bucket Pattern to Group Related Data
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: "Reduces document count and can align storage with application access patterns like pagination"
|
|
5
|
+
tags: schema, patterns, bucket, grouping, pagination, arrays
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Use Bucket Pattern to Group Related Data
|
|
9
|
+
|
|
10
|
+
**Group a series of related items into bounded arrays within a single document.** The bucket pattern separates long series of data into distinct objects, reducing document count and aligning storage with how data is actually consumed. This is especially useful when an application accesses data in fixed-size groups (e.g. pages).
|
|
11
|
+
|
|
12
|
+
> **For time-series data**, prefer [Time Series Collections](https://www.mongodb.com/docs/manual/core/timeseries-collections/), which apply bucketing automatically with built-in compression and indexing optimizations.
|
|
13
|
+
|
|
14
|
+
**Incorrect (one document per event):**
|
|
15
|
+
|
|
16
|
+
Storing one document per stock trade (e.g. `{ ticker, customerId, type, quantity, date }`) means the application pages through trades using skip/limit, which degrades as offset grows. Each trade is a separate document and index entry.
|
|
17
|
+
|
|
18
|
+
**Correct (bucket pattern - group by customer, bounded per page):**
|
|
19
|
+
|
|
20
|
+
Each document holds up to N trades for one customer (e.g. 10 trades = one page). The `_id` encodes customer ID and the first trade’s epoch seconds (e.g. `"123_1698349623"`), with a `count` field and a `history` array of trade objects. One bucket equals one page of data — a regex on `_id` uses the default `_id` index with no extra index needed, and document count drops by up to the bucket-size factor.
|
|
21
|
+
|
|
22
|
+
**Insert with atomic upsert:**
|
|
23
|
+
|
|
24
|
+
```javascript
|
|
25
|
+
// Insert a new trade into the correct bucket
|
|
26
|
+
db.trades.findOneAndUpdate(
|
|
27
|
+
{
|
|
28
|
+
"_id": /^123_/, // Match buckets for this customer
|
|
29
|
+
"count": { $lt: 10 } // Only if bucket isn't full
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
$push: {
|
|
33
|
+
history: {
|
|
34
|
+
type: "buy",
|
|
35
|
+
ticker: "MSFT",
|
|
36
|
+
qty: 42,
|
|
37
|
+
date: ISODate("2023-11-02T11:43:10Z")
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
$inc: { count: 1 },
|
|
41
|
+
$setOnInsert: {
|
|
42
|
+
_id: "123_1698939791", // New bucket ID if upsert fires
|
|
43
|
+
customerId: 123
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
{ upsert: true, sort: { _id: -1 } }
|
|
47
|
+
)
|
|
48
|
+
// If a bucket with room exists, the trade is pushed into it
|
|
49
|
+
// Otherwise a new bucket document is created
|
|
50
|
+
// Array is bounded — never exceeds 10 elements
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Query patterns:**
|
|
54
|
+
|
|
55
|
+
```javascript
|
|
56
|
+
// Page 1 of trades for customer 123
|
|
57
|
+
db.trades.find({ _id: /^123_/ }).sort({ _id: 1 }).limit(1)
|
|
58
|
+
|
|
59
|
+
// Page N (e.g. page 10)
|
|
60
|
+
db.trades.find({ _id: /^123_/ }).sort({ _id: 1 }).skip(9).limit(1)
|
|
61
|
+
|
|
62
|
+
// Each returned document IS a page — no per-trade skip/limit needed
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Choosing bucket boundaries:**
|
|
66
|
+
|
|
67
|
+
| Bucketing Strategy | Good For | Example |
|
|
68
|
+
|-------------------|----------|---------|
|
|
69
|
+
| Fixed count (N items) | Pagination, evenly-sized pages | 10 trades per bucket |
|
|
70
|
+
| Time window | Log/event grouping (when not using Time Series Collections) | 1 hour of events per bucket |
|
|
71
|
+
| Logical grouping | Domain-driven partitioning | All line items in one order |
|
|
72
|
+
|
|
73
|
+
**When NOT to use this pattern:**
|
|
74
|
+
|
|
75
|
+
- **Time-series workloads**: Use [Time Series Collections](https://www.mongodb.com/docs/manual/core/timeseries-collections/) instead — they handle bucketing, compression, and indexing automatically.
|
|
76
|
+
- **Random single-item access**: If you frequently query individual items by their own ID, buckets add unnecessary indirection.
|
|
77
|
+
- **Low volume**: If the total series per entity is small, the added complexity isn't worth it.
|
|
78
|
+
- **Highly variable item sizes**: Bucketing works best when items are roughly uniform in size so bucket documents stay predictable.
|
|
79
|
+
|
|
80
|
+
## Verify with
|
|
81
|
+
|
|
82
|
+
```javascript
|
|
83
|
+
// Check that bucket size matches expectations
|
|
84
|
+
db.trades.aggregate([
|
|
85
|
+
{ $group: {
|
|
86
|
+
_id: null,
|
|
87
|
+
avgCount: { $avg: "$count" },
|
|
88
|
+
maxCount: { $max: "$count" },
|
|
89
|
+
totalBuckets: { $sum: 1 }
|
|
90
|
+
}}
|
|
91
|
+
])
|
|
92
|
+
// avgCount should approach your target bucket size
|
|
93
|
+
// maxCount should not exceed it
|
|
94
|
+
|
|
95
|
+
// Check average document size
|
|
96
|
+
db.trades.aggregate([
|
|
97
|
+
{ $project: { size: { $bsonSize: "$$ROOT" } } },
|
|
98
|
+
{ $group: { _id: null, avgSize: { $avg: "$size" } } }
|
|
99
|
+
])
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Reference: [Group Data with the Bucket Pattern](https://www.mongodb.com/docs/manual/data-modeling/design-patterns/group-data/bucket-pattern/)
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use Computed Pattern for Expensive Calculations
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: "Improves read latency by pre-computing frequently-requested aggregations"
|
|
5
|
+
tags: schema, patterns, computed, aggregation, performance, denormalization
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Use Computed Pattern for Expensive Calculations
|
|
9
|
+
|
|
10
|
+
**Pre-calculate and store frequently-accessed computed values.** If you're running the same aggregation on every page load, you're wasting CPU cycles. Store the result in the document and update it on write or via background job—trades write complexity for read speed.
|
|
11
|
+
|
|
12
|
+
**Incorrect (calculate on every read):**
|
|
13
|
+
|
|
14
|
+
```javascript
|
|
15
|
+
// Movie with all screenings in separate collection
|
|
16
|
+
{ _id: "movie1", title: "The Matrix" }
|
|
17
|
+
|
|
18
|
+
// Screenings collection - thousands of records
|
|
19
|
+
{ movieId: "movie1", date: ISODate("..."), viewers: 344, revenue: 3440 }
|
|
20
|
+
{ movieId: "movie1", date: ISODate("..."), viewers: 256, revenue: 2560 }
|
|
21
|
+
// ... 10,000 screenings
|
|
22
|
+
|
|
23
|
+
// Movie page aggregates every time
|
|
24
|
+
db.screenings.aggregate([
|
|
25
|
+
{ $match: { movieId: "movie1" } },
|
|
26
|
+
{ $group: {
|
|
27
|
+
_id: "$movieId",
|
|
28
|
+
totalViewers: { $sum: "$viewers" },
|
|
29
|
+
totalRevenue: { $sum: "$revenue" },
|
|
30
|
+
screeningCount: { $sum: 1 }
|
|
31
|
+
}}
|
|
32
|
+
])
|
|
33
|
+
// Repeated scans can add substantial read latency and CPU overhead
|
|
34
|
+
// 1M page views/day = 1M expensive aggregations
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Correct (pre-computed values):**
|
|
38
|
+
|
|
39
|
+
Store computed stats directly in the movie document: `stats.totalViewers`, `stats.totalRevenue`, `stats.screeningCount`, `stats.avgViewersPerScreening`, and `stats.computedAt`. The movie page reads a single document with no aggregation needed on the hot path.
|
|
40
|
+
|
|
41
|
+
**Update strategies:**
|
|
42
|
+
|
|
43
|
+
```javascript
|
|
44
|
+
// Strategy 1: Update on write (low write volume)
|
|
45
|
+
// When new screening is added
|
|
46
|
+
db.screenings.insertOne({
|
|
47
|
+
movieId: "movie1",
|
|
48
|
+
viewers: 400,
|
|
49
|
+
revenue: 4000
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
// Immediately update computed values
|
|
53
|
+
db.movies.updateOne(
|
|
54
|
+
{ _id: "movie1" },
|
|
55
|
+
{
|
|
56
|
+
$inc: {
|
|
57
|
+
"stats.totalViewers": 400,
|
|
58
|
+
"stats.totalRevenue": 4000,
|
|
59
|
+
"stats.screeningCount": 1
|
|
60
|
+
},
|
|
61
|
+
$set: { "stats.computedAt": new Date() }
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
// Strategy 2: Background job (high write volume)
|
|
66
|
+
// Run hourly/daily aggregation job
|
|
67
|
+
db.screenings.aggregate([
|
|
68
|
+
{ $group: {
|
|
69
|
+
_id: "$movieId",
|
|
70
|
+
totalViewers: { $sum: "$viewers" },
|
|
71
|
+
totalRevenue: { $sum: "$revenue" },
|
|
72
|
+
count: { $sum: 1 }
|
|
73
|
+
}},
|
|
74
|
+
{ $merge: {
|
|
75
|
+
into: "movies",
|
|
76
|
+
on: "_id",
|
|
77
|
+
whenMatched: [{
|
|
78
|
+
$set: {
|
|
79
|
+
"stats.totalViewers": "$$new.totalViewers",
|
|
80
|
+
"stats.totalRevenue": "$$new.totalRevenue",
|
|
81
|
+
"stats.screeningCount": "$$new.count",
|
|
82
|
+
"stats.computedAt": "$$NOW"
|
|
83
|
+
}
|
|
84
|
+
}]
|
|
85
|
+
}}
|
|
86
|
+
])
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Common computed values:**
|
|
90
|
+
|
|
91
|
+
| Source Data | Computed Value | Update Strategy |
|
|
92
|
+
|-------------|----------------|-----------------|
|
|
93
|
+
| Order line items | Order total | On write (single doc) |
|
|
94
|
+
| Product reviews | Avg rating, review count | Background job |
|
|
95
|
+
| User activity | Engagement score | Background job |
|
|
96
|
+
| Transaction history | Account balance | On write |
|
|
97
|
+
| Page views | View count, trending score | Batched updates |
|
|
98
|
+
|
|
99
|
+
**Handling staleness:**
|
|
100
|
+
|
|
101
|
+
Include a `computedAt` timestamp alongside the stats. Application code compares this timestamp against a freshness threshold (e.g. one hour) and triggers a refresh if the values are stale. Alternatively, surface the timestamp to users (e.g. “1,840,000 viewers — updated 1 hour ago”).
|
|
102
|
+
|
|
103
|
+
**Windowed computations:**
|
|
104
|
+
|
|
105
|
+
```javascript
|
|
106
|
+
// Compute for time windows (rolling 30 days)
|
|
107
|
+
{
|
|
108
|
+
_id: "movie1",
|
|
109
|
+
stats: {
|
|
110
|
+
allTime: { viewers: 1840000, revenue: 25880000 },
|
|
111
|
+
last30Days: { viewers: 45000, revenue: 630000 },
|
|
112
|
+
last7Days: { viewers: 12000, revenue: 168000 }
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Background job updates rolling windows
|
|
117
|
+
db.screenings.aggregate([
|
|
118
|
+
{ $match: {
|
|
119
|
+
movieId: "movie1",
|
|
120
|
+
date: { $gte: thirtyDaysAgo }
|
|
121
|
+
}},
|
|
122
|
+
{ $group: {
|
|
123
|
+
_id: null,
|
|
124
|
+
viewers: { $sum: "$viewers" },
|
|
125
|
+
revenue: { $sum: "$revenue" }
|
|
126
|
+
}}
|
|
127
|
+
])
|
|
128
|
+
// Then update movie.stats.last30Days
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**Consider on-demand materialized views:**
|
|
132
|
+
|
|
133
|
+
When the computed results are best stored in a separate collection rather than embedded in the source documents, MongoDB's [on-demand materialized views](https://www.mongodb.com/docs/manual/core/materialized-views/) formalize this approach. An on-demand materialized view is an aggregation pipeline whose output is written to a separate collection using `$merge` or `$out`—the same mechanism shown in Strategy 2 above. The difference is conceptual: instead of updating a field on existing documents, you maintain a dedicated read-optimized collection that can be independently indexed. This is especially useful when:
|
|
134
|
+
|
|
135
|
+
- The computed data has a different shape or granularity than the source (e.g. monthly summaries from daily records).
|
|
136
|
+
- Multiple consumers need the pre-aggregated data, and a shared collection is cleaner than duplicating fields across documents.
|
|
137
|
+
- You want to index the computed results independently of the source collection.
|
|
138
|
+
|
|
139
|
+
On-demand materialized views are not automatically refreshed—you control when to re-run the pipeline, which gives you the same staleness trade-offs described above.
|
|
140
|
+
|
|
141
|
+
**When NOT to use this pattern:**
|
|
142
|
+
|
|
143
|
+
- **Rarely accessed calculations**: If stat is viewed once/day, compute on demand.
|
|
144
|
+
- **High write frequency**: If source data changes every second, update overhead may exceed read savings.
|
|
145
|
+
- **Complex multi-collection joins**: Some computations are too complex to maintain incrementally.
|
|
146
|
+
- **Strong consistency required**: Computed values may be slightly stale.
|
|
147
|
+
|
|
148
|
+
## Verify with
|
|
149
|
+
|
|
150
|
+
### Find expensive aggregations that should be pre-computed
|
|
151
|
+
|
|
152
|
+
For Atlas M10+ use slow query logs to find the slowest aggregations. See [Slow query logs](references/source-slow-query-logs.md).
|
|
153
|
+
Use codebase if available, ask the user.
|
|
154
|
+
|
|
155
|
+
### Check if same aggregation runs repeatedly
|
|
156
|
+
|
|
157
|
+
For Atlas M10+ use $queryStats. See [Query Stats](references/source-query-stats.md)
|
|
158
|
+
Use codebase if available, ask the user.
|
|
159
|
+
|
|
160
|
+
High count + high avgMs on an aggregation that computes a result = candidate for computed pattern
|
|
161
|
+
|
|
162
|
+
Reference: [Computed Schema Pattern](https://mongodb.com/docs/manual/data-modeling/design-patterns/computed-values/computed-schema-pattern/)
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Document Versioning Pattern"
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: "Enables reproducing exact historical document state for audit, compliance, and rollback"
|
|
5
|
+
tags: schema, patterns, versioning, audit, compliance
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Document Versioning Pattern
|
|
9
|
+
|
|
10
|
+
**Store full document history in a separate `revisions` collection to enable reproducing historical state.** This is different from schema versioning (which handles field migration)—document versioning stores complete snapshots of each change. Use it for insurance policies, legal documents, compliance audit trails, and any data where you must reproduce exact historical state.
|
|
11
|
+
|
|
12
|
+
**Incorrect (overwrite history with no trail):**
|
|
13
|
+
|
|
14
|
+
```javascript
|
|
15
|
+
// Policy document — only current state exists
|
|
16
|
+
{
|
|
17
|
+
_id: "POL-001",
|
|
18
|
+
holder: "Jane Smith",
|
|
19
|
+
premium: 450,
|
|
20
|
+
coverage: "comprehensive",
|
|
21
|
+
updatedAt: ISODate("2024-06-01")
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// When premium changes, old value is lost forever
|
|
25
|
+
db.policies.updateOne(
|
|
26
|
+
{ _id: "POL-001" },
|
|
27
|
+
{ $set: { premium: 475, updatedAt: new Date() } }
|
|
28
|
+
)
|
|
29
|
+
// Previous premium of 450 is gone — no audit trail
|
|
30
|
+
// Cannot reproduce what the policy looked like on 2024-03-15
|
|
31
|
+
// Compliance audit fails: "show me the policy as of Q1"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**Correct (current collection + revisions collection):**
|
|
35
|
+
|
|
36
|
+
```javascript
|
|
37
|
+
// currentPolicies collection — current state only (fast reads)
|
|
38
|
+
{
|
|
39
|
+
_id: "POL-001",
|
|
40
|
+
holder: "Jane Smith",
|
|
41
|
+
premium: 450,
|
|
42
|
+
coverage: "comprehensive",
|
|
43
|
+
v: 3,
|
|
44
|
+
updatedAt: ISODate("2024-06-01")
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// policyRevisions collection — full history snapshots
|
|
48
|
+
{
|
|
49
|
+
policyId: "POL-001",
|
|
50
|
+
v: 2,
|
|
51
|
+
snapshot: {
|
|
52
|
+
holder: "Jane Smith",
|
|
53
|
+
premium: 425,
|
|
54
|
+
coverage: "basic",
|
|
55
|
+
v: 2
|
|
56
|
+
},
|
|
57
|
+
changedAt: ISODate("2024-03-15")
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Implementation:**
|
|
62
|
+
|
|
63
|
+
```javascript
|
|
64
|
+
async function updatePolicy(policyId, newData, session) {
|
|
65
|
+
const current = await db.currentPolicies.findOne({ _id: policyId }, { session })
|
|
66
|
+
|
|
67
|
+
await db.policyRevisions.insertOne({
|
|
68
|
+
policyId: current._id,
|
|
69
|
+
v: current.v,
|
|
70
|
+
snapshot: { ...current },
|
|
71
|
+
changedAt: new Date()
|
|
72
|
+
}, { session })
|
|
73
|
+
|
|
74
|
+
await db.currentPolicies.updateOne(
|
|
75
|
+
{ _id: policyId },
|
|
76
|
+
{ $set: { ...newData, v: current.v + 1, updatedAt: new Date() } },
|
|
77
|
+
{ session }
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async function getPolicyAtVersion(policyId, version) {
|
|
82
|
+
if (version === 'current') {
|
|
83
|
+
return db.currentPolicies.findOne({ _id: policyId })
|
|
84
|
+
}
|
|
85
|
+
const rev = await db.policyRevisions.findOne({ policyId, v: version })
|
|
86
|
+
return rev?.snapshot
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Using Transactions for Atomicity:**
|
|
91
|
+
|
|
92
|
+
The `updatePolicy` function writes to two collections (inserting a revision **and** updating the current document). It may or may not be prudent to wrap the call in a [multi-document transaction](https://mongodb.com/docs/manual/core/transactions/) to guarantee both writes succeed or fail together, depending on the use case:
|
|
93
|
+
|
|
94
|
+
```javascript
|
|
95
|
+
const session = client.startSession()
|
|
96
|
+
try {
|
|
97
|
+
await session.withTransaction(async () => {
|
|
98
|
+
await updatePolicy("POL-001", { premium: 475, coverage: "premium" }, session)
|
|
99
|
+
})
|
|
100
|
+
} finally {
|
|
101
|
+
await session.endSession()
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Indexes:**
|
|
106
|
+
|
|
107
|
+
```javascript
|
|
108
|
+
db.policyRevisions.createIndex({ policyId: 1, v: -1 })
|
|
109
|
+
// Optional TTL for retention (e.g., 7 years)
|
|
110
|
+
db.policyRevisions.createIndex({ changedAt: 1 }, { expireAfterSeconds: 220752000 })
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**Difference from Schema Versioning:**
|
|
114
|
+
|
|
115
|
+
| Pattern | Purpose | Stores |
|
|
116
|
+
|---------|---------|--------|
|
|
117
|
+
| Schema Versioning | Handle field structure migration | `schemaVersion` field on each doc |
|
|
118
|
+
| Document Versioning | Reproduce complete historical state | Full snapshots in revisions collection |
|
|
119
|
+
|
|
120
|
+
**When NOT to use this pattern:**
|
|
121
|
+
|
|
122
|
+
- **High-frequency updates**: If documents change many times per second, use event sourcing instead.
|
|
123
|
+
- **Approximate history is sufficient**: If you only need to know "what changed" but not reproduce exact state.
|
|
124
|
+
- **Unbounded revision growth without retention**: Ensure you have a TTL or archival policy for the revisions collection.
|
|
125
|
+
|
|
126
|
+
## Verify with
|
|
127
|
+
|
|
128
|
+
```javascript
|
|
129
|
+
// Check revision collection growth
|
|
130
|
+
db.policyRevisions.aggregate([
|
|
131
|
+
{ $group: {
|
|
132
|
+
_id: "$policyId",
|
|
133
|
+
revisionCount: { $sum: 1 },
|
|
134
|
+
oldestRevision: { $min: "$changedAt" },
|
|
135
|
+
newestRevision: { $max: "$changedAt" }
|
|
136
|
+
}},
|
|
137
|
+
{ $sort: { revisionCount: -1 } },
|
|
138
|
+
{ $limit: 10 }
|
|
139
|
+
])
|
|
140
|
+
// Monitor for documents with unexpectedly high revision counts
|
|
141
|
+
|
|
142
|
+
// Verify current docs have version field
|
|
143
|
+
db.currentPolicies.countDocuments({ v: { $exists: false } })
|
|
144
|
+
// Should be 0 — all documents need version tracking
|
|
145
|
+
|
|
146
|
+
// Check that revisions are consistent with current version
|
|
147
|
+
db.currentPolicies.aggregate([
|
|
148
|
+
{ $lookup: {
|
|
149
|
+
from: "policyRevisions",
|
|
150
|
+
localField: "_id",
|
|
151
|
+
foreignField: "policyId",
|
|
152
|
+
as: "revisions"
|
|
153
|
+
}},
|
|
154
|
+
{ $project: {
|
|
155
|
+
currentVersion: "$v",
|
|
156
|
+
revisionCount: { $size: "$revisions" },
|
|
157
|
+
maxRevisionVersion: { $max: "$revisions.v" }
|
|
158
|
+
}},
|
|
159
|
+
{ $match: {
|
|
160
|
+
$expr: { $ne: [{ $subtract: ["$currentVersion", 1] }, "$maxRevisionVersion"] }
|
|
161
|
+
}}
|
|
162
|
+
])
|
|
163
|
+
// Finds documents where revision history has gaps
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Reference: [Keep a History of Document Versions](https://mongodb.com/docs/manual/data-modeling/design-patterns/data-versioning/document-versioning/)
|