@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,199 @@
|
|
|
1
|
+
# DTOs & Value Objects
|
|
2
|
+
|
|
3
|
+
> Typed data instead of untyped arrays.
|
|
4
|
+
|
|
5
|
+
## DTO (Data Transfer Object)
|
|
6
|
+
|
|
7
|
+
Structured, immutable data container for passing data between layers.
|
|
8
|
+
|
|
9
|
+
### When to Use
|
|
10
|
+
|
|
11
|
+
✅ Passing validated request data to a service/action
|
|
12
|
+
✅ Returning structured data from a service
|
|
13
|
+
✅ Replacing `array<string, mixed>` in method signatures
|
|
14
|
+
|
|
15
|
+
### Prefer a DTO base class (if available)
|
|
16
|
+
|
|
17
|
+
If the project uses a DTO package with attribute-based mapping (e.g., `SimpleDto`, `spatie/data-transfer-object`),
|
|
18
|
+
new DTOs **should extend the project's base class**. Check `composer.json` for DTO-related packages.
|
|
19
|
+
|
|
20
|
+
#### Attribute-based DTO Example
|
|
21
|
+
|
|
22
|
+
```php
|
|
23
|
+
use App\Models\Equipment;
|
|
24
|
+
use Vendor\DataHelpers\SimpleDto;
|
|
25
|
+
use Vendor\DataHelpers\SimpleDto\Attributes\ConvertEmptyToNull;
|
|
26
|
+
use Vendor\DataHelpers\SimpleDto\Attributes\DateTimeFormat;
|
|
27
|
+
use Vendor\DataHelpers\SimpleDto\Attributes\Decimal;
|
|
28
|
+
use Vendor\DataHelpers\SimpleDto\Attributes\HasModel;
|
|
29
|
+
use Vendor\DataHelpers\SimpleDto\Attributes\Length;
|
|
30
|
+
use Vendor\DataHelpers\SimpleDto\Attributes\Map;
|
|
31
|
+
use Vendor\DataHelpers\SimpleDto\Attributes\Unsigned;
|
|
32
|
+
use Carbon\Carbon;
|
|
33
|
+
|
|
34
|
+
#[ConvertEmptyToNull]
|
|
35
|
+
#[HasModel(Equipment::class)]
|
|
36
|
+
class EquipmentDto extends SimpleDto
|
|
37
|
+
{
|
|
38
|
+
public function __construct(
|
|
39
|
+
// Primary Key
|
|
40
|
+
#[Map('id_equipment')]
|
|
41
|
+
public ?int $id = null,
|
|
42
|
+
|
|
43
|
+
// Equipment identification
|
|
44
|
+
#[Map('equipment_nr'),
|
|
45
|
+
Length(50)]
|
|
46
|
+
public string $equipmentNumber = '',
|
|
47
|
+
|
|
48
|
+
#[Map('bezeichnung'),
|
|
49
|
+
Length(250)]
|
|
50
|
+
public string $title = '',
|
|
51
|
+
|
|
52
|
+
// External IDs (from client software)
|
|
53
|
+
#[Map('ext_uid'),
|
|
54
|
+
Length(250)]
|
|
55
|
+
public ?string $externalUid = null,
|
|
56
|
+
|
|
57
|
+
// Status
|
|
58
|
+
#[Map('is_active'),
|
|
59
|
+
Unsigned,
|
|
60
|
+
Length(1)]
|
|
61
|
+
public bool $isActive = true,
|
|
62
|
+
|
|
63
|
+
// Financial
|
|
64
|
+
#[Map('hourly_rate'),
|
|
65
|
+
Unsigned,
|
|
66
|
+
Decimal(10, 2)]
|
|
67
|
+
public float $hourlyRate = 0.0,
|
|
68
|
+
|
|
69
|
+
// Timestamps
|
|
70
|
+
#[Map('created_at'),
|
|
71
|
+
DateTimeFormat('Y-m-d H:i:s')]
|
|
72
|
+
public ?Carbon $createdAt = null,
|
|
73
|
+
|
|
74
|
+
#[Map('updated_at'),
|
|
75
|
+
DateTimeFormat('Y-m-d H:i:s')]
|
|
76
|
+
public ?Carbon $updatedAt = null,
|
|
77
|
+
) {}
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
#### Key attribute-based DTO features
|
|
82
|
+
|
|
83
|
+
- **`#[Map('db_column')]`** — Maps a readable property name to a database column or API field name
|
|
84
|
+
- **`#[Length(n)]`** — Validates max string length
|
|
85
|
+
- **`#[Decimal(precision, scale)]`** — Validates decimal format
|
|
86
|
+
- **`#[Unsigned]`** — Validates non-negative values
|
|
87
|
+
- **`#[DateTimeFormat('Y-m-d H:i:s')]`** — Casts to/from Carbon with the given format
|
|
88
|
+
- **`#[Email]`** — Validates email format
|
|
89
|
+
- **`#[ConvertEmptyToNull]`** — Class-level: converts empty strings to `null`
|
|
90
|
+
- **`#[HasModel(Model::class)]`** — Links the DTO to an Eloquent model for `fromModel()` / `toModel()`
|
|
91
|
+
|
|
92
|
+
#### Creating and using DTOs
|
|
93
|
+
|
|
94
|
+
```php
|
|
95
|
+
// From array (e.g. API response, request data)
|
|
96
|
+
$dto = EquipmentDto::fromArray($data);
|
|
97
|
+
|
|
98
|
+
// From Eloquent model (requires #[HasModel] + DtoMappingTrait on the model)
|
|
99
|
+
$dto = EquipmentDto::fromModel($equipment);
|
|
100
|
+
|
|
101
|
+
// To array (uses #[Map] names as keys)
|
|
102
|
+
$array = $dto->toArray();
|
|
103
|
+
|
|
104
|
+
// To Eloquent model
|
|
105
|
+
$model = $dto->toModel(Equipment::class);
|
|
106
|
+
|
|
107
|
+
// Collections
|
|
108
|
+
$dtos = EquipmentDto::collection($arrayOfData);
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
#### Attribute-based DTO rules
|
|
112
|
+
|
|
113
|
+
- Extend the project's DTO base class
|
|
114
|
+
- Use constructor property promotion with public properties
|
|
115
|
+
- Use `#[Map('column_name')]` to map properties to database/API field names
|
|
116
|
+
- Use validation attributes (`#[Length]`, `#[Decimal]`, `#[Email]`, etc.) for constraints
|
|
117
|
+
- Use `#[ConvertEmptyToNull]` at class level when empty strings should become `null`
|
|
118
|
+
- Use `#[HasModel(Model::class)]` when the DTO maps to an Eloquent model
|
|
119
|
+
- No business logic — just data and mapping
|
|
120
|
+
- Check if the base class requires mutable or immutable properties
|
|
121
|
+
|
|
122
|
+
### Plain DTO (Fallback)
|
|
123
|
+
|
|
124
|
+
When no DTO package is available or attribute-based mapping is not suitable (e.g. for very simple
|
|
125
|
+
value transfer between methods), a plain readonly DTO is acceptable:
|
|
126
|
+
|
|
127
|
+
```php
|
|
128
|
+
final readonly class CreateOrderDTO
|
|
129
|
+
{
|
|
130
|
+
public function __construct(
|
|
131
|
+
public int $customerId,
|
|
132
|
+
public string $description,
|
|
133
|
+
public int $totalInCents,
|
|
134
|
+
) {}
|
|
135
|
+
|
|
136
|
+
public static function fromRequest(CreateOrderRequest $request): self
|
|
137
|
+
{
|
|
138
|
+
/** @var array{customer_id: int, description: string, total: int} $data */
|
|
139
|
+
$data = $request->validated();
|
|
140
|
+
|
|
141
|
+
return new self(
|
|
142
|
+
customerId: $data['customer_id'],
|
|
143
|
+
description: $data['description'],
|
|
144
|
+
totalInCents: $data['total'],
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
#### Plain DTO Rules
|
|
151
|
+
|
|
152
|
+
- Always `final readonly class`
|
|
153
|
+
- Constructor property promotion
|
|
154
|
+
- Static factory method `fromRequest()`, `fromArray()`, etc.
|
|
155
|
+
- No business logic — just data
|
|
156
|
+
|
|
157
|
+
## Value Object
|
|
158
|
+
|
|
159
|
+
Represents a domain concept with validation and equality semantics.
|
|
160
|
+
|
|
161
|
+
### When to Use
|
|
162
|
+
|
|
163
|
+
✅ Domain concepts: `Money`, `Email`, `DateRange`, `Coordinates`
|
|
164
|
+
✅ Value needs validation on creation
|
|
165
|
+
✅ Two instances with same values should be considered equal
|
|
166
|
+
|
|
167
|
+
### Example
|
|
168
|
+
|
|
169
|
+
```php
|
|
170
|
+
final readonly class Money
|
|
171
|
+
{
|
|
172
|
+
public function __construct(
|
|
173
|
+
public int $amountInCents,
|
|
174
|
+
public string $currency = 'EUR',
|
|
175
|
+
) {
|
|
176
|
+
if ($this->amountInCents < 0) {
|
|
177
|
+
throw new InvalidArgumentException('Amount must not be negative');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
public function add(self $other): self
|
|
182
|
+
{
|
|
183
|
+
if ($this->currency !== $other->currency) {
|
|
184
|
+
throw new InvalidArgumentException('Cannot add different currencies');
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return new self(
|
|
188
|
+
amountInCents: Math::add($this->amountInCents, $other->amountInCents),
|
|
189
|
+
currency: $this->currency,
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## When NOT to Use
|
|
196
|
+
|
|
197
|
+
❌ Data only used in one place and structure is obvious — a simple array is fine
|
|
198
|
+
❌ Wrapping a single primitive with no validation or behavior
|
|
199
|
+
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Event / Listener Pattern
|
|
2
|
+
|
|
3
|
+
> Decouple side effects from core logic.
|
|
4
|
+
|
|
5
|
+
## Idea
|
|
6
|
+
|
|
7
|
+
A core process dispatches an **Event**, other parts of the system react via **Listeners**.
|
|
8
|
+
The core process doesn't know (or care) who listens.
|
|
9
|
+
|
|
10
|
+
## Typical Use Cases
|
|
11
|
+
|
|
12
|
+
✅ Notifications (email, push) after an action
|
|
13
|
+
✅ Logging, audit trails
|
|
14
|
+
✅ Syncing data to external systems
|
|
15
|
+
✅ Cache invalidation
|
|
16
|
+
✅ Triggering follow-up jobs
|
|
17
|
+
|
|
18
|
+
## Example
|
|
19
|
+
|
|
20
|
+
```php
|
|
21
|
+
// Event — immutable data container
|
|
22
|
+
final readonly class OrderPlaced
|
|
23
|
+
{
|
|
24
|
+
public function __construct(
|
|
25
|
+
public int $orderId,
|
|
26
|
+
public int $customerId,
|
|
27
|
+
) {}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Listener
|
|
31
|
+
final class SendOrderConfirmation
|
|
32
|
+
{
|
|
33
|
+
public function handle(OrderPlaced $event): void
|
|
34
|
+
{
|
|
35
|
+
// send email...
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Dispatching
|
|
41
|
+
|
|
42
|
+
```php
|
|
43
|
+
// In a service or action
|
|
44
|
+
OrderPlaced::dispatch($order->getId(), $order->getCustomerId());
|
|
45
|
+
|
|
46
|
+
// Or via event helper
|
|
47
|
+
event(new OrderPlaced($order->getId(), $order->getCustomerId()));
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Laravel Discovery
|
|
51
|
+
|
|
52
|
+
Since Laravel 11, events and listeners are auto-discovered — no manual registration
|
|
53
|
+
needed. Configured in `bootstrap/app.php`.
|
|
54
|
+
|
|
55
|
+
## Rules
|
|
56
|
+
|
|
57
|
+
- Events are `final readonly` — immutable data containers
|
|
58
|
+
- Pass **IDs**, not model instances (smaller payload, avoids serialization issues)
|
|
59
|
+
- One listener per side effect — don't cram multiple things into one listener
|
|
60
|
+
- Use queued listeners (`ShouldQueue`) for slow operations (emails, API calls)
|
|
61
|
+
|
|
62
|
+
## When NOT to Use
|
|
63
|
+
|
|
64
|
+
❌ Direct, synchronous flow where caller needs the result — just call the service directly
|
|
65
|
+
❌ Only one "listener" that always runs — a direct method call is simpler and easier to follow
|
|
66
|
+
❌ Everything — too many events make the application flow hard to trace
|
|
67
|
+
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Factory Pattern
|
|
2
|
+
|
|
3
|
+
> Encapsulate complex object creation.
|
|
4
|
+
|
|
5
|
+
## Idea
|
|
6
|
+
|
|
7
|
+
When creating an object requires configuration, conditional logic, or multiple steps,
|
|
8
|
+
extract that logic into a Factory class.
|
|
9
|
+
|
|
10
|
+
## Laravel Context
|
|
11
|
+
|
|
12
|
+
- **Model Factories** — Laravel ships with factories for test/seed data (`database/factories/`)
|
|
13
|
+
- **Custom Factories** — for domain objects, API clients, or composed objects
|
|
14
|
+
|
|
15
|
+
## When to Use
|
|
16
|
+
|
|
17
|
+
✅ Object creation involves multiple steps or configuration
|
|
18
|
+
✅ Different implementations based on a type/config value
|
|
19
|
+
✅ API client setup with auth, base URL, middleware
|
|
20
|
+
|
|
21
|
+
## When NOT to Use
|
|
22
|
+
|
|
23
|
+
❌ Simple `new MyClass()` or `MyClass::create()` — no factory needed
|
|
24
|
+
❌ Laravel Model Factories already cover the use case (test data)
|
|
25
|
+
|
|
26
|
+
## Example
|
|
27
|
+
|
|
28
|
+
```php
|
|
29
|
+
final class ApiClientFactory
|
|
30
|
+
{
|
|
31
|
+
public function __construct(private ConfigRepository $config) {}
|
|
32
|
+
|
|
33
|
+
public function create(ClientSoftwareType $type): ApiClient
|
|
34
|
+
{
|
|
35
|
+
return match ($type) {
|
|
36
|
+
ClientSoftwareType::KS21 => new Ks21ApiClient(
|
|
37
|
+
baseUrl: $this->config->get('services.ks21.url'),
|
|
38
|
+
apiKey: $this->config->get('services.ks21.key'),
|
|
39
|
+
),
|
|
40
|
+
ClientSoftwareType::PROBAUS => new ProBauSApiClient(
|
|
41
|
+
baseUrl: $this->config->get('services.probaus.url'),
|
|
42
|
+
),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Rules
|
|
49
|
+
|
|
50
|
+
- Factory methods should return typed interfaces, not concrete classes (when possible)
|
|
51
|
+
- Keep factory logic focused — don't add business logic here
|
|
52
|
+
- Name: `{Thing}Factory` or static `{Thing}::create()` for simple cases
|
|
53
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Pipeline / Middleware Pattern
|
|
2
|
+
|
|
3
|
+
> Sequential processing steps — already built into Laravel.
|
|
4
|
+
|
|
5
|
+
## Idea
|
|
6
|
+
|
|
7
|
+
Pass data through a series of steps (pipes), where each step can transform,
|
|
8
|
+
validate, or filter the data. Each pipe has a single responsibility.
|
|
9
|
+
|
|
10
|
+
## Laravel Built-in
|
|
11
|
+
|
|
12
|
+
- **HTTP Middleware** — request/response pipeline (authentication, CORS, logging)
|
|
13
|
+
- **Pipeline facade** — `Illuminate\Pipeline\Pipeline` for custom pipelines
|
|
14
|
+
- **Filter pipeline** — used in controllers for query filtering (see [controllers.md](../controllers.md))
|
|
15
|
+
|
|
16
|
+
## Typical Use Cases
|
|
17
|
+
|
|
18
|
+
✅ Request processing (middleware)
|
|
19
|
+
✅ Import/export data transformation
|
|
20
|
+
✅ Multi-step validation or enrichment
|
|
21
|
+
✅ Query filter chains
|
|
22
|
+
|
|
23
|
+
## Example: Custom Pipeline
|
|
24
|
+
|
|
25
|
+
```php
|
|
26
|
+
$result = Pipeline::send($importData)
|
|
27
|
+
->through([
|
|
28
|
+
ValidateHeaders::class,
|
|
29
|
+
NormalizeEncoding::class,
|
|
30
|
+
MapColumns::class,
|
|
31
|
+
FilterInvalidRows::class,
|
|
32
|
+
])
|
|
33
|
+
->thenReturn();
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Each pipe implements `handle()`:
|
|
37
|
+
|
|
38
|
+
```php
|
|
39
|
+
final class NormalizeEncoding
|
|
40
|
+
{
|
|
41
|
+
public function handle(ImportData $data, Closure $next): mixed
|
|
42
|
+
{
|
|
43
|
+
$data->normalize();
|
|
44
|
+
return $next($data);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Query Filter Pipeline
|
|
50
|
+
|
|
51
|
+
Already used in this project via `paginatedPipeline`:
|
|
52
|
+
|
|
53
|
+
```php
|
|
54
|
+
$results = Model::query()
|
|
55
|
+
->paginatedPipeline([
|
|
56
|
+
StringFilter::on('name')->isLike()->some(),
|
|
57
|
+
DateFilter::on('created_at')->all(),
|
|
58
|
+
OrderFilter::on(['id', 'name'])->default(['id' => 'asc']),
|
|
59
|
+
]);
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## When NOT to Use
|
|
63
|
+
|
|
64
|
+
❌ Only 2 steps with trivial logic — sequential method calls are clearer
|
|
65
|
+
❌ Steps have complex dependencies on each other — pipelines assume independence
|
|
66
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Policy Pattern
|
|
2
|
+
|
|
3
|
+
> Centralized authorization logic — built into Laravel.
|
|
4
|
+
|
|
5
|
+
## Idea
|
|
6
|
+
|
|
7
|
+
Authorization rules belong in **Policy classes**, not scattered across controllers,
|
|
8
|
+
middleware, or model methods.
|
|
9
|
+
|
|
10
|
+
## Laravel Mechanism
|
|
11
|
+
|
|
12
|
+
- One Policy per Model (or resource)
|
|
13
|
+
- Methods map to actions: `view`, `create`, `update`, `delete`, `restore`
|
|
14
|
+
- Called via `$this->authorize()` in controllers or `Gate::allows()` anywhere
|
|
15
|
+
- FormRequests call policies in `authorize()` method
|
|
16
|
+
|
|
17
|
+
## Example
|
|
18
|
+
|
|
19
|
+
```php
|
|
20
|
+
final class OrderPolicy
|
|
21
|
+
{
|
|
22
|
+
public function view(User $user, Order $order): bool
|
|
23
|
+
{
|
|
24
|
+
return $user->getId() === $order->getUserId();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public function update(User $user, Order $order): bool
|
|
28
|
+
{
|
|
29
|
+
return $user->getId() === $order->getUserId()
|
|
30
|
+
&& $order->getStatus() !== OrderStatus::COMPLETED;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public function delete(User $user, Order $order): bool
|
|
34
|
+
{
|
|
35
|
+
return $user->isAdmin();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## In FormRequests
|
|
41
|
+
|
|
42
|
+
```php
|
|
43
|
+
public function authorize(): bool
|
|
44
|
+
{
|
|
45
|
+
/** @var Order $order */
|
|
46
|
+
$order = $this->route('order');
|
|
47
|
+
|
|
48
|
+
/** @var User $user */
|
|
49
|
+
$user = $this->user();
|
|
50
|
+
|
|
51
|
+
return $user->can('update', $order);
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Rules
|
|
56
|
+
|
|
57
|
+
- One Policy per Model — `App\Policies\{Model}Policy`
|
|
58
|
+
- Keep policy methods simple — delegate complex checks to the model or a service
|
|
59
|
+
- Return `bool` — no exceptions in policies
|
|
60
|
+
- Laravel auto-discovers policies by convention (no manual registration needed)
|
|
61
|
+
|
|
62
|
+
## When NOT to Use
|
|
63
|
+
|
|
64
|
+
❌ Global rules (e.g., "must be authenticated") — use middleware instead
|
|
65
|
+
❌ Business rules (e.g., "order must have items") — that's validation, not authorization
|
|
66
|
+
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# Repository Pattern
|
|
2
|
+
|
|
3
|
+
> Only use when it solves a real problem. Eloquent already has many repository-like features built in.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Repositories encapsulate **complex or reusable** database queries. They keep controllers and
|
|
8
|
+
services clean by hiding query details behind expressive method names.
|
|
9
|
+
|
|
10
|
+
## Rule of Thumb
|
|
11
|
+
|
|
12
|
+
- **CRUD app** → usually no separate repository needed
|
|
13
|
+
- **Complex business app** → use selectively where it adds value
|
|
14
|
+
- **Never** create a repository automatically for every model
|
|
15
|
+
|
|
16
|
+
## When to Use a Repository
|
|
17
|
+
|
|
18
|
+
✅ **Multiple data sources** — DB + API + Cache behind one interface
|
|
19
|
+
|
|
20
|
+
✅ **Complex queries** — joins, subqueries, raw expressions, aggregations:
|
|
21
|
+
|
|
22
|
+
```php
|
|
23
|
+
// ✅ Good — complex query with joins, eager loading, raw ordering
|
|
24
|
+
class DatabasePlanningRepository
|
|
25
|
+
{
|
|
26
|
+
public function findByDateAndCrewIds(CarbonInterface $date, array $crewIds): Collection
|
|
27
|
+
{
|
|
28
|
+
return Appointment::with([
|
|
29
|
+
'project' => ['manager', 'capacityPlanningItem'],
|
|
30
|
+
'plannedUsers' => fn ($q) => $q->where('termin_date', $date->format('Y-m-d')),
|
|
31
|
+
])
|
|
32
|
+
->selectRaw("*, IF(termin_uhrzeit IS NULL OR termin_uhrzeit = '00:00:00', 1, 0) as sort_order")
|
|
33
|
+
->whereDate('termin_date', $date)
|
|
34
|
+
->whereIn('tree_group_id', $crewIds)
|
|
35
|
+
->orderByRaw('termin_order, sort_order, termin_uhrzeit')
|
|
36
|
+
->get();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
✅ **Reusable queries** — same complex query needed in multiple services or controllers
|
|
42
|
+
|
|
43
|
+
✅ **Domain-centric access** — the method name documents business intent:
|
|
44
|
+
|
|
45
|
+
```php
|
|
46
|
+
$repository->findActiveEmployeesWithExpiredCertificates();
|
|
47
|
+
$repository->findOverdueAppointmentsByCustomer($customerId);
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## When NOT to Use a Repository
|
|
51
|
+
|
|
52
|
+
❌ **Thin CRUD wrappers** — wrapping `findById`, `create`, `update`, `delete` around
|
|
53
|
+
Eloquent adds a layer with zero value. Eloquent already provides all of this:
|
|
54
|
+
|
|
55
|
+
```php
|
|
56
|
+
// ❌ Overengineering — don't do this
|
|
57
|
+
class UserRepository
|
|
58
|
+
{
|
|
59
|
+
public function findById(int $id): ?User { return User::find($id); }
|
|
60
|
+
public function create(array $data): User { return User::create($data); }
|
|
61
|
+
public function delete(int $id): void { User::destroy($id); }
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// ✅ Just use the model directly
|
|
65
|
+
$user = User::find($id);
|
|
66
|
+
$user = User::where('email', $email)->first();
|
|
67
|
+
$activeUsers = User::where('is_active', true)->get();
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
❌ **Single-use queries** — if a query is only used in one place and is not complex,
|
|
71
|
+
keep it inline in the service or controller.
|
|
72
|
+
|
|
73
|
+
## Better Alternatives for Simple Cases
|
|
74
|
+
|
|
75
|
+
Instead of a repository for every model, prefer:
|
|
76
|
+
|
|
77
|
+
- **Query Scopes** — reusable query fragments on the model itself
|
|
78
|
+
- **Services / Actions** — business logic with inline queries
|
|
79
|
+
- **Specialized query classes** — for one complex, reusable query
|
|
80
|
+
|
|
81
|
+
## Structure
|
|
82
|
+
|
|
83
|
+
- Namespace: `App\Repositories\{Domain}\` or `App\Modules\{Module}\App\Repositories\`
|
|
84
|
+
- Use an **interface** (contract) when the repository is injected via DI and may need mocking:
|
|
85
|
+
|
|
86
|
+
```php
|
|
87
|
+
// Contract
|
|
88
|
+
interface UserRepositoryContract
|
|
89
|
+
{
|
|
90
|
+
public function findByCredentials(string $username, string $password): User;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Implementation
|
|
94
|
+
class DatabaseUserRepository implements UserRepositoryContract
|
|
95
|
+
{
|
|
96
|
+
public function findByCredentials(string $username, string $password): User
|
|
97
|
+
{
|
|
98
|
+
// complex query logic...
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
- Bind interface → implementation in a ServiceProvider
|
|
104
|
+
- Do **NOT** mark repository classes `final` — they may need to be mocked in tests
|
|
105
|
+
|
|
106
|
+
## Naming
|
|
107
|
+
|
|
108
|
+
| Pattern | Example |
|
|
109
|
+
|----------------------------|--------------------------------------|
|
|
110
|
+
| Contract (interface) | `UserRepositoryContract` |
|
|
111
|
+
| Implementation | `DatabaseUserRepository` |
|
|
112
|
+
| Module repository | `ClientSoftwareImportTemplateRepository` |
|
|
113
|
+
|
|
114
|
+
## Rules
|
|
115
|
+
|
|
116
|
+
- Return **typed** results: `Collection<int, Model>`, `?Model`, `Model`
|
|
117
|
+
- Throw domain exceptions (e.g., `EntityNotFoundException`) instead of returning `null`
|
|
118
|
+
when the caller expects a result
|
|
119
|
+
- Use `@param` and `@return` DocBlocks for generic collection types
|
|
120
|
+
- Keep repositories focused — one repository per model/aggregate, not one giant "query bag"
|
|
121
|
+
- Prefer Eloquent/Query Builder over raw SQL
|
|
122
|
+
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Service Layer / Action Pattern
|
|
2
|
+
|
|
3
|
+
> The most valuable pattern in Laravel projects.
|
|
4
|
+
|
|
5
|
+
## Idea
|
|
6
|
+
|
|
7
|
+
Controllers stay thin and delegate business logic to dedicated classes.
|
|
8
|
+
These classes have a single responsibility and an expressive name.
|
|
9
|
+
|
|
10
|
+
## Naming
|
|
11
|
+
|
|
12
|
+
- **Action** — single operation: `CreateOrderAction`, `PublishArticle`
|
|
13
|
+
- **Service** — broader domain scope: `PaymentService`, `ImportService`
|
|
14
|
+
|
|
15
|
+
Use Actions for focused, one-off operations. Use Services when grouping related operations.
|
|
16
|
+
|
|
17
|
+
## When to Use
|
|
18
|
+
|
|
19
|
+
✅ Logic is more than "validate + save"
|
|
20
|
+
✅ Logic is reused across controllers, commands, observers or jobs
|
|
21
|
+
✅ Logic involves multiple models, external APIs, or side effects
|
|
22
|
+
✅ You want to test business logic independently from HTTP layer
|
|
23
|
+
|
|
24
|
+
## When NOT to Use
|
|
25
|
+
|
|
26
|
+
❌ Simple CRUD — `$model->update($request->validated())` can stay in the controller
|
|
27
|
+
❌ One-liner logic — don't create a class for a single Eloquent call
|
|
28
|
+
|
|
29
|
+
## Example
|
|
30
|
+
|
|
31
|
+
```php
|
|
32
|
+
final class CreateOrderAction
|
|
33
|
+
{
|
|
34
|
+
public function __construct(
|
|
35
|
+
private PaymentService $paymentService,
|
|
36
|
+
private NotificationService $notificationService,
|
|
37
|
+
) {}
|
|
38
|
+
|
|
39
|
+
public function execute(CreateOrderDTO $data): Order
|
|
40
|
+
{
|
|
41
|
+
$order = Order::create($data->toArray());
|
|
42
|
+
|
|
43
|
+
$this->paymentService->charge($order);
|
|
44
|
+
$this->notificationService->sendOrderConfirmation($order);
|
|
45
|
+
|
|
46
|
+
return $order;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## In Controllers
|
|
52
|
+
|
|
53
|
+
Inject via constructor or method injection:
|
|
54
|
+
|
|
55
|
+
```php
|
|
56
|
+
public function __invoke(
|
|
57
|
+
CreateOrderRequest $request,
|
|
58
|
+
CreateOrderAction $action,
|
|
59
|
+
): OrderResource {
|
|
60
|
+
$order = $action->execute(CreateOrderDTO::fromRequest($request));
|
|
61
|
+
return OrderResource::make($order);
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Strategy Pattern
|
|
2
|
+
|
|
3
|
+
> Choose the right algorithm at runtime — instead of if/else chains.
|
|
4
|
+
|
|
5
|
+
## Idea
|
|
6
|
+
|
|
7
|
+
Define a family of interchangeable algorithms behind an interface.
|
|
8
|
+
Select the implementation based on context (config, user input, enum value).
|
|
9
|
+
|
|
10
|
+
## Typical Use Cases
|
|
11
|
+
|
|
12
|
+
- Payment providers (Stripe, PayPal, Invoice)
|
|
13
|
+
- Export formats (CSV, PDF, Excel)
|
|
14
|
+
- Pricing / discount rules
|
|
15
|
+
- Notification channels (Email, SMS, Push)
|
|
16
|
+
- Import parsers (JSON, XML, CSV)
|
|
17
|
+
|
|
18
|
+
## Example
|
|
19
|
+
|
|
20
|
+
```php
|
|
21
|
+
interface DiscountStrategy
|
|
22
|
+
{
|
|
23
|
+
public function calculate(int $subtotalInCents): int;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
final class PercentageDiscount implements DiscountStrategy
|
|
27
|
+
{
|
|
28
|
+
public function __construct(private int $percent) {}
|
|
29
|
+
|
|
30
|
+
public function calculate(int $subtotalInCents): int
|
|
31
|
+
{
|
|
32
|
+
return Math::divide(Math::multiply($subtotalInCents, $this->percent), 100);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
final class FixedDiscount implements DiscountStrategy
|
|
37
|
+
{
|
|
38
|
+
public function __construct(private int $amountInCents) {}
|
|
39
|
+
|
|
40
|
+
public function calculate(int $subtotalInCents): int
|
|
41
|
+
{
|
|
42
|
+
return min($this->amountInCents, $subtotalInCents);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Selection via Enum
|
|
48
|
+
|
|
49
|
+
```php
|
|
50
|
+
enum DiscountType: string
|
|
51
|
+
{
|
|
52
|
+
case PERCENTAGE = 'percentage';
|
|
53
|
+
case FIXED = 'fixed';
|
|
54
|
+
|
|
55
|
+
public function strategy(int $value): DiscountStrategy
|
|
56
|
+
{
|
|
57
|
+
return match ($this) {
|
|
58
|
+
self::PERCENTAGE => new PercentageDiscount($value),
|
|
59
|
+
self::FIXED => new FixedDiscount($value),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## When NOT to Use
|
|
66
|
+
|
|
67
|
+
❌ Only two cases with trivial logic — a simple `match` or ternary is enough
|
|
68
|
+
❌ The "strategies" share no common interface or behavior
|
|
69
|
+
|