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,315 @@
|
|
|
1
|
+
# Construct Patterns
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
|
|
5
|
+
- [Overview](#overview)
|
|
6
|
+
- [Scope and Construct IDs](#scope-and-construct-ids)
|
|
7
|
+
- [Choosing Construct Levels](#choosing-construct-levels)
|
|
8
|
+
- [Mixing L1 and L2](#mixing-l1-and-l2)
|
|
9
|
+
- [Cross-Stack References](#cross-stack-references)
|
|
10
|
+
- [Creating Custom Constructs](#creating-custom-constructs)
|
|
11
|
+
- [Testing CDK Infrastructure](#testing-cdk-infrastructure)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
|
|
17
|
+
This reference covers construct selection, composition, cross-stack wiring, and testing patterns. It provides decision frameworks for choosing construct levels, mixing them safely, passing references across stacks, building custom constructs, and verifying infrastructure with assertions.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Scope and Construct IDs
|
|
22
|
+
|
|
23
|
+
Every construct is created with `new SomeConstruct(scope, id, props?)`. The first two arguments are not interchangeable boilerplate — misusing them is a common review finding.
|
|
24
|
+
|
|
25
|
+
### Scope (first argument)
|
|
26
|
+
|
|
27
|
+
Inside a construct's `constructor`, you MUST pass `this` as the scope of child constructs — NOT the incoming `scope` argument:
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
// ❌ INCORRECT — child parented to the wrong node
|
|
31
|
+
export class MyConstruct extends Construct {
|
|
32
|
+
constructor(scope: Construct, id: string) {
|
|
33
|
+
super(scope, id);
|
|
34
|
+
new ChildConstruct(scope, 'Child'); // wrong: uses 'scope'
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// ✅ CORRECT
|
|
39
|
+
export class MyConstruct extends Construct {
|
|
40
|
+
constructor(scope: Construct, id: string) {
|
|
41
|
+
super(scope, id);
|
|
42
|
+
new ChildConstruct(this, 'Child'); // 'this' is the parent
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Passing `this` makes the child a child of the current construct, which is almost always the intent. A scope other than `this` is legitimate only when it comes from a function parameter or a local variable used to group constructs (e.g. in `App` or helper/test stacks).
|
|
48
|
+
|
|
49
|
+
### Construct ID (second argument)
|
|
50
|
+
|
|
51
|
+
The construct ID is the locally unique identifier within a scope. The IDs between a CloudFormation resource and its containing `Stack` are concatenated into the resource's **logical ID** — and changing a logical ID replaces the resource.
|
|
52
|
+
|
|
53
|
+
- Construct IDs SHOULD be short and to the point.
|
|
54
|
+
- You SHOULD NOT interpolate variables into a construct ID: if the variable's value changes, the logical ID changes and the resource is replaced. Legitimate exceptions (constructs created in a loop; an intentional, conditional replacement) MUST be annotated with a comment explaining why.
|
|
55
|
+
- Construct IDs only need to be unique within their scope. They SHOULD NOT repeat project, region, or stage names already present higher in the construct tree.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Choosing Construct Levels
|
|
60
|
+
|
|
61
|
+
You SHOULD prefer L2 constructs as the default choice. They provide sensible defaults, grant methods, and metric helpers.
|
|
62
|
+
|
|
63
|
+
### Decision tree
|
|
64
|
+
|
|
65
|
+
| Need | Construct type |
|
|
66
|
+
| -------------------------------------- | ------------------------------------------ |
|
|
67
|
+
| Pure logic, no AWS resource | Plain TypeScript/Python class |
|
|
68
|
+
| Single resource with stricter defaults | Extend the L2 class (is-a) |
|
|
69
|
+
| Composition of multiple resources | Extend `Construct` (has-a) — this is an L3 |
|
|
70
|
+
| Organization-wide policy enforcement | `Aspect` |
|
|
71
|
+
|
|
72
|
+
### When L1 is viable
|
|
73
|
+
|
|
74
|
+
L1 (`Cfn*`) constructs are acceptable when no L2 exists or when you need a property the L2 does not expose. You SHOULD combine L1 with Mixins, Facades, or `I<Resource>Ref` interfaces to retain type safety and grant support.
|
|
75
|
+
|
|
76
|
+
### When using L3
|
|
77
|
+
|
|
78
|
+
L3 constructs provision multiple resources behind a single API. You MUST read what they provision (check the source or `cdk synth` output) before using them in production. Hidden resources may have cost, security, or operational implications.
|
|
79
|
+
|
|
80
|
+
### When an L2 doesn't expose a property
|
|
81
|
+
|
|
82
|
+
Use this escalation ladder — prefer the first option that works:
|
|
83
|
+
|
|
84
|
+
1. **Cfn<Resource>PropsMixin** (preferred) — type-safe, applied via `.with()`:
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
import { CfnBucketPropsMixin } from '@aws-cdk/cfn-property-mixins/aws-s3';
|
|
88
|
+
new s3.Bucket(this, 'Bucket').with(new CfnBucketPropsMixin({
|
|
89
|
+
analyticsConfigurations: [{ id: 'full', prefix: '' }],
|
|
90
|
+
}));
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
2. **`addPropertyOverride`** — untyped, string-keyed last resort:
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
const cfnBucket = bucket.node.defaultChild as s3.CfnBucket;
|
|
97
|
+
cfnBucket.addPropertyOverride('AnalyticsConfigurations', [{ Id: 'full', Prefix: '' }]);
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Mixing L1 and L2
|
|
103
|
+
|
|
104
|
+
When a stack contains both L1 and L2 constructs, you MUST use `I<Resource>Ref` interfaces and Facades to bridge them — do not pass L1 property types to L2 props or vice versa, as their types are not interchangeable.
|
|
105
|
+
|
|
106
|
+
### I<Resource>Ref interfaces (e.g. IBucketRef)
|
|
107
|
+
|
|
108
|
+
Both L1 and L2 constructs implement `I<Resource>Ref`-style interfaces (e.g., `IBucketRef`, `IFunctionRef`). Use these interfaces as prop types to accept either level:
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
interface MyProps {
|
|
112
|
+
readonly bucket: s3.IBucketRef;
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Facades for L1 grants
|
|
117
|
+
|
|
118
|
+
L1 constructs lack `grant*()` methods. You SHOULD wrap them with `fromCfn<Resource>()` or `from<Resource>Attributes()` to get an L2 interface:
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
const cfnTable = new dynamodb.CfnTable(this, 'Table', { /* ... */ });
|
|
122
|
+
const table = dynamodb.Table.fromTableArn(this, 'TableRef', cfnTable.attrArn);
|
|
123
|
+
table.grantReadData(myFunction);
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Escalation ladder
|
|
127
|
+
|
|
128
|
+
When you need to customize a resource, follow this order (least invasive first):
|
|
129
|
+
|
|
130
|
+
1. L2 prop — use the built-in property if available.
|
|
131
|
+
2. Mixin — add behavior via a helper function.
|
|
132
|
+
3. `Cfn<Resource>PropsMixin` — type-safe L1 prop injection.
|
|
133
|
+
4. `node.defaultChild` — access the underlying L1 construct.
|
|
134
|
+
5. `addPropertyOverride` — override arbitrary CloudFormation properties.
|
|
135
|
+
|
|
136
|
+
You SHOULD exhaust each level before moving to the next.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Cross-Stack References
|
|
141
|
+
|
|
142
|
+
### Same app, same region
|
|
143
|
+
|
|
144
|
+
Pass construct references via stack props. CDK automatically creates CloudFormation exports and imports:
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
interface ConsumerProps extends cdk.StackProps {
|
|
148
|
+
readonly bucket: s3.IBucket;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
class ConsumerStack extends cdk.Stack {
|
|
152
|
+
constructor(scope: Construct, id: string, props: ConsumerProps) {
|
|
153
|
+
super(scope, id, props);
|
|
154
|
+
props.bucket.grantRead(myFunction);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Cross-region or cross-account (same app)
|
|
160
|
+
|
|
161
|
+
Enable `crossRegionReferences: true` on the consuming stack and use explicit physical names on shared resources:
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
new ConsumerStack(app, 'Consumer', {
|
|
165
|
+
env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION },
|
|
166
|
+
crossRegionReferences: true,
|
|
167
|
+
bucket: producerStack.bucket,
|
|
168
|
+
});
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Different apps
|
|
172
|
+
|
|
173
|
+
When stacks are in different CDK apps, automatic exports do not work. You MUST use one of:
|
|
174
|
+
|
|
175
|
+
- `CfnOutput` + `Fn.importValue`:
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
// Producer app
|
|
179
|
+
new cdk.CfnOutput(this, 'BucketArn', { value: bucket.bucketArn, exportName: '$EXPORT_NAME' });
|
|
180
|
+
|
|
181
|
+
// Consumer app
|
|
182
|
+
const arn = cdk.Fn.importValue('$EXPORT_NAME');
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
- SSM Parameter Store for decoupled lookups.
|
|
186
|
+
|
|
187
|
+
### Fixing cycles
|
|
188
|
+
|
|
189
|
+
If cross-stack references create a dependency cycle, you MUST extract the shared resource into a third stack so that dependencies flow one way.
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Creating Custom Constructs
|
|
194
|
+
|
|
195
|
+
### Extend L2 (is-a)
|
|
196
|
+
|
|
197
|
+
Use when you want a single resource with stricter defaults:
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
export class SecureBucket extends s3.Bucket {
|
|
201
|
+
constructor(scope: Construct, id: string, props?: s3.BucketProps) {
|
|
202
|
+
super(scope, id, {
|
|
203
|
+
encryption: s3.BucketEncryption.S3_MANAGED,
|
|
204
|
+
blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
|
|
205
|
+
enforceSSL: true,
|
|
206
|
+
...props,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Compose L3 (has-a)
|
|
213
|
+
|
|
214
|
+
Use when you combine multiple resources behind a single API:
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
export class ApiWithQueue extends Construct {
|
|
218
|
+
public readonly queue: sqs.Queue;
|
|
219
|
+
|
|
220
|
+
constructor(scope: Construct, id: string) {
|
|
221
|
+
super(scope, id);
|
|
222
|
+
this.queue = new sqs.Queue(this, 'Queue');
|
|
223
|
+
// ... additional resources
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### Stable logical IDs
|
|
229
|
+
|
|
230
|
+
The default child ID determines the CloudFormation logical ID. You MUST NOT change construct IDs after deployment — this causes resource replacement. Use the `Default` child ID convention for the primary resource in an L3.
|
|
231
|
+
|
|
232
|
+
### Escape via defaultChild
|
|
233
|
+
|
|
234
|
+
When extending an L2, you can access the underlying CFN resource:
|
|
235
|
+
|
|
236
|
+
```typescript
|
|
237
|
+
const cfn = this.node.defaultChild as s3.CfnBucket;
|
|
238
|
+
cfn.addPropertyOverride('$PROPERTY_PATH', '$VALUE');
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## Testing CDK Infrastructure
|
|
244
|
+
|
|
245
|
+
### Fine-grained assertions
|
|
246
|
+
|
|
247
|
+
Use `Template.fromStack()` to assert on specific resources:
|
|
248
|
+
|
|
249
|
+
```typescript
|
|
250
|
+
const template = Template.fromStack(myStack);
|
|
251
|
+
|
|
252
|
+
template.hasResourceProperties('AWS::SQS::Queue', {
|
|
253
|
+
VisibilityTimeout: 300,
|
|
254
|
+
});
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Partial matching
|
|
258
|
+
|
|
259
|
+
Use `Match.*` helpers for flexible assertions:
|
|
260
|
+
|
|
261
|
+
```typescript
|
|
262
|
+
template.hasResourceProperties('AWS::Lambda::Function', {
|
|
263
|
+
Runtime: Match.stringLikeRegexp('nodejs'),
|
|
264
|
+
Environment: Match.objectLike({
|
|
265
|
+
Variables: Match.objectLike({
|
|
266
|
+
TABLE_NAME: Match.anyValue(),
|
|
267
|
+
}),
|
|
268
|
+
}),
|
|
269
|
+
});
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Snapshot tests
|
|
273
|
+
|
|
274
|
+
Capture the full template and compare against a stored baseline:
|
|
275
|
+
|
|
276
|
+
```typescript
|
|
277
|
+
expect(template.toJSON()).toMatchSnapshot();
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
You SHOULD use snapshot tests to detect unintended drift but MUST NOT rely on them as the sole testing strategy — they are brittle and hard to review.
|
|
281
|
+
|
|
282
|
+
### Logical ID stability tests
|
|
283
|
+
|
|
284
|
+
Assert that critical resource logical IDs remain stable to prevent accidental replacement:
|
|
285
|
+
|
|
286
|
+
```typescript
|
|
287
|
+
template.hasResource('AWS::DynamoDB::Table', {
|
|
288
|
+
// Verifying the resource exists with this logical ID
|
|
289
|
+
});
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### Integration tests
|
|
293
|
+
|
|
294
|
+
Use `@aws-cdk/integ-tests-alpha` for tests that deploy real infrastructure:
|
|
295
|
+
|
|
296
|
+
```typescript
|
|
297
|
+
const integ = new IntegTest(app, 'MyIntegTest', {
|
|
298
|
+
testCases: [myStack],
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
integ.assertions
|
|
302
|
+
.awsApiCall('DynamoDB', 'DescribeTable', { TableName: '$TABLE_NAME' })
|
|
303
|
+
.assertAtPath('Table.TableStatus', ExpectedResult.stringLikeRegexp('ACTIVE'));
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
Integration tests SHOULD be run in a dedicated test account. They MUST NOT run against production.
|
|
307
|
+
|
|
308
|
+
### Application best practices
|
|
309
|
+
|
|
310
|
+
- Make decisions at synth time — use explicit `env` to enable synth-time logic.
|
|
311
|
+
- Use generated physical names (CDK default) unless cross-stack or cross-app references require explicit names.
|
|
312
|
+
- Set explicit `removalPolicy` and `logRetention` on every resource.
|
|
313
|
+
- Separate stateful resources (databases, buckets) into their own stack.
|
|
314
|
+
- Commit `cdk.context.json` to version control for reproducible synth.
|
|
315
|
+
- Use `grant*()` methods for IAM instead of hand-written policy statements.
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# Import and Migrate Reference
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
|
|
5
|
+
- [Overview](#overview)
|
|
6
|
+
- [Read-Only References (from* Methods)](#read-only-references-from-methods)
|
|
7
|
+
- [Full Resource Adoption (cdk import)](#full-resource-adoption-cdk-import)
|
|
8
|
+
- [CI-Friendly Import (--import-existing-resources)](#ci-friendly-import---import-existing-resources)
|
|
9
|
+
- [Migrating with cdk migrate](#migrating-with-cdk-migrate)
|
|
10
|
+
- [From an Existing Stack](#from-an-existing-stack)
|
|
11
|
+
- [From a Template File](#from-a-template-file)
|
|
12
|
+
- [From a Live Account Scan](#from-a-live-account-scan)
|
|
13
|
+
- [Migration Constraints](#migration-constraints)
|
|
14
|
+
- [First Deploy After Migration](#first-deploy-after-migration)
|
|
15
|
+
- [Incremental Refactoring](#incremental-refactoring)
|
|
16
|
+
- [Post-Import Verification](#post-import-verification)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Overview
|
|
21
|
+
|
|
22
|
+
CDK provides three mechanisms for referencing or adopting existing AWS resources,
|
|
23
|
+
plus a migration tool for converting existing CloudFormation stacks or live
|
|
24
|
+
infrastructure into CDK code. The right mechanism depends on whether you need
|
|
25
|
+
read-only access or full lifecycle management.
|
|
26
|
+
|
|
27
|
+
| Mechanism | Use Case | Lifecycle Control |
|
|
28
|
+
|----------------------------------|-----------------------------------|-------------------|
|
|
29
|
+
| `from*` methods | Reference existing resources | Read-only |
|
|
30
|
+
| `cdk import` | Adopt resources into a stack | Full (interactive)|
|
|
31
|
+
| `--import-existing-resources` | Adopt resources in CI | Full (automated) |
|
|
32
|
+
| `cdk migrate` | Convert stacks/infra to CDK code | Full |
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Read-Only References (from* Methods)
|
|
37
|
+
|
|
38
|
+
Use `from*` static methods (e.g., `Bucket.fromBucketName()`,
|
|
39
|
+
`Vpc.fromLookup()`) to reference existing resources without managing their
|
|
40
|
+
lifecycle:
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
const bucket = s3.Bucket.fromBucketName(this, 'ImportedBucket', '$BUCKET_NAME');
|
|
44
|
+
const vpc = ec2.Vpc.fromLookup(this, 'ImportedVpc', { vpcId: '$VPC_ID' });
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Constraints:
|
|
48
|
+
|
|
49
|
+
- `from*` references are **read-only** — CDK MUST NOT attempt to modify or
|
|
50
|
+
delete these resources.
|
|
51
|
+
- `fromLookup` methods require the `env` property (account and region) to be
|
|
52
|
+
set on the stack. They perform API calls at synth time and cache results in
|
|
53
|
+
`cdk.context.json`.
|
|
54
|
+
- `cdk.context.json` SHOULD be committed to version control so that synth is
|
|
55
|
+
reproducible without network access.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Full Resource Adoption (cdk import)
|
|
60
|
+
|
|
61
|
+
`cdk import` adopts existing resources into a CDK stack so CDK fully manages their lifecycle.
|
|
62
|
+
|
|
63
|
+
**Interactive (default):**
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
cdk import $STACK_NAME
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The CLI prompts for each resource's physical identifier (bucket name, table name, etc.).
|
|
70
|
+
|
|
71
|
+
**Non-interactive (CI-friendly):**
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# First, generate a mapping template:
|
|
75
|
+
cdk import $STACK_NAME --record-resource-mapping mapping.json
|
|
76
|
+
|
|
77
|
+
# Fill in the physical resource IDs, then import:
|
|
78
|
+
cdk import $STACK_NAME --resource-mapping mapping.json
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Workflow:
|
|
82
|
+
|
|
83
|
+
1. Add the construct to your CDK code matching the existing resource's properties
|
|
84
|
+
2. Run `cdk import $STACK_NAME` (interactive) or with `--resource-mapping` (CI)
|
|
85
|
+
3. CloudFormation executes an import change set — no resource is created
|
|
86
|
+
|
|
87
|
+
Constraints:
|
|
88
|
+
|
|
89
|
+
- Not all CloudFormation resource types support import
|
|
90
|
+
- Resources that depend on each other MUST be imported together or in the correct order
|
|
91
|
+
- The only allowed changes during import are additions of the imported resources
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## CI-Friendly Import (--import-existing-resources)
|
|
96
|
+
|
|
97
|
+
For non-interactive, CI-friendly imports, use the `--import-existing-resources` flag during a normal deploy:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
cdk deploy $STACK_NAME --import-existing-resources
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
The CLI matches resources in the synthesized template against existing unmanaged resources in the account by their **custom physical name** (e.g., explicit `bucketName`, `tableName`, `roleName`). Matches are imported instead of created.
|
|
104
|
+
|
|
105
|
+
**Constraints:**
|
|
106
|
+
|
|
107
|
+
- You MUST set explicit physical names on resources you want to import — auto-generated names cannot be matched
|
|
108
|
+
- The resource MUST be unmanaged (not already part of another CloudFormation stack)
|
|
109
|
+
- Not every resource type supports CloudFormation import
|
|
110
|
+
- Supports mixed operations — you can add new resources AND import existing ones in the same deploy
|
|
111
|
+
|
|
112
|
+
**When to prefer over `cdk import`:**
|
|
113
|
+
|
|
114
|
+
- CI/CD pipelines where interactive prompts are not possible
|
|
115
|
+
- Rolling out a new stack that overlaps with existing resources
|
|
116
|
+
- Mixed operations (new + imported resources in one change set)
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Migrating with cdk migrate
|
|
121
|
+
|
|
122
|
+
`cdk migrate` generates CDK code from existing CloudFormation stacks, template
|
|
123
|
+
files, or live account scans.
|
|
124
|
+
|
|
125
|
+
### From an Existing Stack
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
cdk migrate --from-stack --stack-name $STACK_NAME
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### From a Template File
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
cdk migrate --from-path $TEMPLATE_FILE_PATH --stack-name $STACK_NAME
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### From a Live Account Scan
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
cdk migrate --from-scan --stack-name $STACK_NAME
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Migration Constraints
|
|
144
|
+
|
|
145
|
+
- Output is **L1 constructs only** (`Cfn*` classes). Higher-level L2/L3
|
|
146
|
+
constructs are NOT generated.
|
|
147
|
+
- Only a **single stack** can be migrated per invocation.
|
|
148
|
+
- **Assets are not migrated** — inline code, S3 references, and Docker images
|
|
149
|
+
MUST be handled manually after migration.
|
|
150
|
+
|
|
151
|
+
### First Deploy After Migration
|
|
152
|
+
|
|
153
|
+
A `migrate.json` file is generated alongside the CDK code. This file is
|
|
154
|
+
REQUIRED for the first deployment after migration — it tells CloudFormation to
|
|
155
|
+
import the existing resources rather than creating new ones.
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
cdk deploy $STACK_NAME
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
The `migrate.json` file is consumed automatically on the first deploy and MAY
|
|
162
|
+
be removed afterward.
|
|
163
|
+
|
|
164
|
+
### Incremental Refactoring
|
|
165
|
+
|
|
166
|
+
After migration, incrementally refactor L1 constructs to L2/L3 constructs:
|
|
167
|
+
|
|
168
|
+
1. Replace one `Cfn*` resource at a time with its L2/L3 equivalent.
|
|
169
|
+
2. Run `cdk diff` after each change to verify no unintended replacements.
|
|
170
|
+
3. Deploy incrementally to validate each refactoring step.
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Post-Import Verification
|
|
175
|
+
|
|
176
|
+
After importing or migrating resources, the following steps MUST be performed:
|
|
177
|
+
|
|
178
|
+
1. **Verify drift** — Run `cdk drift $STACK_NAME` to confirm the imported
|
|
179
|
+
resource state matches the CDK definition.
|
|
180
|
+
2. **Protect logical IDs** — Logical ID changes after import will cause
|
|
181
|
+
resource replacement. Lock logical IDs with unit tests or use
|
|
182
|
+
`overrideLogicalId()` where necessary.
|
|
183
|
+
3. **Run `cdk diff`** — Confirm no unexpected changes are pending before the
|
|
184
|
+
next deployment.
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# Refactor and Prevent Replacement Reference
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
|
|
5
|
+
- [Overview](#overview)
|
|
6
|
+
- [Detecting Replacement](#detecting-replacement)
|
|
7
|
+
- [Common Causes](#common-causes)
|
|
8
|
+
- [Using cdk refactor](#using-cdk-refactor)
|
|
9
|
+
- [Workflow](#workflow)
|
|
10
|
+
- [Resolving Ambiguity](#resolving-ambiguity)
|
|
11
|
+
- [Constraints](#constraints)
|
|
12
|
+
- [Prevention Techniques](#prevention-techniques)
|
|
13
|
+
- [Do Not Hardcode Physical Names](#do-not-hardcode-physical-names)
|
|
14
|
+
- [Use Default as Child ID](#use-default-as-child-id)
|
|
15
|
+
- [Use cdk refactor for Moves and Renames](#use-cdk-refactor-for-moves-and-renames)
|
|
16
|
+
- [Use overrideLogicalId](#use-overridelogicalid)
|
|
17
|
+
- [Lock Logical IDs with Unit Tests](#lock-logical-ids-with-unit-tests)
|
|
18
|
+
- [Isolate Stateful Resources with RETAIN](#isolate-stateful-resources-with-retain)
|
|
19
|
+
- [Protecting Stateful Resources](#protecting-stateful-resources)
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Overview
|
|
24
|
+
|
|
25
|
+
Resource replacement occurs when CloudFormation determines it must delete and
|
|
26
|
+
recreate a resource instead of updating it in place. For stateful resources
|
|
27
|
+
(databases, S3 buckets, encryption keys), replacement causes **data loss**.
|
|
28
|
+
This reference covers detection, common causes, and prevention techniques.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Detecting Replacement
|
|
33
|
+
|
|
34
|
+
Use `cdk diff` to detect pending replacements before deploying:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
cdk diff $STACK_NAME
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
In the output, look for:
|
|
41
|
+
|
|
42
|
+
- `[-]` markers indicating resource deletion.
|
|
43
|
+
- `[~]` markers with "requires replacement" annotations on specific properties.
|
|
44
|
+
|
|
45
|
+
Any resource showing "requires replacement" MUST be investigated before
|
|
46
|
+
deploying. MUST NOT deploy when `cdk diff` shows replacement of stateful
|
|
47
|
+
resources unless the replacement is intentional and data has been backed up.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Common Causes
|
|
52
|
+
|
|
53
|
+
Resource replacement is typically caused by:
|
|
54
|
+
|
|
55
|
+
1. **Construct ID changes** — Renaming a construct or moving it to a different
|
|
56
|
+
scope changes its CloudFormation logical ID, which CloudFormation treats as
|
|
57
|
+
a delete + create.
|
|
58
|
+
|
|
59
|
+
2. **Immutable CloudFormation properties** — Certain resource properties cannot
|
|
60
|
+
be updated in place (e.g., DynamoDB table name, RDS engine). Changing these
|
|
61
|
+
forces replacement.
|
|
62
|
+
|
|
63
|
+
3. **Hardcoded physical names** — If a resource has a hardcoded physical name
|
|
64
|
+
and the logical ID changes, CloudFormation cannot create the new resource
|
|
65
|
+
because the name is already taken, causing a deployment failure.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Using cdk refactor
|
|
70
|
+
|
|
71
|
+
`cdk refactor` safely moves or renames constructs without triggering resource
|
|
72
|
+
replacement. It is currently an unstable feature.
|
|
73
|
+
|
|
74
|
+
### Workflow
|
|
75
|
+
|
|
76
|
+
1. **Deploy a baseline** — Ensure the current state is deployed and clean.
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
cdk deploy $STACK_NAME
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
2. **Edit the code** — Perform moves and renames only. MUST NOT change resource
|
|
83
|
+
properties in the same step.
|
|
84
|
+
|
|
85
|
+
3. **Run refactor** — Generate the resource mapping:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
cdk refactor --unstable=refactor
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
4. **Confirm the mapping** — Review the proposed logical ID mappings.
|
|
92
|
+
|
|
93
|
+
5. **Deploy** — Apply the refactoring:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
cdk deploy $STACK_NAME
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
6. **Deploy property changes separately** — Any property changes MUST be made
|
|
100
|
+
and deployed in a subsequent step, after the refactor deploy succeeds.
|
|
101
|
+
|
|
102
|
+
### Resolving Ambiguity
|
|
103
|
+
|
|
104
|
+
When `cdk refactor` cannot determine the mapping (e.g., multiple resources of
|
|
105
|
+
the same type were moved), provide an override JSON file to resolve the
|
|
106
|
+
ambiguity.
|
|
107
|
+
|
|
108
|
+
### Constraints
|
|
109
|
+
|
|
110
|
+
- Refactoring MUST stay within the same environment (account + region).
|
|
111
|
+
- Only moves and renames are supported — property changes MUST NOT be combined
|
|
112
|
+
with refactoring in the same deployment.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Prevention Techniques
|
|
117
|
+
|
|
118
|
+
### Do Not Hardcode Physical Names
|
|
119
|
+
|
|
120
|
+
Physical resource names (bucket names, table names, queue names) SHOULD NOT be
|
|
121
|
+
hardcoded. Let CloudFormation generate unique names. Hardcoded names prevent
|
|
122
|
+
CloudFormation from performing replacement when needed and cause name-collision
|
|
123
|
+
failures.
|
|
124
|
+
|
|
125
|
+
### Use Default as Child ID
|
|
126
|
+
|
|
127
|
+
When extracting inline resources into a separate construct, use `'Default'` as
|
|
128
|
+
the child construct ID to preserve the original logical ID:
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
// Before: resource defined directly in the stack
|
|
132
|
+
new s3.Bucket(this, 'MyBucket', { ... });
|
|
133
|
+
|
|
134
|
+
// After: extracted into a construct — use 'Default' to keep the same logical ID
|
|
135
|
+
class MyConstruct extends Construct {
|
|
136
|
+
constructor(scope: Construct, id: string) {
|
|
137
|
+
super(scope, id);
|
|
138
|
+
new s3.Bucket(this, 'Default', { ... });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
new MyConstruct(this, 'MyBucket');
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Use cdk refactor for Moves and Renames
|
|
145
|
+
|
|
146
|
+
When moving or renaming constructs, use `cdk refactor --unstable=refactor`
|
|
147
|
+
instead of manually tracking logical IDs. See [Using cdk refactor](#using-cdk-refactor).
|
|
148
|
+
|
|
149
|
+
### Use overrideLogicalId
|
|
150
|
+
|
|
151
|
+
As an alternative to `cdk refactor`, explicitly set the logical ID to preserve
|
|
152
|
+
it across code changes:
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
const bucket = new s3.Bucket(this, 'NewId', { ... });
|
|
156
|
+
(bucket.node.defaultChild as s3.CfnBucket).overrideLogicalId('$ORIGINAL_LOGICAL_ID');
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
This approach SHOULD be used sparingly — it creates a maintenance burden and
|
|
160
|
+
bypasses CDK's automatic ID generation.
|
|
161
|
+
|
|
162
|
+
### Lock Logical IDs with Unit Tests
|
|
163
|
+
|
|
164
|
+
Write unit tests that assert the logical IDs of stateful resources. This
|
|
165
|
+
prevents accidental ID changes from reaching deployment:
|
|
166
|
+
|
|
167
|
+
```typescript
|
|
168
|
+
test('stateful resource logical IDs are stable', () => {
|
|
169
|
+
const template = Template.fromStack($STACK);
|
|
170
|
+
const tables = template.findResources('AWS::DynamoDB::Table');
|
|
171
|
+
expect(Object.keys(tables)).toContain('$EXPECTED_LOGICAL_ID');
|
|
172
|
+
});
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Isolate Stateful Resources with RETAIN
|
|
176
|
+
|
|
177
|
+
Place stateful resources in a dedicated stack with the `RETAIN` removal policy.
|
|
178
|
+
This ensures that even if the stack is deleted, the resources are preserved:
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
new s3.Bucket(this, 'DataBucket', {
|
|
182
|
+
removalPolicy: RemovalPolicy.RETAIN,
|
|
183
|
+
});
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Protecting Stateful Resources
|
|
189
|
+
|
|
190
|
+
A defense-in-depth approach SHOULD be used for stateful resources:
|
|
191
|
+
|
|
192
|
+
1. **RETAIN removal policy** — Prevents data loss on stack deletion.
|
|
193
|
+
2. **Dedicated stack** — Isolates stateful resources from frequently changing
|
|
194
|
+
application stacks.
|
|
195
|
+
3. **Logical ID unit tests** — Catches accidental renames before deployment.
|
|
196
|
+
4. **`cdk diff` review** — MUST be reviewed before every production deployment.
|
|
197
|
+
5. **No hardcoded physical names** — Avoids name-collision failures during
|
|
198
|
+
replacement.
|