@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,566 @@
|
|
|
1
|
+
# FastAPI Project Templates Implementation Playbook
|
|
2
|
+
|
|
3
|
+
This file contains detailed patterns, checklists, and code samples referenced by the skill.
|
|
4
|
+
|
|
5
|
+
# FastAPI Project Templates
|
|
6
|
+
|
|
7
|
+
Production-ready FastAPI project structures with async patterns, dependency injection, middleware, and best practices for building high-performance APIs.
|
|
8
|
+
|
|
9
|
+
## When to Use This Skill
|
|
10
|
+
|
|
11
|
+
- Starting new FastAPI projects from scratch
|
|
12
|
+
- Implementing async REST APIs with Python
|
|
13
|
+
- Building high-performance web services and microservices
|
|
14
|
+
- Creating async applications with PostgreSQL, MongoDB
|
|
15
|
+
- Setting up API projects with proper structure and testing
|
|
16
|
+
|
|
17
|
+
## Core Concepts
|
|
18
|
+
|
|
19
|
+
### 1. Project Structure
|
|
20
|
+
|
|
21
|
+
**Recommended Layout:**
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
app/
|
|
25
|
+
├── api/ # API routes
|
|
26
|
+
│ ├── v1/
|
|
27
|
+
│ │ ├── endpoints/
|
|
28
|
+
│ │ │ ├── users.py
|
|
29
|
+
│ │ │ ├── auth.py
|
|
30
|
+
│ │ │ └── items.py
|
|
31
|
+
│ │ └── router.py
|
|
32
|
+
│ └── dependencies.py # Shared dependencies
|
|
33
|
+
├── core/ # Core configuration
|
|
34
|
+
│ ├── config.py
|
|
35
|
+
│ ├── security.py
|
|
36
|
+
│ └── database.py
|
|
37
|
+
├── models/ # Database models
|
|
38
|
+
│ ├── user.py
|
|
39
|
+
│ └── item.py
|
|
40
|
+
├── schemas/ # Pydantic schemas
|
|
41
|
+
│ ├── user.py
|
|
42
|
+
│ └── item.py
|
|
43
|
+
├── services/ # Business logic
|
|
44
|
+
│ ├── user_service.py
|
|
45
|
+
│ └── auth_service.py
|
|
46
|
+
├── repositories/ # Data access
|
|
47
|
+
│ ├── user_repository.py
|
|
48
|
+
│ └── item_repository.py
|
|
49
|
+
└── main.py # Application entry
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 2. Dependency Injection
|
|
53
|
+
|
|
54
|
+
FastAPI's built-in DI system using `Depends`:
|
|
55
|
+
|
|
56
|
+
- Database session management
|
|
57
|
+
- Authentication/authorization
|
|
58
|
+
- Shared business logic
|
|
59
|
+
- Configuration injection
|
|
60
|
+
|
|
61
|
+
### 3. Async Patterns
|
|
62
|
+
|
|
63
|
+
Proper async/await usage:
|
|
64
|
+
|
|
65
|
+
- Async route handlers
|
|
66
|
+
- Async database operations
|
|
67
|
+
- Async background tasks
|
|
68
|
+
- Async middleware
|
|
69
|
+
|
|
70
|
+
## Implementation Patterns
|
|
71
|
+
|
|
72
|
+
### Pattern 1: Complete FastAPI Application
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
# main.py
|
|
76
|
+
from fastapi import FastAPI, Depends
|
|
77
|
+
from fastapi.middleware.cors import CORSMiddleware
|
|
78
|
+
from contextlib import asynccontextmanager
|
|
79
|
+
|
|
80
|
+
@asynccontextmanager
|
|
81
|
+
async def lifespan(app: FastAPI):
|
|
82
|
+
"""Application lifespan events."""
|
|
83
|
+
# Startup
|
|
84
|
+
await database.connect()
|
|
85
|
+
yield
|
|
86
|
+
# Shutdown
|
|
87
|
+
await database.disconnect()
|
|
88
|
+
|
|
89
|
+
app = FastAPI(
|
|
90
|
+
title="API Template",
|
|
91
|
+
version="1.0.0",
|
|
92
|
+
lifespan=lifespan
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
# CORS middleware
|
|
96
|
+
app.add_middleware(
|
|
97
|
+
CORSMiddleware,
|
|
98
|
+
allow_origins=["*"],
|
|
99
|
+
allow_credentials=True,
|
|
100
|
+
allow_methods=["*"],
|
|
101
|
+
allow_headers=["*"],
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
# Include routers
|
|
105
|
+
from app.api.v1.router import api_router
|
|
106
|
+
app.include_router(api_router, prefix="/api/v1")
|
|
107
|
+
|
|
108
|
+
# core/config.py
|
|
109
|
+
from pydantic_settings import BaseSettings
|
|
110
|
+
from functools import lru_cache
|
|
111
|
+
|
|
112
|
+
class Settings(BaseSettings):
|
|
113
|
+
"""Application settings."""
|
|
114
|
+
DATABASE_URL: str
|
|
115
|
+
SECRET_KEY: str
|
|
116
|
+
ACCESS_TOKEN_EXPIRE_MINUTES: int = 30
|
|
117
|
+
API_V1_STR: str = "/api/v1"
|
|
118
|
+
|
|
119
|
+
class Config:
|
|
120
|
+
env_file = ".env"
|
|
121
|
+
|
|
122
|
+
@lru_cache()
|
|
123
|
+
def get_settings() -> Settings:
|
|
124
|
+
return Settings()
|
|
125
|
+
|
|
126
|
+
# core/database.py
|
|
127
|
+
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
|
|
128
|
+
from sqlalchemy.ext.declarative import declarative_base
|
|
129
|
+
from sqlalchemy.orm import sessionmaker
|
|
130
|
+
from app.core.config import get_settings
|
|
131
|
+
|
|
132
|
+
settings = get_settings()
|
|
133
|
+
|
|
134
|
+
engine = create_async_engine(
|
|
135
|
+
settings.DATABASE_URL,
|
|
136
|
+
echo=True,
|
|
137
|
+
future=True
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
AsyncSessionLocal = sessionmaker(
|
|
141
|
+
engine,
|
|
142
|
+
class_=AsyncSession,
|
|
143
|
+
expire_on_commit=False
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
Base = declarative_base()
|
|
147
|
+
|
|
148
|
+
async def get_db() -> AsyncSession:
|
|
149
|
+
"""Dependency for database session."""
|
|
150
|
+
async with AsyncSessionLocal() as session:
|
|
151
|
+
try:
|
|
152
|
+
yield session
|
|
153
|
+
await session.commit()
|
|
154
|
+
except Exception:
|
|
155
|
+
await session.rollback()
|
|
156
|
+
raise
|
|
157
|
+
finally:
|
|
158
|
+
await session.close()
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Pattern 2: CRUD Repository Pattern
|
|
162
|
+
|
|
163
|
+
```python
|
|
164
|
+
# repositories/base_repository.py
|
|
165
|
+
from typing import Generic, TypeVar, Type, Optional, List
|
|
166
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
167
|
+
from sqlalchemy import select
|
|
168
|
+
from pydantic import BaseModel
|
|
169
|
+
|
|
170
|
+
ModelType = TypeVar("ModelType")
|
|
171
|
+
CreateSchemaType = TypeVar("CreateSchemaType", bound=BaseModel)
|
|
172
|
+
UpdateSchemaType = TypeVar("UpdateSchemaType", bound=BaseModel)
|
|
173
|
+
|
|
174
|
+
class BaseRepository(Generic[ModelType, CreateSchemaType, UpdateSchemaType]):
|
|
175
|
+
"""Base repository for CRUD operations."""
|
|
176
|
+
|
|
177
|
+
def __init__(self, model: Type[ModelType]):
|
|
178
|
+
self.model = model
|
|
179
|
+
|
|
180
|
+
async def get(self, db: AsyncSession, id: int) -> Optional[ModelType]:
|
|
181
|
+
"""Get by ID."""
|
|
182
|
+
result = await db.execute(
|
|
183
|
+
select(self.model).where(self.model.id == id)
|
|
184
|
+
)
|
|
185
|
+
return result.scalars().first()
|
|
186
|
+
|
|
187
|
+
async def get_multi(
|
|
188
|
+
self,
|
|
189
|
+
db: AsyncSession,
|
|
190
|
+
skip: int = 0,
|
|
191
|
+
limit: int = 100
|
|
192
|
+
) -> List[ModelType]:
|
|
193
|
+
"""Get multiple records."""
|
|
194
|
+
result = await db.execute(
|
|
195
|
+
select(self.model).offset(skip).limit(limit)
|
|
196
|
+
)
|
|
197
|
+
return result.scalars().all()
|
|
198
|
+
|
|
199
|
+
async def create(
|
|
200
|
+
self,
|
|
201
|
+
db: AsyncSession,
|
|
202
|
+
obj_in: CreateSchemaType
|
|
203
|
+
) -> ModelType:
|
|
204
|
+
"""Create new record."""
|
|
205
|
+
db_obj = self.model(**obj_in.dict())
|
|
206
|
+
db.add(db_obj)
|
|
207
|
+
await db.flush()
|
|
208
|
+
await db.refresh(db_obj)
|
|
209
|
+
return db_obj
|
|
210
|
+
|
|
211
|
+
async def update(
|
|
212
|
+
self,
|
|
213
|
+
db: AsyncSession,
|
|
214
|
+
db_obj: ModelType,
|
|
215
|
+
obj_in: UpdateSchemaType
|
|
216
|
+
) -> ModelType:
|
|
217
|
+
"""Update record."""
|
|
218
|
+
update_data = obj_in.dict(exclude_unset=True)
|
|
219
|
+
for field, value in update_data.items():
|
|
220
|
+
setattr(db_obj, field, value)
|
|
221
|
+
await db.flush()
|
|
222
|
+
await db.refresh(db_obj)
|
|
223
|
+
return db_obj
|
|
224
|
+
|
|
225
|
+
async def delete(self, db: AsyncSession, id: int) -> bool:
|
|
226
|
+
"""Delete record."""
|
|
227
|
+
obj = await self.get(db, id)
|
|
228
|
+
if obj:
|
|
229
|
+
await db.delete(obj)
|
|
230
|
+
return True
|
|
231
|
+
return False
|
|
232
|
+
|
|
233
|
+
# repositories/user_repository.py
|
|
234
|
+
from app.repositories.base_repository import BaseRepository
|
|
235
|
+
from app.models.user import User
|
|
236
|
+
from app.schemas.user import UserCreate, UserUpdate
|
|
237
|
+
|
|
238
|
+
class UserRepository(BaseRepository[User, UserCreate, UserUpdate]):
|
|
239
|
+
"""User-specific repository."""
|
|
240
|
+
|
|
241
|
+
async def get_by_email(self, db: AsyncSession, email: str) -> Optional[User]:
|
|
242
|
+
"""Get user by email."""
|
|
243
|
+
result = await db.execute(
|
|
244
|
+
select(User).where(User.email == email)
|
|
245
|
+
)
|
|
246
|
+
return result.scalars().first()
|
|
247
|
+
|
|
248
|
+
async def is_active(self, db: AsyncSession, user_id: int) -> bool:
|
|
249
|
+
"""Check if user is active."""
|
|
250
|
+
user = await self.get(db, user_id)
|
|
251
|
+
return user.is_active if user else False
|
|
252
|
+
|
|
253
|
+
user_repository = UserRepository(User)
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### Pattern 3: Service Layer
|
|
257
|
+
|
|
258
|
+
```python
|
|
259
|
+
# services/user_service.py
|
|
260
|
+
from typing import Optional
|
|
261
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
262
|
+
from app.repositories.user_repository import user_repository
|
|
263
|
+
from app.schemas.user import UserCreate, UserUpdate, User
|
|
264
|
+
from app.core.security import get_password_hash, verify_password
|
|
265
|
+
|
|
266
|
+
class UserService:
|
|
267
|
+
"""Business logic for users."""
|
|
268
|
+
|
|
269
|
+
def __init__(self):
|
|
270
|
+
self.repository = user_repository
|
|
271
|
+
|
|
272
|
+
async def create_user(
|
|
273
|
+
self,
|
|
274
|
+
db: AsyncSession,
|
|
275
|
+
user_in: UserCreate
|
|
276
|
+
) -> User:
|
|
277
|
+
"""Create new user with hashed password."""
|
|
278
|
+
# Check if email exists
|
|
279
|
+
existing = await self.repository.get_by_email(db, user_in.email)
|
|
280
|
+
if existing:
|
|
281
|
+
raise ValueError("Email already registered")
|
|
282
|
+
|
|
283
|
+
# Hash password
|
|
284
|
+
user_in_dict = user_in.dict()
|
|
285
|
+
user_in_dict["hashed_password"] = get_password_hash(user_in_dict.pop("password"))
|
|
286
|
+
|
|
287
|
+
# Create user
|
|
288
|
+
user = await self.repository.create(db, UserCreate(**user_in_dict))
|
|
289
|
+
return user
|
|
290
|
+
|
|
291
|
+
async def authenticate(
|
|
292
|
+
self,
|
|
293
|
+
db: AsyncSession,
|
|
294
|
+
email: str,
|
|
295
|
+
password: str
|
|
296
|
+
) -> Optional[User]:
|
|
297
|
+
"""Authenticate user."""
|
|
298
|
+
user = await self.repository.get_by_email(db, email)
|
|
299
|
+
if not user:
|
|
300
|
+
return None
|
|
301
|
+
if not verify_password(password, user.hashed_password):
|
|
302
|
+
return None
|
|
303
|
+
return user
|
|
304
|
+
|
|
305
|
+
async def update_user(
|
|
306
|
+
self,
|
|
307
|
+
db: AsyncSession,
|
|
308
|
+
user_id: int,
|
|
309
|
+
user_in: UserUpdate
|
|
310
|
+
) -> Optional[User]:
|
|
311
|
+
"""Update user."""
|
|
312
|
+
user = await self.repository.get(db, user_id)
|
|
313
|
+
if not user:
|
|
314
|
+
return None
|
|
315
|
+
|
|
316
|
+
if user_in.password:
|
|
317
|
+
user_in_dict = user_in.dict(exclude_unset=True)
|
|
318
|
+
user_in_dict["hashed_password"] = get_password_hash(
|
|
319
|
+
user_in_dict.pop("password")
|
|
320
|
+
)
|
|
321
|
+
user_in = UserUpdate(**user_in_dict)
|
|
322
|
+
|
|
323
|
+
return await self.repository.update(db, user, user_in)
|
|
324
|
+
|
|
325
|
+
user_service = UserService()
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### Pattern 4: API Endpoints with Dependencies
|
|
329
|
+
|
|
330
|
+
```python
|
|
331
|
+
# api/v1/endpoints/users.py
|
|
332
|
+
from fastapi import APIRouter, Depends, HTTPException, status
|
|
333
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
334
|
+
from typing import List
|
|
335
|
+
|
|
336
|
+
from app.core.database import get_db
|
|
337
|
+
from app.schemas.user import User, UserCreate, UserUpdate
|
|
338
|
+
from app.services.user_service import user_service
|
|
339
|
+
from app.api.dependencies import get_current_user
|
|
340
|
+
|
|
341
|
+
router = APIRouter()
|
|
342
|
+
|
|
343
|
+
@router.post("/", response_model=User, status_code=status.HTTP_201_CREATED)
|
|
344
|
+
async def create_user(
|
|
345
|
+
user_in: UserCreate,
|
|
346
|
+
db: AsyncSession = Depends(get_db)
|
|
347
|
+
):
|
|
348
|
+
"""Create new user."""
|
|
349
|
+
try:
|
|
350
|
+
user = await user_service.create_user(db, user_in)
|
|
351
|
+
return user
|
|
352
|
+
except ValueError as e:
|
|
353
|
+
raise HTTPException(status_code=400, detail=str(e))
|
|
354
|
+
|
|
355
|
+
@router.get("/me", response_model=User)
|
|
356
|
+
async def read_current_user(
|
|
357
|
+
current_user: User = Depends(get_current_user)
|
|
358
|
+
):
|
|
359
|
+
"""Get current user."""
|
|
360
|
+
return current_user
|
|
361
|
+
|
|
362
|
+
@router.get("/{user_id}", response_model=User)
|
|
363
|
+
async def read_user(
|
|
364
|
+
user_id: int,
|
|
365
|
+
db: AsyncSession = Depends(get_db),
|
|
366
|
+
current_user: User = Depends(get_current_user)
|
|
367
|
+
):
|
|
368
|
+
"""Get user by ID."""
|
|
369
|
+
user = await user_service.repository.get(db, user_id)
|
|
370
|
+
if not user:
|
|
371
|
+
raise HTTPException(status_code=404, detail="User not found")
|
|
372
|
+
return user
|
|
373
|
+
|
|
374
|
+
@router.patch("/{user_id}", response_model=User)
|
|
375
|
+
async def update_user(
|
|
376
|
+
user_id: int,
|
|
377
|
+
user_in: UserUpdate,
|
|
378
|
+
db: AsyncSession = Depends(get_db),
|
|
379
|
+
current_user: User = Depends(get_current_user)
|
|
380
|
+
):
|
|
381
|
+
"""Update user."""
|
|
382
|
+
if current_user.id != user_id:
|
|
383
|
+
raise HTTPException(status_code=403, detail="Not authorized")
|
|
384
|
+
|
|
385
|
+
user = await user_service.update_user(db, user_id, user_in)
|
|
386
|
+
if not user:
|
|
387
|
+
raise HTTPException(status_code=404, detail="User not found")
|
|
388
|
+
return user
|
|
389
|
+
|
|
390
|
+
@router.delete("/{user_id}", status_code=status.HTTP_204_NO_CONTENT)
|
|
391
|
+
async def delete_user(
|
|
392
|
+
user_id: int,
|
|
393
|
+
db: AsyncSession = Depends(get_db),
|
|
394
|
+
current_user: User = Depends(get_current_user)
|
|
395
|
+
):
|
|
396
|
+
"""Delete user."""
|
|
397
|
+
if current_user.id != user_id:
|
|
398
|
+
raise HTTPException(status_code=403, detail="Not authorized")
|
|
399
|
+
|
|
400
|
+
deleted = await user_service.repository.delete(db, user_id)
|
|
401
|
+
if not deleted:
|
|
402
|
+
raise HTTPException(status_code=404, detail="User not found")
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### Pattern 5: Authentication & Authorization
|
|
406
|
+
|
|
407
|
+
```python
|
|
408
|
+
# core/security.py
|
|
409
|
+
from datetime import datetime, timedelta
|
|
410
|
+
from typing import Optional
|
|
411
|
+
from jose import JWTError, jwt
|
|
412
|
+
from passlib.context import CryptContext
|
|
413
|
+
from app.core.config import get_settings
|
|
414
|
+
|
|
415
|
+
settings = get_settings()
|
|
416
|
+
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
|
|
417
|
+
|
|
418
|
+
ALGORITHM = "HS256"
|
|
419
|
+
|
|
420
|
+
def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
|
|
421
|
+
"""Create JWT access token."""
|
|
422
|
+
to_encode = data.copy()
|
|
423
|
+
if expires_delta:
|
|
424
|
+
expire = datetime.utcnow() + expires_delta
|
|
425
|
+
else:
|
|
426
|
+
expire = datetime.utcnow() + timedelta(minutes=15)
|
|
427
|
+
to_encode.update({"exp": expire})
|
|
428
|
+
encoded_jwt = jwt.encode(to_encode, settings.SECRET_KEY, algorithm=ALGORITHM)
|
|
429
|
+
return encoded_jwt
|
|
430
|
+
|
|
431
|
+
def verify_password(plain_password: str, hashed_password: str) -> bool:
|
|
432
|
+
"""Verify password against hash."""
|
|
433
|
+
return pwd_context.verify(plain_password, hashed_password)
|
|
434
|
+
|
|
435
|
+
def get_password_hash(password: str) -> str:
|
|
436
|
+
"""Hash password."""
|
|
437
|
+
return pwd_context.hash(password)
|
|
438
|
+
|
|
439
|
+
# api/dependencies.py
|
|
440
|
+
from fastapi import Depends, HTTPException, status
|
|
441
|
+
from fastapi.security import OAuth2PasswordBearer
|
|
442
|
+
from jose import JWTError, jwt
|
|
443
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
444
|
+
|
|
445
|
+
from app.core.database import get_db
|
|
446
|
+
from app.core.security import ALGORITHM
|
|
447
|
+
from app.core.config import get_settings
|
|
448
|
+
from app.repositories.user_repository import user_repository
|
|
449
|
+
|
|
450
|
+
oauth2_scheme = OAuth2PasswordBearer(tokenUrl=f"{settings.API_V1_STR}/auth/login")
|
|
451
|
+
|
|
452
|
+
async def get_current_user(
|
|
453
|
+
db: AsyncSession = Depends(get_db),
|
|
454
|
+
token: str = Depends(oauth2_scheme)
|
|
455
|
+
):
|
|
456
|
+
"""Get current authenticated user."""
|
|
457
|
+
credentials_exception = HTTPException(
|
|
458
|
+
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
459
|
+
detail="Could not validate credentials",
|
|
460
|
+
headers={"WWW-Authenticate": "Bearer"},
|
|
461
|
+
)
|
|
462
|
+
|
|
463
|
+
try:
|
|
464
|
+
payload = jwt.decode(token, settings.SECRET_KEY, algorithms=[ALGORITHM])
|
|
465
|
+
user_id: int = payload.get("sub")
|
|
466
|
+
if user_id is None:
|
|
467
|
+
raise credentials_exception
|
|
468
|
+
except JWTError:
|
|
469
|
+
raise credentials_exception
|
|
470
|
+
|
|
471
|
+
user = await user_repository.get(db, user_id)
|
|
472
|
+
if user is None:
|
|
473
|
+
raise credentials_exception
|
|
474
|
+
|
|
475
|
+
return user
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
## Testing
|
|
479
|
+
|
|
480
|
+
```python
|
|
481
|
+
# tests/conftest.py
|
|
482
|
+
import pytest
|
|
483
|
+
import asyncio
|
|
484
|
+
from httpx import AsyncClient
|
|
485
|
+
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
|
|
486
|
+
from sqlalchemy.orm import sessionmaker
|
|
487
|
+
|
|
488
|
+
from app.main import app
|
|
489
|
+
from app.core.database import get_db, Base
|
|
490
|
+
|
|
491
|
+
TEST_DATABASE_URL = "sqlite+aiosqlite:///:memory:"
|
|
492
|
+
|
|
493
|
+
@pytest.fixture(scope="session")
|
|
494
|
+
def event_loop():
|
|
495
|
+
loop = asyncio.get_event_loop_policy().new_event_loop()
|
|
496
|
+
yield loop
|
|
497
|
+
loop.close()
|
|
498
|
+
|
|
499
|
+
@pytest.fixture
|
|
500
|
+
async def db_session():
|
|
501
|
+
engine = create_async_engine(TEST_DATABASE_URL, echo=True)
|
|
502
|
+
async with engine.begin() as conn:
|
|
503
|
+
await conn.run_sync(Base.metadata.create_all)
|
|
504
|
+
|
|
505
|
+
AsyncSessionLocal = sessionmaker(
|
|
506
|
+
engine, class_=AsyncSession, expire_on_commit=False
|
|
507
|
+
)
|
|
508
|
+
|
|
509
|
+
async with AsyncSessionLocal() as session:
|
|
510
|
+
yield session
|
|
511
|
+
|
|
512
|
+
@pytest.fixture
|
|
513
|
+
async def client(db_session):
|
|
514
|
+
async def override_get_db():
|
|
515
|
+
yield db_session
|
|
516
|
+
|
|
517
|
+
app.dependency_overrides[get_db] = override_get_db
|
|
518
|
+
|
|
519
|
+
async with AsyncClient(app=app, base_url="http://test") as client:
|
|
520
|
+
yield client
|
|
521
|
+
|
|
522
|
+
# tests/test_users.py
|
|
523
|
+
import pytest
|
|
524
|
+
|
|
525
|
+
@pytest.mark.asyncio
|
|
526
|
+
async def test_create_user(client):
|
|
527
|
+
response = await client.post(
|
|
528
|
+
"/api/v1/users/",
|
|
529
|
+
json={
|
|
530
|
+
"email": "test@example.com",
|
|
531
|
+
"password": "testpass123",
|
|
532
|
+
"name": "Test User"
|
|
533
|
+
}
|
|
534
|
+
)
|
|
535
|
+
assert response.status_code == 201
|
|
536
|
+
data = response.json()
|
|
537
|
+
assert data["email"] == "test@example.com"
|
|
538
|
+
assert "id" in data
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
## Resources
|
|
542
|
+
|
|
543
|
+
- **references/fastapi-architecture.md**: Detailed architecture guide
|
|
544
|
+
- **references/async-best-practices.md**: Async/await patterns
|
|
545
|
+
- **references/testing-strategies.md**: Comprehensive testing guide
|
|
546
|
+
- **assets/project-template/**: Complete FastAPI project
|
|
547
|
+
- **assets/docker-compose.yml**: Development environment setup
|
|
548
|
+
|
|
549
|
+
## Best Practices
|
|
550
|
+
|
|
551
|
+
1. **Async All The Way**: Use async for database, external APIs
|
|
552
|
+
2. **Dependency Injection**: Leverage FastAPI's DI system
|
|
553
|
+
3. **Repository Pattern**: Separate data access from business logic
|
|
554
|
+
4. **Service Layer**: Keep business logic out of routes
|
|
555
|
+
5. **Pydantic Schemas**: Strong typing for request/response
|
|
556
|
+
6. **Error Handling**: Consistent error responses
|
|
557
|
+
7. **Testing**: Test all layers independently
|
|
558
|
+
|
|
559
|
+
## Common Pitfalls
|
|
560
|
+
|
|
561
|
+
- **Blocking Code in Async**: Using synchronous database drivers
|
|
562
|
+
- **No Service Layer**: Business logic in route handlers
|
|
563
|
+
- **Missing Type Hints**: Loses FastAPI's benefits
|
|
564
|
+
- **Ignoring Sessions**: Not properly managing database sessions
|
|
565
|
+
- **No Testing**: Skipping integration tests
|
|
566
|
+
- **Tight Coupling**: Direct database access in routes
|