opencode-skills-collection 3.1.12 → 3.1.14
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/README.md +4 -6
- package/bundled-skills/.antigravity-install-manifest.json +195 -1
- package/bundled-skills/ab-testing/SKILL.md +368 -0
- package/bundled-skills/ab-testing/evals/evals.json +105 -0
- package/bundled-skills/ab-testing/references/sample-size-guide.md +263 -0
- package/bundled-skills/ab-testing/references/test-templates.md +277 -0
- package/bundled-skills/accint-commitments/SKILL.md +32 -0
- package/bundled-skills/accint-frames/SKILL.md +35 -0
- package/bundled-skills/accint-solve/SKILL.md +22 -192
- package/bundled-skills/add-app-clip/SKILL.md +297 -0
- package/bundled-skills/add-app-clip/agents/openai.yaml +4 -0
- package/bundled-skills/add-app-clip/references/native-module.md +96 -0
- package/bundled-skills/agent-memory/SKILL.md +84 -0
- package/bundled-skills/alternatives-pages/README.md +46 -0
- package/bundled-skills/alternatives-pages/SKILL.md +376 -0
- package/bundled-skills/analytics/SKILL.md +324 -0
- package/bundled-skills/analytics/evals/evals.json +90 -0
- package/bundled-skills/analytics/references/event-library.md +260 -0
- package/bundled-skills/analytics/references/ga4-implementation.md +300 -0
- package/bundled-skills/analytics/references/gtm-implementation.md +390 -0
- package/bundled-skills/anti-deception/SKILL.md +50 -0
- package/bundled-skills/api-analyzer/SKILL.md +101 -0
- package/bundled-skills/api-and-interface-design/SKILL.md +307 -0
- package/bundled-skills/api-designer/SKILL.md +167 -0
- package/bundled-skills/api-integration/SKILL.md +175 -0
- package/bundled-skills/api-onboarding/README.md +47 -0
- package/bundled-skills/api-onboarding/SKILL.md +473 -0
- package/bundled-skills/api-sdk-generator/SKILL.md +223 -0
- package/bundled-skills/appium-skill/SKILL.md +317 -0
- package/bundled-skills/applicationinsights-web-ts/SKILL.md +477 -0
- package/bundled-skills/automated-triage/SKILL.md +189 -0
- package/bundled-skills/aws-agentic-ai/SKILL.md +141 -0
- package/bundled-skills/aws-cdk-development/SKILL.md +275 -0
- package/bundled-skills/aws-cost-operations/SKILL.md +273 -0
- package/bundled-skills/aws-mcp-setup/SKILL.md +192 -0
- package/bundled-skills/aws-serverless-eda/SKILL.md +394 -0
- package/bundled-skills/aws-sst-development/SKILL.md +175 -0
- package/bundled-skills/azure-ai-language-conversations-py/SKILL.md +112 -0
- package/bundled-skills/azure-servicebus-rust/SKILL.md +182 -0
- package/bundled-skills/azure-storage-queue-rust/SKILL.md +178 -0
- package/bundled-skills/baseline-ui/SKILL.md +15 -10
- package/bundled-skills/before-you-build/SKILL.md +111 -0
- package/bundled-skills/brooks-audit/SKILL.md +49 -0
- package/bundled-skills/brooks-audit/architecture-guide.md +195 -0
- package/bundled-skills/brooks-audit/onboarding-guide.md +89 -0
- package/bundled-skills/brooks-debt/SKILL.md +42 -0
- package/bundled-skills/brooks-debt/debt-guide.md +125 -0
- package/bundled-skills/brooks-harness/SKILL.md +139 -0
- package/bundled-skills/brooks-review/SKILL.md +42 -0
- package/bundled-skills/brooks-review/pr-review-guide.md +163 -0
- package/bundled-skills/brooks-sweep/SKILL.md +44 -0
- package/bundled-skills/brooks-sweep/sweep-guide.md +264 -0
- package/bundled-skills/brooks-test/SKILL.md +41 -0
- package/bundled-skills/brooks-test/test-guide.md +147 -0
- package/bundled-skills/bug-hunt-swarm/SKILL.md +189 -0
- package/bundled-skills/bug-hunt-swarm/agents/openai.yaml +4 -0
- package/bundled-skills/building-native-ui/SKILL.md +77 -18
- package/bundled-skills/building-native-ui/agents/openai.yaml +4 -0
- package/bundled-skills/building-native-ui/references/animations.md +220 -0
- package/bundled-skills/building-native-ui/references/controls.md +270 -0
- package/bundled-skills/building-native-ui/references/form-sheet.md +253 -0
- package/bundled-skills/building-native-ui/references/gradients.md +106 -0
- package/bundled-skills/building-native-ui/references/icons.md +213 -0
- package/bundled-skills/building-native-ui/references/media.md +198 -0
- package/bundled-skills/building-native-ui/references/route-structure.md +229 -0
- package/bundled-skills/building-native-ui/references/search.md +248 -0
- package/bundled-skills/building-native-ui/references/storage.md +121 -0
- package/bundled-skills/building-native-ui/references/tabs.md +433 -0
- package/bundled-skills/building-native-ui/references/toolbar-and-headers.md +284 -0
- package/bundled-skills/building-native-ui/references/visual-effects.md +197 -0
- package/bundled-skills/building-native-ui/references/webgpu-three.md +605 -0
- package/bundled-skills/building-native-ui/references/zoom-transitions.md +158 -0
- package/bundled-skills/changelog-updates/README.md +53 -0
- package/bundled-skills/changelog-updates/SKILL.md +552 -0
- package/bundled-skills/ci-cd-and-automation/SKILL.md +403 -0
- package/bundled-skills/claimable-postgres/SKILL.md +91 -59
- package/bundled-skills/co-marketing/SKILL.md +301 -0
- package/bundled-skills/co-marketing/evals/evals.json +84 -0
- package/bundled-skills/code-review-and-quality/SKILL.md +394 -0
- package/bundled-skills/code-showcase-core-components/SKILL.md +281 -0
- package/bundled-skills/code-showcase-react-ui-patterns/SKILL.md +306 -0
- package/bundled-skills/code-showcase-systematic-debugging/SKILL.md +167 -0
- package/bundled-skills/code-showcase-testing-patterns/SKILL.md +276 -0
- package/bundled-skills/code-simplification/SKILL.md +344 -0
- package/bundled-skills/community-building/README.md +102 -0
- package/bundled-skills/community-building/SKILL.md +415 -0
- package/bundled-skills/competitor-profiling/SKILL.md +427 -0
- package/bundled-skills/competitor-profiling/evals/evals.json +85 -0
- package/bundled-skills/competitor-profiling/references/templates.md +167 -0
- package/bundled-skills/competitor-profiling/references/tool-reference.md +179 -0
- package/bundled-skills/competitor-tracking/README.md +40 -0
- package/bundled-skills/competitor-tracking/SKILL.md +322 -0
- package/bundled-skills/context-engineering/SKILL.md +302 -0
- package/bundled-skills/cro/SKILL.md +202 -0
- package/bundled-skills/cro/evals/evals.json +111 -0
- package/bundled-skills/cro/references/experiments.md +248 -0
- package/bundled-skills/cro/references/form.md +422 -0
- package/bundled-skills/cron-doctor/scripts/cron-engine.js +10 -7
- package/bundled-skills/cucumber-skill/SKILL.md +235 -0
- package/bundled-skills/customer-research/SKILL.md +287 -0
- package/bundled-skills/customer-research/evals/evals.json +162 -0
- package/bundled-skills/customer-research/references/source-guides.md +401 -0
- package/bundled-skills/cypress-skill/SKILL.md +235 -0
- package/bundled-skills/debugging-and-error-recovery/SKILL.md +313 -0
- package/bundled-skills/debugging-code/SKILL.md +284 -0
- package/bundled-skills/debugging-code/references/advanced-techniques.md +50 -0
- package/bundled-skills/debugging-code/references/installing-debuggers.md +67 -0
- package/bundled-skills/debugging-code/scripts/install-dap.sh +87 -0
- package/bundled-skills/deprecation-and-migration/SKILL.md +219 -0
- package/bundled-skills/design-philosophy/SKILL.md +40 -0
- package/bundled-skills/design-philosophy/reference.md +19 -0
- package/bundled-skills/design-spatial/SKILL.md +271 -0
- package/bundled-skills/design-spatial/scripts/layout-audit.js +138 -0
- package/bundled-skills/design-system/SKILL.md +140 -0
- package/bundled-skills/design-system/references/motion-choreography.md +111 -0
- package/bundled-skills/design-thinking/SKILL.md +109 -0
- package/bundled-skills/design-ux/SKILL.md +75 -0
- package/bundled-skills/dev-to-hashnode/README.md +62 -0
- package/bundled-skills/dev-to-hashnode/SKILL.md +399 -0
- package/bundled-skills/developer-advocacy/README.md +102 -0
- package/bundled-skills/developer-advocacy/SKILL.md +423 -0
- package/bundled-skills/developer-audience-context/README.md +61 -0
- package/bundled-skills/developer-audience-context/SKILL.md +271 -0
- package/bundled-skills/developer-audience-context/references/example-apitest.md +175 -0
- package/bundled-skills/developer-audience-context/references/template.md +152 -0
- package/bundled-skills/developer-churn/README.md +80 -0
- package/bundled-skills/developer-churn/SKILL.md +652 -0
- package/bundled-skills/developer-listening/README.md +30 -0
- package/bundled-skills/developer-listening/SKILL.md +232 -0
- package/bundled-skills/developer-newsletter/README.md +84 -0
- package/bundled-skills/developer-newsletter/SKILL.md +376 -0
- package/bundled-skills/developer-onboarding/README.md +35 -0
- package/bundled-skills/developer-onboarding/SKILL.md +530 -0
- package/bundled-skills/developer-sandbox/README.md +47 -0
- package/bundled-skills/developer-sandbox/SKILL.md +504 -0
- package/bundled-skills/developer-seo/README.md +36 -0
- package/bundled-skills/developer-seo/SKILL.md +296 -0
- package/bundled-skills/developer-signup-flow/README.md +36 -0
- package/bundled-skills/developer-signup-flow/SKILL.md +397 -0
- package/bundled-skills/devrel-content/README.md +81 -0
- package/bundled-skills/devrel-content/SKILL.md +428 -0
- package/bundled-skills/dispatch/SKILL.md +130 -0
- package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
- package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
- package/bundled-skills/docs/maintainers/repo-growth-seo.md +3 -3
- package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
- package/bundled-skills/docs/users/bundles.md +1 -1
- package/bundled-skills/docs/users/claude-code-skills.md +1 -1
- package/bundled-skills/docs/users/faq.md +1 -1
- package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
- package/bundled-skills/docs/users/getting-started.md +1 -1
- package/bundled-skills/docs/users/kiro-integration.md +1 -1
- package/bundled-skills/docs/users/usage.md +8 -8
- package/bundled-skills/docs/users/visual-guide.md +8 -8
- package/bundled-skills/docs-as-marketing/README.md +37 -0
- package/bundled-skills/docs-as-marketing/SKILL.md +398 -0
- package/bundled-skills/documentation-and-adrs/SKILL.md +291 -0
- package/bundled-skills/doubt-driven-development/SKILL.md +256 -0
- package/bundled-skills/eas-update-insights/SKILL.md +232 -0
- package/bundled-skills/eas-update-insights/agents/openai.yaml +4 -0
- package/bundled-skills/eas-update-insights/references/channel-insights-schema.md +47 -0
- package/bundled-skills/eas-update-insights/references/update-insights-schema.md +69 -0
- package/bundled-skills/expo-api-routes/SKILL.md +9 -5
- package/bundled-skills/expo-api-routes/agents/openai.yaml +4 -0
- package/bundled-skills/expo-brownfield/SKILL.md +71 -0
- package/bundled-skills/expo-brownfield/agents/openai.yaml +4 -0
- package/bundled-skills/expo-brownfield/references/brownfield-integrated.md +526 -0
- package/bundled-skills/expo-brownfield/references/brownfield-isolated.md +402 -0
- package/bundled-skills/expo-brownfield/references/comparison.md +63 -0
- package/bundled-skills/expo-brownfield/references/troubleshooting.md +88 -0
- package/bundled-skills/expo-cicd-workflows/SKILL.md +18 -16
- package/bundled-skills/expo-cicd-workflows/agents/openai.yaml +4 -0
- package/bundled-skills/expo-cicd-workflows/scripts/fetch.js +109 -0
- package/bundled-skills/expo-cicd-workflows/scripts/package.json +11 -0
- package/bundled-skills/expo-cicd-workflows/scripts/validate.js +84 -0
- package/bundled-skills/expo-deployment/SKILL.md +157 -53
- package/bundled-skills/expo-deployment/agents/openai.yaml +4 -0
- package/bundled-skills/expo-deployment/references/app-store-metadata.md +497 -0
- package/bundled-skills/expo-deployment/references/ios-app-store.md +371 -0
- package/bundled-skills/expo-deployment/references/play-store.md +246 -0
- package/bundled-skills/expo-deployment/references/testflight.md +58 -0
- package/bundled-skills/expo-deployment/references/workflows.md +160 -0
- package/bundled-skills/expo-dev-client/SKILL.md +25 -14
- package/bundled-skills/expo-dev-client/agents/openai.yaml +4 -0
- package/bundled-skills/expo-examples/SKILL.md +111 -0
- package/bundled-skills/expo-examples/references/catalog.md +105 -0
- package/bundled-skills/expo-module/SKILL.md +152 -0
- package/bundled-skills/expo-module/agents/openai.yaml +4 -0
- package/bundled-skills/expo-module/references/config-plugin.md +90 -0
- package/bundled-skills/expo-module/references/create-expo-module.md +206 -0
- package/bundled-skills/expo-module/references/lifecycle.md +127 -0
- package/bundled-skills/expo-module/references/module-config.md +48 -0
- package/bundled-skills/expo-module/references/native-module.md +286 -0
- package/bundled-skills/expo-module/references/native-view.md +171 -0
- package/bundled-skills/expo-observe/SKILL.md +44 -0
- package/bundled-skills/expo-observe/references/metrics.md +47 -0
- package/bundled-skills/expo-observe/references/queries.md +342 -0
- package/bundled-skills/expo-observe/references/setup.md +255 -0
- package/bundled-skills/expo-tailwind-setup/SKILL.md +13 -10
- package/bundled-skills/expo-tailwind-setup/agents/openai.yaml +4 -0
- package/bundled-skills/expo-ui/SKILL.md +61 -0
- package/bundled-skills/expo-ui/agents/openai.yaml +4 -0
- package/bundled-skills/expo-ui/references/drop-in-replacements.md +27 -0
- package/bundled-skills/expo-ui/references/jetpack-compose.md +73 -0
- package/bundled-skills/expo-ui/references/swift-ui.md +73 -0
- package/bundled-skills/expo-ui/references/universal.md +73 -0
- package/bundled-skills/expo-ui/scripts/list-components.js +193 -0
- package/bundled-skills/faf-context/SKILL.md +106 -0
- package/bundled-skills/faf-go/SKILL.md +336 -0
- package/bundled-skills/fixing-accessibility/SKILL.md +16 -5
- package/bundled-skills/fixing-metadata/SKILL.md +18 -8
- package/bundled-skills/fixing-motion-performance/SKILL.md +17 -6
- package/bundled-skills/formik-patterns/SKILL.md +379 -0
- package/bundled-skills/free-tier-strategy/README.md +39 -0
- package/bundled-skills/free-tier-strategy/SKILL.md +462 -0
- package/bundled-skills/frontend-architecture/SKILL.md +419 -0
- package/bundled-skills/frontend-data-contracts/SKILL.md +331 -0
- package/bundled-skills/frontend-observability/SKILL.md +434 -0
- package/bundled-skills/frontend-optimistic-mutations/SKILL.md +278 -0
- package/bundled-skills/frontend-seo/SKILL.md +710 -0
- package/bundled-skills/frontend-slides-frontend-slides/SKILL.md +397 -0
- package/bundled-skills/frontend-ui-engineering/SKILL.md +341 -0
- package/bundled-skills/gemini-api-dev/SKILL.md +96 -53
- package/bundled-skills/gemini-live-api-dev/SKILL.md +339 -0
- package/bundled-skills/gemini-omni-flash-api/SKILL.md +335 -0
- package/bundled-skills/gemini-omni-flash-api/scripts/upload_file.py +218 -0
- package/bundled-skills/gemini-omni-flash-api/scripts/video/generate_video.py +439 -0
- package/bundled-skills/gemini-omni-flash-api/scripts/video/inspect_video.py +197 -0
- package/bundled-skills/gemini-omni-flash-api/scripts/video/prep_video.py +255 -0
- package/bundled-skills/gh-image/SKILL.md +10 -2
- package/bundled-skills/git-workflow-and-versioning/SKILL.md +313 -0
- package/bundled-skills/github-presence/README.md +67 -0
- package/bundled-skills/github-presence/SKILL.md +484 -0
- package/bundled-skills/graphql-schema/SKILL.md +309 -0
- package/bundled-skills/hf-mcp/SKILL.md +195 -0
- package/bundled-skills/hf-mem/SKILL.md +92 -0
- package/bundled-skills/hugging-face-cli/SKILL.md +155 -115
- package/bundled-skills/hugging-face-community-evals/SKILL.md +14 -7
- package/bundled-skills/hugging-face-dataset-viewer/SKILL.md +30 -37
- package/bundled-skills/hugging-face-gradio/SKILL.md +14 -7
- package/bundled-skills/hugging-face-model-trainer/SKILL.md +42 -11
- package/bundled-skills/hugging-face-model-trainer/references/gguf_conversion.md +5 -0
- package/bundled-skills/hugging-face-model-trainer/scripts/convert_to_gguf.py +57 -51
- package/bundled-skills/hugging-face-model-trainer/scripts/hf_benchmarks.py +659 -0
- package/bundled-skills/hugging-face-paper-publisher/SKILL.md +13 -6
- package/bundled-skills/hugging-face-papers/SKILL.md +12 -5
- package/bundled-skills/hugging-face-trackio/SKILL.md +11 -5
- package/bundled-skills/hugging-face-vision-trainer/SKILL.md +11 -5
- package/bundled-skills/huggingface-best/SKILL.md +143 -0
- package/bundled-skills/huggingface-local-models/SKILL.md +130 -0
- package/bundled-skills/huggingface-local-models/references/hardware.md +38 -0
- package/bundled-skills/huggingface-local-models/references/hub-discovery.md +178 -0
- package/bundled-skills/huggingface-local-models/references/quantization.md +256 -0
- package/bundled-skills/huggingface-lora-space-builder/SKILL.md +409 -0
- package/bundled-skills/huggingface-lora-space-builder/references/adapting-to-the-lora.md +113 -0
- package/bundled-skills/huggingface-lora-space-builder/references/base-models/krea-2.md +63 -0
- package/bundled-skills/huggingface-lora-space-builder/references/base-models/ltx.md +205 -0
- package/bundled-skills/huggingface-lora-space-builder/references/base-models/qwen-image.md +144 -0
- package/bundled-skills/huggingface-lora-space-builder/references/creative-mode.md +262 -0
- package/bundled-skills/huggingface-lora-space-builder/references/tasks.md +124 -0
- package/bundled-skills/huggingface-lora-space-builder/references/zerogpu-and-publishing.md +194 -0
- package/bundled-skills/huggingface-spaces/SKILL.md +247 -0
- package/bundled-skills/huggingface-spaces/references/buckets.md +89 -0
- package/bundled-skills/huggingface-spaces/references/debugging.md +234 -0
- package/bundled-skills/huggingface-spaces/references/gradio.md +171 -0
- package/bundled-skills/huggingface-spaces/references/grants.md +56 -0
- package/bundled-skills/huggingface-spaces/references/inference-providers.md +85 -0
- package/bundled-skills/huggingface-spaces/references/known-errors.md +232 -0
- package/bundled-skills/huggingface-spaces/references/requirements.md +153 -0
- package/bundled-skills/huggingface-spaces/references/zerogpu.md +276 -0
- package/bundled-skills/huggingface-tool-builder/SKILL.md +137 -0
- package/bundled-skills/huggingface-tool-builder/references/baseline_hf_api.py +57 -0
- package/bundled-skills/huggingface-tool-builder/references/baseline_hf_api.sh +40 -0
- package/bundled-skills/huggingface-tool-builder/references/baseline_hf_api.tsx +57 -0
- package/bundled-skills/huggingface-tool-builder/references/find_models_by_paper.sh +230 -0
- package/bundled-skills/huggingface-tool-builder/references/hf_enrich_models.sh +96 -0
- package/bundled-skills/huggingface-tool-builder/references/hf_model_card_frontmatter.sh +188 -0
- package/bundled-skills/huggingface-tool-builder/references/hf_model_papers_auth.sh +171 -0
- package/bundled-skills/huggingface-zerogpu/SKILL.md +306 -0
- package/bundled-skills/huggingface-zerogpu/references/concurrency.md +79 -0
- package/bundled-skills/huggingface-zerogpu/references/cuda-and-deps.md +66 -0
- package/bundled-skills/huggingface-zerogpu/references/how-quota-works.md +74 -0
- package/bundled-skills/huggingface-zerogpu/references/how-zerogpu-works.md +50 -0
- package/bundled-skills/hugo-to-markdown/SKILL.md +201 -0
- package/bundled-skills/hugo-to-markdown/agents/openai.yaml +4 -0
- package/bundled-skills/hugo-to-markdown/references/conversion-workflow.md +143 -0
- package/bundled-skills/hugo-to-markdown/references/front-matter-and-content.md +145 -0
- package/bundled-skills/hugo-to-markdown/references/links-assets-and-validation.md +106 -0
- package/bundled-skills/hugo-to-markdown/references/shortcodes-and-render-hooks.md +281 -0
- package/bundled-skills/hugo-to-markdown/scripts/check_standard_markdown.py +70 -0
- package/bundled-skills/hugo-to-markdown/scripts/inventory_hugo_rules.py +188 -0
- package/bundled-skills/hyperexecute-skill/SKILL.md +65 -0
- package/bundled-skills/idea-refine/SKILL.md +195 -0
- package/bundled-skills/idea-refine/examples.md +238 -0
- package/bundled-skills/idea-refine/frameworks.md +99 -0
- package/bundled-skills/idea-refine/refinement-criteria.md +113 -0
- package/bundled-skills/idea-refine/scripts/idea-refine.sh +15 -0
- package/bundled-skills/implement/SKILL.md +32 -0
- package/bundled-skills/incremental-implementation/SKILL.md +262 -0
- package/bundled-skills/jest-skill/SKILL.md +182 -0
- package/bundled-skills/junit-5-skill/SKILL.md +236 -0
- package/bundled-skills/logic-diff/SKILL.md +50 -0
- package/bundled-skills/logic-diff/logic-diff-guide.md +75 -0
- package/bundled-skills/logic-explain/SKILL.md +50 -0
- package/bundled-skills/logic-explain/logic-explain-guide.md +74 -0
- package/bundled-skills/logic-fix-all/SKILL.md +87 -0
- package/bundled-skills/logic-fix-all/guide-phases-0-2-consent-scope-health.md +113 -0
- package/bundled-skills/logic-fix-all/guide-phases-3-5-review-locate-clarify.md +47 -0
- package/bundled-skills/logic-fix-all/guide-phases-6-9-fix-iterate-report.md +143 -0
- package/bundled-skills/logic-fix-all/logic-fix-all-guide.md +60 -0
- package/bundled-skills/logic-locate/SKILL.md +52 -0
- package/bundled-skills/logic-locate/logic-locate-guide.md +85 -0
- package/bundled-skills/logic-review/SKILL.md +100 -0
- package/bundled-skills/logic-review/logic-review-guide.md +296 -0
- package/bundled-skills/longbridge-content/SKILL.md +87 -0
- package/bundled-skills/longbridge-fundamentals/SKILL.md +134 -0
- package/bundled-skills/longbridge-market-data/SKILL.md +129 -0
- package/bundled-skills/loopy/SKILL.md +289 -0
- package/bundled-skills/loopy/agents/openai.yaml +4 -0
- package/bundled-skills/loopy/references/audit.md +61 -0
- package/bundled-skills/loopy/references/debrief.md +43 -0
- package/bundled-skills/loopy/references/discover.md +72 -0
- package/bundled-skills/loopy/references/publish.md +65 -0
- package/bundled-skills/loopy/references/run.md +73 -0
- package/bundled-skills/marketing-plan/SKILL.md +283 -0
- package/bundled-skills/marketing-plan/evals/evals.json +96 -0
- package/bundled-skills/marketing-plan/references/aarrr-framework.md +180 -0
- package/bundled-skills/marketing-plan/references/budget-planning.md +168 -0
- package/bundled-skills/marketing-plan/references/client-types.md +373 -0
- package/bundled-skills/marketing-plan/references/current-state-rubric.md +255 -0
- package/bundled-skills/marketing-plan/references/example-quietude.md +972 -0
- package/bundled-skills/marketing-plan/references/funding-stage-unlocks.md +230 -0
- package/bundled-skills/marketing-plan/references/growth-patterns.md +148 -0
- package/bundled-skills/marketing-plan/references/idea-cross-reference.md +265 -0
- package/bundled-skills/marketing-plan/references/measurement-framework.md +213 -0
- package/bundled-skills/marketing-plan/references/methodology.md +363 -0
- package/bundled-skills/marketing-plan/references/ops-stack-mapping.md +197 -0
- package/bundled-skills/marketing-plan/references/plan-template.md +494 -0
- package/bundled-skills/marketing-plan/references/team-and-agency-model.md +278 -0
- package/bundled-skills/mdpr-skill/SKILL.md +233 -0
- package/bundled-skills/monte-carlo-analyze-root-cause/SKILL.md +229 -0
- package/bundled-skills/monte-carlo-asset-health/SKILL.md +200 -0
- package/bundled-skills/monte-carlo-monitoring-advisor/SKILL.md +317 -0
- package/bundled-skills/monte-carlo-performance-diagnosis/SKILL.md +153 -0
- package/bundled-skills/monte-carlo-remediation/SKILL.md +359 -0
- package/bundled-skills/monte-carlo-storage-cost-analysis/SKILL.md +162 -0
- package/bundled-skills/native-data-fetching/SKILL.md +11 -8
- package/bundled-skills/native-data-fetching/agents/openai.yaml +4 -0
- package/bundled-skills/native-data-fetching/references/expo-router-loaders.md +341 -0
- package/bundled-skills/neon-ai-gateway/SKILL.md +237 -0
- package/bundled-skills/neon-functions/SKILL.md +465 -0
- package/bundled-skills/neon-functions/references/ai-sdk.md +139 -0
- package/bundled-skills/neon-functions/references/hono-websockets.md +145 -0
- package/bundled-skills/neon-functions/references/mastra-studio.md +132 -0
- package/bundled-skills/neon-functions/references/mcp.md +137 -0
- package/bundled-skills/neon-functions/references/sentry.md +131 -0
- package/bundled-skills/neon-functions/references/sse.md +143 -0
- package/bundled-skills/neon-object-storage/SKILL.md +200 -0
- package/bundled-skills/neon-postgres/SKILL.md +234 -469
- package/bundled-skills/neon-postgres-branches/SKILL.md +292 -0
- package/bundled-skills/neon-postgres-egress-optimizer/SKILL.md +256 -0
- package/bundled-skills/newman-cicd-integration/SKILL.md +330 -0
- package/bundled-skills/observability-and-instrumentation/SKILL.md +216 -0
- package/bundled-skills/odw/SKILL.md +57 -0
- package/bundled-skills/offers/SKILL.md +168 -0
- package/bundled-skills/offers/references/bonus-stacking.md +150 -0
- package/bundled-skills/offers/references/examples.md +215 -0
- package/bundled-skills/offers/references/guarantee-design.md +172 -0
- package/bundled-skills/offers/references/offer-anatomy.md +203 -0
- package/bundled-skills/offers/references/offer-formats.md +240 -0
- package/bundled-skills/offers/references/scarcity-urgency.md +175 -0
- package/bundled-skills/offers/references/value-equation.md +134 -0
- package/bundled-skills/onboarding/SKILL.md +235 -0
- package/bundled-skills/onboarding/evals/evals.json +92 -0
- package/bundled-skills/onboarding/references/experiments.md +258 -0
- package/bundled-skills/open-source-marketing/README.md +100 -0
- package/bundled-skills/open-source-marketing/SKILL.md +466 -0
- package/bundled-skills/openapi-spec-generator/SKILL.md +335 -0
- package/bundled-skills/performance-optimization/SKILL.md +363 -0
- package/bundled-skills/planning-and-task-breakdown/SKILL.md +240 -0
- package/bundled-skills/polis-protocol-a-self-optimizing-city-of-agents/SKILL.md +170 -0
- package/bundled-skills/postgresql-cli/SKILL.md +498 -0
- package/bundled-skills/postgresql-cli/references/cli-options-and-variables.md +444 -0
- package/bundled-skills/postgresql-cli/references/meta-commands-core.md +466 -0
- package/bundled-skills/postgresql-cli/references/meta-commands-formatting.md +154 -0
- package/bundled-skills/postgresql-cli/references/meta-commands-inspection.md +134 -0
- package/bundled-skills/postgresql-cli/references/tips-advanced.md +289 -0
- package/bundled-skills/postgresql-cli/references/tips-workflows.md +407 -0
- package/bundled-skills/postman-collection-generator/SKILL.md +184 -0
- package/bundled-skills/postman-newman-automation/SKILL.md +311 -0
- package/bundled-skills/postman-openapi-converter/SKILL.md +174 -0
- package/bundled-skills/power-user-cultivation/README.md +78 -0
- package/bundled-skills/power-user-cultivation/SKILL.md +598 -0
- package/bundled-skills/pricing/SKILL.md +246 -0
- package/bundled-skills/pricing/evals/evals.json +90 -0
- package/bundled-skills/pricing/references/research-methods.md +152 -0
- package/bundled-skills/pricing/references/tier-structure.md +232 -0
- package/bundled-skills/privacy-mask/SKILL.md +96 -0
- package/bundled-skills/product-marketing/SKILL.md +256 -0
- package/bundled-skills/product-marketing/evals/evals.json +85 -0
- package/bundled-skills/public-relations/SKILL.md +146 -0
- package/bundled-skills/public-relations/references/journalist-pitching.md +368 -0
- package/bundled-skills/public-relations/references/media-outlets.md +207 -0
- package/bundled-skills/public-relations/references/newsjacking.md +218 -0
- package/bundled-skills/public-relations/references/press-platforms.md +188 -0
- package/bundled-skills/puppeteer-skill/SKILL.md +143 -0
- package/bundled-skills/pytest-skill/SKILL.md +201 -0
- package/bundled-skills/rclone-cli/SKILL.md +351 -0
- package/bundled-skills/rclone-cli/references/bisync.md +2003 -0
- package/bundled-skills/rclone-cli/references/cache.md +726 -0
- package/bundled-skills/rclone-cli/references/chunker.md +484 -0
- package/bundled-skills/rclone-cli/references/combine.md +187 -0
- package/bundled-skills/rclone-cli/references/commands/rclone.md +1169 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_about.md +89 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_archive.md +49 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_archive_create.md +97 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_archive_extract.md +83 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_archive_list.md +98 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_authorize.md +53 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_backend.md +82 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_bisync.md +160 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_cat.md +122 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_check.md +134 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_checksum.md +120 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_cleanup.md +49 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_completion.md +40 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_completion_bash.md +70 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_completion_fish.md +57 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_completion_powershell.md +49 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_completion_zsh.md +57 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config.md +56 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_create.md +150 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_delete.md +33 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_disconnect.md +40 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_dump.md +33 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_edit.md +39 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_encryption.md +36 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_encryption_check.md +43 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_encryption_remove.md +44 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_encryption_set.md +54 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_file.md +33 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_password.md +49 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_paths.md +33 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_providers.md +33 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_reconnect.md +40 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_redacted.md +45 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_show.md +33 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_string.md +57 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_touch.md +33 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_update.md +150 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_userinfo.md +38 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_convmv.md +440 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_copy.md +258 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_copyto.md +219 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_copyurl.md +91 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_cryptcheck.md +141 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_cryptdecode.md +51 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_dedupe.md +166 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_delete.md +117 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_deletefile.md +50 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_gendocs.md +39 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_gitannex.md +113 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_hashsum.md +120 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_link.md +60 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_listremotes.md +55 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_ls.md +114 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_lsd.md +127 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_lsf.md +241 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_lsjson.md +195 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_lsl.md +115 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_md5sum.md +96 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_mkdir.md +43 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_mount.md +1105 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_move.md +223 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_moveto.md +218 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_ncdu.md +140 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_nfsmount.md +1111 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_obscure.md +60 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_purge.md +58 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_rc.md +111 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_rcat.md +79 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_rcd.md +219 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_rmdir.md +52 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_rmdirs.md +66 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_selfupdate.md +91 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve.md +61 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve_dlna.md +619 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve_docker.md +653 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve_ftp.md +698 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve_http.md +837 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve_nfs.md +670 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve_restic.md +246 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve_s3.md +867 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve_sftp.md +745 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve_webdav.md +896 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_settier.md +63 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_sha1sum.md +99 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_size.md +94 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_sync.md +252 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_test.md +51 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_test_changenotify.md +34 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_test_histogram.md +41 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_test_info.md +51 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_test_makefile.md +39 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_test_makefiles.md +47 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_test_memory.md +33 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_test_speed.md +66 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_touch.md +110 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_tree.md +121 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_version.md +83 -0
- package/bundled-skills/rclone-cli/references/crypt.md +844 -0
- package/bundled-skills/rclone-cli/references/docker.md +615 -0
- package/bundled-skills/rclone-cli/references/faq.md +364 -0
- package/bundled-skills/rclone-cli/references/filtering.md +991 -0
- package/bundled-skills/rclone-cli/references/flags.md +1221 -0
- package/bundled-skills/rclone-cli/references/hasher.md +383 -0
- package/bundled-skills/rclone-cli/references/install.md +686 -0
- package/bundled-skills/rclone-cli/references/overview.md +620 -0
- package/bundled-skills/rclone-cli/references/providers/alias.md +141 -0
- package/bundled-skills/rclone-cli/references/providers/archive.md +287 -0
- package/bundled-skills/rclone-cli/references/providers/azureblob.md +1140 -0
- package/bundled-skills/rclone-cli/references/providers/azurefiles.md +834 -0
- package/bundled-skills/rclone-cli/references/providers/b2.md +879 -0
- package/bundled-skills/rclone-cli/references/providers/box.md +573 -0
- package/bundled-skills/rclone-cli/references/providers/cloudinary.md +259 -0
- package/bundled-skills/rclone-cli/references/providers/compress.md +222 -0
- package/bundled-skills/rclone-cli/references/providers/drime.md +319 -0
- package/bundled-skills/rclone-cli/references/providers/drive.md +2032 -0
- package/bundled-skills/rclone-cli/references/providers/dropbox.md +661 -0
- package/bundled-skills/rclone-cli/references/providers/fichier.md +230 -0
- package/bundled-skills/rclone-cli/references/providers/filefabric.md +298 -0
- package/bundled-skills/rclone-cli/references/providers/filelu.md +256 -0
- package/bundled-skills/rclone-cli/references/providers/filen.md +243 -0
- package/bundled-skills/rclone-cli/references/providers/filescom.md +209 -0
- package/bundled-skills/rclone-cli/references/providers/ftp.md +621 -0
- package/bundled-skills/rclone-cli/references/providers/gofile.md +274 -0
- package/bundled-skills/rclone-cli/references/providers/googlecloudstorage.md +846 -0
- package/bundled-skills/rclone-cli/references/providers/googlephotos.md +676 -0
- package/bundled-skills/rclone-cli/references/providers/hdfs.md +263 -0
- package/bundled-skills/rclone-cli/references/providers/hidrive.md +487 -0
- package/bundled-skills/rclone-cli/references/providers/http.md +323 -0
- package/bundled-skills/rclone-cli/references/providers/iclouddrive.md +212 -0
- package/bundled-skills/rclone-cli/references/providers/internetarchive.md +355 -0
- package/bundled-skills/rclone-cli/references/providers/internxt.md +189 -0
- package/bundled-skills/rclone-cli/references/providers/jottacloud.md +604 -0
- package/bundled-skills/rclone-cli/references/providers/koofr.md +395 -0
- package/bundled-skills/rclone-cli/references/providers/linkbox.md +117 -0
- package/bundled-skills/rclone-cli/references/providers/local.md +749 -0
- package/bundled-skills/rclone-cli/references/providers/mailru.md +470 -0
- package/bundled-skills/rclone-cli/references/providers/mega.md +361 -0
- package/bundled-skills/rclone-cli/references/providers/memory.md +109 -0
- package/bundled-skills/rclone-cli/references/providers/netstorage.md +371 -0
- package/bundled-skills/rclone-cli/references/providers/onedrive.md +1322 -0
- package/bundled-skills/rclone-cli/references/providers/opendrive.md +222 -0
- package/bundled-skills/rclone-cli/references/providers/oracleobjectstorage/_index.md +932 -0
- package/bundled-skills/rclone-cli/references/providers/oracleobjectstorage/tutorial_mount.md +503 -0
- package/bundled-skills/rclone-cli/references/providers/pcloud.md +373 -0
- package/bundled-skills/rclone-cli/references/providers/pikpak.md +373 -0
- package/bundled-skills/rclone-cli/references/providers/pixeldrain.md +182 -0
- package/bundled-skills/rclone-cli/references/providers/premiumizeme.md +253 -0
- package/bundled-skills/rclone-cli/references/providers/protondrive.md +397 -0
- package/bundled-skills/rclone-cli/references/providers/putio.md +246 -0
- package/bundled-skills/rclone-cli/references/providers/qingstor.md +346 -0
- package/bundled-skills/rclone-cli/references/providers/quatrix.md +295 -0
- package/bundled-skills/rclone-cli/references/providers/s3.md +9687 -0
- package/bundled-skills/rclone-cli/references/providers/seafile.md +432 -0
- package/bundled-skills/rclone-cli/references/providers/sftp.md +1277 -0
- package/bundled-skills/rclone-cli/references/providers/shade.md +267 -0
- package/bundled-skills/rclone-cli/references/providers/sharefile.md +357 -0
- package/bundled-skills/rclone-cli/references/providers/sia.md +223 -0
- package/bundled-skills/rclone-cli/references/providers/smb.md +309 -0
- package/bundled-skills/rclone-cli/references/providers/storj.md +503 -0
- package/bundled-skills/rclone-cli/references/providers/sugarsync.md +305 -0
- package/bundled-skills/rclone-cli/references/providers/swift.md +744 -0
- package/bundled-skills/rclone-cli/references/providers/ulozto.md +283 -0
- package/bundled-skills/rclone-cli/references/providers/webdav.md +565 -0
- package/bundled-skills/rclone-cli/references/providers/yandex.md +283 -0
- package/bundled-skills/rclone-cli/references/providers/zoho.md +305 -0
- package/bundled-skills/rclone-cli/references/rc.md +2725 -0
- package/bundled-skills/rclone-cli/references/union.md +336 -0
- package/bundled-skills/rclone-cli/references/usage.md +3555 -0
- package/bundled-skills/rclone-cli/scripts/install.sh +204 -0
- package/bundled-skills/redis-cli/SKILL.md +392 -0
- package/bundled-skills/redis-cli/references/advanced-features.md +338 -0
- package/bundled-skills/redis-cli/references/connection-and-options.md +258 -0
- package/bundled-skills/redis-cli/references/data-query-commands.md +417 -0
- package/bundled-skills/redis-cli/references/inspection-and-monitoring.md +309 -0
- package/bundled-skills/redis-cli/references/key-management.md +252 -0
- package/bundled-skills/redis-cli/references/module-data-types.md +429 -0
- package/bundled-skills/redis-cli/references/server-administration.md +366 -0
- package/bundled-skills/repo-maintainer/SKILL.md +480 -0
- package/bundled-skills/resolving-merge-conflicts/SKILL.md +32 -0
- package/bundled-skills/review-and-simplify-changes/SKILL.md +202 -0
- package/bundled-skills/review-swarm/SKILL.md +185 -0
- package/bundled-skills/review-swarm/agents/openai.yaml +4 -0
- package/bundled-skills/riffkit/SKILL.md +122 -0
- package/bundled-skills/robot-framework-skill/SKILL.md +153 -0
- package/bundled-skills/sdk-dx/README.md +39 -0
- package/bundled-skills/sdk-dx/SKILL.md +541 -0
- package/bundled-skills/security-and-hardening/SKILL.md +474 -0
- package/bundled-skills/selenium-skill/SKILL.md +258 -0
- package/bundled-skills/shipping-and-launch/SKILL.md +323 -0
- package/bundled-skills/smartui-skill/SKILL.md +149 -0
- package/bundled-skills/source-driven-development/SKILL.md +207 -0
- package/bundled-skills/spec-driven-development/SKILL.md +217 -0
- package/bundled-skills/sql-sentinel/SKILL.md +12 -3
- package/bundled-skills/styleseed-design-review/SKILL.md +126 -0
- package/bundled-skills/supabase/CHANGELOG.md +35 -0
- package/bundled-skills/supabase/SKILL.md +149 -0
- package/bundled-skills/supabase/assets/feedback-issue-template.md +17 -0
- package/bundled-skills/supabase/references/skill-feedback.md +17 -0
- package/bundled-skills/supabase-postgres-best-practices/CHANGELOG.md +29 -0
- package/bundled-skills/supabase-postgres-best-practices/SKILL.md +74 -0
- package/bundled-skills/supabase-postgres-best-practices/references/_contributing.md +170 -0
- package/bundled-skills/supabase-postgres-best-practices/references/_sections.md +39 -0
- package/bundled-skills/supabase-postgres-best-practices/references/_template.md +34 -0
- package/bundled-skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
- package/bundled-skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
- package/bundled-skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
- package/bundled-skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
- package/bundled-skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
- package/bundled-skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
- package/bundled-skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
- package/bundled-skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
- package/bundled-skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
- package/bundled-skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
- package/bundled-skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
- package/bundled-skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
- package/bundled-skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
- package/bundled-skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
- package/bundled-skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
- package/bundled-skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
- package/bundled-skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
- package/bundled-skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
- package/bundled-skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
- package/bundled-skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
- package/bundled-skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
- package/bundled-skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
- package/bundled-skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
- package/bundled-skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
- package/bundled-skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
- package/bundled-skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
- package/bundled-skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
- package/bundled-skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
- package/bundled-skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
- package/bundled-skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
- package/bundled-skills/supabase-postgres-best-practices/references/security-rls-performance.md +63 -0
- package/bundled-skills/swiftui-expert-skill/SKILL.md +175 -242
- package/bundled-skills/swiftui-expert-skill/references/accessibility-patterns.md +215 -0
- package/bundled-skills/swiftui-expert-skill/references/animation-advanced.md +428 -0
- package/bundled-skills/swiftui-expert-skill/references/animation-basics.md +284 -0
- package/bundled-skills/swiftui-expert-skill/references/animation-transitions.md +326 -0
- package/bundled-skills/swiftui-expert-skill/references/charts-accessibility.md +135 -0
- package/bundled-skills/swiftui-expert-skill/references/charts.md +602 -0
- package/bundled-skills/swiftui-expert-skill/references/focus-patterns.md +299 -0
- package/bundled-skills/swiftui-expert-skill/references/image-optimization.md +203 -0
- package/bundled-skills/swiftui-expert-skill/references/latest-apis.md +528 -0
- package/bundled-skills/swiftui-expert-skill/references/layout-best-practices.md +266 -0
- package/bundled-skills/swiftui-expert-skill/references/liquid-glass.md +423 -0
- package/bundled-skills/swiftui-expert-skill/references/list-patterns.md +467 -0
- package/bundled-skills/swiftui-expert-skill/references/localization.md +194 -0
- package/bundled-skills/swiftui-expert-skill/references/macos-scenes.md +318 -0
- package/bundled-skills/swiftui-expert-skill/references/macos-views.md +357 -0
- package/bundled-skills/swiftui-expert-skill/references/macos-window-styling.md +303 -0
- package/bundled-skills/swiftui-expert-skill/references/performance-patterns.md +417 -0
- package/bundled-skills/swiftui-expert-skill/references/previews.md +313 -0
- package/bundled-skills/swiftui-expert-skill/references/scroll-patterns.md +293 -0
- package/bundled-skills/swiftui-expert-skill/references/sheet-navigation-patterns.md +363 -0
- package/bundled-skills/swiftui-expert-skill/references/soft-deprecation.md +39 -0
- package/bundled-skills/swiftui-expert-skill/references/state-management.md +492 -0
- package/bundled-skills/swiftui-expert-skill/references/text-patterns.md +34 -0
- package/bundled-skills/swiftui-expert-skill/references/trace-analysis.md +295 -0
- package/bundled-skills/swiftui-expert-skill/references/trace-recording.md +134 -0
- package/bundled-skills/swiftui-expert-skill/references/view-structure.md +854 -0
- package/bundled-skills/swiftui-expert-skill/scripts/analyze_trace.py +301 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/__init__.py +1 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/causes.py +187 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/correlate.py +179 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/events.py +291 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/hangs.py +108 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/hitches.py +145 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/summary.py +243 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/swiftui.py +195 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/time_profiler.py +135 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/xctrace.py +117 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/xml_utils.py +224 -0
- package/bundled-skills/swiftui-expert-skill/scripts/record_trace.py +252 -0
- package/bundled-skills/technical-tutorials/README.md +90 -0
- package/bundled-skills/technical-tutorials/SKILL.md +581 -0
- package/bundled-skills/test-framework-migration-skill/SKILL.md +122 -0
- package/bundled-skills/testng-skill/SKILL.md +163 -0
- package/bundled-skills/train-sentence-transformers/SKILL.md +118 -0
- package/bundled-skills/train-sentence-transformers/references/base_model_selection.md +79 -0
- package/bundled-skills/train-sentence-transformers/references/dataset_formats.md +128 -0
- package/bundled-skills/train-sentence-transformers/references/evaluators_cross_encoder.md +116 -0
- package/bundled-skills/train-sentence-transformers/references/evaluators_sentence_transformer.md +151 -0
- package/bundled-skills/train-sentence-transformers/references/evaluators_sparse_encoder.md +121 -0
- package/bundled-skills/train-sentence-transformers/references/hardware_guide.md +105 -0
- package/bundled-skills/train-sentence-transformers/references/hf_jobs_execution.md +173 -0
- package/bundled-skills/train-sentence-transformers/references/losses_cross_encoder.md +137 -0
- package/bundled-skills/train-sentence-transformers/references/losses_sentence_transformer.md +246 -0
- package/bundled-skills/train-sentence-transformers/references/losses_sparse_encoder.md +106 -0
- package/bundled-skills/train-sentence-transformers/references/model_architectures.md +178 -0
- package/bundled-skills/train-sentence-transformers/references/prompts_and_instructions.md +160 -0
- package/bundled-skills/train-sentence-transformers/references/training_args.md +269 -0
- package/bundled-skills/train-sentence-transformers/references/troubleshooting.md +225 -0
- package/bundled-skills/train-sentence-transformers/scripts/mine_hard_negatives.py +199 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_cross_encoder_distillation_example.py +254 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_cross_encoder_example.py +253 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_cross_encoder_listwise_example.py +282 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_distillation_example.py +303 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_example.py +227 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_make_multilingual_example.py +308 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_matryoshka_example.py +212 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_multi_dataset_example.py +258 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_static_embedding_example.py +273 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_with_lora_example.py +275 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_sparse_encoder_distillation_example.py +262 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_sparse_encoder_example.py +237 -0
- package/bundled-skills/transformers-js/SKILL.md +83 -29
- package/bundled-skills/transformers-js/references/CONFIGURATION.md +55 -7
- package/bundled-skills/transformers-js/references/EXAMPLES.md +98 -83
- package/bundled-skills/transformers-js/references/MODEL_REGISTRY.md +197 -0
- package/bundled-skills/transformers-js/references/PIPELINE_OPTIONS.md +31 -19
- package/bundled-skills/transformers-js/references/TEXT_GENERATION.md +18 -18
- package/bundled-skills/trl-training/SKILL.md +327 -0
- package/bundled-skills/tune-monitor/SKILL.md +268 -0
- package/bundled-skills/ui-a11y/SKILL.md +76 -68
- package/bundled-skills/ui-component/SKILL.md +54 -82
- package/bundled-skills/ui-lint/SKILL.md +111 -0
- package/bundled-skills/ui-motion/SKILL.md +181 -0
- package/bundled-skills/ui-page/SKILL.md +80 -90
- package/bundled-skills/ui-pattern/SKILL.md +50 -68
- package/bundled-skills/ui-review/SKILL.md +95 -77
- package/bundled-skills/ui-score/SKILL.md +145 -0
- package/bundled-skills/ui-setup/SKILL.md +196 -88
- package/bundled-skills/ui-skills-root/SKILL.md +72 -0
- package/bundled-skills/ui-tokens/SKILL.md +44 -52
- package/bundled-skills/ui-update/SKILL.md +167 -0
- package/bundled-skills/unslop-commit/SKILL.md +113 -0
- package/bundled-skills/unslop-file/SKILL.md +157 -0
- package/bundled-skills/unslop-review/SKILL.md +102 -0
- package/bundled-skills/update-swiftui-apis/SKILL.md +120 -0
- package/bundled-skills/update-swiftui-apis/references/scan-manifest.md +230 -0
- package/bundled-skills/upgrading-expo/SKILL.md +107 -82
- package/bundled-skills/upgrading-expo/agents/openai.yaml +4 -0
- package/bundled-skills/upgrading-expo/references/expo-av-to-audio.md +132 -0
- package/bundled-skills/upgrading-expo/references/expo-av-to-video.md +160 -0
- package/bundled-skills/upgrading-expo/references/native-tabs.md +124 -0
- package/bundled-skills/upgrading-expo/references/new-architecture.md +79 -0
- package/bundled-skills/upgrading-expo/references/react-19.md +79 -0
- package/bundled-skills/upgrading-expo/references/react-compiler.md +59 -0
- package/bundled-skills/upgrading-expo/references/react-navigation-to-expo-router.md +61 -0
- package/bundled-skills/usage-based-pricing/README.md +40 -0
- package/bundled-skills/usage-based-pricing/SKILL.md +547 -0
- package/bundled-skills/use-dom/SKILL.md +428 -0
- package/bundled-skills/use-dom/agents/openai.yaml +4 -0
- package/bundled-skills/ux-audit/SKILL.md +112 -44
- package/bundled-skills/ux-copy/SKILL.md +105 -73
- package/bundled-skills/ux-feedback/SKILL.md +106 -58
- package/bundled-skills/ux-flow/SKILL.md +51 -50
- package/bundled-skills/vitest-skill/SKILL.md +165 -0
- package/bundled-skills/weaviate/references/environment_requirements.md +4 -1
- package/bundled-skills/weaviate/scripts/weaviate_conn.py +51 -17
- package/bundled-skills/webdriverio-skill/SKILL.md +157 -0
- package/bundled-skills/wjttc-builder/SKILL.md +355 -0
- package/bundled-skills/wjttc-tester/SKILL.md +190 -0
- package/bundled-skills/youtube-notetaker/scripts/serve.py +20 -11
- package/package.json +1 -1
- package/skills_index.json +4404 -146
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Hono WebSocket helper on Neon Functions
|
|
2
|
+
|
|
3
|
+
Neon Functions accept WebSockets via a `{ fetch, upgrade }` default export, where `upgrade(req, socket, head)` is the raw Node handshake (see the [WebSocket servers](../SKILL.md#websocket-servers) section). That works directly with the `ws` library. If you'd rather declare WebSocket routes _inside_ a Hono app — `app.get("/ws", upgradeWebSocket(...))` with the standard `onOpen`/`onMessage`/`onClose` lifecycle — you need an adapter.
|
|
4
|
+
|
|
5
|
+
## Why an adapter (and why not `@hono/node-ws`)
|
|
6
|
+
|
|
7
|
+
Hono's `upgradeWebSocket()` is runtime-agnostic at the route layer, but the actual handshake is done by a per-runtime adapter (`hono/cloudflare-workers`, `hono/deno`, `hono/bun`, `@hono/node-server`). **There is no adapter for Neon.** The Node one, `@hono/node-ws`, is **deprecated** and its replacement assumes it owns the HTTP server (`serve({ websocket })`) — which Neon's runtime does instead.
|
|
8
|
+
|
|
9
|
+
So vendor the small adapter below. It depends only on `hono` and `ws` (no deprecated package), and is adapted from `@hono/node-ws` (MIT). Instead of attaching to an `http.Server`'s `'upgrade'` event, it returns a ready-to-export `{ fetch, upgrade }` handler that matches Neon's contract.
|
|
10
|
+
|
|
11
|
+
## The adapter
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
// src/hono-ws.ts — bridges Hono's upgradeWebSocket() to Neon's { fetch, upgrade }.
|
|
15
|
+
import { STATUS_CODES, type IncomingMessage } from "node:http";
|
|
16
|
+
import type { Duplex } from "node:stream";
|
|
17
|
+
import type { Hono } from "hono";
|
|
18
|
+
import { WSContext, defineWebSocketHelper } from "hono/ws";
|
|
19
|
+
import { WebSocketServer, type WebSocket } from "ws";
|
|
20
|
+
|
|
21
|
+
type Wire = (ws: WebSocket) => void;
|
|
22
|
+
|
|
23
|
+
export function createNeonWebSocket(app: Hono, baseUrl = "http://localhost") {
|
|
24
|
+
const wss = new WebSocketServer({ noServer: true });
|
|
25
|
+
// Correlate a handshake to its route handler via the per-request env object identity.
|
|
26
|
+
const pending = new Map<unknown, Wire>();
|
|
27
|
+
|
|
28
|
+
const upgradeWebSocket = defineWebSocketHelper(async (c, events, options) => {
|
|
29
|
+
if (c.req.header("upgrade")?.toLowerCase() !== "websocket") return;
|
|
30
|
+
const url = c.req.url;
|
|
31
|
+
pending.set(c.env, (ws) => {
|
|
32
|
+
const onError = options?.onError ?? ((e: unknown) => console.error(e));
|
|
33
|
+
const ctx = new WSContext<WebSocket>({
|
|
34
|
+
send: (data, opts) => ws.send(data, { compress: opts?.compress }),
|
|
35
|
+
close: (code, reason) => ws.close(code, reason),
|
|
36
|
+
raw: ws,
|
|
37
|
+
url,
|
|
38
|
+
protocol: ws.protocol,
|
|
39
|
+
get readyState() {
|
|
40
|
+
return ws.readyState;
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
try {
|
|
44
|
+
events.onOpen?.(new Event("open"), ctx);
|
|
45
|
+
} catch (e) {
|
|
46
|
+
onError(e);
|
|
47
|
+
}
|
|
48
|
+
ws.on("message", (data, isBinary) => {
|
|
49
|
+
for (const chunk of Array.isArray(data) ? data : [data]) {
|
|
50
|
+
try {
|
|
51
|
+
const payload = isBinary
|
|
52
|
+
? chunk instanceof ArrayBuffer
|
|
53
|
+
? chunk
|
|
54
|
+
: chunk.buffer.slice(chunk.byteOffset, chunk.byteOffset + chunk.byteLength)
|
|
55
|
+
: chunk.toString("utf-8");
|
|
56
|
+
events.onMessage?.(new MessageEvent("message", { data: payload }), ctx);
|
|
57
|
+
} catch (e) {
|
|
58
|
+
onError(e);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
ws.on("close", (code, reason) => {
|
|
63
|
+
try {
|
|
64
|
+
events.onClose?.(new CloseEvent("close", { code, reason: reason.toString() }), ctx);
|
|
65
|
+
} catch (e) {
|
|
66
|
+
onError(e);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
// Node 24 has no global ErrorEvent; a browser's ws.onerror gets a plain Event anyway.
|
|
70
|
+
ws.on("error", (error) => {
|
|
71
|
+
onError(error);
|
|
72
|
+
try {
|
|
73
|
+
events.onError?.(new Event("error"), ctx);
|
|
74
|
+
} catch (e) {
|
|
75
|
+
onError(e);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
return new Response();
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
const handler = {
|
|
83
|
+
fetch: (request: Request) => app.fetch(request),
|
|
84
|
+
async upgrade(req: IncomingMessage, socket: Duplex, head: Buffer) {
|
|
85
|
+
const url = new URL(req.url ?? "/", baseUrl);
|
|
86
|
+
const headers = new Headers();
|
|
87
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
88
|
+
if (value) headers.append(key, Array.isArray(value) ? value[0] : value);
|
|
89
|
+
}
|
|
90
|
+
// The env object identity links this request back to the route handler above.
|
|
91
|
+
const env = { incoming: req, outgoing: undefined };
|
|
92
|
+
const response = await app.request(url, { headers }, env);
|
|
93
|
+
const wire = pending.get(env);
|
|
94
|
+
pending.delete(env);
|
|
95
|
+
if (!wire) {
|
|
96
|
+
socket.end(`HTTP/1.1 ${response.status} ${STATUS_CODES[response.status] ?? ""}\r\nConnection: close\r\nContent-Length: 0\r\n\r\n`);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
wss.handleUpgrade(req, socket, head, (ws) => wire(ws));
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
return { upgradeWebSocket, handler };
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
How it works: the `upgrade` handler runs the handshake request through `app.request(...)` so Hono's router matches the `upgradeWebSocket` route; the helper registers a `wire` callback keyed by the per-request `env` object; if a route matched, `wss.handleUpgrade` accepts the socket and `wire` attaches the lifecycle handlers, otherwise the socket is closed with the route's status (e.g. 401/404).
|
|
108
|
+
|
|
109
|
+
## Usage
|
|
110
|
+
|
|
111
|
+
Because the handshake is routed through `app.request`, **auth and other gating are just normal Hono middleware on the route** — verify the `?token=` and return 401 before the upgrade:
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
// src/index.ts
|
|
115
|
+
import { Hono } from "hono";
|
|
116
|
+
import { createNeonWebSocket } from "./hono-ws";
|
|
117
|
+
|
|
118
|
+
const app = new Hono();
|
|
119
|
+
const { upgradeWebSocket, handler } = createNeonWebSocket(app);
|
|
120
|
+
|
|
121
|
+
app.get("/", (c) => c.text("ok"));
|
|
122
|
+
|
|
123
|
+
app.get(
|
|
124
|
+
"/ws",
|
|
125
|
+
async (c, next) => {
|
|
126
|
+
const identity = await verifyToken(c.req.query("token")); // your JWT check
|
|
127
|
+
if (!identity) return c.text("Unauthorized", 401);
|
|
128
|
+
await next();
|
|
129
|
+
},
|
|
130
|
+
upgradeWebSocket(() => ({
|
|
131
|
+
onOpen: (_evt, ws) => ws.send("welcome"),
|
|
132
|
+
onMessage: (evt, ws) => ws.send(`echo: ${evt.data}`),
|
|
133
|
+
onClose: () => console.log("disconnected"),
|
|
134
|
+
})),
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
export default handler; // Neon's { fetch, upgrade } contract
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Caveats
|
|
141
|
+
|
|
142
|
+
- **No header-modifying middleware on the WS route.** Per [Hono's docs](https://hono.dev/docs/helpers/websocket), middleware that changes headers (e.g. CORS) on an `upgradeWebSocket` route throws ("can't modify immutable headers"), because the helper rewrites headers internally. Auth middleware that only reads the query/headers and returns 401 is fine.
|
|
143
|
+
- **Send a heartbeat.** A socket is dropped once it goes silent — Neon's window is 15 minutes ([Timeouts](../SKILL.md#timeouts-and-runtime-limits)), but intermediary proxies are usually far stricter (tens of seconds). Send a keepalive every ~25–30s so the connection never goes quiet. With the raw `ws` socket use `ws.ping()` (the browser auto-replies with a pong); through this helper you don't hold the raw socket, so send an app-level `ws.send("ping")` the client ignores instead. See [Heartbeat](../SKILL.md#heartbeat-keep-the-socket-alive).
|
|
144
|
+
- **Fan-out and reconnect still apply.** This adapter only covers the per-isolate handshake. For a genuinely shared chat across isolates, broadcast with Postgres `LISTEN`/`NOTIFY`, and have clients reconnect with backoff — see [Fan-out across isolates](../SKILL.md#fan-out-across-isolates-do-not-skip-this) and [Client must reconnect](../SKILL.md#client-must-reconnect).
|
|
145
|
+
- **Node-only globals.** Relies on `Event`, `MessageEvent`, and `CloseEvent` (all present on Neon's Node 24 runtime). `ErrorEvent` is intentionally avoided since it isn't a Node global.
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# Mastra agents with Mastra Studio observability
|
|
2
|
+
|
|
3
|
+
A Neon Function is a long-lived Node.js 24 process, which makes it a natural host for a [Mastra](https://mastra.ai) agent: the agent keeps running for the life of the request, and you point its model at the Neon AI Gateway so there are no extra provider keys. You can keep **running the agent on Neon Functions** while shipping its traces to a **Mastra Studio (Mastra Cloud) project** for observability — the agent runs on Neon, the traces are viewable in Mastra.
|
|
4
|
+
|
|
5
|
+
The shape mirrors any other Node integration (see `references/sentry.md`): instantiate at module load, gate on env vars so local dev and unconfigured branches stay a no-op, and pass secrets at deploy time via `neon.ts`. `@mastra/core` and `@mastra/observability` bundle cleanly through `neon deploy`'s esbuild with no extra config.
|
|
6
|
+
|
|
7
|
+
## 1. Define the agent against the Neon AI Gateway
|
|
8
|
+
|
|
9
|
+
Use the gateway's **MLflow (chat-completions) dialect**, which serves every provider (OpenAI, Anthropic, …) — derive it from the injected `aiGateway.baseUrl` (see the `neon-ai-gateway` skill). `parseEnv` reads the injected gateway credentials from your `neon.ts`.
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
// src/mastra/agents/pricing.ts
|
|
13
|
+
import { Agent } from "@mastra/core/agent";
|
|
14
|
+
import { parseEnv } from "@neon/env";
|
|
15
|
+
import config from "../../../neon";
|
|
16
|
+
|
|
17
|
+
const env = parseEnv(config);
|
|
18
|
+
const gatewayUrl = env.aiGateway.baseUrl.replace("/openai/v1", "/mlflow/v1");
|
|
19
|
+
|
|
20
|
+
export const pricingAgent = new Agent({
|
|
21
|
+
id: "pricing-analyst",
|
|
22
|
+
name: "pricing-analyst",
|
|
23
|
+
instructions: "You are a meticulous pricing analyst. …",
|
|
24
|
+
model: { id: "neon/gpt-5-mini", url: gatewayUrl, apiKey: env.aiGateway.apiKey },
|
|
25
|
+
});
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 2. Wire observability to Mastra Studio
|
|
29
|
+
|
|
30
|
+
The `MastraPlatformExporter` (from `@mastra/observability`) sends traces to a Mastra Studio project. It reads `MASTRA_PLATFORM_ACCESS_TOKEN` and `MASTRA_PROJECT_ID` from the environment.
|
|
31
|
+
|
|
32
|
+
Gotcha: `Observability` requires **at least one exporter** — passing an empty `exporters` array throws `OBSERVABILITY_INVALID_INSTANCE_CONFIG`. So omit the `observability` option entirely until the platform creds are present, keeping the app runnable before the Mastra project exists (and in local dev).
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
// src/mastra/index.ts
|
|
36
|
+
import { Mastra } from "@mastra/core/mastra";
|
|
37
|
+
import { Observability, MastraPlatformExporter } from "@mastra/observability";
|
|
38
|
+
import { pricingAgent } from "./agents/pricing";
|
|
39
|
+
|
|
40
|
+
const platformReady = Boolean(
|
|
41
|
+
process.env.MASTRA_PLATFORM_ACCESS_TOKEN && process.env.MASTRA_PROJECT_ID,
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
const observability = platformReady
|
|
45
|
+
? new Observability({
|
|
46
|
+
configs: {
|
|
47
|
+
default: { serviceName: "my-app", exporters: [new MastraPlatformExporter()] },
|
|
48
|
+
},
|
|
49
|
+
})
|
|
50
|
+
: undefined;
|
|
51
|
+
|
|
52
|
+
export const mastra = new Mastra({
|
|
53
|
+
agents: { pricingAgent },
|
|
54
|
+
...(observability ? { observability } : {}),
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Agents must be **registered on the `Mastra` instance** (the `agents` map) for their `.generate()` / `.stream()` calls to be traced. Call them via `mastra.getAgent("pricingAgent")`.
|
|
59
|
+
|
|
60
|
+
## 3. Structured output through the gateway
|
|
61
|
+
|
|
62
|
+
The gateway does not enforce **native** structured output, so a bare `structuredOutput: { schema }` can come back missing fields (e.g. a nested `meta` object), failing Zod validation. Set `jsonPromptInjection: true` so Mastra injects the schema into the prompt and the model returns the full shape:
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
const agent = mastra.getAgent("pricingAgent");
|
|
66
|
+
const result = await agent.generate(prompt, {
|
|
67
|
+
structuredOutput: { schema: myZodSchema, jsonPromptInjection: true },
|
|
68
|
+
abortSignal: AbortSignal.timeout(70_000), // bound each attempt; the gateway has an upstream timeout
|
|
69
|
+
});
|
|
70
|
+
const data = result.object; // validated against myZodSchema
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
For resilience, register a second agent on a different model (e.g. `neon/claude-haiku-4-5`) and fall back to it if the primary attempt throws — the same provider-fallback pattern works because both are reachable on the MLflow dialect.
|
|
74
|
+
|
|
75
|
+
## 4. Create the Mastra project + token with the CLI
|
|
76
|
+
|
|
77
|
+
Install the Mastra CLI (`npm i -g mastra`) and authenticate. Project/token creation needs a **live login session**:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
mastra auth login # opens a browser; required before the steps below
|
|
81
|
+
mastra auth whoami # shows your user + org id (org_…)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
- **Access token (non-interactive):** `mastra auth tokens create <name>` prints a one-time secret (`sk_…`). This is your `MASTRA_PLATFORM_ACCESS_TOKEN`.
|
|
85
|
+
- **Project:** the interactive `mastra studio projects create` TUI is hard to script. Instead, register the project as part of a Studio deploy, which is non-interactive with `-y` and writes the project id to `.mastra-project.json`:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
mastra studio deploy --org org_xxx --project my-app -y
|
|
89
|
+
# → .mastra-project.json: { "projectId": "…", "projectName": "my-app", "organizationId": "org_…" }
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Use that `projectId` as `MASTRA_PROJECT_ID`.
|
|
93
|
+
|
|
94
|
+
Two gotchas:
|
|
95
|
+
|
|
96
|
+
- **Don't set `MASTRA_API_TOKEN` in the env for project/deploy commands** — it makes the CLI report `No organizations found`. Rely on the interactive login session instead.
|
|
97
|
+
- If you keep multiple env files (e.g. `.env.deploy` and `.env.local`), `studio deploy` errors with `Multiple env files found`; pass `--env-file <file>` to disambiguate.
|
|
98
|
+
|
|
99
|
+
## 5. Pass the creds via `neon.ts` (third-party env)
|
|
100
|
+
|
|
101
|
+
Neon-injected vars (`DATABASE_URL`, `OPENAI_*`, AI Gateway) are automatic. Declare only third-party vars under the function's `env`, resolved from `process.env` at deploy time:
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
// neon.ts
|
|
105
|
+
functions: {
|
|
106
|
+
myapp: {
|
|
107
|
+
name: "my app",
|
|
108
|
+
source: "src/index.ts",
|
|
109
|
+
env: {
|
|
110
|
+
MASTRA_PROJECT_ID: process.env.MASTRA_PROJECT_ID ?? "",
|
|
111
|
+
MASTRA_PLATFORM_ACCESS_TOKEN: process.env.MASTRA_PLATFORM_ACCESS_TOKEN ?? "",
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Load the values from a git-ignored file at deploy time:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
neon deploy --env .env.deploy
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## 6. Verify
|
|
124
|
+
|
|
125
|
+
Send a request that exercises the agent, then open the Mastra Studio project's **Observability / Traces** view — you'll see the agent run (model calls, latency, token usage) under the `serviceName` you configured. Only `SPAN_ENDED` events are exported, buffered and flushed periodically, so a trace appears a few seconds after the agent run completes.
|
|
126
|
+
|
|
127
|
+
## Further reading
|
|
128
|
+
|
|
129
|
+
- https://mastra.ai/docs/observability/tracing/exporters/cloud
|
|
130
|
+
- https://mastra.ai/reference/observability/tracing/exporters/mastra-platform-exporter
|
|
131
|
+
- https://mastra.ai/docs/agents/structured-output
|
|
132
|
+
- Neon AI Gateway dialects: the `neon-ai-gateway` skill
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# MCP servers on Neon Functions
|
|
2
|
+
|
|
3
|
+
A [Model Context Protocol](https://modelcontextprotocol.io) server is a textbook Neon Functions workload: it's a long-running HTTP handler that an AI client (Cursor, Claude, ChatGPT, an agent) calls to discover and invoke tools, and those tools usually read and write a database. Running it as a Neon Function puts the MCP server's compute next to its Postgres data, gives it a public HTTPS URL, and lets it branch with the rest of your backend — each branch gets its own MCP server against its own isolated data.
|
|
4
|
+
|
|
5
|
+
MCP's **streamable HTTP transport** is a plain `POST`/`GET` on a single endpoint (conventionally `/mcp`), so it maps directly onto a function's web-standard `fetch` handler — no `upgrade` method or extra protocol like [WebSockets](../SKILL.md#websocket-servers) needed. A Hono app is the simplest host.
|
|
6
|
+
|
|
7
|
+
## The server
|
|
8
|
+
|
|
9
|
+
Two packages do the work: the official [`@modelcontextprotocol/sdk`](https://github.com/modelcontextprotocol/typescript-sdk) (defines the server and its tools) and [`@hono/mcp`](https://github.com/honojs/middleware/tree/main/packages/mcp) (bridges MCP's streamable HTTP transport to a Hono route). Tools query Postgres through Drizzle on a module-scope `pg` pool, exactly like any other function (see [Connecting to Postgres](../SKILL.md#connecting-to-postgres)).
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
// src/index.ts
|
|
13
|
+
import { Hono } from "hono";
|
|
14
|
+
import { drizzle } from "drizzle-orm/node-postgres";
|
|
15
|
+
import { Pool } from "pg";
|
|
16
|
+
import { eq } from "drizzle-orm";
|
|
17
|
+
import { z } from "zod";
|
|
18
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
19
|
+
import { StreamableHTTPTransport } from "@hono/mcp";
|
|
20
|
+
import { contacts } from "./db/schema";
|
|
21
|
+
|
|
22
|
+
// One pool per isolate, reused across requests.
|
|
23
|
+
const pool = new Pool({ connectionString: process.env.DATABASE_URL, max: 5 });
|
|
24
|
+
const db = drizzle(pool);
|
|
25
|
+
|
|
26
|
+
const mcpServer = new McpServer({ name: "contacts", version: "1.0.0" });
|
|
27
|
+
|
|
28
|
+
// Each tool: a name, a config (description + a Zod input schema), and a handler
|
|
29
|
+
// that returns MCP content. The Zod shape becomes the tool's JSON schema, which
|
|
30
|
+
// the client uses to call the tool correctly.
|
|
31
|
+
mcpServer.registerTool(
|
|
32
|
+
"create_contact",
|
|
33
|
+
{
|
|
34
|
+
title: "Create contact",
|
|
35
|
+
description: "Create a new contact.",
|
|
36
|
+
inputSchema: {
|
|
37
|
+
name: z.string().describe("Full name (required)."),
|
|
38
|
+
email: z.string().optional().describe("Email address."),
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
async ({ name, email }) => {
|
|
42
|
+
const [row] = await db.insert(contacts).values({ name, email }).returning();
|
|
43
|
+
return { content: [{ type: "text", text: JSON.stringify(row) }] };
|
|
44
|
+
},
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
mcpServer.registerTool(
|
|
48
|
+
"delete_contact",
|
|
49
|
+
{
|
|
50
|
+
title: "Delete contact",
|
|
51
|
+
description: "Delete a contact by id.",
|
|
52
|
+
inputSchema: { id: z.number().int().positive() },
|
|
53
|
+
},
|
|
54
|
+
async ({ id }) => {
|
|
55
|
+
const [row] = await db.delete(contacts).where(eq(contacts.id, id)).returning();
|
|
56
|
+
return { content: [{ type: "text", text: JSON.stringify(row ?? { error: "not found" }) }] };
|
|
57
|
+
},
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
// Connect the server to the transport once per isolate, then let the Hono route
|
|
61
|
+
// hand every /mcp request (POST for calls, GET for the stream) to the transport.
|
|
62
|
+
const transport = new StreamableHTTPTransport();
|
|
63
|
+
const app = new Hono();
|
|
64
|
+
|
|
65
|
+
app.all("/mcp", async (c) => {
|
|
66
|
+
if (!mcpServer.isConnected()) await mcpServer.connect(transport);
|
|
67
|
+
return transport.handleRequest(c);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
export default app;
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Key points:
|
|
74
|
+
|
|
75
|
+
- **Module scope.** Build the `McpServer`, register its tools, create the `StreamableHTTPTransport`, and open the `pg` pool once at module load — they're reused across every request the isolate serves (see [runtime limits](../SKILL.md#timeouts-and-runtime-limits)). Connect the transport lazily with the `isConnected()` guard so it happens once.
|
|
76
|
+
- **State in Postgres.** Module memory doesn't survive isolate eviction, and several isolates run in parallel — so the source of truth for anything a tool reads or writes belongs in Postgres, not an in-memory structure.
|
|
77
|
+
- **The URL.** After `neon deploy`, the server lives at `https://<branch_id>-<slug>.compute.…neon.tech/mcp`. Point any streamable-HTTP MCP client at that `/mcp` path.
|
|
78
|
+
|
|
79
|
+
## Authenticating the server
|
|
80
|
+
|
|
81
|
+
> [!WARNING]
|
|
82
|
+
> A Neon Function has a **public HTTPS URL — anyone can reach it.** An unauthenticated MCP server hands every caller your tools (and the database behind them). Authenticate at the top of the handler before touching the transport, exactly as for [any client-facing function](../SKILL.md#functions-as-an-agent-backend-nextjs-and-similar-frameworks).
|
|
83
|
+
|
|
84
|
+
[Better Auth](https://better-auth.com) (self-hostable, runs alongside your app) is a good fit, and it covers both common shapes. **Better Auth is evolving quickly** — the MCP plugin is moving out of `better-auth/plugins` into its own `@better-auth/mcp` package (built on the OAuth Provider plugin), which renames `withMcpAuth` → `requireMcpAuth` and `createMcpAuthClient` → `createMcpResourceClient`. Verify the current package and import paths against the [Better Auth MCP docs](https://better-auth.com/docs/plugins/mcp) before wiring it up.
|
|
85
|
+
|
|
86
|
+
### Option 1 — OAuth via the Better Auth MCP plugin (best for third-party clients)
|
|
87
|
+
|
|
88
|
+
The [MCP plugin](https://better-auth.com/docs/plugins/mcp) makes your **Better Auth app the OAuth authorization server** for MCP, implementing the MCP authorization spec end to end: discovery (`/.well-known/oauth-authorization-server`, `/.well-known/oauth-protected-resource`), dynamic client registration, and the consent/token flow. MCP clients that support OAuth (Cursor, Claude, ChatGPT) then sign the user in and obtain a token with no API key to copy around.
|
|
89
|
+
|
|
90
|
+
Your Neon Function is the **resource server** — a separate service from the Better Auth app, so it doesn't share a process. Use Better Auth's **remote MCP client** to validate the incoming Bearer token against the auth server's published JWKS, and serve the protected-resource metadata so clients can discover where to authenticate:
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
// src/index.ts (sketch) — verify the bearer token against your remote Better Auth server.
|
|
94
|
+
// Import path/name depend on your Better Auth version (createMcpAuthClient in better-auth/plugins/mcp/client,
|
|
95
|
+
// or createMcpResourceClient in @better-auth/mcp/client) — check the docs.
|
|
96
|
+
import { createMcpAuthClient } from "better-auth/plugins/mcp/client";
|
|
97
|
+
|
|
98
|
+
const mcpAuth = createMcpAuthClient({ authURL: process.env.AUTH_URL }); // your Better Auth base URL
|
|
99
|
+
|
|
100
|
+
app.all("/mcp", async (c) => {
|
|
101
|
+
const session = await mcpAuth.verify?.(c.req.raw); // verifies the Bearer token via the remote JWKS
|
|
102
|
+
if (!session) {
|
|
103
|
+
// Tell the client where to authenticate (RFC 9728 / MCP spec).
|
|
104
|
+
return c.json({ error: "unauthorized" }, 401, {
|
|
105
|
+
"WWW-Authenticate": `Bearer resource_metadata="${process.env.AUTH_URL}/.well-known/oauth-protected-resource"`,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
if (!mcpServer.isConnected()) await mcpServer.connect(transport);
|
|
109
|
+
return transport.handleRequest(c); // scope tools to session.userId
|
|
110
|
+
});
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Pass `AUTH_URL` (and any signing/JWKS config) to the function via its `env` in `neon.ts` (see [Environment variables](../SKILL.md#environment-variables)). Because the function only verifies tokens against the remote server, the Better Auth instance can live anywhere — typically your Next.js / app host on Vercel.
|
|
114
|
+
|
|
115
|
+
### Option 2 — API key or session JWT via self-hosted Better Auth (simplest)
|
|
116
|
+
|
|
117
|
+
When the callers are your own agents/services or a personal MCP server, you don't need the full OAuth dance. Run Better Auth self-hosted and either:
|
|
118
|
+
|
|
119
|
+
- **API keys** — enable Better Auth's [API Key plugin](https://better-auth.com/docs/plugins/api-key), issue a key, and have the function verify the `Authorization: Bearer <key>` (or an `x-api-key` header) on every request; or
|
|
120
|
+
- **Session JWT** — mint a short-lived JWT with Better Auth's `jwt` plugin and verify it in the function against the app's JWKS, the same `jose` pattern used for the [agent backend](../SKILL.md#functions-as-an-agent-backend-nextjs-and-similar-frameworks).
|
|
121
|
+
|
|
122
|
+
Either way it's one check at the top of the `/mcp` route — reject anything that doesn't carry a valid key/token before connecting the transport:
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
app.all("/mcp", async (c) => {
|
|
126
|
+
const auth = c.req.header("authorization");
|
|
127
|
+
if (!(await isValidApiKey(auth))) return c.json({ error: "unauthorized" }, 401); // your check
|
|
128
|
+
if (!mcpServer.isConnected()) await mcpServer.connect(transport);
|
|
129
|
+
return transport.handleRequest(c);
|
|
130
|
+
});
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
This keeps the secret server-side, costs nothing to operate, and is trivial to rotate — a solid default until you need third-party clients to self-authorize, at which point reach for Option 1.
|
|
134
|
+
|
|
135
|
+
## Testing
|
|
136
|
+
|
|
137
|
+
Drive the server with any MCP client. [`mcporter`](https://github.com/instructa/mcporter) is a quick CLI for it — `mcporter list <url>/mcp --schema` lists the tools and `mcporter call "<url>/mcp.<tool>" key=value` invokes one (`--allow-http` for a local `neon dev` URL). To wire it into a client interactively, `npx add-mcp <url>/mcp -a <agent>` writes the client config for you.
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Integrations and observability
|
|
2
|
+
|
|
3
|
+
A Neon Function is a **long-lived Node.js 24 process running a web-standard request/response handler** — not an edge worker or a short-lived lambda. That means any integration SDK that works in an ordinary Node process works here unchanged: you initialize it once at module load, before your handler starts serving requests, and it stays instrumented for the life of the isolate.
|
|
4
|
+
|
|
5
|
+
This reference walks through wiring up Sentry for error and performance monitoring; the same shape (init module imported first, gated on an env var, secret passed at deploy time) applies to other Node SDKs (OpenTelemetry, logging, analytics).
|
|
6
|
+
|
|
7
|
+
## Sentry (error & performance monitoring)
|
|
8
|
+
|
|
9
|
+
Because the runtime is a normal Node process, use the Node SDK `@sentry/node` — not an edge/serverless wrapper. It bundles cleanly through `neon deploy`'s esbuild with no extra build config.
|
|
10
|
+
|
|
11
|
+
There are three layers worth instrumenting, and errors from all of them flow into a single Sentry project:
|
|
12
|
+
|
|
13
|
+
1. The HTTP framework (unhandled route errors).
|
|
14
|
+
2. The Node function runtime (uncaught exceptions / unhandled rejections, captured by the SDK).
|
|
15
|
+
3. The application's own caught failures — e.g. an agent that retries and falls back instead of throwing.
|
|
16
|
+
|
|
17
|
+
### 1. Initialize before anything else
|
|
18
|
+
|
|
19
|
+
Put `Sentry.init` in its own module and import it as the very first import of your entry file, so the process is instrumented before any other code (your handler, the DB pool, the agent) loads.
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
// src/instrument.ts
|
|
23
|
+
import * as Sentry from "@sentry/node";
|
|
24
|
+
|
|
25
|
+
Sentry.init({
|
|
26
|
+
dsn: process.env.SENTRY_DSN,
|
|
27
|
+
enabled: Boolean(process.env.SENTRY_DSN),
|
|
28
|
+
tracesSampleRate: 1.0,
|
|
29
|
+
// NEON_BRANCH (the branch name) is injected on EVERY branch, including the default — so it
|
|
30
|
+
// can't be used as a truthy "is this a branch?" flag. Treat the project's default branch as
|
|
31
|
+
// "production" (its name passed in via neon.ts env) and tag every other branch by its name.
|
|
32
|
+
environment:
|
|
33
|
+
process.env.NEON_BRANCH && process.env.NEON_BRANCH !== process.env.PRODUCTION_BRANCH
|
|
34
|
+
? process.env.NEON_BRANCH
|
|
35
|
+
: "production",
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
export { Sentry };
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
// src/index.ts
|
|
43
|
+
import "./instrument"; // MUST be the first import, before the framework/agent
|
|
44
|
+
import { Sentry } from "./instrument";
|
|
45
|
+
import { Hono } from "hono";
|
|
46
|
+
// ... rest of the function
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
- **Gate `enabled` on the DSN.** Local dev (`neon dev`) and any branch where you haven't configured the secret then become a no-op — no init, no noise — without changing code.
|
|
50
|
+
- **Tag the environment off the injected branch name.** Each Neon branch runs its own copy of the function and the runtime injects `NEON_BRANCH` (the branch **name**, e.g. `main` or `preview/add-auth`) into every one of them — including the default branch. The same value is written into local dev by `neon env pull` / `neon-env run` / `neon dev`, so local and deployed runs agree. Because it's always present, don't use it as a boolean flag (that tags every branch the same). Instead compare it against your default branch name (pass it in as e.g. `PRODUCTION_BRANCH` via `neon.ts` `env`) so the default branch reads as `production` and feature/preview branches are tagged by name — keeping them separable in the Sentry dashboard.
|
|
51
|
+
|
|
52
|
+
### 2. Provide the DSN as a deploy-time secret
|
|
53
|
+
|
|
54
|
+
The DSN is your own secret, so set it per-deployment (see "Environment variables" in `SKILL.md`). Either pass it on deploy:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
neon functions deploy <slug> --src src/index.ts \
|
|
58
|
+
--env "SENTRY_DSN=https://…@…ingest.us.sentry.io/…"
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
or declare it under the function's `env` in `neon.ts` (read from `process.env` to avoid hardcoding):
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
functions: {
|
|
65
|
+
<slug>: {
|
|
66
|
+
name: "…",
|
|
67
|
+
source: "src/index.ts",
|
|
68
|
+
env: { SENTRY_DSN: process.env.SENTRY_DSN! },
|
|
69
|
+
},
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 3. Catch unhandled route errors
|
|
74
|
+
|
|
75
|
+
Wire a top-level error handler in your HTTP framework so any error thrown in a route is reported. With Hono, `onError` covers this. Watch out for one gotcha: framework middleware such as `cors()` usually does **not** decorate error responses, so re-add any headers you need on the 500 yourself.
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
app.onError((err, c) => {
|
|
79
|
+
Sentry.captureException(err);
|
|
80
|
+
c.header("access-control-allow-origin", "*"); // cors() doesn't run on error responses
|
|
81
|
+
return c.json({ error: "internal_error" }, 500);
|
|
82
|
+
});
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 4. Report agent (and other swallowed) failures explicitly
|
|
86
|
+
|
|
87
|
+
Long-running agent workloads — the case Neon Functions are built for — typically **catch their own errors and fall back** (retry a different model, return a degraded result) rather than throwing. Those failures never reach the route error handler, so report them explicitly with the same `Sentry` instance, and tag them so you can filter and group in the dashboard.
|
|
88
|
+
|
|
89
|
+
A representative agent that parses a page across several models reports three distinct cases:
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
// Recoverable: one model attempt failed, the agent will try the next model.
|
|
93
|
+
Sentry.captureException(err, {
|
|
94
|
+
level: "warning",
|
|
95
|
+
tags: { component: "agent", phase: "parse-attempt", model },
|
|
96
|
+
extra: { url, source },
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// Terminal: every model failed.
|
|
100
|
+
Sentry.captureException(err, {
|
|
101
|
+
level: "error",
|
|
102
|
+
tags: { component: "agent", phase: "parse-all-failed" },
|
|
103
|
+
extra: { url, source },
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Non-exception failure: the agent couldn't fetch the input page at all.
|
|
107
|
+
Sentry.captureMessage("agent could not fetch page", {
|
|
108
|
+
level: "warning",
|
|
109
|
+
tags: { component: "agent", phase: "fetch" },
|
|
110
|
+
extra: { url, source },
|
|
111
|
+
});
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
- Use `level` to separate recoverable (`warning`) from terminal (`error`) failures.
|
|
115
|
+
- Use `tags` for the dimensions you'll filter/group by — `component`, `phase`, `model`.
|
|
116
|
+
- Use `extra` for per-event context — the URL being processed, the content source.
|
|
117
|
+
|
|
118
|
+
### Verifying the wiring
|
|
119
|
+
|
|
120
|
+
- Temporarily add a route that throws (`app.get("/debug-sentry", () => { throw new Error("sentry test"); })`), hit it, confirm the 500 surfaces in Sentry, then remove the route.
|
|
121
|
+
- Trigger a real downstream failure (e.g. point a fetch at `https://httpstat.us/500`) to confirm the explicit agent-level captures fire.
|
|
122
|
+
|
|
123
|
+
## Other Node integrations
|
|
124
|
+
|
|
125
|
+
The same pattern generalizes to any Node integration (OpenTelemetry, structured logging, product analytics):
|
|
126
|
+
|
|
127
|
+
1. Initialize once at module scope in a dedicated init module, imported before your handler.
|
|
128
|
+
2. Gate it on an env var so local dev and unconfigured branches are a no-op.
|
|
129
|
+
3. Pass secrets via `--env KEY=VALUE` on deploy or the function's `env` in `neon.ts`.
|
|
130
|
+
|
|
131
|
+
Standard Node SDKs bundle through `neon deploy`'s esbuild without changes.
|