@ruaruababa/vibe-kit 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CATALOG.md +317 -0
- package/README.md +121 -0
- package/aliases.json +65 -0
- package/bin/vibe.js +2 -0
- package/bundles.json +265 -0
- package/catalog.json +1560 -0
- package/dist/antigravity-skills/bin/cli.js +438 -0
- package/dist/antigravity-skills/lib/skill-utils.js +158 -0
- package/dist/antigravity-skills/scripts/build-catalog.js +305 -0
- package/dist/antigravity-skills/scripts/normalize-frontmatter.js +144 -0
- package/dist/antigravity-skills/scripts/validate-skills.js +230 -0
- package/dist/bin/vibe.js +2 -0
- package/dist/dist/src/cli/index.js +26 -0
- package/dist/lib/skill-utils.js +158 -0
- package/dist/scripts/build-catalog.js +50 -0
- package/dist/scripts/normalize-frontmatter.js +144 -0
- package/dist/scripts/validate-skills.js +56 -0
- package/dist/src/cli/index.js +146 -0
- package/dist/src/types/index.js +13 -0
- package/dist/src/utils/fs.js +1 -0
- package/package.json +43 -0
- package/skills/accessibility-compliance-accessibility-audit/SKILL.md +42 -0
- package/skills/accessibility-compliance-accessibility-audit/resources/implementation-playbook.md +502 -0
- package/skills/agent-orchestration-improve-agent/SKILL.md +349 -0
- package/skills/agent-orchestration-multi-agent-optimize/SKILL.md +239 -0
- package/skills/agent-orchestrator/SKILL.md +24 -0
- package/skills/ai-engineer/SKILL.md +171 -0
- package/skills/airflow-dag-patterns/SKILL.md +41 -0
- package/skills/airflow-dag-patterns/resources/implementation-playbook.md +509 -0
- package/skills/angular-migration/SKILL.md +428 -0
- package/skills/anti-reversing-techniques/SKILL.md +42 -0
- package/skills/anti-reversing-techniques/resources/implementation-playbook.md +539 -0
- package/skills/api-design-principles/SKILL.md +37 -0
- package/skills/api-design-principles/assets/api-design-checklist.md +155 -0
- package/skills/api-design-principles/assets/rest-api-template.py +182 -0
- package/skills/api-design-principles/references/graphql-schema-design.md +583 -0
- package/skills/api-design-principles/references/rest-best-practices.md +408 -0
- package/skills/api-design-principles/resources/implementation-playbook.md +513 -0
- package/skills/api-documenter/SKILL.md +184 -0
- package/skills/api-testing-observability-api-mock/SKILL.md +46 -0
- package/skills/api-testing-observability-api-mock/resources/implementation-playbook.md +1327 -0
- package/skills/application-performance-performance-optimization/SKILL.md +154 -0
- package/skills/architect-review/SKILL.md +174 -0
- package/skills/architecture-decision-records/SKILL.md +441 -0
- package/skills/architecture-patterns/SKILL.md +37 -0
- package/skills/architecture-patterns/resources/implementation-playbook.md +479 -0
- package/skills/arm-cortex-expert/SKILL.md +306 -0
- package/skills/async-python-patterns/SKILL.md +39 -0
- package/skills/async-python-patterns/resources/implementation-playbook.md +678 -0
- package/skills/attack-tree-construction/SKILL.md +38 -0
- package/skills/attack-tree-construction/resources/implementation-playbook.md +671 -0
- package/skills/auth-implementation-patterns/SKILL.md +39 -0
- package/skills/auth-implementation-patterns/resources/implementation-playbook.md +618 -0
- package/skills/backend-architect/SKILL.md +333 -0
- package/skills/backend-development-feature-development/SKILL.md +180 -0
- package/skills/backend-security-coder/SKILL.md +156 -0
- package/skills/backtesting-frameworks/SKILL.md +39 -0
- package/skills/backtesting-frameworks/resources/implementation-playbook.md +647 -0
- package/skills/bash-defensive-patterns/SKILL.md +43 -0
- package/skills/bash-defensive-patterns/resources/implementation-playbook.md +517 -0
- package/skills/bash-pro/SKILL.md +310 -0
- package/skills/bats-testing-patterns/SKILL.md +34 -0
- package/skills/bats-testing-patterns/resources/implementation-playbook.md +614 -0
- package/skills/bazel-build-optimization/SKILL.md +397 -0
- package/skills/billing-automation/SKILL.md +42 -0
- package/skills/billing-automation/resources/implementation-playbook.md +544 -0
- package/skills/binary-analysis-patterns/SKILL.md +450 -0
- package/skills/blockchain-developer/SKILL.md +208 -0
- package/skills/business-analyst/SKILL.md +182 -0
- package/skills/c-pro/SKILL.md +56 -0
- package/skills/c4-architecture-c4-architecture/SKILL.md +389 -0
- package/skills/c4-code/SKILL.md +244 -0
- package/skills/c4-component/SKILL.md +153 -0
- package/skills/c4-container/SKILL.md +171 -0
- package/skills/c4-context/SKILL.md +150 -0
- package/skills/changelog-automation/SKILL.md +38 -0
- package/skills/changelog-automation/resources/implementation-playbook.md +538 -0
- package/skills/cicd-automation-workflow-automate/SKILL.md +51 -0
- package/skills/cicd-automation-workflow-automate/resources/implementation-playbook.md +1333 -0
- package/skills/clean-markdown/SKILL.md +23 -0
- package/skills/cloud-architect/SKILL.md +135 -0
- package/skills/code-documentation-code-explain/SKILL.md +46 -0
- package/skills/code-documentation-code-explain/resources/implementation-playbook.md +802 -0
- package/skills/code-documentation-doc-generate/SKILL.md +48 -0
- package/skills/code-documentation-doc-generate/resources/implementation-playbook.md +640 -0
- package/skills/code-refactoring-context-restore/SKILL.md +179 -0
- package/skills/code-refactoring-refactor-clean/SKILL.md +51 -0
- package/skills/code-refactoring-refactor-clean/resources/implementation-playbook.md +879 -0
- package/skills/code-refactoring-tech-debt/SKILL.md +386 -0
- package/skills/code-review-ai-ai-review/SKILL.md +450 -0
- package/skills/code-review-excellence/SKILL.md +40 -0
- package/skills/code-review-excellence/resources/implementation-playbook.md +515 -0
- package/skills/code-reviewer/SKILL.md +178 -0
- package/skills/codebase-cleanup-deps-audit/SKILL.md +51 -0
- package/skills/codebase-cleanup-deps-audit/resources/implementation-playbook.md +766 -0
- package/skills/codebase-cleanup-refactor-clean/SKILL.md +51 -0
- package/skills/codebase-cleanup-refactor-clean/resources/implementation-playbook.md +879 -0
- package/skills/codebase-cleanup-tech-debt/SKILL.md +386 -0
- package/skills/competitive-landscape/SKILL.md +34 -0
- package/skills/competitive-landscape/resources/implementation-playbook.md +494 -0
- package/skills/comprehensive-review-full-review/SKILL.md +146 -0
- package/skills/comprehensive-review-pr-enhance/SKILL.md +46 -0
- package/skills/comprehensive-review-pr-enhance/resources/implementation-playbook.md +691 -0
- package/skills/conductor-implement/SKILL.md +388 -0
- package/skills/conductor-manage/SKILL.md +39 -0
- package/skills/conductor-manage/resources/implementation-playbook.md +1120 -0
- package/skills/conductor-new-track/SKILL.md +433 -0
- package/skills/conductor-revert/SKILL.md +372 -0
- package/skills/conductor-setup/SKILL.md +426 -0
- package/skills/conductor-status/SKILL.md +338 -0
- package/skills/conductor-validator/SKILL.md +62 -0
- package/skills/content-marketer/SKILL.md +170 -0
- package/skills/context-driven-development/SKILL.md +400 -0
- package/skills/context-management-context-restore/SKILL.md +179 -0
- package/skills/context-management-context-save/SKILL.md +177 -0
- package/skills/context-manager/SKILL.md +185 -0
- package/skills/cost-optimization/SKILL.md +286 -0
- package/skills/cpp-pro/SKILL.md +59 -0
- package/skills/cqrs-implementation/SKILL.md +35 -0
- package/skills/cqrs-implementation/resources/implementation-playbook.md +540 -0
- package/skills/csharp-pro/SKILL.md +59 -0
- package/skills/customer-support/SKILL.md +170 -0
- package/skills/data-engineer/SKILL.md +224 -0
- package/skills/data-engineering-data-driven-feature/SKILL.md +182 -0
- package/skills/data-engineering-data-pipeline/SKILL.md +201 -0
- package/skills/data-quality-frameworks/SKILL.md +40 -0
- package/skills/data-quality-frameworks/resources/implementation-playbook.md +573 -0
- package/skills/data-scientist/SKILL.md +199 -0
- package/skills/data-storytelling/SKILL.md +465 -0
- package/skills/database-admin/SKILL.md +165 -0
- package/skills/database-architect/SKILL.md +268 -0
- package/skills/database-cloud-optimization-cost-optimize/SKILL.md +44 -0
- package/skills/database-cloud-optimization-cost-optimize/resources/implementation-playbook.md +1441 -0
- package/skills/database-migration/SKILL.md +436 -0
- package/skills/database-migrations-migration-observability/SKILL.md +420 -0
- package/skills/database-migrations-sql-migrations/SKILL.md +53 -0
- package/skills/database-migrations-sql-migrations/resources/implementation-playbook.md +499 -0
- package/skills/database-optimizer/SKILL.md +167 -0
- package/skills/dbt-transformation-patterns/SKILL.md +34 -0
- package/skills/dbt-transformation-patterns/resources/implementation-playbook.md +547 -0
- package/skills/debugger/SKILL.md +49 -0
- package/skills/debugging-strategies/SKILL.md +34 -0
- package/skills/debugging-strategies/resources/implementation-playbook.md +511 -0
- package/skills/debugging-toolkit-smart-debug/SKILL.md +197 -0
- package/skills/defi-protocol-templates/SKILL.md +466 -0
- package/skills/dependency-management-deps-audit/SKILL.md +44 -0
- package/skills/dependency-management-deps-audit/resources/implementation-playbook.md +766 -0
- package/skills/dependency-upgrade/SKILL.md +421 -0
- package/skills/deployment-engineer/SKILL.md +170 -0
- package/skills/deployment-pipeline-design/SKILL.md +371 -0
- package/skills/deployment-validation-config-validate/SKILL.md +496 -0
- package/skills/devops-troubleshooter/SKILL.md +161 -0
- package/skills/distributed-debugging-debug-trace/SKILL.md +44 -0
- package/skills/distributed-debugging-debug-trace/resources/implementation-playbook.md +1307 -0
- package/skills/distributed-tracing/SKILL.md +450 -0
- package/skills/django-pro/SKILL.md +180 -0
- package/skills/docs-architect/SKILL.md +98 -0
- package/skills/documentation-generation-doc-generate/SKILL.md +48 -0
- package/skills/documentation-generation-doc-generate/resources/implementation-playbook.md +640 -0
- package/skills/dotnet-architect/SKILL.md +197 -0
- package/skills/dotnet-backend-patterns/SKILL.md +37 -0
- package/skills/dotnet-backend-patterns/assets/repository-template.cs +523 -0
- package/skills/dotnet-backend-patterns/assets/service-template.cs +336 -0
- package/skills/dotnet-backend-patterns/references/dapper-patterns.md +544 -0
- package/skills/dotnet-backend-patterns/references/ef-core-best-practices.md +355 -0
- package/skills/dotnet-backend-patterns/resources/implementation-playbook.md +799 -0
- package/skills/dummy-skill/SKILL.md +5 -0
- package/skills/dx-optimizer/SKILL.md +83 -0
- package/skills/e2e-testing-patterns/SKILL.md +41 -0
- package/skills/e2e-testing-patterns/resources/implementation-playbook.md +531 -0
- package/skills/elixir-pro/SKILL.md +59 -0
- package/skills/embedding-strategies/SKILL.md +491 -0
- package/skills/employment-contract-templates/SKILL.md +39 -0
- package/skills/employment-contract-templates/resources/implementation-playbook.md +493 -0
- package/skills/error-debugging-error-analysis/SKILL.md +47 -0
- package/skills/error-debugging-error-analysis/resources/implementation-playbook.md +1143 -0
- package/skills/error-debugging-error-trace/SKILL.md +43 -0
- package/skills/error-debugging-error-trace/resources/implementation-playbook.md +1361 -0
- package/skills/error-debugging-multi-agent-review/SKILL.md +216 -0
- package/skills/error-detective/SKILL.md +53 -0
- package/skills/error-diagnostics-error-analysis/SKILL.md +47 -0
- package/skills/error-diagnostics-error-analysis/resources/implementation-playbook.md +1143 -0
- package/skills/error-diagnostics-error-trace/SKILL.md +48 -0
- package/skills/error-diagnostics-error-trace/resources/implementation-playbook.md +1371 -0
- package/skills/error-diagnostics-smart-debug/SKILL.md +197 -0
- package/skills/error-handling-patterns/SKILL.md +35 -0
- package/skills/error-handling-patterns/resources/implementation-playbook.md +635 -0
- package/skills/event-sourcing-architect/SKILL.md +58 -0
- package/skills/event-store-design/SKILL.md +449 -0
- package/skills/fastapi-pro/SKILL.md +192 -0
- package/skills/fastapi-templates/SKILL.md +32 -0
- package/skills/fastapi-templates/resources/implementation-playbook.md +566 -0
- package/skills/final-test/SKILL.md +5 -0
- package/skills/firmware-analyst/SKILL.md +320 -0
- package/skills/flutter-expert/SKILL.md +200 -0
- package/skills/framework-migration-code-migrate/SKILL.md +48 -0
- package/skills/framework-migration-code-migrate/resources/implementation-playbook.md +1052 -0
- package/skills/framework-migration-deps-upgrade/SKILL.md +48 -0
- package/skills/framework-migration-deps-upgrade/resources/implementation-playbook.md +755 -0
- package/skills/framework-migration-legacy-modernize/SKILL.md +132 -0
- package/skills/frontend-developer/SKILL.md +171 -0
- package/skills/frontend-mobile-development-component-scaffold/SKILL.md +403 -0
- package/skills/frontend-mobile-security-xss-scan/SKILL.md +322 -0
- package/skills/frontend-security-coder/SKILL.md +170 -0
- package/skills/full-stack-orchestration-full-stack-feature/SKILL.md +135 -0
- package/skills/gdpr-data-handling/SKILL.md +33 -0
- package/skills/gdpr-data-handling/resources/implementation-playbook.md +615 -0
- package/skills/git-advanced-workflows/SKILL.md +412 -0
- package/skills/git-pr-workflows-git-workflow/SKILL.md +140 -0
- package/skills/git-pr-workflows-onboard/SKILL.md +416 -0
- package/skills/git-pr-workflows-pr-enhance/SKILL.md +48 -0
- package/skills/git-pr-workflows-pr-enhance/resources/implementation-playbook.md +701 -0
- package/skills/github-actions-templates/SKILL.md +345 -0
- package/skills/gitlab-ci-patterns/SKILL.md +283 -0
- package/skills/gitops-workflow/SKILL.md +303 -0
- package/skills/gitops-workflow/references/argocd-setup.md +134 -0
- package/skills/gitops-workflow/references/sync-policies.md +131 -0
- package/skills/go-concurrency-patterns/SKILL.md +33 -0
- package/skills/go-concurrency-patterns/resources/implementation-playbook.md +654 -0
- package/skills/godot-gdscript-patterns/SKILL.md +33 -0
- package/skills/godot-gdscript-patterns/resources/implementation-playbook.md +804 -0
- package/skills/golang-pro/SKILL.md +179 -0
- package/skills/grafana-dashboards/SKILL.md +381 -0
- package/skills/graphql-architect/SKILL.md +182 -0
- package/skills/haskell-pro/SKILL.md +56 -0
- package/skills/helm-chart-scaffolding/SKILL.md +34 -0
- package/skills/helm-chart-scaffolding/assets/Chart.yaml.template +42 -0
- package/skills/helm-chart-scaffolding/assets/values.yaml.template +185 -0
- package/skills/helm-chart-scaffolding/references/chart-structure.md +500 -0
- package/skills/helm-chart-scaffolding/resources/implementation-playbook.md +543 -0
- package/skills/helm-chart-scaffolding/scripts/validate-chart.sh +244 -0
- package/skills/hr-pro/SKILL.md +126 -0
- package/skills/hybrid-cloud-architect/SKILL.md +168 -0
- package/skills/hybrid-cloud-networking/SKILL.md +238 -0
- package/skills/hybrid-search-implementation/SKILL.md +32 -0
- package/skills/hybrid-search-implementation/resources/implementation-playbook.md +567 -0
- package/skills/incident-responder/SKILL.md +213 -0
- package/skills/incident-response-incident-response/SKILL.md +168 -0
- package/skills/incident-response-smart-fix/SKILL.md +29 -0
- package/skills/incident-response-smart-fix/resources/implementation-playbook.md +838 -0
- package/skills/incident-runbook-templates/SKILL.md +395 -0
- package/skills/ios-developer/SKILL.md +219 -0
- package/skills/istio-traffic-management/SKILL.md +337 -0
- package/skills/java-pro/SKILL.md +177 -0
- package/skills/javascript-pro/SKILL.md +57 -0
- package/skills/javascript-testing-patterns/SKILL.md +35 -0
- package/skills/javascript-testing-patterns/resources/implementation-playbook.md +1024 -0
- package/skills/javascript-typescript-typescript-scaffold/SKILL.md +361 -0
- package/skills/julia-pro/SKILL.md +209 -0
- package/skills/k8s-manifest-generator/SKILL.md +35 -0
- package/skills/k8s-manifest-generator/assets/configmap-template.yaml +296 -0
- package/skills/k8s-manifest-generator/assets/deployment-template.yaml +203 -0
- package/skills/k8s-manifest-generator/assets/service-template.yaml +171 -0
- package/skills/k8s-manifest-generator/references/deployment-spec.md +753 -0
- package/skills/k8s-manifest-generator/references/service-spec.md +724 -0
- package/skills/k8s-manifest-generator/resources/implementation-playbook.md +510 -0
- package/skills/k8s-security-policies/SKILL.md +346 -0
- package/skills/k8s-security-policies/assets/network-policy-template.yaml +177 -0
- package/skills/k8s-security-policies/references/rbac-patterns.md +187 -0
- package/skills/kpi-dashboard-design/SKILL.md +440 -0
- package/skills/kubernetes-architect/SKILL.md +170 -0
- package/skills/langchain-architecture/SKILL.md +350 -0
- package/skills/legacy-modernizer/SKILL.md +53 -0
- package/skills/legal-advisor/SKILL.md +70 -0
- package/skills/linkerd-patterns/SKILL.md +321 -0
- package/skills/llm-application-dev-ai-assistant/SKILL.md +35 -0
- package/skills/llm-application-dev-ai-assistant/resources/implementation-playbook.md +1236 -0
- package/skills/llm-application-dev-langchain-agent/SKILL.md +246 -0
- package/skills/llm-application-dev-prompt-optimize/SKILL.md +37 -0
- package/skills/llm-application-dev-prompt-optimize/resources/implementation-playbook.md +591 -0
- package/skills/llm-evaluation/SKILL.md +483 -0
- package/skills/machine-learning-ops-ml-pipeline/SKILL.md +314 -0
- package/skills/malware-analyst/SKILL.md +247 -0
- package/skills/market-sizing-analysis/SKILL.md +425 -0
- package/skills/market-sizing-analysis/examples/saas-market-sizing.md +349 -0
- package/skills/market-sizing-analysis/references/data-sources.md +360 -0
- package/skills/memory-forensics/SKILL.md +491 -0
- package/skills/memory-safety-patterns/SKILL.md +33 -0
- package/skills/memory-safety-patterns/resources/implementation-playbook.md +603 -0
- package/skills/mermaid-expert/SKILL.md +59 -0
- package/skills/microservices-patterns/SKILL.md +35 -0
- package/skills/microservices-patterns/resources/implementation-playbook.md +607 -0
- package/skills/minecraft-bukkit-pro/SKILL.md +126 -0
- package/skills/ml-engineer/SKILL.md +168 -0
- package/skills/ml-pipeline-workflow/SKILL.md +257 -0
- package/skills/mlops-engineer/SKILL.md +219 -0
- package/skills/mobile-developer/SKILL.md +205 -0
- package/skills/mobile-security-coder/SKILL.md +184 -0
- package/skills/modern-javascript-patterns/SKILL.md +35 -0
- package/skills/modern-javascript-patterns/resources/implementation-playbook.md +910 -0
- package/skills/monorepo-architect/SKILL.md +61 -0
- package/skills/monorepo-management/SKILL.md +35 -0
- package/skills/monorepo-management/resources/implementation-playbook.md +621 -0
- package/skills/mtls-configuration/SKILL.md +359 -0
- package/skills/multi-cloud-architecture/SKILL.md +189 -0
- package/skills/multi-platform-apps-multi-platform/SKILL.md +203 -0
- package/skills/network-engineer/SKILL.md +169 -0
- package/skills/nextjs-app-router-patterns/SKILL.md +33 -0
- package/skills/nextjs-app-router-patterns/resources/implementation-playbook.md +543 -0
- package/skills/nft-standards/SKILL.md +395 -0
- package/skills/node-expert/SKILL.md +23 -0
- package/skills/nodejs-backend-patterns/SKILL.md +35 -0
- package/skills/nodejs-backend-patterns/resources/implementation-playbook.md +1019 -0
- package/skills/nx-workspace-patterns/SKILL.md +464 -0
- package/skills/observability-engineer/SKILL.md +237 -0
- package/skills/observability-monitoring-monitor-setup/SKILL.md +48 -0
- package/skills/observability-monitoring-monitor-setup/resources/implementation-playbook.md +505 -0
- package/skills/observability-monitoring-slo-implement/SKILL.md +43 -0
- package/skills/observability-monitoring-slo-implement/resources/implementation-playbook.md +1077 -0
- package/skills/on-call-handoff-patterns/SKILL.md +453 -0
- package/skills/openapi-spec-generation/SKILL.md +33 -0
- package/skills/openapi-spec-generation/resources/implementation-playbook.md +1027 -0
- package/skills/payment-integration/SKILL.md +77 -0
- package/skills/paypal-integration/SKILL.md +479 -0
- package/skills/pci-compliance/SKILL.md +478 -0
- package/skills/performance-engineer/SKILL.md +180 -0
- package/skills/performance-testing-review-ai-review/SKILL.md +450 -0
- package/skills/performance-testing-review-multi-agent-review/SKILL.md +216 -0
- package/skills/php-pro/SKILL.md +63 -0
- package/skills/posix-shell-pro/SKILL.md +304 -0
- package/skills/postgresql/SKILL.md +230 -0
- package/skills/postmortem-writing/SKILL.md +386 -0
- package/skills/projection-patterns/SKILL.md +33 -0
- package/skills/projection-patterns/resources/implementation-playbook.md +501 -0
- package/skills/prometheus-configuration/SKILL.md +404 -0
- package/skills/prompt-engineer/SKILL.md +272 -0
- package/skills/prompt-engineering-patterns/SKILL.md +213 -0
- package/skills/prompt-engineering-patterns/assets/few-shot-examples.json +106 -0
- package/skills/prompt-engineering-patterns/assets/prompt-template-library.md +246 -0
- package/skills/prompt-engineering-patterns/references/chain-of-thought.md +399 -0
- package/skills/prompt-engineering-patterns/references/few-shot-learning.md +369 -0
- package/skills/prompt-engineering-patterns/references/prompt-optimization.md +414 -0
- package/skills/prompt-engineering-patterns/references/prompt-templates.md +470 -0
- package/skills/prompt-engineering-patterns/references/system-prompts.md +189 -0
- package/skills/prompt-engineering-patterns/scripts/optimize-prompt.py +279 -0
- package/skills/protocol-reverse-engineering/SKILL.md +29 -0
- package/skills/protocol-reverse-engineering/resources/implementation-playbook.md +509 -0
- package/skills/python-development-python-scaffold/SKILL.md +331 -0
- package/skills/python-packaging/SKILL.md +36 -0
- package/skills/python-packaging/resources/implementation-playbook.md +869 -0
- package/skills/python-performance-optimization/SKILL.md +36 -0
- package/skills/python-performance-optimization/resources/implementation-playbook.md +868 -0
- package/skills/python-pro/SKILL.md +158 -0
- package/skills/python-testing-patterns/SKILL.md +37 -0
- package/skills/python-testing-patterns/resources/implementation-playbook.md +906 -0
- package/skills/quant-analyst/SKILL.md +53 -0
- package/skills/rag-implementation/SKILL.md +421 -0
- package/skills/react-modernization/SKILL.md +34 -0
- package/skills/react-modernization/resources/implementation-playbook.md +512 -0
- package/skills/react-native-architecture/SKILL.md +33 -0
- package/skills/react-native-architecture/resources/implementation-playbook.md +670 -0
- package/skills/react-state-management/SKILL.md +441 -0
- package/skills/reference-builder/SKILL.md +188 -0
- package/skills/reverse-engineer/SKILL.md +173 -0
- package/skills/risk-manager/SKILL.md +61 -0
- package/skills/risk-metrics-calculation/SKILL.md +33 -0
- package/skills/risk-metrics-calculation/resources/implementation-playbook.md +554 -0
- package/skills/ruby-pro/SKILL.md +56 -0
- package/skills/rust-async-patterns/SKILL.md +33 -0
- package/skills/rust-async-patterns/resources/implementation-playbook.md +516 -0
- package/skills/rust-pro/SKILL.md +178 -0
- package/skills/saga-orchestration/SKILL.md +496 -0
- package/skills/sales-automator/SKILL.md +55 -0
- package/skills/sast-configuration/SKILL.md +212 -0
- package/skills/scala-pro/SKILL.md +82 -0
- package/skills/screen-reader-testing/SKILL.md +33 -0
- package/skills/screen-reader-testing/resources/implementation-playbook.md +544 -0
- package/skills/search-specialist/SKILL.md +80 -0
- package/skills/secrets-management/SKILL.md +364 -0
- package/skills/security-auditor/SKILL.md +169 -0
- package/skills/security-compliance-compliance-check/SKILL.md +55 -0
- package/skills/security-compliance-compliance-check/resources/implementation-playbook.md +963 -0
- package/skills/security-requirement-extraction/SKILL.md +33 -0
- package/skills/security-requirement-extraction/resources/implementation-playbook.md +676 -0
- package/skills/security-scanning-security-dependencies/SKILL.md +43 -0
- package/skills/security-scanning-security-dependencies/resources/implementation-playbook.md +544 -0
- package/skills/security-scanning-security-hardening/SKILL.md +147 -0
- package/skills/security-scanning-security-sast/SKILL.md +495 -0
- package/skills/seo-authority-builder/SKILL.md +136 -0
- package/skills/seo-cannibalization-detector/SKILL.md +123 -0
- package/skills/seo-content-auditor/SKILL.md +83 -0
- package/skills/seo-content-planner/SKILL.md +108 -0
- package/skills/seo-content-refresher/SKILL.md +118 -0
- package/skills/seo-content-writer/SKILL.md +96 -0
- package/skills/seo-keyword-strategist/SKILL.md +95 -0
- package/skills/seo-meta-optimizer/SKILL.md +92 -0
- package/skills/seo-snippet-hunter/SKILL.md +114 -0
- package/skills/seo-structure-architect/SKILL.md +108 -0
- package/skills/service-mesh-expert/SKILL.md +58 -0
- package/skills/service-mesh-observability/SKILL.md +395 -0
- package/skills/shellcheck-configuration/SKILL.md +466 -0
- package/skills/similarity-search-patterns/SKILL.md +33 -0
- package/skills/similarity-search-patterns/resources/implementation-playbook.md +557 -0
- package/skills/slo-implementation/SKILL.md +341 -0
- package/skills/solidity-security/SKILL.md +34 -0
- package/skills/solidity-security/resources/implementation-playbook.md +524 -0
- package/skills/spark-optimization/SKILL.md +427 -0
- package/skills/sql-optimization-patterns/SKILL.md +35 -0
- package/skills/sql-optimization-patterns/resources/implementation-playbook.md +504 -0
- package/skills/sql-pro/SKILL.md +173 -0
- package/skills/startup-analyst/SKILL.md +328 -0
- package/skills/startup-business-analyst-business-case/SKILL.md +487 -0
- package/skills/startup-business-analyst-financial-projections/SKILL.md +353 -0
- package/skills/startup-business-analyst-market-opportunity/SKILL.md +240 -0
- package/skills/startup-financial-modeling/SKILL.md +467 -0
- package/skills/startup-metrics-framework/SKILL.md +34 -0
- package/skills/startup-metrics-framework/resources/implementation-playbook.md +500 -0
- package/skills/stride-analysis-patterns/SKILL.md +33 -0
- package/skills/stride-analysis-patterns/resources/implementation-playbook.md +655 -0
- package/skills/stripe-integration/SKILL.md +454 -0
- package/skills/systems-programming-rust-project/SKILL.md +440 -0
- package/skills/tailwind-design-system/SKILL.md +33 -0
- package/skills/tailwind-design-system/resources/implementation-playbook.md +665 -0
- package/skills/tdd-orchestrator/SKILL.md +205 -0
- package/skills/tdd-workflows-tdd-cycle/SKILL.md +221 -0
- package/skills/tdd-workflows-tdd-green/SKILL.md +73 -0
- package/skills/tdd-workflows-tdd-green/resources/implementation-playbook.md +870 -0
- package/skills/tdd-workflows-tdd-red/SKILL.md +164 -0
- package/skills/tdd-workflows-tdd-refactor/SKILL.md +187 -0
- package/skills/team-collaboration-issue/SKILL.md +37 -0
- package/skills/team-collaboration-issue/resources/implementation-playbook.md +640 -0
- package/skills/team-collaboration-standup-notes/SKILL.md +44 -0
- package/skills/team-collaboration-standup-notes/resources/implementation-playbook.md +768 -0
- package/skills/team-composition-analysis/SKILL.md +413 -0
- package/skills/temporal-python-pro/SKILL.md +370 -0
- package/skills/temporal-python-testing/SKILL.md +170 -0
- package/skills/temporal-python-testing/resources/integration-testing.md +455 -0
- package/skills/temporal-python-testing/resources/local-setup.md +553 -0
- package/skills/temporal-python-testing/resources/replay-testing.md +462 -0
- package/skills/temporal-python-testing/resources/unit-testing.md +328 -0
- package/skills/terraform-module-library/SKILL.md +261 -0
- package/skills/terraform-module-library/references/aws-modules.md +63 -0
- package/skills/terraform-specialist/SKILL.md +166 -0
- package/skills/test-automator/SKILL.md +224 -0
- package/skills/threat-mitigation-mapping/SKILL.md +33 -0
- package/skills/threat-mitigation-mapping/resources/implementation-playbook.md +744 -0
- package/skills/threat-modeling-expert/SKILL.md +60 -0
- package/skills/track-management/SKILL.md +38 -0
- package/skills/track-management/resources/implementation-playbook.md +591 -0
- package/skills/turborepo-caching/SKILL.md +419 -0
- package/skills/tutorial-engineer/SKILL.md +139 -0
- package/skills/typescript-advanced-types/SKILL.md +35 -0
- package/skills/typescript-advanced-types/resources/implementation-playbook.md +716 -0
- package/skills/typescript-pro/SKILL.md +55 -0
- package/skills/ui-minimal/SKILL.md +23 -0
- package/skills/ui-ux-designer/SKILL.md +209 -0
- package/skills/ui-visual-validator/SKILL.md +214 -0
- package/skills/unit-testing-test-generate/SKILL.md +319 -0
- package/skills/unity-developer/SKILL.md +230 -0
- package/skills/unity-ecs-patterns/SKILL.md +33 -0
- package/skills/unity-ecs-patterns/resources/implementation-playbook.md +625 -0
- package/skills/uv-package-manager/SKILL.md +37 -0
- package/skills/uv-package-manager/resources/implementation-playbook.md +830 -0
- package/skills/vector-database-engineer/SKILL.md +60 -0
- package/skills/vector-index-tuning/SKILL.md +42 -0
- package/skills/vector-index-tuning/resources/implementation-playbook.md +507 -0
- package/skills/wcag-audit-patterns/SKILL.md +41 -0
- package/skills/wcag-audit-patterns/resources/implementation-playbook.md +541 -0
- package/skills/web3-testing/SKILL.md +427 -0
- package/skills/workflow-orchestration-patterns/SKILL.md +333 -0
- package/skills/workflow-patterns/SKILL.md +38 -0
- package/skills/workflow-patterns/resources/implementation-playbook.md +621 -0
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
# Next.js App Router Patterns Implementation Playbook
|
|
2
|
+
|
|
3
|
+
This file contains detailed patterns, checklists, and code samples referenced by the skill.
|
|
4
|
+
|
|
5
|
+
# Next.js App Router Patterns
|
|
6
|
+
|
|
7
|
+
Comprehensive patterns for Next.js 14+ App Router architecture, Server Components, and modern full-stack React development.
|
|
8
|
+
|
|
9
|
+
## When to Use This Skill
|
|
10
|
+
|
|
11
|
+
- Building new Next.js applications with App Router
|
|
12
|
+
- Migrating from Pages Router to App Router
|
|
13
|
+
- Implementing Server Components and streaming
|
|
14
|
+
- Setting up parallel and intercepting routes
|
|
15
|
+
- Optimizing data fetching and caching
|
|
16
|
+
- Building full-stack features with Server Actions
|
|
17
|
+
|
|
18
|
+
## Core Concepts
|
|
19
|
+
|
|
20
|
+
### 1. Rendering Modes
|
|
21
|
+
|
|
22
|
+
| Mode | Where | When to Use |
|
|
23
|
+
|------|-------|-------------|
|
|
24
|
+
| **Server Components** | Server only | Data fetching, heavy computation, secrets |
|
|
25
|
+
| **Client Components** | Browser | Interactivity, hooks, browser APIs |
|
|
26
|
+
| **Static** | Build time | Content that rarely changes |
|
|
27
|
+
| **Dynamic** | Request time | Personalized or real-time data |
|
|
28
|
+
| **Streaming** | Progressive | Large pages, slow data sources |
|
|
29
|
+
|
|
30
|
+
### 2. File Conventions
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
app/
|
|
34
|
+
├── layout.tsx # Shared UI wrapper
|
|
35
|
+
├── page.tsx # Route UI
|
|
36
|
+
├── loading.tsx # Loading UI (Suspense)
|
|
37
|
+
├── error.tsx # Error boundary
|
|
38
|
+
├── not-found.tsx # 404 UI
|
|
39
|
+
├── route.ts # API endpoint
|
|
40
|
+
├── template.tsx # Re-mounted layout
|
|
41
|
+
├── default.tsx # Parallel route fallback
|
|
42
|
+
└── opengraph-image.tsx # OG image generation
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Quick Start
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
// app/layout.tsx
|
|
49
|
+
import { Inter } from 'next/font/google'
|
|
50
|
+
import { Providers } from './providers'
|
|
51
|
+
|
|
52
|
+
const inter = Inter({ subsets: ['latin'] })
|
|
53
|
+
|
|
54
|
+
export const metadata = {
|
|
55
|
+
title: { default: 'My App', template: '%s | My App' },
|
|
56
|
+
description: 'Built with Next.js App Router',
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export default function RootLayout({
|
|
60
|
+
children,
|
|
61
|
+
}: {
|
|
62
|
+
children: React.ReactNode
|
|
63
|
+
}) {
|
|
64
|
+
return (
|
|
65
|
+
<html lang="en" suppressHydrationWarning>
|
|
66
|
+
<body className={inter.className}>
|
|
67
|
+
<Providers>{children}</Providers>
|
|
68
|
+
</body>
|
|
69
|
+
</html>
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// app/page.tsx - Server Component by default
|
|
74
|
+
async function getProducts() {
|
|
75
|
+
const res = await fetch('https://api.example.com/products', {
|
|
76
|
+
next: { revalidate: 3600 }, // ISR: revalidate every hour
|
|
77
|
+
})
|
|
78
|
+
return res.json()
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export default async function HomePage() {
|
|
82
|
+
const products = await getProducts()
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
<main>
|
|
86
|
+
<h1>Products</h1>
|
|
87
|
+
<ProductGrid products={products} />
|
|
88
|
+
</main>
|
|
89
|
+
)
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Patterns
|
|
94
|
+
|
|
95
|
+
### Pattern 1: Server Components with Data Fetching
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
// app/products/page.tsx
|
|
99
|
+
import { Suspense } from 'react'
|
|
100
|
+
import { ProductList, ProductListSkeleton } from '@/components/products'
|
|
101
|
+
import { FilterSidebar } from '@/components/filters'
|
|
102
|
+
|
|
103
|
+
interface SearchParams {
|
|
104
|
+
category?: string
|
|
105
|
+
sort?: 'price' | 'name' | 'date'
|
|
106
|
+
page?: string
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export default async function ProductsPage({
|
|
110
|
+
searchParams,
|
|
111
|
+
}: {
|
|
112
|
+
searchParams: Promise<SearchParams>
|
|
113
|
+
}) {
|
|
114
|
+
const params = await searchParams
|
|
115
|
+
|
|
116
|
+
return (
|
|
117
|
+
<div className="flex gap-8">
|
|
118
|
+
<FilterSidebar />
|
|
119
|
+
<Suspense
|
|
120
|
+
key={JSON.stringify(params)}
|
|
121
|
+
fallback={<ProductListSkeleton />}
|
|
122
|
+
>
|
|
123
|
+
<ProductList
|
|
124
|
+
category={params.category}
|
|
125
|
+
sort={params.sort}
|
|
126
|
+
page={Number(params.page) || 1}
|
|
127
|
+
/>
|
|
128
|
+
</Suspense>
|
|
129
|
+
</div>
|
|
130
|
+
)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// components/products/ProductList.tsx - Server Component
|
|
134
|
+
async function getProducts(filters: ProductFilters) {
|
|
135
|
+
const res = await fetch(
|
|
136
|
+
`${process.env.API_URL}/products?${new URLSearchParams(filters)}`,
|
|
137
|
+
{ next: { tags: ['products'] } }
|
|
138
|
+
)
|
|
139
|
+
if (!res.ok) throw new Error('Failed to fetch products')
|
|
140
|
+
return res.json()
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export async function ProductList({ category, sort, page }: ProductFilters) {
|
|
144
|
+
const { products, totalPages } = await getProducts({ category, sort, page })
|
|
145
|
+
|
|
146
|
+
return (
|
|
147
|
+
<div>
|
|
148
|
+
<div className="grid grid-cols-3 gap-4">
|
|
149
|
+
{products.map((product) => (
|
|
150
|
+
<ProductCard key={product.id} product={product} />
|
|
151
|
+
))}
|
|
152
|
+
</div>
|
|
153
|
+
<Pagination currentPage={page} totalPages={totalPages} />
|
|
154
|
+
</div>
|
|
155
|
+
)
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Pattern 2: Client Components with 'use client'
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
// components/products/AddToCartButton.tsx
|
|
163
|
+
'use client'
|
|
164
|
+
|
|
165
|
+
import { useState, useTransition } from 'react'
|
|
166
|
+
import { addToCart } from '@/app/actions/cart'
|
|
167
|
+
|
|
168
|
+
export function AddToCartButton({ productId }: { productId: string }) {
|
|
169
|
+
const [isPending, startTransition] = useTransition()
|
|
170
|
+
const [error, setError] = useState<string | null>(null)
|
|
171
|
+
|
|
172
|
+
const handleClick = () => {
|
|
173
|
+
setError(null)
|
|
174
|
+
startTransition(async () => {
|
|
175
|
+
const result = await addToCart(productId)
|
|
176
|
+
if (result.error) {
|
|
177
|
+
setError(result.error)
|
|
178
|
+
}
|
|
179
|
+
})
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return (
|
|
183
|
+
<div>
|
|
184
|
+
<button
|
|
185
|
+
onClick={handleClick}
|
|
186
|
+
disabled={isPending}
|
|
187
|
+
className="btn-primary"
|
|
188
|
+
>
|
|
189
|
+
{isPending ? 'Adding...' : 'Add to Cart'}
|
|
190
|
+
</button>
|
|
191
|
+
{error && <p className="text-red-500 text-sm">{error}</p>}
|
|
192
|
+
</div>
|
|
193
|
+
)
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Pattern 3: Server Actions
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
// app/actions/cart.ts
|
|
201
|
+
'use server'
|
|
202
|
+
|
|
203
|
+
import { revalidateTag } from 'next/cache'
|
|
204
|
+
import { cookies } from 'next/headers'
|
|
205
|
+
import { redirect } from 'next/navigation'
|
|
206
|
+
|
|
207
|
+
export async function addToCart(productId: string) {
|
|
208
|
+
const cookieStore = await cookies()
|
|
209
|
+
const sessionId = cookieStore.get('session')?.value
|
|
210
|
+
|
|
211
|
+
if (!sessionId) {
|
|
212
|
+
redirect('/login')
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
try {
|
|
216
|
+
await db.cart.upsert({
|
|
217
|
+
where: { sessionId_productId: { sessionId, productId } },
|
|
218
|
+
update: { quantity: { increment: 1 } },
|
|
219
|
+
create: { sessionId, productId, quantity: 1 },
|
|
220
|
+
})
|
|
221
|
+
|
|
222
|
+
revalidateTag('cart')
|
|
223
|
+
return { success: true }
|
|
224
|
+
} catch (error) {
|
|
225
|
+
return { error: 'Failed to add item to cart' }
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export async function checkout(formData: FormData) {
|
|
230
|
+
const address = formData.get('address') as string
|
|
231
|
+
const payment = formData.get('payment') as string
|
|
232
|
+
|
|
233
|
+
// Validate
|
|
234
|
+
if (!address || !payment) {
|
|
235
|
+
return { error: 'Missing required fields' }
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Process order
|
|
239
|
+
const order = await processOrder({ address, payment })
|
|
240
|
+
|
|
241
|
+
// Redirect to confirmation
|
|
242
|
+
redirect(`/orders/${order.id}/confirmation`)
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Pattern 4: Parallel Routes
|
|
247
|
+
|
|
248
|
+
```typescript
|
|
249
|
+
// app/dashboard/layout.tsx
|
|
250
|
+
export default function DashboardLayout({
|
|
251
|
+
children,
|
|
252
|
+
analytics,
|
|
253
|
+
team,
|
|
254
|
+
}: {
|
|
255
|
+
children: React.ReactNode
|
|
256
|
+
analytics: React.ReactNode
|
|
257
|
+
team: React.ReactNode
|
|
258
|
+
}) {
|
|
259
|
+
return (
|
|
260
|
+
<div className="dashboard-grid">
|
|
261
|
+
<main>{children}</main>
|
|
262
|
+
<aside className="analytics-panel">{analytics}</aside>
|
|
263
|
+
<aside className="team-panel">{team}</aside>
|
|
264
|
+
</div>
|
|
265
|
+
)
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// app/dashboard/@analytics/page.tsx
|
|
269
|
+
export default async function AnalyticsSlot() {
|
|
270
|
+
const stats = await getAnalytics()
|
|
271
|
+
return <AnalyticsChart data={stats} />
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// app/dashboard/@analytics/loading.tsx
|
|
275
|
+
export default function AnalyticsLoading() {
|
|
276
|
+
return <ChartSkeleton />
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// app/dashboard/@team/page.tsx
|
|
280
|
+
export default async function TeamSlot() {
|
|
281
|
+
const members = await getTeamMembers()
|
|
282
|
+
return <TeamList members={members} />
|
|
283
|
+
}
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Pattern 5: Intercepting Routes (Modal Pattern)
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
// File structure for photo modal
|
|
290
|
+
// app/
|
|
291
|
+
// ├── @modal/
|
|
292
|
+
// │ ├── (.)photos/[id]/page.tsx # Intercept
|
|
293
|
+
// │ └── default.tsx
|
|
294
|
+
// ├── photos/
|
|
295
|
+
// │ └── [id]/page.tsx # Full page
|
|
296
|
+
// └── layout.tsx
|
|
297
|
+
|
|
298
|
+
// app/@modal/(.)photos/[id]/page.tsx
|
|
299
|
+
import { Modal } from '@/components/Modal'
|
|
300
|
+
import { PhotoDetail } from '@/components/PhotoDetail'
|
|
301
|
+
|
|
302
|
+
export default async function PhotoModal({
|
|
303
|
+
params,
|
|
304
|
+
}: {
|
|
305
|
+
params: Promise<{ id: string }>
|
|
306
|
+
}) {
|
|
307
|
+
const { id } = await params
|
|
308
|
+
const photo = await getPhoto(id)
|
|
309
|
+
|
|
310
|
+
return (
|
|
311
|
+
<Modal>
|
|
312
|
+
<PhotoDetail photo={photo} />
|
|
313
|
+
</Modal>
|
|
314
|
+
)
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// app/photos/[id]/page.tsx - Full page version
|
|
318
|
+
export default async function PhotoPage({
|
|
319
|
+
params,
|
|
320
|
+
}: {
|
|
321
|
+
params: Promise<{ id: string }>
|
|
322
|
+
}) {
|
|
323
|
+
const { id } = await params
|
|
324
|
+
const photo = await getPhoto(id)
|
|
325
|
+
|
|
326
|
+
return (
|
|
327
|
+
<div className="photo-page">
|
|
328
|
+
<PhotoDetail photo={photo} />
|
|
329
|
+
<RelatedPhotos photoId={id} />
|
|
330
|
+
</div>
|
|
331
|
+
)
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// app/layout.tsx
|
|
335
|
+
export default function RootLayout({
|
|
336
|
+
children,
|
|
337
|
+
modal,
|
|
338
|
+
}: {
|
|
339
|
+
children: React.ReactNode
|
|
340
|
+
modal: React.ReactNode
|
|
341
|
+
}) {
|
|
342
|
+
return (
|
|
343
|
+
<html>
|
|
344
|
+
<body>
|
|
345
|
+
{children}
|
|
346
|
+
{modal}
|
|
347
|
+
</body>
|
|
348
|
+
</html>
|
|
349
|
+
)
|
|
350
|
+
}
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### Pattern 6: Streaming with Suspense
|
|
354
|
+
|
|
355
|
+
```typescript
|
|
356
|
+
// app/product/[id]/page.tsx
|
|
357
|
+
import { Suspense } from 'react'
|
|
358
|
+
|
|
359
|
+
export default async function ProductPage({
|
|
360
|
+
params,
|
|
361
|
+
}: {
|
|
362
|
+
params: Promise<{ id: string }>
|
|
363
|
+
}) {
|
|
364
|
+
const { id } = await params
|
|
365
|
+
|
|
366
|
+
// This data loads first (blocking)
|
|
367
|
+
const product = await getProduct(id)
|
|
368
|
+
|
|
369
|
+
return (
|
|
370
|
+
<div>
|
|
371
|
+
{/* Immediate render */}
|
|
372
|
+
<ProductHeader product={product} />
|
|
373
|
+
|
|
374
|
+
{/* Stream in reviews */}
|
|
375
|
+
<Suspense fallback={<ReviewsSkeleton />}>
|
|
376
|
+
<Reviews productId={id} />
|
|
377
|
+
</Suspense>
|
|
378
|
+
|
|
379
|
+
{/* Stream in recommendations */}
|
|
380
|
+
<Suspense fallback={<RecommendationsSkeleton />}>
|
|
381
|
+
<Recommendations productId={id} />
|
|
382
|
+
</Suspense>
|
|
383
|
+
</div>
|
|
384
|
+
)
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// These components fetch their own data
|
|
388
|
+
async function Reviews({ productId }: { productId: string }) {
|
|
389
|
+
const reviews = await getReviews(productId) // Slow API
|
|
390
|
+
return <ReviewList reviews={reviews} />
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
async function Recommendations({ productId }: { productId: string }) {
|
|
394
|
+
const products = await getRecommendations(productId) // ML-based, slow
|
|
395
|
+
return <ProductCarousel products={products} />
|
|
396
|
+
}
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
### Pattern 7: Route Handlers (API Routes)
|
|
400
|
+
|
|
401
|
+
```typescript
|
|
402
|
+
// app/api/products/route.ts
|
|
403
|
+
import { NextRequest, NextResponse } from 'next/server'
|
|
404
|
+
|
|
405
|
+
export async function GET(request: NextRequest) {
|
|
406
|
+
const searchParams = request.nextUrl.searchParams
|
|
407
|
+
const category = searchParams.get('category')
|
|
408
|
+
|
|
409
|
+
const products = await db.product.findMany({
|
|
410
|
+
where: category ? { category } : undefined,
|
|
411
|
+
take: 20,
|
|
412
|
+
})
|
|
413
|
+
|
|
414
|
+
return NextResponse.json(products)
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
export async function POST(request: NextRequest) {
|
|
418
|
+
const body = await request.json()
|
|
419
|
+
|
|
420
|
+
const product = await db.product.create({
|
|
421
|
+
data: body,
|
|
422
|
+
})
|
|
423
|
+
|
|
424
|
+
return NextResponse.json(product, { status: 201 })
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// app/api/products/[id]/route.ts
|
|
428
|
+
export async function GET(
|
|
429
|
+
request: NextRequest,
|
|
430
|
+
{ params }: { params: Promise<{ id: string }> }
|
|
431
|
+
) {
|
|
432
|
+
const { id } = await params
|
|
433
|
+
const product = await db.product.findUnique({ where: { id } })
|
|
434
|
+
|
|
435
|
+
if (!product) {
|
|
436
|
+
return NextResponse.json(
|
|
437
|
+
{ error: 'Product not found' },
|
|
438
|
+
{ status: 404 }
|
|
439
|
+
)
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
return NextResponse.json(product)
|
|
443
|
+
}
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
### Pattern 8: Metadata and SEO
|
|
447
|
+
|
|
448
|
+
```typescript
|
|
449
|
+
// app/products/[slug]/page.tsx
|
|
450
|
+
import { Metadata } from 'next'
|
|
451
|
+
import { notFound } from 'next/navigation'
|
|
452
|
+
|
|
453
|
+
type Props = {
|
|
454
|
+
params: Promise<{ slug: string }>
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
export async function generateMetadata({ params }: Props): Promise<Metadata> {
|
|
458
|
+
const { slug } = await params
|
|
459
|
+
const product = await getProduct(slug)
|
|
460
|
+
|
|
461
|
+
if (!product) return {}
|
|
462
|
+
|
|
463
|
+
return {
|
|
464
|
+
title: product.name,
|
|
465
|
+
description: product.description,
|
|
466
|
+
openGraph: {
|
|
467
|
+
title: product.name,
|
|
468
|
+
description: product.description,
|
|
469
|
+
images: [{ url: product.image, width: 1200, height: 630 }],
|
|
470
|
+
},
|
|
471
|
+
twitter: {
|
|
472
|
+
card: 'summary_large_image',
|
|
473
|
+
title: product.name,
|
|
474
|
+
description: product.description,
|
|
475
|
+
images: [product.image],
|
|
476
|
+
},
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
export async function generateStaticParams() {
|
|
481
|
+
const products = await db.product.findMany({ select: { slug: true } })
|
|
482
|
+
return products.map((p) => ({ slug: p.slug }))
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
export default async function ProductPage({ params }: Props) {
|
|
486
|
+
const { slug } = await params
|
|
487
|
+
const product = await getProduct(slug)
|
|
488
|
+
|
|
489
|
+
if (!product) notFound()
|
|
490
|
+
|
|
491
|
+
return <ProductDetail product={product} />
|
|
492
|
+
}
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
## Caching Strategies
|
|
496
|
+
|
|
497
|
+
### Data Cache
|
|
498
|
+
|
|
499
|
+
```typescript
|
|
500
|
+
// No cache (always fresh)
|
|
501
|
+
fetch(url, { cache: 'no-store' })
|
|
502
|
+
|
|
503
|
+
// Cache forever (static)
|
|
504
|
+
fetch(url, { cache: 'force-cache' })
|
|
505
|
+
|
|
506
|
+
// ISR - revalidate after 60 seconds
|
|
507
|
+
fetch(url, { next: { revalidate: 60 } })
|
|
508
|
+
|
|
509
|
+
// Tag-based invalidation
|
|
510
|
+
fetch(url, { next: { tags: ['products'] } })
|
|
511
|
+
|
|
512
|
+
// Invalidate via Server Action
|
|
513
|
+
'use server'
|
|
514
|
+
import { revalidateTag, revalidatePath } from 'next/cache'
|
|
515
|
+
|
|
516
|
+
export async function updateProduct(id: string, data: ProductData) {
|
|
517
|
+
await db.product.update({ where: { id }, data })
|
|
518
|
+
revalidateTag('products')
|
|
519
|
+
revalidatePath('/products')
|
|
520
|
+
}
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
## Best Practices
|
|
524
|
+
|
|
525
|
+
### Do's
|
|
526
|
+
- **Start with Server Components** - Add 'use client' only when needed
|
|
527
|
+
- **Colocate data fetching** - Fetch data where it's used
|
|
528
|
+
- **Use Suspense boundaries** - Enable streaming for slow data
|
|
529
|
+
- **Leverage parallel routes** - Independent loading states
|
|
530
|
+
- **Use Server Actions** - For mutations with progressive enhancement
|
|
531
|
+
|
|
532
|
+
### Don'ts
|
|
533
|
+
- **Don't pass serializable data** - Server → Client boundary limitations
|
|
534
|
+
- **Don't use hooks in Server Components** - No useState, useEffect
|
|
535
|
+
- **Don't fetch in Client Components** - Use Server Components or React Query
|
|
536
|
+
- **Don't over-nest layouts** - Each layout adds to the component tree
|
|
537
|
+
- **Don't ignore loading states** - Always provide loading.tsx or Suspense
|
|
538
|
+
|
|
539
|
+
## Resources
|
|
540
|
+
|
|
541
|
+
- [Next.js App Router Documentation](https://nextjs.org/docs/app)
|
|
542
|
+
- [Server Components RFC](https://github.com/reactjs/rfcs/blob/main/text/0188-server-components.md)
|
|
543
|
+
- [Vercel Templates](https://vercel.com/templates/next.js)
|