superkit-mcp-server 1.2.2 → 1.2.3
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/security-auditor.md +3 -2
- package/agents/tester.md +274 -274
- package/agents/ui-designer.md +208 -208
- package/build/index.js +18 -9
- package/build/tools/__tests__/loggerTools.test.js +5 -5
- package/build/tools/archTools.js +2 -19
- package/build/tools/autoPreview.js +2 -2
- package/build/tools/compoundTools.js +4 -4
- package/build/tools/docsTools.js +5 -10
- package/build/tools/loggerTools.js +1 -1
- 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/build/tools/validators/convertRules.js +2 -2
- 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/doc.md +6 -6
- 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 -139
- 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,260 +1,260 @@
|
|
|
1
|
-
# Supabase Debugging Workflow
|
|
2
|
-
|
|
3
|
-
Systematic approach to diagnosing and resolving Supabase issues.
|
|
4
|
-
|
|
5
|
-
## When To Use
|
|
6
|
-
|
|
7
|
-
- Auth errors (login failures, session issues)
|
|
8
|
-
- Query errors (RLS blocking, missing data)
|
|
9
|
-
- Performance problems (slow queries, timeouts)
|
|
10
|
-
- Connection issues
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Common Issues
|
|
15
|
-
|
|
16
|
-
### Issue 1: Auth State Mismatch
|
|
17
|
-
|
|
18
|
-
**Symptoms:**
|
|
19
|
-
- User shows as logged in frontend, but API returns 401
|
|
20
|
-
- Session lost on page refresh
|
|
21
|
-
- "No rows returned" despite data existing
|
|
22
|
-
|
|
23
|
-
**Diagnosis:**
|
|
24
|
-
|
|
25
|
-
1. Check Supabase auth state:
|
|
26
|
-
```javascript
|
|
27
|
-
const { data: { session } } = await supabase.auth.getSession();
|
|
28
|
-
console.log('Session:', session);
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
2. Verify SessionStore:
|
|
32
|
-
```javascript
|
|
33
|
-
// Check lib/auth/SessionStore.ts
|
|
34
|
-
const stored = SessionStore.getSession();
|
|
35
|
-
console.log('Stored session:', stored);
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
3. Check sync between SessionStore and Supabase:
|
|
39
|
-
```javascript
|
|
40
|
-
// In AuthContext, verify setSession was called
|
|
41
|
-
await supabase.auth.setSession(sessionData);
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
**Solution:**
|
|
45
|
-
- Ensure `AuthContext` properly hydrates Supabase from SessionStore on init
|
|
46
|
-
- Verify `persistSession: false` in `supabaseClient.ts`
|
|
47
|
-
- Check SessionStore is single source of truth
|
|
48
|
-
|
|
49
|
-
**Reference:** `lib/supabaseClient.ts` architecture comments
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
### Issue 2: RLS Policy Blocking Query
|
|
54
|
-
|
|
55
|
-
**Symptoms:**
|
|
56
|
-
- Query returns empty array despite data existing
|
|
57
|
-
- "permission denied" errors
|
|
58
|
-
- Works in Supabase dashboard, fails in app
|
|
59
|
-
|
|
60
|
-
**Diagnosis:**
|
|
61
|
-
|
|
62
|
-
1. Verify RLS is the issue:
|
|
63
|
-
```sql
|
|
64
|
-
-- Test query with RLS disabled (in Supabase SQL editor)
|
|
65
|
-
ALTER TABLE schema.table DISABLE ROW LEVEL SECURITY;
|
|
66
|
-
SELECT * FROM schema.table;
|
|
67
|
-
ALTER TABLE schema.table ENABLE ROW LEVEL SECURITY;
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
2. Check user's auth.uid():
|
|
71
|
-
```sql
|
|
72
|
-
SELECT auth.uid();
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
3. Review table policies:
|
|
76
|
-
```sql
|
|
77
|
-
SELECT * FROM pg_policies WHERE tablename = 'your_table';
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
**Solution:**
|
|
81
|
-
- Create missing policy for the operation
|
|
82
|
-
- Verify policy USING clause matches auth.uid() correctly
|
|
83
|
-
- Check if user has required role in profiles table
|
|
84
|
-
|
|
85
|
-
**See:** `workflows/rls-policies.md` for policy patterns
|
|
86
|
-
|
|
87
|
-
---
|
|
88
|
-
|
|
89
|
-
### Issue 3: N+1 Query Problem
|
|
90
|
-
|
|
91
|
-
**Symptoms:**
|
|
92
|
-
- Slow page loads
|
|
93
|
-
- Many sequential database queries
|
|
94
|
-
- High database CPU usage
|
|
95
|
-
|
|
96
|
-
**Diagnosis:**
|
|
97
|
-
|
|
98
|
-
1. Check for missing joins:
|
|
99
|
-
```typescript
|
|
100
|
-
// ❌ BAD: N+1 queries
|
|
101
|
-
const users = await supabase.from('users').select('*');
|
|
102
|
-
for (const user of users.data) {
|
|
103
|
-
const profile = await supabase.from('profiles')
|
|
104
|
-
.select('*')
|
|
105
|
-
.eq('user_id', user.id);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// ✅ GOOD: Single query with join
|
|
109
|
-
const users = await supabase
|
|
110
|
-
.from('users')
|
|
111
|
-
.select('*, profiles(*)');
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
2. Enable query logging:
|
|
115
|
-
```typescript
|
|
116
|
-
// Add to supabaseClient.ts for debugging
|
|
117
|
-
Logger.debug('[Supabase] Query:', { url, method });
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
**Solution:**
|
|
121
|
-
- Use Supabase joins: `.select('*, related_table(*)')`
|
|
122
|
-
- Create database views for complex joins
|
|
123
|
-
- Add indexes for foreign keys
|
|
124
|
-
|
|
125
|
-
---
|
|
126
|
-
|
|
127
|
-
### Issue 4: Missing Environment Variables
|
|
128
|
-
|
|
129
|
-
**Symptoms:**
|
|
130
|
-
- "Missing NEXT_PUBLIC_SUPABASE_ANON_KEY" error
|
|
131
|
-
- Supabase client not initialized
|
|
132
|
-
- 404 on API calls
|
|
133
|
-
|
|
134
|
-
**Diagnosis:**
|
|
135
|
-
|
|
136
|
-
1. Check `.env.local`:
|
|
137
|
-
```bash
|
|
138
|
-
cat .env.local | grep SUPABASE
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
2. Verify environment variables loaded:
|
|
142
|
-
```bash
|
|
143
|
-
echo $NEXT_PUBLIC_SUPABASE_URL
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
**Solution:**
|
|
147
|
-
- Copy from `.env.local.example` if exists
|
|
148
|
-
- Get keys from Supabase Dashboard > Project Settings > API
|
|
149
|
-
- Restart dev server after adding env vars
|
|
150
|
-
|
|
151
|
-
---
|
|
152
|
-
|
|
153
|
-
### Issue 5: CORS Errors
|
|
154
|
-
|
|
155
|
-
**Symptoms:**
|
|
156
|
-
- "CORS policy" errors in browser console
|
|
157
|
-
- Requests blocked from localhost
|
|
158
|
-
- Works in production, fails locally
|
|
159
|
-
|
|
160
|
-
**Diagnosis:**
|
|
161
|
-
|
|
162
|
-
1. Check Supabase project settings:
|
|
163
|
-
- Dashboard > Authentication > URL Configuration
|
|
164
|
-
- Redirect URLs should include `http://localhost:3000`
|
|
165
|
-
|
|
166
|
-
2. Verify request origin:
|
|
167
|
-
```javascript
|
|
168
|
-
console.log('Origin:', window.location.origin);
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
**Solution:**
|
|
172
|
-
- Add localhost to allowed redirect URLs in Supabase
|
|
173
|
-
- Add site URL to authentication settings
|
|
174
|
-
- Ensure using HTTPS in production
|
|
175
|
-
|
|
176
|
-
---
|
|
177
|
-
|
|
178
|
-
### Issue 6: Timeout on Large Queries
|
|
179
|
-
|
|
180
|
-
**Symptoms:**
|
|
181
|
-
- "AbortError: The operation was aborted"
|
|
182
|
-
- Queries taking >15 seconds
|
|
183
|
-
- Timeout on complex joins
|
|
184
|
-
|
|
185
|
-
**Diagnosis:**
|
|
186
|
-
|
|
187
|
-
1. Check query performance:
|
|
188
|
-
```sql
|
|
189
|
-
EXPLAIN ANALYZE
|
|
190
|
-
SELECT * FROM large_table WHERE ...;
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
2. Look for missing indexes:
|
|
194
|
-
```sql
|
|
195
|
-
-- Check if index exists
|
|
196
|
-
SELECT * FROM pg_indexes WHERE tablename = 'your_table';
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
**Solution:**
|
|
200
|
-
- Add indexes for WHERE clause columns
|
|
201
|
-
- Add indexes for foreign keys
|
|
202
|
-
- Paginate results (use `.range(start, end)`)
|
|
203
|
-
- Increase timeout in `supabaseClient.ts` if justified
|
|
204
|
-
|
|
205
|
-
**Reference:** `lib/supabaseClient.ts` - 15 second timeout configured
|
|
206
|
-
|
|
207
|
-
---
|
|
208
|
-
|
|
209
|
-
## Debugging Checklist
|
|
210
|
-
|
|
211
|
-
When encountering Supabase errors:
|
|
212
|
-
|
|
213
|
-
- [ ] Check browser console for errors
|
|
214
|
-
- [ ] Verify auth session exists
|
|
215
|
-
- [ ] Test query in Supabase SQL editor
|
|
216
|
-
- [ ] Review RLS policies on affected tables
|
|
217
|
-
- [ ] Check for missing indexes
|
|
218
|
-
- [ ] Verify environment variables loaded
|
|
219
|
-
- [ ] Check network tab for failed requests
|
|
220
|
-
- [ ] Review Supabase client configuration
|
|
221
|
-
|
|
222
|
-
---
|
|
223
|
-
|
|
224
|
-
## Tools
|
|
225
|
-
|
|
226
|
-
### Log Supabase Queries
|
|
227
|
-
|
|
228
|
-
Add to `lib/supabaseClient.ts`:
|
|
229
|
-
|
|
230
|
-
```typescript
|
|
231
|
-
global: {
|
|
232
|
-
fetch: (url, options = {}) => {
|
|
233
|
-
Logger.debug('[Supabase] Request:', { url, method: options.method });
|
|
234
|
-
// ... existing timeout logic
|
|
235
|
-
},
|
|
236
|
-
}
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
### Test RLS in SQL Editor
|
|
240
|
-
|
|
241
|
-
```sql
|
|
242
|
-
-- Simulate authenticated user
|
|
243
|
-
SET LOCAL role authenticated;
|
|
244
|
-
SET LOCAL request.jwt.claims.sub = 'user-uuid-here';
|
|
245
|
-
|
|
246
|
-
-- Run your query
|
|
247
|
-
SELECT * FROM your_table;
|
|
248
|
-
|
|
249
|
-
-- Reset
|
|
250
|
-
RESET role;
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
---
|
|
254
|
-
|
|
255
|
-
## Expected Output
|
|
256
|
-
|
|
257
|
-
✅ Issue identified and root cause understood
|
|
258
|
-
✅ Solution implemented or workaround documented
|
|
259
|
-
✅ Verified fix resolves the problem
|
|
260
|
-
✅ Added prevention measures (indexes, policies, etc.)
|
|
1
|
+
# Supabase Debugging Workflow
|
|
2
|
+
|
|
3
|
+
Systematic approach to diagnosing and resolving Supabase issues.
|
|
4
|
+
|
|
5
|
+
## When To Use
|
|
6
|
+
|
|
7
|
+
- Auth errors (login failures, session issues)
|
|
8
|
+
- Query errors (RLS blocking, missing data)
|
|
9
|
+
- Performance problems (slow queries, timeouts)
|
|
10
|
+
- Connection issues
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Common Issues
|
|
15
|
+
|
|
16
|
+
### Issue 1: Auth State Mismatch
|
|
17
|
+
|
|
18
|
+
**Symptoms:**
|
|
19
|
+
- User shows as logged in frontend, but API returns 401
|
|
20
|
+
- Session lost on page refresh
|
|
21
|
+
- "No rows returned" despite data existing
|
|
22
|
+
|
|
23
|
+
**Diagnosis:**
|
|
24
|
+
|
|
25
|
+
1. Check Supabase auth state:
|
|
26
|
+
```javascript
|
|
27
|
+
const { data: { session } } = await supabase.auth.getSession();
|
|
28
|
+
console.log('Session:', session);
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
2. Verify SessionStore:
|
|
32
|
+
```javascript
|
|
33
|
+
// Check lib/auth/SessionStore.ts
|
|
34
|
+
const stored = SessionStore.getSession();
|
|
35
|
+
console.log('Stored session:', stored);
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
3. Check sync between SessionStore and Supabase:
|
|
39
|
+
```javascript
|
|
40
|
+
// In AuthContext, verify setSession was called
|
|
41
|
+
await supabase.auth.setSession(sessionData);
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**Solution:**
|
|
45
|
+
- Ensure `AuthContext` properly hydrates Supabase from SessionStore on init
|
|
46
|
+
- Verify `persistSession: false` in `supabaseClient.ts`
|
|
47
|
+
- Check SessionStore is single source of truth
|
|
48
|
+
|
|
49
|
+
**Reference:** `lib/supabaseClient.ts` architecture comments
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
### Issue 2: RLS Policy Blocking Query
|
|
54
|
+
|
|
55
|
+
**Symptoms:**
|
|
56
|
+
- Query returns empty array despite data existing
|
|
57
|
+
- "permission denied" errors
|
|
58
|
+
- Works in Supabase dashboard, fails in app
|
|
59
|
+
|
|
60
|
+
**Diagnosis:**
|
|
61
|
+
|
|
62
|
+
1. Verify RLS is the issue:
|
|
63
|
+
```sql
|
|
64
|
+
-- Test query with RLS disabled (in Supabase SQL editor)
|
|
65
|
+
ALTER TABLE schema.table DISABLE ROW LEVEL SECURITY;
|
|
66
|
+
SELECT * FROM schema.table;
|
|
67
|
+
ALTER TABLE schema.table ENABLE ROW LEVEL SECURITY;
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
2. Check user's auth.uid():
|
|
71
|
+
```sql
|
|
72
|
+
SELECT auth.uid();
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
3. Review table policies:
|
|
76
|
+
```sql
|
|
77
|
+
SELECT * FROM pg_policies WHERE tablename = 'your_table';
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Solution:**
|
|
81
|
+
- Create missing policy for the operation
|
|
82
|
+
- Verify policy USING clause matches auth.uid() correctly
|
|
83
|
+
- Check if user has required role in profiles table
|
|
84
|
+
|
|
85
|
+
**See:** `workflows/rls-policies.md` for policy patterns
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
### Issue 3: N+1 Query Problem
|
|
90
|
+
|
|
91
|
+
**Symptoms:**
|
|
92
|
+
- Slow page loads
|
|
93
|
+
- Many sequential database queries
|
|
94
|
+
- High database CPU usage
|
|
95
|
+
|
|
96
|
+
**Diagnosis:**
|
|
97
|
+
|
|
98
|
+
1. Check for missing joins:
|
|
99
|
+
```typescript
|
|
100
|
+
// ❌ BAD: N+1 queries
|
|
101
|
+
const users = await supabase.from('users').select('*');
|
|
102
|
+
for (const user of users.data) {
|
|
103
|
+
const profile = await supabase.from('profiles')
|
|
104
|
+
.select('*')
|
|
105
|
+
.eq('user_id', user.id);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// ✅ GOOD: Single query with join
|
|
109
|
+
const users = await supabase
|
|
110
|
+
.from('users')
|
|
111
|
+
.select('*, profiles(*)');
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
2. Enable query logging:
|
|
115
|
+
```typescript
|
|
116
|
+
// Add to supabaseClient.ts for debugging
|
|
117
|
+
Logger.debug('[Supabase] Query:', { url, method });
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**Solution:**
|
|
121
|
+
- Use Supabase joins: `.select('*, related_table(*)')`
|
|
122
|
+
- Create database views for complex joins
|
|
123
|
+
- Add indexes for foreign keys
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
### Issue 4: Missing Environment Variables
|
|
128
|
+
|
|
129
|
+
**Symptoms:**
|
|
130
|
+
- "Missing NEXT_PUBLIC_SUPABASE_ANON_KEY" error
|
|
131
|
+
- Supabase client not initialized
|
|
132
|
+
- 404 on API calls
|
|
133
|
+
|
|
134
|
+
**Diagnosis:**
|
|
135
|
+
|
|
136
|
+
1. Check `.env.local`:
|
|
137
|
+
```bash
|
|
138
|
+
cat .env.local | grep SUPABASE
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
2. Verify environment variables loaded:
|
|
142
|
+
```bash
|
|
143
|
+
echo $NEXT_PUBLIC_SUPABASE_URL
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**Solution:**
|
|
147
|
+
- Copy from `.env.local.example` if exists
|
|
148
|
+
- Get keys from Supabase Dashboard > Project Settings > API
|
|
149
|
+
- Restart dev server after adding env vars
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
### Issue 5: CORS Errors
|
|
154
|
+
|
|
155
|
+
**Symptoms:**
|
|
156
|
+
- "CORS policy" errors in browser console
|
|
157
|
+
- Requests blocked from localhost
|
|
158
|
+
- Works in production, fails locally
|
|
159
|
+
|
|
160
|
+
**Diagnosis:**
|
|
161
|
+
|
|
162
|
+
1. Check Supabase project settings:
|
|
163
|
+
- Dashboard > Authentication > URL Configuration
|
|
164
|
+
- Redirect URLs should include `http://localhost:3000`
|
|
165
|
+
|
|
166
|
+
2. Verify request origin:
|
|
167
|
+
```javascript
|
|
168
|
+
console.log('Origin:', window.location.origin);
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**Solution:**
|
|
172
|
+
- Add localhost to allowed redirect URLs in Supabase
|
|
173
|
+
- Add site URL to authentication settings
|
|
174
|
+
- Ensure using HTTPS in production
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
### Issue 6: Timeout on Large Queries
|
|
179
|
+
|
|
180
|
+
**Symptoms:**
|
|
181
|
+
- "AbortError: The operation was aborted"
|
|
182
|
+
- Queries taking >15 seconds
|
|
183
|
+
- Timeout on complex joins
|
|
184
|
+
|
|
185
|
+
**Diagnosis:**
|
|
186
|
+
|
|
187
|
+
1. Check query performance:
|
|
188
|
+
```sql
|
|
189
|
+
EXPLAIN ANALYZE
|
|
190
|
+
SELECT * FROM large_table WHERE ...;
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
2. Look for missing indexes:
|
|
194
|
+
```sql
|
|
195
|
+
-- Check if index exists
|
|
196
|
+
SELECT * FROM pg_indexes WHERE tablename = 'your_table';
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**Solution:**
|
|
200
|
+
- Add indexes for WHERE clause columns
|
|
201
|
+
- Add indexes for foreign keys
|
|
202
|
+
- Paginate results (use `.range(start, end)`)
|
|
203
|
+
- Increase timeout in `supabaseClient.ts` if justified
|
|
204
|
+
|
|
205
|
+
**Reference:** `lib/supabaseClient.ts` - 15 second timeout configured
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## Debugging Checklist
|
|
210
|
+
|
|
211
|
+
When encountering Supabase errors:
|
|
212
|
+
|
|
213
|
+
- [ ] Check browser console for errors
|
|
214
|
+
- [ ] Verify auth session exists
|
|
215
|
+
- [ ] Test query in Supabase SQL editor
|
|
216
|
+
- [ ] Review RLS policies on affected tables
|
|
217
|
+
- [ ] Check for missing indexes
|
|
218
|
+
- [ ] Verify environment variables loaded
|
|
219
|
+
- [ ] Check network tab for failed requests
|
|
220
|
+
- [ ] Review Supabase client configuration
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Tools
|
|
225
|
+
|
|
226
|
+
### Log Supabase Queries
|
|
227
|
+
|
|
228
|
+
Add to `lib/supabaseClient.ts`:
|
|
229
|
+
|
|
230
|
+
```typescript
|
|
231
|
+
global: {
|
|
232
|
+
fetch: (url, options = {}) => {
|
|
233
|
+
Logger.debug('[Supabase] Request:', { url, method: options.method });
|
|
234
|
+
// ... existing timeout logic
|
|
235
|
+
},
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Test RLS in SQL Editor
|
|
240
|
+
|
|
241
|
+
```sql
|
|
242
|
+
-- Simulate authenticated user
|
|
243
|
+
SET LOCAL role authenticated;
|
|
244
|
+
SET LOCAL request.jwt.claims.sub = 'user-uuid-here';
|
|
245
|
+
|
|
246
|
+
-- Run your query
|
|
247
|
+
SELECT * FROM your_table;
|
|
248
|
+
|
|
249
|
+
-- Reset
|
|
250
|
+
RESET role;
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## Expected Output
|
|
256
|
+
|
|
257
|
+
✅ Issue identified and root cause understood
|
|
258
|
+
✅ Solution implemented or workaround documented
|
|
259
|
+
✅ Verified fix resolves the problem
|
|
260
|
+
✅ Added prevention measures (indexes, policies, etc.)
|