tribunal-kit 4.5.0 → 4.6.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/.shared/ui-ux-pro-max/README.md +4 -4
- package/.agent/ARCHITECTURE.md +279 -277
- package/.agent/GEMINI.md +127 -121
- package/.agent/agents/accessibility-reviewer.md +187 -187
- package/.agent/agents/ai-code-reviewer.md +199 -199
- package/.agent/agents/api-architect.md +71 -66
- package/.agent/agents/backend-specialist.md +219 -215
- package/.agent/agents/cloud-engineer.md +98 -0
- package/.agent/agents/code-archaeologist.md +168 -161
- package/.agent/agents/database-architect.md +184 -184
- package/.agent/agents/db-latency-auditor.md +213 -216
- package/.agent/agents/debugger.md +198 -191
- package/.agent/agents/dependency-reviewer.md +106 -103
- package/.agent/agents/devops-engineer.md +218 -218
- package/.agent/agents/documentation-writer.md +209 -201
- package/.agent/agents/explorer-agent.md +167 -160
- package/.agent/agents/frontend-reviewer.md +162 -160
- package/.agent/agents/frontend-specialist.md +257 -248
- package/.agent/agents/game-developer.md +48 -48
- package/.agent/agents/logic-reviewer.md +118 -116
- package/.agent/agents/mobile-developer.md +197 -200
- package/.agent/agents/mobile-reviewer.md +159 -162
- package/.agent/agents/orchestrator.md +187 -181
- package/.agent/agents/penetration-tester.md +160 -157
- package/.agent/agents/performance-optimizer.md +183 -183
- package/.agent/agents/performance-reviewer.md +178 -178
- package/.agent/agents/precedence-reviewer.md +251 -250
- package/.agent/agents/product-manager.md +149 -142
- package/.agent/agents/product-owner.md +81 -80
- package/.agent/agents/project-planner.md +152 -142
- package/.agent/agents/qa-automation-engineer.md +216 -225
- package/.agent/agents/resilience-reviewer.md +88 -88
- package/.agent/agents/schema-reviewer.md +67 -67
- package/.agent/agents/security-auditor.md +180 -174
- package/.agent/agents/seo-specialist.md +188 -193
- package/.agent/agents/sql-reviewer.md +159 -161
- package/.agent/agents/supervisor-agent.md +173 -184
- package/.agent/agents/swarm-worker-contracts.md +170 -166
- package/.agent/agents/swarm-worker-registry.md +92 -92
- package/.agent/agents/system-architect.md +85 -0
- package/.agent/agents/test-coverage-reviewer.md +158 -160
- package/.agent/agents/test-engineer.md +118 -118
- package/.agent/agents/throughput-optimizer.md +291 -299
- package/.agent/agents/type-safety-reviewer.md +182 -175
- package/.agent/agents/ui-ux-auditor.md +300 -292
- package/.agent/agents/vitals-reviewer.md +223 -223
- package/.agent/mcp_config.json +37 -40
- package/.agent/patterns/generator.md +11 -9
- package/.agent/patterns/inversion.md +14 -12
- package/.agent/patterns/pipeline.md +11 -9
- package/.agent/patterns/reviewer.md +15 -13
- package/.agent/patterns/tool-wrapper.md +11 -9
- package/.agent/routing_index.json +654 -0
- package/.agent/rules/GEMINI.md +358 -352
- package/.agent/scripts/compile_router.py +112 -0
- package/.agent/scripts/migrate_skills_frontmatter.py +64 -0
- package/.agent/scripts/strengthen_skills.js +1 -1
- package/.agent/skills/advanced-rag-pipelines/SKILL.md +56 -0
- package/.agent/skills/agent-organizer/SKILL.md +156 -150
- package/.agent/skills/agentic-patterns/SKILL.md +313 -315
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +190 -184
- package/.agent/skills/api-patterns/SKILL.md +253 -247
- package/.agent/skills/api-security-auditor/SKILL.md +195 -193
- package/.agent/skills/app-builder/SKILL.md +573 -572
- package/.agent/skills/app-builder/templates/SKILL.md +108 -115
- package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -76
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -92
- package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -88
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -88
- package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -83
- package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -90
- package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -90
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +126 -122
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +127 -122
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +172 -169
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +139 -134
- package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -83
- package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +122 -119
- package/.agent/skills/appflow-wireframe/SKILL.md +146 -145
- package/.agent/skills/architecture/SKILL.md +226 -219
- package/.agent/skills/authentication-best-practices/SKILL.md +197 -189
- package/.agent/skills/backend-security-expert/SKILL.md +16 -2
- package/.agent/skills/bash-linux/SKILL.md +179 -179
- package/.agent/skills/behavioral-modes/SKILL.md +239 -223
- package/.agent/skills/brainstorming/SKILL.md +498 -486
- package/.agent/skills/browser-native-ai/SKILL.md +57 -4
- package/.agent/skills/building-native-ui/SKILL.md +202 -202
- package/.agent/skills/cicd-pro/SKILL.md +442 -0
- package/.agent/skills/clean-code/SKILL.md +400 -381
- package/.agent/skills/cloud-architect/SKILL.md +439 -0
- package/.agent/skills/code-review-checklist/SKILL.md +203 -194
- package/.agent/skills/config-validator/SKILL.md +165 -165
- package/.agent/skills/containerization-pro/SKILL.md +452 -0
- package/.agent/skills/csharp-developer/SKILL.md +518 -518
- package/.agent/skills/data-validation-schemas/SKILL.md +333 -328
- package/.agent/skills/database-design/SKILL.md +247 -240
- package/.agent/skills/deployment-procedures/SKILL.md +172 -169
- package/.agent/skills/devops-engineer/SKILL.md +345 -345
- package/.agent/skills/devops-incident-responder/SKILL.md +143 -137
- package/.agent/skills/doc.md +209 -177
- package/.agent/skills/documentation-templates/SKILL.md +291 -279
- package/.agent/skills/edge-computing/SKILL.md +183 -181
- package/.agent/skills/error-resilience/SKILL.md +411 -428
- package/.agent/skills/extract-design-system/SKILL.md +160 -158
- package/.agent/skills/framer-motion-expert/SKILL.md +253 -244
- package/.agent/skills/frontend-design/SKILL.md +208 -201
- package/.agent/skills/frontend-security-expert/SKILL.md +16 -3
- package/.agent/skills/game-design-expert/SKILL.md +132 -129
- package/.agent/skills/game-engineering-expert/SKILL.md +148 -146
- package/.agent/skills/generative-ui-expert/SKILL.md +57 -1
- package/.agent/skills/geo-fundamentals/SKILL.md +148 -147
- package/.agent/skills/git-pro/SKILL.md +435 -0
- package/.agent/skills/github-operations/SKILL.md +335 -329
- package/.agent/skills/gsap-core/SKILL.md +319 -308
- package/.agent/skills/gsap-frameworks/SKILL.md +213 -207
- package/.agent/skills/gsap-performance/SKILL.md +139 -133
- package/.agent/skills/gsap-plugins/SKILL.md +486 -480
- package/.agent/skills/gsap-react/SKILL.md +202 -189
- package/.agent/skills/gsap-scrolltrigger/SKILL.md +357 -350
- package/.agent/skills/gsap-timeline/SKILL.md +165 -161
- package/.agent/skills/gsap-utils/SKILL.md +344 -338
- package/.agent/skills/harness-protocol/SKILL.md +48 -0
- package/.agent/skills/i18n-localization/SKILL.md +174 -163
- package/.agent/skills/intelligent-routing/SKILL.md +202 -246
- package/.agent/skills/knowledge-graph/SKILL.md +60 -52
- package/.agent/skills/lint-and-validate/SKILL.md +261 -261
- package/.agent/skills/llm-engineering/SKILL.md +400 -394
- package/.agent/skills/local-first/SKILL.md +178 -178
- package/.agent/skills/mcp-builder/SKILL.md +143 -142
- package/.agent/skills/mobile-design/SKILL.md +272 -263
- package/.agent/skills/monorepo-management/SKILL.md +335 -334
- package/.agent/skills/motion-engineering/SKILL.md +266 -234
- package/.agent/skills/nextjs-react-expert/SKILL.md +236 -234
- package/.agent/skills/nodejs-best-practices/SKILL.md +547 -548
- package/.agent/skills/observability/SKILL.md +343 -343
- package/.agent/skills/parallel-agents/SKILL.md +143 -146
- package/.agent/skills/performance-profiling/SKILL.md +259 -267
- package/.agent/skills/plan-writing/SKILL.md +150 -142
- package/.agent/skills/platform-engineer/SKILL.md +148 -147
- package/.agent/skills/playwright-best-practices/SKILL.md +188 -187
- package/.agent/skills/powershell-windows/SKILL.md +162 -162
- package/.agent/skills/project-idioms/SKILL.md +137 -137
- package/.agent/skills/python-patterns/SKILL.md +260 -259
- package/.agent/skills/python-pro/SKILL.md +324 -323
- package/.agent/skills/react-specialist/SKILL.md +305 -277
- package/.agent/skills/readme-builder/SKILL.md +310 -300
- package/.agent/skills/realtime-patterns/SKILL.md +323 -319
- package/.agent/skills/red-team-tactics/SKILL.md +231 -218
- package/.agent/skills/rust-pro/SKILL.md +671 -673
- package/.agent/skills/seo-fundamentals/SKILL.md +179 -179
- package/.agent/skills/server-management/SKILL.md +218 -214
- package/.agent/skills/shadcn-ui-expert/SKILL.md +231 -231
- package/.agent/skills/skill-creator/SKILL.md +87 -86
- package/.agent/skills/sql-pro/SKILL.md +629 -629
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +97 -97
- package/.agent/skills/swiftui-expert/SKILL.md +204 -201
- package/.agent/skills/system-design-pro/SKILL.md +345 -0
- package/.agent/skills/systematic-debugging/SKILL.md +153 -142
- package/.agent/skills/tailwind-patterns/SKILL.md +610 -566
- package/.agent/skills/tdd-workflow/SKILL.md +169 -161
- package/.agent/skills/test-result-analyzer/SKILL.md +313 -309
- package/.agent/skills/testing-patterns/SKILL.md +566 -579
- package/.agent/skills/trend-researcher/SKILL.md +243 -237
- package/.agent/skills/typescript-advanced/SKILL.md +336 -335
- package/.agent/skills/ui-ux-pro-max/SKILL.md +590 -562
- package/.agent/skills/ui-ux-researcher/SKILL.md +244 -244
- package/.agent/skills/vue-expert/SKILL.md +294 -275
- package/.agent/skills/vulnerability-scanner/SKILL.md +416 -404
- package/.agent/skills/web-accessibility-auditor/SKILL.md +219 -218
- package/.agent/skills/web-design-guidelines/SKILL.md +192 -186
- package/.agent/skills/webapp-testing/SKILL.md +167 -169
- package/.agent/skills/webgpu-performance/SKILL.md +56 -2
- package/.agent/skills/whimsy-injector/SKILL.md +346 -325
- package/.agent/skills/workflow-optimizer/SKILL.md +231 -229
- package/.agent/workflows/acf.md +141 -0
- package/.agent/workflows/api-tester.md +176 -151
- package/.agent/workflows/audit.md +150 -127
- package/.agent/workflows/brainstorm.md +134 -110
- package/.agent/workflows/changelog.md +140 -112
- package/.agent/workflows/create.md +168 -124
- package/.agent/workflows/debug.md +190 -165
- package/.agent/workflows/deploy.md +201 -180
- package/.agent/workflows/enhance.md +154 -128
- package/.agent/workflows/fix.md +136 -114
- package/.agent/workflows/generate.md +198 -183
- package/.agent/workflows/marathon.md +37 -11
- package/.agent/workflows/migrate.md +184 -160
- package/.agent/workflows/orchestrate.md +192 -168
- package/.agent/workflows/performance-benchmarker.md +135 -114
- package/.agent/workflows/plan.md +196 -173
- package/.agent/workflows/preview.md +103 -80
- package/.agent/workflows/refactor.md +192 -161
- package/.agent/workflows/review-ai.md +125 -101
- package/.agent/workflows/review.md +141 -116
- package/.agent/workflows/session.md +122 -94
- package/.agent/workflows/status.md +101 -79
- package/.agent/workflows/strengthen-skills.md +164 -138
- package/.agent/workflows/super-prompt.md +24 -0
- package/.agent/workflows/swarm.md +193 -179
- package/.agent/workflows/test.md +211 -189
- package/.agent/workflows/tribunal-backend.md +136 -105
- package/.agent/workflows/tribunal-database.md +122 -95
- package/.agent/workflows/tribunal-frontend.md +221 -96
- package/.agent/workflows/tribunal-full.md +129 -100
- package/.agent/workflows/tribunal-mobile.md +122 -95
- package/.agent/workflows/tribunal-performance.md +136 -110
- package/.agent/workflows/tribunal-speed.md +209 -183
- package/.agent/workflows/ui-ux-pro-max.md +145 -122
- package/README.md +107 -55
- package/bin/mcp-server.js +159 -0
- package/bin/tribunal-kit.js +105 -29
- package/bin/wrapper.js +16 -7
- package/mcp_config.json +9 -0
- package/package.json +94 -86
- package/scripts/changelog.js +4 -3
- package/scripts/validate-payload.js +6 -1
- package/scripts/postinstall.js +0 -127
|
@@ -1,175 +1,182 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: type-safety-reviewer
|
|
3
|
-
description: Audits TypeScript code for unsafe any usage, unjustified type assertions, missing return types, unguarded property access, broken generic constraints, Zod parse vs cast confusion, and discriminated union exhaustiveness. Activates on /tribunal-backend, /tribunal-frontend, and /tribunal-full.
|
|
4
|
-
version: 2.0.0
|
|
5
|
-
last-updated: 2026-04-02
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Type Safety Reviewer — The Type Enforcer
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Core Mandate
|
|
13
|
-
|
|
14
|
-
TypeScript is a contract system. Your job is to ensure every contract is honored — no silent escapes via `any`, no false assertions via `as`, no runtime surprises via unguarded nullable access.
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## Section 1: The `any` Epidemic
|
|
19
|
-
|
|
20
|
-
Flag every `any` that isn't accompanied by a documented justification comment.
|
|
21
|
-
|
|
22
|
-
```typescript
|
|
23
|
-
// ❌ REJECTED: Lazy any — the type is knowable
|
|
24
|
-
function process(data: any) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
//
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const
|
|
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
|
-
|
|
1
|
+
---
|
|
2
|
+
name: type-safety-reviewer
|
|
3
|
+
description: Audits TypeScript code for unsafe any usage, unjustified type assertions, missing return types, unguarded property access, broken generic constraints, Zod parse vs cast confusion, and discriminated union exhaustiveness. Activates on /tribunal-backend, /tribunal-frontend, and /tribunal-full.
|
|
4
|
+
version: 2.0.0
|
|
5
|
+
last-updated: 2026-04-02
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Type Safety Reviewer — The Type Enforcer
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Core Mandate
|
|
13
|
+
|
|
14
|
+
TypeScript is a contract system. Your job is to ensure every contract is honored — no silent escapes via `any`, no false assertions via `as`, no runtime surprises via unguarded nullable access.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Section 1: The `any` Epidemic
|
|
19
|
+
|
|
20
|
+
Flag every `any` that isn't accompanied by a documented justification comment.
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
// ❌ REJECTED: Lazy any — the type is knowable
|
|
24
|
+
function process(data: any) {
|
|
25
|
+
return data.name;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// ❌ REJECTED: Cast from unknown response — no runtime validation
|
|
29
|
+
const result: any = await fetch("/api").then((r) => r.json());
|
|
30
|
+
|
|
31
|
+
// ✅ APPROVED: Narrow interface defined
|
|
32
|
+
function process(data: { name: string; id: number }) {
|
|
33
|
+
return data.name;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// ✅ APPROVED: Zod validates at runtime boundary
|
|
37
|
+
const result = UserSchema.parse(await fetch("/api").then((r) => r.json()));
|
|
38
|
+
|
|
39
|
+
// ✅ APPROVED with documented justification
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
41
|
+
const pluginData: any = loadDynamicPlugin(); // VERIFY: Plugin system has no static types
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Section 2: Type Assertion Abuse (`as` keyword)
|
|
47
|
+
|
|
48
|
+
`as` silences the type checker without providing runtime safety.
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
// ❌ REJECTED: Assertion without validation — crashes at runtime if wrong
|
|
52
|
+
const user = response as User;
|
|
53
|
+
|
|
54
|
+
// ❌ REJECTED: Double cast to escape type system entirely
|
|
55
|
+
const config = data as unknown as Config;
|
|
56
|
+
|
|
57
|
+
// ✅ APPROVED: Runtime-validated parse
|
|
58
|
+
const user = UserSchema.parse(response);
|
|
59
|
+
|
|
60
|
+
// ✅ APPROVED: Type guard with actual check
|
|
61
|
+
function isUser(data: unknown): data is User {
|
|
62
|
+
return typeof data === "object" && data !== null && "id" in data;
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Section 3: Zod — Parse vs Cast Confusion
|
|
69
|
+
|
|
70
|
+
This is one of the most common hallucinations in AI-generated TypeScript.
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
// ❌ REJECTED: Zod schema used as a type cast (does nothing at runtime)
|
|
74
|
+
const user = z.object({ name: z.string() }) as unknown as User;
|
|
75
|
+
|
|
76
|
+
// ❌ REJECTED: .safeParse() result used without checking .success
|
|
77
|
+
const result = UserSchema.safeParse(input);
|
|
78
|
+
return result.data; // Could be undefined if parsing failed!
|
|
79
|
+
|
|
80
|
+
// ✅ APPROVED: .parse() — throws on invalid input
|
|
81
|
+
const user = UserSchema.parse(input);
|
|
82
|
+
|
|
83
|
+
// ✅ APPROVED: .safeParse() with discriminated result check
|
|
84
|
+
const result = UserSchema.safeParse(input);
|
|
85
|
+
if (!result.success) {
|
|
86
|
+
return NextResponse.json({ error: result.error.flatten() }, { status: 400 });
|
|
87
|
+
}
|
|
88
|
+
const user = result.data; // Narrowed to User here
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Section 4: Unguarded Property Access
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
// ❌ REJECTED: Chain crashes if address is null/undefined
|
|
97
|
+
const city = user.address.city;
|
|
98
|
+
|
|
99
|
+
// ❌ REJECTED: Index access without bound check
|
|
100
|
+
const first = arr[0].name; // arr could be empty
|
|
101
|
+
|
|
102
|
+
// ✅ APPROVED: Optional chaining with fallback
|
|
103
|
+
const city = user.address?.city ?? "Unknown";
|
|
104
|
+
|
|
105
|
+
// ✅ APPROVED: Guard before access
|
|
106
|
+
if (arr.length > 0) {
|
|
107
|
+
const first = arr[0].name;
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Section 5: Missing Return Types on Exports
|
|
114
|
+
|
|
115
|
+
Public API functions are contracts. They must declare their return types explicitly.
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
// ❌ REJECTED: Return type inferred — callers can't trust the contract
|
|
119
|
+
export async function getUser(id: string) {
|
|
120
|
+
return db.users.findUnique({ where: { id } });
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// ✅ APPROVED: Explicit contract
|
|
124
|
+
export async function getUser(id: string): Promise<User | null> {
|
|
125
|
+
return db.users.findUnique({ where: { id } });
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ✅ APPROVED: void return explicitly declared
|
|
129
|
+
export function logEvent(event: string): void {
|
|
130
|
+
console.log(event);
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Section 6: Broken Generic Constraints
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
// ❌ REJECTED: Unconstrained generic loses type information
|
|
140
|
+
function getProperty<T>(obj: T, key: string) {
|
|
141
|
+
return (obj as any)[key]; // Forced to use any
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// ✅ APPROVED: Constrained generic preserves type safety
|
|
145
|
+
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
|
|
146
|
+
return obj[key];
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Section 7: Discriminated Union Exhaustiveness
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
// ❌ REJECTED: Missing case coverage — new variants break silently
|
|
156
|
+
type Status = "active" | "inactive" | "pending";
|
|
157
|
+
function label(s: Status): string {
|
|
158
|
+
if (s === "active") return "Active";
|
|
159
|
+
if (s === "inactive") return "Inactive";
|
|
160
|
+
return ""; // 'pending' falls through silently
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// ✅ APPROVED: Exhaustive check with never assertion
|
|
164
|
+
function label(s: Status): string {
|
|
165
|
+
switch (s) {
|
|
166
|
+
case "active":
|
|
167
|
+
return "Active";
|
|
168
|
+
case "inactive":
|
|
169
|
+
return "Inactive";
|
|
170
|
+
case "pending":
|
|
171
|
+
return "Pending";
|
|
172
|
+
default: {
|
|
173
|
+
const _exhaustive: never = s; // TypeScript errors if case is missing
|
|
174
|
+
throw new Error(`Unknown status: ${_exhaustive}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
---
|