superkit-mcp-server 1.2.3 → 1.2.4
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/ARCHITECTURE.md +102 -102
- package/README.md +71 -71
- package/SUPERKIT.md +168 -168
- package/agents/code-archaeologist.md +106 -106
- package/agents/coder.md +90 -90
- package/agents/data-engineer.md +28 -28
- package/agents/devops-engineer.md +242 -242
- package/agents/git-manager.md +203 -203
- package/agents/orchestrator.md +420 -420
- package/agents/penetration-tester.md +188 -188
- package/agents/performance-optimizer.md +187 -187
- package/agents/planner.md +270 -270
- package/agents/qa-automation-engineer.md +103 -103
- package/agents/quant-developer.md +32 -32
- package/agents/reviewer.md +100 -100
- package/agents/scout.md +222 -222
- package/agents/tester.md +274 -274
- package/agents/ui-designer.md +208 -208
- package/build/tools/sessionManager.js +79 -10
- package/build/tools/todoTools.js +39 -39
- package/build/tools/validators/__tests__/apiSchema.test.js +23 -23
- package/build/tools/validators/__tests__/convertRules.test.js +5 -5
- package/build/tools/validators/__tests__/frontendDesign.test.js +12 -12
- package/build/tools/validators/__tests__/geoChecker.test.js +19 -19
- package/build/tools/validators/__tests__/mobileAudit.test.js +12 -12
- package/build/tools/validators/__tests__/reactPerformanceChecker.test.js +17 -17
- package/build/tools/validators/__tests__/securityScan.test.js +6 -6
- package/build/tools/validators/__tests__/seoChecker.test.js +16 -16
- package/build/tools/validators/__tests__/typeCoverage.test.js +14 -14
- package/commands/README.md +122 -122
- package/commands/ask.toml +72 -72
- package/commands/brainstorm.toml +119 -119
- package/commands/chat.toml +77 -77
- package/commands/code-preview.toml +37 -37
- package/commands/code.toml +28 -28
- package/commands/content.toml +200 -200
- package/commands/cook.toml +77 -77
- package/commands/copywrite.toml +131 -131
- package/commands/db.toml +192 -192
- package/commands/debug.toml +166 -166
- package/commands/design.toml +158 -158
- package/commands/dev-rules.toml +14 -14
- package/commands/do.toml +117 -117
- package/commands/doc-rules.toml +14 -14
- package/commands/docs.toml +148 -148
- package/commands/fix.toml +440 -440
- package/commands/fullstack.toml +175 -175
- package/commands/git.toml +235 -235
- package/commands/help.toml +84 -84
- package/commands/integrate.toml +127 -127
- package/commands/journal.toml +136 -136
- package/commands/kit-setup.toml +40 -40
- package/commands/mcp.toml +183 -183
- package/commands/orchestration.toml +15 -15
- package/commands/plan.toml +171 -171
- package/commands/pm.toml +148 -148
- package/commands/pr.toml +50 -50
- package/commands/project.toml +32 -32
- package/commands/research.toml +117 -117
- package/commands/review-pr.toml +63 -63
- package/commands/review.toml +190 -190
- package/commands/scout-ext.toml +97 -97
- package/commands/scout.toml +79 -79
- package/commands/screenshot.toml +65 -65
- package/commands/session.toml +102 -102
- package/commands/skill.toml +384 -384
- package/commands/status.toml +22 -22
- package/commands/team.toml +56 -56
- package/commands/test.toml +164 -164
- package/commands/ticket.toml +70 -70
- package/commands/use.toml +106 -106
- package/commands/video.toml +83 -83
- package/commands/watzup.toml +71 -71
- package/commands/workflow.toml +14 -14
- package/package.json +35 -35
- package/skills/meta/README.md +30 -30
- package/skills/meta/api-design/SKILL.md +134 -134
- package/skills/meta/code-review/SKILL.md +44 -44
- package/skills/meta/code-review/checklists/pre-merge.md +25 -25
- package/skills/meta/code-review/workflows/architecture-pass.md +26 -26
- package/skills/meta/code-review/workflows/performance-pass.md +27 -27
- package/skills/meta/code-review/workflows/security-pass.md +29 -29
- package/skills/meta/compound-docs/SKILL.md +133 -133
- package/skills/meta/debug/SKILL.md +40 -40
- package/skills/meta/debug/templates/bug-report.template.md +31 -31
- package/skills/meta/debug/workflows/reproduce-issue.md +20 -20
- package/skills/meta/docker/SKILL.md +126 -126
- package/skills/meta/examples/supabase/SKILL.md +46 -46
- package/skills/meta/examples/supabase/references/best-practices.md +319 -319
- package/skills/meta/examples/supabase/references/common-patterns.md +373 -373
- package/skills/meta/examples/supabase/templates/migration-template.sql +49 -49
- package/skills/meta/examples/supabase/templates/rls-policy-template.sql +77 -77
- package/skills/meta/examples/supabase/workflows/debugging.md +260 -260
- package/skills/meta/examples/supabase/workflows/migration-workflow.md +211 -211
- package/skills/meta/examples/supabase/workflows/rls-policies.md +244 -244
- package/skills/meta/examples/supabase/workflows/schema-design.md +321 -321
- package/skills/meta/file-todos/SKILL.md +88 -88
- package/skills/meta/mobile/SKILL.md +140 -140
- package/skills/meta/nextjs/SKILL.md +101 -101
- package/skills/meta/performance/SKILL.md +130 -130
- package/skills/meta/react-patterns/SKILL.md +83 -83
- package/skills/meta/security/SKILL.md +114 -114
- package/skills/meta/session-resume/SKILL.md +96 -96
- package/skills/meta/tailwind/SKILL.md +139 -139
- package/skills/meta/testing/SKILL.md +43 -43
- package/skills/meta/testing/references/vitest-patterns.md +45 -45
- package/skills/meta/testing/templates/component-test.template.tsx +37 -37
- package/skills/tech/alpha-vantage/SKILL.md +142 -142
- package/skills/tech/alpha-vantage/references/commodities.md +153 -153
- package/skills/tech/alpha-vantage/references/economic-indicators.md +158 -158
- package/skills/tech/alpha-vantage/references/forex-crypto.md +154 -154
- package/skills/tech/alpha-vantage/references/fundamentals.md +223 -223
- package/skills/tech/alpha-vantage/references/intelligence.md +138 -138
- package/skills/tech/alpha-vantage/references/options.md +93 -93
- package/skills/tech/alpha-vantage/references/technical-indicators.md +374 -374
- package/skills/tech/alpha-vantage/references/time-series.md +157 -157
- package/skills/tech/financial-modeling/SKILL.md +18 -18
- package/skills/tech/financial-modeling/skills/3-statements/SKILL.md +368 -368
- package/skills/tech/financial-modeling/skills/3-statements/references/formatting.md +118 -118
- package/skills/tech/financial-modeling/skills/3-statements/references/formulas.md +292 -292
- package/skills/tech/financial-modeling/skills/3-statements/references/sec-filings.md +125 -125
- package/skills/tech/financial-modeling/skills/dcf-model/SKILL.md +1210 -1210
- package/skills/tech/financial-modeling/skills/dcf-model/TROUBLESHOOTING.md +40 -40
- package/skills/tech/financial-modeling/skills/dcf-model/requirements.txt +8 -8
- package/skills/tech/financial-modeling/skills/dcf-model/scripts/validate_dcf.py +292 -292
- package/skills/tech/financial-modeling/skills/lbo-model/SKILL.md +236 -236
- package/skills/tech/financial-modeling/skills/merger-model/SKILL.md +108 -108
- package/skills/workflows/README.md +203 -203
- package/skills/workflows/adr.md +174 -174
- package/skills/workflows/changelog.md +74 -74
- package/skills/workflows/compound.md +323 -323
- package/skills/workflows/compound_health.md +74 -74
- package/skills/workflows/create-agent-skill.md +138 -138
- package/skills/workflows/cycle.md +144 -144
- package/skills/workflows/deploy-docs.md +84 -84
- package/skills/workflows/development-rules.md +42 -42
- package/skills/workflows/doc.md +95 -95
- package/skills/workflows/documentation-management.md +34 -34
- package/skills/workflows/explore.md +146 -146
- package/skills/workflows/generate_command.md +106 -106
- package/skills/workflows/heal-skill.md +97 -97
- package/skills/workflows/housekeeping.md +229 -229
- package/skills/workflows/kit-setup.md +102 -102
- package/skills/workflows/map-codebase.md +78 -78
- package/skills/workflows/orchestration-protocol.md +43 -43
- package/skills/workflows/plan-compound.md +439 -439
- package/skills/workflows/plan_review.md +269 -269
- package/skills/workflows/primary-workflow.md +37 -37
- package/skills/workflows/promote_pattern.md +86 -86
- package/skills/workflows/release-docs.md +82 -82
- package/skills/workflows/report-bug.md +135 -135
- package/skills/workflows/reproduce-bug.md +118 -118
- package/skills/workflows/resolve_pr.md +133 -133
- package/skills/workflows/resolve_todo.md +128 -128
- package/skills/workflows/review-compound.md +376 -376
- package/skills/workflows/skill-review.md +127 -127
- package/skills/workflows/specs.md +257 -257
- package/skills/workflows/triage-sprint.md +102 -102
- package/skills/workflows/triage.md +152 -152
- package/skills/workflows/work.md +399 -399
- package/skills/workflows/xcode-test.md +93 -93
|
@@ -1,321 +1,321 @@
|
|
|
1
|
-
# Database Schema Design
|
|
2
|
-
|
|
3
|
-
Best practices for designing Supabase database schemas in [PROJECT_NAME].
|
|
4
|
-
|
|
5
|
-
## When To Use
|
|
6
|
-
|
|
7
|
-
- Designing new features with database requirements
|
|
8
|
-
- Planning data model for new functionality
|
|
9
|
-
- Refactoring existing schema
|
|
10
|
-
- Reviewing schema design decisions
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Design Principles
|
|
15
|
-
|
|
16
|
-
### 1. Normalize Data (Usually)
|
|
17
|
-
|
|
18
|
-
**Good schema:**
|
|
19
|
-
```sql
|
|
20
|
-
-- Separate tables with clear relationships
|
|
21
|
-
CREATE TABLE users (
|
|
22
|
-
id UUID PRIMARY KEY,
|
|
23
|
-
email TEXT UNIQUE NOT NULL
|
|
24
|
-
);
|
|
25
|
-
|
|
26
|
-
CREATE TABLE profiles (
|
|
27
|
-
id UUID PRIMARY KEY REFERENCES users(id),
|
|
28
|
-
investor_code TEXT UNIQUE,
|
|
29
|
-
role app_role NOT NULL
|
|
30
|
-
);
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
**Avoid:**
|
|
34
|
-
```sql
|
|
35
|
-
-- Denormalized with repeated data
|
|
36
|
-
CREATE TABLE users (
|
|
37
|
-
id UUID PRIMARY KEY,
|
|
38
|
-
email TEXT,
|
|
39
|
-
profile_investor_code TEXT,
|
|
40
|
-
profile_role TEXT,
|
|
41
|
-
profile_mfa_enabled BOOLEAN,
|
|
42
|
-
-- ... many profile fields
|
|
43
|
-
);
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
**When to denormalize:**
|
|
47
|
-
- Read-heavy tables with expensive joins
|
|
48
|
-
- Reporting tables (create views)
|
|
49
|
-
- Calculated fields updated via triggers
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
### 2. Use Foreign Keys
|
|
54
|
-
|
|
55
|
-
**Always include:**
|
|
56
|
-
```sql
|
|
57
|
-
CREATE TABLE transactions (
|
|
58
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
59
|
-
fund_id UUID NOT NULL REFERENCES funds(id) ON DELETE CASCADE,
|
|
60
|
-
investor_id UUID NOT NULL REFERENCES profiles(id) ON DELETE RESTRICT,
|
|
61
|
-
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
62
|
-
);
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
**ON DELETE actions:**
|
|
66
|
-
- `CASCADE`: Delete children when parent deleted (ownership)
|
|
67
|
-
- `RESTRICT`: Prevent deletion if children exist (safeguard)
|
|
68
|
-
- `SET NULL`: Orphan children (rarely used)
|
|
69
|
-
|
|
70
|
-
---
|
|
71
|
-
|
|
72
|
-
### 3. Add Timestamps
|
|
73
|
-
|
|
74
|
-
**Standard pattern:**
|
|
75
|
-
```sql
|
|
76
|
-
CREATE TABLE table_name (
|
|
77
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
78
|
-
-- ... other columns
|
|
79
|
-
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
80
|
-
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
81
|
-
);
|
|
82
|
-
|
|
83
|
-
-- Trigger for updated_at
|
|
84
|
-
CREATE TRIGGER update_table_updated_at
|
|
85
|
-
BEFORE UPDATE ON table_name
|
|
86
|
-
FOR EACH ROW
|
|
87
|
-
EXECUTE FUNCTION public.update_updated_at_column();
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
---
|
|
91
|
-
|
|
92
|
-
### 4. Use Appropriate Types
|
|
93
|
-
|
|
94
|
-
**Common types:**
|
|
95
|
-
|
|
96
|
-
| Use Case | Type | Example |
|
|
97
|
-
|----------|------|---------|
|
|
98
|
-
| UUID | `UUID` | User IDs, primary keys |
|
|
99
|
-
| Money | `NUMERIC(12,2)` | Prices, amounts |
|
|
100
|
-
| Enum | `CREATE TYPE` | Status, role |
|
|
101
|
-
| Timestamp | `TIMESTAMPTZ` | Dates with timezone |
|
|
102
|
-
| Boolean | `BOOLEAN` | Flags |
|
|
103
|
-
| IP Address | `INET` | Login IPs |
|
|
104
|
-
| JSON | `JSONB` | Flexible data |
|
|
105
|
-
|
|
106
|
-
**Avoid:**
|
|
107
|
-
- `TEXT` for numbers (use `NUMERIC`)
|
|
108
|
-
- `VARCHAR(N)` (use `TEXT` with CHECK constraint if needed)
|
|
109
|
-
- `TIMESTAMP` without TZ (use `TIMESTAMPTZ`)
|
|
110
|
-
- Raw strings for enums (create `TYPE`)
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
### 5. Create Indexes
|
|
115
|
-
|
|
116
|
-
**Index these:**
|
|
117
|
-
- Foreign keys
|
|
118
|
-
- Columns in WHERE clauses
|
|
119
|
-
- Columns in JOIN conditions
|
|
120
|
-
- Columns in ORDER BY
|
|
121
|
-
- Unique constraints
|
|
122
|
-
|
|
123
|
-
**Example:**
|
|
124
|
-
```sql
|
|
125
|
-
-- Foreign key index
|
|
126
|
-
CREATE INDEX IF NOT EXISTS idx_transactions_fund_id
|
|
127
|
-
ON transactions (fund_id);
|
|
128
|
-
|
|
129
|
-
-- Composite index for common query
|
|
130
|
-
CREATE INDEX IF NOT EXISTS idx_transactions_fund_date
|
|
131
|
-
ON transactions (fund_id, created_at DESC);
|
|
132
|
-
|
|
133
|
-
-- Unique constraint
|
|
134
|
-
CREATE UNIQUE INDEX IF NOT EXISTS idx_profiles_investor_code
|
|
135
|
-
ON profiles (investor_code) WHERE investor_code IS NOT NULL;
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
### 6. Enable RLS by Default
|
|
141
|
-
|
|
142
|
-
**On all tables with sensitive data:**
|
|
143
|
-
```sql
|
|
144
|
-
CREATE TABLE sensitive_table (...);
|
|
145
|
-
|
|
146
|
-
-- Immediately enable RLS
|
|
147
|
-
ALTER TABLE sensitive_table ENABLE ROW LEVEL SECURITY;
|
|
148
|
-
|
|
149
|
-
-- Add appropriate policies
|
|
150
|
-
CREATE POLICY "Users see own data"
|
|
151
|
-
ON sensitive_table FOR SELECT TO authenticated
|
|
152
|
-
USING (user_id = auth.uid());
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
**See:** `workflows/rls-policies.md` for policy patterns
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
### 7. Add Documentation
|
|
160
|
-
|
|
161
|
-
**Document schema decisions:**
|
|
162
|
-
```sql
|
|
163
|
-
COMMENT ON TABLE transactions IS
|
|
164
|
-
'Financial transactions between investors and funds. All amounts in USD.';
|
|
165
|
-
|
|
166
|
-
COMMENT ON COLUMN transactions.amount IS
|
|
167
|
-
'Transaction amount in USD. Positive for investments, negative for redemptions.';
|
|
168
|
-
|
|
169
|
-
COMMENT ON COLUMN transactions.status IS
|
|
170
|
-
'Status: pending (awaiting approval), approved (processed), rejected (denied)';
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
---
|
|
174
|
-
|
|
175
|
-
## Schema Review Checklist
|
|
176
|
-
|
|
177
|
-
Before creating migration:
|
|
178
|
-
|
|
179
|
-
**Tables:**
|
|
180
|
-
- [ ] Table name plural and lowercase? (`users`, not `User`)
|
|
181
|
-
- [ ] Primary key UUID with `gen_random_uuid()`?
|
|
182
|
-
- [ ] Foreign keys with appropriate ON DELETE?
|
|
183
|
-
- [ ] `created_at` and `updated_at` timestamps?
|
|
184
|
-
- [ ] RLS enabled on sensitive tables?
|
|
185
|
-
|
|
186
|
-
**Columns:**
|
|
187
|
-
- [ ] Appropriate data types?
|
|
188
|
-
- [ ] NOT NULL where required?
|
|
189
|
-
- [ ] DEFAULT values where sensible?
|
|
190
|
-
- [ ] Unique constraints where needed?
|
|
191
|
-
|
|
192
|
-
**Performance:**
|
|
193
|
-
- [ ] Indexes on foreign keys?
|
|
194
|
-
- [ ] Indexes on frequently queried columns?
|
|
195
|
-
- [ ] Composite indexes for multi-column queries?
|
|
196
|
-
|
|
197
|
-
**Security:**
|
|
198
|
-
- [ ] RLS policies cover all operations?
|
|
199
|
-
- [ ] Sensitive data properly protected?
|
|
200
|
-
- [ ] No PII in logs or comments?
|
|
201
|
-
|
|
202
|
-
**Documentation:**
|
|
203
|
-
- [ ] Table purpose documented?
|
|
204
|
-
- [ ] Complex columns explained?
|
|
205
|
-
- [ ] Migration header complete?
|
|
206
|
-
|
|
207
|
-
---
|
|
208
|
-
|
|
209
|
-
## [PROJECT_NAME] Patterns
|
|
210
|
-
|
|
211
|
-
### Multi-Fund Architecture
|
|
212
|
-
|
|
213
|
-
```sql
|
|
214
|
-
-- Funds are first-class entities
|
|
215
|
-
CREATE TABLE funds (
|
|
216
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
217
|
-
name TEXT NOT NULL,
|
|
218
|
-
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
219
|
-
);
|
|
220
|
-
|
|
221
|
-
-- Many entities reference fund_id
|
|
222
|
-
CREATE TABLE transactions (
|
|
223
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
224
|
-
fund_id UUID NOT NULL REFERENCES funds(id) ON DELETE CASCADE,
|
|
225
|
-
-- ... other columns
|
|
226
|
-
);
|
|
227
|
-
|
|
228
|
-
-- RLS enforces fund-level isolation
|
|
229
|
-
CREATE POLICY "Users see own fund data"
|
|
230
|
-
ON transactions FOR SELECT TO authenticated
|
|
231
|
-
USING (
|
|
232
|
-
fund_id IN (
|
|
233
|
-
SELECT fund_id FROM user_fund_access
|
|
234
|
-
WHERE user_id = auth.uid()
|
|
235
|
-
)
|
|
236
|
-
);
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
### Audit Logging
|
|
240
|
-
|
|
241
|
-
```sql
|
|
242
|
-
-- Audit trail for sensitive operations
|
|
243
|
-
CREATE TABLE audit_events (
|
|
244
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
245
|
-
event_type TEXT NOT NULL,
|
|
246
|
-
actor_id UUID REFERENCES profiles(id),
|
|
247
|
-
resource_type TEXT NOT NULL,
|
|
248
|
-
resource_id UUID NOT NULL,
|
|
249
|
-
metadata JSONB,
|
|
250
|
-
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
251
|
-
);
|
|
252
|
-
|
|
253
|
-
-- Index for querying by resource
|
|
254
|
-
CREATE INDEX idx_audit_events_resource
|
|
255
|
-
ON audit_events (resource_type, resource_id);
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
### Soft Deletes (When Needed)
|
|
259
|
-
|
|
260
|
-
```sql
|
|
261
|
-
-- For records that must be preserved
|
|
262
|
-
CREATE TABLE important_records (
|
|
263
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
264
|
-
deleted_at TIMESTAMPTZ,
|
|
265
|
-
-- ... other columns
|
|
266
|
-
);
|
|
267
|
-
|
|
268
|
-
-- Query helper
|
|
269
|
-
CREATE VIEW active_records AS
|
|
270
|
-
SELECT * FROM important_records
|
|
271
|
-
WHERE deleted_at IS NULL;
|
|
272
|
-
|
|
273
|
-
-- RLS excludes soft-deleted
|
|
274
|
-
CREATE POLICY "Users see active records"
|
|
275
|
-
ON important_records FOR SELECT TO authenticated
|
|
276
|
-
USING (deleted_at IS NULL AND user_id = auth.uid());
|
|
277
|
-
```
|
|
278
|
-
|
|
279
|
-
---
|
|
280
|
-
|
|
281
|
-
## Anti-Patterns
|
|
282
|
-
|
|
283
|
-
### ❌ Missing Foreign Key Constraints
|
|
284
|
-
|
|
285
|
-
Results in orphaned data and data integrity issues.
|
|
286
|
-
|
|
287
|
-
### ❌ Generic JSONB Fields
|
|
288
|
-
|
|
289
|
-
```sql
|
|
290
|
-
-- BAD: Everything in JSON
|
|
291
|
-
CREATE TABLE entities (
|
|
292
|
-
id UUID PRIMARY KEY,
|
|
293
|
-
data JSONB -- Contains everything
|
|
294
|
-
);
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
Use structured columns for queryable data. Reserve JSONB for truly flexible metadata.
|
|
298
|
-
|
|
299
|
-
### ❌ No Indexes on Foreign Keys
|
|
300
|
-
|
|
301
|
-
Results in full table scans on JOINs.
|
|
302
|
-
|
|
303
|
-
### ❌ Timestamps Without Timezone
|
|
304
|
-
|
|
305
|
-
```sql
|
|
306
|
-
-- BAD
|
|
307
|
-
created_at TIMESTAMP
|
|
308
|
-
|
|
309
|
-
-- GOOD
|
|
310
|
-
created_at TIMESTAMPTZ
|
|
311
|
-
```
|
|
312
|
-
|
|
313
|
-
---
|
|
314
|
-
|
|
315
|
-
## Expected Output
|
|
316
|
-
|
|
317
|
-
✅ Well-designed schema following [PROJECT_NAME] patterns
|
|
318
|
-
✅ Proper constraints and indexes
|
|
319
|
-
✅ RLS policies designed
|
|
320
|
-
✅ Migration ready to create
|
|
321
|
-
✅ Schema documented
|
|
1
|
+
# Database Schema Design
|
|
2
|
+
|
|
3
|
+
Best practices for designing Supabase database schemas in [PROJECT_NAME].
|
|
4
|
+
|
|
5
|
+
## When To Use
|
|
6
|
+
|
|
7
|
+
- Designing new features with database requirements
|
|
8
|
+
- Planning data model for new functionality
|
|
9
|
+
- Refactoring existing schema
|
|
10
|
+
- Reviewing schema design decisions
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Design Principles
|
|
15
|
+
|
|
16
|
+
### 1. Normalize Data (Usually)
|
|
17
|
+
|
|
18
|
+
**Good schema:**
|
|
19
|
+
```sql
|
|
20
|
+
-- Separate tables with clear relationships
|
|
21
|
+
CREATE TABLE users (
|
|
22
|
+
id UUID PRIMARY KEY,
|
|
23
|
+
email TEXT UNIQUE NOT NULL
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
CREATE TABLE profiles (
|
|
27
|
+
id UUID PRIMARY KEY REFERENCES users(id),
|
|
28
|
+
investor_code TEXT UNIQUE,
|
|
29
|
+
role app_role NOT NULL
|
|
30
|
+
);
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Avoid:**
|
|
34
|
+
```sql
|
|
35
|
+
-- Denormalized with repeated data
|
|
36
|
+
CREATE TABLE users (
|
|
37
|
+
id UUID PRIMARY KEY,
|
|
38
|
+
email TEXT,
|
|
39
|
+
profile_investor_code TEXT,
|
|
40
|
+
profile_role TEXT,
|
|
41
|
+
profile_mfa_enabled BOOLEAN,
|
|
42
|
+
-- ... many profile fields
|
|
43
|
+
);
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**When to denormalize:**
|
|
47
|
+
- Read-heavy tables with expensive joins
|
|
48
|
+
- Reporting tables (create views)
|
|
49
|
+
- Calculated fields updated via triggers
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
### 2. Use Foreign Keys
|
|
54
|
+
|
|
55
|
+
**Always include:**
|
|
56
|
+
```sql
|
|
57
|
+
CREATE TABLE transactions (
|
|
58
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
59
|
+
fund_id UUID NOT NULL REFERENCES funds(id) ON DELETE CASCADE,
|
|
60
|
+
investor_id UUID NOT NULL REFERENCES profiles(id) ON DELETE RESTRICT,
|
|
61
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
62
|
+
);
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**ON DELETE actions:**
|
|
66
|
+
- `CASCADE`: Delete children when parent deleted (ownership)
|
|
67
|
+
- `RESTRICT`: Prevent deletion if children exist (safeguard)
|
|
68
|
+
- `SET NULL`: Orphan children (rarely used)
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
### 3. Add Timestamps
|
|
73
|
+
|
|
74
|
+
**Standard pattern:**
|
|
75
|
+
```sql
|
|
76
|
+
CREATE TABLE table_name (
|
|
77
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
78
|
+
-- ... other columns
|
|
79
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
80
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
-- Trigger for updated_at
|
|
84
|
+
CREATE TRIGGER update_table_updated_at
|
|
85
|
+
BEFORE UPDATE ON table_name
|
|
86
|
+
FOR EACH ROW
|
|
87
|
+
EXECUTE FUNCTION public.update_updated_at_column();
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
### 4. Use Appropriate Types
|
|
93
|
+
|
|
94
|
+
**Common types:**
|
|
95
|
+
|
|
96
|
+
| Use Case | Type | Example |
|
|
97
|
+
|----------|------|---------|
|
|
98
|
+
| UUID | `UUID` | User IDs, primary keys |
|
|
99
|
+
| Money | `NUMERIC(12,2)` | Prices, amounts |
|
|
100
|
+
| Enum | `CREATE TYPE` | Status, role |
|
|
101
|
+
| Timestamp | `TIMESTAMPTZ` | Dates with timezone |
|
|
102
|
+
| Boolean | `BOOLEAN` | Flags |
|
|
103
|
+
| IP Address | `INET` | Login IPs |
|
|
104
|
+
| JSON | `JSONB` | Flexible data |
|
|
105
|
+
|
|
106
|
+
**Avoid:**
|
|
107
|
+
- `TEXT` for numbers (use `NUMERIC`)
|
|
108
|
+
- `VARCHAR(N)` (use `TEXT` with CHECK constraint if needed)
|
|
109
|
+
- `TIMESTAMP` without TZ (use `TIMESTAMPTZ`)
|
|
110
|
+
- Raw strings for enums (create `TYPE`)
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
### 5. Create Indexes
|
|
115
|
+
|
|
116
|
+
**Index these:**
|
|
117
|
+
- Foreign keys
|
|
118
|
+
- Columns in WHERE clauses
|
|
119
|
+
- Columns in JOIN conditions
|
|
120
|
+
- Columns in ORDER BY
|
|
121
|
+
- Unique constraints
|
|
122
|
+
|
|
123
|
+
**Example:**
|
|
124
|
+
```sql
|
|
125
|
+
-- Foreign key index
|
|
126
|
+
CREATE INDEX IF NOT EXISTS idx_transactions_fund_id
|
|
127
|
+
ON transactions (fund_id);
|
|
128
|
+
|
|
129
|
+
-- Composite index for common query
|
|
130
|
+
CREATE INDEX IF NOT EXISTS idx_transactions_fund_date
|
|
131
|
+
ON transactions (fund_id, created_at DESC);
|
|
132
|
+
|
|
133
|
+
-- Unique constraint
|
|
134
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_profiles_investor_code
|
|
135
|
+
ON profiles (investor_code) WHERE investor_code IS NOT NULL;
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
### 6. Enable RLS by Default
|
|
141
|
+
|
|
142
|
+
**On all tables with sensitive data:**
|
|
143
|
+
```sql
|
|
144
|
+
CREATE TABLE sensitive_table (...);
|
|
145
|
+
|
|
146
|
+
-- Immediately enable RLS
|
|
147
|
+
ALTER TABLE sensitive_table ENABLE ROW LEVEL SECURITY;
|
|
148
|
+
|
|
149
|
+
-- Add appropriate policies
|
|
150
|
+
CREATE POLICY "Users see own data"
|
|
151
|
+
ON sensitive_table FOR SELECT TO authenticated
|
|
152
|
+
USING (user_id = auth.uid());
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**See:** `workflows/rls-policies.md` for policy patterns
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
### 7. Add Documentation
|
|
160
|
+
|
|
161
|
+
**Document schema decisions:**
|
|
162
|
+
```sql
|
|
163
|
+
COMMENT ON TABLE transactions IS
|
|
164
|
+
'Financial transactions between investors and funds. All amounts in USD.';
|
|
165
|
+
|
|
166
|
+
COMMENT ON COLUMN transactions.amount IS
|
|
167
|
+
'Transaction amount in USD. Positive for investments, negative for redemptions.';
|
|
168
|
+
|
|
169
|
+
COMMENT ON COLUMN transactions.status IS
|
|
170
|
+
'Status: pending (awaiting approval), approved (processed), rejected (denied)';
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## Schema Review Checklist
|
|
176
|
+
|
|
177
|
+
Before creating migration:
|
|
178
|
+
|
|
179
|
+
**Tables:**
|
|
180
|
+
- [ ] Table name plural and lowercase? (`users`, not `User`)
|
|
181
|
+
- [ ] Primary key UUID with `gen_random_uuid()`?
|
|
182
|
+
- [ ] Foreign keys with appropriate ON DELETE?
|
|
183
|
+
- [ ] `created_at` and `updated_at` timestamps?
|
|
184
|
+
- [ ] RLS enabled on sensitive tables?
|
|
185
|
+
|
|
186
|
+
**Columns:**
|
|
187
|
+
- [ ] Appropriate data types?
|
|
188
|
+
- [ ] NOT NULL where required?
|
|
189
|
+
- [ ] DEFAULT values where sensible?
|
|
190
|
+
- [ ] Unique constraints where needed?
|
|
191
|
+
|
|
192
|
+
**Performance:**
|
|
193
|
+
- [ ] Indexes on foreign keys?
|
|
194
|
+
- [ ] Indexes on frequently queried columns?
|
|
195
|
+
- [ ] Composite indexes for multi-column queries?
|
|
196
|
+
|
|
197
|
+
**Security:**
|
|
198
|
+
- [ ] RLS policies cover all operations?
|
|
199
|
+
- [ ] Sensitive data properly protected?
|
|
200
|
+
- [ ] No PII in logs or comments?
|
|
201
|
+
|
|
202
|
+
**Documentation:**
|
|
203
|
+
- [ ] Table purpose documented?
|
|
204
|
+
- [ ] Complex columns explained?
|
|
205
|
+
- [ ] Migration header complete?
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## [PROJECT_NAME] Patterns
|
|
210
|
+
|
|
211
|
+
### Multi-Fund Architecture
|
|
212
|
+
|
|
213
|
+
```sql
|
|
214
|
+
-- Funds are first-class entities
|
|
215
|
+
CREATE TABLE funds (
|
|
216
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
217
|
+
name TEXT NOT NULL,
|
|
218
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
219
|
+
);
|
|
220
|
+
|
|
221
|
+
-- Many entities reference fund_id
|
|
222
|
+
CREATE TABLE transactions (
|
|
223
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
224
|
+
fund_id UUID NOT NULL REFERENCES funds(id) ON DELETE CASCADE,
|
|
225
|
+
-- ... other columns
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
-- RLS enforces fund-level isolation
|
|
229
|
+
CREATE POLICY "Users see own fund data"
|
|
230
|
+
ON transactions FOR SELECT TO authenticated
|
|
231
|
+
USING (
|
|
232
|
+
fund_id IN (
|
|
233
|
+
SELECT fund_id FROM user_fund_access
|
|
234
|
+
WHERE user_id = auth.uid()
|
|
235
|
+
)
|
|
236
|
+
);
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Audit Logging
|
|
240
|
+
|
|
241
|
+
```sql
|
|
242
|
+
-- Audit trail for sensitive operations
|
|
243
|
+
CREATE TABLE audit_events (
|
|
244
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
245
|
+
event_type TEXT NOT NULL,
|
|
246
|
+
actor_id UUID REFERENCES profiles(id),
|
|
247
|
+
resource_type TEXT NOT NULL,
|
|
248
|
+
resource_id UUID NOT NULL,
|
|
249
|
+
metadata JSONB,
|
|
250
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
251
|
+
);
|
|
252
|
+
|
|
253
|
+
-- Index for querying by resource
|
|
254
|
+
CREATE INDEX idx_audit_events_resource
|
|
255
|
+
ON audit_events (resource_type, resource_id);
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Soft Deletes (When Needed)
|
|
259
|
+
|
|
260
|
+
```sql
|
|
261
|
+
-- For records that must be preserved
|
|
262
|
+
CREATE TABLE important_records (
|
|
263
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
264
|
+
deleted_at TIMESTAMPTZ,
|
|
265
|
+
-- ... other columns
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
-- Query helper
|
|
269
|
+
CREATE VIEW active_records AS
|
|
270
|
+
SELECT * FROM important_records
|
|
271
|
+
WHERE deleted_at IS NULL;
|
|
272
|
+
|
|
273
|
+
-- RLS excludes soft-deleted
|
|
274
|
+
CREATE POLICY "Users see active records"
|
|
275
|
+
ON important_records FOR SELECT TO authenticated
|
|
276
|
+
USING (deleted_at IS NULL AND user_id = auth.uid());
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## Anti-Patterns
|
|
282
|
+
|
|
283
|
+
### ❌ Missing Foreign Key Constraints
|
|
284
|
+
|
|
285
|
+
Results in orphaned data and data integrity issues.
|
|
286
|
+
|
|
287
|
+
### ❌ Generic JSONB Fields
|
|
288
|
+
|
|
289
|
+
```sql
|
|
290
|
+
-- BAD: Everything in JSON
|
|
291
|
+
CREATE TABLE entities (
|
|
292
|
+
id UUID PRIMARY KEY,
|
|
293
|
+
data JSONB -- Contains everything
|
|
294
|
+
);
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
Use structured columns for queryable data. Reserve JSONB for truly flexible metadata.
|
|
298
|
+
|
|
299
|
+
### ❌ No Indexes on Foreign Keys
|
|
300
|
+
|
|
301
|
+
Results in full table scans on JOINs.
|
|
302
|
+
|
|
303
|
+
### ❌ Timestamps Without Timezone
|
|
304
|
+
|
|
305
|
+
```sql
|
|
306
|
+
-- BAD
|
|
307
|
+
created_at TIMESTAMP
|
|
308
|
+
|
|
309
|
+
-- GOOD
|
|
310
|
+
created_at TIMESTAMPTZ
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## Expected Output
|
|
316
|
+
|
|
317
|
+
✅ Well-designed schema following [PROJECT_NAME] patterns
|
|
318
|
+
✅ Proper constraints and indexes
|
|
319
|
+
✅ RLS policies designed
|
|
320
|
+
✅ Migration ready to create
|
|
321
|
+
✅ Schema documented
|