tribunal-kit 3.0.0 → 4.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 (233) hide show
  1. package/.agent/ARCHITECTURE.md +99 -99
  2. package/.agent/GEMINI.md +52 -52
  3. package/.agent/agents/accessibility-reviewer.md +187 -220
  4. package/.agent/agents/ai-code-reviewer.md +199 -233
  5. package/.agent/agents/backend-specialist.md +215 -238
  6. package/.agent/agents/code-archaeologist.md +161 -181
  7. package/.agent/agents/database-architect.md +184 -207
  8. package/.agent/agents/debugger.md +191 -218
  9. package/.agent/agents/dependency-reviewer.md +103 -136
  10. package/.agent/agents/devops-engineer.md +218 -238
  11. package/.agent/agents/documentation-writer.md +201 -221
  12. package/.agent/agents/explorer-agent.md +160 -180
  13. package/.agent/agents/frontend-reviewer.md +160 -194
  14. package/.agent/agents/frontend-specialist.md +248 -237
  15. package/.agent/agents/game-developer.md +48 -52
  16. package/.agent/agents/logic-reviewer.md +116 -149
  17. package/.agent/agents/mobile-developer.md +200 -223
  18. package/.agent/agents/mobile-reviewer.md +162 -195
  19. package/.agent/agents/orchestrator.md +181 -211
  20. package/.agent/agents/penetration-tester.md +157 -174
  21. package/.agent/agents/performance-optimizer.md +183 -203
  22. package/.agent/agents/performance-reviewer.md +178 -211
  23. package/.agent/agents/precedence-reviewer.md +213 -0
  24. package/.agent/agents/product-manager.md +142 -162
  25. package/.agent/agents/product-owner.md +6 -25
  26. package/.agent/agents/project-planner.md +142 -162
  27. package/.agent/agents/qa-automation-engineer.md +225 -242
  28. package/.agent/agents/security-auditor.md +174 -194
  29. package/.agent/agents/seo-specialist.md +193 -213
  30. package/.agent/agents/sql-reviewer.md +161 -194
  31. package/.agent/agents/supervisor-agent.md +184 -203
  32. package/.agent/agents/swarm-worker-contracts.md +17 -17
  33. package/.agent/agents/swarm-worker-registry.md +46 -46
  34. package/.agent/agents/test-coverage-reviewer.md +160 -193
  35. package/.agent/agents/test-engineer.md +0 -21
  36. package/.agent/agents/type-safety-reviewer.md +175 -208
  37. package/.agent/patterns/generator.md +9 -9
  38. package/.agent/patterns/inversion.md +12 -12
  39. package/.agent/patterns/pipeline.md +9 -9
  40. package/.agent/patterns/reviewer.md +13 -13
  41. package/.agent/patterns/tool-wrapper.md +9 -9
  42. package/.agent/rules/GEMINI.md +63 -63
  43. package/.agent/scripts/append_flow.js +72 -0
  44. package/.agent/scripts/case_law_manager.py +525 -0
  45. package/.agent/scripts/compress_skills.py +167 -0
  46. package/.agent/scripts/consolidate_skills.py +173 -0
  47. package/.agent/scripts/deep_compress.py +202 -0
  48. package/.agent/scripts/minify_context.py +80 -0
  49. package/.agent/scripts/security_scan.py +1 -1
  50. package/.agent/scripts/skill_evolution.py +563 -0
  51. package/.agent/scripts/strip_tribunal.py +41 -0
  52. package/.agent/skills/agent-organizer/SKILL.md +100 -126
  53. package/.agent/skills/agentic-patterns/SKILL.md +0 -70
  54. package/.agent/skills/ai-prompt-injection-defense/SKILL.md +134 -160
  55. package/.agent/skills/api-patterns/SKILL.md +123 -215
  56. package/.agent/skills/api-security-auditor/SKILL.md +143 -177
  57. package/.agent/skills/app-builder/SKILL.md +334 -50
  58. package/.agent/skills/app-builder/templates/SKILL.md +13 -15
  59. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +16 -16
  60. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +22 -22
  61. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +18 -18
  62. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +20 -20
  63. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +17 -17
  64. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +18 -18
  65. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +21 -21
  66. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +19 -19
  67. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +26 -26
  68. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +26 -26
  69. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +19 -19
  70. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +18 -18
  71. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +20 -20
  72. package/.agent/skills/appflow-wireframe/SKILL.md +95 -121
  73. package/.agent/skills/architecture/SKILL.md +169 -331
  74. package/.agent/skills/authentication-best-practices/SKILL.md +139 -173
  75. package/.agent/skills/bash-linux/SKILL.md +129 -154
  76. package/.agent/skills/behavioral-modes/SKILL.md +8 -69
  77. package/.agent/skills/brainstorming/SKILL.md +436 -104
  78. package/.agent/skills/building-native-ui/SKILL.md +152 -174
  79. package/.agent/skills/clean-code/SKILL.md +331 -360
  80. package/.agent/skills/code-review-checklist/SKILL.md +0 -62
  81. package/.agent/skills/config-validator/SKILL.md +115 -141
  82. package/.agent/skills/csharp-developer/SKILL.md +468 -528
  83. package/.agent/skills/database-design/SKILL.md +104 -369
  84. package/.agent/skills/deployment-procedures/SKILL.md +119 -145
  85. package/.agent/skills/devops-engineer/SKILL.md +295 -332
  86. package/.agent/skills/devops-incident-responder/SKILL.md +87 -113
  87. package/.agent/skills/doc.md +5 -5
  88. package/.agent/skills/documentation-templates/SKILL.md +27 -63
  89. package/.agent/skills/edge-computing/SKILL.md +131 -157
  90. package/.agent/skills/extract-design-system/SKILL.md +108 -134
  91. package/.agent/skills/framer-motion-expert/SKILL.md +111 -855
  92. package/.agent/skills/frontend-design/SKILL.md +151 -499
  93. package/.agent/skills/game-design-expert/SKILL.md +79 -105
  94. package/.agent/skills/game-engineering-expert/SKILL.md +96 -122
  95. package/.agent/skills/geo-fundamentals/SKILL.md +97 -124
  96. package/.agent/skills/github-operations/SKILL.md +279 -314
  97. package/.agent/skills/gsap-expert/SKILL.md +119 -826
  98. package/.agent/skills/i18n-localization/SKILL.md +113 -138
  99. package/.agent/skills/intelligent-routing/SKILL.md +167 -127
  100. package/.agent/skills/lint-and-validate/SKILL.md +16 -52
  101. package/.agent/skills/llm-engineering/SKILL.md +344 -357
  102. package/.agent/skills/local-first/SKILL.md +128 -154
  103. package/.agent/skills/mcp-builder/SKILL.md +92 -118
  104. package/.agent/skills/mobile-design/SKILL.md +213 -219
  105. package/.agent/skills/motion-engineering/SKILL.md +184 -0
  106. package/.agent/skills/nextjs-react-expert/SKILL.md +99 -698
  107. package/.agent/skills/nodejs-best-practices/SKILL.md +498 -559
  108. package/.agent/skills/observability/SKILL.md +293 -330
  109. package/.agent/skills/parallel-agents/SKILL.md +96 -122
  110. package/.agent/skills/performance-profiling/SKILL.md +217 -254
  111. package/.agent/skills/plan-writing/SKILL.md +92 -118
  112. package/.agent/skills/platform-engineer/SKILL.md +97 -123
  113. package/.agent/skills/playwright-best-practices/SKILL.md +137 -162
  114. package/.agent/skills/powershell-windows/SKILL.md +112 -146
  115. package/.agent/skills/project-idioms/SKILL.md +87 -0
  116. package/.agent/skills/python-patterns/SKILL.md +15 -35
  117. package/.agent/skills/python-pro/SKILL.md +148 -754
  118. package/.agent/skills/react-specialist/SKILL.md +123 -827
  119. package/.agent/skills/readme-builder/SKILL.md +23 -85
  120. package/.agent/skills/realtime-patterns/SKILL.md +269 -304
  121. package/.agent/skills/red-team-tactics/SKILL.md +18 -51
  122. package/.agent/skills/rust-pro/SKILL.md +623 -701
  123. package/.agent/skills/seo-fundamentals/SKILL.md +129 -154
  124. package/.agent/skills/server-management/SKILL.md +164 -190
  125. package/.agent/skills/shadcn-ui-expert/SKILL.md +181 -206
  126. package/.agent/skills/skill-creator/SKILL.md +24 -56
  127. package/.agent/skills/sql-pro/SKILL.md +579 -633
  128. package/.agent/skills/supabase-postgres-best-practices/SKILL.md +35 -66
  129. package/.agent/skills/swiftui-expert/SKILL.md +151 -176
  130. package/.agent/skills/systematic-debugging/SKILL.md +92 -118
  131. package/.agent/skills/tailwind-patterns/SKILL.md +516 -576
  132. package/.agent/skills/tdd-workflow/SKILL.md +111 -137
  133. package/.agent/skills/test-result-analyzer/SKILL.md +33 -73
  134. package/.agent/skills/testing-patterns/SKILL.md +512 -573
  135. package/.agent/skills/trend-researcher/SKILL.md +30 -71
  136. package/.agent/skills/ui-ux-pro-max/SKILL.md +8 -41
  137. package/.agent/skills/ui-ux-researcher/SKILL.md +51 -91
  138. package/.agent/skills/vue-expert/SKILL.md +127 -866
  139. package/.agent/skills/vulnerability-scanner/SKILL.md +354 -269
  140. package/.agent/skills/web-accessibility-auditor/SKILL.md +168 -193
  141. package/.agent/skills/web-design-guidelines/SKILL.md +25 -61
  142. package/.agent/skills/webapp-testing/SKILL.md +119 -145
  143. package/.agent/skills/whimsy-injector/SKILL.md +58 -132
  144. package/.agent/skills/workflow-optimizer/SKILL.md +28 -68
  145. package/.agent/workflows/api-tester.md +151 -151
  146. package/.agent/workflows/audit.md +127 -138
  147. package/.agent/workflows/brainstorm.md +110 -110
  148. package/.agent/workflows/changelog.md +112 -112
  149. package/.agent/workflows/create.md +124 -124
  150. package/.agent/workflows/debug.md +165 -189
  151. package/.agent/workflows/deploy.md +180 -189
  152. package/.agent/workflows/enhance.md +128 -151
  153. package/.agent/workflows/fix.md +114 -135
  154. package/.agent/workflows/generate.md +13 -4
  155. package/.agent/workflows/migrate.md +160 -160
  156. package/.agent/workflows/orchestrate.md +168 -168
  157. package/.agent/workflows/performance-benchmarker.md +114 -123
  158. package/.agent/workflows/plan.md +173 -173
  159. package/.agent/workflows/preview.md +80 -80
  160. package/.agent/workflows/refactor.md +161 -183
  161. package/.agent/workflows/review-ai.md +101 -129
  162. package/.agent/workflows/review.md +116 -116
  163. package/.agent/workflows/session.md +94 -94
  164. package/.agent/workflows/status.md +79 -79
  165. package/.agent/workflows/strengthen-skills.md +138 -139
  166. package/.agent/workflows/swarm.md +179 -179
  167. package/.agent/workflows/test.md +189 -211
  168. package/.agent/workflows/tribunal-backend.md +94 -113
  169. package/.agent/workflows/tribunal-database.md +95 -115
  170. package/.agent/workflows/tribunal-frontend.md +96 -118
  171. package/.agent/workflows/tribunal-full.md +93 -133
  172. package/.agent/workflows/tribunal-mobile.md +95 -119
  173. package/.agent/workflows/tribunal-performance.md +110 -133
  174. package/.agent/workflows/ui-ux-pro-max.md +122 -143
  175. package/README.md +30 -1
  176. package/bin/tribunal-kit.js +175 -12
  177. package/package.json +25 -4
  178. package/.agent/skills/api-patterns/api-style.md +0 -42
  179. package/.agent/skills/api-patterns/auth.md +0 -24
  180. package/.agent/skills/api-patterns/documentation.md +0 -26
  181. package/.agent/skills/api-patterns/graphql.md +0 -41
  182. package/.agent/skills/api-patterns/rate-limiting.md +0 -31
  183. package/.agent/skills/api-patterns/response.md +0 -37
  184. package/.agent/skills/api-patterns/rest.md +0 -40
  185. package/.agent/skills/api-patterns/security-testing.md +0 -122
  186. package/.agent/skills/api-patterns/trpc.md +0 -41
  187. package/.agent/skills/api-patterns/versioning.md +0 -22
  188. package/.agent/skills/app-builder/agent-coordination.md +0 -71
  189. package/.agent/skills/app-builder/feature-building.md +0 -53
  190. package/.agent/skills/app-builder/project-detection.md +0 -34
  191. package/.agent/skills/app-builder/scaffolding.md +0 -118
  192. package/.agent/skills/app-builder/tech-stack.md +0 -40
  193. package/.agent/skills/architecture/context-discovery.md +0 -43
  194. package/.agent/skills/architecture/examples.md +0 -94
  195. package/.agent/skills/architecture/pattern-selection.md +0 -68
  196. package/.agent/skills/architecture/patterns-reference.md +0 -50
  197. package/.agent/skills/architecture/trade-off-analysis.md +0 -77
  198. package/.agent/skills/brainstorming/dynamic-questioning.md +0 -360
  199. package/.agent/skills/database-design/database-selection.md +0 -43
  200. package/.agent/skills/database-design/indexing.md +0 -39
  201. package/.agent/skills/database-design/migrations.md +0 -48
  202. package/.agent/skills/database-design/optimization.md +0 -36
  203. package/.agent/skills/database-design/orm-selection.md +0 -30
  204. package/.agent/skills/database-design/schema-design.md +0 -56
  205. package/.agent/skills/frontend-design/animation-guide.md +0 -331
  206. package/.agent/skills/frontend-design/color-system.md +0 -329
  207. package/.agent/skills/frontend-design/decision-trees.md +0 -418
  208. package/.agent/skills/frontend-design/motion-graphics.md +0 -306
  209. package/.agent/skills/frontend-design/typography-system.md +0 -363
  210. package/.agent/skills/frontend-design/ux-psychology.md +0 -1116
  211. package/.agent/skills/frontend-design/visual-effects.md +0 -383
  212. package/.agent/skills/intelligent-routing/router-manifest.md +0 -65
  213. package/.agent/skills/mobile-design/decision-trees.md +0 -516
  214. package/.agent/skills/mobile-design/mobile-backend.md +0 -491
  215. package/.agent/skills/mobile-design/mobile-color-system.md +0 -420
  216. package/.agent/skills/mobile-design/mobile-debugging.md +0 -122
  217. package/.agent/skills/mobile-design/mobile-design-thinking.md +0 -357
  218. package/.agent/skills/mobile-design/mobile-navigation.md +0 -458
  219. package/.agent/skills/mobile-design/mobile-performance.md +0 -767
  220. package/.agent/skills/mobile-design/mobile-testing.md +0 -356
  221. package/.agent/skills/mobile-design/mobile-typography.md +0 -433
  222. package/.agent/skills/mobile-design/platform-android.md +0 -666
  223. package/.agent/skills/mobile-design/platform-ios.md +0 -561
  224. package/.agent/skills/mobile-design/touch-psychology.md +0 -537
  225. package/.agent/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +0 -312
  226. package/.agent/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +0 -240
  227. package/.agent/skills/nextjs-react-expert/3-server-server-side-performance.md +0 -490
  228. package/.agent/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +0 -264
  229. package/.agent/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +0 -581
  230. package/.agent/skills/nextjs-react-expert/6-rendering-rendering-performance.md +0 -432
  231. package/.agent/skills/nextjs-react-expert/7-js-javascript-performance.md +0 -684
  232. package/.agent/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +0 -150
  233. package/.agent/skills/vulnerability-scanner/checklists.md +0 -121
@@ -1,360 +1,331 @@
1
- ---
2
- name: clean-code
3
- description: Clean code mastery. Naming conventions, function design, DRY vs WET, SOLID principles with code examples, refactoring patterns, code smells detection, error handling philosophy, comments that add value, and the art of simplicity. Use when reviewing code quality, refactoring, or establishing coding standards.
4
- allowed-tools: Read, Write, Edit, Glob, Grep
5
- version: 2.0.0
6
- last-updated: 2026-04-01
7
- applies-to-model: gemini-2.5-pro, claude-3-7-sonnet
8
- ---
9
-
10
- # Clean Code The Art of Readable Software
11
-
12
- > Clean code reads like well-written prose. If you need a comment to explain what it does, rename the function.
13
- > The ratio of time spent reading code to writing code is 10:1. Optimize for the reader.
14
-
15
- ---
16
-
17
- ## Naming
18
-
19
- ### Variables & Functions
20
-
21
- ```typescript
22
- // ❌ BAD: Cryptic, abbreviated, meaningless
23
- const d = new Date();
24
- const u = getU();
25
- const flag = true;
26
- function proc(x: number): number { return x * 1.08; }
27
-
28
- // GOOD: Self-documenting, reveals intent
29
- const registrationDate = new Date();
30
- const currentUser = getCurrentUser();
31
- const isEligibleForDiscount = true;
32
- function addSalesTax(price: number): number { return price * 1.08; }
33
- ```
34
-
35
- ### Booleans
36
-
37
- ```typescript
38
- // ❌ BAD ✅ GOOD
39
- const active = true; const isActive = true;
40
- const admin = false; const hasAdminRole = false;
41
- const loading = true; const isLoading = true;
42
- const open = false; const isModalOpen = false;
43
- const valid = true; const canSubmit = true;
44
-
45
- // Boolean function names start with is/has/can/should
46
- function isExpired(token: Token): boolean {}
47
- function hasPermission(user: User, action: string): boolean {}
48
- function canRetry(attempt: number): boolean {}
49
- function shouldNotify(event: Event): boolean {}
50
- ```
51
-
52
- ### Constants & Enums
53
-
54
- ```typescript
55
- // ❌ BAD: Magic numbers and strings
56
- if (user.role === 3) { ... }
57
- if (retries > 5) { ... }
58
- const delay = 86400000;
59
-
60
- // GOOD: Named constants with meaning
61
- const MAX_RETRY_ATTEMPTS = 5;
62
- const ONE_DAY_MS = 24 * 60 * 60 * 1000;
63
-
64
- enum UserRole {
65
- VIEWER = "viewer",
66
- EDITOR = "editor",
67
- ADMIN = "admin",
68
- }
69
-
70
- if (user.role === UserRole.ADMIN) { ... }
71
- if (retries > MAX_RETRY_ATTEMPTS) { ... }
72
- ```
73
-
74
- ---
75
-
76
- ## Function Design
77
-
78
- ### Small, Single-Purpose Functions
79
-
80
- ```typescript
81
- // BAD: Does 5 things in one function
82
- async function processOrder(order: Order) {
83
- // validate
84
- if (!order.items.length) throw new Error("Empty");
85
- if (order.total < 0) throw new Error("Negative");
86
- // calculate
87
- const subtotal = order.items.reduce((sum, i) => sum + i.price * i.qty, 0);
88
- const tax = subtotal * 0.08;
89
- const total = subtotal + tax;
90
- // save
91
- await db.orders.insert({ ...order, total });
92
- // notify
93
- await emailService.send(order.userId, "Order placed");
94
- // log
95
- logger.info("Order processed", { orderId: order.id });
96
- }
97
-
98
- // GOOD: Each function does one thing
99
- async function processOrder(order: Order): Promise<ProcessedOrder> {
100
- validateOrder(order);
101
- const totals = calculateTotals(order.items);
102
- const savedOrder = await saveOrder(order, totals);
103
- await notifyCustomer(savedOrder);
104
- return savedOrder;
105
- }
106
-
107
- function validateOrder(order: Order): void {
108
- if (!order.items.length) throw new ValidationError("Order cannot be empty");
109
- if (order.total < 0) throw new ValidationError("Total cannot be negative");
110
- }
111
-
112
- function calculateTotals(items: OrderItem[]): OrderTotals {
113
- const subtotal = items.reduce((sum, item) => sum + item.price * item.quantity, 0);
114
- const tax = subtotal * TAX_RATE;
115
- return { subtotal, tax, total: subtotal + tax };
116
- }
117
- ```
118
-
119
- ### Parameter Rules
120
-
121
- ```typescript
122
- // ❌ BAD: Too many parameters
123
- function createUser(
124
- name: string, email: string, role: string,
125
- isActive: boolean, avatar: string, bio: string
126
- ) { ... }
127
-
128
- // ✅ GOOD: Use an object for 3+ parameters
129
- interface CreateUserInput {
130
- name: string;
131
- email: string;
132
- role?: UserRole;
133
- isActive?: boolean;
134
- avatar?: string;
135
- bio?: string;
136
- }
137
-
138
- function createUser(input: CreateUserInput): User { ... }
139
-
140
- // ❌ BAD: Boolean parameter (caller can't read intent)
141
- setVisible(true);
142
-
143
- // GOOD: Named method instead
144
- show();
145
- hide();
146
- ```
147
-
148
- ---
149
-
150
- ## SOLID Principles (With Code)
151
-
152
- ### S — Single Responsibility
153
-
154
- ```typescript
155
- // BAD: UserService does everything
156
- class UserService {
157
- createUser() { ... }
158
- sendEmail() { ... }
159
- generateReport() { ... }
160
- uploadAvatar() { ... }
161
- }
162
-
163
- // GOOD: Separate concerns
164
- class UserService { createUser() { ... } }
165
- class EmailService { sendWelcomeEmail() { ... } }
166
- class ReportService { generateUserReport() { ... } }
167
- class AvatarService { upload() { ... } }
168
- ```
169
-
170
- ### O Open/Closed
171
-
172
- ```typescript
173
- // ❌ BAD: Adding a new type requires modifying existing code
174
- function calculateDiscount(type: string, amount: number): number {
175
- if (type === "student") return amount * 0.20;
176
- if (type === "veteran") return amount * 0.15;
177
- if (type === "senior") return amount * 0.10; // must modify for every new type
178
- return 0;
179
- }
180
-
181
- // GOOD: Open for extension, closed for modification
182
- interface DiscountStrategy {
183
- calculate(amount: number): number;
184
- }
185
-
186
- class StudentDiscount implements DiscountStrategy {
187
- calculate(amount: number) { return amount * 0.20; }
188
- }
189
-
190
- class VeteranDiscount implements DiscountStrategy {
191
- calculate(amount: number) { return amount * 0.15; }
192
- }
193
-
194
- // New types = new class, no existing code changes
195
- class EmployeeDiscount implements DiscountStrategy {
196
- calculate(amount: number) { return amount * 0.25; }
197
- }
198
- ```
199
-
200
- ### D Dependency Inversion
201
-
202
- ```typescript
203
- // ❌ BAD: High-level module depends on low-level concrete
204
- class OrderService {
205
- private db = new MySQLDatabase(); // coupled to MySQL
206
- private mailer = new SendGridMailer(); // coupled to SendGrid
207
- }
208
-
209
- // GOOD: Depend on abstractions (interfaces)
210
- interface Database { save(data: unknown): Promise<void>; }
211
- interface Mailer { send(to: string, body: string): Promise<void>; }
212
-
213
- class OrderService {
214
- constructor(
215
- private db: Database, // can be MySQL, Postgres, in-memory
216
- private mailer: Mailer, // can be SendGrid, SES, mock
217
- ) {}
218
- }
219
- ```
220
-
221
- ---
222
-
223
- ## Error Handling
224
-
225
- ```typescript
226
- // ❌ BAD: Swallowing errors
227
- try {
228
- await saveUser(user);
229
- } catch (e) {
230
- // silence
231
- }
232
-
233
- // ❌ BAD: Generic catch-all
234
- try {
235
- await processPayment(order);
236
- } catch (e) {
237
- console.log("Something went wrong");
238
- }
239
-
240
- // ✅ GOOD: Handle specific errors, propagate unexpected
241
- try {
242
- await processPayment(order);
243
- } catch (error) {
244
- if (error instanceof InsufficientFundsError) {
245
- return { success: false, message: "Insufficient funds" };
246
- }
247
- if (error instanceof PaymentGatewayError) {
248
- logger.warn("Payment gateway unavailable, queuing for retry", { orderId: order.id });
249
- await retryQueue.add(order);
250
- return { success: false, message: "Payment processing delayed" };
251
- }
252
- throw error; // unexpected error — let it propagate
253
- }
254
- ```
255
-
256
- ---
257
-
258
- ## Comments
259
-
260
- ```typescript
261
- // ❌ BAD: Comments that restate the code
262
- // Increment i by 1
263
- i++;
264
-
265
- // Set the user's name
266
- user.name = newName;
267
-
268
- // Check if user is active
269
- if (user.isActive) { ... }
270
-
271
- // GOOD: Comments that explain WHY, not WHAT
272
- // Tax exemption expires after 365 days per IRS Publication 334
273
- const isExempt = daysSinceRegistration < 365;
274
-
275
- // Using binary search here because the list is pre-sorted and
276
- // can contain 100K+ items. Linear search caused P95 > 2s.
277
- const index = binarySearch(sortedItems, target);
278
-
279
- // Retry 3 times because the payment gateway has transient 503s
280
- // during their daily maintenance window (02:00-02:15 UTC)
281
- const result = await withRetry(() => chargeCard(amount), { maxRetries: 3 });
282
- ```
283
-
284
- ---
285
-
286
- ## Code Smells Refactoring
287
-
288
- ```
289
- Smell → Refactoring
290
- ───────────────────────────────────────
291
- Long function (>30 lines) Extract method
292
- Deep nesting (>3 levels) → Early return / guard clauses
293
- Duplicate code → Extract shared function
294
- Magic numbers Named constants
295
- Boolean parameters → Separate methods or options object
296
- God class (>300 lines) Split into focused classes
297
- Feature envy Move method to appropriate class
298
- Primitive obsession Value objects (Email, Money, UserId)
299
- Long parameter list Parameter object
300
- ```
301
-
302
- ```typescript
303
- // Deep nesting Early return
304
- // BAD
305
- function processUser(user: User) {
306
- if (user) {
307
- if (user.isActive) {
308
- if (user.hasPermission("edit")) {
309
- // actual logic buried 3 levels deep
310
- doStuff();
311
- }
312
- }
313
- }
314
- }
315
-
316
- // ✅ GOOD: Guard clauses — fail fast, keep happy path unindented
317
- function processUser(user: User) {
318
- if (!user) return;
319
- if (!user.isActive) return;
320
- if (!user.hasPermission("edit")) return;
321
-
322
- doStuff(); // happy path at top level
323
- }
324
- ```
325
-
326
- ---
327
-
328
- ## 🤖 LLM-Specific Traps
329
-
330
- 1. **Comments That Restate Code:** `// Set name to value` above `name = value` adds zero information.
331
- 2. **Abbreviations Without Context:** `usr`, `mgr`, `proc`, `calc` — use full words.
332
- 3. **Giant Functions:** If a function is >30 lines, it's doing too many things. Split it.
333
- 4. **Boolean Parameters:** `setVisible(true)` is unreadable. Use named methods: `show()`, `hide()`.
334
- 5. **Magic Numbers:** `if (retries > 5)` — what's 5? Use `MAX_RETRY_ATTEMPTS`.
335
- 6. **Swallowing Errors:** `catch (e) {}` — silent failures are worse than crashes.
336
- 7. **Generic Error Messages:** `"Something went wrong"` helps no one. Be specific.
337
- 8. **Over-Commenting Obvious Code:** Comments should explain *why*, not *what*.
338
- 9. **Deep Nesting:** 3+ levels of nesting → use guard clauses and early returns.
339
- 10. **Premature Abstraction:** Don't create interfaces/abstractions until you have 2+ implementations.
340
-
341
- ---
342
-
343
- ## 🏛️ Tribunal Integration
344
-
345
- **Slash command: `/review`**
346
-
347
- ### ✅ Pre-Flight Self-Audit
348
-
349
- ```
350
- ✅ Are all names self-documenting (no abbreviations)?
351
- ✅ Are all booleans prefixed with is/has/can/should?
352
- ✅ Are functions <30 lines and single-purpose?
353
- ✅ Are magic numbers replaced with named constants?
354
- ✅ Do comments explain WHY, not WHAT?
355
- ✅ Are errors handled specifically (not swallowed or generic)?
356
- ✅ Is nesting ≤3 levels (using guard clauses)?
357
- ✅ Are there no boolean parameters?
358
- ✅ Do functions have ≤3 parameters (or use an object)?
359
- ✅ Is there no duplicated logic?
360
- ```
1
+ ---
2
+ name: clean-code
3
+ description: Clean code mastery. Naming conventions, function design, DRY vs WET, SOLID principles with code examples, refactoring patterns, code smells detection, error handling philosophy, comments that add value, and the art of simplicity. Use when reviewing code quality, refactoring, or establishing coding standards.
4
+ allowed-tools: Read, Write, Edit, Glob, Grep
5
+ version: 2.0.0
6
+ last-updated: 2026-04-01
7
+ applies-to-model: gemini-2.5-pro, claude-3-7-sonnet
8
+ ---
9
+
10
+ ## Hallucination Traps (Read First)
11
+ - ❌ Over-abstracting code that is used in only one place -> ✅ Don't DRY single-use code; premature abstraction is worse than duplication
12
+ - Adding comments that restate what the code does -> Comments explain WHY, not WHAT; the code explains what
13
+ - Creating utility functions for trivial one-liners -> Inline is clearer when the operation is self-documenting
14
+
15
+ ---
16
+
17
+
18
+ # Clean Code — The Art of Readable Software
19
+
20
+ ---
21
+
22
+ ## Naming
23
+
24
+ ### Variables & Functions
25
+
26
+ ```typescript
27
+ // ❌ BAD: Cryptic, abbreviated, meaningless
28
+ const d = new Date();
29
+ const u = getU();
30
+ const flag = true;
31
+ function proc(x: number): number { return x * 1.08; }
32
+
33
+ // ✅ GOOD: Self-documenting, reveals intent
34
+ const registrationDate = new Date();
35
+ const currentUser = getCurrentUser();
36
+ const isEligibleForDiscount = true;
37
+ function addSalesTax(price: number): number { return price * 1.08; }
38
+ ```
39
+
40
+ ### Booleans
41
+
42
+ ```typescript
43
+ // BAD ✅ GOOD
44
+ const active = true; const isActive = true;
45
+ const admin = false; const hasAdminRole = false;
46
+ const loading = true; const isLoading = true;
47
+ const open = false; const isModalOpen = false;
48
+ const valid = true; const canSubmit = true;
49
+
50
+ // Boolean function names start with is/has/can/should
51
+ function isExpired(token: Token): boolean {}
52
+ function hasPermission(user: User, action: string): boolean {}
53
+ function canRetry(attempt: number): boolean {}
54
+ function shouldNotify(event: Event): boolean {}
55
+ ```
56
+
57
+ ### Constants & Enums
58
+
59
+ ```typescript
60
+ // BAD: Magic numbers and strings
61
+ if (user.role === 3) { ... }
62
+ if (retries > 5) { ... }
63
+ const delay = 86400000;
64
+
65
+ // GOOD: Named constants with meaning
66
+ const MAX_RETRY_ATTEMPTS = 5;
67
+ const ONE_DAY_MS = 24 * 60 * 60 * 1000;
68
+
69
+ enum UserRole {
70
+ VIEWER = "viewer",
71
+ EDITOR = "editor",
72
+ ADMIN = "admin",
73
+ }
74
+
75
+ if (user.role === UserRole.ADMIN) { ... }
76
+ if (retries > MAX_RETRY_ATTEMPTS) { ... }
77
+ ```
78
+
79
+ ---
80
+
81
+ ## Function Design
82
+
83
+ ### Small, Single-Purpose Functions
84
+
85
+ ```typescript
86
+ // ❌ BAD: Does 5 things in one function
87
+ async function processOrder(order: Order) {
88
+ // validate
89
+ if (!order.items.length) throw new Error("Empty");
90
+ if (order.total < 0) throw new Error("Negative");
91
+ // calculate
92
+ const subtotal = order.items.reduce((sum, i) => sum + i.price * i.qty, 0);
93
+ const tax = subtotal * 0.08;
94
+ const total = subtotal + tax;
95
+ // save
96
+ await db.orders.insert({ ...order, total });
97
+ // notify
98
+ await emailService.send(order.userId, "Order placed");
99
+ // log
100
+ logger.info("Order processed", { orderId: order.id });
101
+ }
102
+
103
+ // ✅ GOOD: Each function does one thing
104
+ async function processOrder(order: Order): Promise<ProcessedOrder> {
105
+ validateOrder(order);
106
+ const totals = calculateTotals(order.items);
107
+ const savedOrder = await saveOrder(order, totals);
108
+ await notifyCustomer(savedOrder);
109
+ return savedOrder;
110
+ }
111
+
112
+ function validateOrder(order: Order): void {
113
+ if (!order.items.length) throw new ValidationError("Order cannot be empty");
114
+ if (order.total < 0) throw new ValidationError("Total cannot be negative");
115
+ }
116
+
117
+ function calculateTotals(items: OrderItem[]): OrderTotals {
118
+ const subtotal = items.reduce((sum, item) => sum + item.price * item.quantity, 0);
119
+ const tax = subtotal * TAX_RATE;
120
+ return { subtotal, tax, total: subtotal + tax };
121
+ }
122
+ ```
123
+
124
+ ### Parameter Rules
125
+
126
+ ```typescript
127
+ // ❌ BAD: Too many parameters
128
+ function createUser(
129
+ name: string, email: string, role: string,
130
+ isActive: boolean, avatar: string, bio: string
131
+ ) { ... }
132
+
133
+ // ✅ GOOD: Use an object for 3+ parameters
134
+ interface CreateUserInput {
135
+ name: string;
136
+ email: string;
137
+ role?: UserRole;
138
+ isActive?: boolean;
139
+ avatar?: string;
140
+ bio?: string;
141
+ }
142
+
143
+ function createUser(input: CreateUserInput): User { ... }
144
+
145
+ // ❌ BAD: Boolean parameter (caller can't read intent)
146
+ setVisible(true);
147
+
148
+ // ✅ GOOD: Named method instead
149
+ show();
150
+ hide();
151
+ ```
152
+
153
+ ---
154
+
155
+ ## SOLID Principles (With Code)
156
+
157
+ ### S Single Responsibility
158
+
159
+ ```typescript
160
+ // BAD: UserService does everything
161
+ class UserService {
162
+ createUser() { ... }
163
+ sendEmail() { ... }
164
+ generateReport() { ... }
165
+ uploadAvatar() { ... }
166
+ }
167
+
168
+ // ✅ GOOD: Separate concerns
169
+ class UserService { createUser() { ... } }
170
+ class EmailService { sendWelcomeEmail() { ... } }
171
+ class ReportService { generateUserReport() { ... } }
172
+ class AvatarService { upload() { ... } }
173
+ ```
174
+
175
+ ### O Open/Closed
176
+
177
+ ```typescript
178
+ // ❌ BAD: Adding a new type requires modifying existing code
179
+ function calculateDiscount(type: string, amount: number): number {
180
+ if (type === "student") return amount * 0.20;
181
+ if (type === "veteran") return amount * 0.15;
182
+ if (type === "senior") return amount * 0.10; // must modify for every new type
183
+ return 0;
184
+ }
185
+
186
+ // GOOD: Open for extension, closed for modification
187
+ interface DiscountStrategy {
188
+ calculate(amount: number): number;
189
+ }
190
+
191
+ class StudentDiscount implements DiscountStrategy {
192
+ calculate(amount: number) { return amount * 0.20; }
193
+ }
194
+
195
+ class VeteranDiscount implements DiscountStrategy {
196
+ calculate(amount: number) { return amount * 0.15; }
197
+ }
198
+
199
+ // New types = new class, no existing code changes
200
+ class EmployeeDiscount implements DiscountStrategy {
201
+ calculate(amount: number) { return amount * 0.25; }
202
+ }
203
+ ```
204
+
205
+ ### D Dependency Inversion
206
+
207
+ ```typescript
208
+ // ❌ BAD: High-level module depends on low-level concrete
209
+ class OrderService {
210
+ private db = new MySQLDatabase(); // coupled to MySQL
211
+ private mailer = new SendGridMailer(); // coupled to SendGrid
212
+ }
213
+
214
+ // ✅ GOOD: Depend on abstractions (interfaces)
215
+ interface Database { save(data: unknown): Promise<void>; }
216
+ interface Mailer { send(to: string, body: string): Promise<void>; }
217
+
218
+ class OrderService {
219
+ constructor(
220
+ private db: Database, // can be MySQL, Postgres, in-memory
221
+ private mailer: Mailer, // can be SendGrid, SES, mock
222
+ ) {}
223
+ }
224
+ ```
225
+
226
+ ---
227
+
228
+ ## Error Handling
229
+
230
+ ```typescript
231
+ // ❌ BAD: Swallowing errors
232
+ try {
233
+ await saveUser(user);
234
+ } catch (e) {
235
+ // silence
236
+ }
237
+
238
+ // ❌ BAD: Generic catch-all
239
+ try {
240
+ await processPayment(order);
241
+ } catch (e) {
242
+ console.log("Something went wrong");
243
+ }
244
+
245
+ // GOOD: Handle specific errors, propagate unexpected
246
+ try {
247
+ await processPayment(order);
248
+ } catch (error) {
249
+ if (error instanceof InsufficientFundsError) {
250
+ return { success: false, message: "Insufficient funds" };
251
+ }
252
+ if (error instanceof PaymentGatewayError) {
253
+ logger.warn("Payment gateway unavailable, queuing for retry", { orderId: order.id });
254
+ await retryQueue.add(order);
255
+ return { success: false, message: "Payment processing delayed" };
256
+ }
257
+ throw error; // unexpected error — let it propagate
258
+ }
259
+ ```
260
+
261
+ ---
262
+
263
+ ## Comments
264
+
265
+ ```typescript
266
+ // BAD: Comments that restate the code
267
+ // Increment i by 1
268
+ i++;
269
+
270
+ // Set the user's name
271
+ user.name = newName;
272
+
273
+ // Check if user is active
274
+ if (user.isActive) { ... }
275
+
276
+ // GOOD: Comments that explain WHY, not WHAT
277
+ // Tax exemption expires after 365 days per IRS Publication 334
278
+ const isExempt = daysSinceRegistration < 365;
279
+
280
+ // Using binary search here because the list is pre-sorted and
281
+ // can contain 100K+ items. Linear search caused P95 > 2s.
282
+ const index = binarySearch(sortedItems, target);
283
+
284
+ // Retry 3 times because the payment gateway has transient 503s
285
+ // during their daily maintenance window (02:00-02:15 UTC)
286
+ const result = await withRetry(() => chargeCard(amount), { maxRetries: 3 });
287
+ ```
288
+
289
+ ---
290
+
291
+ ## Code SmellsRefactoring
292
+
293
+ ```
294
+ Smell Refactoring
295
+ ───────────────────────────────────────
296
+ Long function (>30 lines) Extract method
297
+ Deep nesting (>3 levels) Early return / guard clauses
298
+ Duplicate code Extract shared function
299
+ Magic numbers Named constants
300
+ Boolean parameters → Separate methods or options object
301
+ God class (>300 lines) → Split into focused classes
302
+ Feature envy → Move method to appropriate class
303
+ Primitive obsession → Value objects (Email, Money, UserId)
304
+ Long parameter list → Parameter object
305
+ ```
306
+
307
+ ```typescript
308
+ // Deep nesting → Early return
309
+ // BAD
310
+ function processUser(user: User) {
311
+ if (user) {
312
+ if (user.isActive) {
313
+ if (user.hasPermission("edit")) {
314
+ // actual logic buried 3 levels deep
315
+ doStuff();
316
+ }
317
+ }
318
+ }
319
+ }
320
+
321
+ // ✅ GOOD: Guard clauses — fail fast, keep happy path unindented
322
+ function processUser(user: User) {
323
+ if (!user) return;
324
+ if (!user.isActive) return;
325
+ if (!user.hasPermission("edit")) return;
326
+
327
+ doStuff(); // happy path at top level
328
+ }
329
+ ```
330
+
331
+ ---