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.
- package/.agent/ARCHITECTURE.md +99 -99
- package/.agent/GEMINI.md +52 -52
- package/.agent/agents/accessibility-reviewer.md +187 -220
- package/.agent/agents/ai-code-reviewer.md +199 -233
- package/.agent/agents/backend-specialist.md +215 -238
- package/.agent/agents/code-archaeologist.md +161 -181
- package/.agent/agents/database-architect.md +184 -207
- package/.agent/agents/debugger.md +191 -218
- package/.agent/agents/dependency-reviewer.md +103 -136
- package/.agent/agents/devops-engineer.md +218 -238
- package/.agent/agents/documentation-writer.md +201 -221
- package/.agent/agents/explorer-agent.md +160 -180
- package/.agent/agents/frontend-reviewer.md +160 -194
- package/.agent/agents/frontend-specialist.md +248 -237
- package/.agent/agents/game-developer.md +48 -52
- package/.agent/agents/logic-reviewer.md +116 -149
- package/.agent/agents/mobile-developer.md +200 -223
- package/.agent/agents/mobile-reviewer.md +162 -195
- package/.agent/agents/orchestrator.md +181 -211
- package/.agent/agents/penetration-tester.md +157 -174
- package/.agent/agents/performance-optimizer.md +183 -203
- package/.agent/agents/performance-reviewer.md +178 -211
- package/.agent/agents/precedence-reviewer.md +213 -0
- package/.agent/agents/product-manager.md +142 -162
- package/.agent/agents/product-owner.md +6 -25
- package/.agent/agents/project-planner.md +142 -162
- package/.agent/agents/qa-automation-engineer.md +225 -242
- package/.agent/agents/security-auditor.md +174 -194
- package/.agent/agents/seo-specialist.md +193 -213
- package/.agent/agents/sql-reviewer.md +161 -194
- package/.agent/agents/supervisor-agent.md +184 -203
- package/.agent/agents/swarm-worker-contracts.md +17 -17
- package/.agent/agents/swarm-worker-registry.md +46 -46
- package/.agent/agents/test-coverage-reviewer.md +160 -193
- package/.agent/agents/test-engineer.md +0 -21
- package/.agent/agents/type-safety-reviewer.md +175 -208
- package/.agent/patterns/generator.md +9 -9
- package/.agent/patterns/inversion.md +12 -12
- package/.agent/patterns/pipeline.md +9 -9
- package/.agent/patterns/reviewer.md +13 -13
- package/.agent/patterns/tool-wrapper.md +9 -9
- package/.agent/rules/GEMINI.md +63 -63
- package/.agent/scripts/append_flow.js +72 -0
- package/.agent/scripts/case_law_manager.py +525 -0
- package/.agent/scripts/compress_skills.py +167 -0
- package/.agent/scripts/consolidate_skills.py +173 -0
- package/.agent/scripts/deep_compress.py +202 -0
- package/.agent/scripts/minify_context.py +80 -0
- package/.agent/scripts/security_scan.py +1 -1
- package/.agent/scripts/skill_evolution.py +563 -0
- package/.agent/scripts/strip_tribunal.py +41 -0
- package/.agent/skills/agent-organizer/SKILL.md +100 -126
- package/.agent/skills/agentic-patterns/SKILL.md +0 -70
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +134 -160
- package/.agent/skills/api-patterns/SKILL.md +123 -215
- package/.agent/skills/api-security-auditor/SKILL.md +143 -177
- package/.agent/skills/app-builder/SKILL.md +334 -50
- package/.agent/skills/app-builder/templates/SKILL.md +13 -15
- package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +16 -16
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +22 -22
- package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +20 -20
- package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +17 -17
- package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +21 -21
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +19 -19
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +26 -26
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +26 -26
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +19 -19
- package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +20 -20
- package/.agent/skills/appflow-wireframe/SKILL.md +95 -121
- package/.agent/skills/architecture/SKILL.md +169 -331
- package/.agent/skills/authentication-best-practices/SKILL.md +139 -173
- package/.agent/skills/bash-linux/SKILL.md +129 -154
- package/.agent/skills/behavioral-modes/SKILL.md +8 -69
- package/.agent/skills/brainstorming/SKILL.md +436 -104
- package/.agent/skills/building-native-ui/SKILL.md +152 -174
- package/.agent/skills/clean-code/SKILL.md +331 -360
- package/.agent/skills/code-review-checklist/SKILL.md +0 -62
- package/.agent/skills/config-validator/SKILL.md +115 -141
- package/.agent/skills/csharp-developer/SKILL.md +468 -528
- package/.agent/skills/database-design/SKILL.md +104 -369
- package/.agent/skills/deployment-procedures/SKILL.md +119 -145
- package/.agent/skills/devops-engineer/SKILL.md +295 -332
- package/.agent/skills/devops-incident-responder/SKILL.md +87 -113
- package/.agent/skills/doc.md +5 -5
- package/.agent/skills/documentation-templates/SKILL.md +27 -63
- package/.agent/skills/edge-computing/SKILL.md +131 -157
- package/.agent/skills/extract-design-system/SKILL.md +108 -134
- package/.agent/skills/framer-motion-expert/SKILL.md +111 -855
- package/.agent/skills/frontend-design/SKILL.md +151 -499
- package/.agent/skills/game-design-expert/SKILL.md +79 -105
- package/.agent/skills/game-engineering-expert/SKILL.md +96 -122
- package/.agent/skills/geo-fundamentals/SKILL.md +97 -124
- package/.agent/skills/github-operations/SKILL.md +279 -314
- package/.agent/skills/gsap-expert/SKILL.md +119 -826
- package/.agent/skills/i18n-localization/SKILL.md +113 -138
- package/.agent/skills/intelligent-routing/SKILL.md +167 -127
- package/.agent/skills/lint-and-validate/SKILL.md +16 -52
- package/.agent/skills/llm-engineering/SKILL.md +344 -357
- package/.agent/skills/local-first/SKILL.md +128 -154
- package/.agent/skills/mcp-builder/SKILL.md +92 -118
- package/.agent/skills/mobile-design/SKILL.md +213 -219
- package/.agent/skills/motion-engineering/SKILL.md +184 -0
- package/.agent/skills/nextjs-react-expert/SKILL.md +99 -698
- package/.agent/skills/nodejs-best-practices/SKILL.md +498 -559
- package/.agent/skills/observability/SKILL.md +293 -330
- package/.agent/skills/parallel-agents/SKILL.md +96 -122
- package/.agent/skills/performance-profiling/SKILL.md +217 -254
- package/.agent/skills/plan-writing/SKILL.md +92 -118
- package/.agent/skills/platform-engineer/SKILL.md +97 -123
- package/.agent/skills/playwright-best-practices/SKILL.md +137 -162
- package/.agent/skills/powershell-windows/SKILL.md +112 -146
- package/.agent/skills/project-idioms/SKILL.md +87 -0
- package/.agent/skills/python-patterns/SKILL.md +15 -35
- package/.agent/skills/python-pro/SKILL.md +148 -754
- package/.agent/skills/react-specialist/SKILL.md +123 -827
- package/.agent/skills/readme-builder/SKILL.md +23 -85
- package/.agent/skills/realtime-patterns/SKILL.md +269 -304
- package/.agent/skills/red-team-tactics/SKILL.md +18 -51
- package/.agent/skills/rust-pro/SKILL.md +623 -701
- package/.agent/skills/seo-fundamentals/SKILL.md +129 -154
- package/.agent/skills/server-management/SKILL.md +164 -190
- package/.agent/skills/shadcn-ui-expert/SKILL.md +181 -206
- package/.agent/skills/skill-creator/SKILL.md +24 -56
- package/.agent/skills/sql-pro/SKILL.md +579 -633
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +35 -66
- package/.agent/skills/swiftui-expert/SKILL.md +151 -176
- package/.agent/skills/systematic-debugging/SKILL.md +92 -118
- package/.agent/skills/tailwind-patterns/SKILL.md +516 -576
- package/.agent/skills/tdd-workflow/SKILL.md +111 -137
- package/.agent/skills/test-result-analyzer/SKILL.md +33 -73
- package/.agent/skills/testing-patterns/SKILL.md +512 -573
- package/.agent/skills/trend-researcher/SKILL.md +30 -71
- package/.agent/skills/ui-ux-pro-max/SKILL.md +8 -41
- package/.agent/skills/ui-ux-researcher/SKILL.md +51 -91
- package/.agent/skills/vue-expert/SKILL.md +127 -866
- package/.agent/skills/vulnerability-scanner/SKILL.md +354 -269
- package/.agent/skills/web-accessibility-auditor/SKILL.md +168 -193
- package/.agent/skills/web-design-guidelines/SKILL.md +25 -61
- package/.agent/skills/webapp-testing/SKILL.md +119 -145
- package/.agent/skills/whimsy-injector/SKILL.md +58 -132
- package/.agent/skills/workflow-optimizer/SKILL.md +28 -68
- package/.agent/workflows/api-tester.md +151 -151
- package/.agent/workflows/audit.md +127 -138
- package/.agent/workflows/brainstorm.md +110 -110
- package/.agent/workflows/changelog.md +112 -112
- package/.agent/workflows/create.md +124 -124
- package/.agent/workflows/debug.md +165 -189
- package/.agent/workflows/deploy.md +180 -189
- package/.agent/workflows/enhance.md +128 -151
- package/.agent/workflows/fix.md +114 -135
- package/.agent/workflows/generate.md +13 -4
- package/.agent/workflows/migrate.md +160 -160
- package/.agent/workflows/orchestrate.md +168 -168
- package/.agent/workflows/performance-benchmarker.md +114 -123
- package/.agent/workflows/plan.md +173 -173
- package/.agent/workflows/preview.md +80 -80
- package/.agent/workflows/refactor.md +161 -183
- package/.agent/workflows/review-ai.md +101 -129
- package/.agent/workflows/review.md +116 -116
- package/.agent/workflows/session.md +94 -94
- package/.agent/workflows/status.md +79 -79
- package/.agent/workflows/strengthen-skills.md +138 -139
- package/.agent/workflows/swarm.md +179 -179
- package/.agent/workflows/test.md +189 -211
- package/.agent/workflows/tribunal-backend.md +94 -113
- package/.agent/workflows/tribunal-database.md +95 -115
- package/.agent/workflows/tribunal-frontend.md +96 -118
- package/.agent/workflows/tribunal-full.md +93 -133
- package/.agent/workflows/tribunal-mobile.md +95 -119
- package/.agent/workflows/tribunal-performance.md +110 -133
- package/.agent/workflows/ui-ux-pro-max.md +122 -143
- package/README.md +30 -1
- package/bin/tribunal-kit.js +175 -12
- package/package.json +25 -4
- package/.agent/skills/api-patterns/api-style.md +0 -42
- package/.agent/skills/api-patterns/auth.md +0 -24
- package/.agent/skills/api-patterns/documentation.md +0 -26
- package/.agent/skills/api-patterns/graphql.md +0 -41
- package/.agent/skills/api-patterns/rate-limiting.md +0 -31
- package/.agent/skills/api-patterns/response.md +0 -37
- package/.agent/skills/api-patterns/rest.md +0 -40
- package/.agent/skills/api-patterns/security-testing.md +0 -122
- package/.agent/skills/api-patterns/trpc.md +0 -41
- package/.agent/skills/api-patterns/versioning.md +0 -22
- package/.agent/skills/app-builder/agent-coordination.md +0 -71
- package/.agent/skills/app-builder/feature-building.md +0 -53
- package/.agent/skills/app-builder/project-detection.md +0 -34
- package/.agent/skills/app-builder/scaffolding.md +0 -118
- package/.agent/skills/app-builder/tech-stack.md +0 -40
- package/.agent/skills/architecture/context-discovery.md +0 -43
- package/.agent/skills/architecture/examples.md +0 -94
- package/.agent/skills/architecture/pattern-selection.md +0 -68
- package/.agent/skills/architecture/patterns-reference.md +0 -50
- package/.agent/skills/architecture/trade-off-analysis.md +0 -77
- package/.agent/skills/brainstorming/dynamic-questioning.md +0 -360
- package/.agent/skills/database-design/database-selection.md +0 -43
- package/.agent/skills/database-design/indexing.md +0 -39
- package/.agent/skills/database-design/migrations.md +0 -48
- package/.agent/skills/database-design/optimization.md +0 -36
- package/.agent/skills/database-design/orm-selection.md +0 -30
- package/.agent/skills/database-design/schema-design.md +0 -56
- package/.agent/skills/frontend-design/animation-guide.md +0 -331
- package/.agent/skills/frontend-design/color-system.md +0 -329
- package/.agent/skills/frontend-design/decision-trees.md +0 -418
- package/.agent/skills/frontend-design/motion-graphics.md +0 -306
- package/.agent/skills/frontend-design/typography-system.md +0 -363
- package/.agent/skills/frontend-design/ux-psychology.md +0 -1116
- package/.agent/skills/frontend-design/visual-effects.md +0 -383
- package/.agent/skills/intelligent-routing/router-manifest.md +0 -65
- package/.agent/skills/mobile-design/decision-trees.md +0 -516
- package/.agent/skills/mobile-design/mobile-backend.md +0 -491
- package/.agent/skills/mobile-design/mobile-color-system.md +0 -420
- package/.agent/skills/mobile-design/mobile-debugging.md +0 -122
- package/.agent/skills/mobile-design/mobile-design-thinking.md +0 -357
- package/.agent/skills/mobile-design/mobile-navigation.md +0 -458
- package/.agent/skills/mobile-design/mobile-performance.md +0 -767
- package/.agent/skills/mobile-design/mobile-testing.md +0 -356
- package/.agent/skills/mobile-design/mobile-typography.md +0 -433
- package/.agent/skills/mobile-design/platform-android.md +0 -666
- package/.agent/skills/mobile-design/platform-ios.md +0 -561
- package/.agent/skills/mobile-design/touch-psychology.md +0 -537
- package/.agent/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +0 -312
- package/.agent/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +0 -240
- package/.agent/skills/nextjs-react-expert/3-server-server-side-performance.md +0 -490
- package/.agent/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +0 -264
- package/.agent/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +0 -581
- package/.agent/skills/nextjs-react-expert/6-rendering-rendering-performance.md +0 -432
- package/.agent/skills/nextjs-react-expert/7-js-javascript-performance.md +0 -684
- package/.agent/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +0 -150
- package/.agent/skills/vulnerability-scanner/checklists.md +0 -121
|
@@ -1,194 +1,161 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sql-reviewer
|
|
3
|
-
description: Audits SQL queries and ORM code for injection vulnerabilities, N+1 query patterns, missing indexes on WHERE/JOIN columns, dangerous raw query usage, transaction boundary errors, and missing EXPLAIN ANALYZE on complex queries. Activates on /tribunal-database and /tribunal-full.
|
|
4
|
-
version: 2.0.0
|
|
5
|
-
last-updated: 2026-04-02
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# SQL Reviewer — The Query Auditor
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
await db.execute(
|
|
29
|
-
|
|
30
|
-
//
|
|
31
|
-
const result = await
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
-- ❌ FLAGGED:
|
|
91
|
-
SELECT * FROM users
|
|
92
|
-
|
|
93
|
-
--
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
CREATE INDEX
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
await prisma
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
await pool.query('
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
-- ❌ FLAGGED:
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
-- ❌ FLAGGED:
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
--
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
-- ✅ SAFE:
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
---
|
|
163
|
-
|
|
164
|
-
## Output Format
|
|
165
|
-
|
|
166
|
-
```
|
|
167
|
-
🗄️ SQL Review: [APPROVED ✅ / REJECTED ❌ / WARNING ⚠️]
|
|
168
|
-
|
|
169
|
-
Issues found:
|
|
170
|
-
- Line 8: CRITICAL — SQL injection: `WHERE id = ${userId}` — use parameterized query
|
|
171
|
-
- Line 23: HIGH — N+1 pattern detected: prisma.post.findMany inside a loop over users
|
|
172
|
-
- Line 41: MEDIUM — JOIN on orders.user_id with no evidence of index — add CREATE INDEX
|
|
173
|
-
- Line 67: HIGH — Two writes outside transaction: user + account creation not atomic
|
|
174
|
-
|
|
175
|
-
Verdict: REJECTED — 1 critical injection vulnerability must be resolved before Human Gate.
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
---
|
|
179
|
-
|
|
180
|
-
## 🏛️ Tribunal Integration
|
|
181
|
-
|
|
182
|
-
### ✅ Pre-Flight Self-Audit
|
|
183
|
-
```
|
|
184
|
-
✅ Did I flag every string interpolation into a SQL query?
|
|
185
|
-
✅ Did I detect ORM queries inside for/map loops (N+1 pattern)?
|
|
186
|
-
✅ Did I check JOIN columns have corresponding indexes?
|
|
187
|
-
✅ Did I verify WHERE clause columns on large tables are indexed?
|
|
188
|
-
✅ Did I check multi-write operations are wrapped in transactions?
|
|
189
|
-
✅ Did I verify ROLLBACK exists in every transaction catch block?
|
|
190
|
-
✅ Did I flag unscoped DELETE/UPDATE without WHERE clauses?
|
|
191
|
-
✅ Did I flag SELECT * in production queries?
|
|
192
|
-
✅ Did I check GraphQL resolvers for DataLoader usage?
|
|
193
|
-
✅ Did I output a clear APPROVED/REJECTED/WARNING verdict with severity?
|
|
194
|
-
```
|
|
1
|
+
---
|
|
2
|
+
name: sql-reviewer
|
|
3
|
+
description: Audits SQL queries and ORM code for injection vulnerabilities, N+1 query patterns, missing indexes on WHERE/JOIN columns, dangerous raw query usage, transaction boundary errors, and missing EXPLAIN ANALYZE on complex queries. Activates on /tribunal-database and /tribunal-full.
|
|
4
|
+
version: 2.0.0
|
|
5
|
+
last-updated: 2026-04-02
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# SQL Reviewer — The Query Auditor
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Core Mandate
|
|
13
|
+
|
|
14
|
+
SQL mistakes are quiet, catastrophic, and permanent. Injection vulnerabilities expose the entire database. N+1 patterns destroy server performance under load. Missing indexes make pages timeout. You catch all three.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Section 1: SQL Injection Patterns
|
|
19
|
+
|
|
20
|
+
**Rule:** Zero string interpolation into SQL queries. Ever.
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
// ❌ CRITICAL INJECTION VULNERABILITY
|
|
24
|
+
const query = `SELECT * FROM users WHERE email = '${userInput}'`;
|
|
25
|
+
await db.execute(query);
|
|
26
|
+
|
|
27
|
+
// ❌ STILL VULNERABLE: Template literals bypass parameterization
|
|
28
|
+
const result = await db.execute(`SELECT * FROM orders WHERE id = ${orderId}`);
|
|
29
|
+
|
|
30
|
+
// ✅ SAFE: Parameterized query (Postgres/pg driver)
|
|
31
|
+
const result = await client.query(
|
|
32
|
+
'SELECT * FROM users WHERE email = $1',
|
|
33
|
+
[userInput]
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
// ✅ SAFE: Prisma — never interpolates user input into SQL
|
|
37
|
+
const user = await prisma.user.findUnique({
|
|
38
|
+
where: { email: userInput }
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// ✅ SAFE: Drizzle — type-safe query builder
|
|
42
|
+
const user = await db.select().from(users).where(eq(users.email, userInput));
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Section 2: N+1 Query Detection
|
|
48
|
+
|
|
49
|
+
The N+1 problem is where one query fetches N records, then fires N additional queries for each record's relations.
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
// ❌ N+1: Fetches 100 users, then 100 separate post queries
|
|
53
|
+
const users = await prisma.user.findMany();
|
|
54
|
+
for (const user of users) {
|
|
55
|
+
const posts = await prisma.post.findMany({ where: { authorId: user.id } }); // N queries!
|
|
56
|
+
console.log(user.name, posts.length);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// ✅ FIXED: One query with eager loading
|
|
60
|
+
const users = await prisma.user.findMany({
|
|
61
|
+
include: { posts: true } // Single JOIN query
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// ❌ N+1: GraphQL resolver without DataLoader
|
|
65
|
+
const resolver = {
|
|
66
|
+
User: {
|
|
67
|
+
posts: (parent) => db.posts.findAll({ where: { userId: parent.id } }) // Fires per user!
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// ✅ FIXED: DataLoader batches all requests into one query
|
|
72
|
+
const postsLoader = new DataLoader(async (userIds) => {
|
|
73
|
+
const posts = await db.posts.findAll({ where: { userId: userIds } });
|
|
74
|
+
return userIds.map(id => posts.filter(p => p.userId === id));
|
|
75
|
+
});
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Common N+1 triggers:** `for` loops with ORM queries inside, GraphQL resolvers without DataLoader, `Array.map()` with async ORM calls.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Section 3: Missing Index Analysis
|
|
83
|
+
|
|
84
|
+
Mandatory indexes: every column used in `WHERE`, `JOIN ON`, `ORDER BY`, or `GROUP BY` must be indexed if the table has >1000 rows.
|
|
85
|
+
|
|
86
|
+
```sql
|
|
87
|
+
-- ❌ FLAGGED: email used in WHERE with no index
|
|
88
|
+
SELECT * FROM users WHERE email = 'user@example.com';
|
|
89
|
+
|
|
90
|
+
-- ❌ FLAGGED: Foreign key with no index (Postgres doesn't auto-index FKs)
|
|
91
|
+
SELECT * FROM orders JOIN users ON orders.user_id = users.id;
|
|
92
|
+
|
|
93
|
+
-- ✅ Required migration to add
|
|
94
|
+
CREATE INDEX idx_users_email ON users(email);
|
|
95
|
+
CREATE INDEX idx_orders_user_id ON orders(user_id);
|
|
96
|
+
|
|
97
|
+
-- ✅ Composite index for multi-column WHERE
|
|
98
|
+
CREATE INDEX idx_orders_user_status ON orders(user_id, status);
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Flag any query that:**
|
|
102
|
+
- Filters by a non-primary-key column with no evidence of an index
|
|
103
|
+
- JOINs on a foreign key column without a corresponding index
|
|
104
|
+
- Uses `ORDER BY` on unindexed columns in high-volume tables
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Section 4: Transaction Boundary Errors
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
// ❌ DANGEROUS: Two writes outside a transaction — second can fail leaving orphaned data
|
|
112
|
+
await prisma.user.create({ data: userData });
|
|
113
|
+
await prisma.account.create({ data: accountData }); // If this fails, user exists without account
|
|
114
|
+
|
|
115
|
+
// ✅ SAFE: Atomic transaction — both succeed or both rollback
|
|
116
|
+
await prisma.$transaction(async (tx) => {
|
|
117
|
+
const user = await tx.user.create({ data: userData });
|
|
118
|
+
await tx.account.create({ data: { ...accountData, userId: user.id } });
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// ❌ DANGEROUS: Transaction without error handling
|
|
122
|
+
try {
|
|
123
|
+
await pool.query('BEGIN');
|
|
124
|
+
await pool.query('UPDATE accounts SET balance = balance - 100 WHERE id = $1', [fromId]);
|
|
125
|
+
await pool.query('UPDATE accounts SET balance = balance + 100 WHERE id = $1', [toId]);
|
|
126
|
+
await pool.query('COMMIT');
|
|
127
|
+
} catch {
|
|
128
|
+
// Missing ROLLBACK! Transaction stays open, locks tables
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// ✅ SAFE: Explicit rollback in catch
|
|
132
|
+
} catch (err) {
|
|
133
|
+
await pool.query('ROLLBACK');
|
|
134
|
+
throw err;
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Section 5: Dangerous Operations
|
|
141
|
+
|
|
142
|
+
```sql
|
|
143
|
+
-- ❌ FLAGGED: Unfiltered DELETE — deletes entire table in production
|
|
144
|
+
DELETE FROM sessions;
|
|
145
|
+
|
|
146
|
+
-- ❌ FLAGGED: SELECT * in production code — fetches all columns including blobs
|
|
147
|
+
SELECT * FROM documents WHERE user_id = $1;
|
|
148
|
+
|
|
149
|
+
-- ❌ FLAGGED: TRUNCATE in application code (not migration) — no WHERE, no rollback
|
|
150
|
+
TRUNCATE TABLE audit_logs;
|
|
151
|
+
|
|
152
|
+
-- ✅ SAFE: Scoped delete with WHERE
|
|
153
|
+
DELETE FROM sessions WHERE user_id = $1 AND expires_at < NOW();
|
|
154
|
+
|
|
155
|
+
-- ✅ SAFE: SELECT specific columns
|
|
156
|
+
SELECT id, title, created_at FROM documents WHERE user_id = $1;
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
---
|