@event4u/agent-config 14.23.0 → 16.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 +144 -152
- 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 +1 -1
- 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 +4 -3
- package/dist/agent-src/commands/roadmap/materialize.md +2 -2
- package/dist/agent-src/commands/roadmap/next.md +1 -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 +51 -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 +1 -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 +2 -2
- 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/rules/user-interaction.md +31 -30
- 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-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/error-handling-patterns/SKILL.md +9 -0
- 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/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 +11 -5
- 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-delegate/check_update_banner.js +12 -1
- package/dist/cli-delegate/{chunk-NLP54U3J.js → chunk-2XY7ILBT.js} +13 -1
- package/dist/cli-delegate/{chunk-IAI3XL43.js → chunk-3FKR64R5.js} +22 -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-KCNTUSPI.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-H32DGUJH.js} +15 -84
- package/dist/cli-delegate/{chunk-6RJA2F5A.js → chunk-IVBPRCQO.js} +1 -1
- package/dist/cli-delegate/chunk-NUHLI2RX.js +80 -0
- package/dist/cli-delegate/{chunk-TYSY33MD.js → chunk-QJWAUMJW.js} +12 -2
- package/dist/cli-delegate/{chunk-2KKXJW25.js → chunk-S3VFXMTM.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 +834 -275
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_explain.js +5 -3
- package/dist/cli-delegate/cmd_export.js +4 -4
- package/dist/cli-delegate/cmd_handoff.js +6 -6
- 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 +3 -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 +3 -3
- 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 +54 -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 +25 -78
- 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 +9684 -9304
- package/dist/install/install.mjs +36 -8
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +2147 -1470
- 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/installed_lock.js +1 -1
- package/dist/scripts/condense.js +2 -5
- package/dist/server/io/yamlIO.js +175 -17
- package/dist/server/schemas/settings.js +18 -4
- package/dist/shared/settingsSurface.js +6 -1
- package/docs/contracts/settings-classes.md +18 -9
- 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/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/package.json +7 -3
- package/src/config/agent-settings.template.yml +55 -8
- package/src/config/ci-local-parity.yml +34 -0
- package/src/config/continuity-surface.json +11 -32
- 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 +1 -1
- package/src/config/host-injection-effect.json +2 -2
- package/src/config/pack-size-budget.json +55 -4
- package/src/config/platform-anchor.json +47 -0
- package/src/config/preamble-payload-budget.json +12 -8
- package/src/config/preamble-payload-exceptions.json +28 -0
- package/src/config/publish-surface.json +4 -2
- package/src/config/ratification-policy.json +7 -0
- package/src/config/rule-stub-ceilings.json +16 -9
- package/src/scripts/_cli/cmd_settings_get.ts +22 -7
- package/src/scripts/_dispatch.bash +3 -1
- 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/base_ref_payload.ts +315 -0
- package/src/scripts/_lib/conformance_report.ts +403 -0
- package/src/scripts/_lib/continuity_writer.ts +72 -13
- package/src/scripts/_lib/design_system_import.ts +20 -0
- package/src/scripts/_lib/design_tolerance.ts +281 -0
- package/src/scripts/_lib/dropped_decision.ts +142 -0
- package/src/scripts/_lib/guidelines_lane.ts +164 -0
- package/src/scripts/_lib/installed_lock.ts +1 -1
- package/src/scripts/_lib/measured_payload_ceiling.ts +424 -0
- package/src/scripts/_lib/obligation_frequency.ts +2 -3
- package/src/scripts/_lib/payload_catalogue_completeness.ts +211 -0
- package/src/scripts/_lib/platform_anchor.ts +1053 -0
- package/src/scripts/_lib/ratification_artifact.ts +278 -0
- package/src/scripts/_lib/release_findings_ingest.ts +324 -0
- package/src/scripts/_lib/release_tag_dispatch.ts +63 -0
- package/src/scripts/_lib/review_baseline.ts +254 -0
- package/src/scripts/_lib/review_skipped_record.ts +61 -1
- package/src/scripts/_lib/security_lint.ts +23 -2
- package/src/scripts/_lib/self_repair.ts +21 -0
- package/src/scripts/_lib/session_index_trust.ts +42 -1
- package/src/scripts/_lib/standing_bound_ratchet.ts +267 -88
- package/src/scripts/_lib/tolerance_shadow.ts +177 -0
- package/src/scripts/_lib/turn_end_refusals.ts +51 -4
- package/src/scripts/ai_council/redact_low_impact_entry.ts +8 -0
- package/src/scripts/autonomy_friction_traffic.ts +379 -0
- package/src/scripts/check_beta_review_markers.ts +35 -4
- package/src/scripts/check_finding_dispositions.ts +167 -16
- package/src/scripts/check_held_object_arrivals.ts +381 -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 +672 -107
- package/src/scripts/check_projected_rule_routes.ts +395 -0
- package/src/scripts/check_release_published.ts +1 -1
- package/src/scripts/check_reply_consistency.ts +86 -17
- package/src/scripts/code_graph/cli.ts +6 -0
- package/src/scripts/condense.ts +2 -6
- package/src/scripts/generate_host_cost_table.ts +354 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +74 -30
- package/src/scripts/hooks/block_kernel_rule_writes.ts +12 -2
- package/src/scripts/hooks/category_a.ts +1 -1
- package/src/scripts/hooks/chain_nudge_hook.ts +311 -25
- package/src/scripts/hooks/concern_registry.ts +2 -0
- package/src/scripts/hooks/end_review_nudge_hook.ts +101 -21
- package/src/scripts/hooks/review_baseline_hook.ts +130 -0
- package/src/scripts/hooks/session_eol_hook.ts +68 -154
- package/src/scripts/hooks/source_first_gate_hook.ts +12 -0
- package/src/scripts/hooks/turn_end_gate_hook.ts +232 -14
- package/src/scripts/hooks/ui_route_nudge_hook.ts +52 -15
- package/src/scripts/hooks_doctor.ts +4 -1
- package/src/scripts/hot_context_hook.ts +41 -401
- package/src/scripts/install.ts +1 -1
- package/src/scripts/interruption_report.ts +8 -2
- package/src/scripts/janitor.ts +8 -1
- package/src/scripts/lint_evidence_artifacts.ts +1 -0
- package/src/scripts/lint_knowledge_scale.ts +0 -26
- package/src/scripts/measure_turn_end_gate.ts +302 -5
- package/src/scripts/memory_lookup.ts +9 -9
- package/src/scripts/release.ts +52 -64
- package/src/scripts/release_drill.ts +193 -14
- package/src/scripts/release_env.ts +1 -1
- package/src/scripts/release_publication.ts +1 -1
- package/src/scripts/report_held_object_arrivals.ts +456 -0
- package/src/scripts/report_standing_payload_by_host.ts +7 -7
- package/src/scripts/session_memory_index.ts +5 -0
- package/src/scripts/sync_agent_settings.ts +394 -12
- package/src/server/io/yamlIO.ts +175 -17
- package/src/server/schemas/settings.ts +25 -5
- package/src/shared/settingsSurface.ts +13 -2
- package/src/templates/compact-instructions.md +8 -3
- package/dist/agent-src/commands/chat-history/import.md +0 -170
- package/dist/agent-src/commands/chat-history.md +0 -63
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Job Guidelines
|
|
2
|
+
|
|
3
|
+
> Queue job conventions. Horizon tags, uniqueness, retries, rate limiting.
|
|
4
|
+
|
|
5
|
+
**Related Skills:** `jobs-events`, `performance`
|
|
6
|
+
**Related Guidelines:** [patterns/service-layer.md](patterns/service-layer.md)
|
|
7
|
+
|
|
8
|
+
## Constructor
|
|
9
|
+
|
|
10
|
+
- Pass model **IDs** (not model instances) to reduce serialized job size
|
|
11
|
+
- Always set queue via `$this->onQueue()` — queue names from backed enums
|
|
12
|
+
|
|
13
|
+
```php
|
|
14
|
+
public function __construct(public int $productId)
|
|
15
|
+
{
|
|
16
|
+
$this->onQueue(Queue::SEARCH->value);
|
|
17
|
+
}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Tags (Horizon)
|
|
21
|
+
|
|
22
|
+
Always add `tags()` for filtering in Horizon:
|
|
23
|
+
|
|
24
|
+
```php
|
|
25
|
+
public function tags(): array
|
|
26
|
+
{
|
|
27
|
+
return [
|
|
28
|
+
self::class,
|
|
29
|
+
Product::class . ':' . $this->productId,
|
|
30
|
+
];
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Uniqueness
|
|
35
|
+
|
|
36
|
+
- Add `uniqueId()` if the job should not run twice concurrently
|
|
37
|
+
- **Must** also set `$uniqueFor` to prevent stuck locks:
|
|
38
|
+
|
|
39
|
+
```php
|
|
40
|
+
public int $uniqueFor = 3600;
|
|
41
|
+
|
|
42
|
+
public function uniqueId(): string
|
|
43
|
+
{
|
|
44
|
+
return (string) $this->productId;
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Error Handling & Retries
|
|
49
|
+
|
|
50
|
+
- Set `$maxExceptions` to limit unhandled exceptions before failing
|
|
51
|
+
- Define `backoff()` for retry intervals:
|
|
52
|
+
|
|
53
|
+
```php
|
|
54
|
+
public int $maxExceptions = 3;
|
|
55
|
+
|
|
56
|
+
/** @return int[] */
|
|
57
|
+
public function backoff(): array
|
|
58
|
+
{
|
|
59
|
+
return [5, 10, 30];
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Rate Limiting (External APIs)
|
|
64
|
+
|
|
65
|
+
Use `WithoutOverlapping` middleware for per-customer sequential execution:
|
|
66
|
+
|
|
67
|
+
```php
|
|
68
|
+
public function middleware(): array
|
|
69
|
+
{
|
|
70
|
+
return [new WithoutOverlapping($this->customerId)];
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Serialization
|
|
75
|
+
|
|
76
|
+
- Pass IDs or compact DTOs — not full Eloquent models with loaded relations.
|
|
77
|
+
- Model may change between dispatch and execution — design for this.
|
|
78
|
+
- Never serialize closures, service instances, or large nested structures.
|
|
79
|
+
|
|
80
|
+
## Idempotency
|
|
81
|
+
|
|
82
|
+
- Assume queued jobs may run more than once.
|
|
83
|
+
- Design handlers so retries don't create duplicate side effects.
|
|
84
|
+
- Especially careful with: emails, external APIs, payments, imports, record creation.
|
|
85
|
+
- Add explicit guards when duplicate execution would be harmful.
|
|
86
|
+
|
|
87
|
+
## Events
|
|
88
|
+
|
|
89
|
+
- Use events for meaningful occurrences, not every internal method call.
|
|
90
|
+
- Past-tense naming: `OrderPlaced`, `InvoicePaid`, `UserRegistered`.
|
|
91
|
+
- Keep event payloads focused.
|
|
92
|
+
- **Laravel 11+:** automatic event/listener discovery — no manual registration.
|
|
93
|
+
|
|
94
|
+
## Listeners
|
|
95
|
+
|
|
96
|
+
- One responsibility per listener.
|
|
97
|
+
- Delegate large business logic to services.
|
|
98
|
+
- Avoid deep hidden chains of listeners.
|
|
99
|
+
|
|
100
|
+
## Dispatching
|
|
101
|
+
|
|
102
|
+
- Be explicit: immediately, after response, or on queue.
|
|
103
|
+
- Don't change sync/async behavior casually in existing flows.
|
|
104
|
+
|
|
105
|
+
## General
|
|
106
|
+
|
|
107
|
+
- Avoid batches unless truly needed (relies on MySQL)
|
|
108
|
+
- Use Service classes for complex business logic inside `handle()`
|
|
109
|
+
- `ShouldQueue` is required for queued execution — without it, runs synchronously
|
|
110
|
+
- Set `$tries` and `$backoff` — unlimited retries can overwhelm the queue
|
|
111
|
+
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Livewire Guidelines
|
|
2
|
+
|
|
3
|
+
> Livewire component conventions — state, actions, forms, performance, Alpine.js, templates.
|
|
4
|
+
|
|
5
|
+
**Related Skills:** `livewire`, `flux`, `blade-ui`
|
|
6
|
+
|
|
7
|
+
## Component Structure (Livewire 3.x)
|
|
8
|
+
|
|
9
|
+
```php
|
|
10
|
+
#[Layout('layouts.app')]
|
|
11
|
+
#[Title('User List')]
|
|
12
|
+
final class UserList extends Component
|
|
13
|
+
{
|
|
14
|
+
public string $search = '';
|
|
15
|
+
|
|
16
|
+
public function render(): \Illuminate\View\View
|
|
17
|
+
{
|
|
18
|
+
return view('livewire.user-list', [
|
|
19
|
+
'users' => User::query()->where('name', 'like', '%' . $this->search . '%')->paginate(20),
|
|
20
|
+
]);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## State Management
|
|
26
|
+
|
|
27
|
+
- Use typed public properties for component state.
|
|
28
|
+
- Keep state minimal — only what the UI needs.
|
|
29
|
+
- `#[Locked]` for properties that must not be tampered with from frontend.
|
|
30
|
+
- `#[Url]` for properties that should sync with URL query string.
|
|
31
|
+
|
|
32
|
+
## Actions
|
|
33
|
+
|
|
34
|
+
- Public methods are callable from frontend.
|
|
35
|
+
- Validate input before processing: `$this->validate()`.
|
|
36
|
+
- `$this->dispatch()` for cross-component communication (Livewire 3).
|
|
37
|
+
|
|
38
|
+
## Forms
|
|
39
|
+
|
|
40
|
+
- Use Livewire Form Objects (`Livewire\Form`) for complex forms (Livewire 3).
|
|
41
|
+
- `wire:model` for two-way binding.
|
|
42
|
+
- `wire:model.live` for real-time updates, `wire:model.debounce` for delayed.
|
|
43
|
+
- Validate with Laravel validation rules.
|
|
44
|
+
|
|
45
|
+
## Performance
|
|
46
|
+
|
|
47
|
+
- `wire:key` on list items for DOM tracking.
|
|
48
|
+
- `#[Computed]` for derived data cached per request (Livewire 3).
|
|
49
|
+
- Avoid large datasets — paginate or filter.
|
|
50
|
+
- `wire:loading` for loading indicators.
|
|
51
|
+
|
|
52
|
+
## Alpine.js Integration
|
|
53
|
+
|
|
54
|
+
- `@entangle` to share state between Livewire and Alpine.
|
|
55
|
+
- `$wire` in Alpine to call Livewire methods.
|
|
56
|
+
- Alpine for client-side-only interactions (dropdowns, animations).
|
|
57
|
+
|
|
58
|
+
## Template Rules
|
|
59
|
+
|
|
60
|
+
- Every Livewire view must have **one root element** (usually `<div>`).
|
|
61
|
+
- Use `wire:key` on dynamic lists.
|
|
62
|
+
- Use `wire:loading` for user feedback.
|
|
63
|
+
|
|
64
|
+
## Do NOT
|
|
65
|
+
|
|
66
|
+
- Put heavy business logic in components — delegate to services.
|
|
67
|
+
- Use Livewire for purely static pages — use Blade.
|
|
68
|
+
- Expose sensitive data as public properties.
|
|
69
|
+
- Nest Livewire components deeply — keep tree shallow.
|
|
70
|
+
- Put heavy computation in `render()` — runs on every update.
|
|
71
|
+
- Skip `wire:key` on list items — causes DOM diffing issues.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Logging Guidelines
|
|
2
|
+
|
|
3
|
+
> Logging conventions — levels, structured context, what to log, Sentry patterns.
|
|
4
|
+
|
|
5
|
+
**Related Skills:** `logging-monitoring`, `grafana`
|
|
6
|
+
|
|
7
|
+
## Use Laravel's Log Facade
|
|
8
|
+
|
|
9
|
+
```php
|
|
10
|
+
use Illuminate\Support\Facades\Log;
|
|
11
|
+
|
|
12
|
+
// Standard logging
|
|
13
|
+
Log::info('Import completed', ['customer_id' => $customerId, 'count' => $count]);
|
|
14
|
+
|
|
15
|
+
// Channel-specific
|
|
16
|
+
Log::channel('loki')->info('Import snapshot', ['data' => $snapshotData]);
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Structured Context — Always
|
|
20
|
+
|
|
21
|
+
```php
|
|
22
|
+
// ✅ Correct — structured context
|
|
23
|
+
Log::warning('Import failed', ['customer_id' => $id, 'error' => $message]);
|
|
24
|
+
|
|
25
|
+
// ❌ Wrong — interpolated message
|
|
26
|
+
Log::warning("Import failed for customer {$id}: {$message}");
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Context keys must be `snake_case` — consistency matters for Loki queries.
|
|
30
|
+
|
|
31
|
+
## Log Levels
|
|
32
|
+
|
|
33
|
+
| Level | When | Example |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| `emergency` | System unusable | Database unreachable |
|
|
36
|
+
| `critical` | Immediate action required | Payment gateway down |
|
|
37
|
+
| `error` | Needs investigation | Import failed for customer |
|
|
38
|
+
| `warning` | Unusual, may need attention | Rate limit approaching |
|
|
39
|
+
| `info` | Significant business events | Import completed, user created |
|
|
40
|
+
| `debug` | Diagnostic (dev/staging only) | Query params, intermediate values |
|
|
41
|
+
|
|
42
|
+
## What to Log
|
|
43
|
+
|
|
44
|
+
- Business events: imports, state transitions, user actions
|
|
45
|
+
- Error context: what was happening, with which data, for which customer
|
|
46
|
+
- External interactions: API calls, webhook receipts
|
|
47
|
+
- Performance markers: long operations, batch sizes, durations
|
|
48
|
+
|
|
49
|
+
## What NOT to Log
|
|
50
|
+
|
|
51
|
+
- Passwords, tokens, API keys, PII (GDPR)
|
|
52
|
+
- Entire request/response bodies — log summary or hash
|
|
53
|
+
- Expected conditions at high levels (validation failures ≠ `error`)
|
|
54
|
+
- Every loop iteration — log the summary
|
|
55
|
+
|
|
56
|
+
## Correlation IDs
|
|
57
|
+
|
|
58
|
+
For multi-step operations:
|
|
59
|
+
|
|
60
|
+
```php
|
|
61
|
+
$correlationId = Str::uuid()->toString();
|
|
62
|
+
Log::info('Import started', ['correlation_id' => $correlationId, ...]);
|
|
63
|
+
Log::info('Import completed', ['correlation_id' => $correlationId, ...]);
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Sentry
|
|
67
|
+
|
|
68
|
+
- Use `MonitoringHelper::captureException()` — never Sentry SDK directly.
|
|
69
|
+
- Breadcrumbs: use `BreadcrumbType` and `BreadcrumbLevel` enums.
|
|
70
|
+
- Context names: use `ContextName` enum.
|
|
71
|
+
- Sentry has 200KB event size limit — large context gets truncated.
|
|
72
|
+
|
|
73
|
+
## Do NOT
|
|
74
|
+
|
|
75
|
+
- Use `var_dump()`, `print_r()`, `dd()` — disallowed by PHPStan.
|
|
76
|
+
- Use Sentry SDK directly — use `MonitoringHelper`.
|
|
77
|
+
- Hardcode log channel names in business logic — use config.
|
|
78
|
+
- Log at `error` for expected/handled conditions — use `warning` or `info`.
|
|
79
|
+
- Interpolate variables into log messages — use context array.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Naming Guidelines
|
|
2
|
+
|
|
3
|
+
> Naming conventions — PHP classes, database, routes, variables, modules, agent infrastructure.
|
|
4
|
+
|
|
5
|
+
**Related Skills:** none (naming is a convention — use this guideline directly)
|
|
6
|
+
**Related Guidelines:** [controllers.md](controllers.md), [resources.md](resources.md)
|
|
7
|
+
|
|
8
|
+
## PHP Classes
|
|
9
|
+
|
|
10
|
+
| Type | Pattern | Example |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| Controller | `{Action}{Entity}Controller` | `CreateProjectController` |
|
|
13
|
+
| FormRequest | `{Action}{Entity}Request` | `UpdateProjectRequest` |
|
|
14
|
+
| Resource | `{Entity}Resource` | `ProjectResource` |
|
|
15
|
+
| Minimal Resource | `{Entity}MinimalResource` | `ProjectMinimalResource` |
|
|
16
|
+
| Simple Resource | `Simple{Entity}Resource` | `SimpleUserResource` |
|
|
17
|
+
| Service | `{Domain}Service` | `ImportService` |
|
|
18
|
+
| DTO | `{Entity}{Purpose}Dto` | `ProjectCreateDto` |
|
|
19
|
+
| Job | `{Action}{Entity}Job` | `SyncCustomerJob` |
|
|
20
|
+
| Event | `{Entity}{PastTense}` | `ProjectCreated` |
|
|
21
|
+
| Enum | `{Entity}{Concept}` | `ImportStatus` |
|
|
22
|
+
| Policy | `{Entity}Policy` | `ProjectPolicy` |
|
|
23
|
+
| Interface | `{Capability}` (no suffix) | `SmsProvider` |
|
|
24
|
+
|
|
25
|
+
**Controller special cases:** List uses **plural** (`ListProjectsController`), all others singular.
|
|
26
|
+
|
|
27
|
+
## Database
|
|
28
|
+
|
|
29
|
+
| Element | Convention | Example |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| Tables | snake_case, plural | `projects`, `import_rows` |
|
|
32
|
+
| Columns | snake_case | `created_at`, `user_id` |
|
|
33
|
+
| Foreign keys | `{entity}_id` | `project_id` |
|
|
34
|
+
| Booleans | `is_` or `has_` prefix | `is_active`, `has_permission` |
|
|
35
|
+
| Timestamps | `_at` suffix | `synced_at`, `imported_at` |
|
|
36
|
+
| Pivot tables | Alphabetical, singular | `project_user` |
|
|
37
|
+
|
|
38
|
+
## Routes
|
|
39
|
+
|
|
40
|
+
| Element | Convention | Example |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| URL segments | kebab-case, plural | `/api/v1/import-uploads` |
|
|
43
|
+
| Route names | dot notation | `v1.import-uploads.index` |
|
|
44
|
+
| Route params | camelCase | `{importUpload}` |
|
|
45
|
+
| API versioning | Prefix | `/api/v1/`, `/api/v2/` |
|
|
46
|
+
|
|
47
|
+
## Variables
|
|
48
|
+
|
|
49
|
+
| Element | Convention | Example |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| Variables | camelCase | `$projectId` |
|
|
52
|
+
| Constants | UPPER_SNAKE_CASE | `MAX_RETRIES` |
|
|
53
|
+
| Array keys | snake_case | `['user_id' => 1]` |
|
|
54
|
+
| Config keys | snake_case, dot notation | `config('import.max_rows')` |
|
|
55
|
+
| Env vars | UPPER_SNAKE_CASE | `APP_ENV` |
|
|
56
|
+
|
|
57
|
+
## Modules
|
|
58
|
+
|
|
59
|
+
| Element | Convention | Example |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| Directory | PascalCase | `app/Modules/Import/` |
|
|
62
|
+
| Namespace | `App\Modules\{Name}\App\` | `App\Modules\Import\App\Services\` |
|
|
63
|
+
| Route prefix | kebab-case | `import`, `client-software` |
|
|
64
|
+
|
|
65
|
+
## Agent Infrastructure
|
|
66
|
+
|
|
67
|
+
| Element | Convention | Example |
|
|
68
|
+
|---|---|---|
|
|
69
|
+
| Skills | kebab-case | `bug-analyzer` |
|
|
70
|
+
| Rules | kebab-case | `php-coding` |
|
|
71
|
+
| Commands | kebab-case | `feature-plan` |
|
|
72
|
+
| Guidelines | kebab-case | `controllers.md` |
|
|
73
|
+
|
|
74
|
+
## Enums
|
|
75
|
+
|
|
76
|
+
- PascalCase class name
|
|
77
|
+
- UPPERCASE cases: `case PENDING;`, `case IN_PROGRESS;`
|
|
78
|
+
- Backed enums for DB values: `case PENDING = 'pending';`
|
|
79
|
+
|
|
80
|
+
## Interfaces
|
|
81
|
+
|
|
82
|
+
- Namespace: `App\Contracts\{Subdomain}\`
|
|
83
|
+
- No `Interface` suffix: `SmsProvider`, not `SmsProviderInterface`
|
|
84
|
+
|
|
85
|
+
## Do NOT
|
|
86
|
+
|
|
87
|
+
- Use abbreviations that aren't universally understood.
|
|
88
|
+
- Mix naming conventions within the same context.
|
|
89
|
+
- Use generic names (Manager, Helper, Utils) without specificity.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Dependency Injection & Interfaces
|
|
2
|
+
|
|
3
|
+
> Decouple classes from concrete implementations.
|
|
4
|
+
|
|
5
|
+
## Idea
|
|
6
|
+
|
|
7
|
+
Classes depend on **interfaces** (contracts), not on concrete classes.
|
|
8
|
+
Laravel's Service Container resolves the binding at runtime.
|
|
9
|
+
|
|
10
|
+
## When to Use
|
|
11
|
+
|
|
12
|
+
✅ Multiple implementations possible (e.g., payment gateways, notification channels)
|
|
13
|
+
✅ External services that need mocking in tests
|
|
14
|
+
✅ Repository pattern (contract + database implementation)
|
|
15
|
+
|
|
16
|
+
## When NOT to Use
|
|
17
|
+
|
|
18
|
+
❌ Only one implementation exists and is unlikely to change — just inject the concrete class
|
|
19
|
+
❌ Simple utility classes with no side effects
|
|
20
|
+
|
|
21
|
+
## Example
|
|
22
|
+
|
|
23
|
+
```php
|
|
24
|
+
// Contract
|
|
25
|
+
interface PaymentGateway
|
|
26
|
+
{
|
|
27
|
+
public function charge(int $amountInCents): PaymentResult;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Implementation
|
|
31
|
+
final class StripePaymentGateway implements PaymentGateway
|
|
32
|
+
{
|
|
33
|
+
public function charge(int $amountInCents): PaymentResult
|
|
34
|
+
{
|
|
35
|
+
// Stripe API call...
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Binding in ServiceProvider
|
|
41
|
+
|
|
42
|
+
```php
|
|
43
|
+
$this->app->bind(PaymentGateway::class, StripePaymentGateway::class);
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Naming
|
|
47
|
+
|
|
48
|
+
- Interfaces (contracts): descriptive name without suffix — `PaymentGateway`, `SmsProvider`
|
|
49
|
+
- Implementations: prefixed with technology — `StripePaymentGateway`, `TwilioSmsProvider`
|
|
50
|
+
- Namespace: `App\Contracts\` for interfaces
|
|
51
|
+
|
|
52
|
+
## Rules
|
|
53
|
+
|
|
54
|
+
- One interface = one responsibility (Interface Segregation)
|
|
55
|
+
- Bind in the module's ServiceProvider, not in AppServiceProvider
|
|
56
|
+
- Do **NOT** mark implementation classes `final` if they need mocking in tests
|
|
57
|
+
|
|
@@ -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
|
+
|