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,161 +1,159 @@
|
|
|
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
|
-
|
|
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
|
-
-- ❌ FLAGGED:
|
|
88
|
-
SELECT * FROM users
|
|
89
|
-
|
|
90
|
-
--
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
CREATE INDEX
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
await
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
await pool.query('
|
|
124
|
-
await pool.query('
|
|
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
|
-
---
|
|
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("SELECT * FROM users WHERE email = $1", [userInput]);
|
|
32
|
+
|
|
33
|
+
// ✅ SAFE: Prisma — never interpolates user input into SQL
|
|
34
|
+
const user = await prisma.user.findUnique({
|
|
35
|
+
where: { email: userInput },
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// ✅ SAFE: Drizzle — type-safe query builder
|
|
39
|
+
const user = await db.select().from(users).where(eq(users.email, userInput));
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Section 2: N+1 Query Detection
|
|
45
|
+
|
|
46
|
+
The N+1 problem is where one query fetches N records, then fires N additional queries for each record's relations.
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
// ❌ N+1: Fetches 100 users, then 100 separate post queries
|
|
50
|
+
const users = await prisma.user.findMany();
|
|
51
|
+
for (const user of users) {
|
|
52
|
+
const posts = await prisma.post.findMany({ where: { authorId: user.id } }); // N queries!
|
|
53
|
+
console.log(user.name, posts.length);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ✅ FIXED: One query with eager loading
|
|
57
|
+
const users = await prisma.user.findMany({
|
|
58
|
+
include: { posts: true }, // Single JOIN query
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// ❌ N+1: GraphQL resolver without DataLoader
|
|
62
|
+
const resolver = {
|
|
63
|
+
User: {
|
|
64
|
+
posts: (parent) => db.posts.findAll({ where: { userId: parent.id } }), // Fires per user!
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// ✅ FIXED: DataLoader batches all requests into one query
|
|
69
|
+
const postsLoader = new DataLoader(async (userIds) => {
|
|
70
|
+
const posts = await db.posts.findAll({ where: { userId: userIds } });
|
|
71
|
+
return userIds.map((id) => posts.filter((p) => p.userId === id));
|
|
72
|
+
});
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Common N+1 triggers:** `for` loops with ORM queries inside, GraphQL resolvers without DataLoader, `Array.map()` with async ORM calls.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Section 3: Missing Index Analysis
|
|
80
|
+
|
|
81
|
+
Mandatory indexes: every column used in `WHERE`, `JOIN ON`, `ORDER BY`, or `GROUP BY` must be indexed if the table has >1000 rows.
|
|
82
|
+
|
|
83
|
+
```sql
|
|
84
|
+
-- ❌ FLAGGED: email used in WHERE with no index
|
|
85
|
+
SELECT * FROM users WHERE email = 'user@example.com';
|
|
86
|
+
|
|
87
|
+
-- ❌ FLAGGED: Foreign key with no index (Postgres doesn't auto-index FKs)
|
|
88
|
+
SELECT * FROM orders JOIN users ON orders.user_id = users.id;
|
|
89
|
+
|
|
90
|
+
-- ✅ Required migration to add
|
|
91
|
+
CREATE INDEX idx_users_email ON users(email);
|
|
92
|
+
CREATE INDEX idx_orders_user_id ON orders(user_id);
|
|
93
|
+
|
|
94
|
+
-- ✅ Composite index for multi-column WHERE
|
|
95
|
+
CREATE INDEX idx_orders_user_status ON orders(user_id, status);
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**Flag any query that:**
|
|
99
|
+
|
|
100
|
+
- Filters by a non-primary-key column with no evidence of an index
|
|
101
|
+
- JOINs on a foreign key column without a corresponding index
|
|
102
|
+
- Uses `ORDER BY` on unindexed columns in high-volume tables
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Section 4: Transaction Boundary Errors
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
// ❌ DANGEROUS: Two writes outside a transaction — second can fail leaving orphaned data
|
|
110
|
+
await prisma.user.create({ data: userData });
|
|
111
|
+
await prisma.account.create({ data: accountData }); // If this fails, user exists without account
|
|
112
|
+
|
|
113
|
+
// ✅ SAFE: Atomic transaction — both succeed or both rollback
|
|
114
|
+
await prisma.$transaction(async (tx) => {
|
|
115
|
+
const user = await tx.user.create({ data: userData });
|
|
116
|
+
await tx.account.create({ data: { ...accountData, userId: user.id } });
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// ❌ DANGEROUS: Transaction without error handling
|
|
120
|
+
try {
|
|
121
|
+
await pool.query('BEGIN');
|
|
122
|
+
await pool.query('UPDATE accounts SET balance = balance - 100 WHERE id = $1', [fromId]);
|
|
123
|
+
await pool.query('UPDATE accounts SET balance = balance + 100 WHERE id = $1', [toId]);
|
|
124
|
+
await pool.query('COMMIT');
|
|
125
|
+
} catch {
|
|
126
|
+
// Missing ROLLBACK! Transaction stays open, locks tables
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// ✅ SAFE: Explicit rollback in catch
|
|
130
|
+
} catch (err) {
|
|
131
|
+
await pool.query('ROLLBACK');
|
|
132
|
+
throw err;
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Section 5: Dangerous Operations
|
|
139
|
+
|
|
140
|
+
```sql
|
|
141
|
+
-- ❌ FLAGGED: Unfiltered DELETE — deletes entire table in production
|
|
142
|
+
DELETE FROM sessions;
|
|
143
|
+
|
|
144
|
+
-- ❌ FLAGGED: SELECT * in production code — fetches all columns including blobs
|
|
145
|
+
SELECT * FROM documents WHERE user_id = $1;
|
|
146
|
+
|
|
147
|
+
-- ❌ FLAGGED: TRUNCATE in application code (not migration) — no WHERE, no rollback
|
|
148
|
+
TRUNCATE TABLE audit_logs;
|
|
149
|
+
|
|
150
|
+
-- ✅ SAFE: Scoped delete with WHERE
|
|
151
|
+
DELETE FROM sessions WHERE user_id = $1 AND expires_at < NOW();
|
|
152
|
+
|
|
153
|
+
-- ✅ SAFE: SELECT specific columns
|
|
154
|
+
SELECT id, title, created_at FROM documents WHERE user_id = $1;
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
---
|