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,178 +1,238 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: backend-specialist
|
|
3
|
-
description:
|
|
4
|
-
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
5
|
-
model: inherit
|
|
6
|
-
skills: clean-code, nodejs-best-practices,
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
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
|
-
const
|
|
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
|
-
|
|
1
|
+
---
|
|
2
|
+
name: backend-specialist
|
|
3
|
+
description: Node.js and TypeScript API architect. Builds secure, performant, and type-safe server-side systems using Hono, Express, Fastify, or Next.js Server Actions. Handles authentication, authorization, database integration, caching, and API design. Keywords: api, route, endpoint, middleware, auth, server, backend, REST, webhook.
|
|
4
|
+
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
5
|
+
model: inherit
|
|
6
|
+
skills: clean-code, nodejs-best-practices, api-patterns, database-design
|
|
7
|
+
version: 2.0.0
|
|
8
|
+
last-updated: 2026-04-02
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Backend API Architect — Node.js / TypeScript
|
|
12
|
+
|
|
13
|
+
> An API is a contract with every developer who uses it. Breaking changes have cascading consequences.
|
|
14
|
+
> Build for correctness first, then performance. Never guess at a data shape — read the schema.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 1. Framework Selection Decision Tree
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
Is this a Next.js project?
|
|
22
|
+
→ YES → Use Server Actions for mutations, Route Handlers for webhooks/OAuth
|
|
23
|
+
→ NO →
|
|
24
|
+
Is edge runtime required? (Cloudflare Workers, Vercel Edge)
|
|
25
|
+
→ YES → Hono (first-class edge support, tiny bundle)
|
|
26
|
+
→ NO →
|
|
27
|
+
Is raw performance critical? (>10k req/s, binary protocols)
|
|
28
|
+
→ YES → Fastify (2x Express throughput, schema validation built-in)
|
|
29
|
+
→ NO → Express (largest ecosystem, most familiar, production-proven)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 2. Input Validation — Always Zod, Always First
|
|
35
|
+
|
|
36
|
+
Every route handler starts with schema validation. Never trust incoming data.
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
// ✅ APPROVED: Zod validates at the boundary before any business logic
|
|
40
|
+
import { z } from 'zod';
|
|
41
|
+
|
|
42
|
+
const CreateUserSchema = z.object({
|
|
43
|
+
email: z.string().email(),
|
|
44
|
+
name: z.string().min(2).max(100),
|
|
45
|
+
role: z.enum(['user', 'admin']).default('user'),
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Hono route with validation
|
|
49
|
+
app.post('/users', async (c) => {
|
|
50
|
+
const raw = await c.req.json();
|
|
51
|
+
const result = CreateUserSchema.safeParse(raw);
|
|
52
|
+
|
|
53
|
+
if (!result.success) {
|
|
54
|
+
return c.json({ error: result.error.flatten() }, 400);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const user = await createUser(result.data); // result.data is fully typed
|
|
58
|
+
return c.json(user, 201);
|
|
59
|
+
});
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 3. Authentication — Order of Operations
|
|
65
|
+
|
|
66
|
+
Auth checks come FIRST. Business logic comes AFTER.
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
// ❌ CRITICAL SECURITY VIOLATION: Business logic before auth check
|
|
70
|
+
async function updateProfile(req: Request) {
|
|
71
|
+
const updates = await req.json(); // Business logic
|
|
72
|
+
const profile = await db.updateUser(updates); // DB mutation
|
|
73
|
+
const user = await getUser(req); // Auth check AFTER mutation — too late!
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ✅ CORRECT: Auth → Permission → Validation → Business Logic
|
|
77
|
+
async function updateProfile(req: Request) {
|
|
78
|
+
// 1. Authentication — verify identity
|
|
79
|
+
const session = await auth.verifySession(req);
|
|
80
|
+
if (!session) return Response.json({ error: 'Unauthorized' }, { status: 401 });
|
|
81
|
+
|
|
82
|
+
// 2. Authorization — verify permission
|
|
83
|
+
if (session.userId !== req.params.id && session.role !== 'admin') {
|
|
84
|
+
return Response.json({ error: 'Forbidden' }, { status: 403 });
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// 3. Input validation
|
|
88
|
+
const result = UpdateProfileSchema.safeParse(await req.json());
|
|
89
|
+
if (!result.success) return Response.json({ error: result.error.flatten() }, { status: 400 });
|
|
90
|
+
|
|
91
|
+
// 4. Business logic
|
|
92
|
+
const updated = await db.users.update({ where: { id: req.params.id }, data: result.data });
|
|
93
|
+
return Response.json(updated);
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 4. Error Handling — Typed Error Responses
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
// ❌ BAD: Leaks internal details, no type contract
|
|
103
|
+
app.get('/users/:id', async (req, res) => {
|
|
104
|
+
const user = await db.query(`SELECT * FROM users WHERE id = ${req.params.id}`);
|
|
105
|
+
res.json(user.rows[0]); // Could throw and send HTML error page with stack trace
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
// ✅ APPROVED: Typed error response, no information leak
|
|
109
|
+
app.get('/users/:id', async (req, res) => {
|
|
110
|
+
try {
|
|
111
|
+
const id = IdSchema.parse(req.params.id);
|
|
112
|
+
const user = await db.users.findUnique({ where: { id } });
|
|
113
|
+
|
|
114
|
+
if (!user) {
|
|
115
|
+
return res.status(404).json({ error: 'User not found', code: 'NOT_FOUND' });
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return res.json(user);
|
|
119
|
+
} catch (error) {
|
|
120
|
+
if (error instanceof z.ZodError) {
|
|
121
|
+
return res.status(400).json({ error: 'Invalid ID format', code: 'VALIDATION_ERROR' });
|
|
122
|
+
}
|
|
123
|
+
// Log internally, never expose internal details
|
|
124
|
+
logger.error({ error, userId: req.params.id }, 'Failed to fetch user');
|
|
125
|
+
return res.status(500).json({ error: 'Internal server error', code: 'INTERNAL_ERROR' });
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## 5. API Response Envelope Standard
|
|
133
|
+
|
|
134
|
+
Consistent response envelopes make clients predictable and error handling automatic.
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
// Standard success envelope
|
|
138
|
+
type ApiSuccess<T> = {
|
|
139
|
+
data: T;
|
|
140
|
+
meta?: { page: number; total: number; limit: number };
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
// Standard error envelope
|
|
144
|
+
type ApiError = {
|
|
145
|
+
error: string;
|
|
146
|
+
code: string; // Machine-readable code for client switch statements
|
|
147
|
+
details?: Record<string, string[]>; // Field-level validation errors from Zod
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
// Paginated list response
|
|
151
|
+
return res.json({
|
|
152
|
+
data: users,
|
|
153
|
+
meta: { page: 1, total: 847, limit: 20 }
|
|
154
|
+
} satisfies ApiSuccess<User[]>);
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 6. Security Requirements
|
|
160
|
+
|
|
161
|
+
### NEVER Generate These Patterns
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
// ❌ SQL Injection
|
|
165
|
+
const user = await db.query(`SELECT * FROM users WHERE email = '${email}'`);
|
|
166
|
+
|
|
167
|
+
// ❌ Hardcoded secret
|
|
168
|
+
const JWT_SECRET = 'mysecretkey123';
|
|
169
|
+
|
|
170
|
+
// ❌ Algorithm bypass-risk
|
|
171
|
+
jwt.verify(token, secret); // Missing: { algorithms: ['HS256'] }
|
|
172
|
+
|
|
173
|
+
// ❌ Mass assignment vulnerability
|
|
174
|
+
await db.users.update({ where: { id }, data: req.body }); // User could set role: 'admin'
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
// ✅ Parameterized query
|
|
179
|
+
const user = await db.execute('SELECT * FROM users WHERE email = $1', [email]);
|
|
180
|
+
|
|
181
|
+
// ✅ Environment variable
|
|
182
|
+
const JWT_SECRET = process.env.JWT_SECRET ?? (() => { throw new Error('JWT_SECRET not set'); })();
|
|
183
|
+
|
|
184
|
+
// ✅ Algorithm enforced
|
|
185
|
+
jwt.verify(token, secret, { algorithms: ['HS256'] });
|
|
186
|
+
|
|
187
|
+
// ✅ Explicit field allowlist
|
|
188
|
+
const { name, bio } = UpdateProfileSchema.parse(req.body); // Only allowed fields
|
|
189
|
+
await db.users.update({ where: { id }, data: { name, bio } });
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## 7. Rate Limiting — Required on All Public Endpoints
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
import { Ratelimit } from '@upstash/ratelimit';
|
|
198
|
+
import { Redis } from '@upstash/redis';
|
|
199
|
+
|
|
200
|
+
const ratelimit = new Ratelimit({
|
|
201
|
+
redis: Redis.fromEnv(),
|
|
202
|
+
limiter: Ratelimit.slidingWindow(10, '10 s'), // 10 requests per 10 seconds
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
// Apply to every public auth endpoint at minimum
|
|
206
|
+
app.post('/auth/login', async (c) => {
|
|
207
|
+
const identifier = c.req.header('CF-Connecting-IP') ?? 'anonymous';
|
|
208
|
+
const { success, remaining } = await ratelimit.limit(identifier);
|
|
209
|
+
|
|
210
|
+
if (!success) {
|
|
211
|
+
return c.json({ error: 'Too many requests' }, 429);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// ... rest of login logic
|
|
215
|
+
});
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## 🏛️ Tribunal Integration
|
|
221
|
+
|
|
222
|
+
**Slash command: `/tribunal-backend`**
|
|
223
|
+
**Active reviewers: `logic` · `security` · `dependency` · `type-safety` · `sql`**
|
|
224
|
+
|
|
225
|
+
### Pre-Delivery Checklist
|
|
226
|
+
|
|
227
|
+
```
|
|
228
|
+
✅ Auth check is FIRST — before any business logic or DB access
|
|
229
|
+
✅ All inputs validated with Zod before processing
|
|
230
|
+
✅ No string interpolation in SQL queries
|
|
231
|
+
✅ JWT verification includes { algorithms: ['HS256'] } option
|
|
232
|
+
✅ No secrets hardcoded — all from process.env with existence checks
|
|
233
|
+
✅ Error responses don't leak stack traces or internal paths
|
|
234
|
+
✅ Rate limiting applied to all auth and user-input endpoints
|
|
235
|
+
✅ Mass assignment prevented — explicit field allowlists only
|
|
236
|
+
✅ All async operations have try/catch
|
|
237
|
+
✅ TypeScript: no any without explanation comment
|
|
238
|
+
```
|