@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,153 @@
|
|
|
1
|
+
# readme-size-and-splitting-guidelines
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
Keep READMEs scannable as repositories grow. A README is an **entry
|
|
6
|
+
point**, not a reference manual. Once it stops working as entry point,
|
|
7
|
+
split — don't scroll.
|
|
8
|
+
|
|
9
|
+
Referenced by `readme-writing`, `readme-writing-package`, `readme-reviewer`.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Size thresholds
|
|
14
|
+
|
|
15
|
+
| Lines | State | Action |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| **< 150** | Healthy | No splitting needed |
|
|
18
|
+
| **150–300** | Busy | Add a Table of Contents; review for padding |
|
|
19
|
+
| **300–500** | Overloaded | Split deep content to `/docs/` or `references/` |
|
|
20
|
+
| **> 500** | Broken | Hard split required; README has stopped being an entry point |
|
|
21
|
+
|
|
22
|
+
Lines, not bytes — tables, code blocks, and badges inflate bytes but stay
|
|
23
|
+
scannable. The real signal is: **can a new reader reach install/usage
|
|
24
|
+
within the first screen, then navigate intentionally from there?**
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## When to split
|
|
29
|
+
|
|
30
|
+
Hard triggers — split immediately:
|
|
31
|
+
|
|
32
|
+
- **More than 5 install variants** (platforms, package managers, tools) →
|
|
33
|
+
move install matrix to a dedicated `docs/installation.md` or a table with
|
|
34
|
+
deep links
|
|
35
|
+
- **More than 3 framework adapters** → each adapter gets its own doc
|
|
36
|
+
- **Architecture or design rationale > 30 lines** → `docs/architecture.md`
|
|
37
|
+
- **API reference > 50 lines** → `docs/api.md` or auto-generated reference
|
|
38
|
+
- **Multiple audiences with different needs** → audience-specific docs
|
|
39
|
+
(`docs/consumers.md`, `docs/contributors.md`)
|
|
40
|
+
|
|
41
|
+
Soft triggers — review and probably split:
|
|
42
|
+
|
|
43
|
+
- A section needs its own Table of Contents
|
|
44
|
+
- Reader scrolls past three screens to reach "how do I use it"
|
|
45
|
+
- More than one code block per section explaining variations of the same
|
|
46
|
+
thing (indicates reference material, not onboarding)
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Splitting strategies
|
|
51
|
+
|
|
52
|
+
### Strategy 1 — Reference-split architecture (recommended for skills, packages)
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
README.md ← entry: what, why, install, minimal usage
|
|
56
|
+
docs/
|
|
57
|
+
installation.md ← full install matrix, post-install steps
|
|
58
|
+
usage.md ← extended examples, common patterns
|
|
59
|
+
architecture.md ← internal design, decisions
|
|
60
|
+
api.md ← full API reference
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
README stays < 200 lines. Each `/docs/` file is a self-contained chapter.
|
|
64
|
+
|
|
65
|
+
### Strategy 2 — Deep-link tables for multi-platform repos
|
|
66
|
+
|
|
67
|
+
Supporting many platforms or tool integrations: single table with deep
|
|
68
|
+
links beats inline blocks:
|
|
69
|
+
|
|
70
|
+
```markdown
|
|
71
|
+
| Tool | Install | Docs |
|
|
72
|
+
|---------|------------------------|-------------------------|
|
|
73
|
+
| Cursor | `./install.sh cursor` | [docs/cursor.md](...) |
|
|
74
|
+
| Aider | `./install.sh aider` | [docs/aider.md](...) |
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Pattern: 1 row per platform, actual how-to in the linked doc.
|
|
78
|
+
|
|
79
|
+
### Strategy 3 — Collapsible sections (`<details>`)
|
|
80
|
+
|
|
81
|
+
Content occasionally needed but crowding the scan path — long install
|
|
82
|
+
options, platform-specific quirks, troubleshooting trees:
|
|
83
|
+
|
|
84
|
+
```markdown
|
|
85
|
+
<details>
|
|
86
|
+
<summary>Troubleshooting: Docker on Apple Silicon</summary>
|
|
87
|
+
|
|
88
|
+
Content here — full detail, not shown by default.
|
|
89
|
+
|
|
90
|
+
</details>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Use sparingly. Collapsed content is still in the file; it defers visual
|
|
94
|
+
cost only. Not a substitute for true splitting when content > 30 lines.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Table of Contents heuristic
|
|
99
|
+
|
|
100
|
+
Add a ToC when:
|
|
101
|
+
|
|
102
|
+
- README > 150 lines, OR
|
|
103
|
+
- More than 6 top-level (`##`) sections, OR
|
|
104
|
+
- Reader would need to scroll to find a known section
|
|
105
|
+
|
|
106
|
+
Place the ToC **after** the one-line summary and **before** the first
|
|
107
|
+
substantive section (usually install or quickstart). Don't add a ToC to
|
|
108
|
+
small READMEs — becomes visual noise.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Multi-audience repos
|
|
113
|
+
|
|
114
|
+
A single README cannot serve "consumers of a package" and "contributors
|
|
115
|
+
to a package" equally. Choose one primary audience for the README,
|
|
116
|
+
deep-link the other:
|
|
117
|
+
|
|
118
|
+
- **Package repo** → consumers primary; contributors go to
|
|
119
|
+
`CONTRIBUTING.md` or `docs/development.md`
|
|
120
|
+
- **Application repo** → contributors/team primary; end users (if any)
|
|
121
|
+
go to `docs/user-guide.md`
|
|
122
|
+
|
|
123
|
+
README must declare its audience within the first screen. Readers in the
|
|
124
|
+
other audience must find their link within the first screen too.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Anti-patterns — do not split this way
|
|
129
|
+
|
|
130
|
+
- **Splitting by accident** — moving content out "because the README is long"
|
|
131
|
+
without a navigation story. Readers get lost.
|
|
132
|
+
- **Splitting and duplicating** — same content in README and `/docs/`.
|
|
133
|
+
They drift apart. Pick one home.
|
|
134
|
+
- **Deep-link-only README** — README that is just a table of contents
|
|
135
|
+
linking out. Reader arriving cold must still learn what/why/how-install
|
|
136
|
+
without clicking.
|
|
137
|
+
- **Premature splitting** — `docs/` scaffolding for a 50-line README.
|
|
138
|
+
Overhead not worth it; come back at 150 lines.
|
|
139
|
+
- **Hiding critical content in `<details>`** — install, first example, and
|
|
140
|
+
requirements are **never** collapsed.
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Validation checklist
|
|
145
|
+
|
|
146
|
+
- [ ] First screen answers what / why / install
|
|
147
|
+
- [ ] Size below "overloaded" threshold, or splitting is in place
|
|
148
|
+
- [ ] ToC present if > 150 lines or > 6 top-level sections
|
|
149
|
+
- [ ] No duplication between README and `/docs/`
|
|
150
|
+
- [ ] `<details>` used only for secondary, bulky content
|
|
151
|
+
- [ ] Multi-platform install uses a table, not 10 sequential install blocks
|
|
152
|
+
- [ ] Each `/docs/` file is self-contained and linked from README
|
|
153
|
+
- [ ] Audience explicit; other audience has a visible deep-link
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
# Playwright E2E Guidelines
|
|
2
|
+
|
|
3
|
+
> Best practices for writing end-to-end tests with Playwright.
|
|
4
|
+
> Applies to all projects using Playwright (API, web, or hybrid).
|
|
5
|
+
|
|
6
|
+
**Related Skills:** `playwright-testing`, `pest-testing`
|
|
7
|
+
**Related Guidelines:** [php.md](../php/general.md)
|
|
8
|
+
|
|
9
|
+
## Project Structure
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
tests/
|
|
13
|
+
e2e/
|
|
14
|
+
fixtures/ # Custom fixtures (auth, data, etc.)
|
|
15
|
+
pages/ # Page Object Models
|
|
16
|
+
specs/ # Test files grouped by feature
|
|
17
|
+
auth/
|
|
18
|
+
login.spec.ts
|
|
19
|
+
logout.spec.ts
|
|
20
|
+
dashboard/
|
|
21
|
+
overview.spec.ts
|
|
22
|
+
helpers/ # Shared utilities (API helpers, test data)
|
|
23
|
+
playwright.config.ts # Root config
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
- Group specs by **feature area**, not by page.
|
|
27
|
+
- One spec file per user workflow or feature.
|
|
28
|
+
- Keep Page Objects in `pages/`, fixtures in `fixtures/`.
|
|
29
|
+
|
|
30
|
+
## Locator Strategy (Priority Order)
|
|
31
|
+
|
|
32
|
+
| Priority | Locator | Example | When |
|
|
33
|
+
|---|---|---|---|
|
|
34
|
+
| 1 | **Role** | `getByRole('button', { name: 'Save' })` | Default — most accessible and resilient |
|
|
35
|
+
| 2 | **Label** | `getByLabel('Email')` | Form inputs with labels |
|
|
36
|
+
| 3 | **Placeholder** | `getByPlaceholder('Search...')` | Inputs without visible labels |
|
|
37
|
+
| 4 | **Text** | `getByText('Welcome back')` | Static visible content |
|
|
38
|
+
| 5 | **Test ID** | `getByTestId('submit-btn')` | When no semantic locator works |
|
|
39
|
+
| 6 | **CSS/XPath** | `page.locator('.class')` | **Avoid** — brittle, breaks on UI changes |
|
|
40
|
+
|
|
41
|
+
### Rules
|
|
42
|
+
|
|
43
|
+
- **Always prefer semantic locators** (`getByRole`, `getByLabel`) over CSS.
|
|
44
|
+
- Use `data-testid` as a stable fallback — add it to the component, not the test.
|
|
45
|
+
- Chain and filter locators to narrow scope: `page.getByRole('listitem').filter({ hasText: 'Product' })`.
|
|
46
|
+
- Never use auto-generated class names or dynamic IDs as selectors.
|
|
47
|
+
|
|
48
|
+
## Assertions
|
|
49
|
+
|
|
50
|
+
### Always use web-first assertions
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
// ✅ Auto-retrying — waits until condition is met
|
|
54
|
+
await expect(page.getByText('Success')).toBeVisible()
|
|
55
|
+
await expect(page.getByRole('list')).toHaveCount(5)
|
|
56
|
+
await expect(page).toHaveURL('/dashboard')
|
|
57
|
+
|
|
58
|
+
// ❌ Non-retrying — flaky
|
|
59
|
+
const text = await page.textContent('.message')
|
|
60
|
+
expect(text).toBe('Success')
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Use soft assertions for non-critical checks
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
await expect.soft(page.getByTestId('status')).toHaveText('Active')
|
|
67
|
+
await expect.soft(page.getByTestId('count')).toHaveText('42')
|
|
68
|
+
// Test continues even if soft assertions fail
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Waiting
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
// ✅ Wait for specific conditions
|
|
75
|
+
await page.waitForResponse(resp => resp.url().includes('/api/users') && resp.status() === 200)
|
|
76
|
+
await expect(page.getByText('Loaded')).toBeVisible()
|
|
77
|
+
|
|
78
|
+
// ❌ Never use fixed timeouts
|
|
79
|
+
await page.waitForTimeout(3000)
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
- **Never use `waitForTimeout()`** — use auto-retrying assertions or `waitForResponse`.
|
|
83
|
+
- Trust Playwright's auto-waiting for actions (click, fill, etc.).
|
|
84
|
+
- Use `networkidle` sparingly — prefer waiting for specific elements.
|
|
85
|
+
|
|
86
|
+
## Page Object Model
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
// pages/LoginPage.ts
|
|
90
|
+
import { type Page, type Locator } from '@playwright/test'
|
|
91
|
+
|
|
92
|
+
export class LoginPage {
|
|
93
|
+
private readonly emailInput: Locator
|
|
94
|
+
private readonly passwordInput: Locator
|
|
95
|
+
private readonly submitButton: Locator
|
|
96
|
+
|
|
97
|
+
constructor(private readonly page: Page) {
|
|
98
|
+
this.emailInput = page.getByLabel('Email')
|
|
99
|
+
this.passwordInput = page.getByLabel('Password')
|
|
100
|
+
this.submitButton = page.getByRole('button', { name: 'Sign in' })
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async goto(): Promise<void> {
|
|
104
|
+
await this.page.goto('/login')
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async login(email: string, password: string): Promise<void> {
|
|
108
|
+
await this.emailInput.fill(email)
|
|
109
|
+
await this.passwordInput.fill(password)
|
|
110
|
+
await this.submitButton.click()
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Rules
|
|
116
|
+
|
|
117
|
+
- One Page Object per page or major component.
|
|
118
|
+
- Locators are **defined in the constructor**, not inline in methods.
|
|
119
|
+
- Methods represent **user actions**, not DOM manipulations.
|
|
120
|
+
|
|
121
|
+
## Test Data Management
|
|
122
|
+
|
|
123
|
+
### API-based setup (preferred)
|
|
124
|
+
|
|
125
|
+
```ts
|
|
126
|
+
test.beforeEach(async ({ request }) => {
|
|
127
|
+
// Create test data via API — faster than UI
|
|
128
|
+
await request.post('/api/test/seed', { data: { scenario: 'basic-customer' } })
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
test.afterEach(async ({ request }) => {
|
|
132
|
+
await request.post('/api/test/cleanup')
|
|
133
|
+
})
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Rules
|
|
137
|
+
|
|
138
|
+
- **Prefer API calls** over UI interactions for test data setup — faster and more reliable.
|
|
139
|
+
- Use seeded test accounts with known credentials.
|
|
140
|
+
- Never depend on data created by another test.
|
|
141
|
+
- For database-backed apps: use a dedicated test database or transactional rollback.
|
|
142
|
+
|
|
143
|
+
## Configuration
|
|
144
|
+
|
|
145
|
+
### `playwright.config.ts` essentials
|
|
146
|
+
|
|
147
|
+
```ts
|
|
148
|
+
import { defineConfig, devices } from '@playwright/test'
|
|
149
|
+
|
|
150
|
+
export default defineConfig({
|
|
151
|
+
testDir: './tests/e2e/specs',
|
|
152
|
+
fullyParallel: true,
|
|
153
|
+
forbidOnly: !!process.env.CI,
|
|
154
|
+
retries: process.env.CI ? 2 : 0,
|
|
155
|
+
workers: process.env.CI ? 1 : undefined,
|
|
156
|
+
reporter: [
|
|
157
|
+
['html', { open: 'never' }],
|
|
158
|
+
...(process.env.CI ? [['github'] as const] : []),
|
|
159
|
+
],
|
|
160
|
+
use: {
|
|
161
|
+
baseURL: process.env.BASE_URL || 'http://localhost:3000',
|
|
162
|
+
trace: 'on-first-retry',
|
|
163
|
+
screenshot: 'only-on-failure',
|
|
164
|
+
video: 'retain-on-failure',
|
|
165
|
+
},
|
|
166
|
+
projects: [
|
|
167
|
+
{ name: 'chromium', use: { ...devices['Desktop Chrome'] } },
|
|
168
|
+
{ name: 'firefox', use: { ...devices['Desktop Firefox'] } },
|
|
169
|
+
{ name: 'webkit', use: { ...devices['Desktop Safari'] } },
|
|
170
|
+
{ name: 'mobile-chrome', use: { ...devices['Pixel 5'] } },
|
|
171
|
+
{ name: 'mobile-safari', use: { ...devices['iPhone 13'] } },
|
|
172
|
+
],
|
|
173
|
+
webServer: {
|
|
174
|
+
command: 'npm run dev',
|
|
175
|
+
url: 'http://localhost:3000',
|
|
176
|
+
reuseExistingServer: !process.env.CI,
|
|
177
|
+
},
|
|
178
|
+
})
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Key settings
|
|
182
|
+
|
|
183
|
+
| Setting | Local | CI | Why |
|
|
184
|
+
|---|---|---|---|
|
|
185
|
+
| `workers` | Auto (CPU cores) | `1` | Stability over speed in CI |
|
|
186
|
+
| `retries` | `0` | `2` | Catch flakes in CI, fail fast locally |
|
|
187
|
+
| `trace` | `off` | `on-first-retry` | Traces are expensive, only collect on failure |
|
|
188
|
+
| `fullyParallel` | `true` | `true` | Tests must be isolated anyway |
|
|
189
|
+
| `forbidOnly` | `false` | `true` | Prevent `.only` from reaching CI |
|
|
190
|
+
|
|
191
|
+
## CI Integration (GitHub Actions)
|
|
192
|
+
|
|
193
|
+
```yaml
|
|
194
|
+
name: E2E Tests
|
|
195
|
+
on:
|
|
196
|
+
push:
|
|
197
|
+
branches: [main]
|
|
198
|
+
pull_request:
|
|
199
|
+
branches: [main]
|
|
200
|
+
|
|
201
|
+
jobs:
|
|
202
|
+
e2e:
|
|
203
|
+
runs-on: ubuntu-latest
|
|
204
|
+
steps:
|
|
205
|
+
- uses: actions/checkout@v4
|
|
206
|
+
- uses: actions/setup-node@v4
|
|
207
|
+
with:
|
|
208
|
+
node-version: 20
|
|
209
|
+
- run: npm ci
|
|
210
|
+
- run: npx playwright install chromium --with-deps
|
|
211
|
+
- run: npx playwright test
|
|
212
|
+
- uses: actions/upload-artifact@v4
|
|
213
|
+
if: ${{ !cancelled() }}
|
|
214
|
+
with:
|
|
215
|
+
name: playwright-report
|
|
216
|
+
path: playwright-report/
|
|
217
|
+
retention-days: 14
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Sharding for large suites
|
|
221
|
+
|
|
222
|
+
```yaml
|
|
223
|
+
strategy:
|
|
224
|
+
matrix:
|
|
225
|
+
shard: [1, 2, 3, 4]
|
|
226
|
+
steps:
|
|
227
|
+
- run: npx playwright test --shard=${{ matrix.shard }}/4
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
- **Only install browsers you need** — `npx playwright install chromium --with-deps` not `npx playwright install`.
|
|
231
|
+
- Use **Linux runners** in CI — cheapest and most stable.
|
|
232
|
+
- Upload `playwright-report/` as artifact for failure debugging.
|
|
233
|
+
- Use **sharding** when suite exceeds ~5 minutes.
|
|
234
|
+
|
|
235
|
+
## Visual Regression
|
|
236
|
+
|
|
237
|
+
```ts
|
|
238
|
+
test('dashboard layout', async ({ page }) => {
|
|
239
|
+
await page.goto('/dashboard')
|
|
240
|
+
await expect(page).toHaveScreenshot('dashboard.png', {
|
|
241
|
+
maxDiffPixelRatio: 0.01,
|
|
242
|
+
fullPage: true,
|
|
243
|
+
})
|
|
244
|
+
})
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
- Store baselines in version control.
|
|
248
|
+
- Update with `npx playwright test --update-snapshots`.
|
|
249
|
+
- Pin OS + browser version in CI — visual diffs are platform-sensitive.
|
|
250
|
+
- Use `maxDiffPixelRatio` or `maxDiffPixels` for tolerance.
|
|
251
|
+
|
|
252
|
+
## Avoiding Flaky Tests
|
|
253
|
+
|
|
254
|
+
| Problem | Solution |
|
|
255
|
+
|---|---|
|
|
256
|
+
| Element not ready | Use auto-retrying assertions (`toBeVisible`, `toHaveText`) |
|
|
257
|
+
| Animation interference | Disable transitions: `page.addStyleTag({ content: '*, *::before, *::after { transition: none !important; animation: none !important; }' })` |
|
|
258
|
+
| Network timing | Wait for specific responses, not arbitrary timeouts |
|
|
259
|
+
| Test isolation | Fresh browser context per test (default) |
|
|
260
|
+
| Shared state | Reset data via API before each test |
|
|
261
|
+
| Date/time dependent | Use Playwright's clock API: `page.clock.setFixedTime()` |
|
|
262
|
+
| Third-party resources | Mock with `page.route()` |
|
|
263
|
+
|
|
264
|
+
## Debugging
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
# Headed mode — watch the browser
|
|
268
|
+
npx playwright test --headed
|
|
269
|
+
|
|
270
|
+
# Debug mode — step through with inspector
|
|
271
|
+
npx playwright test --debug
|
|
272
|
+
|
|
273
|
+
# Specific test
|
|
274
|
+
npx playwright test -g "should login"
|
|
275
|
+
|
|
276
|
+
# View HTML report
|
|
277
|
+
npx playwright show-report
|
|
278
|
+
|
|
279
|
+
# Generate tests interactively
|
|
280
|
+
npx playwright codegen http://localhost:3000
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## Handling Unfixable Tests
|
|
284
|
+
|
|
285
|
+
When a test fails and the failure is in the **application** (not the test), use `test.fixme()`:
|
|
286
|
+
|
|
287
|
+
```ts
|
|
288
|
+
test.fixme('should display user avatar', async ({ page }) => {
|
|
289
|
+
// BUG: Avatar endpoint returns 404 since API v2 migration.
|
|
290
|
+
// Tracked in JIRA: GALA-1234
|
|
291
|
+
await page.goto('/profile')
|
|
292
|
+
await expect(page.getByRole('img', { name: 'Avatar' })).toBeVisible()
|
|
293
|
+
})
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Rules
|
|
297
|
+
|
|
298
|
+
- Use `test.fixme()` — **not** `test.skip()` — for tests that should work but don't due to app bugs.
|
|
299
|
+
- Use `test.skip()` only for **environment-specific** skips (e.g., `test.skip(process.env.CI, 'requires local GPU')`).
|
|
300
|
+
- Always add a **comment before the failing step** explaining the current behavior vs. expected.
|
|
301
|
+
- Link to an issue tracker ticket if available.
|
|
302
|
+
|
|
303
|
+
## Healer Workflow (Debugging Failing Tests)
|
|
304
|
+
|
|
305
|
+
When tests fail, follow this systematic approach:
|
|
306
|
+
|
|
307
|
+
1. **Run** — Execute the failing test(s) to see current errors
|
|
308
|
+
2. **Debug** — Use `--debug` mode or trace viewer to inspect state at failure point
|
|
309
|
+
3. **Investigate** — Check: selectors changed? Timing issue? Data dependency? App change?
|
|
310
|
+
4. **Fix** — Update the test code (one fix at a time)
|
|
311
|
+
5. **Verify** — Re-run the specific test to confirm the fix
|
|
312
|
+
6. **Iterate** — Repeat until all tests pass
|
|
313
|
+
|
|
314
|
+
### Common failure patterns
|
|
315
|
+
|
|
316
|
+
| Symptom | Likely Cause | Fix |
|
|
317
|
+
|---|---|---|
|
|
318
|
+
| Element not found | Selector changed | Update locator, prefer semantic |
|
|
319
|
+
| Timeout waiting for element | Slow load / missing element | Add `waitForResponse` or check if feature removed |
|
|
320
|
+
| Assertion mismatch | App behavior changed | Update expected value or test logic |
|
|
321
|
+
| Intermittent pass/fail | Race condition | Add proper waits, remove shared state |
|
|
322
|
+
| Works locally, fails in CI | Environment difference | Check `baseURL`, headless mode, viewport |
|
|
323
|
+
|
|
324
|
+
### When to give up
|
|
325
|
+
|
|
326
|
+
If a test **consistently fails** despite correct test logic (confirmed by manual inspection):
|
|
327
|
+
- Mark with `test.fixme()` + detailed comment
|
|
328
|
+
- File a bug ticket for the underlying application issue
|
|
329
|
+
- Move on — don't spend more than 3 attempts fixing a single test
|
|
330
|
+
|
|
331
|
+
## Agent-Driven Test Pipeline
|
|
332
|
+
|
|
333
|
+
For AI-assisted E2E workflows, follow this pipeline:
|
|
334
|
+
|
|
335
|
+
### Phase 1: Plan
|
|
336
|
+
- Explore the application (navigate pages, identify flows)
|
|
337
|
+
- Document test scenarios in Markdown with numbered steps
|
|
338
|
+
- Include: happy path, edge cases, error handling, validation
|
|
339
|
+
|
|
340
|
+
### Phase 2: Generate
|
|
341
|
+
- Convert Markdown plans into Playwright test files
|
|
342
|
+
- Follow all conventions from this guideline
|
|
343
|
+
- One test file per scenario group
|
|
344
|
+
- Add step comments before each action
|
|
345
|
+
|
|
346
|
+
### Phase 3: Heal
|
|
347
|
+
- Run all generated tests
|
|
348
|
+
- Debug failures systematically (see Healer Workflow above)
|
|
349
|
+
- Fix or mark as `test.fixme()` if the app is broken
|
|
350
|
+
- Verify all fixes, iterate until green
|
|
351
|
+
|
|
352
|
+
## Do NOT
|
|
353
|
+
|
|
354
|
+
- Do NOT use `page.waitForTimeout()` — always wait for a condition.
|
|
355
|
+
- Do NOT use CSS selectors when `getByRole`/`getByLabel`/`getByTestId` work.
|
|
356
|
+
- Do NOT put assertions in Page Objects — only in test files.
|
|
357
|
+
- Do NOT share state between tests — each test must be independent.
|
|
358
|
+
- Do NOT hardcode URLs — use `baseURL` from config.
|
|
359
|
+
- Do NOT test third-party dependencies — mock external services with `page.route()`.
|
|
360
|
+
- Do NOT commit `.only` — use `forbidOnly: !!process.env.CI` to prevent this.
|
|
361
|
+
- Do NOT use `networkidle` as default `waitUntil` — it's slow and unreliable.
|
|
362
|
+
- Do NOT skip writing `data-testid` when no semantic locator is available.
|
|
363
|
+
- Do NOT use deprecated APIs — check Playwright changelog for removed features.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# API Design Guidelines
|
|
2
|
+
|
|
3
|
+
> API conventions — response format, status codes, pagination, error handling, rate limiting, route naming.
|
|
4
|
+
|
|
5
|
+
**Related Skills:** `api-design`, `api-endpoint`, `api-testing`
|
|
6
|
+
**Related Guidelines:** [controllers.md](controllers.md), [resources.md](resources.md)
|
|
7
|
+
|
|
8
|
+
## Response Format
|
|
9
|
+
|
|
10
|
+
- **Always use API Resource classes** — never return raw models or arrays.
|
|
11
|
+
- **Single item:** `{ "data": { ... } }`
|
|
12
|
+
- **Collection:** `{ "data": [ ... ], "meta": { ... }, "links": { ... } }`
|
|
13
|
+
|
|
14
|
+
## HTTP Status Codes
|
|
15
|
+
|
|
16
|
+
| Code | When |
|
|
17
|
+
|---|---|
|
|
18
|
+
| `200` | Successful GET, PUT, PATCH |
|
|
19
|
+
| `201` | Successful POST (resource created) |
|
|
20
|
+
| `204` | Successful DELETE (no content) |
|
|
21
|
+
| `400` | Bad request (malformed input) |
|
|
22
|
+
| `401` | Unauthenticated |
|
|
23
|
+
| `403` | Unauthorized (forbidden) |
|
|
24
|
+
| `404` | Resource not found |
|
|
25
|
+
| `422` | Validation error |
|
|
26
|
+
| `429` | Rate limited |
|
|
27
|
+
| `500` | Server error |
|
|
28
|
+
|
|
29
|
+
## Pagination
|
|
30
|
+
|
|
31
|
+
Use Laravel's built-in pagination for list endpoints:
|
|
32
|
+
|
|
33
|
+
```php
|
|
34
|
+
$projects = Project::query()
|
|
35
|
+
->filter($filters)
|
|
36
|
+
->paginate(perPage: $request->integer('per_page', 15));
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
| Parameter | Default | Description |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| `page` | 1 | Current page number |
|
|
42
|
+
| `per_page` | 15 | Items per page |
|
|
43
|
+
|
|
44
|
+
## Filtering and Sorting
|
|
45
|
+
|
|
46
|
+
- Use the project's **filter pipeline** pattern (see `agents/docs/query-filter.md`).
|
|
47
|
+
- Filter classes are dedicated, testable units — not inline query logic.
|
|
48
|
+
- Sorting via `sort` query parameter.
|
|
49
|
+
|
|
50
|
+
## Error Responses
|
|
51
|
+
|
|
52
|
+
### Validation errors (422)
|
|
53
|
+
|
|
54
|
+
Laravel's default format:
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"message": "The given data was invalid.",
|
|
59
|
+
"errors": {
|
|
60
|
+
"field": ["The field is required."]
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Application errors
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"message": "Human-readable error description."
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Error format must match existing project convention — not RFC 7807 or other standards.
|
|
74
|
+
|
|
75
|
+
## Rate Limiting
|
|
76
|
+
|
|
77
|
+
```php
|
|
78
|
+
// bootstrap/app.php or RouteServiceProvider
|
|
79
|
+
RateLimiter::for('api', function (Request $request) {
|
|
80
|
+
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
RateLimiter::for('auth', function (Request $request) {
|
|
84
|
+
return Limit::perMinute(5)->by($request->ip());
|
|
85
|
+
});
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Include in responses: `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `Retry-After` (on 429).
|
|
89
|
+
|
|
90
|
+
## Idempotency
|
|
91
|
+
|
|
92
|
+
For non-idempotent operations (POST), support idempotency keys:
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
POST /api/v1/orders
|
|
96
|
+
Idempotency-Key: unique-client-generated-uuid
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Route Naming
|
|
100
|
+
|
|
101
|
+
- Dot notation: `v1.projects.index`, `v1.projects.show`
|
|
102
|
+
- Route prefixes in kebab-case: `/api/v1/client-software`
|
|
103
|
+
- Controllers in singular: `ProjectController`
|
|
104
|
+
- Implicit route model binding where possible
|
|
105
|
+
- Scope bindings for nested resources
|
|
106
|
+
- Max nesting depth: 2 levels (`/users/{id}/orders/{id}`)
|
|
107
|
+
|
|
108
|
+
## Do NOT
|
|
109
|
+
|
|
110
|
+
- Return raw Eloquent models — always use API Resources.
|
|
111
|
+
- Put business logic in controllers — delegate to services.
|
|
112
|
+
- Create breaking changes in existing versions — create a new version.
|
|
113
|
+
- Use inconsistent response formats between endpoints.
|
|
114
|
+
- Expose internal IDs or database column names that should be hidden.
|
|
115
|
+
- Skip rate limiting on authentication endpoints.
|