@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,523 @@
|
|
|
1
|
+
// Repository Implementation Template for .NET 8+
|
|
2
|
+
// Demonstrates both Dapper (performance) and EF Core (convenience) patterns
|
|
3
|
+
|
|
4
|
+
using System.Data;
|
|
5
|
+
using Dapper;
|
|
6
|
+
using Microsoft.Data.SqlClient;
|
|
7
|
+
using Microsoft.EntityFrameworkCore;
|
|
8
|
+
using Microsoft.Extensions.Logging;
|
|
9
|
+
|
|
10
|
+
namespace YourNamespace.Infrastructure.Data;
|
|
11
|
+
|
|
12
|
+
#region Interfaces
|
|
13
|
+
|
|
14
|
+
public interface IProductRepository
|
|
15
|
+
{
|
|
16
|
+
Task<Product?> GetByIdAsync(string id, CancellationToken ct = default);
|
|
17
|
+
Task<Product?> GetBySkuAsync(string sku, CancellationToken ct = default);
|
|
18
|
+
Task<(IReadOnlyList<Product> Items, int TotalCount)> SearchAsync(ProductSearchRequest request, CancellationToken ct = default);
|
|
19
|
+
Task<Product> CreateAsync(Product product, CancellationToken ct = default);
|
|
20
|
+
Task<Product> UpdateAsync(Product product, CancellationToken ct = default);
|
|
21
|
+
Task DeleteAsync(string id, CancellationToken ct = default);
|
|
22
|
+
Task<IReadOnlyList<Product>> GetByIdsAsync(IEnumerable<string> ids, CancellationToken ct = default);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
#endregion
|
|
26
|
+
|
|
27
|
+
#region Dapper Implementation (High Performance)
|
|
28
|
+
|
|
29
|
+
public class DapperProductRepository : IProductRepository
|
|
30
|
+
{
|
|
31
|
+
private readonly IDbConnection _connection;
|
|
32
|
+
private readonly ILogger<DapperProductRepository> _logger;
|
|
33
|
+
|
|
34
|
+
public DapperProductRepository(
|
|
35
|
+
IDbConnection connection,
|
|
36
|
+
ILogger<DapperProductRepository> logger)
|
|
37
|
+
{
|
|
38
|
+
_connection = connection;
|
|
39
|
+
_logger = logger;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public async Task<Product?> GetByIdAsync(string id, CancellationToken ct = default)
|
|
43
|
+
{
|
|
44
|
+
const string sql = """
|
|
45
|
+
SELECT Id, Name, Sku, Price, CategoryId, Stock, CreatedAt, UpdatedAt
|
|
46
|
+
FROM Products
|
|
47
|
+
WHERE Id = @Id AND IsDeleted = 0
|
|
48
|
+
""";
|
|
49
|
+
|
|
50
|
+
return await _connection.QueryFirstOrDefaultAsync<Product>(
|
|
51
|
+
new CommandDefinition(sql, new { Id = id }, cancellationToken: ct));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public async Task<Product?> GetBySkuAsync(string sku, CancellationToken ct = default)
|
|
55
|
+
{
|
|
56
|
+
const string sql = """
|
|
57
|
+
SELECT Id, Name, Sku, Price, CategoryId, Stock, CreatedAt, UpdatedAt
|
|
58
|
+
FROM Products
|
|
59
|
+
WHERE Sku = @Sku AND IsDeleted = 0
|
|
60
|
+
""";
|
|
61
|
+
|
|
62
|
+
return await _connection.QueryFirstOrDefaultAsync<Product>(
|
|
63
|
+
new CommandDefinition(sql, new { Sku = sku }, cancellationToken: ct));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public async Task<(IReadOnlyList<Product> Items, int TotalCount)> SearchAsync(
|
|
67
|
+
ProductSearchRequest request,
|
|
68
|
+
CancellationToken ct = default)
|
|
69
|
+
{
|
|
70
|
+
var whereClauses = new List<string> { "IsDeleted = 0" };
|
|
71
|
+
var parameters = new DynamicParameters();
|
|
72
|
+
|
|
73
|
+
// Build dynamic WHERE clause
|
|
74
|
+
if (!string.IsNullOrWhiteSpace(request.SearchTerm))
|
|
75
|
+
{
|
|
76
|
+
whereClauses.Add("(Name LIKE @SearchTerm OR Sku LIKE @SearchTerm)");
|
|
77
|
+
parameters.Add("SearchTerm", $"%{request.SearchTerm}%");
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (request.CategoryId.HasValue)
|
|
81
|
+
{
|
|
82
|
+
whereClauses.Add("CategoryId = @CategoryId");
|
|
83
|
+
parameters.Add("CategoryId", request.CategoryId.Value);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (request.MinPrice.HasValue)
|
|
87
|
+
{
|
|
88
|
+
whereClauses.Add("Price >= @MinPrice");
|
|
89
|
+
parameters.Add("MinPrice", request.MinPrice.Value);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (request.MaxPrice.HasValue)
|
|
93
|
+
{
|
|
94
|
+
whereClauses.Add("Price <= @MaxPrice");
|
|
95
|
+
parameters.Add("MaxPrice", request.MaxPrice.Value);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
var whereClause = string.Join(" AND ", whereClauses);
|
|
99
|
+
var page = request.Page ?? 1;
|
|
100
|
+
var pageSize = request.PageSize ?? 50;
|
|
101
|
+
var offset = (page - 1) * pageSize;
|
|
102
|
+
|
|
103
|
+
parameters.Add("Offset", offset);
|
|
104
|
+
parameters.Add("PageSize", pageSize);
|
|
105
|
+
|
|
106
|
+
// Use multi-query for count + data in single roundtrip
|
|
107
|
+
var sql = $"""
|
|
108
|
+
-- Count query
|
|
109
|
+
SELECT COUNT(*) FROM Products WHERE {whereClause};
|
|
110
|
+
|
|
111
|
+
-- Data query with pagination
|
|
112
|
+
SELECT Id, Name, Sku, Price, CategoryId, Stock, CreatedAt, UpdatedAt
|
|
113
|
+
FROM Products
|
|
114
|
+
WHERE {whereClause}
|
|
115
|
+
ORDER BY Name
|
|
116
|
+
OFFSET @Offset ROWS FETCH NEXT @PageSize ROWS ONLY;
|
|
117
|
+
""";
|
|
118
|
+
|
|
119
|
+
using var multi = await _connection.QueryMultipleAsync(
|
|
120
|
+
new CommandDefinition(sql, parameters, cancellationToken: ct));
|
|
121
|
+
|
|
122
|
+
var totalCount = await multi.ReadSingleAsync<int>();
|
|
123
|
+
var items = (await multi.ReadAsync<Product>()).ToList();
|
|
124
|
+
|
|
125
|
+
return (items, totalCount);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
public async Task<Product> CreateAsync(Product product, CancellationToken ct = default)
|
|
129
|
+
{
|
|
130
|
+
const string sql = """
|
|
131
|
+
INSERT INTO Products (Id, Name, Sku, Price, CategoryId, Stock, CreatedAt, IsDeleted)
|
|
132
|
+
VALUES (@Id, @Name, @Sku, @Price, @CategoryId, @Stock, @CreatedAt, 0);
|
|
133
|
+
|
|
134
|
+
SELECT Id, Name, Sku, Price, CategoryId, Stock, CreatedAt, UpdatedAt
|
|
135
|
+
FROM Products WHERE Id = @Id;
|
|
136
|
+
""";
|
|
137
|
+
|
|
138
|
+
return await _connection.QuerySingleAsync<Product>(
|
|
139
|
+
new CommandDefinition(sql, product, cancellationToken: ct));
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
public async Task<Product> UpdateAsync(Product product, CancellationToken ct = default)
|
|
143
|
+
{
|
|
144
|
+
const string sql = """
|
|
145
|
+
UPDATE Products
|
|
146
|
+
SET Name = @Name,
|
|
147
|
+
Sku = @Sku,
|
|
148
|
+
Price = @Price,
|
|
149
|
+
CategoryId = @CategoryId,
|
|
150
|
+
Stock = @Stock,
|
|
151
|
+
UpdatedAt = @UpdatedAt
|
|
152
|
+
WHERE Id = @Id AND IsDeleted = 0;
|
|
153
|
+
|
|
154
|
+
SELECT Id, Name, Sku, Price, CategoryId, Stock, CreatedAt, UpdatedAt
|
|
155
|
+
FROM Products WHERE Id = @Id;
|
|
156
|
+
""";
|
|
157
|
+
|
|
158
|
+
return await _connection.QuerySingleAsync<Product>(
|
|
159
|
+
new CommandDefinition(sql, product, cancellationToken: ct));
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
public async Task DeleteAsync(string id, CancellationToken ct = default)
|
|
163
|
+
{
|
|
164
|
+
const string sql = """
|
|
165
|
+
UPDATE Products
|
|
166
|
+
SET IsDeleted = 1, UpdatedAt = @UpdatedAt
|
|
167
|
+
WHERE Id = @Id
|
|
168
|
+
""";
|
|
169
|
+
|
|
170
|
+
await _connection.ExecuteAsync(
|
|
171
|
+
new CommandDefinition(sql, new { Id = id, UpdatedAt = DateTime.UtcNow }, cancellationToken: ct));
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
public async Task<IReadOnlyList<Product>> GetByIdsAsync(
|
|
175
|
+
IEnumerable<string> ids,
|
|
176
|
+
CancellationToken ct = default)
|
|
177
|
+
{
|
|
178
|
+
var idList = ids.ToList();
|
|
179
|
+
if (idList.Count == 0)
|
|
180
|
+
return Array.Empty<Product>();
|
|
181
|
+
|
|
182
|
+
const string sql = """
|
|
183
|
+
SELECT Id, Name, Sku, Price, CategoryId, Stock, CreatedAt, UpdatedAt
|
|
184
|
+
FROM Products
|
|
185
|
+
WHERE Id IN @Ids AND IsDeleted = 0
|
|
186
|
+
""";
|
|
187
|
+
|
|
188
|
+
var results = await _connection.QueryAsync<Product>(
|
|
189
|
+
new CommandDefinition(sql, new { Ids = idList }, cancellationToken: ct));
|
|
190
|
+
|
|
191
|
+
return results.ToList();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
#endregion
|
|
196
|
+
|
|
197
|
+
#region EF Core Implementation (Rich Domain Models)
|
|
198
|
+
|
|
199
|
+
public class EfCoreProductRepository : IProductRepository
|
|
200
|
+
{
|
|
201
|
+
private readonly AppDbContext _context;
|
|
202
|
+
private readonly ILogger<EfCoreProductRepository> _logger;
|
|
203
|
+
|
|
204
|
+
public EfCoreProductRepository(
|
|
205
|
+
AppDbContext context,
|
|
206
|
+
ILogger<EfCoreProductRepository> logger)
|
|
207
|
+
{
|
|
208
|
+
_context = context;
|
|
209
|
+
_logger = logger;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
public async Task<Product?> GetByIdAsync(string id, CancellationToken ct = default)
|
|
213
|
+
{
|
|
214
|
+
return await _context.Products
|
|
215
|
+
.AsNoTracking()
|
|
216
|
+
.FirstOrDefaultAsync(p => p.Id == id, ct);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
public async Task<Product?> GetBySkuAsync(string sku, CancellationToken ct = default)
|
|
220
|
+
{
|
|
221
|
+
return await _context.Products
|
|
222
|
+
.AsNoTracking()
|
|
223
|
+
.FirstOrDefaultAsync(p => p.Sku == sku, ct);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
public async Task<(IReadOnlyList<Product> Items, int TotalCount)> SearchAsync(
|
|
227
|
+
ProductSearchRequest request,
|
|
228
|
+
CancellationToken ct = default)
|
|
229
|
+
{
|
|
230
|
+
var query = _context.Products.AsNoTracking();
|
|
231
|
+
|
|
232
|
+
// Apply filters
|
|
233
|
+
if (!string.IsNullOrWhiteSpace(request.SearchTerm))
|
|
234
|
+
{
|
|
235
|
+
var term = request.SearchTerm.ToLower();
|
|
236
|
+
query = query.Where(p =>
|
|
237
|
+
p.Name.ToLower().Contains(term) ||
|
|
238
|
+
p.Sku.ToLower().Contains(term));
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
if (request.CategoryId.HasValue)
|
|
242
|
+
query = query.Where(p => p.CategoryId == request.CategoryId.Value);
|
|
243
|
+
|
|
244
|
+
if (request.MinPrice.HasValue)
|
|
245
|
+
query = query.Where(p => p.Price >= request.MinPrice.Value);
|
|
246
|
+
|
|
247
|
+
if (request.MaxPrice.HasValue)
|
|
248
|
+
query = query.Where(p => p.Price <= request.MaxPrice.Value);
|
|
249
|
+
|
|
250
|
+
// Get count before pagination
|
|
251
|
+
var totalCount = await query.CountAsync(ct);
|
|
252
|
+
|
|
253
|
+
// Apply pagination
|
|
254
|
+
var page = request.Page ?? 1;
|
|
255
|
+
var pageSize = request.PageSize ?? 50;
|
|
256
|
+
|
|
257
|
+
var items = await query
|
|
258
|
+
.OrderBy(p => p.Name)
|
|
259
|
+
.Skip((page - 1) * pageSize)
|
|
260
|
+
.Take(pageSize)
|
|
261
|
+
.ToListAsync(ct);
|
|
262
|
+
|
|
263
|
+
return (items, totalCount);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
public async Task<Product> CreateAsync(Product product, CancellationToken ct = default)
|
|
267
|
+
{
|
|
268
|
+
_context.Products.Add(product);
|
|
269
|
+
await _context.SaveChangesAsync(ct);
|
|
270
|
+
return product;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
public async Task<Product> UpdateAsync(Product product, CancellationToken ct = default)
|
|
274
|
+
{
|
|
275
|
+
_context.Products.Update(product);
|
|
276
|
+
await _context.SaveChangesAsync(ct);
|
|
277
|
+
return product;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
public async Task DeleteAsync(string id, CancellationToken ct = default)
|
|
281
|
+
{
|
|
282
|
+
var product = await _context.Products.FindAsync(new object[] { id }, ct);
|
|
283
|
+
if (product != null)
|
|
284
|
+
{
|
|
285
|
+
product.IsDeleted = true;
|
|
286
|
+
product.UpdatedAt = DateTime.UtcNow;
|
|
287
|
+
await _context.SaveChangesAsync(ct);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
public async Task<IReadOnlyList<Product>> GetByIdsAsync(
|
|
292
|
+
IEnumerable<string> ids,
|
|
293
|
+
CancellationToken ct = default)
|
|
294
|
+
{
|
|
295
|
+
var idList = ids.ToList();
|
|
296
|
+
if (idList.Count == 0)
|
|
297
|
+
return Array.Empty<Product>();
|
|
298
|
+
|
|
299
|
+
return await _context.Products
|
|
300
|
+
.AsNoTracking()
|
|
301
|
+
.Where(p => idList.Contains(p.Id))
|
|
302
|
+
.ToListAsync(ct);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
#endregion
|
|
307
|
+
|
|
308
|
+
#region DbContext Configuration
|
|
309
|
+
|
|
310
|
+
public class AppDbContext : DbContext
|
|
311
|
+
{
|
|
312
|
+
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
|
|
313
|
+
|
|
314
|
+
public DbSet<Product> Products => Set<Product>();
|
|
315
|
+
public DbSet<Category> Categories => Set<Category>();
|
|
316
|
+
public DbSet<Order> Orders => Set<Order>();
|
|
317
|
+
public DbSet<OrderItem> OrderItems => Set<OrderItem>();
|
|
318
|
+
|
|
319
|
+
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
|
320
|
+
{
|
|
321
|
+
// Apply all configurations from assembly
|
|
322
|
+
modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly);
|
|
323
|
+
|
|
324
|
+
// Global query filter for soft delete
|
|
325
|
+
modelBuilder.Entity<Product>().HasQueryFilter(p => !p.IsDeleted);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
public class ProductConfiguration : IEntityTypeConfiguration<Product>
|
|
330
|
+
{
|
|
331
|
+
public void Configure(EntityTypeBuilder<Product> builder)
|
|
332
|
+
{
|
|
333
|
+
builder.ToTable("Products");
|
|
334
|
+
|
|
335
|
+
builder.HasKey(p => p.Id);
|
|
336
|
+
builder.Property(p => p.Id).HasMaxLength(40);
|
|
337
|
+
|
|
338
|
+
builder.Property(p => p.Name)
|
|
339
|
+
.HasMaxLength(200)
|
|
340
|
+
.IsRequired();
|
|
341
|
+
|
|
342
|
+
builder.Property(p => p.Sku)
|
|
343
|
+
.HasMaxLength(50)
|
|
344
|
+
.IsRequired();
|
|
345
|
+
|
|
346
|
+
builder.Property(p => p.Price)
|
|
347
|
+
.HasPrecision(18, 2);
|
|
348
|
+
|
|
349
|
+
// Indexes
|
|
350
|
+
builder.HasIndex(p => p.Sku).IsUnique();
|
|
351
|
+
builder.HasIndex(p => p.CategoryId);
|
|
352
|
+
builder.HasIndex(p => new { p.CategoryId, p.Name });
|
|
353
|
+
|
|
354
|
+
// Relationships
|
|
355
|
+
builder.HasOne(p => p.Category)
|
|
356
|
+
.WithMany(c => c.Products)
|
|
357
|
+
.HasForeignKey(p => p.CategoryId);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
#endregion
|
|
362
|
+
|
|
363
|
+
#region Advanced Patterns
|
|
364
|
+
|
|
365
|
+
/// <summary>
|
|
366
|
+
/// Unit of Work pattern for coordinating multiple repositories
|
|
367
|
+
/// </summary>
|
|
368
|
+
public interface IUnitOfWork : IDisposable
|
|
369
|
+
{
|
|
370
|
+
IProductRepository Products { get; }
|
|
371
|
+
IOrderRepository Orders { get; }
|
|
372
|
+
Task<int> SaveChangesAsync(CancellationToken ct = default);
|
|
373
|
+
Task BeginTransactionAsync(CancellationToken ct = default);
|
|
374
|
+
Task CommitAsync(CancellationToken ct = default);
|
|
375
|
+
Task RollbackAsync(CancellationToken ct = default);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
public class UnitOfWork : IUnitOfWork
|
|
379
|
+
{
|
|
380
|
+
private readonly AppDbContext _context;
|
|
381
|
+
private IDbContextTransaction? _transaction;
|
|
382
|
+
|
|
383
|
+
public IProductRepository Products { get; }
|
|
384
|
+
public IOrderRepository Orders { get; }
|
|
385
|
+
|
|
386
|
+
public UnitOfWork(
|
|
387
|
+
AppDbContext context,
|
|
388
|
+
IProductRepository products,
|
|
389
|
+
IOrderRepository orders)
|
|
390
|
+
{
|
|
391
|
+
_context = context;
|
|
392
|
+
Products = products;
|
|
393
|
+
Orders = orders;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
public async Task<int> SaveChangesAsync(CancellationToken ct = default)
|
|
397
|
+
=> await _context.SaveChangesAsync(ct);
|
|
398
|
+
|
|
399
|
+
public async Task BeginTransactionAsync(CancellationToken ct = default)
|
|
400
|
+
{
|
|
401
|
+
_transaction = await _context.Database.BeginTransactionAsync(ct);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
public async Task CommitAsync(CancellationToken ct = default)
|
|
405
|
+
{
|
|
406
|
+
if (_transaction != null)
|
|
407
|
+
{
|
|
408
|
+
await _transaction.CommitAsync(ct);
|
|
409
|
+
await _transaction.DisposeAsync();
|
|
410
|
+
_transaction = null;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
public async Task RollbackAsync(CancellationToken ct = default)
|
|
415
|
+
{
|
|
416
|
+
if (_transaction != null)
|
|
417
|
+
{
|
|
418
|
+
await _transaction.RollbackAsync(ct);
|
|
419
|
+
await _transaction.DisposeAsync();
|
|
420
|
+
_transaction = null;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
public void Dispose()
|
|
425
|
+
{
|
|
426
|
+
_transaction?.Dispose();
|
|
427
|
+
_context.Dispose();
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/// <summary>
|
|
432
|
+
/// Specification pattern for complex queries
|
|
433
|
+
/// </summary>
|
|
434
|
+
public interface ISpecification<T>
|
|
435
|
+
{
|
|
436
|
+
Expression<Func<T, bool>> Criteria { get; }
|
|
437
|
+
List<Expression<Func<T, object>>> Includes { get; }
|
|
438
|
+
List<string> IncludeStrings { get; }
|
|
439
|
+
Expression<Func<T, object>>? OrderBy { get; }
|
|
440
|
+
Expression<Func<T, object>>? OrderByDescending { get; }
|
|
441
|
+
int? Take { get; }
|
|
442
|
+
int? Skip { get; }
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
public abstract class BaseSpecification<T> : ISpecification<T>
|
|
446
|
+
{
|
|
447
|
+
public Expression<Func<T, bool>> Criteria { get; private set; } = _ => true;
|
|
448
|
+
public List<Expression<Func<T, object>>> Includes { get; } = new();
|
|
449
|
+
public List<string> IncludeStrings { get; } = new();
|
|
450
|
+
public Expression<Func<T, object>>? OrderBy { get; private set; }
|
|
451
|
+
public Expression<Func<T, object>>? OrderByDescending { get; private set; }
|
|
452
|
+
public int? Take { get; private set; }
|
|
453
|
+
public int? Skip { get; private set; }
|
|
454
|
+
|
|
455
|
+
protected void AddCriteria(Expression<Func<T, bool>> criteria) => Criteria = criteria;
|
|
456
|
+
protected void AddInclude(Expression<Func<T, object>> include) => Includes.Add(include);
|
|
457
|
+
protected void AddInclude(string include) => IncludeStrings.Add(include);
|
|
458
|
+
protected void ApplyOrderBy(Expression<Func<T, object>> orderBy) => OrderBy = orderBy;
|
|
459
|
+
protected void ApplyOrderByDescending(Expression<Func<T, object>> orderBy) => OrderByDescending = orderBy;
|
|
460
|
+
protected void ApplyPaging(int skip, int take) { Skip = skip; Take = take; }
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
// Example specification
|
|
464
|
+
public class ProductsByCategorySpec : BaseSpecification<Product>
|
|
465
|
+
{
|
|
466
|
+
public ProductsByCategorySpec(int categoryId, int page, int pageSize)
|
|
467
|
+
{
|
|
468
|
+
AddCriteria(p => p.CategoryId == categoryId);
|
|
469
|
+
AddInclude(p => p.Category);
|
|
470
|
+
ApplyOrderBy(p => p.Name);
|
|
471
|
+
ApplyPaging((page - 1) * pageSize, pageSize);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
#endregion
|
|
476
|
+
|
|
477
|
+
#region Entity Definitions
|
|
478
|
+
|
|
479
|
+
public class Product
|
|
480
|
+
{
|
|
481
|
+
public string Id { get; set; } = string.Empty;
|
|
482
|
+
public string Name { get; set; } = string.Empty;
|
|
483
|
+
public string Sku { get; set; } = string.Empty;
|
|
484
|
+
public decimal Price { get; set; }
|
|
485
|
+
public int CategoryId { get; set; }
|
|
486
|
+
public int Stock { get; set; }
|
|
487
|
+
public bool IsDeleted { get; set; }
|
|
488
|
+
public DateTime CreatedAt { get; set; }
|
|
489
|
+
public DateTime? UpdatedAt { get; set; }
|
|
490
|
+
|
|
491
|
+
// Navigation
|
|
492
|
+
public Category? Category { get; set; }
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
public class Category
|
|
496
|
+
{
|
|
497
|
+
public int Id { get; set; }
|
|
498
|
+
public string Name { get; set; } = string.Empty;
|
|
499
|
+
public ICollection<Product> Products { get; set; } = new List<Product>();
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
public class Order
|
|
503
|
+
{
|
|
504
|
+
public int Id { get; set; }
|
|
505
|
+
public string CustomerOrderCode { get; set; } = string.Empty;
|
|
506
|
+
public decimal Total { get; set; }
|
|
507
|
+
public DateTime CreatedAt { get; set; }
|
|
508
|
+
public ICollection<OrderItem> Items { get; set; } = new List<OrderItem>();
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
public class OrderItem
|
|
512
|
+
{
|
|
513
|
+
public int Id { get; set; }
|
|
514
|
+
public int OrderId { get; set; }
|
|
515
|
+
public string ProductId { get; set; } = string.Empty;
|
|
516
|
+
public int Quantity { get; set; }
|
|
517
|
+
public decimal UnitPrice { get; set; }
|
|
518
|
+
|
|
519
|
+
public Order? Order { get; set; }
|
|
520
|
+
public Product? Product { get; set; }
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
#endregion
|