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,202 @@
|
|
|
1
|
+
# Resend Templates
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Templates are reusable email structures stored on Resend. Define HTML and variables once; reference the template ID or alias when sending.
|
|
6
|
+
|
|
7
|
+
**Use templates when:** the same structure is reused across many sends, non-engineers need to edit copy without touching code, or you want version history.
|
|
8
|
+
|
|
9
|
+
**Use inline `html` when:** the structure changes per send, you need more than 50 dynamic variables, or you want tighter rendering control.
|
|
10
|
+
|
|
11
|
+
## Template Lifecycle
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
Create (draft) → Publish → Send
|
|
15
|
+
↑ edit |
|
|
16
|
+
└─────────────────────┘
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Editing a published template creates a new draft — the published version keeps sending until you publish again.
|
|
20
|
+
|
|
21
|
+
| State | Can send? |
|
|
22
|
+
|-------|-----------|
|
|
23
|
+
| **Draft** | No |
|
|
24
|
+
| **Published** | Yes |
|
|
25
|
+
|
|
26
|
+
## Variable Syntax
|
|
27
|
+
|
|
28
|
+
Use **triple mustache** in HTML and subject: `{{{VARIABLE_NAME}}}`
|
|
29
|
+
|
|
30
|
+
```html
|
|
31
|
+
<!-- ✅ Correct -->
|
|
32
|
+
<p>Hi {{{CUSTOMER_NAME}}}, your order #{{{ORDER_ID}}} has shipped!</p>
|
|
33
|
+
|
|
34
|
+
<!-- ❌ Wrong — double braces don't render in Resend -->
|
|
35
|
+
<p>Hi {{CUSTOMER_NAME}}</p>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Plain substitution only — no `{{#each}}`, `{{#if}}`, or other Handlebars control flow. Pre-render dynamic lists server-side into a single HTML variable.
|
|
39
|
+
|
|
40
|
+
Variable key casing is arbitrary (`ORDER_ID`, `orderId`, `order_id` all work) but must be consistent: whatever casing you use in the template definition must match exactly in the send call.
|
|
41
|
+
|
|
42
|
+
### Variable Definition
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
{ key: 'ORDER_TOTAL', type: 'number', fallbackValue: 0 }
|
|
46
|
+
{ key: 'CUSTOMER_NAME', type: 'string', fallbackValue: 'Customer' }
|
|
47
|
+
{ key: 'ORDER_ID', type: 'string' } // no fallbackValue = required at send time
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
- Variable **with** `fallbackValue` and missing at send → uses fallback, send succeeds
|
|
51
|
+
- Variable **without** `fallbackValue` and missing at send → send **fails** (422)
|
|
52
|
+
|
|
53
|
+
### Variable Constraints
|
|
54
|
+
|
|
55
|
+
| Constraint | Limit |
|
|
56
|
+
|------------|-------|
|
|
57
|
+
| Max variables per template | 50 |
|
|
58
|
+
| Key characters | ASCII letters, numbers, underscores only |
|
|
59
|
+
| Key max length | 50 characters |
|
|
60
|
+
| String value max | 2,000 characters |
|
|
61
|
+
| Number value max | 2^53 − 1 |
|
|
62
|
+
|
|
63
|
+
### Reserved Names
|
|
64
|
+
|
|
65
|
+
`FIRST_NAME` · `LAST_NAME` · `EMAIL` · `UNSUBSCRIBE_URL` · `RESEND_UNSUBSCRIBE_URL` · `contact` · `this`
|
|
66
|
+
|
|
67
|
+
These cannot be used as custom variable keys — rename to `USER_FIRST_NAME`, `USER_EMAIL`, etc.
|
|
68
|
+
|
|
69
|
+
## Sending with a Template
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
const { data, error } = await resend.emails.send(
|
|
73
|
+
{
|
|
74
|
+
from: 'Acme <orders@acme.com>',
|
|
75
|
+
to: ['customer@example.com'],
|
|
76
|
+
template: {
|
|
77
|
+
id: 'order-confirmation', // alias or auto-generated ID
|
|
78
|
+
variables: { CUSTOMER_NAME: 'Alice', ORDER_ID: '12345' },
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
{ idempotencyKey: `order-confirm/${orderId}` }
|
|
82
|
+
);
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Cannot combine `template` with `html`, `text`, or `react` — mutually exclusive. `subject` and `from` from the template can be overridden per-send.
|
|
86
|
+
|
|
87
|
+
## Aliases
|
|
88
|
+
|
|
89
|
+
An alias is a stable, human-readable slug you set at create time. Pass it in the `id` field anywhere you'd use the auto-generated template ID.
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
// Set alias at create time
|
|
93
|
+
await resend.templates.create({
|
|
94
|
+
name: 'Order Confirmation', // display-only
|
|
95
|
+
alias: 'order-confirmation', // referenceable slug
|
|
96
|
+
html: '<p>Hi {{{CUSTOMER_NAME}}}</p>',
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// Reference by alias — no need to store the generated tmpl_ ID
|
|
100
|
+
template: { id: 'order-confirmation', variables: { CUSTOMER_NAME: 'Alice' } }
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## SDK Methods (Node.js)
|
|
104
|
+
|
|
105
|
+
| Operation | Method |
|
|
106
|
+
|-----------|--------|
|
|
107
|
+
| Create | `resend.templates.create(params)` |
|
|
108
|
+
| Get | `resend.templates.get(id)` |
|
|
109
|
+
| List | `resend.templates.list(params)` |
|
|
110
|
+
| Update | `resend.templates.update(id, params)` |
|
|
111
|
+
| Delete | `resend.templates.remove(id)` ← not `.delete()` |
|
|
112
|
+
| Publish | `resend.templates.publish(id)` |
|
|
113
|
+
| Duplicate | `resend.templates.duplicate(id)` |
|
|
114
|
+
|
|
115
|
+
### Create Template
|
|
116
|
+
|
|
117
|
+
**Required:** `name`, `html` (or `react`)
|
|
118
|
+
**Optional:** `alias`, `from`, `subject`, `reply_to`, `text`, `react`, `variables`
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
const { data, error } = await resend.templates.create({
|
|
122
|
+
name: 'Order Confirmation',
|
|
123
|
+
alias: 'order-confirmation',
|
|
124
|
+
subject: 'Your Order #{{{ORDER_ID}}}',
|
|
125
|
+
html: '<p>Hi {{{CUSTOMER_NAME}}}, your order #{{{ORDER_ID}}} has shipped!</p>',
|
|
126
|
+
variables: [
|
|
127
|
+
{ key: 'CUSTOMER_NAME', type: 'string', fallbackValue: 'Customer' },
|
|
128
|
+
{ key: 'ORDER_ID', type: 'string' },
|
|
129
|
+
],
|
|
130
|
+
});
|
|
131
|
+
// Returns: { id: 'tmpl_abc123', object: 'template' }
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Chainable Create → Publish
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
const { data, error } = await resend.templates.create({
|
|
138
|
+
name: 'Welcome',
|
|
139
|
+
html: '<p>Hi {{{NAME}}}</p>',
|
|
140
|
+
}).publish();
|
|
141
|
+
// Template is created AND published in one call
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Get, List, Update, Delete
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
// Get by ID or alias
|
|
148
|
+
await resend.templates.get('tmpl_abc123');
|
|
149
|
+
await resend.templates.get('order-confirmation'); // by alias
|
|
150
|
+
|
|
151
|
+
// List — cursor-based pagination, max 100 per page
|
|
152
|
+
const { data } = await resend.templates.list({ limit: 100 });
|
|
153
|
+
// data.has_more === true → fetch next page
|
|
154
|
+
await resend.templates.list({ limit: 100, after: data.data[data.data.length - 1].id });
|
|
155
|
+
|
|
156
|
+
// Update (partial — only provided fields change)
|
|
157
|
+
await resend.templates.update('tmpl_abc123', { name: 'Order Confirmed' });
|
|
158
|
+
|
|
159
|
+
// Delete
|
|
160
|
+
await resend.templates.remove('tmpl_abc123'); // returns { deleted: true }
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
See `fetch-all-templates.mjs` for a complete pagination loop.
|
|
164
|
+
|
|
165
|
+
### Publish
|
|
166
|
+
|
|
167
|
+
```typescript
|
|
168
|
+
await resend.templates.publish('tmpl_abc123');
|
|
169
|
+
// Template is now live. Publishing is synchronous — no delay needed before sending.
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Duplicate
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
const { data, error } = await resend.templates.duplicate('tmpl_abc123');
|
|
176
|
+
// Returns: { id: 'tmpl_new456', object: 'template' }
|
|
177
|
+
|
|
178
|
+
// Chainable — duplicate and publish in one call
|
|
179
|
+
const { data, error } = await resend.templates.duplicate('tmpl_abc123').publish();
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Useful for creating variants (e.g., A/B testing subject lines) or bootstrapping new templates from an existing one.
|
|
183
|
+
|
|
184
|
+
## Version History
|
|
185
|
+
|
|
186
|
+
Every template maintains full version history. Reverting creates a new draft from a previous version without affecting the published version. Accessible via the Resend dashboard template editor.
|
|
187
|
+
|
|
188
|
+
## Common Mistakes
|
|
189
|
+
|
|
190
|
+
| Mistake | Fix |
|
|
191
|
+
|---------|-----|
|
|
192
|
+
| `{{VAR}}` instead of `{{{VAR}}}` | Triple braces required — double braces don't render variables |
|
|
193
|
+
| Sending with draft template | Call `.publish()` first — draft templates cannot send |
|
|
194
|
+
| Adding delay after create/publish | Publishing is synchronous — send failure has another cause |
|
|
195
|
+
| `{{#each}}` or `{{#if}}` in template HTML | No loop/conditional support — pre-render dynamic lists server-side |
|
|
196
|
+
| `html` + `template` in same send call | Mutually exclusive — remove `html` when using template |
|
|
197
|
+
| Using `FIRST_NAME`, `EMAIL` as variable keys | Reserved — rename to `USER_FIRST_NAME`, `USER_EMAIL` |
|
|
198
|
+
| Variable without fallback missing at send | Add `fallbackValue` or always provide the variable |
|
|
199
|
+
| Calling `.delete()` | SDK method is `.remove()` |
|
|
200
|
+
| Expecting alias = name | `alias` is a separate referenceable slug; `name` is display-only |
|
|
201
|
+
| 60+ variables | Max 50 — pre-render complex content as a single HTML variable |
|
|
202
|
+
| No idempotency key on sends | Template sends use the same endpoint — pass `idempotencyKey` |
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Topics
|
|
2
|
+
|
|
3
|
+
Fine-grained subscription preferences — contacts opt in or out per topic. Topics control which contacts receive broadcasts when `topicId` is set.
|
|
4
|
+
|
|
5
|
+
## SDK Methods
|
|
6
|
+
|
|
7
|
+
### Node.js
|
|
8
|
+
|
|
9
|
+
| Operation | Method |
|
|
10
|
+
|-----------|--------|
|
|
11
|
+
| Create | `resend.topics.create(params)` |
|
|
12
|
+
| Get | `resend.topics.get(id)` |
|
|
13
|
+
| List | `resend.topics.list()` — no pagination params |
|
|
14
|
+
| Update | `resend.topics.update(params)` |
|
|
15
|
+
| Delete | `resend.topics.remove(id)` — not `.delete()` |
|
|
16
|
+
|
|
17
|
+
### Python
|
|
18
|
+
|
|
19
|
+
| Operation | Method |
|
|
20
|
+
|-----------|--------|
|
|
21
|
+
| Create | `resend.Topics.create(params)` |
|
|
22
|
+
| Get | `resend.Topics.get(id)` |
|
|
23
|
+
| List | `resend.Topics.list()` |
|
|
24
|
+
| Update | `resend.Topics.update(params)` |
|
|
25
|
+
| Delete | `resend.Topics.remove(id)` |
|
|
26
|
+
|
|
27
|
+
## Create Topic
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
const { data, error } = await resend.topics.create({
|
|
31
|
+
name: 'Product Updates',
|
|
32
|
+
defaultSubscription: 'opt_in', // REQUIRED: "opt_in" or "opt_out"
|
|
33
|
+
description: 'New features and releases',
|
|
34
|
+
visibility: 'public', // "public" or "private" (default: "private")
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
if (error) {
|
|
38
|
+
console.error(error);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
console.log(data.id); // topic_xxxxxxxx
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Update Topic
|
|
46
|
+
|
|
47
|
+
`defaultSubscription` is **immutable** after creation. Only `name`, `description`, and `visibility` can be updated.
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
const { data, error } = await resend.topics.update({
|
|
51
|
+
id: 'topic_xxx',
|
|
52
|
+
name: 'Product News',
|
|
53
|
+
visibility: 'public',
|
|
54
|
+
});
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Managing Contact Subscriptions
|
|
58
|
+
|
|
59
|
+
Update a contact's topic subscriptions via the contacts sub-resource:
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
await resend.contacts.topics.update({
|
|
63
|
+
id: 'cont_xxx',
|
|
64
|
+
topics: [
|
|
65
|
+
{ id: 'topic_xxx', subscription: 'opt_in' },
|
|
66
|
+
{ id: 'topic_yyy', subscription: 'opt_out' },
|
|
67
|
+
],
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Using Topics with Broadcasts
|
|
72
|
+
|
|
73
|
+
Pass `topicId` when creating a broadcast — only contacts subscribed to that topic receive it:
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
await resend.broadcasts.create({
|
|
77
|
+
name: 'Feature Launch',
|
|
78
|
+
segmentId: 'seg_xxx',
|
|
79
|
+
topicId: 'topic_xxx',
|
|
80
|
+
from: 'updates@acme.com',
|
|
81
|
+
subject: 'New Feature Launch',
|
|
82
|
+
html: '<p>Check it out!</p>',
|
|
83
|
+
});
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Constraints
|
|
87
|
+
|
|
88
|
+
| Constraint | Limit |
|
|
89
|
+
|------------|-------|
|
|
90
|
+
| Name max length | 50 characters |
|
|
91
|
+
| Description max length | 200 characters |
|
|
92
|
+
| `defaultSubscription` | `"opt_in"` or `"opt_out"` — immutable after create |
|
|
93
|
+
| `visibility` | `"public"` (shown on preference page) or `"private"` (default) |
|
|
94
|
+
|
|
95
|
+
## Common Mistakes
|
|
96
|
+
|
|
97
|
+
| Mistake | Fix |
|
|
98
|
+
|---------|-----|
|
|
99
|
+
| Omitting `defaultSubscription` on create | Required — must be `"opt_in"` or `"opt_out"` |
|
|
100
|
+
| Trying to change `defaultSubscription` | Immutable after creation — delete and recreate with new value |
|
|
101
|
+
| Calling `.delete()` | SDK method is `.remove()` |
|
|
102
|
+
| `visibility: "hidden"` | Not a valid value — use `"private"` |
|
|
103
|
+
| Expecting `list()` to accept pagination | `topics.list()` takes no params — returns all topics |
|
|
104
|
+
| Broadcast without `topicId` | Goes to all contacts in segment regardless of topic preferences |
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
# Webhooks
|
|
2
|
+
|
|
3
|
+
Receive real-time notifications when email events occur (delivered, bounced, opened, received, etc.).
|
|
4
|
+
|
|
5
|
+
## When to Use Webhooks
|
|
6
|
+
|
|
7
|
+
- Track delivery status in your database
|
|
8
|
+
- Remove bounced addresses from mailing lists
|
|
9
|
+
- Trigger follow-up actions when emails are opened/clicked
|
|
10
|
+
- Process inbound emails (`email.received`)
|
|
11
|
+
- Create alerts for failures or complaints
|
|
12
|
+
- Build custom analytics dashboards
|
|
13
|
+
|
|
14
|
+
## Event Types
|
|
15
|
+
|
|
16
|
+
### Email Delivery Events
|
|
17
|
+
|
|
18
|
+
| Event | Trigger | Use Case |
|
|
19
|
+
|-------|---------|----------|
|
|
20
|
+
| `email.sent` | API request successful, delivery attempted | Confirm email accepted |
|
|
21
|
+
| `email.delivered` | Email reached recipient's mail server | Confirm successful delivery |
|
|
22
|
+
| `email.bounced` | Mail server permanently rejected (hard bounce) | Remove from list, alert user |
|
|
23
|
+
| `email.complained` | Recipient marked as spam | Unsubscribe, review content |
|
|
24
|
+
| `email.opened` | Recipient opened email | Track engagement |
|
|
25
|
+
| `email.clicked` | Recipient clicked a link | Track engagement |
|
|
26
|
+
| `email.delivery_delayed` | Temporary delivery issue (soft bounce) | Monitor, may resolve automatically |
|
|
27
|
+
| `email.failed` | Send error (invalid recipient, quota, etc.) | Debug, alert |
|
|
28
|
+
|
|
29
|
+
### Inbound Email Events
|
|
30
|
+
|
|
31
|
+
| Event | Trigger | Use Case |
|
|
32
|
+
|-------|---------|----------|
|
|
33
|
+
| `email.received` | Email received at your inbound domain | Process incoming email, auto-reply, forward |
|
|
34
|
+
|
|
35
|
+
The `email.received` payload contains metadata only (sender, recipient, subject, attachment list) — not the email body. Call `resend.emails.receiving.get()` to retrieve the body content. See [receiving.md](receiving.md) for full details.
|
|
36
|
+
|
|
37
|
+
### Bounce Types
|
|
38
|
+
|
|
39
|
+
| Type | Event | Action |
|
|
40
|
+
|------|-------|--------|
|
|
41
|
+
| **Hard bounce (Permanent)** | `email.bounced` | Remove address immediately — never retry |
|
|
42
|
+
| **Soft bounce (Transient)** | `email.delivery_delayed` | Monitor — Resend retries automatically |
|
|
43
|
+
| **Undetermined** | `email.bounced` | Treat as hard bounce if repeated |
|
|
44
|
+
|
|
45
|
+
**Hard bounces** (`email.bounced`) are permanent failures. The address is invalid and will never accept mail. Continuing to send to hard-bounced addresses destroys your sender reputation.
|
|
46
|
+
|
|
47
|
+
| Subtype | Cause |
|
|
48
|
+
|---------|-------|
|
|
49
|
+
| General | Recipient's email provider sent a hard bounce |
|
|
50
|
+
| NoEmail | Address doesn't exist or couldn't be determined |
|
|
51
|
+
|
|
52
|
+
**Soft bounces** (`email.delivery_delayed`) are temporary issues. Resend automatically retries these. If delivery ultimately fails after retries, you'll receive an `email.bounced` event.
|
|
53
|
+
|
|
54
|
+
| Subtype | Cause | May Resolve If... |
|
|
55
|
+
|---------|-------|-------------------|
|
|
56
|
+
| General | Temporary rejection | Underlying issue clears |
|
|
57
|
+
| MailboxFull | Recipient's inbox at capacity | Recipient frees space |
|
|
58
|
+
| MessageTooLarge | Exceeds provider size limit | You reduce message size |
|
|
59
|
+
| ContentRejected | Contains disallowed content | You modify content |
|
|
60
|
+
| AttachmentRejected | Attachment type/size rejected | You modify attachment |
|
|
61
|
+
|
|
62
|
+
### Other Events
|
|
63
|
+
|
|
64
|
+
| Event | Trigger |
|
|
65
|
+
|-------|---------|
|
|
66
|
+
| `domain.created` / `updated` / `deleted` | Domain configuration changes |
|
|
67
|
+
| `contact.created` / `updated` / `deleted` | Contact list changes (not from CSV imports) |
|
|
68
|
+
|
|
69
|
+
## Setup
|
|
70
|
+
|
|
71
|
+
1. **Create endpoint** — POST endpoint that returns HTTP 200
|
|
72
|
+
2. **Add webhook** — In Resend dashboard (resend.com/webhooks), add your URL and select events
|
|
73
|
+
3. **Verify signatures** — **REQUIRED** — See [Signature Verification](#signature-verification)
|
|
74
|
+
4. **Test locally** — Use ngrok, Tailscale Funnel, or similar for local development
|
|
75
|
+
|
|
76
|
+
### Create Webhook via API
|
|
77
|
+
|
|
78
|
+
**Prefer the API** to create webhooks programmatically instead of using the dashboard. This is faster, less error-prone, and gives you the signing secret directly in the response.
|
|
79
|
+
|
|
80
|
+
#### Node.js
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
import { Resend } from 'resend';
|
|
84
|
+
|
|
85
|
+
const resend = new Resend(process.env.RESEND_API_KEY);
|
|
86
|
+
|
|
87
|
+
const { data, error } = await resend.webhooks.create({
|
|
88
|
+
endpoint: 'https://example.com/webhook',
|
|
89
|
+
events: ['email.delivered', 'email.bounced', 'email.received'],
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
if (error) {
|
|
93
|
+
console.error('Failed to create webhook:', error);
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// IMPORTANT: Store the signing secret — you need it to verify incoming webhooks
|
|
98
|
+
console.log('Webhook created:', data.id);
|
|
99
|
+
console.log('Signing secret:', data.signing_secret); // whsec_xxxxxxxxxx
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
#### Python
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
import resend
|
|
106
|
+
|
|
107
|
+
resend.api_key = 're_xxxxxxxxx'
|
|
108
|
+
|
|
109
|
+
webhook = resend.Webhooks.create(params={
|
|
110
|
+
"endpoint": "https://example.com/webhook",
|
|
111
|
+
"events": ["email.delivered", "email.bounced", "email.received"],
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
print(f"Webhook created: {webhook['id']}")
|
|
115
|
+
print(f"Signing secret: {webhook['signing_secret']}")
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
#### cURL
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
curl -X POST 'https://api.resend.com/webhooks' \
|
|
122
|
+
-H 'Authorization: Bearer re_xxxxxxxxx' \
|
|
123
|
+
-H 'Content-Type: application/json' \
|
|
124
|
+
-d '{
|
|
125
|
+
"endpoint": "https://example.com/webhook",
|
|
126
|
+
"events": ["email.delivered", "email.bounced", "email.received"]
|
|
127
|
+
}'
|
|
128
|
+
|
|
129
|
+
# Response:
|
|
130
|
+
# {
|
|
131
|
+
# "object": "webhook",
|
|
132
|
+
# "id": "4dd369bc-aa82-4ff3-97de-514ae3000ee0",
|
|
133
|
+
# "signing_secret": "whsec_xxxxxxxxxx"
|
|
134
|
+
# }
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
The `signing_secret` is only returned once when you create the webhook. Store it as `RESEND_WEBHOOK_SECRET` immediately.
|
|
138
|
+
|
|
139
|
+
### Webhook Management (List, Get, Update, Delete)
|
|
140
|
+
|
|
141
|
+
| Operation | Node.js | Python |
|
|
142
|
+
|-----------|---------|--------|
|
|
143
|
+
| List | `resend.webhooks.list()` | `resend.Webhooks.list()` |
|
|
144
|
+
| Get | `resend.webhooks.get(id)` | `resend.Webhooks.get(id)` |
|
|
145
|
+
| Update | `resend.webhooks.update(id, params)` | `resend.Webhooks.update(params)` — `webhook_id` inside params |
|
|
146
|
+
| Delete | `resend.webhooks.remove(id)` | `resend.Webhooks.remove(id)` |
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
// List all webhooks
|
|
150
|
+
const { data: webhooks, error: listError } = await resend.webhooks.list();
|
|
151
|
+
|
|
152
|
+
// Update endpoint URL or subscribed events
|
|
153
|
+
const { data: updated, error: updateError } = await resend.webhooks.update(
|
|
154
|
+
'4dd369bc-aa82-4ff3-97de-514ae3000ee0',
|
|
155
|
+
{
|
|
156
|
+
endpoint: 'https://new-domain.com/webhook',
|
|
157
|
+
events: ['email.delivered', 'email.bounced'],
|
|
158
|
+
}
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
// Delete a webhook
|
|
162
|
+
const { data: deleted, error: deleteError } = await resend.webhooks.remove('4dd369bc-aa82-4ff3-97de-514ae3000ee0');
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**Key gotchas:**
|
|
166
|
+
- `signing_secret` is only in the create response — `get` does not return it
|
|
167
|
+
- Update can change `endpoint` and `events` — partial updates supported
|
|
168
|
+
- Use `.remove()` not `.delete()` in the Node.js SDK
|
|
169
|
+
|
|
170
|
+
## Signature Verification
|
|
171
|
+
|
|
172
|
+
**Verify webhook signatures on every request.** Without verification, anyone can send fake webhooks to your endpoint.
|
|
173
|
+
|
|
174
|
+
### Why Verification Matters
|
|
175
|
+
|
|
176
|
+
- Webhooks are unauthenticated HTTP POST requests
|
|
177
|
+
- Anyone who knows your endpoint URL can send fake events
|
|
178
|
+
- Verification ensures the webhook genuinely came from Resend
|
|
179
|
+
- Unique signatures prevent re-use of old payloads
|
|
180
|
+
|
|
181
|
+
### Required Headers
|
|
182
|
+
|
|
183
|
+
Every webhook includes these headers for verification:
|
|
184
|
+
|
|
185
|
+
| Header | Purpose |
|
|
186
|
+
|--------|---------|
|
|
187
|
+
| `svix-id` | Unique message identifier |
|
|
188
|
+
| `svix-timestamp` | Unix timestamp when sent |
|
|
189
|
+
| `svix-signature` | Cryptographic signature |
|
|
190
|
+
|
|
191
|
+
### Get Your Webhook Secret
|
|
192
|
+
|
|
193
|
+
Find your signing secret in the Resend dashboard:
|
|
194
|
+
1. Go to resend.com/webhooks
|
|
195
|
+
2. Click on your webhook
|
|
196
|
+
3. Copy the signing secret (starts with `whsec_`)
|
|
197
|
+
|
|
198
|
+
Store it securely as `RESEND_WEBHOOK_SECRET` environment variable.
|
|
199
|
+
|
|
200
|
+
### Using Resend SDK (Recommended)
|
|
201
|
+
|
|
202
|
+
Example using Next.js:
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
import { Resend } from 'resend';
|
|
206
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
207
|
+
|
|
208
|
+
const resend = new Resend(process.env.RESEND_API_KEY);
|
|
209
|
+
|
|
210
|
+
export async function POST(req: NextRequest) {
|
|
211
|
+
try {
|
|
212
|
+
// Important: Use raw body, not parsed JSON
|
|
213
|
+
const payload = await req.text();
|
|
214
|
+
|
|
215
|
+
// Throws an error if the webhook is invalid
|
|
216
|
+
const event = resend.webhooks.verify({
|
|
217
|
+
payload,
|
|
218
|
+
headers: {
|
|
219
|
+
'svix-id': req.headers.get('svix-id'),
|
|
220
|
+
'svix-timestamp': req.headers.get('svix-timestamp'),
|
|
221
|
+
'svix-signature': req.headers.get('svix-signature'),
|
|
222
|
+
},
|
|
223
|
+
secret: process.env.RESEND_WEBHOOK_SECRET,
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
switch (event.type) {
|
|
227
|
+
case 'email.delivered':
|
|
228
|
+
// Update database with delivery status
|
|
229
|
+
break;
|
|
230
|
+
case 'email.bounced':
|
|
231
|
+
// Hard bounce — remove from mailing list immediately
|
|
232
|
+
break;
|
|
233
|
+
case 'email.complained':
|
|
234
|
+
// Spam complaint — unsubscribe and flag
|
|
235
|
+
break;
|
|
236
|
+
case 'email.received':
|
|
237
|
+
// Inbound email — retrieve body and process
|
|
238
|
+
const { data: email } = await resend.emails.receiving.get(event.data.email_id);
|
|
239
|
+
break;
|
|
240
|
+
default:
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return new NextResponse('OK', { status: 200 });
|
|
245
|
+
} catch (error) {
|
|
246
|
+
console.error('Webhook verification failed:', error);
|
|
247
|
+
return new NextResponse('Invalid signature', { status: 400 });
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## Common Mistakes
|
|
253
|
+
|
|
254
|
+
| Mistake | Fix |
|
|
255
|
+
|---------|-----|
|
|
256
|
+
| Not verifying signatures | **Always verify** — unverified webhooks can't be trusted |
|
|
257
|
+
| Using parsed JSON body | Use raw request body — JSON parsing breaks signature |
|
|
258
|
+
| Using `express.json()` middleware | Use `express.raw()` for webhook routes |
|
|
259
|
+
| Hardcoding webhook secret | Store in environment variable |
|
|
260
|
+
| Returning non-200 status for valid webhooks | Return 200 OK to acknowledge receipt |
|
|
261
|
+
|
|
262
|
+
## Retry Schedule
|
|
263
|
+
|
|
264
|
+
If your endpoint doesn't return HTTP 200, Resend retries with exponential backoff:
|
|
265
|
+
|
|
266
|
+
| Attempt | Delay After Failure |
|
|
267
|
+
|---------|---------------------|
|
|
268
|
+
| 1 | Immediate |
|
|
269
|
+
| 2 | 5 seconds |
|
|
270
|
+
| 3 | 5 minutes |
|
|
271
|
+
| 4 | 30 minutes |
|
|
272
|
+
| 5 | 2 hours |
|
|
273
|
+
| 6 | 5 hours |
|
|
274
|
+
| 7 | 10 hours |
|
|
275
|
+
|
|
276
|
+
**Tip:** Always return 200 quickly, then process asynchronously if needed. You can manually replay failed webhooks from the dashboard.
|
|
277
|
+
|
|
278
|
+
## IP Allowlist
|
|
279
|
+
|
|
280
|
+
If your firewall requires allowlisting, webhooks come from:
|
|
281
|
+
|
|
282
|
+
```
|
|
283
|
+
44.228.126.217
|
|
284
|
+
50.112.21.217
|
|
285
|
+
52.24.126.164
|
|
286
|
+
54.148.139.208
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
IPv6: `2600:1f24:64:8000::/52`
|
|
290
|
+
|
|
291
|
+
## Local Development
|
|
292
|
+
|
|
293
|
+
Use tunneling tools to test webhooks locally:
|
|
294
|
+
|
|
295
|
+
```bash
|
|
296
|
+
# Tailscale Funnel (recommended — permanent URL)
|
|
297
|
+
sudo tailscale funnel 3000
|
|
298
|
+
|
|
299
|
+
# ngrok
|
|
300
|
+
ngrok http 3000
|
|
301
|
+
# Then use the tunnel URL in Resend dashboard
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
## Event Payload Example
|
|
305
|
+
|
|
306
|
+
```json
|
|
307
|
+
{
|
|
308
|
+
"type": "email.delivered",
|
|
309
|
+
"created_at": "2024-01-15T12:00:00.000Z",
|
|
310
|
+
"data": {
|
|
311
|
+
"email_id": "ae2014de-c168-4c61-8267-70d2662a1ce1",
|
|
312
|
+
"from": "Acme <noreply@acme.com>",
|
|
313
|
+
"to": ["delivered@resend.dev"],
|
|
314
|
+
"subject": "Welcome to Acme"
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
```
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reset-password
|
|
3
|
+
description: people who forgot their password can get a reset link and set a new one. Use when the builder says something like: forgot password; reset password; lost password; change password email.
|
|
4
|
+
metadata:
|
|
5
|
+
vybekiit-generated: buyer-skill-stub
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
<!-- vybekiit:generated:buyer-skill-stub -->
|
|
9
|
+
|
|
10
|
+
# Skill: reset-password
|
|
11
|
+
|
|
12
|
+
**Goal:** people who forgot their password can get a reset link and set a new one.
|
|
13
|
+
|
|
14
|
+
**Contract:** one action at a time · verify-before-advance · plain language (`language.md`) ·
|
|
15
|
+
translate every error · celebrate.
|
|
16
|
+
|
|
17
|
+
> (Agent-only) Routes: `POST /api/auth/forgot-password`, `POST /api/auth/reset-password` (web) or
|
|
18
|
+
> backend `/auth/forgot-password`, `/auth/reset-password`. Uses `resolveAuthProvider()` reset methods.
|
|
19
|
+
|
|
20
|
+
## Steps
|
|
21
|
+
|
|
22
|
+
<!-- vybekiit:page-recipe-install -->
|
|
23
|
+
0. **Install the page recipe first (catalog SSOT — Option C).**
|
|
24
|
+
Copy `apps/componentLibrary/src/pageRecipes/AccountSecurityPage.tsx` export `AccountSecurityPage` into the buyer app at route `/settings/security`.
|
|
25
|
+
Recipe id: `account-security`. Preset: auth-bridge.
|
|
26
|
+
Keep every `TODO:` in the recipe and wire each one after the route renders.
|
|
27
|
+
Also reference `packages/agentKit` `getPageRecipeInstall('reset-password')` / page-recipe-manifest.json.
|
|
28
|
+
**Verify:** route builds with practice security UI before provider wiring.
|
|
29
|
+
|
|
30
|
+
1. **Confirm sign-in is wired.** Run `add-signin` first if accounts are not set up yet.
|
|
31
|
+
**Verify:** existing sign-in works.
|
|
32
|
+
|
|
33
|
+
2. **Wire the forgot-password screen** to `POST /api/auth/forgot-password` with `{ email }`.
|
|
34
|
+
**Verify:** practice mode returns success without real mail.
|
|
35
|
+
|
|
36
|
+
3. **Wire the reset screen** (link with token) to `POST /api/auth/reset-password` with
|
|
37
|
+
`{ token, newPassword }`. On success, land signed in on the dashboard.
|
|
38
|
+
**Verify:** local dev accepts token `local-reset-token`.
|
|
39
|
+
|
|
40
|
+
4. **When going live:** ensure email delivery is configured (`setup-email`) so reset links send.
|
|
41
|
+
**Verify:** real inbox receives the link.
|
|
42
|
+
|
|
43
|
+
5. **Append checklist entry** via `formatChecklistEntry` (password reset flow enabled).
|
|
44
|
+
|
|
45
|
+
## If anything breaks
|
|
46
|
+
|
|
47
|
+
Run `doctor`. If MCP or Twilio/email tools fail once, run `vybekiit doc-fallback better-auth` and
|
|
48
|
+
tell the builder: *"I'm double-checking the official setup guide for this — hang tight, I'll have
|
|
49
|
+
the next step in a moment."*
|
|
50
|
+
|
|
51
|
+
## Definition of done
|
|
52
|
+
|
|
53
|
+
Forgot → reset → signed in works in practice mode; checklist updated.
|
|
54
|
+
|
|
55
|
+
## After completing this skill
|
|
56
|
+
|
|
57
|
+
Append one entry to `checklist.md` Decision log using `formatChecklistEntry({ from, to, because })`.
|
|
58
|
+
|
|
59
|
+
If MCP or first debug fails once, run `vybekiit doc-fallback <tech-id>` and tell the builder only: *"I'm double-checking the official setup guide for this — hang tight, I'll have the next step in a moment."*
|