superkit-mcp-server 1.1.4 → 1.2.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.
Files changed (160) hide show
  1. package/ARCHITECTURE.md +102 -102
  2. package/README.md +71 -71
  3. package/SUPERKIT.md +168 -168
  4. package/agents/code-archaeologist.md +106 -106
  5. package/agents/coder.md +90 -90
  6. package/agents/data-engineer.md +28 -28
  7. package/agents/devops-engineer.md +242 -242
  8. package/agents/git-manager.md +203 -203
  9. package/agents/orchestrator.md +420 -420
  10. package/agents/penetration-tester.md +188 -188
  11. package/agents/performance-optimizer.md +187 -187
  12. package/agents/planner.md +270 -270
  13. package/agents/qa-automation-engineer.md +103 -103
  14. package/agents/quant-developer.md +32 -32
  15. package/agents/reviewer.md +100 -100
  16. package/agents/scout.md +222 -222
  17. package/agents/tester.md +274 -274
  18. package/agents/ui-designer.md +208 -208
  19. package/build/tools/todoTools.js +39 -39
  20. package/build/tools/validators/__tests__/apiSchema.test.js +23 -23
  21. package/build/tools/validators/__tests__/convertRules.test.js +5 -5
  22. package/build/tools/validators/__tests__/frontendDesign.test.js +12 -12
  23. package/build/tools/validators/__tests__/geoChecker.test.js +19 -19
  24. package/build/tools/validators/__tests__/mobileAudit.test.js +12 -12
  25. package/build/tools/validators/__tests__/reactPerformanceChecker.test.js +17 -17
  26. package/build/tools/validators/__tests__/securityScan.test.js +6 -6
  27. package/build/tools/validators/__tests__/seoChecker.test.js +16 -16
  28. package/build/tools/validators/__tests__/typeCoverage.test.js +14 -14
  29. package/commands/README.md +122 -122
  30. package/commands/ask.toml +72 -72
  31. package/commands/brainstorm.toml +119 -119
  32. package/commands/chat.toml +73 -73
  33. package/commands/code-preview.toml +37 -37
  34. package/commands/code.toml +28 -28
  35. package/commands/content.toml +200 -200
  36. package/commands/cook.toml +77 -77
  37. package/commands/copywrite.toml +131 -131
  38. package/commands/db.toml +192 -192
  39. package/commands/debug.toml +166 -166
  40. package/commands/design.toml +158 -158
  41. package/commands/dev-rules.toml +14 -14
  42. package/commands/do.toml +117 -117
  43. package/commands/doc-rules.toml +14 -14
  44. package/commands/docs.toml +148 -148
  45. package/commands/fix.toml +440 -440
  46. package/commands/fullstack.toml +175 -175
  47. package/commands/git.toml +235 -235
  48. package/commands/help.toml +84 -84
  49. package/commands/integrate.toml +127 -127
  50. package/commands/journal.toml +136 -136
  51. package/commands/kit-setup.toml +40 -40
  52. package/commands/mcp.toml +183 -183
  53. package/commands/orchestration.toml +15 -15
  54. package/commands/plan.toml +171 -171
  55. package/commands/pm.toml +148 -148
  56. package/commands/pr.toml +50 -50
  57. package/commands/project.toml +32 -32
  58. package/commands/research.toml +117 -117
  59. package/commands/review-pr.toml +63 -63
  60. package/commands/review.toml +190 -190
  61. package/commands/scout-ext.toml +97 -97
  62. package/commands/scout.toml +79 -79
  63. package/commands/screenshot.toml +65 -65
  64. package/commands/session.toml +98 -98
  65. package/commands/skill.toml +384 -384
  66. package/commands/status.toml +22 -22
  67. package/commands/team.toml +56 -56
  68. package/commands/test.toml +164 -164
  69. package/commands/ticket.toml +70 -70
  70. package/commands/use.toml +106 -106
  71. package/commands/video.toml +83 -83
  72. package/commands/watzup.toml +71 -71
  73. package/commands/workflow.toml +14 -14
  74. package/package.json +35 -35
  75. package/skills/meta/README.md +30 -30
  76. package/skills/meta/api-design/SKILL.md +134 -134
  77. package/skills/meta/code-review/SKILL.md +44 -44
  78. package/skills/meta/code-review/checklists/pre-merge.md +25 -25
  79. package/skills/meta/code-review/workflows/architecture-pass.md +26 -26
  80. package/skills/meta/code-review/workflows/performance-pass.md +27 -27
  81. package/skills/meta/code-review/workflows/security-pass.md +29 -29
  82. package/skills/meta/compound-docs/SKILL.md +133 -133
  83. package/skills/meta/debug/SKILL.md +40 -40
  84. package/skills/meta/debug/templates/bug-report.template.md +31 -31
  85. package/skills/meta/debug/workflows/reproduce-issue.md +20 -20
  86. package/skills/meta/docker/SKILL.md +126 -126
  87. package/skills/meta/examples/supabase/SKILL.md +46 -46
  88. package/skills/meta/examples/supabase/references/best-practices.md +319 -319
  89. package/skills/meta/examples/supabase/references/common-patterns.md +373 -373
  90. package/skills/meta/examples/supabase/templates/migration-template.sql +49 -49
  91. package/skills/meta/examples/supabase/templates/rls-policy-template.sql +77 -77
  92. package/skills/meta/examples/supabase/workflows/debugging.md +260 -260
  93. package/skills/meta/examples/supabase/workflows/migration-workflow.md +211 -211
  94. package/skills/meta/examples/supabase/workflows/rls-policies.md +244 -244
  95. package/skills/meta/examples/supabase/workflows/schema-design.md +321 -321
  96. package/skills/meta/file-todos/SKILL.md +88 -88
  97. package/skills/meta/mobile/SKILL.md +140 -140
  98. package/skills/meta/nextjs/SKILL.md +101 -101
  99. package/skills/meta/performance/SKILL.md +130 -130
  100. package/skills/meta/react-patterns/SKILL.md +83 -83
  101. package/skills/meta/security/SKILL.md +114 -114
  102. package/skills/meta/session-resume/SKILL.md +96 -96
  103. package/skills/meta/tailwind/SKILL.md +139 -139
  104. package/skills/meta/testing/SKILL.md +43 -43
  105. package/skills/meta/testing/references/vitest-patterns.md +45 -45
  106. package/skills/meta/testing/templates/component-test.template.tsx +37 -37
  107. package/skills/tech/alpha-vantage/SKILL.md +142 -142
  108. package/skills/tech/alpha-vantage/references/commodities.md +153 -153
  109. package/skills/tech/alpha-vantage/references/economic-indicators.md +158 -158
  110. package/skills/tech/alpha-vantage/references/forex-crypto.md +154 -154
  111. package/skills/tech/alpha-vantage/references/fundamentals.md +223 -223
  112. package/skills/tech/alpha-vantage/references/intelligence.md +138 -138
  113. package/skills/tech/alpha-vantage/references/options.md +93 -93
  114. package/skills/tech/alpha-vantage/references/technical-indicators.md +374 -374
  115. package/skills/tech/alpha-vantage/references/time-series.md +157 -157
  116. package/skills/tech/financial-modeling/SKILL.md +18 -18
  117. package/skills/tech/financial-modeling/skills/3-statements/SKILL.md +368 -368
  118. package/skills/tech/financial-modeling/skills/3-statements/references/formatting.md +118 -118
  119. package/skills/tech/financial-modeling/skills/3-statements/references/formulas.md +292 -292
  120. package/skills/tech/financial-modeling/skills/3-statements/references/sec-filings.md +125 -125
  121. package/skills/tech/financial-modeling/skills/dcf-model/SKILL.md +1210 -1210
  122. package/skills/tech/financial-modeling/skills/dcf-model/TROUBLESHOOTING.md +40 -40
  123. package/skills/tech/financial-modeling/skills/dcf-model/requirements.txt +8 -8
  124. package/skills/tech/financial-modeling/skills/dcf-model/scripts/validate_dcf.py +292 -292
  125. package/skills/tech/financial-modeling/skills/lbo-model/SKILL.md +236 -236
  126. package/skills/tech/financial-modeling/skills/merger-model/SKILL.md +108 -108
  127. package/skills/workflows/README.md +203 -203
  128. package/skills/workflows/adr.md +174 -174
  129. package/skills/workflows/changelog.md +74 -74
  130. package/skills/workflows/compound.md +323 -323
  131. package/skills/workflows/compound_health.md +74 -74
  132. package/skills/workflows/create-agent-skill.md +139 -139
  133. package/skills/workflows/cycle.md +144 -144
  134. package/skills/workflows/deploy-docs.md +84 -84
  135. package/skills/workflows/development-rules.md +42 -42
  136. package/skills/workflows/doc.md +95 -95
  137. package/skills/workflows/documentation-management.md +34 -34
  138. package/skills/workflows/explore.md +146 -146
  139. package/skills/workflows/generate_command.md +106 -106
  140. package/skills/workflows/heal-skill.md +97 -97
  141. package/skills/workflows/housekeeping.md +229 -229
  142. package/skills/workflows/kit-setup.md +102 -102
  143. package/skills/workflows/map-codebase.md +78 -78
  144. package/skills/workflows/orchestration-protocol.md +43 -43
  145. package/skills/workflows/plan-compound.md +439 -439
  146. package/skills/workflows/plan_review.md +269 -269
  147. package/skills/workflows/primary-workflow.md +37 -37
  148. package/skills/workflows/promote_pattern.md +86 -86
  149. package/skills/workflows/release-docs.md +82 -82
  150. package/skills/workflows/report-bug.md +135 -135
  151. package/skills/workflows/reproduce-bug.md +118 -118
  152. package/skills/workflows/resolve_pr.md +133 -133
  153. package/skills/workflows/resolve_todo.md +128 -128
  154. package/skills/workflows/review-compound.md +376 -376
  155. package/skills/workflows/skill-review.md +127 -127
  156. package/skills/workflows/specs.md +257 -257
  157. package/skills/workflows/triage-sprint.md +102 -102
  158. package/skills/workflows/triage.md +152 -152
  159. package/skills/workflows/work.md +399 -399
  160. 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