opencode-skills-collection 3.1.12 → 3.1.13
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/bundled-skills/.antigravity-install-manifest.json +192 -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/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/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/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/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 +36 -10
- package/bundled-skills/hugging-face-model-trainer/scripts/convert_to_gguf.py +30 -52
- 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/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/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/scripts/weaviate_conn.py +16 -6
- 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/package.json +1 -1
- package/skills_index.json +4320 -132
|
@@ -0,0 +1,710 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: frontend-seo
|
|
3
|
+
description: A portable, framework-agnostic SEO system for any React or React Native-for-web frontend. Centralizes site metadata in one constants module, derives canonical URLs from a single base, builds per-route metadata (title, description, canonical, Open Graph, Twitter/X cards), generates...
|
|
4
|
+
risk: unknown
|
|
5
|
+
source: https://github.com/stareezy-1/frontend-architecture-skill/tree/main/skills/frontend-seo
|
|
6
|
+
source_repo: stareezy-1/frontend-architecture-skill
|
|
7
|
+
source_type: community
|
|
8
|
+
date_added: 2026-07-01
|
|
9
|
+
license: MIT
|
|
10
|
+
license_source: https://github.com/stareezy-1/frontend-architecture-skill/blob/main/LICENSE
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Frontend SEO (portable, builder-based)
|
|
14
|
+
## When to Use
|
|
15
|
+
|
|
16
|
+
Use this skill when you need a portable, framework-agnostic SEO system for any React or React Native-for-web frontend. Centralizes site metadata in one constants module, derives canonical URLs from a single base, builds per-route metadata (title, description, canonical, Open Graph, Twitter/X cards), generates...
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
> Portable skill — readable by Claude Code, OpenCode, Codex, Cursor, Windsurf, and others.
|
|
20
|
+
> This skill describes an **SEO system** — a set of pure builder functions plus a thin
|
|
21
|
+
> framework adapter — not a component library or a visual style.
|
|
22
|
+
> It pairs with the **frontend-architecture** skill: the SEO system lives in a single
|
|
23
|
+
> service module (`services/seo/`) and is consumed through one barrel.
|
|
24
|
+
|
|
25
|
+
The goal: every route ships **correct, consistent, machine-readable metadata** without
|
|
26
|
+
anyone copy-pasting `<meta>` tags. Site identity lives in **one** constants module, URLs are
|
|
27
|
+
**always absolute and canonical**, and search engines get a **sitemap, robots rules, an RSS
|
|
28
|
+
feed, and typed JSON-LD** derived from the same content the app already renders.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 0. The five core ideas
|
|
33
|
+
|
|
34
|
+
1. **One source of truth for identity.** Site URL, name, description, keywords, author, social handles, OG image, and verification tokens live in a single `constants/seo` module. Nothing about the site's identity is hardcoded anywhere else.
|
|
35
|
+
2. **URLs are always absolute and canonical.** A single `canonicalUrl(path)` function turns any path into an absolute, trailing-slash-normalized URL. Every sitemap entry, RSS link, OG URL, and JSON-LD `@id` flows through it.
|
|
36
|
+
3. **Builders are pure; the adapter is thin.** Metadata, sitemap, robots, RSS, and JSON-LD are produced by pure functions that take data and return plain objects. Only one small function touches the framework's metadata type. Pure functions are trivially unit-testable.
|
|
37
|
+
4. **Structured data is typed and reused.** JSON-LD objects share a `JsonLd` type and a small set of `schema.org` builders (`Person`, `WebSite`, `BlogPosting`, `CreativeWork`, `BreadcrumbList`, `FAQPage`). Entities cross-reference each other by stable `@id`.
|
|
38
|
+
5. **Discovery surfaces are generated from content.** `sitemap.xml`, `robots.txt`, and the RSS feed are built from the same content collections the app renders — never maintained by hand, never drifting.
|
|
39
|
+
|
|
40
|
+
Everything below is the mechanical application of these five ideas.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 1. Directory layout
|
|
45
|
+
|
|
46
|
+
The SEO system is one service module plus its constants and types. It slots directly into the
|
|
47
|
+
`frontend-architecture` shape (`shared/` or `services/`).
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
src/
|
|
51
|
+
├── constants/
|
|
52
|
+
│ └── seo.ts ← SINGLE source of truth for site identity
|
|
53
|
+
├── types/
|
|
54
|
+
│ └── seo.ts ← SchemaType, RouteDescriptor, SitemapEntry,
|
|
55
|
+
│ RobotsConfig, RssItem, Redirect, JsonLd
|
|
56
|
+
├── services/seo/
|
|
57
|
+
│ ├── index.ts ← barrel: canonicalUrl, buildMetadata,
|
|
58
|
+
│ │ sitemapEntries, robots, rssItems,
|
|
59
|
+
│ │ structuredData, redirects
|
|
60
|
+
│ └── structured-data.ts ← per-type JSON-LD builders (Person, WebSite, …)
|
|
61
|
+
└── app/ (or routes/) ← THIN adapter: route files call the builders
|
|
62
|
+
├── layout.tsx ← global default metadata (from constants/seo)
|
|
63
|
+
├── sitemap.ts ← mounts sitemapEntries()
|
|
64
|
+
├── robots.ts ← mounts robots()
|
|
65
|
+
└── feed.xml/route.ts ← mounts rssItems()
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Rule of thumb: **builders never import the framework** (except the one `buildMetadata` adapter);
|
|
69
|
+
**route files never build SEO data inline** — they call a builder and mount the result.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 2. One source of truth for identity (`constants/seo`)
|
|
74
|
+
|
|
75
|
+
Everything about the site's identity is a named constant. No bare strings scattered across
|
|
76
|
+
route files, no second copy of the description, no hardcoded base URL.
|
|
77
|
+
|
|
78
|
+
```ts
|
|
79
|
+
// constants/seo.ts
|
|
80
|
+
export const SITE_URL = "https://example.com"; // no trailing slash
|
|
81
|
+
export const SITE_NAME = "Jane Doe";
|
|
82
|
+
export const SITE_HANDLE = "@janedoe";
|
|
83
|
+
export const SITE_LOCALE = "en_US";
|
|
84
|
+
|
|
85
|
+
export const SITE_TITLE_DEFAULT = "Jane Doe — Senior Engineer";
|
|
86
|
+
export const SITE_TITLE_TEMPLATE = "%s | Jane Doe"; // child pages fill %s
|
|
87
|
+
|
|
88
|
+
export const SITE_DESCRIPTION =
|
|
89
|
+
"Senior engineer building cross-platform products with React and TypeScript.";
|
|
90
|
+
|
|
91
|
+
export const SITE_KEYWORDS = ["Jane Doe", "React", "TypeScript", "Engineer"];
|
|
92
|
+
|
|
93
|
+
export const AUTHOR_NAME = "Jane Doe";
|
|
94
|
+
export const AUTHOR_EMAIL = "jane@example.com";
|
|
95
|
+
export const AUTHOR_GITHUB = "https://github.com/janedoe";
|
|
96
|
+
export const AUTHOR_LINKEDIN = "https://www.linkedin.com/in/janedoe/";
|
|
97
|
+
|
|
98
|
+
export const OG_IMAGE_PATH = "/og-image.png"; // relative; canonicalized at use
|
|
99
|
+
export const OG_IMAGE_WIDTH = 1200;
|
|
100
|
+
export const OG_IMAGE_HEIGHT = 630;
|
|
101
|
+
|
|
102
|
+
export const GOOGLE_SITE_VERIFICATION = "your-search-console-token";
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Why: changing the description or the OG image touches **one line**. Structured data, OG tags, and
|
|
106
|
+
Twitter cards all read the same values, so they can never disagree.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 3. Typed data models (`types/seo`)
|
|
111
|
+
|
|
112
|
+
Minimal but typed. These are the contracts every builder honors.
|
|
113
|
+
|
|
114
|
+
```ts
|
|
115
|
+
// types/seo.ts
|
|
116
|
+
export type SchemaType =
|
|
117
|
+
| "Person"
|
|
118
|
+
| "WebSite"
|
|
119
|
+
| "BlogPosting"
|
|
120
|
+
| "CreativeWork"
|
|
121
|
+
| "BreadcrumbList"
|
|
122
|
+
| "FAQPage";
|
|
123
|
+
|
|
124
|
+
/** Describes a route for metadata generation. */
|
|
125
|
+
export interface RouteDescriptor {
|
|
126
|
+
path: string; // e.g. "/blog/my-post"
|
|
127
|
+
title: string;
|
|
128
|
+
description: string;
|
|
129
|
+
ogImage?: string; // falls back to OG_IMAGE_PATH
|
|
130
|
+
indexable?: boolean; // whether it appears in the sitemap
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export interface SitemapEntry {
|
|
134
|
+
url: string; // absolute
|
|
135
|
+
lastModified?: string;
|
|
136
|
+
changeFrequency?:
|
|
137
|
+
| "always"
|
|
138
|
+
| "hourly"
|
|
139
|
+
| "daily"
|
|
140
|
+
| "weekly"
|
|
141
|
+
| "monthly"
|
|
142
|
+
| "yearly"
|
|
143
|
+
| "never";
|
|
144
|
+
priority?: number;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export interface RobotsConfig {
|
|
148
|
+
rules: Array<{ userAgent: string; allow?: string[]; disallow?: string[] }>;
|
|
149
|
+
sitemap: string; // absolute
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export interface RssItem {
|
|
153
|
+
title: string;
|
|
154
|
+
link: string; // absolute
|
|
155
|
+
description: string;
|
|
156
|
+
pubDate: string; // ISO-8601
|
|
157
|
+
guid: string;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export interface Redirect {
|
|
161
|
+
source: string;
|
|
162
|
+
destination: string;
|
|
163
|
+
permanent: boolean; // 301 when true
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/** A JSON-LD object: always a schema.org context + type, plus type-specific fields. */
|
|
167
|
+
export interface JsonLd {
|
|
168
|
+
"@context": "https://schema.org";
|
|
169
|
+
"@type": SchemaType;
|
|
170
|
+
[key: string]: unknown;
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Note the `I`-prefix convention from `frontend-architecture` applies to **stateful UI interfaces**;
|
|
175
|
+
these SEO data models are plain DTOs and follow the source project's existing convention
|
|
176
|
+
(here, unprefixed). Keep whichever convention the host project already uses — consistency wins.
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## 4. Canonical URLs (the spine of the system)
|
|
181
|
+
|
|
182
|
+
One function, used everywhere. It guarantees absolute, normalized, double-slash-free URLs so
|
|
183
|
+
search engines never see two URLs for the same page.
|
|
184
|
+
|
|
185
|
+
```ts
|
|
186
|
+
// services/seo/index.ts
|
|
187
|
+
import { SITE_URL } from "@/constants/seo";
|
|
188
|
+
|
|
189
|
+
export function canonicalUrl(path: string): string {
|
|
190
|
+
const normalized = path.startsWith("/") ? path : `/${path}`;
|
|
191
|
+
if (normalized === "/") return SITE_URL; // root → base, no trailing slash
|
|
192
|
+
const withoutTrailing = normalized.endsWith("/")
|
|
193
|
+
? normalized.slice(0, -1)
|
|
194
|
+
: normalized;
|
|
195
|
+
return `${SITE_URL}${withoutTrailing}`;
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**Hard rules:**
|
|
200
|
+
|
|
201
|
+
- Never concatenate `SITE_URL + path` by hand — always `canonicalUrl(path)`.
|
|
202
|
+
- Pick one trailing-slash policy (this skill: **no trailing slash**) and apply it everywhere.
|
|
203
|
+
- Every OG `url`, sitemap `url`, RSS `link`, and JSON-LD `@id`/`url` goes through `canonicalUrl`.
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## 5. Per-route metadata
|
|
208
|
+
|
|
209
|
+
### 5.1 The pure builder
|
|
210
|
+
|
|
211
|
+
`buildMetadata` is the **only** function allowed to know about the framework's metadata type.
|
|
212
|
+
Everything else is framework-free.
|
|
213
|
+
|
|
214
|
+
```ts
|
|
215
|
+
// services/seo/index.ts (Next.js example — swap the return type for other frameworks)
|
|
216
|
+
import type { Metadata } from "next";
|
|
217
|
+
import { OG_IMAGE_PATH } from "@/constants/seo";
|
|
218
|
+
import type { RouteDescriptor } from "@/types/seo";
|
|
219
|
+
|
|
220
|
+
export function buildMetadata(route: RouteDescriptor): Metadata {
|
|
221
|
+
const canonical = canonicalUrl(route.path);
|
|
222
|
+
const ogImageUrl = canonicalUrl(route.ogImage ?? OG_IMAGE_PATH);
|
|
223
|
+
|
|
224
|
+
return {
|
|
225
|
+
title: route.title,
|
|
226
|
+
description: route.description,
|
|
227
|
+
alternates: { canonical },
|
|
228
|
+
openGraph: { images: [ogImageUrl] },
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### 5.2 Global defaults live in the root layout
|
|
234
|
+
|
|
235
|
+
Set the title template, default OG/Twitter cards, robots policy, icons, manifest, and
|
|
236
|
+
verification **once** at the root. Child routes only override what differs.
|
|
237
|
+
|
|
238
|
+
```tsx
|
|
239
|
+
// app/layout.tsx — global metadata, all values from constants/seo
|
|
240
|
+
import type { Metadata } from "next";
|
|
241
|
+
import {
|
|
242
|
+
SITE_URL,
|
|
243
|
+
SITE_NAME,
|
|
244
|
+
SITE_HANDLE,
|
|
245
|
+
SITE_LOCALE,
|
|
246
|
+
SITE_TITLE_DEFAULT,
|
|
247
|
+
SITE_TITLE_TEMPLATE,
|
|
248
|
+
SITE_DESCRIPTION,
|
|
249
|
+
SITE_KEYWORDS,
|
|
250
|
+
AUTHOR_NAME,
|
|
251
|
+
OG_IMAGE_PATH,
|
|
252
|
+
OG_IMAGE_WIDTH,
|
|
253
|
+
OG_IMAGE_HEIGHT,
|
|
254
|
+
GOOGLE_SITE_VERIFICATION,
|
|
255
|
+
} from "@/constants/seo";
|
|
256
|
+
|
|
257
|
+
export const metadata: Metadata = {
|
|
258
|
+
metadataBase: new URL(SITE_URL),
|
|
259
|
+
title: { default: SITE_TITLE_DEFAULT, template: SITE_TITLE_TEMPLATE },
|
|
260
|
+
description: SITE_DESCRIPTION,
|
|
261
|
+
keywords: SITE_KEYWORDS,
|
|
262
|
+
authors: [{ name: AUTHOR_NAME, url: SITE_URL }],
|
|
263
|
+
alternates: {
|
|
264
|
+
canonical: SITE_URL,
|
|
265
|
+
types: { "application/rss+xml": `${SITE_URL}/feed.xml` },
|
|
266
|
+
},
|
|
267
|
+
openGraph: {
|
|
268
|
+
type: "website",
|
|
269
|
+
locale: SITE_LOCALE,
|
|
270
|
+
url: SITE_URL,
|
|
271
|
+
siteName: SITE_NAME,
|
|
272
|
+
title: SITE_TITLE_DEFAULT,
|
|
273
|
+
description: SITE_DESCRIPTION,
|
|
274
|
+
images: [
|
|
275
|
+
{ url: OG_IMAGE_PATH, width: OG_IMAGE_WIDTH, height: OG_IMAGE_HEIGHT },
|
|
276
|
+
],
|
|
277
|
+
},
|
|
278
|
+
twitter: {
|
|
279
|
+
card: "summary_large_image",
|
|
280
|
+
site: SITE_HANDLE,
|
|
281
|
+
creator: SITE_HANDLE,
|
|
282
|
+
title: SITE_TITLE_DEFAULT,
|
|
283
|
+
description: SITE_DESCRIPTION,
|
|
284
|
+
images: [OG_IMAGE_PATH],
|
|
285
|
+
},
|
|
286
|
+
robots: {
|
|
287
|
+
index: true,
|
|
288
|
+
follow: true,
|
|
289
|
+
googleBot: {
|
|
290
|
+
index: true,
|
|
291
|
+
follow: true,
|
|
292
|
+
"max-image-preview": "large",
|
|
293
|
+
"max-snippet": -1,
|
|
294
|
+
},
|
|
295
|
+
},
|
|
296
|
+
verification: { google: GOOGLE_SITE_VERIFICATION },
|
|
297
|
+
manifest: "/manifest.webmanifest",
|
|
298
|
+
};
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### 5.3 Per-route override (dynamic pages)
|
|
302
|
+
|
|
303
|
+
A dynamic route reads its entity and returns route-specific metadata. The title template fills
|
|
304
|
+
`%s` automatically, so just pass the page title.
|
|
305
|
+
|
|
306
|
+
```tsx
|
|
307
|
+
// app/blog/[slug]/page.tsx
|
|
308
|
+
import { buildMetadata } from "@/services/seo";
|
|
309
|
+
|
|
310
|
+
export async function generateMetadata({ params }) {
|
|
311
|
+
const post = await loadPost(params.slug);
|
|
312
|
+
return buildMetadata({
|
|
313
|
+
path: `/blog/${post.slug}`,
|
|
314
|
+
title: post.title,
|
|
315
|
+
description: post.description,
|
|
316
|
+
ogImage: post.heroImage,
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
**Hard rules:**
|
|
322
|
+
|
|
323
|
+
- Set defaults once in the layout; override per route only where it differs.
|
|
324
|
+
- Use a title **template** so child pages don't repeat the site name.
|
|
325
|
+
- Every page resolves a single `canonical` — never emit duplicate or relative canonicals.
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## 6. Discovery surfaces (generated from content)
|
|
330
|
+
|
|
331
|
+
### 6.1 Sitemap
|
|
332
|
+
|
|
333
|
+
Build entries from the **same content collections** the app renders, deduped, all absolute.
|
|
334
|
+
|
|
335
|
+
```ts
|
|
336
|
+
// services/seo/index.ts
|
|
337
|
+
import { ROUTES } from "@/constants/routes";
|
|
338
|
+
import type { SitemapEntry } from "@/types/seo";
|
|
339
|
+
|
|
340
|
+
const PRIMARY_ROUTES: Array<{
|
|
341
|
+
path: string;
|
|
342
|
+
changeFrequency: SitemapEntry["changeFrequency"];
|
|
343
|
+
priority: number;
|
|
344
|
+
}> = [
|
|
345
|
+
{ path: ROUTES.HOME, changeFrequency: "weekly", priority: 1.0 },
|
|
346
|
+
{ path: ROUTES.BLOG, changeFrequency: "daily", priority: 0.9 },
|
|
347
|
+
// …other primary routes
|
|
348
|
+
];
|
|
349
|
+
|
|
350
|
+
export function sitemapEntries(options: {
|
|
351
|
+
blogSlugs: string[];
|
|
352
|
+
projectSlugs: string[];
|
|
353
|
+
}): SitemapEntry[] {
|
|
354
|
+
const seen = new Set<string>();
|
|
355
|
+
const entries: SitemapEntry[] = [];
|
|
356
|
+
const add = (e: SitemapEntry) => {
|
|
357
|
+
if (!seen.has(e.url)) {
|
|
358
|
+
seen.add(e.url);
|
|
359
|
+
entries.push(e);
|
|
360
|
+
}
|
|
361
|
+
};
|
|
362
|
+
const today = new Date().toISOString().split("T")[0];
|
|
363
|
+
|
|
364
|
+
for (const r of PRIMARY_ROUTES)
|
|
365
|
+
add({
|
|
366
|
+
url: canonicalUrl(r.path),
|
|
367
|
+
lastModified: today,
|
|
368
|
+
changeFrequency: r.changeFrequency,
|
|
369
|
+
priority: r.priority,
|
|
370
|
+
});
|
|
371
|
+
for (const slug of options.blogSlugs)
|
|
372
|
+
add({
|
|
373
|
+
url: canonicalUrl(`/blog/${slug}`),
|
|
374
|
+
lastModified: today,
|
|
375
|
+
changeFrequency: "monthly",
|
|
376
|
+
priority: 0.7,
|
|
377
|
+
});
|
|
378
|
+
for (const slug of options.projectSlugs)
|
|
379
|
+
add({
|
|
380
|
+
url: canonicalUrl(`/projects/${slug}`),
|
|
381
|
+
lastModified: today,
|
|
382
|
+
changeFrequency: "monthly",
|
|
383
|
+
priority: 0.8,
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
return entries;
|
|
387
|
+
}
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
```ts
|
|
391
|
+
// app/sitemap.ts — thin adapter
|
|
392
|
+
import type { MetadataRoute } from "next";
|
|
393
|
+
import { sitemapEntries } from "@/services/seo";
|
|
394
|
+
|
|
395
|
+
export default function sitemap(): MetadataRoute.Sitemap {
|
|
396
|
+
const entries = sitemapEntries({
|
|
397
|
+
blogSlugs: loadPublishedBlogSlugs(),
|
|
398
|
+
projectSlugs: loadProjectSlugs(),
|
|
399
|
+
});
|
|
400
|
+
return entries.map((e) => ({
|
|
401
|
+
url: e.url,
|
|
402
|
+
lastModified: e.lastModified ? new Date(e.lastModified) : new Date(),
|
|
403
|
+
changeFrequency:
|
|
404
|
+
e.changeFrequency as MetadataRoute.Sitemap[0]["changeFrequency"],
|
|
405
|
+
priority: e.priority,
|
|
406
|
+
}));
|
|
407
|
+
}
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
### 6.2 Robots
|
|
411
|
+
|
|
412
|
+
```ts
|
|
413
|
+
// app/robots.ts
|
|
414
|
+
import type { MetadataRoute } from "next";
|
|
415
|
+
import { SITE_URL } from "@/constants/seo";
|
|
416
|
+
|
|
417
|
+
export default function robots(): MetadataRoute.Robots {
|
|
418
|
+
return {
|
|
419
|
+
rules: [
|
|
420
|
+
{ userAgent: "*", allow: "/", disallow: ["/api/", "/_next/", "/admin/"] },
|
|
421
|
+
{ userAgent: "Googlebot", allow: "/" },
|
|
422
|
+
],
|
|
423
|
+
sitemap: `${SITE_URL}/sitemap.xml`,
|
|
424
|
+
host: SITE_URL,
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
Always **disallow private surfaces** (`/api/`, `/admin/`, build internals) and **point at the sitemap**.
|
|
430
|
+
|
|
431
|
+
### 6.3 RSS feed
|
|
432
|
+
|
|
433
|
+
```ts
|
|
434
|
+
// services/seo/index.ts
|
|
435
|
+
import type { RssItem } from "@/types/seo";
|
|
436
|
+
|
|
437
|
+
export function rssItems(posts: BlogPost[]): RssItem[] {
|
|
438
|
+
return posts.map((post) => {
|
|
439
|
+
const link = canonicalUrl(`/blog/${post.slug}`);
|
|
440
|
+
return {
|
|
441
|
+
title: post.title,
|
|
442
|
+
link,
|
|
443
|
+
description: post.description,
|
|
444
|
+
pubDate: post.publishDate,
|
|
445
|
+
guid: link,
|
|
446
|
+
};
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
```ts
|
|
452
|
+
// app/feed.xml/route.ts — sort newest-first, CDATA-wrap free text
|
|
453
|
+
import { rssItems } from "@/services/seo";
|
|
454
|
+
import { SITE_NAME, SITE_URL, SITE_DESCRIPTION } from "@/constants/seo";
|
|
455
|
+
|
|
456
|
+
export function GET(): Response {
|
|
457
|
+
const items = rssItems(loadPublishedPostsNewestFirst());
|
|
458
|
+
const xml = `<?xml version="1.0" encoding="UTF-8"?>
|
|
459
|
+
<rss version="2.0"><channel>
|
|
460
|
+
<title>${SITE_NAME}</title><link>${SITE_URL}</link>
|
|
461
|
+
<description>${SITE_DESCRIPTION}</description>
|
|
462
|
+
${items
|
|
463
|
+
.map(
|
|
464
|
+
(i) => `<item>
|
|
465
|
+
<title><![CDATA[${i.title}]]></title><link>${i.link}</link>
|
|
466
|
+
<description><![CDATA[${i.description}]]></description>
|
|
467
|
+
<pubDate>${i.pubDate}</pubDate><guid>${i.guid}</guid>
|
|
468
|
+
</item>`,
|
|
469
|
+
)
|
|
470
|
+
.join("")}
|
|
471
|
+
</channel></rss>`;
|
|
472
|
+
return new Response(xml, {
|
|
473
|
+
headers: { "Content-Type": "application/rss+xml; charset=utf-8" },
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
CDATA-wrap titles/descriptions so apostrophes and markup never break the feed.
|
|
479
|
+
|
|
480
|
+
---
|
|
481
|
+
|
|
482
|
+
## 7. Structured data (typed JSON-LD)
|
|
483
|
+
|
|
484
|
+
### 7.1 The generic builder
|
|
485
|
+
|
|
486
|
+
```ts
|
|
487
|
+
// services/seo/index.ts
|
|
488
|
+
import type { JsonLd, SchemaType } from "@/types/seo";
|
|
489
|
+
|
|
490
|
+
export function structuredData(
|
|
491
|
+
type: SchemaType,
|
|
492
|
+
data: Record<string, unknown>,
|
|
493
|
+
): JsonLd {
|
|
494
|
+
return { "@context": "https://schema.org", "@type": type, ...data };
|
|
495
|
+
}
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
### 7.2 Per-type builders, cross-referenced by stable `@id`
|
|
499
|
+
|
|
500
|
+
```ts
|
|
501
|
+
// services/seo/structured-data.ts
|
|
502
|
+
import { structuredData } from "./index";
|
|
503
|
+
import { SITE_URL, AUTHOR_NAME, SITE_DESCRIPTION } from "@/constants/seo";
|
|
504
|
+
import type { JsonLd } from "@/types/seo";
|
|
505
|
+
|
|
506
|
+
export function personJsonLd(): JsonLd {
|
|
507
|
+
return structuredData("Person", {
|
|
508
|
+
"@id": `${SITE_URL}/#person`, // stable identity others reference
|
|
509
|
+
name: AUTHOR_NAME,
|
|
510
|
+
url: SITE_URL,
|
|
511
|
+
description: SITE_DESCRIPTION,
|
|
512
|
+
sameAs: [
|
|
513
|
+
/* social profile URLs */
|
|
514
|
+
],
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
export function websiteJsonLd(): JsonLd {
|
|
519
|
+
return structuredData("WebSite", {
|
|
520
|
+
"@id": `${SITE_URL}/#website`,
|
|
521
|
+
url: SITE_URL,
|
|
522
|
+
name: AUTHOR_NAME,
|
|
523
|
+
author: { "@id": `${SITE_URL}/#person` }, // reference, not a copy
|
|
524
|
+
potentialAction: {
|
|
525
|
+
"@type": "SearchAction",
|
|
526
|
+
target: {
|
|
527
|
+
"@type": "EntryPoint",
|
|
528
|
+
urlTemplate: `${SITE_URL}/blog?q={search_term_string}`,
|
|
529
|
+
},
|
|
530
|
+
"query-input": "required name=search_term_string",
|
|
531
|
+
},
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
export function blogPostingJsonLd(post: BlogPost, url: string): JsonLd {
|
|
536
|
+
return structuredData("BlogPosting", {
|
|
537
|
+
"@id": url,
|
|
538
|
+
headline: post.title,
|
|
539
|
+
description: post.description,
|
|
540
|
+
datePublished: post.publishDate,
|
|
541
|
+
dateModified: post.publishDate,
|
|
542
|
+
author: {
|
|
543
|
+
"@type": "Person",
|
|
544
|
+
"@id": `${SITE_URL}/#person`,
|
|
545
|
+
name: post.author,
|
|
546
|
+
},
|
|
547
|
+
publisher: {
|
|
548
|
+
"@type": "Person",
|
|
549
|
+
"@id": `${SITE_URL}/#person`,
|
|
550
|
+
name: AUTHOR_NAME,
|
|
551
|
+
},
|
|
552
|
+
url,
|
|
553
|
+
mainEntityOfPage: { "@type": "WebPage", "@id": url },
|
|
554
|
+
image: {
|
|
555
|
+
"@type": "ImageObject",
|
|
556
|
+
url: post.heroImage,
|
|
557
|
+
width: 1200,
|
|
558
|
+
height: 630,
|
|
559
|
+
},
|
|
560
|
+
keywords: post.tags.join(", "),
|
|
561
|
+
});
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
export function breadcrumbListJsonLd(
|
|
565
|
+
items: Array<{ name: string; url: string }>,
|
|
566
|
+
): JsonLd {
|
|
567
|
+
return structuredData("BreadcrumbList", {
|
|
568
|
+
itemListElement: items.map((item, i) => ({
|
|
569
|
+
"@type": "ListItem",
|
|
570
|
+
position: i + 1,
|
|
571
|
+
name: item.name,
|
|
572
|
+
item: item.url,
|
|
573
|
+
})),
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
export function faqPageJsonLd(
|
|
578
|
+
faqs: Array<{ question: string; answer: string }>,
|
|
579
|
+
): JsonLd {
|
|
580
|
+
return structuredData("FAQPage", {
|
|
581
|
+
mainEntity: faqs.map((f) => ({
|
|
582
|
+
"@type": "Question",
|
|
583
|
+
name: f.question,
|
|
584
|
+
acceptedAnswer: { "@type": "Answer", text: f.answer },
|
|
585
|
+
})),
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
`CreativeWork` follows the same shape for projects/portfolio items (name, description, author by
|
|
591
|
+
`@id`, `keywords`, optional `codeRepository`/`sameAs`/`image`).
|
|
592
|
+
|
|
593
|
+
### 7.3 Injecting JSON-LD into a page
|
|
594
|
+
|
|
595
|
+
Render a `<script type="application/ld+json">` with `JSON.stringify`. Match the breadcrumb trail
|
|
596
|
+
to the page's real position.
|
|
597
|
+
|
|
598
|
+
```tsx
|
|
599
|
+
// app/blog/[slug]/page.tsx
|
|
600
|
+
import { canonicalUrl } from "@/services/seo";
|
|
601
|
+
import {
|
|
602
|
+
blogPostingJsonLd,
|
|
603
|
+
breadcrumbListJsonLd,
|
|
604
|
+
} from "@/services/seo/structured-data";
|
|
605
|
+
|
|
606
|
+
export default async function Page({ params }) {
|
|
607
|
+
const post = await loadPost(params.slug);
|
|
608
|
+
const url = canonicalUrl(`/blog/${post.slug}`);
|
|
609
|
+
const postLd = blogPostingJsonLd(post, url);
|
|
610
|
+
const crumbLd = breadcrumbListJsonLd([
|
|
611
|
+
{ name: "Home", url: canonicalUrl("/") },
|
|
612
|
+
{ name: "Blog", url: canonicalUrl("/blog") },
|
|
613
|
+
{ name: post.title, url },
|
|
614
|
+
]);
|
|
615
|
+
return (
|
|
616
|
+
<>
|
|
617
|
+
<script
|
|
618
|
+
type="application/ld+json"
|
|
619
|
+
dangerouslySetInnerHTML={{ __html: JSON.stringify(postLd) }}
|
|
620
|
+
suppressHydrationWarning
|
|
621
|
+
/>
|
|
622
|
+
<script
|
|
623
|
+
type="application/ld+json"
|
|
624
|
+
dangerouslySetInnerHTML={{ __html: JSON.stringify(crumbLd) }}
|
|
625
|
+
suppressHydrationWarning
|
|
626
|
+
/>
|
|
627
|
+
{/* …page content */}
|
|
628
|
+
</>
|
|
629
|
+
);
|
|
630
|
+
}
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
**Hard rules:**
|
|
634
|
+
|
|
635
|
+
- Give each entity a **stable `@id`** (e.g. `${SITE_URL}/#person`) and **reference** it elsewhere instead of duplicating fields.
|
|
636
|
+
- One `BlogPosting`/`CreativeWork` per detail page; a `BreadcrumbList` on every nested page.
|
|
637
|
+
- `Person` + `WebSite` belong on the home page; `FAQPage` only where real Q&A is shown.
|
|
638
|
+
- Validate output with Google's Rich Results Test / Schema Markup Validator before shipping.
|
|
639
|
+
|
|
640
|
+
---
|
|
641
|
+
|
|
642
|
+
## 8. Framework adapters
|
|
643
|
+
|
|
644
|
+
The builders are framework-free. Only the mounting layer changes.
|
|
645
|
+
|
|
646
|
+
| Framework | Per-route metadata | sitemap / robots / feed |
|
|
647
|
+
| ---------------------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
|
|
648
|
+
| **Next.js App Router** | `export const metadata` (static) or `generateMetadata` (dynamic) returning `buildMetadata(...)` | `app/sitemap.ts`, `app/robots.ts`, `app/feed.xml/route.ts` |
|
|
649
|
+
| **Remix** | `meta` export per route, mapping `buildMetadata`'s fields to `<meta>` descriptors | resource routes (`routes/sitemap[.]xml.ts`, etc.) returning the builder output as XML/text |
|
|
650
|
+
| **Astro** | `<head>` in a layout reading the same constants; per-page frontmatter overrides | `src/pages/sitemap.xml.ts`, `robots.txt.ts`, `rss.xml.ts` endpoints |
|
|
651
|
+
| **React + Vite (SPA)** | `react-helmet-async` (or a head manager) fed by `buildMetadata`'s plain object | build-time script that writes `sitemap.xml`/`robots.txt` from the same builders |
|
|
652
|
+
| **Expo Router (web)** | static head config / `expo-router` head; SEO matters only on the web target | a small web-only build step calling `sitemapEntries`/`rssItems` |
|
|
653
|
+
|
|
654
|
+
For a `buildMetadata` that must stay framework-neutral, return a plain shape
|
|
655
|
+
(`{ title, description, canonical, ogImage }`) and let each adapter translate it — keep the
|
|
656
|
+
Next.js `Metadata` return type only in a Next.js project.
|
|
657
|
+
|
|
658
|
+
---
|
|
659
|
+
|
|
660
|
+
## 9. Conventions checklist (enforce in review)
|
|
661
|
+
|
|
662
|
+
- [ ] All site identity (URL, name, description, keywords, author, handles, OG image, verification) lives in **one** `constants/seo` module — no duplicates, no hardcoded base URL.
|
|
663
|
+
- [ ] Every absolute URL is produced by `canonicalUrl()` — no manual `SITE_URL + path`.
|
|
664
|
+
- [ ] One trailing-slash policy, applied everywhere.
|
|
665
|
+
- [ ] Global metadata (title template, default OG/Twitter, robots, verification, manifest) is set **once** in the root layout.
|
|
666
|
+
- [ ] Dynamic routes override metadata via `buildMetadata` (or the framework adapter), passing only what differs.
|
|
667
|
+
- [ ] Every page resolves exactly one `canonical`; no relative or duplicate canonicals.
|
|
668
|
+
- [ ] `sitemap.xml`, `robots.txt`, and the RSS feed are **generated from content collections**, deduped, all absolute. Private routes are disallowed in robots.
|
|
669
|
+
- [ ] JSON-LD uses the shared `structuredData`/`JsonLd` builders; entities cross-reference by stable `@id`.
|
|
670
|
+
- [ ] Each detail page emits its primary schema (`BlogPosting`/`CreativeWork`) + a `BreadcrumbList`; home emits `Person` + `WebSite`.
|
|
671
|
+
- [ ] Builder functions are pure and unit-tested; framework code stays in the thin adapter (route files).
|
|
672
|
+
- [ ] OG image, locale, and Twitter handle are present and consistent across OG + Twitter cards.
|
|
673
|
+
- [ ] Structured data validated with Google's Rich Results Test before release.
|
|
674
|
+
|
|
675
|
+
---
|
|
676
|
+
|
|
677
|
+
## 10. How to apply this skill
|
|
678
|
+
|
|
679
|
+
**Adding SEO to a site:** create `constants/seo`, `types/seo`, and `services/seo/` (barrel +
|
|
680
|
+
`structured-data.ts`). Wire global metadata in the root layout, then add `sitemap`, `robots`, and
|
|
681
|
+
`feed.xml` adapters that mount the builders.
|
|
682
|
+
|
|
683
|
+
**Adding a new content type (e.g. case studies):** add its slugs to `sitemapEntries`, add a
|
|
684
|
+
JSON-LD builder if it needs its own schema, and give its detail page a `generateMetadata` + a
|
|
685
|
+
`BreadcrumbList`.
|
|
686
|
+
|
|
687
|
+
**Debugging duplicate-content / indexing issues:** check that every page goes through
|
|
688
|
+
`canonicalUrl`, that the trailing-slash policy is uniform, and that the sitemap contains only
|
|
689
|
+
indexable, absolute URLs. Confirm robots isn't blocking what should be indexed.
|
|
690
|
+
|
|
691
|
+
**Reviewing SEO coverage:** run the checklist in §9. The highest-value catches are hardcoded URLs
|
|
692
|
+
that bypass `canonicalUrl` (duplicate-content risk) and JSON-LD that duplicates entity fields
|
|
693
|
+
instead of referencing a stable `@id`.
|
|
694
|
+
|
|
695
|
+
---
|
|
696
|
+
|
|
697
|
+
## Publishing / installing this skill
|
|
698
|
+
|
|
699
|
+
This skill follows the Anthropic `SKILL.md` format and is portable across agents.
|
|
700
|
+
|
|
701
|
+
1. Keep it under `skills/frontend-seo/SKILL.md` in a public GitHub repo.
|
|
702
|
+
2. Keep the frontmatter `name` and high-signal `description` — discovery indexes match against it.
|
|
703
|
+
3. Install with: `npx skills add <org>/<repo> --skill "frontend-seo"`.
|
|
704
|
+
4. Non-`SKILL.md` agents can be pointed here from `AGENTS.md` / `CLAUDE.md`; Kiro can mirror it as a steering file.
|
|
705
|
+
|
|
706
|
+
## Limitations
|
|
707
|
+
|
|
708
|
+
- Use this skill only when the task clearly matches its upstream source and local project context.
|
|
709
|
+
- Verify commands, generated code, dependencies, credentials, and external service behavior before applying changes.
|
|
710
|
+
- Do not treat examples as a substitute for environment-specific tests, security review, or user approval for destructive or costly actions.
|