@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,804 @@
|
|
|
1
|
+
# Godot GDScript Patterns Implementation Playbook
|
|
2
|
+
|
|
3
|
+
This file contains detailed patterns, checklists, and code samples referenced by the skill.
|
|
4
|
+
|
|
5
|
+
# Godot GDScript Patterns
|
|
6
|
+
|
|
7
|
+
Production patterns for Godot 4.x game development with GDScript, covering architecture, signals, scenes, and optimization.
|
|
8
|
+
|
|
9
|
+
## When to Use This Skill
|
|
10
|
+
|
|
11
|
+
- Building games with Godot 4
|
|
12
|
+
- Implementing game systems in GDScript
|
|
13
|
+
- Designing scene architecture
|
|
14
|
+
- Managing game state
|
|
15
|
+
- Optimizing GDScript performance
|
|
16
|
+
- Learning Godot best practices
|
|
17
|
+
|
|
18
|
+
## Core Concepts
|
|
19
|
+
|
|
20
|
+
### 1. Godot Architecture
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
Node: Base building block
|
|
24
|
+
├── Scene: Reusable node tree (saved as .tscn)
|
|
25
|
+
├── Resource: Data container (saved as .tres)
|
|
26
|
+
├── Signal: Event communication
|
|
27
|
+
└── Group: Node categorization
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 2. GDScript Basics
|
|
31
|
+
|
|
32
|
+
```gdscript
|
|
33
|
+
class_name Player
|
|
34
|
+
extends CharacterBody2D
|
|
35
|
+
|
|
36
|
+
# Signals
|
|
37
|
+
signal health_changed(new_health: int)
|
|
38
|
+
signal died
|
|
39
|
+
|
|
40
|
+
# Exports (Inspector-editable)
|
|
41
|
+
@export var speed: float = 200.0
|
|
42
|
+
@export var max_health: int = 100
|
|
43
|
+
@export_range(0, 1) var damage_reduction: float = 0.0
|
|
44
|
+
@export_group("Combat")
|
|
45
|
+
@export var attack_damage: int = 10
|
|
46
|
+
@export var attack_cooldown: float = 0.5
|
|
47
|
+
|
|
48
|
+
# Onready (initialized when ready)
|
|
49
|
+
@onready var sprite: Sprite2D = $Sprite2D
|
|
50
|
+
@onready var animation: AnimationPlayer = $AnimationPlayer
|
|
51
|
+
@onready var hitbox: Area2D = $Hitbox
|
|
52
|
+
|
|
53
|
+
# Private variables (convention: underscore prefix)
|
|
54
|
+
var _health: int
|
|
55
|
+
var _can_attack: bool = true
|
|
56
|
+
|
|
57
|
+
func _ready() -> void:
|
|
58
|
+
_health = max_health
|
|
59
|
+
|
|
60
|
+
func _physics_process(delta: float) -> void:
|
|
61
|
+
var direction := Input.get_vector("left", "right", "up", "down")
|
|
62
|
+
velocity = direction * speed
|
|
63
|
+
move_and_slide()
|
|
64
|
+
|
|
65
|
+
func take_damage(amount: int) -> void:
|
|
66
|
+
var actual_damage := int(amount * (1.0 - damage_reduction))
|
|
67
|
+
_health = max(_health - actual_damage, 0)
|
|
68
|
+
health_changed.emit(_health)
|
|
69
|
+
|
|
70
|
+
if _health <= 0:
|
|
71
|
+
died.emit()
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Patterns
|
|
75
|
+
|
|
76
|
+
### Pattern 1: State Machine
|
|
77
|
+
|
|
78
|
+
```gdscript
|
|
79
|
+
# state_machine.gd
|
|
80
|
+
class_name StateMachine
|
|
81
|
+
extends Node
|
|
82
|
+
|
|
83
|
+
signal state_changed(from_state: StringName, to_state: StringName)
|
|
84
|
+
|
|
85
|
+
@export var initial_state: State
|
|
86
|
+
|
|
87
|
+
var current_state: State
|
|
88
|
+
var states: Dictionary = {}
|
|
89
|
+
|
|
90
|
+
func _ready() -> void:
|
|
91
|
+
# Register all State children
|
|
92
|
+
for child in get_children():
|
|
93
|
+
if child is State:
|
|
94
|
+
states[child.name] = child
|
|
95
|
+
child.state_machine = self
|
|
96
|
+
child.process_mode = Node.PROCESS_MODE_DISABLED
|
|
97
|
+
|
|
98
|
+
# Start initial state
|
|
99
|
+
if initial_state:
|
|
100
|
+
current_state = initial_state
|
|
101
|
+
current_state.process_mode = Node.PROCESS_MODE_INHERIT
|
|
102
|
+
current_state.enter()
|
|
103
|
+
|
|
104
|
+
func _process(delta: float) -> void:
|
|
105
|
+
if current_state:
|
|
106
|
+
current_state.update(delta)
|
|
107
|
+
|
|
108
|
+
func _physics_process(delta: float) -> void:
|
|
109
|
+
if current_state:
|
|
110
|
+
current_state.physics_update(delta)
|
|
111
|
+
|
|
112
|
+
func _unhandled_input(event: InputEvent) -> void:
|
|
113
|
+
if current_state:
|
|
114
|
+
current_state.handle_input(event)
|
|
115
|
+
|
|
116
|
+
func transition_to(state_name: StringName, msg: Dictionary = {}) -> void:
|
|
117
|
+
if not states.has(state_name):
|
|
118
|
+
push_error("State '%s' not found" % state_name)
|
|
119
|
+
return
|
|
120
|
+
|
|
121
|
+
var previous_state := current_state
|
|
122
|
+
previous_state.exit()
|
|
123
|
+
previous_state.process_mode = Node.PROCESS_MODE_DISABLED
|
|
124
|
+
|
|
125
|
+
current_state = states[state_name]
|
|
126
|
+
current_state.process_mode = Node.PROCESS_MODE_INHERIT
|
|
127
|
+
current_state.enter(msg)
|
|
128
|
+
|
|
129
|
+
state_changed.emit(previous_state.name, current_state.name)
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
```gdscript
|
|
133
|
+
# state.gd
|
|
134
|
+
class_name State
|
|
135
|
+
extends Node
|
|
136
|
+
|
|
137
|
+
var state_machine: StateMachine
|
|
138
|
+
|
|
139
|
+
func enter(_msg: Dictionary = {}) -> void:
|
|
140
|
+
pass
|
|
141
|
+
|
|
142
|
+
func exit() -> void:
|
|
143
|
+
pass
|
|
144
|
+
|
|
145
|
+
func update(_delta: float) -> void:
|
|
146
|
+
pass
|
|
147
|
+
|
|
148
|
+
func physics_update(_delta: float) -> void:
|
|
149
|
+
pass
|
|
150
|
+
|
|
151
|
+
func handle_input(_event: InputEvent) -> void:
|
|
152
|
+
pass
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
```gdscript
|
|
156
|
+
# player_idle.gd
|
|
157
|
+
class_name PlayerIdle
|
|
158
|
+
extends State
|
|
159
|
+
|
|
160
|
+
@export var player: Player
|
|
161
|
+
|
|
162
|
+
func enter(_msg: Dictionary = {}) -> void:
|
|
163
|
+
player.animation.play("idle")
|
|
164
|
+
|
|
165
|
+
func physics_update(_delta: float) -> void:
|
|
166
|
+
var direction := Input.get_vector("left", "right", "up", "down")
|
|
167
|
+
|
|
168
|
+
if direction != Vector2.ZERO:
|
|
169
|
+
state_machine.transition_to("Move")
|
|
170
|
+
|
|
171
|
+
func handle_input(event: InputEvent) -> void:
|
|
172
|
+
if event.is_action_pressed("attack"):
|
|
173
|
+
state_machine.transition_to("Attack")
|
|
174
|
+
elif event.is_action_pressed("jump"):
|
|
175
|
+
state_machine.transition_to("Jump")
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Pattern 2: Autoload Singletons
|
|
179
|
+
|
|
180
|
+
```gdscript
|
|
181
|
+
# game_manager.gd (Add to Project Settings > Autoload)
|
|
182
|
+
extends Node
|
|
183
|
+
|
|
184
|
+
signal game_started
|
|
185
|
+
signal game_paused(is_paused: bool)
|
|
186
|
+
signal game_over(won: bool)
|
|
187
|
+
signal score_changed(new_score: int)
|
|
188
|
+
|
|
189
|
+
enum GameState { MENU, PLAYING, PAUSED, GAME_OVER }
|
|
190
|
+
|
|
191
|
+
var state: GameState = GameState.MENU
|
|
192
|
+
var score: int = 0:
|
|
193
|
+
set(value):
|
|
194
|
+
score = value
|
|
195
|
+
score_changed.emit(score)
|
|
196
|
+
|
|
197
|
+
var high_score: int = 0
|
|
198
|
+
|
|
199
|
+
func _ready() -> void:
|
|
200
|
+
process_mode = Node.PROCESS_MODE_ALWAYS
|
|
201
|
+
_load_high_score()
|
|
202
|
+
|
|
203
|
+
func _input(event: InputEvent) -> void:
|
|
204
|
+
if event.is_action_pressed("pause") and state == GameState.PLAYING:
|
|
205
|
+
toggle_pause()
|
|
206
|
+
|
|
207
|
+
func start_game() -> void:
|
|
208
|
+
score = 0
|
|
209
|
+
state = GameState.PLAYING
|
|
210
|
+
game_started.emit()
|
|
211
|
+
|
|
212
|
+
func toggle_pause() -> void:
|
|
213
|
+
var is_paused := state != GameState.PAUSED
|
|
214
|
+
|
|
215
|
+
if is_paused:
|
|
216
|
+
state = GameState.PAUSED
|
|
217
|
+
get_tree().paused = true
|
|
218
|
+
else:
|
|
219
|
+
state = GameState.PLAYING
|
|
220
|
+
get_tree().paused = false
|
|
221
|
+
|
|
222
|
+
game_paused.emit(is_paused)
|
|
223
|
+
|
|
224
|
+
func end_game(won: bool) -> void:
|
|
225
|
+
state = GameState.GAME_OVER
|
|
226
|
+
|
|
227
|
+
if score > high_score:
|
|
228
|
+
high_score = score
|
|
229
|
+
_save_high_score()
|
|
230
|
+
|
|
231
|
+
game_over.emit(won)
|
|
232
|
+
|
|
233
|
+
func add_score(points: int) -> void:
|
|
234
|
+
score += points
|
|
235
|
+
|
|
236
|
+
func _load_high_score() -> void:
|
|
237
|
+
if FileAccess.file_exists("user://high_score.save"):
|
|
238
|
+
var file := FileAccess.open("user://high_score.save", FileAccess.READ)
|
|
239
|
+
high_score = file.get_32()
|
|
240
|
+
|
|
241
|
+
func _save_high_score() -> void:
|
|
242
|
+
var file := FileAccess.open("user://high_score.save", FileAccess.WRITE)
|
|
243
|
+
file.store_32(high_score)
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
```gdscript
|
|
247
|
+
# event_bus.gd (Global signal bus)
|
|
248
|
+
extends Node
|
|
249
|
+
|
|
250
|
+
# Player events
|
|
251
|
+
signal player_spawned(player: Node2D)
|
|
252
|
+
signal player_died(player: Node2D)
|
|
253
|
+
signal player_health_changed(health: int, max_health: int)
|
|
254
|
+
|
|
255
|
+
# Enemy events
|
|
256
|
+
signal enemy_spawned(enemy: Node2D)
|
|
257
|
+
signal enemy_died(enemy: Node2D, position: Vector2)
|
|
258
|
+
|
|
259
|
+
# Item events
|
|
260
|
+
signal item_collected(item_type: StringName, value: int)
|
|
261
|
+
signal powerup_activated(powerup_type: StringName)
|
|
262
|
+
|
|
263
|
+
# Level events
|
|
264
|
+
signal level_started(level_number: int)
|
|
265
|
+
signal level_completed(level_number: int, time: float)
|
|
266
|
+
signal checkpoint_reached(checkpoint_id: int)
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### Pattern 3: Resource-based Data
|
|
270
|
+
|
|
271
|
+
```gdscript
|
|
272
|
+
# weapon_data.gd
|
|
273
|
+
class_name WeaponData
|
|
274
|
+
extends Resource
|
|
275
|
+
|
|
276
|
+
@export var name: StringName
|
|
277
|
+
@export var damage: int
|
|
278
|
+
@export var attack_speed: float
|
|
279
|
+
@export var range: float
|
|
280
|
+
@export_multiline var description: String
|
|
281
|
+
@export var icon: Texture2D
|
|
282
|
+
@export var projectile_scene: PackedScene
|
|
283
|
+
@export var sound_attack: AudioStream
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
```gdscript
|
|
287
|
+
# character_stats.gd
|
|
288
|
+
class_name CharacterStats
|
|
289
|
+
extends Resource
|
|
290
|
+
|
|
291
|
+
signal stat_changed(stat_name: StringName, new_value: float)
|
|
292
|
+
|
|
293
|
+
@export var max_health: float = 100.0
|
|
294
|
+
@export var attack: float = 10.0
|
|
295
|
+
@export var defense: float = 5.0
|
|
296
|
+
@export var speed: float = 200.0
|
|
297
|
+
|
|
298
|
+
# Runtime values (not saved)
|
|
299
|
+
var _current_health: float
|
|
300
|
+
|
|
301
|
+
func _init() -> void:
|
|
302
|
+
_current_health = max_health
|
|
303
|
+
|
|
304
|
+
func get_current_health() -> float:
|
|
305
|
+
return _current_health
|
|
306
|
+
|
|
307
|
+
func take_damage(amount: float) -> float:
|
|
308
|
+
var actual_damage := maxf(amount - defense, 1.0)
|
|
309
|
+
_current_health = maxf(_current_health - actual_damage, 0.0)
|
|
310
|
+
stat_changed.emit("health", _current_health)
|
|
311
|
+
return actual_damage
|
|
312
|
+
|
|
313
|
+
func heal(amount: float) -> void:
|
|
314
|
+
_current_health = minf(_current_health + amount, max_health)
|
|
315
|
+
stat_changed.emit("health", _current_health)
|
|
316
|
+
|
|
317
|
+
func duplicate_for_runtime() -> CharacterStats:
|
|
318
|
+
var copy := duplicate() as CharacterStats
|
|
319
|
+
copy._current_health = copy.max_health
|
|
320
|
+
return copy
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
```gdscript
|
|
324
|
+
# Using resources
|
|
325
|
+
class_name Character
|
|
326
|
+
extends CharacterBody2D
|
|
327
|
+
|
|
328
|
+
@export var base_stats: CharacterStats
|
|
329
|
+
@export var weapon: WeaponData
|
|
330
|
+
|
|
331
|
+
var stats: CharacterStats
|
|
332
|
+
|
|
333
|
+
func _ready() -> void:
|
|
334
|
+
# Create runtime copy to avoid modifying the resource
|
|
335
|
+
stats = base_stats.duplicate_for_runtime()
|
|
336
|
+
stats.stat_changed.connect(_on_stat_changed)
|
|
337
|
+
|
|
338
|
+
func attack() -> void:
|
|
339
|
+
if weapon:
|
|
340
|
+
print("Attacking with %s for %d damage" % [weapon.name, weapon.damage])
|
|
341
|
+
|
|
342
|
+
func _on_stat_changed(stat_name: StringName, value: float) -> void:
|
|
343
|
+
if stat_name == "health" and value <= 0:
|
|
344
|
+
die()
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### Pattern 4: Object Pooling
|
|
348
|
+
|
|
349
|
+
```gdscript
|
|
350
|
+
# object_pool.gd
|
|
351
|
+
class_name ObjectPool
|
|
352
|
+
extends Node
|
|
353
|
+
|
|
354
|
+
@export var pooled_scene: PackedScene
|
|
355
|
+
@export var initial_size: int = 10
|
|
356
|
+
@export var can_grow: bool = true
|
|
357
|
+
|
|
358
|
+
var _available: Array[Node] = []
|
|
359
|
+
var _in_use: Array[Node] = []
|
|
360
|
+
|
|
361
|
+
func _ready() -> void:
|
|
362
|
+
_initialize_pool()
|
|
363
|
+
|
|
364
|
+
func _initialize_pool() -> void:
|
|
365
|
+
for i in initial_size:
|
|
366
|
+
_create_instance()
|
|
367
|
+
|
|
368
|
+
func _create_instance() -> Node:
|
|
369
|
+
var instance := pooled_scene.instantiate()
|
|
370
|
+
instance.process_mode = Node.PROCESS_MODE_DISABLED
|
|
371
|
+
instance.visible = false
|
|
372
|
+
add_child(instance)
|
|
373
|
+
_available.append(instance)
|
|
374
|
+
|
|
375
|
+
# Connect return signal if exists
|
|
376
|
+
if instance.has_signal("returned_to_pool"):
|
|
377
|
+
instance.returned_to_pool.connect(_return_to_pool.bind(instance))
|
|
378
|
+
|
|
379
|
+
return instance
|
|
380
|
+
|
|
381
|
+
func get_instance() -> Node:
|
|
382
|
+
var instance: Node
|
|
383
|
+
|
|
384
|
+
if _available.is_empty():
|
|
385
|
+
if can_grow:
|
|
386
|
+
instance = _create_instance()
|
|
387
|
+
_available.erase(instance)
|
|
388
|
+
else:
|
|
389
|
+
push_warning("Pool exhausted and cannot grow")
|
|
390
|
+
return null
|
|
391
|
+
else:
|
|
392
|
+
instance = _available.pop_back()
|
|
393
|
+
|
|
394
|
+
instance.process_mode = Node.PROCESS_MODE_INHERIT
|
|
395
|
+
instance.visible = true
|
|
396
|
+
_in_use.append(instance)
|
|
397
|
+
|
|
398
|
+
if instance.has_method("on_spawn"):
|
|
399
|
+
instance.on_spawn()
|
|
400
|
+
|
|
401
|
+
return instance
|
|
402
|
+
|
|
403
|
+
func _return_to_pool(instance: Node) -> void:
|
|
404
|
+
if not instance in _in_use:
|
|
405
|
+
return
|
|
406
|
+
|
|
407
|
+
_in_use.erase(instance)
|
|
408
|
+
|
|
409
|
+
if instance.has_method("on_despawn"):
|
|
410
|
+
instance.on_despawn()
|
|
411
|
+
|
|
412
|
+
instance.process_mode = Node.PROCESS_MODE_DISABLED
|
|
413
|
+
instance.visible = false
|
|
414
|
+
_available.append(instance)
|
|
415
|
+
|
|
416
|
+
func return_all() -> void:
|
|
417
|
+
for instance in _in_use.duplicate():
|
|
418
|
+
_return_to_pool(instance)
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
```gdscript
|
|
422
|
+
# pooled_bullet.gd
|
|
423
|
+
class_name PooledBullet
|
|
424
|
+
extends Area2D
|
|
425
|
+
|
|
426
|
+
signal returned_to_pool
|
|
427
|
+
|
|
428
|
+
@export var speed: float = 500.0
|
|
429
|
+
@export var lifetime: float = 5.0
|
|
430
|
+
|
|
431
|
+
var direction: Vector2
|
|
432
|
+
var _timer: float
|
|
433
|
+
|
|
434
|
+
func on_spawn() -> void:
|
|
435
|
+
_timer = lifetime
|
|
436
|
+
|
|
437
|
+
func on_despawn() -> void:
|
|
438
|
+
direction = Vector2.ZERO
|
|
439
|
+
|
|
440
|
+
func initialize(pos: Vector2, dir: Vector2) -> void:
|
|
441
|
+
global_position = pos
|
|
442
|
+
direction = dir.normalized()
|
|
443
|
+
rotation = direction.angle()
|
|
444
|
+
|
|
445
|
+
func _physics_process(delta: float) -> void:
|
|
446
|
+
position += direction * speed * delta
|
|
447
|
+
|
|
448
|
+
_timer -= delta
|
|
449
|
+
if _timer <= 0:
|
|
450
|
+
returned_to_pool.emit()
|
|
451
|
+
|
|
452
|
+
func _on_body_entered(body: Node2D) -> void:
|
|
453
|
+
if body.has_method("take_damage"):
|
|
454
|
+
body.take_damage(10)
|
|
455
|
+
returned_to_pool.emit()
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
### Pattern 5: Component System
|
|
459
|
+
|
|
460
|
+
```gdscript
|
|
461
|
+
# health_component.gd
|
|
462
|
+
class_name HealthComponent
|
|
463
|
+
extends Node
|
|
464
|
+
|
|
465
|
+
signal health_changed(current: int, maximum: int)
|
|
466
|
+
signal damaged(amount: int, source: Node)
|
|
467
|
+
signal healed(amount: int)
|
|
468
|
+
signal died
|
|
469
|
+
|
|
470
|
+
@export var max_health: int = 100
|
|
471
|
+
@export var invincibility_time: float = 0.0
|
|
472
|
+
|
|
473
|
+
var current_health: int:
|
|
474
|
+
set(value):
|
|
475
|
+
var old := current_health
|
|
476
|
+
current_health = clampi(value, 0, max_health)
|
|
477
|
+
if current_health != old:
|
|
478
|
+
health_changed.emit(current_health, max_health)
|
|
479
|
+
|
|
480
|
+
var _invincible: bool = false
|
|
481
|
+
|
|
482
|
+
func _ready() -> void:
|
|
483
|
+
current_health = max_health
|
|
484
|
+
|
|
485
|
+
func take_damage(amount: int, source: Node = null) -> int:
|
|
486
|
+
if _invincible or current_health <= 0:
|
|
487
|
+
return 0
|
|
488
|
+
|
|
489
|
+
var actual := mini(amount, current_health)
|
|
490
|
+
current_health -= actual
|
|
491
|
+
damaged.emit(actual, source)
|
|
492
|
+
|
|
493
|
+
if current_health <= 0:
|
|
494
|
+
died.emit()
|
|
495
|
+
elif invincibility_time > 0:
|
|
496
|
+
_start_invincibility()
|
|
497
|
+
|
|
498
|
+
return actual
|
|
499
|
+
|
|
500
|
+
func heal(amount: int) -> int:
|
|
501
|
+
var actual := mini(amount, max_health - current_health)
|
|
502
|
+
current_health += actual
|
|
503
|
+
if actual > 0:
|
|
504
|
+
healed.emit(actual)
|
|
505
|
+
return actual
|
|
506
|
+
|
|
507
|
+
func _start_invincibility() -> void:
|
|
508
|
+
_invincible = true
|
|
509
|
+
await get_tree().create_timer(invincibility_time).timeout
|
|
510
|
+
_invincible = false
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
```gdscript
|
|
514
|
+
# hitbox_component.gd
|
|
515
|
+
class_name HitboxComponent
|
|
516
|
+
extends Area2D
|
|
517
|
+
|
|
518
|
+
signal hit(hurtbox: HurtboxComponent)
|
|
519
|
+
|
|
520
|
+
@export var damage: int = 10
|
|
521
|
+
@export var knockback_force: float = 200.0
|
|
522
|
+
|
|
523
|
+
var owner_node: Node
|
|
524
|
+
|
|
525
|
+
func _ready() -> void:
|
|
526
|
+
owner_node = get_parent()
|
|
527
|
+
area_entered.connect(_on_area_entered)
|
|
528
|
+
|
|
529
|
+
func _on_area_entered(area: Area2D) -> void:
|
|
530
|
+
if area is HurtboxComponent:
|
|
531
|
+
var hurtbox := area as HurtboxComponent
|
|
532
|
+
if hurtbox.owner_node != owner_node:
|
|
533
|
+
hit.emit(hurtbox)
|
|
534
|
+
hurtbox.receive_hit(self)
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
```gdscript
|
|
538
|
+
# hurtbox_component.gd
|
|
539
|
+
class_name HurtboxComponent
|
|
540
|
+
extends Area2D
|
|
541
|
+
|
|
542
|
+
signal hurt(hitbox: HitboxComponent)
|
|
543
|
+
|
|
544
|
+
@export var health_component: HealthComponent
|
|
545
|
+
|
|
546
|
+
var owner_node: Node
|
|
547
|
+
|
|
548
|
+
func _ready() -> void:
|
|
549
|
+
owner_node = get_parent()
|
|
550
|
+
|
|
551
|
+
func receive_hit(hitbox: HitboxComponent) -> void:
|
|
552
|
+
hurt.emit(hitbox)
|
|
553
|
+
|
|
554
|
+
if health_component:
|
|
555
|
+
health_component.take_damage(hitbox.damage, hitbox.owner_node)
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
### Pattern 6: Scene Management
|
|
559
|
+
|
|
560
|
+
```gdscript
|
|
561
|
+
# scene_manager.gd (Autoload)
|
|
562
|
+
extends Node
|
|
563
|
+
|
|
564
|
+
signal scene_loading_started(scene_path: String)
|
|
565
|
+
signal scene_loading_progress(progress: float)
|
|
566
|
+
signal scene_loaded(scene: Node)
|
|
567
|
+
signal transition_started
|
|
568
|
+
signal transition_finished
|
|
569
|
+
|
|
570
|
+
@export var transition_scene: PackedScene
|
|
571
|
+
@export var loading_scene: PackedScene
|
|
572
|
+
|
|
573
|
+
var _current_scene: Node
|
|
574
|
+
var _transition: CanvasLayer
|
|
575
|
+
var _loader: ResourceLoader
|
|
576
|
+
|
|
577
|
+
func _ready() -> void:
|
|
578
|
+
_current_scene = get_tree().current_scene
|
|
579
|
+
|
|
580
|
+
if transition_scene:
|
|
581
|
+
_transition = transition_scene.instantiate()
|
|
582
|
+
add_child(_transition)
|
|
583
|
+
_transition.visible = false
|
|
584
|
+
|
|
585
|
+
func change_scene(scene_path: String, with_transition: bool = true) -> void:
|
|
586
|
+
if with_transition:
|
|
587
|
+
await _play_transition_out()
|
|
588
|
+
|
|
589
|
+
_load_scene(scene_path)
|
|
590
|
+
|
|
591
|
+
func change_scene_packed(scene: PackedScene, with_transition: bool = true) -> void:
|
|
592
|
+
if with_transition:
|
|
593
|
+
await _play_transition_out()
|
|
594
|
+
|
|
595
|
+
_swap_scene(scene.instantiate())
|
|
596
|
+
|
|
597
|
+
func _load_scene(path: String) -> void:
|
|
598
|
+
scene_loading_started.emit(path)
|
|
599
|
+
|
|
600
|
+
# Check if already loaded
|
|
601
|
+
if ResourceLoader.has_cached(path):
|
|
602
|
+
var scene := load(path) as PackedScene
|
|
603
|
+
_swap_scene(scene.instantiate())
|
|
604
|
+
return
|
|
605
|
+
|
|
606
|
+
# Async loading
|
|
607
|
+
ResourceLoader.load_threaded_request(path)
|
|
608
|
+
|
|
609
|
+
while true:
|
|
610
|
+
var progress := []
|
|
611
|
+
var status := ResourceLoader.load_threaded_get_status(path, progress)
|
|
612
|
+
|
|
613
|
+
match status:
|
|
614
|
+
ResourceLoader.THREAD_LOAD_IN_PROGRESS:
|
|
615
|
+
scene_loading_progress.emit(progress[0])
|
|
616
|
+
await get_tree().process_frame
|
|
617
|
+
ResourceLoader.THREAD_LOAD_LOADED:
|
|
618
|
+
var scene := ResourceLoader.load_threaded_get(path) as PackedScene
|
|
619
|
+
_swap_scene(scene.instantiate())
|
|
620
|
+
return
|
|
621
|
+
_:
|
|
622
|
+
push_error("Failed to load scene: %s" % path)
|
|
623
|
+
return
|
|
624
|
+
|
|
625
|
+
func _swap_scene(new_scene: Node) -> void:
|
|
626
|
+
if _current_scene:
|
|
627
|
+
_current_scene.queue_free()
|
|
628
|
+
|
|
629
|
+
_current_scene = new_scene
|
|
630
|
+
get_tree().root.add_child(_current_scene)
|
|
631
|
+
get_tree().current_scene = _current_scene
|
|
632
|
+
|
|
633
|
+
scene_loaded.emit(_current_scene)
|
|
634
|
+
await _play_transition_in()
|
|
635
|
+
|
|
636
|
+
func _play_transition_out() -> void:
|
|
637
|
+
if not _transition:
|
|
638
|
+
return
|
|
639
|
+
|
|
640
|
+
transition_started.emit()
|
|
641
|
+
_transition.visible = true
|
|
642
|
+
|
|
643
|
+
if _transition.has_method("transition_out"):
|
|
644
|
+
await _transition.transition_out()
|
|
645
|
+
else:
|
|
646
|
+
await get_tree().create_timer(0.3).timeout
|
|
647
|
+
|
|
648
|
+
func _play_transition_in() -> void:
|
|
649
|
+
if not _transition:
|
|
650
|
+
transition_finished.emit()
|
|
651
|
+
return
|
|
652
|
+
|
|
653
|
+
if _transition.has_method("transition_in"):
|
|
654
|
+
await _transition.transition_in()
|
|
655
|
+
else:
|
|
656
|
+
await get_tree().create_timer(0.3).timeout
|
|
657
|
+
|
|
658
|
+
_transition.visible = false
|
|
659
|
+
transition_finished.emit()
|
|
660
|
+
```
|
|
661
|
+
|
|
662
|
+
### Pattern 7: Save System
|
|
663
|
+
|
|
664
|
+
```gdscript
|
|
665
|
+
# save_manager.gd (Autoload)
|
|
666
|
+
extends Node
|
|
667
|
+
|
|
668
|
+
const SAVE_PATH := "user://savegame.save"
|
|
669
|
+
const ENCRYPTION_KEY := "your_secret_key_here"
|
|
670
|
+
|
|
671
|
+
signal save_completed
|
|
672
|
+
signal load_completed
|
|
673
|
+
signal save_error(message: String)
|
|
674
|
+
|
|
675
|
+
func save_game(data: Dictionary) -> void:
|
|
676
|
+
var file := FileAccess.open_encrypted_with_pass(
|
|
677
|
+
SAVE_PATH,
|
|
678
|
+
FileAccess.WRITE,
|
|
679
|
+
ENCRYPTION_KEY
|
|
680
|
+
)
|
|
681
|
+
|
|
682
|
+
if file == null:
|
|
683
|
+
save_error.emit("Could not open save file")
|
|
684
|
+
return
|
|
685
|
+
|
|
686
|
+
var json := JSON.stringify(data)
|
|
687
|
+
file.store_string(json)
|
|
688
|
+
file.close()
|
|
689
|
+
|
|
690
|
+
save_completed.emit()
|
|
691
|
+
|
|
692
|
+
func load_game() -> Dictionary:
|
|
693
|
+
if not FileAccess.file_exists(SAVE_PATH):
|
|
694
|
+
return {}
|
|
695
|
+
|
|
696
|
+
var file := FileAccess.open_encrypted_with_pass(
|
|
697
|
+
SAVE_PATH,
|
|
698
|
+
FileAccess.READ,
|
|
699
|
+
ENCRYPTION_KEY
|
|
700
|
+
)
|
|
701
|
+
|
|
702
|
+
if file == null:
|
|
703
|
+
save_error.emit("Could not open save file")
|
|
704
|
+
return {}
|
|
705
|
+
|
|
706
|
+
var json := file.get_as_text()
|
|
707
|
+
file.close()
|
|
708
|
+
|
|
709
|
+
var parsed := JSON.parse_string(json)
|
|
710
|
+
if parsed == null:
|
|
711
|
+
save_error.emit("Could not parse save data")
|
|
712
|
+
return {}
|
|
713
|
+
|
|
714
|
+
load_completed.emit()
|
|
715
|
+
return parsed
|
|
716
|
+
|
|
717
|
+
func delete_save() -> void:
|
|
718
|
+
if FileAccess.file_exists(SAVE_PATH):
|
|
719
|
+
DirAccess.remove_absolute(SAVE_PATH)
|
|
720
|
+
|
|
721
|
+
func has_save() -> bool:
|
|
722
|
+
return FileAccess.file_exists(SAVE_PATH)
|
|
723
|
+
```
|
|
724
|
+
|
|
725
|
+
```gdscript
|
|
726
|
+
# saveable.gd (Attach to saveable nodes)
|
|
727
|
+
class_name Saveable
|
|
728
|
+
extends Node
|
|
729
|
+
|
|
730
|
+
@export var save_id: String
|
|
731
|
+
|
|
732
|
+
func _ready() -> void:
|
|
733
|
+
if save_id.is_empty():
|
|
734
|
+
save_id = str(get_path())
|
|
735
|
+
|
|
736
|
+
func get_save_data() -> Dictionary:
|
|
737
|
+
var parent := get_parent()
|
|
738
|
+
var data := {"id": save_id}
|
|
739
|
+
|
|
740
|
+
if parent is Node2D:
|
|
741
|
+
data["position"] = {"x": parent.position.x, "y": parent.position.y}
|
|
742
|
+
|
|
743
|
+
if parent.has_method("get_custom_save_data"):
|
|
744
|
+
data.merge(parent.get_custom_save_data())
|
|
745
|
+
|
|
746
|
+
return data
|
|
747
|
+
|
|
748
|
+
func load_save_data(data: Dictionary) -> void:
|
|
749
|
+
var parent := get_parent()
|
|
750
|
+
|
|
751
|
+
if data.has("position") and parent is Node2D:
|
|
752
|
+
parent.position = Vector2(data.position.x, data.position.y)
|
|
753
|
+
|
|
754
|
+
if parent.has_method("load_custom_save_data"):
|
|
755
|
+
parent.load_custom_save_data(data)
|
|
756
|
+
```
|
|
757
|
+
|
|
758
|
+
## Performance Tips
|
|
759
|
+
|
|
760
|
+
```gdscript
|
|
761
|
+
# 1. Cache node references
|
|
762
|
+
@onready var sprite := $Sprite2D # Good
|
|
763
|
+
# $Sprite2D in _process() # Bad - repeated lookup
|
|
764
|
+
|
|
765
|
+
# 2. Use object pooling for frequent spawning
|
|
766
|
+
# See Pattern 4
|
|
767
|
+
|
|
768
|
+
# 3. Avoid allocations in hot paths
|
|
769
|
+
var _reusable_array: Array = []
|
|
770
|
+
|
|
771
|
+
func _process(_delta: float) -> void:
|
|
772
|
+
_reusable_array.clear() # Reuse instead of creating new
|
|
773
|
+
|
|
774
|
+
# 4. Use static typing
|
|
775
|
+
func calculate(value: float) -> float: # Good
|
|
776
|
+
return value * 2.0
|
|
777
|
+
|
|
778
|
+
# 5. Disable processing when not needed
|
|
779
|
+
func _on_off_screen() -> void:
|
|
780
|
+
set_process(false)
|
|
781
|
+
set_physics_process(false)
|
|
782
|
+
```
|
|
783
|
+
|
|
784
|
+
## Best Practices
|
|
785
|
+
|
|
786
|
+
### Do's
|
|
787
|
+
- **Use signals for decoupling** - Avoid direct references
|
|
788
|
+
- **Type everything** - Static typing catches errors
|
|
789
|
+
- **Use resources for data** - Separate data from logic
|
|
790
|
+
- **Pool frequently spawned objects** - Avoid GC hitches
|
|
791
|
+
- **Use Autoloads sparingly** - Only for truly global systems
|
|
792
|
+
|
|
793
|
+
### Don'ts
|
|
794
|
+
- **Don't use `get_node()` in loops** - Cache references
|
|
795
|
+
- **Don't couple scenes tightly** - Use signals
|
|
796
|
+
- **Don't put logic in resources** - Keep them data-only
|
|
797
|
+
- **Don't ignore the Profiler** - Monitor performance
|
|
798
|
+
- **Don't fight the scene tree** - Work with Godot's design
|
|
799
|
+
|
|
800
|
+
## Resources
|
|
801
|
+
|
|
802
|
+
- [Godot Documentation](https://docs.godotengine.org/en/stable/)
|
|
803
|
+
- [GDQuest Tutorials](https://www.gdquest.com/)
|
|
804
|
+
- [Godot Recipes](https://kidscancode.org/godot_recipes/)
|