@event4u/agent-config 1.9.1
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/.agent-src/README.md +64 -0
- package/.agent-src/commands/agent-handoff.md +64 -0
- package/.agent-src/commands/agent-status.md +83 -0
- package/.agent-src/commands/agents-audit.md +243 -0
- package/.agent-src/commands/agents-cleanup.md +169 -0
- package/.agent-src/commands/agents-prepare.md +137 -0
- package/.agent-src/commands/analyze-reference-repo.md +191 -0
- package/.agent-src/commands/bug-fix.md +181 -0
- package/.agent-src/commands/bug-investigate.md +175 -0
- package/.agent-src/commands/commit.md +121 -0
- package/.agent-src/commands/compress.md +177 -0
- package/.agent-src/commands/config-agent-settings.md +126 -0
- package/.agent-src/commands/context-create.md +167 -0
- package/.agent-src/commands/context-refactor.md +170 -0
- package/.agent-src/commands/copilot-agents-init.md +150 -0
- package/.agent-src/commands/copilot-agents-optimize.md +251 -0
- package/.agent-src/commands/create-pr-description.md +112 -0
- package/.agent-src/commands/create-pr.md +76 -0
- package/.agent-src/commands/do-and-judge.md +114 -0
- package/.agent-src/commands/do-in-steps.md +84 -0
- package/.agent-src/commands/e2e-heal.md +98 -0
- package/.agent-src/commands/e2e-plan.md +85 -0
- package/.agent-src/commands/estimate-ticket.md +80 -0
- package/.agent-src/commands/feature-dev.md +111 -0
- package/.agent-src/commands/feature-explore.md +180 -0
- package/.agent-src/commands/feature-plan.md +288 -0
- package/.agent-src/commands/feature-refactor.md +181 -0
- package/.agent-src/commands/feature-roadmap.md +184 -0
- package/.agent-src/commands/fix-ci.md +48 -0
- package/.agent-src/commands/fix-portability.md +97 -0
- package/.agent-src/commands/fix-pr-bot-comments.md +146 -0
- package/.agent-src/commands/fix-pr-comments.md +58 -0
- package/.agent-src/commands/fix-pr-developer-comments.md +152 -0
- package/.agent-src/commands/fix-references.md +94 -0
- package/.agent-src/commands/fix-seeder.md +146 -0
- package/.agent-src/commands/implement-ticket.md +133 -0
- package/.agent-src/commands/jira-ticket.md +71 -0
- package/.agent-src/commands/judge.md +86 -0
- package/.agent-src/commands/memory-add.md +130 -0
- package/.agent-src/commands/memory-full.md +97 -0
- package/.agent-src/commands/memory-promote.md +144 -0
- package/.agent-src/commands/mode.md +121 -0
- package/.agent-src/commands/module-create.md +132 -0
- package/.agent-src/commands/module-explore.md +157 -0
- package/.agent-src/commands/optimize-agents.md +139 -0
- package/.agent-src/commands/optimize-augmentignore.md +262 -0
- package/.agent-src/commands/optimize-rtk-filters.md +120 -0
- package/.agent-src/commands/optimize-skills.md +121 -0
- package/.agent-src/commands/override-create.md +97 -0
- package/.agent-src/commands/override-manage.md +96 -0
- package/.agent-src/commands/package-reset.md +154 -0
- package/.agent-src/commands/package-test.md +154 -0
- package/.agent-src/commands/prepare-for-review.md +91 -0
- package/.agent-src/commands/project-analyze.md +300 -0
- package/.agent-src/commands/project-health.md +95 -0
- package/.agent-src/commands/propose-memory.md +108 -0
- package/.agent-src/commands/quality-fix.md +106 -0
- package/.agent-src/commands/refine-ticket.md +81 -0
- package/.agent-src/commands/review-changes.md +130 -0
- package/.agent-src/commands/review-routing.md +111 -0
- package/.agent-src/commands/roadmap-create.md +110 -0
- package/.agent-src/commands/roadmap-execute.md +68 -0
- package/.agent-src/commands/rule-compliance-audit.md +139 -0
- package/.agent-src/commands/tests-create.md +73 -0
- package/.agent-src/commands/tests-execute.md +58 -0
- package/.agent-src/commands/threat-model.md +115 -0
- package/.agent-src/commands/update-form-request-messages.md +189 -0
- package/.agent-src/commands/upstream-contribute.md +171 -0
- package/.agent-src/contexts/augment-infrastructure.md +181 -0
- package/.agent-src/contexts/documentation-hierarchy.md +142 -0
- package/.agent-src/contexts/model-recommendations.md +142 -0
- package/.agent-src/contexts/override-system.md +187 -0
- package/.agent-src/contexts/skills-and-commands.md +154 -0
- package/.agent-src/contexts/subagent-configuration.md +62 -0
- package/.agent-src/guidelines/agent-infra/agent-interaction-and-decision-quality.md +110 -0
- package/.agent-src/guidelines/agent-infra/break-glass-usage.md +113 -0
- package/.agent-src/guidelines/agent-infra/developer-judgment.md +82 -0
- package/.agent-src/guidelines/agent-infra/engineering-memory-data-format.md +117 -0
- package/.agent-src/guidelines/agent-infra/layered-settings.md +158 -0
- package/.agent-src/guidelines/agent-infra/memory-access.md +121 -0
- package/.agent-src/guidelines/agent-infra/naming.md +69 -0
- package/.agent-src/guidelines/agent-infra/output-patterns.md +117 -0
- package/.agent-src/guidelines/agent-infra/review-routing-data-format.md +144 -0
- package/.agent-src/guidelines/agent-infra/role-contracts.md +211 -0
- package/.agent-src/guidelines/agent-infra/role-mode-router.md +89 -0
- package/.agent-src/guidelines/agent-infra/runtime-layer.md +89 -0
- package/.agent-src/guidelines/agent-infra/self-improvement-pipeline.md +135 -0
- package/.agent-src/guidelines/agent-infra/size-and-scope.md +189 -0
- package/.agent-src/guidelines/agent-infra/tool-integration.md +73 -0
- package/.agent-src/guidelines/docs/readme-size-and-splitting.md +153 -0
- package/.agent-src/guidelines/e2e/playwright.md +363 -0
- package/.agent-src/guidelines/php/api-design.md +115 -0
- package/.agent-src/guidelines/php/artisan-commands.md +81 -0
- package/.agent-src/guidelines/php/blade-ui.md +78 -0
- package/.agent-src/guidelines/php/controllers.md +90 -0
- package/.agent-src/guidelines/php/database.md +111 -0
- package/.agent-src/guidelines/php/eloquent.md +208 -0
- package/.agent-src/guidelines/php/flux.md +80 -0
- package/.agent-src/guidelines/php/general.md +191 -0
- package/.agent-src/guidelines/php/git.md +96 -0
- package/.agent-src/guidelines/php/jobs.md +111 -0
- package/.agent-src/guidelines/php/livewire.md +71 -0
- package/.agent-src/guidelines/php/logging.md +79 -0
- package/.agent-src/guidelines/php/naming.md +89 -0
- package/.agent-src/guidelines/php/patterns/dependency-injection.md +57 -0
- package/.agent-src/guidelines/php/patterns/dtos.md +199 -0
- package/.agent-src/guidelines/php/patterns/events.md +67 -0
- package/.agent-src/guidelines/php/patterns/factory.md +53 -0
- package/.agent-src/guidelines/php/patterns/pipelines.md +66 -0
- package/.agent-src/guidelines/php/patterns/policies.md +66 -0
- package/.agent-src/guidelines/php/patterns/repositories.md +122 -0
- package/.agent-src/guidelines/php/patterns/service-layer.md +64 -0
- package/.agent-src/guidelines/php/patterns/strategy.md +69 -0
- package/.agent-src/guidelines/php/patterns.md +28 -0
- package/.agent-src/guidelines/php/performance.md +92 -0
- package/.agent-src/guidelines/php/resources.md +100 -0
- package/.agent-src/guidelines/php/security.md +110 -0
- package/.agent-src/guidelines/php/sql.md +97 -0
- package/.agent-src/guidelines/php/validations.md +119 -0
- package/.agent-src/guidelines/php/websocket.md +100 -0
- package/.agent-src/personas/README.md +104 -0
- package/.agent-src/personas/ai-agent.md +77 -0
- package/.agent-src/personas/critical-challenger.md +73 -0
- package/.agent-src/personas/developer.md +73 -0
- package/.agent-src/personas/product-owner.md +78 -0
- package/.agent-src/personas/qa.md +67 -0
- package/.agent-src/personas/senior-engineer.md +77 -0
- package/.agent-src/personas/stakeholder.md +78 -0
- package/.agent-src/rules/agent-docs.md +61 -0
- package/.agent-src/rules/analysis-skill-routing.md +48 -0
- package/.agent-src/rules/architecture.md +62 -0
- package/.agent-src/rules/artifact-drafting-protocol.md +73 -0
- package/.agent-src/rules/ask-when-uncertain.md +52 -0
- package/.agent-src/rules/augment-portability.md +38 -0
- package/.agent-src/rules/augment-source-of-truth.md +128 -0
- package/.agent-src/rules/capture-learnings.md +89 -0
- package/.agent-src/rules/cli-output-handling.md +94 -0
- package/.agent-src/rules/commit-conventions.md +64 -0
- package/.agent-src/rules/context-hygiene.md +90 -0
- package/.agent-src/rules/docker-commands.md +55 -0
- package/.agent-src/rules/docs-sync.md +79 -0
- package/.agent-src/rules/downstream-changes.md +70 -0
- package/.agent-src/rules/e2e-testing.md +53 -0
- package/.agent-src/rules/guidelines.md +90 -0
- package/.agent-src/rules/improve-before-implement.md +94 -0
- package/.agent-src/rules/language-and-tone.md +104 -0
- package/.agent-src/rules/laravel-translations.md +48 -0
- package/.agent-src/rules/markdown-safe-codeblocks.md +18 -0
- package/.agent-src/rules/minimal-safe-diff.md +87 -0
- package/.agent-src/rules/missing-tool-handling.md +62 -0
- package/.agent-src/rules/model-recommendation.md +70 -0
- package/.agent-src/rules/package-ci-checks.md +80 -0
- package/.agent-src/rules/php-coding.md +63 -0
- package/.agent-src/rules/preservation-guard.md +29 -0
- package/.agent-src/rules/review-routing-awareness.md +125 -0
- package/.agent-src/rules/reviewer-awareness.md +92 -0
- package/.agent-src/rules/roadmap-progress-sync.md +56 -0
- package/.agent-src/rules/role-mode-adherence.md +54 -0
- package/.agent-src/rules/rule-type-governance.md +46 -0
- package/.agent-src/rules/runtime-safety.md +42 -0
- package/.agent-src/rules/scope-control.md +40 -0
- package/.agent-src/rules/security-sensitive-stop.md +77 -0
- package/.agent-src/rules/size-enforcement.md +29 -0
- package/.agent-src/rules/skill-improvement-trigger.md +58 -0
- package/.agent-src/rules/skill-quality.md +110 -0
- package/.agent-src/rules/slash-commands.md +30 -0
- package/.agent-src/rules/think-before-action.md +91 -0
- package/.agent-src/rules/token-efficiency.md +99 -0
- package/.agent-src/rules/tool-safety.md +36 -0
- package/.agent-src/rules/upstream-proposal.md +76 -0
- package/.agent-src/rules/user-interaction.md +79 -0
- package/.agent-src/rules/verify-before-complete.md +120 -0
- package/.agent-src/scripts/scan-seeder-violations.php +145 -0
- package/.agent-src/scripts/update_roadmap_progress.py +244 -0
- package/.agent-src/skills/adversarial-review/SKILL.md +149 -0
- package/.agent-src/skills/agent-docs-writing/SKILL.md +234 -0
- package/.agent-src/skills/analysis-autonomous-mode/SKILL.md +197 -0
- package/.agent-src/skills/analysis-skill-router/SKILL.md +134 -0
- package/.agent-src/skills/api-design/SKILL.md +104 -0
- package/.agent-src/skills/api-endpoint/SKILL.md +185 -0
- package/.agent-src/skills/api-testing/SKILL.md +206 -0
- package/.agent-src/skills/artisan-commands/SKILL.md +78 -0
- package/.agent-src/skills/authz-review/SKILL.md +171 -0
- package/.agent-src/skills/aws-infrastructure/SKILL.md +152 -0
- package/.agent-src/skills/blade-ui/SKILL.md +75 -0
- package/.agent-src/skills/blast-radius-analyzer/SKILL.md +185 -0
- package/.agent-src/skills/bug-analyzer/SKILL.md +256 -0
- package/.agent-src/skills/check-refs/SKILL.md +72 -0
- package/.agent-src/skills/code-refactoring/SKILL.md +200 -0
- package/.agent-src/skills/code-review/SKILL.md +214 -0
- package/.agent-src/skills/command-routing/SKILL.md +96 -0
- package/.agent-src/skills/command-writing/SKILL.md +143 -0
- package/.agent-src/skills/composer-packages/SKILL.md +172 -0
- package/.agent-src/skills/context-authoring/SKILL.md +157 -0
- package/.agent-src/skills/context-document/SKILL.md +153 -0
- package/.agent-src/skills/conventional-commits-writing/SKILL.md +70 -0
- package/.agent-src/skills/copilot-agents-optimization/SKILL.md +220 -0
- package/.agent-src/skills/copilot-config/SKILL.md +203 -0
- package/.agent-src/skills/dashboard-design/SKILL.md +116 -0
- package/.agent-src/skills/data-flow-mapper/SKILL.md +160 -0
- package/.agent-src/skills/database/SKILL.md +91 -0
- package/.agent-src/skills/dependency-upgrade/SKILL.md +204 -0
- package/.agent-src/skills/description-assist/SKILL.md +169 -0
- package/.agent-src/skills/design-review/SKILL.md +228 -0
- package/.agent-src/skills/devcontainer/SKILL.md +121 -0
- package/.agent-src/skills/developer-like-execution/SKILL.md +276 -0
- package/.agent-src/skills/docker/SKILL.md +245 -0
- package/.agent-src/skills/dto-creator/SKILL.md +117 -0
- package/.agent-src/skills/eloquent/SKILL.md +92 -0
- package/.agent-src/skills/eloquent/evals/last-run.json +99 -0
- package/.agent-src/skills/eloquent/evals/triggers.json +16 -0
- package/.agent-src/skills/estimate-ticket/SKILL.md +186 -0
- package/.agent-src/skills/estimate-ticket/evals/output-schema.yml +20 -0
- package/.agent-src/skills/estimate-ticket/evals/triggers.json +18 -0
- package/.agent-src/skills/fe-design/SKILL.md +223 -0
- package/.agent-src/skills/feature-planning/SKILL.md +226 -0
- package/.agent-src/skills/file-editor/SKILL.md +129 -0
- package/.agent-src/skills/finishing-a-development-branch/SKILL.md +200 -0
- package/.agent-src/skills/flux/SKILL.md +64 -0
- package/.agent-src/skills/git-workflow/SKILL.md +102 -0
- package/.agent-src/skills/github-ci/SKILL.md +122 -0
- package/.agent-src/skills/grafana/SKILL.md +168 -0
- package/.agent-src/skills/guideline-writing/SKILL.md +147 -0
- package/.agent-src/skills/jira-integration/SKILL.md +182 -0
- package/.agent-src/skills/jobs-events/SKILL.md +87 -0
- package/.agent-src/skills/judge-bug-hunter/SKILL.md +157 -0
- package/.agent-src/skills/judge-code-quality/SKILL.md +158 -0
- package/.agent-src/skills/judge-security-auditor/SKILL.md +167 -0
- package/.agent-src/skills/judge-test-coverage/SKILL.md +154 -0
- package/.agent-src/skills/laravel/SKILL.md +195 -0
- package/.agent-src/skills/laravel-horizon/SKILL.md +169 -0
- package/.agent-src/skills/laravel-mail/SKILL.md +193 -0
- package/.agent-src/skills/laravel-middleware/SKILL.md +185 -0
- package/.agent-src/skills/laravel-notifications/SKILL.md +168 -0
- package/.agent-src/skills/laravel-pennant/SKILL.md +188 -0
- package/.agent-src/skills/laravel-pulse/SKILL.md +160 -0
- package/.agent-src/skills/laravel-reverb/SKILL.md +205 -0
- package/.agent-src/skills/laravel-scheduling/SKILL.md +167 -0
- package/.agent-src/skills/laravel-validation/SKILL.md +71 -0
- package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +249 -0
- package/.agent-src/skills/lint-skills/SKILL.md +72 -0
- package/.agent-src/skills/livewire/SKILL.md +79 -0
- package/.agent-src/skills/logging-monitoring/SKILL.md +100 -0
- package/.agent-src/skills/mcp/SKILL.md +193 -0
- package/.agent-src/skills/merge-conflicts/SKILL.md +158 -0
- package/.agent-src/skills/migration-creator/SKILL.md +160 -0
- package/.agent-src/skills/module-management/SKILL.md +154 -0
- package/.agent-src/skills/multi-tenancy/SKILL.md +129 -0
- package/.agent-src/skills/openapi/SKILL.md +154 -0
- package/.agent-src/skills/override-management/SKILL.md +186 -0
- package/.agent-src/skills/performance/SKILL.md +69 -0
- package/.agent-src/skills/performance-analysis/SKILL.md +118 -0
- package/.agent-src/skills/pest-testing/SKILL.md +321 -0
- package/.agent-src/skills/php-coder/SKILL.md +78 -0
- package/.agent-src/skills/php-coder/evals/triggers.json +16 -0
- package/.agent-src/skills/php-debugging/SKILL.md +184 -0
- package/.agent-src/skills/php-service/SKILL.md +96 -0
- package/.agent-src/skills/playwright-testing/SKILL.md +244 -0
- package/.agent-src/skills/project-analysis-core/SKILL.md +138 -0
- package/.agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +130 -0
- package/.agent-src/skills/project-analysis-laravel/SKILL.md +119 -0
- package/.agent-src/skills/project-analysis-nextjs/SKILL.md +123 -0
- package/.agent-src/skills/project-analysis-node-express/SKILL.md +111 -0
- package/.agent-src/skills/project-analysis-react/SKILL.md +119 -0
- package/.agent-src/skills/project-analysis-symfony/SKILL.md +111 -0
- package/.agent-src/skills/project-analysis-zend-laminas/SKILL.md +108 -0
- package/.agent-src/skills/project-analyzer/SKILL.md +341 -0
- package/.agent-src/skills/project-docs/SKILL.md +137 -0
- package/.agent-src/skills/quality-tools/SKILL.md +411 -0
- package/.agent-src/skills/readme-reviewer/SKILL.md +187 -0
- package/.agent-src/skills/readme-writing/SKILL.md +142 -0
- package/.agent-src/skills/readme-writing-package/SKILL.md +185 -0
- package/.agent-src/skills/receiving-code-review/SKILL.md +190 -0
- package/.agent-src/skills/refine-ticket/SKILL.md +310 -0
- package/.agent-src/skills/refine-ticket/detection-map.yml +124 -0
- package/.agent-src/skills/refine-ticket/evals/output-schema.yml +16 -0
- package/.agent-src/skills/refine-ticket/evals/triggers.json +16 -0
- package/.agent-src/skills/requesting-code-review/SKILL.md +199 -0
- package/.agent-src/skills/review-routing/SKILL.md +195 -0
- package/.agent-src/skills/roadmap-management/SKILL.md +303 -0
- package/.agent-src/skills/rtk-output-filtering/SKILL.md +184 -0
- package/.agent-src/skills/rule-writing/SKILL.md +148 -0
- package/.agent-src/skills/security/SKILL.md +79 -0
- package/.agent-src/skills/security-audit/SKILL.md +123 -0
- package/.agent-src/skills/sentry-integration/SKILL.md +170 -0
- package/.agent-src/skills/sequential-thinking/SKILL.md +158 -0
- package/.agent-src/skills/skill-improvement-pipeline/SKILL.md +155 -0
- package/.agent-src/skills/skill-management/SKILL.md +121 -0
- package/.agent-src/skills/skill-reviewer/SKILL.md +218 -0
- package/.agent-src/skills/skill-writing/SKILL.md +291 -0
- package/.agent-src/skills/skill-writing/evals/triggers.json +16 -0
- package/.agent-src/skills/sql-writing/SKILL.md +74 -0
- package/.agent-src/skills/subagent-orchestration/SKILL.md +190 -0
- package/.agent-src/skills/systematic-debugging/SKILL.md +244 -0
- package/.agent-src/skills/technical-specification/SKILL.md +185 -0
- package/.agent-src/skills/terraform/SKILL.md +137 -0
- package/.agent-src/skills/terragrunt/SKILL.md +217 -0
- package/.agent-src/skills/test-driven-development/SKILL.md +252 -0
- package/.agent-src/skills/test-performance/SKILL.md +172 -0
- package/.agent-src/skills/threat-modeling/SKILL.md +189 -0
- package/.agent-src/skills/traefik/SKILL.md +319 -0
- package/.agent-src/skills/universal-project-analysis/SKILL.md +179 -0
- package/.agent-src/skills/upstream-contribute/SKILL.md +255 -0
- package/.agent-src/skills/using-git-worktrees/SKILL.md +148 -0
- package/.agent-src/skills/validate-feature-fit/SKILL.md +113 -0
- package/.agent-src/skills/verify-before-complete/SKILL.md +188 -0
- package/.agent-src/skills/websocket/SKILL.md +75 -0
- package/.agent-src/templates/AGENTS.md +146 -0
- package/.agent-src/templates/agent-settings.md +256 -0
- package/.agent-src/templates/agents/.gitattributes.fragment +16 -0
- package/.agent-src/templates/agents/agent-project-settings.example.yml +138 -0
- package/.agent-src/templates/agents/memory/architecture-decisions.example.yml +95 -0
- package/.agent-src/templates/agents/memory/domain-invariants.example.yml +80 -0
- package/.agent-src/templates/agents/memory/historical-patterns.example.yml +82 -0
- package/.agent-src/templates/agents/memory/incident-learnings.example.yml +113 -0
- package/.agent-src/templates/agents/memory/ownership.example.yml +75 -0
- package/.agent-src/templates/agents/memory/product-rules.example.yml +87 -0
- package/.agent-src/templates/agents/proposal.example.md +143 -0
- package/.agent-src/templates/command.md +84 -0
- package/.agent-src/templates/contexts/auth-model.md +59 -0
- package/.agent-src/templates/contexts/data-sensitivity.md +60 -0
- package/.agent-src/templates/contexts/deployment-order.md +72 -0
- package/.agent-src/templates/contexts/observability.md +64 -0
- package/.agent-src/templates/contexts/tenant-boundaries.md +68 -0
- package/.agent-src/templates/contexts.md +116 -0
- package/.agent-src/templates/copilot-instructions.md +115 -0
- package/.agent-src/templates/features.md +125 -0
- package/.agent-src/templates/github-workflows/memory-hygiene.yml +133 -0
- package/.agent-src/templates/github-workflows/pr-risk-review.yml +123 -0
- package/.agent-src/templates/github-workflows/proposal-drift.yml +118 -0
- package/.agent-src/templates/overrides/command.md +24 -0
- package/.agent-src/templates/overrides/guideline.md +21 -0
- package/.agent-src/templates/overrides/rule.md +19 -0
- package/.agent-src/templates/overrides/skill.md +24 -0
- package/.agent-src/templates/overrides/template.md +21 -0
- package/.agent-src/templates/persona.md +99 -0
- package/.agent-src/templates/roadmaps.md +109 -0
- package/.agent-src/templates/scripts/README.md +195 -0
- package/.agent-src/templates/scripts/check_memory.py +283 -0
- package/.agent-src/templates/scripts/check_memory_proposal.py +180 -0
- package/.agent-src/templates/scripts/historical-bug-patterns.example.yml +84 -0
- package/.agent-src/templates/scripts/implement_ticket/__init__.py +57 -0
- package/.agent-src/templates/scripts/implement_ticket/__main__.py +9 -0
- package/.agent-src/templates/scripts/implement_ticket/cli.py +171 -0
- package/.agent-src/templates/scripts/implement_ticket/delivery_state.py +130 -0
- package/.agent-src/templates/scripts/implement_ticket/dispatcher.py +134 -0
- package/.agent-src/templates/scripts/implement_ticket/persona_policy.py +85 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/__init__.py +49 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/analyze.py +98 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/implement.py +145 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/memory.py +136 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/plan.py +175 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/refine.py +140 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/report.py +195 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/test.py +180 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/verify.py +170 -0
- package/.agent-src/templates/scripts/memory_hash.py +75 -0
- package/.agent-src/templates/scripts/memory_lookup.py +216 -0
- package/.agent-src/templates/scripts/memory_report.py +184 -0
- package/.agent-src/templates/scripts/memory_signal.py +167 -0
- package/.agent-src/templates/scripts/memory_status.py +156 -0
- package/.agent-src/templates/scripts/ownership-map.example.yml +87 -0
- package/.agent-src/templates/scripts/pr-risk-config.example.yml +76 -0
- package/.agent-src/templates/scripts/pr_review_routing.py +340 -0
- package/.agent-src/templates/scripts/pr_risk_review.py +211 -0
- package/.agent-src/templates/skill.md +136 -0
- package/.augment-plugin/marketplace.json +32 -0
- package/.augment-plugin/plugin.json +21 -0
- package/.claude-plugin/marketplace.json +119 -0
- package/AGENTS.md +121 -0
- package/CHANGELOG.md +279 -0
- package/CONTRIBUTING.md +176 -0
- package/LICENSE +21 -0
- package/README.md +357 -0
- package/bin/install.php +38 -0
- package/composer.json +29 -0
- package/config/agent-settings.template.yml +96 -0
- package/config/profiles/balanced.ini +10 -0
- package/config/profiles/full.ini +10 -0
- package/config/profiles/minimal.ini +10 -0
- package/docs/architecture.md +144 -0
- package/docs/customization.md +88 -0
- package/docs/development.md +171 -0
- package/docs/getting-started.md +130 -0
- package/docs/github-topics.md +84 -0
- package/docs/installation.md +376 -0
- package/docs/mcp.md +133 -0
- package/docs/quality.md +98 -0
- package/docs/skills-catalog.md +136 -0
- package/docs/troubleshooting.md +167 -0
- package/llms.txt +130 -0
- package/package.json +31 -0
- package/scripts/audit_skill_descriptions.py +168 -0
- package/scripts/check_compression.py +221 -0
- package/scripts/check_memory.py +341 -0
- package/scripts/check_memory_proposal.py +180 -0
- package/scripts/check_portability.py +320 -0
- package/scripts/check_proposal.py +269 -0
- package/scripts/check_references.py +400 -0
- package/scripts/ci_summary.py +131 -0
- package/scripts/compress.py +671 -0
- package/scripts/compress.sh +18 -0
- package/scripts/first-run.sh +109 -0
- package/scripts/generate_catalog.py +116 -0
- package/scripts/install +151 -0
- package/scripts/install-hooks.sh +29 -0
- package/scripts/install.py +487 -0
- package/scripts/install.sh +637 -0
- package/scripts/install_anthropic_key.sh +101 -0
- package/scripts/inventory_frontmatter.py +164 -0
- package/scripts/lint_marketplace.py +142 -0
- package/scripts/lint_regression.py +232 -0
- package/scripts/mcp_render.py +159 -0
- package/scripts/measure_patterns.py +376 -0
- package/scripts/memory_hash.py +75 -0
- package/scripts/memory_lookup.py +441 -0
- package/scripts/memory_report.py +336 -0
- package/scripts/memory_signal.py +210 -0
- package/scripts/memory_status.py +195 -0
- package/scripts/postinstall.sh +60 -0
- package/scripts/readme_linter.py +580 -0
- package/scripts/refine_ticket_detect.py +623 -0
- package/scripts/requirements-evals.txt +7 -0
- package/scripts/runtime_dispatcher.py +265 -0
- package/scripts/runtime_handler.py +148 -0
- package/scripts/runtime_registry.py +166 -0
- package/scripts/schemas/command.schema.json +32 -0
- package/scripts/schemas/persona.schema.json +42 -0
- package/scripts/schemas/rule.schema.json +28 -0
- package/scripts/schemas/skill.schema.json +73 -0
- package/scripts/setup.sh +230 -0
- package/scripts/setup_eval_venv.sh +58 -0
- package/scripts/skill_linter.py +2175 -0
- package/scripts/skill_trigger_eval.py +651 -0
- package/scripts/tool_registry.py +146 -0
- package/scripts/tools/__init__.py +1 -0
- package/scripts/tools/adapter_errors.py +63 -0
- package/scripts/tools/base_adapter.py +91 -0
- package/scripts/tools/github_adapter.py +128 -0
- package/scripts/tools/jira_adapter.py +115 -0
- package/scripts/update_counts.py +147 -0
- package/scripts/validate_frontmatter.py +424 -0
- package/templates/consumer-settings/README.md +46 -0
- package/templates/consumer-settings/augment-settings.json +12 -0
- package/templates/consumer-settings/claude-settings.json +9 -0
- package/templates/consumer-settings/copilot-settings.json +14 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: terragrunt
|
|
3
|
+
description: "Use when working with Terragrunt — DRY multi-env configs, module dependencies, remote state orchestration — even when the user just says 'deploy this to staging and prod' without naming Terragrunt."
|
|
4
|
+
source: package
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# terragrunt
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
Use this skill when working with Terragrunt configurations (`.hcl` files), managing environment-specific settings, or orchestrating multi-module deployments.
|
|
12
|
+
|
|
13
|
+
## Procedure: Write Terragrunt config
|
|
14
|
+
|
|
15
|
+
1. Read the `root.hcl` in the target environment (`environments/pro/root.hcl` or `environments/sta/root.hcl`).
|
|
16
|
+
2. Check existing `terragrunt.hcl` files in sibling directories for patterns.
|
|
17
|
+
3. Read the target module's `variables.tf` to understand required inputs.
|
|
18
|
+
|
|
19
|
+
## Project structure
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
environments/
|
|
23
|
+
├── pro/
|
|
24
|
+
│ ├── root.hcl # Root config (backend, providers)
|
|
25
|
+
│ ├── core/
|
|
26
|
+
│ │ ├── terragrunt.hcl # Core module config
|
|
27
|
+
│ │ └── {service}.yaml # Module-specific variables
|
|
28
|
+
│ ├── {service}/
|
|
29
|
+
│ │ ├── terragrunt.hcl # Service module config
|
|
30
|
+
│ │ └── {service}.yaml # Service-specific variables
|
|
31
|
+
│ └── ...
|
|
32
|
+
└── sta/
|
|
33
|
+
├── root.hcl
|
|
34
|
+
└── ...
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Root configuration (`root.hcl`)
|
|
38
|
+
|
|
39
|
+
The root HCL defines shared settings for all modules in an environment:
|
|
40
|
+
|
|
41
|
+
### Environment variables
|
|
42
|
+
|
|
43
|
+
```hcl
|
|
44
|
+
locals {
|
|
45
|
+
env_files = merge(
|
|
46
|
+
yamldecode(file(".env.yaml")), # Base env vars
|
|
47
|
+
try(yamldecode(file(".env.local.yaml")), {}) # Local overrides
|
|
48
|
+
)
|
|
49
|
+
env = { for k, v in local.env_files : k => get_env(k, v) }
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
- `.env.yaml` — committed, shared environment config
|
|
54
|
+
- `.env.local.yaml` — gitignored, local overrides (AWS profiles, etc.)
|
|
55
|
+
- Real environment variables take precedence over file values.
|
|
56
|
+
|
|
57
|
+
### Remote state
|
|
58
|
+
|
|
59
|
+
```hcl
|
|
60
|
+
remote_state {
|
|
61
|
+
backend = "s3"
|
|
62
|
+
config = {
|
|
63
|
+
bucket = "${local.env.aws_account_name}-terraform-remote-state"
|
|
64
|
+
key = "${path_relative_to_include()}/terraform.tfstate"
|
|
65
|
+
dynamodb_table = "${local.env.aws_account_name}-terraform-remote-state"
|
|
66
|
+
profile = local.env.aws_profile
|
|
67
|
+
region = local.env.aws_region
|
|
68
|
+
encrypt = true
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Provider generation
|
|
74
|
+
|
|
75
|
+
Providers are auto-generated by Terragrunt (not manually written):
|
|
76
|
+
|
|
77
|
+
```hcl
|
|
78
|
+
generate "provider" {
|
|
79
|
+
path = "provider-aws.tf"
|
|
80
|
+
if_exists = "overwrite_terragrunt"
|
|
81
|
+
contents = <<EOF
|
|
82
|
+
provider "aws" {
|
|
83
|
+
allowed_account_ids = ["${local.env.aws_account_id}"]
|
|
84
|
+
profile = "${local.env.aws_profile}"
|
|
85
|
+
region = "${local.env.aws_region}"
|
|
86
|
+
}
|
|
87
|
+
EOF
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Terraform binary
|
|
92
|
+
|
|
93
|
+
```hcl
|
|
94
|
+
terraform_binary = "terraform" # Explicitly NOT OpenTofu
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Module configuration (`terragrunt.hcl`)
|
|
98
|
+
|
|
99
|
+
Each module directory contains a `terragrunt.hcl` that:
|
|
100
|
+
|
|
101
|
+
1. **Loads module-specific variables** from a YAML file
|
|
102
|
+
2. **Includes the root config** for backend and providers
|
|
103
|
+
3. **Points to the Terraform module source**
|
|
104
|
+
4. **Declares dependencies** on other modules
|
|
105
|
+
5. **Passes inputs** by merging dependency outputs with local variables
|
|
106
|
+
|
|
107
|
+
### Example pattern
|
|
108
|
+
|
|
109
|
+
```hcl
|
|
110
|
+
locals {
|
|
111
|
+
project = yamldecode(file("{service}.yaml"))
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
include {
|
|
115
|
+
path = find_in_parent_folders("root.hcl")
|
|
116
|
+
expose = true
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
terraform {
|
|
120
|
+
source = "../../..//modules/{service}"
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
dependency "core" {
|
|
124
|
+
config_path = "../core"
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
inputs = merge(
|
|
128
|
+
dependency.core.outputs,
|
|
129
|
+
local.project
|
|
130
|
+
)
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Conventions
|
|
134
|
+
|
|
135
|
+
### Variable files
|
|
136
|
+
|
|
137
|
+
- Use **YAML files** (not HCL) for module-specific variables.
|
|
138
|
+
- Name them after the module (e.g., `my-service.yaml`).
|
|
139
|
+
- Keep them in the same directory as `terragrunt.hcl`.
|
|
140
|
+
|
|
141
|
+
### Dependencies
|
|
142
|
+
|
|
143
|
+
- Use `dependency` blocks to reference other modules.
|
|
144
|
+
- Core module outputs (VPC, DNS zones, etc.) are passed via `dependency.core.outputs`.
|
|
145
|
+
- Merge dependency outputs with local variables in `inputs`.
|
|
146
|
+
|
|
147
|
+
### Additional providers
|
|
148
|
+
|
|
149
|
+
Some modules need extra providers (e.g., New Relic). Generate them in the module's `terragrunt.hcl`:
|
|
150
|
+
|
|
151
|
+
```hcl
|
|
152
|
+
generate "provider_newrelic" {
|
|
153
|
+
path = "provider-newrelic.tf"
|
|
154
|
+
if_exists = "overwrite_terragrunt"
|
|
155
|
+
contents = <<EOF
|
|
156
|
+
provider "newrelic" {
|
|
157
|
+
account_id = "${include.locals.env.newrelic_account_id}"
|
|
158
|
+
api_key = "${get_env("TF_VAR_newrelic_api_key", include.locals.env.newrelic_api_key)}"
|
|
159
|
+
}
|
|
160
|
+
EOF
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Development tools
|
|
165
|
+
|
|
166
|
+
The project uses **devbox** for tool management:
|
|
167
|
+
|
|
168
|
+
```json
|
|
169
|
+
{
|
|
170
|
+
"packages": ["terragrunt", "awscli2", "terraform@latest"]
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Taskfile commands
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
task versions # Show awscli, Terraform, Terragrunt versions
|
|
178
|
+
task check:awscli # Verify AWS CLI is configured
|
|
179
|
+
task cache:clear # Clear .terraform and .terragrunt-cache dirs
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Quick commands (devbox scripts)
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
devbox run i # terragrunt init
|
|
186
|
+
devbox run p # terragrunt plan
|
|
187
|
+
devbox run a # terragrunt apply
|
|
188
|
+
devbox run d # terragrunt destroy
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
## Output format
|
|
193
|
+
|
|
194
|
+
1. Terragrunt HCL files with DRY environment configuration
|
|
195
|
+
2. Dependency graph and remote state references
|
|
196
|
+
|
|
197
|
+
## Auto-trigger keywords
|
|
198
|
+
|
|
199
|
+
- Terragrunt
|
|
200
|
+
- multi-environment
|
|
201
|
+
- DRY config
|
|
202
|
+
- remote state
|
|
203
|
+
|
|
204
|
+
## Gotcha
|
|
205
|
+
|
|
206
|
+
- Terragrunt `dependency` blocks create implicit ordering — circular dependencies cause cryptic errors.
|
|
207
|
+
- Don't duplicate Terraform variables in terragrunt.hcl — use `inputs` to pass them through.
|
|
208
|
+
- The model tends to hardcode values that should come from `include` blocks — use DRY patterns.
|
|
209
|
+
|
|
210
|
+
## Do NOT
|
|
211
|
+
|
|
212
|
+
- Do NOT switch to OpenTofu — the project explicitly uses `terraform_binary = "terraform"`.
|
|
213
|
+
- Do NOT hardcode AWS credentials — use AWS profiles from `.env.yaml`.
|
|
214
|
+
- Do NOT commit `.env.local.yaml` — it contains local AWS profile overrides.
|
|
215
|
+
- Do NOT modify `root.hcl` without understanding the impact on all modules.
|
|
216
|
+
- Do NOT remove `dependency` blocks — they ensure correct apply order.
|
|
217
|
+
- Do NOT use `terraform` commands directly — always use `terragrunt` as the wrapper.
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test-driven-development
|
|
3
|
+
description: "Use when implementing a feature, fixing a bug, or refactoring — write a failing test first, then the code — even if the user just says 'add this function' or 'fix this bug'."
|
|
4
|
+
source: package
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# test-driven-development
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
* Adding a new function, method, or behavior
|
|
12
|
+
* Fixing a bug (bug needs a regression test before the fix)
|
|
13
|
+
* Refactoring a unit whose current behavior is unclear
|
|
14
|
+
* Any task where expected behavior can be expressed as an assertion
|
|
15
|
+
|
|
16
|
+
Do NOT use when:
|
|
17
|
+
|
|
18
|
+
* Throwaway prototype or spike code explicitly marked as exploration
|
|
19
|
+
* Boilerplate generation (migrations, config, scaffolding)
|
|
20
|
+
* Pure documentation (`.md`, `AGENTS.md`, README)
|
|
21
|
+
* Working inside this `agent-config` package on skill/rule markdown
|
|
22
|
+
|
|
23
|
+
## Goal
|
|
24
|
+
|
|
25
|
+
* Drive implementation from a verified-failing test, not the agent's
|
|
26
|
+
belief that code "should work".
|
|
27
|
+
* Catch edge cases **before** production bugs.
|
|
28
|
+
* Leave every change with a regression test running in CI.
|
|
29
|
+
|
|
30
|
+
## The core discipline
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
1. Write ONE failing test that describes the desired behavior.
|
|
34
|
+
2. Run it. WATCH it fail for the right reason.
|
|
35
|
+
3. Write the MINIMUM production code to make it pass.
|
|
36
|
+
4. Run it again. Watch it pass.
|
|
37
|
+
5. Clean up (rename, deduplicate) while keeping the test green.
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
If step 2 is skipped, the test is not trusted — a test that has never
|
|
41
|
+
failed proves nothing.
|
|
42
|
+
|
|
43
|
+
## Procedure
|
|
44
|
+
|
|
45
|
+
### 1. Identify the behavior to test
|
|
46
|
+
|
|
47
|
+
State in one sentence: *"When X happens, the system should do Y."*
|
|
48
|
+
|
|
49
|
+
Cannot state in one sentence? Scope too big — split into multiple tests,
|
|
50
|
+
one sentence each.
|
|
51
|
+
|
|
52
|
+
### 2. Write the failing test first
|
|
53
|
+
|
|
54
|
+
Smallest test expressing step-1 sentence.
|
|
55
|
+
|
|
56
|
+
* One assertion per behavior (multiple assertions OK only when describing
|
|
57
|
+
the same single behavior).
|
|
58
|
+
* Real code paths, not mocks — mock only at I/O boundaries (HTTP, DB, time).
|
|
59
|
+
* Descriptive name: `it_rejects_empty_email`, not `test_email_1`.
|
|
60
|
+
|
|
61
|
+
### 3. Run the test and watch it fail
|
|
62
|
+
|
|
63
|
+
Execute the single test (targeted, not full suite):
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# PHP/Pest
|
|
67
|
+
./vendor/bin/pest --filter=it_rejects_empty_email
|
|
68
|
+
|
|
69
|
+
# JS/Vitest
|
|
70
|
+
npx vitest run --testNamePattern "rejects empty email"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Required observations **before proceeding**:
|
|
74
|
+
|
|
75
|
+
* Test **fails** (not errors).
|
|
76
|
+
* Failure message matches expectation (missing behavior, not typo).
|
|
77
|
+
* Passes immediately → it does not test what you think. Fix the test,
|
|
78
|
+
do not start writing production code.
|
|
79
|
+
|
|
80
|
+
### 4. Write minimum code to pass
|
|
81
|
+
|
|
82
|
+
**Just enough** production code to make the test green. No extra
|
|
83
|
+
features, no unrelated refactoring, no "while I'm here" cleanups.
|
|
84
|
+
|
|
85
|
+
Urge to add a parameter, edge case, or helper not covered by current
|
|
86
|
+
test → stop. Belongs in the next RED step, not this GREEN step.
|
|
87
|
+
|
|
88
|
+
### 5. Run again and watch it pass
|
|
89
|
+
|
|
90
|
+
Re-run the same targeted command. Required:
|
|
91
|
+
|
|
92
|
+
* New test passes.
|
|
93
|
+
* No previously green tests turned red.
|
|
94
|
+
* Output clean (no new warnings, deprecations, or noise).
|
|
95
|
+
|
|
96
|
+
### 6. Refactor (only if green)
|
|
97
|
+
|
|
98
|
+
With all tests green, you may:
|
|
99
|
+
|
|
100
|
+
* Rename variables, methods, files
|
|
101
|
+
* Extract duplication into helpers
|
|
102
|
+
* Tighten types
|
|
103
|
+
|
|
104
|
+
Do **not** add new behavior during refactor — needs its own failing test
|
|
105
|
+
first. Re-run tests after refactor to confirm still-green.
|
|
106
|
+
|
|
107
|
+
### 7. Repeat for the next behavior
|
|
108
|
+
|
|
109
|
+
Back to step 1 with the next single-sentence behavior.
|
|
110
|
+
|
|
111
|
+
## Output format
|
|
112
|
+
|
|
113
|
+
1. Failing test (file + test name) with captured failure output
|
|
114
|
+
2. Minimum-code diff that makes it pass
|
|
115
|
+
3. Captured green-run output
|
|
116
|
+
4. Refactor diff (optional)
|
|
117
|
+
|
|
118
|
+
## Anti-rationalizations table
|
|
119
|
+
|
|
120
|
+
The urge to skip TDD is strongest when TDD matters most. Name the
|
|
121
|
+
rationalization and reject it:
|
|
122
|
+
|
|
123
|
+
| Thought | Reality |
|
|
124
|
+
|---|---|
|
|
125
|
+
| "Too simple to need a test" | Simple code still breaks. A test costs less than one debug cycle. |
|
|
126
|
+
| "I'll add the test after the code works" | A test written after code passes on first run — never failed. Proves nothing. |
|
|
127
|
+
| "I already ran it manually" | Manual runs not repeatable. Next edit breaks it silently. |
|
|
128
|
+
| "Deleting code I just wrote is wasteful" | Sunk cost. Cheap path: delete, write test, reimplement minimally. |
|
|
129
|
+
| "I'll keep the code as reference while I write the test" | You will adapt it. That is test-after-the-fact with extra steps. Delete it. |
|
|
130
|
+
| "I just need to explore the API first" | Spike on a throwaway branch. Then delete and restart with TDD. |
|
|
131
|
+
| "The test is too hard to write" | Signals a design problem in the code, not the test. Listen. |
|
|
132
|
+
| "This bug is urgent, no time for a test" | The test **is** the fastest path to a verified fix. Guessing takes longer. |
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
## Examples
|
|
136
|
+
|
|
137
|
+
### PHP / Pest
|
|
138
|
+
|
|
139
|
+
```php
|
|
140
|
+
// tests/Unit/EmailValidatorTest.php — RED
|
|
141
|
+
it('rejects empty email', function () {
|
|
142
|
+
$result = (new EmailValidator())->validate('');
|
|
143
|
+
expect($result->isValid())->toBeFalse();
|
|
144
|
+
expect($result->error())->toBe('Email required');
|
|
145
|
+
});
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Run: `./vendor/bin/pest --filter='rejects empty email'` → fails
|
|
149
|
+
(EmailValidator does not exist yet, or returns isValid()=true).
|
|
150
|
+
|
|
151
|
+
```php
|
|
152
|
+
// app/Validators/EmailValidator.php — GREEN (minimum)
|
|
153
|
+
final class EmailValidator
|
|
154
|
+
{
|
|
155
|
+
public function validate(string $email): EmailResult
|
|
156
|
+
{
|
|
157
|
+
if (trim($email) === '') {
|
|
158
|
+
return EmailResult::invalid('Email required');
|
|
159
|
+
}
|
|
160
|
+
return EmailResult::valid();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Run filter again → passes. No additional rules (format, MX, length)
|
|
166
|
+
until a next failing test drives them.
|
|
167
|
+
|
|
168
|
+
### JS / Vitest
|
|
169
|
+
|
|
170
|
+
```ts
|
|
171
|
+
// src/retry.test.ts — RED
|
|
172
|
+
import { retry } from './retry';
|
|
173
|
+
|
|
174
|
+
it('retries a failing operation up to 3 times', async () => {
|
|
175
|
+
let attempts = 0;
|
|
176
|
+
const op = async () => {
|
|
177
|
+
attempts += 1;
|
|
178
|
+
if (attempts < 3) throw new Error('transient');
|
|
179
|
+
return 'ok';
|
|
180
|
+
};
|
|
181
|
+
await expect(retry(op)).resolves.toBe('ok');
|
|
182
|
+
expect(attempts).toBe(3);
|
|
183
|
+
});
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Run: `npx vitest run --testNamePattern "retries a failing"` → fails
|
|
187
|
+
(`retry` undefined).
|
|
188
|
+
|
|
189
|
+
```ts
|
|
190
|
+
// src/retry.ts — GREEN (minimum)
|
|
191
|
+
export async function retry<T>(op: () => Promise<T>): Promise<T> {
|
|
192
|
+
let lastError: unknown;
|
|
193
|
+
for (let i = 0; i < 3; i += 1) {
|
|
194
|
+
try { return await op(); } catch (e) { lastError = e; }
|
|
195
|
+
}
|
|
196
|
+
throw lastError;
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Run again → passes. Configurable attempt count, backoff, jitter all
|
|
201
|
+
wait for their own failing tests.
|
|
202
|
+
|
|
203
|
+
## Gotchas
|
|
204
|
+
|
|
205
|
+
* Running the full suite instead of a filtered test hides the RED→GREEN
|
|
206
|
+
signal in noise. Always target first.
|
|
207
|
+
* A test that passes on the very first run is not TDD — written against
|
|
208
|
+
existing code.
|
|
209
|
+
* `expect()` with three or four assertions on unrelated fields describes
|
|
210
|
+
multiple behaviors. Split them.
|
|
211
|
+
* Snapshot tests invert the discipline — they generate the expected
|
|
212
|
+
value from the code. Only use where human-readable output is the
|
|
213
|
+
contract (CLI, SQL strings).
|
|
214
|
+
* Mocking the thing under test (instead of its I/O) tests the mock.
|
|
215
|
+
|
|
216
|
+
## Do NOT
|
|
217
|
+
|
|
218
|
+
* Do NOT write or modify production code before the failing test exists
|
|
219
|
+
and has been observed to fail
|
|
220
|
+
* Do NOT accept a test that never failed as evidence the code works
|
|
221
|
+
* Do NOT bundle refactors into the GREEN step
|
|
222
|
+
* Do NOT silence a flaky test — diagnose or delete it
|
|
223
|
+
* Do NOT skip the targeted RED-run because "I know it fails"
|
|
224
|
+
|
|
225
|
+
## Anti-patterns
|
|
226
|
+
|
|
227
|
+
* `it('works')` — no behavior described
|
|
228
|
+
* One test covering "and/and/and" — split per behavior
|
|
229
|
+
* Test reaching into private state instead of observable behavior
|
|
230
|
+
* Test duplicating the production code's algorithm (tautology)
|
|
231
|
+
|
|
232
|
+
## When to hand over to another skill
|
|
233
|
+
|
|
234
|
+
* Quality tools, PHPStan, ECS, Rector → [`quality-tools`](../quality-tools/SKILL.md)
|
|
235
|
+
* Full Pest conventions, Laravel testing helpers → [`pest-testing`](../pest-testing/SKILL.md)
|
|
236
|
+
* Running tests inside Docker → [`tests-execute`](../tests-execute/SKILL.md)
|
|
237
|
+
* Investigating why a test fails for non-obvious reasons →
|
|
238
|
+
[`systematic-debugging`](../systematic-debugging/SKILL.md)
|
|
239
|
+
|
|
240
|
+
## Validation checklist
|
|
241
|
+
|
|
242
|
+
Before marking TDD work complete:
|
|
243
|
+
|
|
244
|
+
* [ ] Every new behavior has a test
|
|
245
|
+
* [ ] Each test was observed to fail first, with a matching failure message
|
|
246
|
+
* [ ] Minimum code was written to turn each RED into GREEN
|
|
247
|
+
* [ ] All targeted tests pass
|
|
248
|
+
* [ ] No adjacent test turned red
|
|
249
|
+
* [ ] Output clean (no new warnings or deprecations)
|
|
250
|
+
|
|
251
|
+
See also [`developer-like-execution`](../developer-like-execution/SKILL.md)
|
|
252
|
+
for the broader think → analyze → verify loop this skill plugs into.
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test-performance
|
|
3
|
+
description: "Use when optimizing test suite performance — database setup, seeder optimization, parallel testing, CI pipeline efficiency, or RefreshDatabase alternatives."
|
|
4
|
+
source: package
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# test-performance
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
Use this skill when:
|
|
12
|
+
|
|
13
|
+
- Tests are running too slowly (locally or in CI)
|
|
14
|
+
- Database setup/teardown is a bottleneck
|
|
15
|
+
- Parallel testing needs optimization
|
|
16
|
+
- Seeders need performance analysis
|
|
17
|
+
- CI pipeline test jobs need to be faster
|
|
18
|
+
- Investigating flaky tests caused by database state
|
|
19
|
+
|
|
20
|
+
## Procedure: Analyze test performance
|
|
21
|
+
|
|
22
|
+
### 1. Measure baseline
|
|
23
|
+
|
|
24
|
+
Before optimizing, always measure:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# Count tests per suite
|
|
28
|
+
find tests/ app/Modules/*/Tests/ -name "*.php" | xargs grep -l "it(" | wc -l
|
|
29
|
+
|
|
30
|
+
# Count by suite type
|
|
31
|
+
grep -rh "it(" tests/Unit/ app/Modules/*/Tests/Unit/ --include="*.php" | wc -l
|
|
32
|
+
grep -rh "it(" tests/Component/ app/Modules/*/Tests/Component/ --include="*.php" | wc -l
|
|
33
|
+
grep -rh "it(" tests/Integration/ app/Modules/*/Tests/Integration/ --include="*.php" | wc -l
|
|
34
|
+
|
|
35
|
+
# Count migrations
|
|
36
|
+
ls database/migrations/*.php | wc -l
|
|
37
|
+
|
|
38
|
+
# Count seeders
|
|
39
|
+
find database/seeders database/seeder-data -name "*.php" -path "*/data/*" | wc -l
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 2. Identify bottlenecks
|
|
43
|
+
|
|
44
|
+
The typical test lifecycle is:
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
Process Start → Migrate → Seed → [Test → Rollback] × N → Process End
|
|
48
|
+
↑ expensive (once per worker)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Check these areas in order of typical impact:
|
|
52
|
+
|
|
53
|
+
| Area | What to check | Typical impact |
|
|
54
|
+
|------|--------------|---------------|
|
|
55
|
+
| **Migration count** | How many CREATE TABLE statements? | High if >20 |
|
|
56
|
+
| **Schema dump** | Is `database/schema/` used? | High if missing |
|
|
57
|
+
| **Seeder INSERT method** | Individual `save()` vs bulk insert? | Medium |
|
|
58
|
+
| **Truncation** | Per-seeder truncate vs centralized? | Low (but causes correctness issues) |
|
|
59
|
+
| **Connection discovery** | Dynamic `getPdo()` probing? | Low |
|
|
60
|
+
| **Parallel worker setup** | Does each worker re-migrate? | High |
|
|
61
|
+
|
|
62
|
+
### 3. Optimization strategies (ordered by ROI)
|
|
63
|
+
|
|
64
|
+
#### A. Schema Dump (highest ROI)
|
|
65
|
+
|
|
66
|
+
Laravel's `schema:dump` consolidates all migrations into one SQL file.
|
|
67
|
+
Instead of running N individual CREATE TABLE migrations, it loads one SQL dump.
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
php artisan schema:dump --database=api_database
|
|
71
|
+
# Generates database/schema/api_database-schema.sql
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Savings:** 58 migrations → 1 SQL load = ~10-25s per worker.
|
|
75
|
+
|
|
76
|
+
#### B. Template DB Cloning (high ROI for parallel tests)
|
|
77
|
+
|
|
78
|
+
Instead of each parallel worker running migrate+seed independently:
|
|
79
|
+
1. Prepare ONE template database (migrate + seed)
|
|
80
|
+
2. Clone template for each worker via mysqldump
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# Prepare template
|
|
84
|
+
php artisan migrate:fresh --database=template_db
|
|
85
|
+
php artisan db:seed --database=template_db
|
|
86
|
+
|
|
87
|
+
# Clone per worker
|
|
88
|
+
mysqldump template_db | mysql worker_db_test_1
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Savings:** Eliminate per-worker migrate+seed entirely.
|
|
92
|
+
|
|
93
|
+
#### C. Skip Migrate+Seed Flag (high ROI for local dev)
|
|
94
|
+
|
|
95
|
+
Add a config flag to skip database setup when DB is already prepared:
|
|
96
|
+
|
|
97
|
+
```php
|
|
98
|
+
// config/testing.php
|
|
99
|
+
'skip_migrate_seed' => EnvHelper::boolean('TESTING_SKIP_MIGRATE_SEED', false),
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Developer workflow: `make migrate-testing` once, then `make test-quick` repeatedly.
|
|
103
|
+
|
|
104
|
+
#### D. Bulk Inserts in Seeders (medium ROI)
|
|
105
|
+
|
|
106
|
+
Replace individual `$model->save()` with bulk insert:
|
|
107
|
+
|
|
108
|
+
```php
|
|
109
|
+
// Before: N INSERT statements
|
|
110
|
+
foreach ($data as $row) {
|
|
111
|
+
$model = new MyModel($row);
|
|
112
|
+
$model->save();
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// After: 1 INSERT statement
|
|
116
|
+
MyModel::insert($data);
|
|
117
|
+
$models = MyModel::whereIn('id', $ids)->get();
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
#### E. Centralize Truncation (correctness fix)
|
|
121
|
+
|
|
122
|
+
Per-seeder truncation is redundant after `migrate:fresh` and causes:
|
|
123
|
+
- Non-deterministic ordering (lazy init triggers truncate)
|
|
124
|
+
- Ghost data bugs (locally passes, CI fails)
|
|
125
|
+
|
|
126
|
+
Make truncation configurable, default off:
|
|
127
|
+
|
|
128
|
+
```php
|
|
129
|
+
// config/testing.php
|
|
130
|
+
'seed_truncate' => EnvHelper::boolean('DB_SEED_TRUNCATE', false),
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
#### F. Static Connection Discovery (cleanup)
|
|
134
|
+
|
|
135
|
+
Replace dynamic `getPdo()` probing with explicit config:
|
|
136
|
+
|
|
137
|
+
```php
|
|
138
|
+
// config/testing.php
|
|
139
|
+
'connections_to_transact' => ['api_database', 'customer_database'],
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 4. CI-specific optimizations
|
|
143
|
+
|
|
144
|
+
- **MariaDB tmpfs:** Mount data dir on RAM disk for zero I/O latency
|
|
145
|
+
- **Shared DB prep:** One CI job prepares DB, test jobs clone from it
|
|
146
|
+
- **Cache test DBs:** Skip re-migration if migration files haven't changed
|
|
147
|
+
- **Separate suites:** Run no-DB tests (Unit) on cheaper runners
|
|
148
|
+
|
|
149
|
+
## Related project docs
|
|
150
|
+
|
|
151
|
+
- `agents/roadmaps/test-performance-refactor.md` — active roadmap for this project
|
|
152
|
+
- `agents/docs/seeders.md` — seeder conventions (if exists)
|
|
153
|
+
|
|
154
|
+
## Output format
|
|
155
|
+
|
|
156
|
+
1. Optimized test configuration or seeder with timing comparison
|
|
157
|
+
2. Parallelization or caching improvements applied
|
|
158
|
+
|
|
159
|
+
## Gotcha
|
|
160
|
+
|
|
161
|
+
- Don't use RefreshDatabase when DatabaseTransactions suffices — full refresh is 10x slower.
|
|
162
|
+
- The model forgets that parallel tests share the database — use unique identifiers in test data.
|
|
163
|
+
- Seeder optimization has the highest ROI — a 2s seeder running 100 times = 200s wasted.
|
|
164
|
+
- Don't add indexes to test databases just for test performance — the real fix is better test design.
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
## Do NOT
|
|
168
|
+
|
|
169
|
+
- Do NOT use RefreshDatabase when DatabaseTransactions works — 10x slower.
|
|
170
|
+
- Do NOT run full test suite on every code change — use `--filter`.
|
|
171
|
+
- Do NOT add test-only indexes — fix test design instead.
|
|
172
|
+
- Do NOT disable parallel testing to "fix" flaky tests — fix the root cause.
|