@dedesfr/prompter 0.8.23 → 1.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.
Files changed (247) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/README.md +105 -77
  3. package/dist/cli/index.js +25 -1
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/commands/init.d.ts +1 -7
  6. package/dist/commands/init.d.ts.map +1 -1
  7. package/dist/commands/init.js +60 -299
  8. package/dist/commands/init.js.map +1 -1
  9. package/dist/commands/login.d.ts +4 -0
  10. package/dist/commands/login.d.ts.map +1 -0
  11. package/dist/commands/login.js +56 -0
  12. package/dist/commands/login.js.map +1 -0
  13. package/dist/commands/logout.d.ts +4 -0
  14. package/dist/commands/logout.d.ts.map +1 -0
  15. package/dist/commands/logout.js +14 -0
  16. package/dist/commands/logout.js.map +1 -0
  17. package/dist/commands/update.d.ts.map +1 -1
  18. package/dist/commands/update.js +31 -41
  19. package/dist/commands/update.js.map +1 -1
  20. package/dist/commands/whoami.d.ts +4 -0
  21. package/dist/commands/whoami.d.ts.map +1 -0
  22. package/dist/commands/whoami.js +42 -0
  23. package/dist/commands/whoami.js.map +1 -0
  24. package/dist/core/auth-store.d.ts +10 -0
  25. package/dist/core/auth-store.d.ts.map +1 -0
  26. package/dist/core/auth-store.js +39 -0
  27. package/dist/core/auth-store.js.map +1 -0
  28. package/dist/core/configurators/slash/antigravity.d.ts +2 -5
  29. package/dist/core/configurators/slash/antigravity.d.ts.map +1 -1
  30. package/dist/core/configurators/slash/antigravity.js +2 -57
  31. package/dist/core/configurators/slash/antigravity.js.map +1 -1
  32. package/dist/core/configurators/slash/base.d.ts +6 -18
  33. package/dist/core/configurators/slash/base.d.ts.map +1 -1
  34. package/dist/core/configurators/slash/base.js +8 -77
  35. package/dist/core/configurators/slash/base.js.map +1 -1
  36. package/dist/core/configurators/slash/claude.d.ts +2 -5
  37. package/dist/core/configurators/slash/claude.d.ts.map +1 -1
  38. package/dist/core/configurators/slash/claude.js +2 -57
  39. package/dist/core/configurators/slash/claude.js.map +1 -1
  40. package/dist/core/configurators/slash/codex.d.ts +2 -5
  41. package/dist/core/configurators/slash/codex.d.ts.map +1 -1
  42. package/dist/core/configurators/slash/codex.js +2 -57
  43. package/dist/core/configurators/slash/codex.js.map +1 -1
  44. package/dist/core/configurators/slash/droid.d.ts +2 -5
  45. package/dist/core/configurators/slash/droid.d.ts.map +1 -1
  46. package/dist/core/configurators/slash/droid.js +2 -32
  47. package/dist/core/configurators/slash/droid.js.map +1 -1
  48. package/dist/core/configurators/slash/forge.d.ts +2 -5
  49. package/dist/core/configurators/slash/forge.d.ts.map +1 -1
  50. package/dist/core/configurators/slash/forge.js +2 -32
  51. package/dist/core/configurators/slash/forge.js.map +1 -1
  52. package/dist/core/configurators/slash/github-copilot.d.ts +2 -7
  53. package/dist/core/configurators/slash/github-copilot.d.ts.map +1 -1
  54. package/dist/core/configurators/slash/github-copilot.js +2 -96
  55. package/dist/core/configurators/slash/github-copilot.js.map +1 -1
  56. package/dist/core/configurators/slash/index.d.ts +1 -1
  57. package/dist/core/configurators/slash/index.d.ts.map +1 -1
  58. package/dist/core/configurators/slash/index.js +1 -1
  59. package/dist/core/configurators/slash/index.js.map +1 -1
  60. package/dist/core/configurators/slash/kilocode.d.ts +2 -5
  61. package/dist/core/configurators/slash/kilocode.d.ts.map +1 -1
  62. package/dist/core/configurators/slash/kilocode.js +2 -57
  63. package/dist/core/configurators/slash/kilocode.js.map +1 -1
  64. package/dist/core/configurators/slash/opencode.d.ts +2 -5
  65. package/dist/core/configurators/slash/opencode.d.ts.map +1 -1
  66. package/dist/core/configurators/slash/opencode.js +2 -57
  67. package/dist/core/configurators/slash/opencode.js.map +1 -1
  68. package/dist/core/configurators/slash/registry.d.ts +4 -4
  69. package/dist/core/configurators/slash/registry.d.ts.map +1 -1
  70. package/dist/core/configurators/slash/registry.js.map +1 -1
  71. package/dist/core/registry.d.ts +18 -0
  72. package/dist/core/registry.d.ts.map +1 -0
  73. package/dist/core/registry.js +94 -0
  74. package/dist/core/registry.js.map +1 -0
  75. package/dist/core/templates/index.d.ts +0 -1
  76. package/dist/core/templates/index.d.ts.map +1 -1
  77. package/dist/core/templates/index.js +0 -1
  78. package/dist/core/templates/index.js.map +1 -1
  79. package/package.json +7 -1
  80. package/AGENTS.md +0 -123
  81. package/CLAUDE.md +0 -17
  82. package/build.js +0 -20
  83. package/convex-setup.md +0 -403
  84. package/dist/core/templates/slash-command-templates.d.ts +0 -7
  85. package/dist/core/templates/slash-command-templates.d.ts.map +0 -1
  86. package/dist/core/templates/slash-command-templates.js +0 -1041
  87. package/dist/core/templates/slash-command-templates.js.map +0 -1
  88. package/prompt/ai-humanizer.md +0 -45
  89. package/prompt/api-contract-generator.md +0 -234
  90. package/prompt/apply.md +0 -17
  91. package/prompt/archive.md +0 -21
  92. package/prompt/design-system.md +0 -210
  93. package/prompt/document-explainer.md +0 -149
  94. package/prompt/epic-generator.md +0 -198
  95. package/prompt/epic-single.md +0 -47
  96. package/prompt/erd-generator.md +0 -130
  97. package/prompt/fsd-generator.md +0 -157
  98. package/prompt/prd-agent-generator.md +0 -147
  99. package/prompt/prd-generator.md +0 -195
  100. package/prompt/product-brief.md +0 -289
  101. package/prompt/proposal.md +0 -22
  102. package/prompt/qa-test-scenario.md +0 -133
  103. package/prompt/skill-creator.md +0 -350
  104. package/prompt/story-generator.md +0 -278
  105. package/prompt/story-single.md +0 -70
  106. package/prompt/tdd-generator.md +0 -294
  107. package/prompt/tdd-lite-generator.md +0 -224
  108. package/prompt/wireframe-generator.md +0 -219
  109. package/skills/ai-context-generator/SKILL.md +0 -54
  110. package/skills/ai-context-generator/references/AGENTS.template.md +0 -83
  111. package/skills/ai-context-generator/references/CLAUDE.template.md +0 -39
  112. package/skills/ai-context-generator/references/behavioral-guidelines.md +0 -71
  113. package/skills/ai-context-generator/references/discovery-checklist.md +0 -40
  114. package/skills/ai-context-generator/references/examples/AGENTS.good.md +0 -103
  115. package/skills/ai-context-generator/references/extraction-checklist.md +0 -23
  116. package/skills/ai-context-generator/references/overlays/laravel.md +0 -44
  117. package/skills/cerebro/SKILL.md +0 -187
  118. package/skills/cerebro/references/agents.md +0 -213
  119. package/skills/code-review/SKILL.md +0 -373
  120. package/skills/code-review/assets/report-template-agent.md +0 -212
  121. package/skills/code-review/assets/report-template-compact.md +0 -81
  122. package/skills/code-review/assets/report-template-full.md +0 -264
  123. package/skills/code-review/assets/report-template-human.md +0 -168
  124. package/skills/code-review/references/universal-patterns.md +0 -495
  125. package/skills/design-md/README.md +0 -34
  126. package/skills/design-md/SKILL.md +0 -172
  127. package/skills/design-md/examples/DESIGN.md +0 -154
  128. package/skills/design-system-generator/SKILL.md +0 -324
  129. package/skills/design-system-generator/assets/design-system-template.md +0 -348
  130. package/skills/design-system-generator/references/extraction-patterns.md +0 -321
  131. package/skills/doc-builder/SKILL.md +0 -115
  132. package/skills/doc-builder/references/ui-patterns.md +0 -394
  133. package/skills/document-translator/SKILL.md +0 -58
  134. package/skills/enhance-prompt/README.md +0 -34
  135. package/skills/enhance-prompt/SKILL.md +0 -204
  136. package/skills/enhance-prompt/references/KEYWORDS.md +0 -114
  137. package/skills/feature-planner/SKILL.md +0 -305
  138. package/skills/feature-planner/assets/implementation-plan-template.md +0 -85
  139. package/skills/frontend-design/LICENSE.txt +0 -177
  140. package/skills/frontend-design/SKILL.md +0 -42
  141. package/skills/gamma-builder/SKILL.md +0 -134
  142. package/skills/laravel-code-review/SKILL.md +0 -383
  143. package/skills/laravel-code-review/assets/report-template-agent.md +0 -195
  144. package/skills/laravel-code-review/assets/report-template-compact.md +0 -79
  145. package/skills/laravel-code-review/assets/report-template-full.md +0 -253
  146. package/skills/laravel-code-review/assets/report-template-human.md +0 -159
  147. package/skills/laravel-code-review/references/laravel-patterns.md +0 -571
  148. package/skills/laravel-code-review/references/php84-features.md +0 -442
  149. package/skills/mcp-builder/LICENSE.txt +0 -202
  150. package/skills/mcp-builder/SKILL.md +0 -236
  151. package/skills/mcp-builder/reference/evaluation.md +0 -602
  152. package/skills/mcp-builder/reference/mcp_best_practices.md +0 -249
  153. package/skills/mcp-builder/reference/node_mcp_server.md +0 -970
  154. package/skills/mcp-builder/reference/python_mcp_server.md +0 -719
  155. package/skills/mcp-builder/scripts/connections.py +0 -151
  156. package/skills/mcp-builder/scripts/evaluation.py +0 -373
  157. package/skills/mcp-builder/scripts/example_evaluation.xml +0 -22
  158. package/skills/mcp-builder/scripts/requirements.txt +0 -2
  159. package/skills/meeting-notes/SKILL.md +0 -159
  160. package/skills/meeting-notes/evals/evals.json +0 -23
  161. package/skills/project-orchestrator/SKILL.md +0 -487
  162. package/skills/project-orchestrator/assets/caddy-vps-setup.md +0 -180
  163. package/skills/project-orchestrator/assets/plan-summary-template.md +0 -159
  164. package/skills/prompter-specs/SKILL.md +0 -115
  165. package/skills/prompter-workflow/SKILL.md +0 -166
  166. package/skills/prompter-workflow/evals/evals.json +0 -89
  167. package/skills/sph-generator/SKILL.md +0 -488
  168. package/skills/ui-ux-pro/SKILL.md +0 -199
  169. package/skills/ui-ux-pro/assets/design-spec-template.md +0 -173
  170. package/skills/ui-ux-pro/references/component-patterns.md +0 -255
  171. package/skills/ui-ux-pro/references/design-principles.md +0 -167
  172. package/src/cli/index.ts +0 -223
  173. package/src/commands/archive.ts +0 -302
  174. package/src/commands/change.ts +0 -292
  175. package/src/commands/config.ts +0 -233
  176. package/src/commands/guide.ts +0 -50
  177. package/src/commands/init.ts +0 -899
  178. package/src/commands/list.ts +0 -194
  179. package/src/commands/show.ts +0 -138
  180. package/src/commands/spec.ts +0 -251
  181. package/src/commands/update.ts +0 -156
  182. package/src/commands/upgrade.ts +0 -30
  183. package/src/commands/validate.ts +0 -326
  184. package/src/core/artifact-graph/graph.ts +0 -167
  185. package/src/core/artifact-graph/index.ts +0 -44
  186. package/src/core/artifact-graph/instruction-loader.ts +0 -302
  187. package/src/core/artifact-graph/resolver.ts +0 -226
  188. package/src/core/artifact-graph/schema.ts +0 -124
  189. package/src/core/artifact-graph/state.ts +0 -64
  190. package/src/core/artifact-graph/types.ts +0 -65
  191. package/src/core/completions/command-registry.ts +0 -382
  192. package/src/core/completions/completion-provider.ts +0 -128
  193. package/src/core/completions/generators/bash-generator.ts +0 -191
  194. package/src/core/completions/generators/fish-generator.ts +0 -188
  195. package/src/core/completions/generators/powershell-generator.ts +0 -223
  196. package/src/core/completions/generators/zsh-generator.ts +0 -281
  197. package/src/core/completions/templates/bash-templates.ts +0 -24
  198. package/src/core/completions/templates/fish-templates.ts +0 -40
  199. package/src/core/completions/templates/powershell-templates.ts +0 -25
  200. package/src/core/completions/templates/zsh-templates.ts +0 -36
  201. package/src/core/completions/types.ts +0 -90
  202. package/src/core/config-schema.ts +0 -230
  203. package/src/core/config.ts +0 -181
  204. package/src/core/configurators/slash/antigravity.ts +0 -70
  205. package/src/core/configurators/slash/base.ts +0 -203
  206. package/src/core/configurators/slash/claude.ts +0 -70
  207. package/src/core/configurators/slash/codex.ts +0 -70
  208. package/src/core/configurators/slash/droid.ts +0 -44
  209. package/src/core/configurators/slash/forge.ts +0 -44
  210. package/src/core/configurators/slash/github-copilot.ts +0 -114
  211. package/src/core/configurators/slash/index.ts +0 -10
  212. package/src/core/configurators/slash/kilocode.ts +0 -70
  213. package/src/core/configurators/slash/opencode.ts +0 -70
  214. package/src/core/configurators/slash/registry.ts +0 -51
  215. package/src/core/converters/json-converter.ts +0 -62
  216. package/src/core/global-config.ts +0 -136
  217. package/src/core/parsers/change-parser.ts +0 -234
  218. package/src/core/parsers/markdown-parser.ts +0 -237
  219. package/src/core/parsers/requirement-blocks.ts +0 -234
  220. package/src/core/prompt-templates.ts +0 -3504
  221. package/src/core/schemas/base.schema.ts +0 -20
  222. package/src/core/schemas/change.schema.ts +0 -42
  223. package/src/core/schemas/index.ts +0 -20
  224. package/src/core/schemas/spec.schema.ts +0 -17
  225. package/src/core/skill-discovery.ts +0 -68
  226. package/src/core/specs-apply.ts +0 -483
  227. package/src/core/styles/palette.ts +0 -8
  228. package/src/core/templates/agents-template.ts +0 -459
  229. package/src/core/templates/claude-template.ts +0 -2
  230. package/src/core/templates/index.ts +0 -4
  231. package/src/core/templates/project-template.ts +0 -32
  232. package/src/core/templates/slash-command-templates.ts +0 -1068
  233. package/src/core/validation/constants.ts +0 -48
  234. package/src/core/validation/types.ts +0 -19
  235. package/src/core/validation/validator.ts +0 -449
  236. package/src/core/view.ts +0 -219
  237. package/src/index.ts +0 -1
  238. package/src/utils/change-metadata.ts +0 -171
  239. package/src/utils/change-utils.ts +0 -131
  240. package/src/utils/file-system.ts +0 -252
  241. package/src/utils/index.ts +0 -12
  242. package/src/utils/interactive.ts +0 -29
  243. package/src/utils/item-discovery.ts +0 -66
  244. package/src/utils/match.ts +0 -26
  245. package/src/utils/shell-detection.ts +0 -62
  246. package/src/utils/task-progress.ts +0 -43
  247. package/tsconfig.json +0 -28
@@ -1,571 +0,0 @@
1
- # Laravel 12 Issue Detection Patterns
2
-
3
- Comprehensive reference for Laravel 12 + PHP 8.4 code issues.
4
-
5
- ---
6
-
7
- ## Security Issues
8
-
9
- ### Mass Assignment Vulnerability
10
-
11
- ```php
12
- // ❌ Bad: No $fillable defined
13
- class User extends Model
14
- {
15
- // Missing $fillable or $guarded
16
- }
17
-
18
- // ❌ Bad: Using $guarded = []
19
- class User extends Model
20
- {
21
- protected $guarded = []; // Everything is fillable!
22
- }
23
-
24
- // ✅ Good: Explicit $fillable
25
- class User extends Model
26
- {
27
- protected $fillable = ['name', 'email'];
28
- }
29
- ```
30
-
31
- ### SQL Injection
32
-
33
- ```php
34
- // ❌ Bad: Raw query with concatenation
35
- DB::select("SELECT * FROM users WHERE id = " . $id);
36
-
37
- // ❌ Bad: whereRaw without binding
38
- User::whereRaw("email = '$email'")->get();
39
-
40
- // ✅ Good: Parameter binding
41
- DB::select("SELECT * FROM users WHERE id = ?", [$id]);
42
- User::whereRaw("email = ?", [$email])->get();
43
- ```
44
-
45
- ### Missing Authorization
46
-
47
- ```php
48
- // ❌ Bad: No authorization check
49
- public function update(Request $request, Post $post)
50
- {
51
- $post->update($request->all());
52
- }
53
-
54
- // ✅ Good: Policy check
55
- public function update(Request $request, Post $post)
56
- {
57
- $this->authorize('update', $post);
58
- $post->update($request->validated());
59
- }
60
- ```
61
-
62
- ### XSS in Blade
63
-
64
- ```php
65
- // ❌ Bad: Unescaped user input
66
- {!! $user->bio !!}
67
- {!! request('name') !!}
68
-
69
- // ✅ Good: Escaped output
70
- {{ $user->bio }}
71
- {{ request('name') }}
72
-
73
- // ✅ Good: If HTML needed, sanitize first
74
- {!! clean($user->bio) !!}
75
- ```
76
-
77
- ### Missing CSRF
78
-
79
- ```php
80
- // ❌ Bad: Form without CSRF
81
- <form method="POST" action="/users">
82
- <input type="text" name="name">
83
- </form>
84
-
85
- // ✅ Good: Include CSRF token
86
- <form method="POST" action="/users">
87
- @csrf
88
- <input type="text" name="name">
89
- </form>
90
- ```
91
-
92
- ---
93
-
94
- ## N+1 Query Problems
95
-
96
- ### Basic N+1
97
-
98
- ```php
99
- // ❌ Bad: N+1 query
100
- $posts = Post::all();
101
- foreach ($posts as $post) {
102
- echo $post->author->name; // Query per iteration!
103
- }
104
-
105
- // ✅ Good: Eager loading
106
- $posts = Post::with('author')->get();
107
- foreach ($posts as $post) {
108
- echo $post->author->name;
109
- }
110
- ```
111
-
112
- ### Nested Relationships
113
-
114
- ```php
115
- // ❌ Bad: Missing nested eager load
116
- $posts = Post::with('author')->get();
117
- foreach ($posts as $post) {
118
- echo $post->author->profile->avatar; // N+1 on profile!
119
- }
120
-
121
- // ✅ Good: Nested eager loading
122
- $posts = Post::with('author.profile')->get();
123
- ```
124
-
125
- ### Conditional Eager Loading
126
-
127
- ```php
128
- // ❌ Bad: Loading unnecessary data
129
- $posts = Post::with('comments')->get();
130
-
131
- // ✅ Good: Constrained eager loading
132
- $posts = Post::with(['comments' => function ($query) {
133
- $query->where('approved', true)->limit(5);
134
- }])->get();
135
- ```
136
-
137
- ### Lazy Eager Loading
138
-
139
- ```php
140
- // ❌ Bad: N+1 after initial query
141
- $posts = Post::all();
142
- // Later in code...
143
- foreach ($posts as $post) {
144
- echo $post->tags->count();
145
- }
146
-
147
- // ✅ Good: Load when needed
148
- $posts = Post::all();
149
- $posts->load('tags');
150
- ```
151
-
152
- ---
153
-
154
- ## Controller Issues
155
-
156
- ### Fat Controller
157
-
158
- ```php
159
- // ❌ Bad: Too much logic in controller
160
- public function store(Request $request)
161
- {
162
- $validated = $request->validate([...]);
163
-
164
- $user = User::create($validated);
165
- $user->assignRole('customer');
166
-
167
- Mail::to($user)->send(new WelcomeEmail($user));
168
-
169
- event(new UserRegistered($user));
170
-
171
- $token = $user->createToken('api')->plainTextToken;
172
-
173
- return response()->json([...]);
174
- }
175
-
176
- // ✅ Good: Delegate to service
177
- public function store(StoreUserRequest $request, UserService $service)
178
- {
179
- $user = $service->register($request->validated());
180
-
181
- return new UserResource($user);
182
- }
183
- ```
184
-
185
- ### Missing Form Request
186
-
187
- ```php
188
- // ❌ Bad: Inline validation
189
- public function store(Request $request)
190
- {
191
- $validated = $request->validate([
192
- 'name' => 'required|string|max:255',
193
- 'email' => 'required|email|unique:users',
194
- ]);
195
- }
196
-
197
- // ✅ Good: Form Request class
198
- public function store(StoreUserRequest $request)
199
- {
200
- $validated = $request->validated();
201
- }
202
- ```
203
-
204
- ### Direct $request->all()
205
-
206
- ```php
207
- // ❌ Bad: Using all() without validation
208
- User::create($request->all());
209
-
210
- // ❌ Bad: Using only() without validation
211
- User::create($request->only(['name', 'email']));
212
-
213
- // ✅ Good: Use validated data
214
- User::create($request->validated());
215
- ```
216
-
217
- ---
218
-
219
- ## Eloquent Anti-patterns
220
-
221
- ### Inefficient Queries
222
-
223
- ```php
224
- // ❌ Bad: Get then count
225
- $count = User::get()->count();
226
-
227
- // ✅ Good: Direct count
228
- $count = User::count();
229
-
230
- // ❌ Bad: Get then pluck
231
- $emails = User::get()->pluck('email');
232
-
233
- // ✅ Good: Direct pluck
234
- $emails = User::pluck('email');
235
-
236
- // ❌ Bad: Get then first
237
- $user = User::where('email', $email)->get()->first();
238
-
239
- // ✅ Good: Direct first
240
- $user = User::where('email', $email)->first();
241
- ```
242
-
243
- ### Missing Select
244
-
245
- ```php
246
- // ❌ Bad: Selecting all columns
247
- $userNames = User::all()->pluck('name');
248
-
249
- // ✅ Good: Select only needed columns
250
- $userNames = User::select('name')->pluck('name');
251
- ```
252
-
253
- ### Large Dataset Handling
254
-
255
- ```php
256
- // ❌ Bad: Loading all records
257
- $users = User::all();
258
- foreach ($users as $user) {
259
- $user->update(['processed' => true]);
260
- }
261
-
262
- // ✅ Good: Chunking
263
- User::chunk(100, function ($users) {
264
- foreach ($users as $user) {
265
- $user->update(['processed' => true]);
266
- }
267
- });
268
-
269
- // ✅ Better: Lazy collection
270
- User::lazy()->each(function ($user) {
271
- $user->update(['processed' => true]);
272
- });
273
- ```
274
-
275
- ### Missing Indexes
276
-
277
- ```php
278
- // ❌ Bad: Querying unindexed column
279
- User::where('status', 'active')->get();
280
-
281
- // Migration should have:
282
- $table->string('status')->index();
283
- ```
284
-
285
- ---
286
-
287
- ## PHP 8.4 Issues
288
-
289
- ### Missing Constructor Property Promotion
290
-
291
- ```php
292
- // ❌ Bad: Old-style properties
293
- class UserService
294
- {
295
- private UserRepository $repository;
296
- private CacheService $cache;
297
-
298
- public function __construct(
299
- UserRepository $repository,
300
- CacheService $cache
301
- ) {
302
- $this->repository = $repository;
303
- $this->cache = $cache;
304
- }
305
- }
306
-
307
- // ✅ Good: PHP 8+ property promotion
308
- class UserService
309
- {
310
- public function __construct(
311
- private readonly UserRepository $repository,
312
- private readonly CacheService $cache,
313
- ) {}
314
- }
315
- ```
316
-
317
- ### Missing Readonly Properties
318
-
319
- ```php
320
- // ❌ Bad: Mutable when shouldn't be
321
- class UserDTO
322
- {
323
- public function __construct(
324
- public string $name,
325
- public string $email,
326
- ) {}
327
- }
328
-
329
- // ✅ Good: Readonly for immutable data
330
- class UserDTO
331
- {
332
- public function __construct(
333
- public readonly string $name,
334
- public readonly string $email,
335
- ) {}
336
- }
337
- ```
338
-
339
- ### Not Using Match Expression
340
-
341
- ```php
342
- // ❌ Bad: Switch statement
343
- switch ($status) {
344
- case 'pending':
345
- return 'yellow';
346
- case 'approved':
347
- return 'green';
348
- case 'rejected':
349
- return 'red';
350
- default:
351
- return 'gray';
352
- }
353
-
354
- // ✅ Good: Match expression
355
- return match($status) {
356
- 'pending' => 'yellow',
357
- 'approved' => 'green',
358
- 'rejected' => 'red',
359
- default => 'gray',
360
- };
361
- ```
362
-
363
- ### Missing Named Arguments
364
-
365
- ```php
366
- // ❌ Bad: Positional args unclear
367
- $user = new User('John', 'john@example.com', true, false, null);
368
-
369
- // ✅ Good: Named arguments for clarity
370
- $user = new User(
371
- name: 'John',
372
- email: 'john@example.com',
373
- isAdmin: true,
374
- isVerified: false,
375
- avatarUrl: null,
376
- );
377
- ```
378
-
379
- ### Missing #[Override] Attribute
380
-
381
- ```php
382
- // ❌ Bad: No override indication
383
- class CustomException extends Exception
384
- {
385
- public function getMessage(): string
386
- {
387
- return 'Custom: ' . parent::getMessage();
388
- }
389
- }
390
-
391
- // ✅ Good: PHP 8.3+ Override attribute
392
- class CustomException extends Exception
393
- {
394
- #[\Override]
395
- public function getMessage(): string
396
- {
397
- return 'Custom: ' . parent::getMessage();
398
- }
399
- }
400
- ```
401
-
402
- ### Implicit Nullable (Deprecated)
403
-
404
- ```php
405
- // ❌ Bad: Implicit nullable (deprecated in 8.4)
406
- function process(string $value = null) {}
407
-
408
- // ✅ Good: Explicit nullable
409
- function process(?string $value = null) {}
410
- ```
411
-
412
- ---
413
-
414
- ## Laravel 12 Specific
415
-
416
- ### Missing Enums for Constants
417
-
418
- ```php
419
- // ❌ Bad: String constants
420
- class Order
421
- {
422
- const STATUS_PENDING = 'pending';
423
- const STATUS_COMPLETED = 'completed';
424
- }
425
-
426
- // ✅ Good: Backed Enum
427
- enum OrderStatus: string
428
- {
429
- case Pending = 'pending';
430
- case Completed = 'completed';
431
- }
432
-
433
- // Usage in Model
434
- protected $casts = [
435
- 'status' => OrderStatus::class,
436
- ];
437
- ```
438
-
439
- ### Missing API Resource
440
-
441
- ```php
442
- // ❌ Bad: Direct model/array return
443
- public function show(User $user)
444
- {
445
- return response()->json($user);
446
- }
447
-
448
- // ✅ Good: API Resource
449
- public function show(User $user)
450
- {
451
- return new UserResource($user);
452
- }
453
- ```
454
-
455
- ### Invokable Controllers
456
-
457
- ```php
458
- // ❌ Bad: Single method controller
459
- class ShowDashboardController extends Controller
460
- {
461
- public function index()
462
- {
463
- return view('dashboard');
464
- }
465
- }
466
-
467
- // ✅ Good: Invokable controller
468
- class ShowDashboardController extends Controller
469
- {
470
- public function __invoke()
471
- {
472
- return view('dashboard');
473
- }
474
- }
475
-
476
- // Route
477
- Route::get('/dashboard', ShowDashboardController::class);
478
- ```
479
-
480
- ### Missing Return Types
481
-
482
- ```php
483
- // ❌ Bad: No return type
484
- public function getUsers()
485
- {
486
- return User::all();
487
- }
488
-
489
- // ✅ Good: Explicit return type
490
- public function getUsers(): Collection
491
- {
492
- return User::all();
493
- }
494
- ```
495
-
496
- ---
497
-
498
- ## Blade Template Issues
499
-
500
- ### Inefficient Loops
501
-
502
- ```php
503
- // ❌ Bad: Query in loop
504
- @foreach(Category::all() as $category)
505
- {{ $category->name }}
506
- @endforeach
507
-
508
- // ✅ Good: Pass from controller
509
- // Controller: return view('page', ['categories' => Category::all()]);
510
- @foreach($categories as $category)
511
- {{ $category->name }}
512
- @endforeach
513
- ```
514
-
515
- ### Missing @once Directive
516
-
517
- ```php
518
- // ❌ Bad: Repeated scripts in loop
519
- @foreach($items as $item)
520
- <script src="/js/item-handler.js"></script>
521
- @endforeach
522
-
523
- // ✅ Good: Include once
524
- @foreach($items as $item)
525
- @once
526
- <script src="/js/item-handler.js"></script>
527
- @endonce
528
- @endforeach
529
- ```
530
-
531
- ---
532
-
533
- ## Migration Issues
534
-
535
- ### Missing Indexes
536
-
537
- ```php
538
- // ❌ Bad: Foreign key without index
539
- $table->foreignId('user_id');
540
-
541
- // ✅ Good: Constrained adds index
542
- $table->foreignId('user_id')->constrained();
543
-
544
- // ❌ Bad: Frequently queried column
545
- $table->string('status');
546
-
547
- // ✅ Good: Add index
548
- $table->string('status')->index();
549
- ```
550
-
551
- ### Missing Soft Deletes Index
552
-
553
- ```php
554
- // ❌ Bad: Soft deletes without index
555
- $table->softDeletes();
556
-
557
- // ✅ Good: Index for deleted_at
558
- $table->softDeletes();
559
- $table->index('deleted_at');
560
- ```
561
-
562
- ---
563
-
564
- ## Severity Classification
565
-
566
- | Severity | Emoji | Laravel-Specific Criteria |
567
- | ------------ | ----- | ------------------------------------------------------------- |
568
- | Critical | 🔴 | Security vulnerabilities, mass assignment, SQL injection, XSS |
569
- | Warning | 🟠 | N+1 queries, missing validation, fat controllers |
570
- | Optimization | 🟡 | Missing eager loading, inefficient queries, no caching |
571
- | Quality | 🔵 | PHP 8.4 features, Laravel conventions, return types |