tribunal-kit 2.4.6 → 3.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/.agent/agents/accessibility-reviewer.md +220 -134
- package/.agent/agents/ai-code-reviewer.md +233 -129
- package/.agent/agents/backend-specialist.md +238 -178
- package/.agent/agents/code-archaeologist.md +181 -119
- package/.agent/agents/database-architect.md +207 -164
- package/.agent/agents/debugger.md +218 -151
- package/.agent/agents/dependency-reviewer.md +136 -55
- package/.agent/agents/devops-engineer.md +238 -175
- package/.agent/agents/documentation-writer.md +221 -137
- package/.agent/agents/explorer-agent.md +180 -142
- package/.agent/agents/frontend-reviewer.md +194 -80
- package/.agent/agents/frontend-specialist.md +237 -188
- package/.agent/agents/game-developer.md +52 -184
- package/.agent/agents/logic-reviewer.md +149 -78
- package/.agent/agents/mobile-developer.md +223 -152
- package/.agent/agents/mobile-reviewer.md +195 -79
- package/.agent/agents/orchestrator.md +211 -170
- package/.agent/agents/penetration-tester.md +174 -131
- package/.agent/agents/performance-optimizer.md +203 -139
- package/.agent/agents/performance-reviewer.md +211 -108
- package/.agent/agents/product-manager.md +162 -108
- package/.agent/agents/project-planner.md +162 -142
- package/.agent/agents/qa-automation-engineer.md +242 -138
- package/.agent/agents/security-auditor.md +194 -170
- package/.agent/agents/seo-specialist.md +213 -132
- package/.agent/agents/sql-reviewer.md +194 -73
- package/.agent/agents/supervisor-agent.md +203 -156
- package/.agent/agents/test-coverage-reviewer.md +193 -81
- package/.agent/agents/type-safety-reviewer.md +208 -65
- package/.agent/scripts/__pycache__/auto_preview.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/bundle_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/checklist.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/dependency_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/security_scan.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/session_manager.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/skill_integrator.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/swarm_dispatcher.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/test_runner.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/verify_all.cpython-311.pyc +0 -0
- package/.agent/skills/agent-organizer/SKILL.md +126 -132
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +155 -66
- package/.agent/skills/api-patterns/SKILL.md +289 -257
- package/.agent/skills/api-security-auditor/SKILL.md +172 -70
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +1 -1
- package/.agent/skills/appflow-wireframe/SKILL.md +107 -100
- package/.agent/skills/architecture/SKILL.md +331 -200
- package/.agent/skills/authentication-best-practices/SKILL.md +168 -67
- package/.agent/skills/bash-linux/SKILL.md +154 -215
- package/.agent/skills/brainstorming/SKILL.md +104 -210
- package/.agent/skills/building-native-ui/SKILL.md +169 -70
- package/.agent/skills/clean-code/SKILL.md +360 -206
- package/.agent/skills/config-validator/SKILL.md +141 -165
- package/.agent/skills/csharp-developer/SKILL.md +528 -107
- package/.agent/skills/database-design/SKILL.md +455 -275
- package/.agent/skills/deployment-procedures/SKILL.md +145 -188
- package/.agent/skills/devops-engineer/SKILL.md +332 -134
- package/.agent/skills/devops-incident-responder/SKILL.md +113 -98
- package/.agent/skills/edge-computing/SKILL.md +157 -213
- package/.agent/skills/extract-design-system/SKILL.md +129 -69
- package/.agent/skills/framer-motion-expert/SKILL.md +939 -0
- package/.agent/skills/game-design-expert/SKILL.md +105 -0
- package/.agent/skills/game-engineering-expert/SKILL.md +122 -0
- package/.agent/skills/geo-fundamentals/SKILL.md +124 -215
- package/.agent/skills/github-operations/SKILL.md +314 -354
- package/.agent/skills/gsap-expert/SKILL.md +901 -0
- package/.agent/skills/i18n-localization/SKILL.md +138 -216
- package/.agent/skills/intelligent-routing/SKILL.md +127 -139
- package/.agent/skills/llm-engineering/SKILL.md +357 -258
- package/.agent/skills/local-first/SKILL.md +154 -203
- package/.agent/skills/mcp-builder/SKILL.md +118 -224
- package/.agent/skills/nextjs-react-expert/SKILL.md +783 -203
- package/.agent/skills/nodejs-best-practices/SKILL.md +559 -280
- package/.agent/skills/observability/SKILL.md +330 -285
- package/.agent/skills/parallel-agents/SKILL.md +122 -181
- package/.agent/skills/performance-profiling/SKILL.md +254 -197
- package/.agent/skills/plan-writing/SKILL.md +118 -188
- package/.agent/skills/platform-engineer/SKILL.md +123 -135
- package/.agent/skills/playwright-best-practices/SKILL.md +157 -76
- package/.agent/skills/powershell-windows/SKILL.md +146 -230
- package/.agent/skills/python-pro/SKILL.md +879 -114
- package/.agent/skills/react-specialist/SKILL.md +931 -108
- package/.agent/skills/realtime-patterns/SKILL.md +304 -296
- package/.agent/skills/rust-pro/SKILL.md +701 -240
- package/.agent/skills/seo-fundamentals/SKILL.md +154 -181
- package/.agent/skills/server-management/SKILL.md +190 -212
- package/.agent/skills/shadcn-ui-expert/SKILL.md +201 -68
- package/.agent/skills/sql-pro/SKILL.md +633 -104
- package/.agent/skills/swiftui-expert/SKILL.md +171 -70
- package/.agent/skills/systematic-debugging/SKILL.md +118 -186
- package/.agent/skills/tailwind-patterns/SKILL.md +576 -232
- package/.agent/skills/tdd-workflow/SKILL.md +137 -209
- package/.agent/skills/testing-patterns/SKILL.md +573 -205
- package/.agent/skills/vue-expert/SKILL.md +964 -119
- package/.agent/skills/vulnerability-scanner/SKILL.md +269 -316
- package/.agent/skills/web-accessibility-auditor/SKILL.md +188 -71
- package/.agent/skills/webapp-testing/SKILL.md +145 -236
- package/.agent/workflows/api-tester.md +151 -279
- package/.agent/workflows/audit.md +138 -168
- package/.agent/workflows/brainstorm.md +110 -146
- package/.agent/workflows/changelog.md +112 -144
- package/.agent/workflows/create.md +124 -139
- package/.agent/workflows/debug.md +189 -196
- package/.agent/workflows/deploy.md +189 -153
- package/.agent/workflows/enhance.md +151 -139
- package/.agent/workflows/fix.md +135 -143
- package/.agent/workflows/generate.md +157 -164
- package/.agent/workflows/migrate.md +160 -163
- package/.agent/workflows/orchestrate.md +168 -151
- package/.agent/workflows/performance-benchmarker.md +123 -305
- package/.agent/workflows/plan.md +173 -151
- package/.agent/workflows/preview.md +80 -137
- package/.agent/workflows/refactor.md +183 -153
- package/.agent/workflows/review-ai.md +129 -140
- package/.agent/workflows/review.md +116 -155
- package/.agent/workflows/session.md +94 -154
- package/.agent/workflows/status.md +79 -125
- package/.agent/workflows/strengthen-skills.md +139 -99
- package/.agent/workflows/swarm.md +179 -194
- package/.agent/workflows/test.md +211 -166
- package/.agent/workflows/tribunal-backend.md +113 -111
- package/.agent/workflows/tribunal-database.md +115 -132
- package/.agent/workflows/tribunal-frontend.md +118 -115
- package/.agent/workflows/tribunal-full.md +133 -136
- package/.agent/workflows/tribunal-mobile.md +119 -123
- package/.agent/workflows/tribunal-performance.md +133 -152
- package/.agent/workflows/ui-ux-pro-max.md +143 -171
- package/README.md +11 -15
- package/package.json +1 -1
- package/.agent/skills/dotnet-core-expert/SKILL.md +0 -103
- package/.agent/skills/framer-motion-animations/SKILL.md +0 -74
- package/.agent/skills/game-development/2d-games/SKILL.md +0 -119
- package/.agent/skills/game-development/3d-games/SKILL.md +0 -135
- package/.agent/skills/game-development/SKILL.md +0 -236
- package/.agent/skills/game-development/game-art/SKILL.md +0 -185
- package/.agent/skills/game-development/game-audio/SKILL.md +0 -190
- package/.agent/skills/game-development/game-design/SKILL.md +0 -129
- package/.agent/skills/game-development/mobile-games/SKILL.md +0 -108
- package/.agent/skills/game-development/multiplayer/SKILL.md +0 -132
- package/.agent/skills/game-development/pc-games/SKILL.md +0 -144
- package/.agent/skills/game-development/vr-ar/SKILL.md +0 -123
- package/.agent/skills/game-development/web-games/SKILL.md +0 -150
|
@@ -1,206 +1,360 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: clean-code
|
|
3
|
-
description:
|
|
4
|
-
allowed-tools: Read, Write, Edit, Glob, Grep
|
|
5
|
-
version:
|
|
6
|
-
last-updated: 2026-
|
|
7
|
-
applies-to-model: gemini-2.5-pro, claude-3-7-sonnet
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Clean Code
|
|
11
|
-
|
|
12
|
-
>
|
|
13
|
-
>
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
##
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
+
```
|