@event4u/agent-config 14.22.0 → 15.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +333 -356
- package/README.md +1 -1
- package/dist/agent-src/commands/agent-handoff.md +8 -7
- package/dist/agent-src/commands/agents/init.md +1 -1
- package/dist/agent-src/commands/agents/user/accept.md +4 -4
- package/dist/agent-src/commands/agents/user/delete.md +2 -2
- package/dist/agent-src/commands/agents/user/init.md +3 -3
- package/dist/agent-src/commands/agents/user/review.md +3 -3
- package/dist/agent-src/commands/agents/user/show.md +3 -3
- package/dist/agent-src/commands/agents/user/update.md +2 -2
- package/dist/agent-src/commands/agents/user.md +6 -6
- package/dist/agent-src/commands/analytics/prune.md +1 -1
- package/dist/agent-src/commands/analytics/show.md +2 -2
- package/dist/agent-src/commands/analyze/decision.md +2 -2
- package/dist/agent-src/commands/analyze/inbox.md +5 -5
- package/dist/agent-src/commands/analyze/incident.md +3 -3
- package/dist/agent-src/commands/analyze/near-miss.md +3 -3
- package/dist/agent-src/commands/analyze/postmortem.md +4 -4
- package/dist/agent-src/commands/analyze/premortem.md +2 -2
- package/dist/agent-src/commands/analyze.md +2 -2
- package/dist/agent-src/commands/bug/fix.md +1 -1
- package/dist/agent-src/commands/bug/investigate.md +2 -2
- package/dist/agent-src/commands/cost/profile.md +3 -3
- package/dist/agent-src/commands/design.md +1 -1
- package/dist/agent-src/commands/feature/explore.md +1 -1
- package/dist/agent-src/commands/feature/plan.md +2 -2
- package/dist/agent-src/commands/feature/roadmap.md +2 -2
- package/dist/agent-src/commands/ghostwriter/fetch.md +4 -4
- package/dist/agent-src/commands/ghostwriter/list.md +1 -1
- package/dist/agent-src/commands/ghostwriter/show.md +1 -1
- package/dist/agent-src/commands/ghostwriter/write.md +9 -9
- package/dist/agent-src/commands/humanize.md +6 -6
- package/dist/agent-src/commands/jira-ticket.md +1 -1
- package/dist/agent-src/commands/judge/solo.md +1 -1
- package/dist/agent-src/commands/judge.md +1 -1
- package/dist/agent-src/commands/knowledge/cross-repo.md +1 -1
- package/dist/agent-src/commands/knowledge/forget.md +1 -1
- package/dist/agent-src/commands/knowledge/ingest.md +2 -2
- package/dist/agent-src/commands/knowledge/list.md +1 -1
- package/dist/agent-src/commands/memory/add.md +3 -3
- package/dist/agent-src/commands/memory/load.md +4 -4
- package/dist/agent-src/commands/memory/mine-session.md +1 -1
- package/dist/agent-src/commands/memory/promote.md +4 -4
- package/dist/agent-src/commands/memory/propose.md +2 -2
- package/dist/agent-src/commands/mode.md +5 -5
- package/dist/agent-src/commands/post-as/ghostwriter.md +3 -3
- package/dist/agent-src/commands/post-as/me.md +7 -7
- package/dist/agent-src/commands/pr/create.md +1 -1
- package/dist/agent-src/commands/pr/merge.md +48 -39
- package/dist/agent-src/commands/profile/activate.md +1 -1
- package/dist/agent-src/commands/profile/show.md +1 -1
- package/dist/agent-src/commands/research/deep.md +2 -2
- package/dist/agent-src/commands/research/report.md +2 -2
- package/dist/agent-src/commands/review/changes.md +1 -1
- package/dist/agent-src/commands/review/routing.md +1 -1
- package/dist/agent-src/commands/roadmap/create.md +1 -1
- package/dist/agent-src/commands/roadmap/materialize.md +2 -2
- package/dist/agent-src/commands/roadmap/next.md +9 -1
- package/dist/agent-src/commands/roadmap/process-full.md +2 -2
- package/dist/agent-src/commands/security-audit-config.md +3 -3
- package/dist/agent-src/commands/skill/preview.md +1 -1
- package/dist/agent-src/commands/skills/discover.md +1 -1
- package/dist/agent-src/commands/sync/agent-settings.md +2 -2
- package/dist/agent-src/commands/sync/gitignore/fix.md +1 -1
- package/dist/agent-src/commands/tests/create.md +1 -1
- package/dist/agent-src/commands/tests/e2e-heal.md +1 -1
- package/dist/agent-src/commands/tests/e2e-plan.md +1 -1
- package/dist/agent-src/contexts/authority/kernel-rule-edits.md +6 -6
- package/dist/agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +1 -2
- package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +2 -2
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +88 -1
- package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +1 -1
- package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -1
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +1 -1
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +1 -1
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +13 -1
- package/dist/agent-src/contexts/execution/cheap-question-mechanics.md +1 -1
- package/dist/agent-src/contexts/execution/contract-decision-sheet.md +3 -3
- package/dist/agent-src/contexts/execution/mandated-lines.md +1 -1
- package/dist/agent-src/contexts/execution/non-interactive-contract.md +1 -1
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -1
- package/dist/agent-src/contexts/execution/plan-confidence-gate.md +5 -5
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +1 -1
- package/dist/agent-src/contexts/execution/subagent-modes-detail.md +1 -1
- package/dist/agent-src/contexts/execution/subagent-routing.md +2 -2
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +1 -1
- package/dist/agent-src/contexts/execution/user-memory-channels.md +3 -3
- package/dist/agent-src/contexts/execution/verification-mechanics.md +1 -1
- package/dist/agent-src/contexts/judges/persona-voice-rubric.md +2 -2
- package/dist/agent-src/guidelines/abstraction-thresholds.md +88 -0
- package/dist/agent-src/guidelines/agent-infra/5w2h-analysis.md +260 -0
- package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +99 -0
- package/dist/agent-src/guidelines/agent-infra/agent-interaction-and-decision-quality.md +325 -0
- package/dist/agent-src/guidelines/agent-infra/api-cost-levers.md +177 -0
- package/dist/agent-src/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +222 -0
- package/dist/agent-src/guidelines/agent-infra/ask-when-uncertain-demos.md +134 -0
- package/dist/agent-src/guidelines/agent-infra/asking-and-brevity-examples.md +198 -0
- package/dist/agent-src/guidelines/agent-infra/break-glass-usage.md +113 -0
- package/dist/agent-src/guidelines/agent-infra/carve-out-predicates.md +17 -0
- package/dist/agent-src/guidelines/agent-infra/comparison-matrix.md +179 -0
- package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +165 -0
- package/dist/agent-src/guidelines/agent-infra/corpus-grounding-authoring.md +91 -0
- package/dist/agent-src/guidelines/agent-infra/critical-thinking.md +156 -0
- package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +109 -0
- package/dist/agent-src/guidelines/agent-infra/developer-judgment.md +82 -0
- package/dist/agent-src/guidelines/agent-infra/direct-answers-demos.md +142 -0
- package/dist/agent-src/guidelines/agent-infra/domain-adoption-gates.md +112 -0
- package/dist/agent-src/guidelines/agent-infra/domain-eval-anti-pattern.md +53 -0
- package/dist/agent-src/guidelines/agent-infra/domain-pack-architecture.md +56 -0
- package/dist/agent-src/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
- package/dist/agent-src/guidelines/agent-infra/emphasis-budget.md +45 -0
- package/dist/agent-src/guidelines/agent-infra/engineering-memory-data-format.md +210 -0
- package/dist/agent-src/guidelines/agent-infra/evaluator-independence-mechanics.md +92 -0
- package/dist/agent-src/guidelines/agent-infra/existence-question-verdicts.md +80 -0
- package/dist/agent-src/guidelines/agent-infra/failure-signatures.md +70 -0
- package/dist/agent-src/guidelines/agent-infra/false-green.md +233 -0
- package/dist/agent-src/guidelines/agent-infra/first-principles.md +192 -0
- package/dist/agent-src/guidelines/agent-infra/framework-neutrality-patterns.md +66 -0
- package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +169 -0
- package/dist/agent-src/guidelines/agent-infra/gate-authoring.md +177 -0
- package/dist/agent-src/guidelines/agent-infra/guarded-baseline.md +39 -0
- package/dist/agent-src/guidelines/agent-infra/installed-tools-manifest.md +142 -0
- package/dist/agent-src/guidelines/agent-infra/inversion-thinking.md +388 -0
- package/dist/agent-src/guidelines/agent-infra/ios-simulator-guide.md +378 -0
- package/dist/agent-src/guidelines/agent-infra/language-and-tone-examples.md +141 -0
- package/dist/agent-src/guidelines/agent-infra/layered-settings.md +317 -0
- package/dist/agent-src/guidelines/agent-infra/linked-projects-onboarding-gate.md +80 -0
- package/dist/agent-src/guidelines/agent-infra/mcp-request-signing.md +197 -0
- package/dist/agent-src/guidelines/agent-infra/memory-access.md +149 -0
- package/dist/agent-src/guidelines/agent-infra/mental-models.md +314 -0
- package/dist/agent-src/guidelines/agent-infra/minimal-safe-diff-mechanics.md +241 -0
- package/dist/agent-src/guidelines/agent-infra/missing-tool-handling.md +66 -0
- package/dist/agent-src/guidelines/agent-infra/model-recommendation.md +101 -0
- package/dist/agent-src/guidelines/agent-infra/naming.md +69 -0
- package/dist/agent-src/guidelines/agent-infra/notes-horizon-mechanics.md +90 -0
- package/dist/agent-src/guidelines/agent-infra/output-patterns.md +117 -0
- package/dist/agent-src/guidelines/agent-infra/recurring-criticism-mechanics.md +96 -0
- package/dist/agent-src/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
- package/dist/agent-src/guidelines/agent-infra/review-routing-data-format.md +143 -0
- package/dist/agent-src/guidelines/agent-infra/roadmap-deferred-resolution-provenance.md +54 -0
- package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +274 -0
- package/dist/agent-src/guidelines/agent-infra/role-contracts.md +209 -0
- package/dist/agent-src/guidelines/agent-infra/role-mode-router.md +89 -0
- package/dist/agent-src/guidelines/agent-infra/rule-body-migration-inventory.md +241 -0
- package/dist/agent-src/guidelines/agent-infra/rule-type-governance.md +73 -0
- package/dist/agent-src/guidelines/agent-infra/runtime-layer.md +89 -0
- package/dist/agent-src/guidelines/agent-infra/scqa-framework.md +526 -0
- package/dist/agent-src/guidelines/agent-infra/security-lint-containment.md +121 -0
- package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +134 -0
- package/dist/agent-src/guidelines/agent-infra/simplicity-and-goal-demos.md +211 -0
- package/dist/agent-src/guidelines/agent-infra/six-hats.md +353 -0
- package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +229 -0
- package/dist/agent-src/guidelines/agent-infra/skill-quality-checklist.md +157 -0
- package/dist/agent-src/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
- package/dist/agent-src/guidelines/agent-infra/symptom-driven-harvest-loop.md +104 -0
- package/dist/agent-src/guidelines/agent-infra/systems-thinking.md +220 -0
- package/dist/agent-src/guidelines/agent-infra/tool-description-as-policy.md +35 -0
- package/dist/agent-src/guidelines/agent-infra/tool-integration.md +73 -0
- package/dist/agent-src/guidelines/agent-infra/traceability-field-mechanics.md +50 -0
- package/dist/agent-src/guidelines/agent-infra/untrusted-input-spotlighting.md +166 -0
- package/dist/agent-src/guidelines/agent-infra/verify-before-complete-demos.md +128 -0
- package/dist/agent-src/guidelines/augment-portability-patterns.md +70 -0
- package/dist/agent-src/guidelines/code-clarity.md +350 -0
- package/dist/agent-src/guidelines/component-oriented-and-oop-development.md +189 -0
- package/dist/agent-src/guidelines/cross-role-handoff.md +127 -0
- package/dist/agent-src/guidelines/design-antipatterns-triggers.json +18 -0
- package/dist/agent-src/guidelines/design-antipatterns.md +327 -0
- package/dist/agent-src/guidelines/design-asset-discipline.md +38 -0
- package/dist/agent-src/guidelines/design-canon.md +63 -0
- package/dist/agent-src/guidelines/design-fidelity-mechanics.md +293 -0
- package/dist/agent-src/guidelines/design-fidelity-routing.md +78 -0
- package/dist/agent-src/guidelines/design-handover-extraction.md +117 -0
- package/dist/agent-src/guidelines/design-modes.md +143 -0
- package/dist/agent-src/guidelines/design-reconciliation.md +172 -0
- package/dist/agent-src/guidelines/docs/readme-size-and-splitting.md +209 -0
- package/dist/agent-src/guidelines/e2e/playwright.md +363 -0
- package/dist/agent-src/guidelines/gtm-handoff.md +114 -0
- package/dist/agent-src/guidelines/monorepo-antipatterns.md +141 -0
- package/dist/agent-src/guidelines/php/api-design.md +115 -0
- package/dist/agent-src/guidelines/php/artisan-commands.md +81 -0
- package/dist/agent-src/guidelines/php/blade-ui.md +78 -0
- package/dist/agent-src/guidelines/php/controllers.md +90 -0
- package/dist/agent-src/guidelines/php/database.md +194 -0
- package/dist/agent-src/guidelines/php/eloquent.md +208 -0
- package/dist/agent-src/guidelines/php/flux.md +80 -0
- package/dist/agent-src/guidelines/php/general.md +207 -0
- package/dist/agent-src/guidelines/php/git.md +164 -0
- package/dist/agent-src/guidelines/php/jobs.md +111 -0
- package/dist/agent-src/guidelines/php/livewire.md +71 -0
- package/dist/agent-src/guidelines/php/logging.md +79 -0
- package/dist/agent-src/guidelines/php/naming.md +89 -0
- package/dist/agent-src/guidelines/php/patterns/dependency-injection.md +57 -0
- package/dist/agent-src/guidelines/php/patterns/dtos.md +199 -0
- package/dist/agent-src/guidelines/php/patterns/events.md +67 -0
- package/dist/agent-src/guidelines/php/patterns/factory.md +53 -0
- package/dist/agent-src/guidelines/php/patterns/pipelines.md +66 -0
- package/dist/agent-src/guidelines/php/patterns/policies.md +66 -0
- package/dist/agent-src/guidelines/php/patterns/repositories.md +122 -0
- package/dist/agent-src/guidelines/php/patterns/service-layer.md +64 -0
- package/dist/agent-src/guidelines/php/patterns/strategy.md +247 -0
- package/dist/agent-src/guidelines/php/patterns.md +28 -0
- package/dist/agent-src/guidelines/php/performance.md +92 -0
- package/dist/agent-src/guidelines/php/php-coding-patterns.md +80 -0
- package/dist/agent-src/guidelines/php/resources.md +100 -0
- package/dist/agent-src/guidelines/php/security.md +110 -0
- package/dist/agent-src/guidelines/php/sql.md +97 -0
- package/dist/agent-src/guidelines/php/validations.md +119 -0
- package/dist/agent-src/guidelines/php/websocket.md +100 -0
- package/dist/agent-src/guidelines/prompt-templates.md +189 -0
- package/dist/agent-src/guidelines/redundancy-taxonomy.md +208 -0
- package/dist/agent-src/guidelines/wing4-handoff.md +127 -0
- package/dist/agent-src/personas/README.md +1 -1
- package/dist/agent-src/personas/_template-specialist/persona.md +1 -1
- package/dist/agent-src/personas/product-owner.md +1 -1
- package/dist/agent-src/rules/active-remediation.md +1 -1
- package/dist/agent-src/rules/architecture.md +2 -2
- package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
- package/dist/agent-src/rules/ask-when-uncertain.md +2 -2
- package/dist/agent-src/rules/brand-source-of-truth.md +9 -7
- package/dist/agent-src/rules/code-comment-discipline.md +2 -2
- package/dist/agent-src/rules/code-provenance.md +1 -1
- package/dist/agent-src/rules/content-quoting-floor.md +1 -1
- package/dist/agent-src/rules/context-hygiene.md +5 -5
- package/dist/agent-src/rules/cross-source-consistency.md +1 -1
- package/dist/agent-src/rules/design-fidelity.md +36 -46
- package/dist/agent-src/rules/direct-answers.md +2 -2
- package/dist/agent-src/rules/domain-adoption-policy.md +1 -1
- package/dist/agent-src/rules/evaluator-independence.md +1 -1
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
- package/dist/agent-src/rules/icon-consistency.md +5 -1
- package/dist/agent-src/rules/improve-before-implement.md +1 -1
- package/dist/agent-src/rules/language-and-tone.md +3 -3
- package/dist/agent-src/rules/minimal-safe-diff.md +1 -1
- package/dist/agent-src/rules/notes-first-reasoning.md +36 -25
- package/dist/agent-src/rules/recurring-criticism.md +1 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
- package/dist/agent-src/rules/role-mode-adherence.md +2 -2
- package/dist/agent-src/rules/security-sensitive-stop.md +1 -1
- package/dist/agent-src/rules/size-enforcement.md +1 -1
- package/dist/agent-src/rules/source-confidentiality.md +2 -2
- package/dist/agent-src/rules/think-before-action.md +1 -1
- package/dist/agent-src/rules/token-efficiency.md +7 -5
- package/dist/agent-src/rules/ui-audit-gate.md +3 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +3 -3
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +106 -4
- package/dist/agent-src/skills/activation-design/SKILL.md +2 -2
- package/dist/agent-src/skills/adr-create/SKILL.md +5 -5
- package/dist/agent-src/skills/ai-council/SKILL.md +1 -1
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +1 -1
- package/dist/agent-src/skills/blade-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +24 -3
- package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/build-buy-partner/SKILL.md +1 -1
- package/dist/agent-src/skills/churn-prevention/SKILL.md +2 -2
- package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -1
- package/dist/agent-src/skills/code-refactoring/SKILL.md +3 -3
- package/dist/agent-src/skills/code-review/SKILL.md +3 -3
- package/dist/agent-src/skills/command-writing/SKILL.md +3 -3
- package/dist/agent-src/skills/comp-banding/SKILL.md +1 -1
- package/dist/agent-src/skills/competitive-moat-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
- package/dist/agent-src/skills/complexity-first-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
- package/dist/agent-src/skills/content-funnel-design/SKILL.md +2 -2
- package/dist/agent-src/skills/contracts-cognition/SKILL.md +1 -1
- package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +2 -2
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +2 -2
- package/dist/agent-src/skills/customer-research/SKILL.md +2 -2
- package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
- package/dist/agent-src/skills/data-handling-judgment/SKILL.md +1 -1
- package/dist/agent-src/skills/deal-qualification-meddic/SKILL.md +2 -2
- package/dist/agent-src/skills/decision-record/SKILL.md +3 -3
- package/dist/agent-src/skills/decision-review/SKILL.md +8 -8
- package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +22 -22
- package/dist/agent-src/skills/design-intelligence/SKILL.md +4 -4
- package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +2 -2
- package/dist/agent-src/skills/design-review/SKILL.md +4 -4
- package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -1
- package/dist/agent-src/skills/design-tokens/SKILL.md +17 -2
- package/dist/agent-src/skills/design-variations/SKILL.md +2 -2
- package/dist/agent-src/skills/developer-like-execution/SKILL.md +2 -2
- package/dist/agent-src/skills/discovery-interview/SKILL.md +2 -2
- package/dist/agent-src/skills/doc-coauthoring/SKILL.md +3 -3
- package/dist/agent-src/skills/editorial-calendar/SKILL.md +2 -2
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +44 -1
- package/dist/agent-src/skills/existing-ui-audit/references/anti-slop-cross-reference.md +2 -2
- package/dist/agent-src/skills/expansion-playbook/SKILL.md +2 -2
- package/dist/agent-src/skills/experiment-loop/SKILL.md +1 -1
- package/dist/agent-src/skills/experiment-loop/references/protocol.md +1 -1
- package/dist/agent-src/skills/fe-design/SKILL.md +3 -3
- package/dist/agent-src/skills/fe-design/references/design-patterns.md +1 -1
- package/dist/agent-src/skills/fe-design/references/design-read-and-memory.md +3 -3
- package/dist/agent-src/skills/fe-design/references/source-led-port.md +1 -1
- package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/flux/SKILL.md +1 -1
- package/dist/agent-src/skills/forecast-accuracy/SKILL.md +2 -2
- package/dist/agent-src/skills/forecasting/SKILL.md +2 -2
- package/dist/agent-src/skills/fundraising-narrative/SKILL.md +2 -2
- package/dist/agent-src/skills/funnel-analysis/SKILL.md +2 -2
- package/dist/agent-src/skills/git-workflow/references/push-closes-its-loop.md +9 -0
- package/dist/agent-src/skills/gtm-launch/SKILL.md +2 -2
- package/dist/agent-src/skills/hiring-loop-design/SKILL.md +1 -1
- package/dist/agent-src/skills/html-deck/SKILL.md +5 -5
- package/dist/agent-src/skills/humanizer/SKILL.md +1 -1
- package/dist/agent-src/skills/humanizer/data/patterns.md +1 -1
- package/dist/agent-src/skills/iconography/SKILL.md +3 -3
- package/dist/agent-src/skills/judge-synthesis/SKILL.md +1 -1
- package/dist/agent-src/skills/laravel-api-endpoint/SKILL.md +2 -2
- package/dist/agent-src/skills/launch-readiness/SKILL.md +3 -3
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +6 -6
- package/dist/agent-src/skills/livewire/SKILL.md +1 -1
- package/dist/agent-src/skills/market-entry-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/mcp-builder/SKILL.md +1 -1
- package/dist/agent-src/skills/memory-consolidation/SKILL.md +3 -3
- package/dist/agent-src/skills/messaging-architecture/SKILL.md +2 -2
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
- package/dist/agent-src/skills/onboarding-design/SKILL.md +2 -2
- package/dist/agent-src/skills/onboarding-program/SKILL.md +1 -1
- package/dist/agent-src/skills/one-on-one-cadence/SKILL.md +1 -1
- package/dist/agent-src/skills/org-design/SKILL.md +1 -1
- package/dist/agent-src/skills/overbuild-review-lens/SKILL.md +3 -3
- package/dist/agent-src/skills/override-management/SKILL.md +1 -1
- package/dist/agent-src/skills/perf-feedback-craft/SKILL.md +1 -1
- package/dist/agent-src/skills/persona-writing/SKILL.md +1 -1
- package/dist/agent-src/skills/php-coder/SKILL.md +1 -1
- package/dist/agent-src/skills/pipeline-strategy/SKILL.md +2 -2
- package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -3
- package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/positioning-strategy/SKILL.md +2 -2
- package/dist/agent-src/skills/privacy-review/SKILL.md +1 -1
- package/dist/agent-src/skills/prompt-optimizer/SKILL.md +3 -3
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +2 -2
- package/dist/agent-src/skills/receiving-code-review/SKILL.md +1 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +2 -2
- package/dist/agent-src/skills/release-comms/SKILL.md +2 -2
- package/dist/agent-src/skills/retention-loops/SKILL.md +2 -2
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/roadmap-management/SKILL.md +1 -1
- package/dist/agent-src/skills/roadmap-management/references/archival.md +1 -1
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +5 -5
- package/dist/agent-src/skills/rule-writing/SKILL.md +6 -6
- package/dist/agent-src/skills/runway-cognition/SKILL.md +2 -2
- package/dist/agent-src/skills/scenario-modeling/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-writing/references/procedure.md +1 -1
- package/dist/agent-src/skills/skill-writing/references/section-patterns.md +3 -3
- package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +1 -1
- package/dist/agent-src/skills/stakeholder-tradeoff/SKILL.md +3 -3
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +1 -1
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +60 -4
- package/dist/agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +1 -1
- package/dist/agent-src/skills/token-optimizer/SKILL.md +1 -1
- package/dist/agent-src/skills/typography-system/SKILL.md +2 -2
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +28 -8
- package/dist/agent-src/skills/unit-economics-modeling/SKILL.md +2 -2
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +1 -1
- package/dist/agent-src/skills/validate-feature-fit/SKILL.md +2 -2
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
- package/dist/agent-src/skills/vision-articulation/SKILL.md +1 -1
- package/dist/agent-src/skills/voc-extract/SKILL.md +2 -2
- package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +2 -2
- package/dist/agent-src/skills/wireframe/SKILL.md +1 -1
- package/dist/agent-src/skills/workspace-link/SKILL.md +1 -1
- package/dist/agent-src/templates/agent-settings.md +6 -6
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/contexts/knowledge-pages.md +2 -3
- package/dist/agent-src/templates/copilot-instructions.md +1 -1
- package/dist/agent-src/templates/roadmaps.md +1 -1
- package/dist/agent-src/templates/scripts/README.md +2 -2
- package/dist/agent-src/user-types/_template/user-type.md +1 -1
- package/dist/cli/registry.js +1 -1
- package/dist/cli-delegate/archive_completed_roadmaps.js +52 -4
- package/dist/cli-delegate/check_update_banner.js +12 -1
- package/dist/cli-delegate/{chunk-TGIPZBCW.js → chunk-2KKXJW25.js} +22 -8
- package/dist/cli-delegate/{chunk-NLP54U3J.js → chunk-2XY7ILBT.js} +13 -1
- package/dist/cli-delegate/{chunk-4FS4WRXP.js → chunk-3FKR64R5.js} +34 -6
- package/dist/cli-delegate/{chunk-J3RFNKG4.js → chunk-55ACLDUE.js} +2 -2
- package/dist/cli-delegate/{chunk-PKOBQADP.js → chunk-57PN4GYJ.js} +1 -1
- package/dist/cli-delegate/{chunk-BIXEDQPZ.js → chunk-AK6HODNQ.js} +4 -4
- package/dist/cli-delegate/{chunk-2FTMENJL.js → chunk-GYC3VRYN.js} +1 -1
- package/dist/cli-delegate/{chunk-LWTYTX6F.js → chunk-HZ52BRGG.js} +24 -18
- package/dist/cli-delegate/{chunk-6RJA2F5A.js → chunk-IVBPRCQO.js} +1 -1
- package/dist/cli-delegate/{chunk-I6RHFQEG.js → chunk-YUM5KURG.js} +17 -1
- package/dist/cli-delegate/cmd_analyze_session.js +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +1 -1
- package/dist/cli-delegate/cmd_conformance.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_explain.js +2 -2
- package/dist/cli-delegate/cmd_export.js +4 -4
- package/dist/cli-delegate/cmd_handoff.js +24 -16
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_memory_get.js +1 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +2 -2
- package/dist/cli-delegate/cmd_prune.js +4 -4
- package/dist/cli-delegate/cmd_route_audit.js +3 -3
- package/dist/cli-delegate/cmd_route_explain.js +1 -1
- package/dist/cli-delegate/cmd_session_recycle.js +4 -14
- package/dist/cli-delegate/cmd_settings_get.js +15 -9
- package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
- package/dist/cli-delegate/cmd_settings_set.js +41 -11
- package/dist/cli-delegate/cmd_sync.js +4 -4
- package/dist/cli-delegate/cmd_uninstall.js +4 -4
- package/dist/cli-delegate/cmd_update.js +1 -1
- package/dist/cli-delegate/cmd_upgrade.js +1 -1
- package/dist/cli-delegate/cmd_validate.js +4 -4
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +27 -80
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +5 -7
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +4 -6
- package/dist/hooks/dispatch.js +9249 -8981
- package/dist/install/install.mjs +47 -8
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +5496 -2400
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +73 -0
- package/dist/scripts/_lib/agent_src.js +20 -0
- package/dist/scripts/_lib/guidelines_lane.js +158 -0
- package/dist/scripts/_lib/lean_projection_mode.js +108 -0
- package/dist/scripts/_lib/router_match.js +243 -0
- package/dist/scripts/_lib/rule_injection.js +216 -0
- package/dist/scripts/condense.js +22 -25
- package/dist/scripts/project_thin_rules.js +139 -19
- package/dist/server/io/yamlIO.js +125 -17
- package/dist/server/schemas/settings.js +32 -5
- package/dist/shared/settingsSurface.js +6 -1
- package/docs/MIGRATION.md +56 -0
- package/docs/contracts/settings-classes.md +48 -7
- package/docs/guidelines/abstraction-thresholds.md +35 -0
- package/docs/guidelines/agent-infra/active-remediation-mechanics.md +3 -3
- package/docs/guidelines/agent-infra/false-green.md +2 -2
- package/docs/guidelines/agent-infra/notes-horizon-mechanics.md +90 -0
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +1 -1
- package/docs/guidelines/design-fidelity-mechanics.md +4 -0
- package/docs/guidelines/design-fidelity-routing.md +78 -0
- package/docs/guidelines/design-reconciliation.md +172 -0
- package/docs/guidelines/gtm-handoff.md +2 -2
- package/docs/guidelines/wing4-handoff.md +2 -2
- package/llms.txt +1 -1
- package/package.json +7 -3
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +106 -4
- package/src/config/agent-settings.template.yml +94 -1
- package/src/config/ci-local-parity.yml +34 -0
- package/src/config/continuity-surface.json +8 -29
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +31 -8
- package/src/config/gate-reachability-exemptions.json +1 -0
- package/src/config/gate-violation-baselines.json +3 -3
- package/src/config/hook-token-budget.json +8 -7
- package/src/config/host-injection-effect.json +2 -2
- package/src/config/pack-size-budget.json +55 -4
- package/src/config/packed-binary-manifest.json +1 -1
- package/src/config/platform-anchor.json +47 -0
- package/src/config/preamble-payload-budget.json +2 -3
- package/src/config/publish-surface.json +4 -2
- package/src/config/ratification-policy.json +7 -0
- package/src/config/routing-coverage-seed.json +9 -2
- package/src/config/rule-stub-ceilings.json +16 -9
- package/src/scripts/_cli/cmd_session_recycle.ts +2 -25
- package/src/scripts/_cli/cmd_settings_get.ts +22 -7
- package/src/scripts/_cli/handoff_sessions.ts +14 -44
- package/src/scripts/_lib/agent_settings.ts +85 -0
- package/src/scripts/_lib/agent_src.ts +21 -0
- package/src/scripts/_lib/artifact_maturity.ts +242 -0
- package/src/scripts/_lib/conformance_report.ts +403 -0
- package/src/scripts/_lib/continuity_slot.ts +295 -0
- package/src/scripts/_lib/continuity_writer.ts +312 -0
- package/src/scripts/_lib/design_system_import.ts +20 -0
- package/src/scripts/_lib/design_tolerance.ts +281 -0
- package/src/scripts/_lib/guidelines_lane.ts +164 -0
- package/src/scripts/_lib/hook_settings.ts +85 -0
- package/src/scripts/_lib/lean_projection_mode.ts +127 -0
- package/src/scripts/_lib/obligation_frequency.ts +2 -3
- package/src/scripts/_lib/packed_binary_predicate.ts +37 -0
- package/src/scripts/_lib/platform_anchor.ts +1053 -0
- package/src/scripts/_lib/ratification_artifact.ts +278 -0
- package/src/scripts/_lib/recycle_envelope_paths.ts +109 -21
- package/src/scripts/_lib/regression_neighbourhood.ts +159 -22
- package/src/scripts/_lib/security_lint.ts +23 -2
- package/src/scripts/_lib/self_repair.ts +21 -0
- package/src/scripts/_lib/session_eol.ts +44 -0
- package/src/scripts/_lib/session_index_trust.ts +387 -0
- package/src/scripts/_lib/standing_bound_ratchet.ts +220 -0
- package/src/scripts/_lib/tolerance_shadow.ts +177 -0
- package/src/scripts/_lib/vendored_grammar_upstream.ts +280 -0
- package/src/scripts/ai_council/redact_low_impact_entry.ts +8 -0
- package/src/scripts/audit_mcp_tools.ts +69 -25
- package/src/scripts/autonomy_friction_traffic.ts +379 -0
- package/src/scripts/build_mcp_catalog.ts +24 -1
- package/src/scripts/check_host_tree_parity.ts +291 -0
- package/src/scripts/check_kernel_edit_ratified.ts +462 -0
- package/src/scripts/check_loss_class_declared.ts +793 -46
- package/src/scripts/check_platform_anchor.ts +390 -0
- package/src/scripts/check_preamble_payload_budget.ts +424 -7
- package/src/scripts/check_projected_rule_routes.ts +395 -0
- package/src/scripts/check_rule_projection_integrity.ts +102 -2
- package/src/scripts/ci_settle.ts +205 -5
- package/src/scripts/code_graph/build.ts +79 -0
- package/src/scripts/code_graph/cli.ts +264 -7
- package/src/scripts/code_graph/detect.ts +38 -0
- package/src/scripts/code_graph/query.ts +25 -2
- package/src/scripts/code_graph/sqlite_store.ts +16 -1
- package/src/scripts/code_graph/types.ts +52 -3
- package/src/scripts/code_graph/validate.ts +3 -1
- package/src/scripts/code_graph/verbs.ts +590 -0
- package/src/scripts/condense.ts +22 -26
- package/src/scripts/generate_host_cost_table.ts +354 -0
- package/src/scripts/handoff_context_hook.ts +39 -1
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +59 -28
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +182 -16
- package/src/scripts/hooks/category_a.ts +1 -1
- package/src/scripts/hooks/chain_nudge_hook.ts +311 -25
- package/src/scripts/hooks/code_graph_context_hook.ts +7 -18
- package/src/scripts/hooks/push_settle_hook.ts +3 -2
- package/src/scripts/hooks/rule_inject_hook.ts +107 -20
- package/src/scripts/hooks/session_eol_hook.ts +177 -145
- package/src/scripts/hooks/source_first_gate_hook.ts +12 -0
- package/src/scripts/hooks/ui_route_nudge_hook.ts +52 -15
- package/src/scripts/hot_context_hook.ts +103 -408
- package/src/scripts/lint_evidence_artifacts.ts +1 -0
- package/src/scripts/lint_knowledge_scale.ts +0 -26
- package/src/scripts/lint_roadmap_blockers.ts +164 -1
- package/src/scripts/mcp_server/consumer_tool_catalog.json +152 -2
- package/src/scripts/mcp_server/graph_tools.ts +294 -0
- package/src/scripts/mcp_server/path_util.ts +31 -0
- package/src/scripts/mcp_server/tool_catalog_source.ts +7 -1
- package/src/scripts/mcp_server/tools.ts +3 -13
- package/src/scripts/memory_lookup.ts +9 -9
- package/src/scripts/model_rule_injection.ts +61 -4
- package/src/scripts/project_thin_rules.ts +149 -16
- package/src/scripts/report_standing_payload_by_host.ts +650 -0
- package/src/scripts/schemas/agent-settings.schema.json +7 -1
- package/src/scripts/session_memory_index.ts +86 -8
- package/src/scripts/sync_agent_settings.ts +270 -10
- package/src/server/io/yamlIO.ts +127 -17
- package/src/server/schemas/settings.ts +45 -6
- package/src/shared/settingsSurface.ts +13 -2
- package/src/templates/compact-instructions.md +8 -3
- package/src/vendor/grammars/README.md +27 -2
- package/dist/agent-src/commands/chat-history/import.md +0 -170
- package/dist/agent-src/commands/chat-history.md +0 -63
|
@@ -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,247 @@
|
|
|
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
|
+
## Sniff test — when an enum/string discriminator wants to become a Strategy
|
|
19
|
+
|
|
20
|
+
Run these three questions **before** writing a second `match`/`switch` arm,
|
|
21
|
+
a second `if/elseif` branch, or a second hardcoded class per provider/type.
|
|
22
|
+
Two "yes" answers → extract Strategy + Registry. Three "yes" → it is
|
|
23
|
+
already overdue.
|
|
24
|
+
|
|
25
|
+
1. **Same-shape branches?** Do two or more branches/classes implement the
|
|
26
|
+
*same operation* on the *same data*, differing only in provider-specific
|
|
27
|
+
details (URL, field mapping, credentials, response parsing)?
|
|
28
|
+
2. **Closed-list edits?** Adding a new case requires editing an enum, a
|
|
29
|
+
`match` block, an allowlist constant, *and* a service class — i.e. the
|
|
30
|
+
change is mechanical but spans ≥3 files?
|
|
31
|
+
3. **Discriminator leakage?** Does the discriminator (`Type::FOO`,
|
|
32
|
+
`'stripe'`, an `is_csv()` check) appear in ≥3 places that should not
|
|
33
|
+
have to know about `FOO` specifically?
|
|
34
|
+
|
|
35
|
+
If yes → see *Refactoring recipe* below.
|
|
36
|
+
|
|
37
|
+
## Example
|
|
38
|
+
|
|
39
|
+
```php
|
|
40
|
+
interface DiscountStrategy
|
|
41
|
+
{
|
|
42
|
+
public function calculate(int $subtotalInCents): int;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
final class PercentageDiscount implements DiscountStrategy
|
|
46
|
+
{
|
|
47
|
+
public function __construct(private int $percent) {}
|
|
48
|
+
|
|
49
|
+
public function calculate(int $subtotalInCents): int
|
|
50
|
+
{
|
|
51
|
+
return Math::divide(Math::multiply($subtotalInCents, $this->percent), 100);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
final class FixedDiscount implements DiscountStrategy
|
|
56
|
+
{
|
|
57
|
+
public function __construct(private int $amountInCents) {}
|
|
58
|
+
|
|
59
|
+
public function calculate(int $subtotalInCents): int
|
|
60
|
+
{
|
|
61
|
+
return min($this->amountInCents, $subtotalInCents);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Selection via Enum
|
|
67
|
+
|
|
68
|
+
```php
|
|
69
|
+
enum DiscountType: string
|
|
70
|
+
{
|
|
71
|
+
case PERCENTAGE = 'percentage';
|
|
72
|
+
case FIXED = 'fixed';
|
|
73
|
+
|
|
74
|
+
public function strategy(int $value): DiscountStrategy
|
|
75
|
+
{
|
|
76
|
+
return match ($this) {
|
|
77
|
+
self::PERCENTAGE => new PercentageDiscount($value),
|
|
78
|
+
self::FIXED => new FixedDiscount($value),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Refactoring recipe — from discriminator to Strategy
|
|
85
|
+
|
|
86
|
+
Two anti-patterns appear in real codebases and both refactor into the same
|
|
87
|
+
Strategy + Registry shape. Each step is a separate commit so reviewers can
|
|
88
|
+
follow the safety chain.
|
|
89
|
+
|
|
90
|
+
### Sub-pattern A — *hardcoded single provider per class*
|
|
91
|
+
|
|
92
|
+
Each provider gets its own `FooImportService`, `FooJob`, `FooCommand`,
|
|
93
|
+
and every method body repeats `Provider::FOO->value` or
|
|
94
|
+
`Provider::FOO->getId()`. Adding a new provider means copy-pasting an
|
|
95
|
+
entire class tree.
|
|
96
|
+
|
|
97
|
+
```php
|
|
98
|
+
// Before — one class per provider, discriminator hardcoded.
|
|
99
|
+
final class StripeImportService
|
|
100
|
+
{
|
|
101
|
+
public function id(): int { return Provider::STRIPE->getId(); }
|
|
102
|
+
public function name(): string { return Provider::STRIPE->value; }
|
|
103
|
+
public function import(): void { /* Stripe-specific logic */ }
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
final class PaypalImportService
|
|
107
|
+
{
|
|
108
|
+
public function id(): int { return Provider::PAYPAL->getId(); }
|
|
109
|
+
public function name(): string { return Provider::PAYPAL->value; }
|
|
110
|
+
public function import(): void { /* PayPal-specific logic */ }
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
```php
|
|
115
|
+
// After — one interface, N strategies, one registry.
|
|
116
|
+
interface ImportStrategy
|
|
117
|
+
{
|
|
118
|
+
public function provider(): Provider;
|
|
119
|
+
public function import(): void;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
final class StripeImport implements ImportStrategy
|
|
123
|
+
{
|
|
124
|
+
public function provider(): Provider { return Provider::STRIPE; }
|
|
125
|
+
public function import(): void { /* Stripe-specific logic */ }
|
|
126
|
+
}
|
|
127
|
+
// ...PaypalImport implements ImportStrategy similarly.
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Recipe (one commit per step):
|
|
131
|
+
|
|
132
|
+
1. Extract the interface (`ImportStrategy`) and move one provider class
|
|
133
|
+
to implement it. Existing call sites keep using the old class.
|
|
134
|
+
2. Repeat for the remaining providers — still no callers changed.
|
|
135
|
+
3. Introduce the Registry (next section). Migrate call sites one by one
|
|
136
|
+
from `new StripeImportService()` to `$registry->for(Provider::STRIPE)`.
|
|
137
|
+
4. Delete the old per-provider classes.
|
|
138
|
+
|
|
139
|
+
### Sub-pattern B — *allowlist constant on a single coordinator*
|
|
140
|
+
|
|
141
|
+
A central service holds an allowlist of supported discriminator values.
|
|
142
|
+
Every new provider edits the constant *and* a method that branches on it.
|
|
143
|
+
|
|
144
|
+
```php
|
|
145
|
+
// Before — closed-list edit per new provider.
|
|
146
|
+
final class EquipmentImportService
|
|
147
|
+
{
|
|
148
|
+
private const FULL_SYNC_PROVIDERS = [
|
|
149
|
+
Provider::STRIPE,
|
|
150
|
+
Provider::PAYPAL,
|
|
151
|
+
Provider::INVOICE,
|
|
152
|
+
];
|
|
153
|
+
|
|
154
|
+
public function supportsFullSync(Provider $p): bool
|
|
155
|
+
{
|
|
156
|
+
return in_array($p, self::FULL_SYNC_PROVIDERS, true);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
The fix is a **capability flag on the strategy interface** — the strategy
|
|
162
|
+
declares its own capabilities, and the coordinator asks the strategy
|
|
163
|
+
instead of consulting an allowlist.
|
|
164
|
+
|
|
165
|
+
```php
|
|
166
|
+
interface ImportStrategy
|
|
167
|
+
{
|
|
168
|
+
public function provider(): Provider;
|
|
169
|
+
public function import(): void;
|
|
170
|
+
public function supportsFullSync(): bool; // capability flag
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
A new provider now adds itself by implementing the interface — no central
|
|
175
|
+
list to edit, no in_array call to maintain. The coordinator becomes:
|
|
176
|
+
|
|
177
|
+
```php
|
|
178
|
+
$strategy = $registry->for($provider);
|
|
179
|
+
if ($strategy->supportsFullSync()) {
|
|
180
|
+
$strategy->fullSync();
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## Registry companion
|
|
185
|
+
|
|
186
|
+
A Registry resolves the discriminator → strategy lookup that previously
|
|
187
|
+
lived in the `match` block. It owns the only place the enum is mapped to
|
|
188
|
+
classes; everything downstream sees only the interface.
|
|
189
|
+
|
|
190
|
+
```php
|
|
191
|
+
final class ImportStrategyRegistry
|
|
192
|
+
{
|
|
193
|
+
/** @var array<string, ImportStrategy> */
|
|
194
|
+
private array $byProvider;
|
|
195
|
+
|
|
196
|
+
/** @param iterable<ImportStrategy> $strategies */
|
|
197
|
+
public function __construct(iterable $strategies)
|
|
198
|
+
{
|
|
199
|
+
foreach ($strategies as $strategy) {
|
|
200
|
+
$this->byProvider[$strategy->provider()->value] = $strategy;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
public function for(Provider $provider): ImportStrategy
|
|
205
|
+
{
|
|
206
|
+
return $this->byProvider[$provider->value]
|
|
207
|
+
?? throw new InvalidArgumentException(
|
|
208
|
+
"No import strategy registered for {$provider->value}"
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Wire-up in Laravel — tag the strategies, inject the tag into the registry:
|
|
215
|
+
|
|
216
|
+
```php
|
|
217
|
+
// In a ServiceProvider::register()
|
|
218
|
+
$this->app->tag([
|
|
219
|
+
StripeImport::class,
|
|
220
|
+
PaypalImport::class,
|
|
221
|
+
InvoiceImport::class,
|
|
222
|
+
], 'import.strategies');
|
|
223
|
+
|
|
224
|
+
$this->app->bind(
|
|
225
|
+
ImportStrategyRegistry::class,
|
|
226
|
+
fn ($app) => new ImportStrategyRegistry($app->tagged('import.strategies')),
|
|
227
|
+
);
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
A new provider now adds itself by:
|
|
231
|
+
|
|
232
|
+
1. Implementing `ImportStrategy`.
|
|
233
|
+
2. Adding one line to the `tag()` call.
|
|
234
|
+
|
|
235
|
+
No `match` block grows. No allowlist edits. No coordinator method changes.
|
|
236
|
+
|
|
237
|
+
## When NOT to Use
|
|
238
|
+
|
|
239
|
+
❌ Only two cases with **trivial logic** — a simple `match` or ternary is
|
|
240
|
+
enough. *"Trivial"* means the two arms each fit on one line and share
|
|
241
|
+
no structural shape. Two arms that each call a method on a service
|
|
242
|
+
are not trivial — see the sniff test.
|
|
243
|
+
❌ The "strategies" share no common interface or behavior — if the
|
|
244
|
+
operations differ, you do not have a Strategy candidate.
|
|
245
|
+
❌ The discriminator is set once at boot and never re-evaluated — a
|
|
246
|
+
single binding in the container is simpler than a Registry.
|
|
247
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Design Patterns
|
|
2
|
+
|
|
3
|
+
> Proven patterns for PHP / Laravel projects. Use them when they reduce complexity, not when they add it.
|
|
4
|
+
|
|
5
|
+
**Related Skills:** `php-service`, `dto-creator`, `jobs-events`, `security`, `eloquent`
|
|
6
|
+
**Related Rules:** `scope-control.md`, `architecture.md`
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
| Pattern | Skill | When to use |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| [Service Layer / Actions](patterns/service-layer.md) | `php-service` | Business logic that doesn't belong in controllers |
|
|
13
|
+
| [Dependency Injection](patterns/dependency-injection.md) | `php-service` | Decouple classes from concrete implementations |
|
|
14
|
+
| [Strategy](patterns/strategy.md) | `php-coder` | Multiple interchangeable algorithms at runtime |
|
|
15
|
+
| [Factory](patterns/factory.md) | `php-coder` | Complex object creation |
|
|
16
|
+
| [DTOs / Value Objects](patterns/dtos.md) | `dto-creator` | Structured data instead of untyped arrays |
|
|
17
|
+
| [Policies](patterns/policies.md) | `security` | Centralized authorization logic |
|
|
18
|
+
| [Events / Listeners](patterns/events.md) | `jobs-events` | Decoupled side effects (mails, logs, syncs) |
|
|
19
|
+
| [Pipeline / Middleware](patterns/pipelines.md) | `laravel` | Sequential processing steps / filter chains |
|
|
20
|
+
| [Repository](patterns/repositories.md) | `eloquent` | Complex or reusable database queries |
|
|
21
|
+
|
|
22
|
+
## When NOT to Use Patterns
|
|
23
|
+
|
|
24
|
+
- Don't introduce a pattern for a 5-line function
|
|
25
|
+
- Don't create an interface if there will only ever be one implementation
|
|
26
|
+
- Don't use events for everything — direct calls are easier to follow
|
|
27
|
+
- Don't wrap simple Eloquent queries in repositories
|
|
28
|
+
- KISS and YAGNI always trump pattern purity
|