vibes-plug 1.0.0 → 2.11.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/.claude/rules/vibes-plug-core.md +32 -0
- package/.cursor/rules/vibes-plug-core.mdc +51 -0
- package/.cursorrules +42 -0
- package/AGENTS.md +96 -0
- package/BLUEPRINT.md +309 -125
- package/CHANGELOG.md +183 -1
- package/CLAUDE.md +70 -0
- package/LICENSE +1 -1
- package/README.md +641 -263
- package/index.js +19 -0
- package/package.json +61 -25
- package/plugin.json +24 -7
- package/scripts/generate_swarm_gif.py +295 -0
- package/scripts/install.js +201 -0
- package/skills/accessibility-testing-expert/SKILL.md +116 -0
- package/skills/ai-cost-token-optimizer/SKILL.md +82 -0
- package/skills/ai-evals-benchmark-expert/SKILL.md +188 -0
- package/skills/ai-llm-integration-expert/SKILL.md +147 -122
- package/skills/ai-media-generation-expert/SKILL.md +172 -0
- package/skills/ai-prompt-engineering-expert/SKILL.md +84 -0
- package/skills/angular-expert/SKILL.md +148 -0
- package/skills/api-design-expert/SKILL.md +316 -309
- package/skills/api-gateway-proxy-expert/SKILL.md +81 -0
- package/skills/app-analyzer-optimizer/SKILL.md +195 -188
- package/skills/apple-ecosystem-expert/SKILL.md +145 -0
- package/skills/{asisten_ramah → asisten-ramah}/SKILL.md +7 -1
- package/skills/astro-framework-expert/SKILL.md +200 -0
- package/skills/async-queue-temporal-expert/SKILL.md +240 -0
- package/skills/authentication-identity-expert/SKILL.md +279 -45
- package/skills/auto-doc-updater/SKILL.md +219 -203
- package/skills/autonomous-chaos-monkey/SKILL.md +63 -0
- package/skills/autonomous-red-teamer/SKILL.md +203 -0
- package/skills/autonomous-tdd-debugger/SKILL.md +71 -0
- package/skills/background-jobs-queue-expert/SKILL.md +235 -0
- package/skills/biome-linter-formatter-expert/SKILL.md +89 -0
- package/skills/blockchain-web3-expert/SKILL.md +115 -0
- package/skills/bootstrap-to-modern/SKILL.md +93 -86
- package/skills/brainstorming/SKILL.md +381 -353
- package/skills/browser-automation-expert/SKILL.md +222 -0
- package/skills/bun-runtime-expert/SKILL.md +7 -1
- package/skills/chatbot-messaging-expert/SKILL.md +114 -0
- package/skills/ci-cd-devops-architect/SKILL.md +81 -45
- package/skills/cloud-hosting-expert/SKILL.md +249 -243
- package/skills/coderabbit/SKILL.md +197 -191
- package/skills/compliance-gdpr-privacy-expert/SKILL.md +85 -0
- package/skills/cron-scheduler-expert/SKILL.md +304 -0
- package/skills/data-pipeline-etl-expert/SKILL.md +84 -0
- package/skills/data-telemetry-expert/SKILL.md +218 -212
- package/skills/data-visualization-expert/SKILL.md +154 -0
- package/skills/database-migration-versioning-expert/SKILL.md +90 -0
- package/skills/database-orm-expert/SKILL.md +303 -293
- package/skills/dependency-upgrade-migrator/SKILL.md +301 -0
- package/skills/design-system-architect/SKILL.md +278 -242
- package/skills/desktop-electron-expert/SKILL.md +128 -0
- package/skills/documentation-site-expert/SKILL.md +59 -0
- package/skills/doku-mcp-server/SKILL.md +257 -0
- package/skills/doku-payment-gateway/SKILL.md +233 -0
- package/skills/domain-driven-design-expert/SKILL.md +82 -0
- package/skills/e2e-testing-expert/SKILL.md +320 -314
- package/skills/ecommerce-expert/SKILL.md +87 -0
- package/skills/edge-serverless-db-expert/SKILL.md +99 -0
- package/skills/email-notification-expert/SKILL.md +368 -0
- package/skills/error-resilience-expert/SKILL.md +486 -0
- package/skills/event-driven-architect/SKILL.md +86 -80
- package/skills/feature-flag-analytics-expert/SKILL.md +66 -0
- package/skills/file-upload-media-expert/SKILL.md +437 -0
- package/skills/firebase-security-expert/SKILL.md +7 -1
- package/skills/form-validation-expert/SKILL.md +407 -0
- package/skills/fullstack-expert/SKILL.md +260 -201
- package/skills/fullstack-expert/references/api_design_guide.md +466 -466
- package/skills/fullstack-expert/references/multi_language_backend.md +528 -528
- package/skills/fullstack-expert/scripts/api_contract_validator.py +253 -253
- package/skills/fullstack-expert/scripts/architecture_analyzer.py +326 -326
- package/skills/gemini-agent-booster/SKILL.md +142 -104
- package/skills/geospatial-maps-expert/SKILL.md +80 -0
- package/skills/global-a11y-i18n-expert/SKILL.md +86 -80
- package/skills/glsl-shader-expert/SKILL.md +107 -0
- package/skills/go-programming-expert/SKILL.md +300 -294
- package/skills/graph-rag-knowledge-expert/SKILL.md +159 -0
- package/skills/graphql-apollo-expert/SKILL.md +114 -0
- package/skills/headless-cms-expert/SKILL.md +181 -0
- package/skills/hig/SKILL.md +193 -187
- package/skills/js-backend-expert/SKILL.md +218 -191
- package/skills/legacy-code-translator/SKILL.md +71 -0
- package/skills/local-slm-edge-ai-expert/SKILL.md +167 -0
- package/skills/logging-error-tracking-expert/SKILL.md +344 -0
- package/skills/mcp-client-orchestrator/SKILL.md +76 -0
- package/skills/mcp-server-architect/SKILL.md +226 -126
- package/skills/micro-frontend-architect/SKILL.md +112 -0
- package/skills/mobile-expo-expert/SKILL.md +191 -185
- package/skills/mobile-push-notification-expert/SKILL.md +71 -0
- package/skills/modern-css-native-expert/SKILL.md +189 -0
- package/skills/monday-design-aesthetic/SKILL.md +72 -66
- package/skills/monorepo-architect/SKILL.md +232 -226
- package/skills/mpa-orchestrator/SKILL.md +120 -101
- package/skills/multi-agent-orchestration/SKILL.md +173 -153
- package/skills/multiple-entry-points/SKILL.md +91 -55
- package/skills/mvc-expert/SKILL.md +237 -231
- package/skills/n8n-automation-expert/SKILL.md +89 -0
- package/skills/nextjs-app-router-expert/SKILL.md +148 -0
- package/skills/openapi-swagger-codegen-expert/SKILL.md +67 -0
- package/skills/payment-gateway-expert/SKILL.md +129 -45
- package/skills/pdf-document-generation-expert/SKILL.md +91 -0
- package/skills/performance-web-vitals/SKILL.md +337 -331
- package/skills/post-quantum-crypto-migrator/SKILL.md +57 -0
- package/skills/prd-architect/SKILL.md +206 -190
- package/skills/proactive-background-watcher/SKILL.md +68 -0
- package/skills/production-ready-hardener/PRODUCTION_READINESS_REPORT.md +67 -0
- package/skills/production-ready-hardener/SKILL.md +461 -468
- package/skills/production-ready-hardener/references/production_checklist.md +161 -161
- package/skills/production-ready-hardener/scripts/production_readiness_scanner.py +881 -875
- package/skills/project-context-mapper/SKILL.md +85 -0
- package/skills/pwa-offline-first-expert/SKILL.md +185 -0
- package/skills/python-programming-expert/SKILL.md +407 -270
- package/skills/rate-limit-abuse-prevention/SKILL.md +377 -0
- package/skills/realtime-collaboration-expert/SKILL.md +99 -45
- package/skills/rich-text-editor-expert/SKILL.md +177 -0
- package/skills/rust-programming-expert/SKILL.md +240 -234
- package/skills/saas-billing/SKILL.md +382 -376
- package/skills/saas-multi-tenant/SKILL.md +256 -236
- package/skills/saas-mvp-launcher/SKILL.md +30 -1
- package/skills/saas-transformer/SKILL.md +499 -445
- package/skills/saas-transformer/references/billing_integration_guide.md +401 -401
- package/skills/saas-transformer/references/feature_gating_patterns.md +137 -137
- package/skills/saas-transformer/references/saas_transformation_checklist.md +121 -121
- package/skills/saas-transformer/scripts/saas_transformation_scanner.py +39 -29
- package/skills/scalability-clean-code/SKILL.md +234 -228
- package/skills/search-engine-expert/SKILL.md +89 -0
- package/skills/secure-fuzz-testing/SKILL.md +7 -1
- package/skills/self-evolving-memory-graph/SKILL.md +91 -0
- package/skills/self-healing-cloud-orchestrator/SKILL.md +57 -0
- package/skills/senior-frontend/SKILL.md +85 -105
- package/skills/seo/SKILL.md +258 -224
- package/skills/session-context-loader/SKILL.md +83 -0
- package/skills/session-handoff-resume/SKILL.md +163 -157
- package/skills/{skill_baru → skill-baru}/SKILL.md +177 -146
- package/skills/solidjs-expert/SKILL.md +80 -0
- package/skills/spa-orchestrator/SKILL.md +306 -287
- package/skills/sse-websocket-streaming-expert/SKILL.md +93 -0
- package/skills/state-management-expert/SKILL.md +277 -271
- package/skills/supabase-migration/SKILL.md +47 -1
- package/skills/supabase-security-expert/SKILL.md +248 -242
- package/skills/svelte-sveltekit-expert/SKILL.md +91 -0
- package/skills/svg-animation-motion-expert/SKILL.md +115 -0
- package/skills/tailwind-expert/SKILL.md +139 -187
- package/skills/tanstack-query-expert/SKILL.md +204 -198
- package/skills/tauri-expert/SKILL.md +7 -1
- package/skills/token-saver/SKILL.md +118 -110
- package/skills/typescript-expert/SKILL.md +329 -278
- package/skills/ui-components-expert/SKILL.md +166 -63
- package/skills/ui-ux-pro-max/SKILL.md +221 -200
- package/skills/vector-db-rag-expert/SKILL.md +208 -0
- package/skills/vibe-code-gardener/SKILL.md +180 -172
- package/skills/visual-qa-vision-agent/SKILL.md +71 -0
- package/skills/voice-ai-realtime-agent/SKILL.md +202 -0
- package/skills/vue-frontend-expert/SKILL.md +132 -0
- package/skills/wasm-edge-computing-expert/SKILL.md +97 -0
- package/skills/web-3d-graphics-expert/SKILL.md +137 -0
- package/skills/web-game-engine-expert/SKILL.md +102 -0
- package/skills/web-scraper/SKILL.md +98 -146
- package/skills/website-design-cloner/SKILL.md +180 -0
- package/skills/webxr-ar-vr-expert/SKILL.md +123 -0
- package/skills/wordpress-headless-expert/SKILL.md +144 -0
- package/skills/zero-to-prod-orchestrator/SKILL.md +231 -180
- package/skills/zero-trust-secret-vault/SKILL.md +88 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- package/CONTRIBUTING.md +0 -199
- package/SECURITY.md +0 -21
- package/banner.png +0 -0
- package/skills/senior-fullstack/SKILL.md +0 -167
- package/skills/senior-fullstack/references/architecture_patterns.md +0 -160
- package/skills/senior-fullstack/references/development_workflows.md +0 -222
- package/skills/senior-fullstack/references/tech_stack_guide.md +0 -190
- package/skills/senior-fullstack/scripts/code_quality_analyzer.py +0 -114
- package/skills/senior-fullstack/scripts/fullstack_scaffolder.py +0 -114
- package/skills/senior-fullstack/scripts/project_scaffolder.py +0 -114
- package/skills/seo-aeo-landing-page-writer/SKILL.md +0 -97
- package/skills/seo-geo/SKILL.md +0 -188
- package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-310.pyc +0 -0
- package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc +0 -0
- package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-310.pyc +0 -0
- package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-312.pyc +0 -0
- package/skills/ui_ux_expert/SKILL.md +0 -114
|
@@ -1,243 +1,249 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: supabase-security-expert
|
|
3
|
-
description: "Supabase security expert to audit RLS (Row Level Security), RBAC, relational databases, prevent data leakage, and utilize Supabase Linter / Ahli keamanan Supabase untuk audit RLS (Row Level Security), RBAC, database relasional, pencegahan kebocoran data, dan pemanfaatan Supabase Linter."
|
|
1
|
+
---
|
|
2
|
+
name: supabase-security-expert
|
|
3
|
+
description: "Supabase security expert to audit RLS (Row Level Security), RBAC, relational databases, prevent data leakage, and utilize Supabase Linter / Ahli keamanan Supabase untuk audit RLS (Row Level Security), RBAC, database relasional, pencegahan kebocoran data, dan pemanfaatan Supabase Linter."
|
|
4
4
|
author: "Roedy Rustam"
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Supabase Security Expert (2026 Edition — Auth v3 / PKCE)
|
|
8
|
-
|
|
9
|
-
[English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
<a name="english"></a>
|
|
14
|
-
## English
|
|
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
|
-
|
|
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
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
- [ ]
|
|
190
|
-
- [ ]
|
|
191
|
-
- [ ]
|
|
192
|
-
- [ ]
|
|
193
|
-
- [ ]
|
|
194
|
-
- [ ]
|
|
195
|
-
- [ ]
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
###
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
###
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
###
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Supabase Security Expert (2026 Edition — Auth v3 / PKCE)
|
|
8
|
+
|
|
9
|
+
[English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
<a name="english"></a>
|
|
14
|
+
## English
|
|
15
|
+
|
|
16
|
+
### Orchestration & Integration
|
|
17
|
+
Connects and orchestrates with relevant domain skills like `brainstorming`, `zero-to-prod-orchestrator`, and `project-context-mapper` to ensure cohesive execution.
|
|
18
|
+
|
|
19
|
+
### Description
|
|
20
|
+
Expert guide for auditing and hardening Supabase applications. Covers Row Level Security (RLS), Supabase Auth v3 (PKCE flow), API key hygiene, data leakage prevention, Supabase Linter, and production security checklists.
|
|
21
|
+
|
|
22
|
+
### Trigger Conditions
|
|
23
|
+
- Auditing RLS policies for correctness and security gaps.
|
|
24
|
+
- Setting up Supabase Auth v3 with PKCE flow (replaces implicit flow).
|
|
25
|
+
- Reviewing API key usage (anon key vs. service role key).
|
|
26
|
+
- Preventing data leakage from misconfigured policies.
|
|
27
|
+
- Running Supabase Linter (`supabase lint`) for automated security checks.
|
|
28
|
+
- Implementing user roles and access control in a Supabase project.
|
|
29
|
+
|
|
30
|
+
### Supabase Auth v3 — PKCE Flow (2026 Default)
|
|
31
|
+
|
|
32
|
+
Supabase Auth v3 now uses **PKCE (Proof Key for Code Exchange)** as the default flow for all OAuth and magic link authentication — replacing the older implicit flow:
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
// supabase/client.ts — v3 client setup
|
|
36
|
+
import { createBrowserClient } from '@supabase/ssr';
|
|
37
|
+
|
|
38
|
+
export const supabase = createBrowserClient(
|
|
39
|
+
process.env.NEXT_PUBLIC_SUPABASE_URL!,
|
|
40
|
+
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
|
|
41
|
+
{
|
|
42
|
+
auth: {
|
|
43
|
+
flowType: 'pkce', // Default in Auth v3
|
|
44
|
+
autoRefreshToken: true,
|
|
45
|
+
persistSession: true,
|
|
46
|
+
detectSessionInUrl: true,
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
// Server-side session handling (Next.js App Router)
|
|
54
|
+
import { createServerClient } from '@supabase/ssr';
|
|
55
|
+
import { cookies } from 'next/headers';
|
|
56
|
+
|
|
57
|
+
export async function createSupabaseServerClient() {
|
|
58
|
+
const cookieStore = await cookies();
|
|
59
|
+
return createServerClient(
|
|
60
|
+
process.env.NEXT_PUBLIC_SUPABASE_URL!,
|
|
61
|
+
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
|
|
62
|
+
{
|
|
63
|
+
cookies: {
|
|
64
|
+
getAll: () => cookieStore.getAll(),
|
|
65
|
+
setAll: (cookiesToSet) => {
|
|
66
|
+
cookiesToSet.forEach(({ name, value, options }) =>
|
|
67
|
+
cookieStore.set(name, value, options)
|
|
68
|
+
);
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### API Key Security
|
|
77
|
+
|
|
78
|
+
| Key Type | Purpose | Where to Use |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| `anon` key | Public client access — restricted by RLS | Frontend (browser) |
|
|
81
|
+
| `service_role` key | Bypasses ALL RLS | Backend only (server) |
|
|
82
|
+
|
|
83
|
+
> ⚠️ **NEVER** expose `service_role` key to the frontend. If it leaks, an attacker can read/write all data in your database, bypassing RLS completely.
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
// ✅ CORRECT: service_role used only in server-side code
|
|
87
|
+
// app/api/admin/route.ts (only accessible at admin.domain.com)
|
|
88
|
+
import { createClient } from '@supabase/supabase-js';
|
|
89
|
+
|
|
90
|
+
const adminClient = createClient(
|
|
91
|
+
process.env.NEXT_PUBLIC_SUPABASE_URL!,
|
|
92
|
+
process.env.SUPABASE_SERVICE_ROLE_KEY!, // NOT exposed to client
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
// 🔴 WRONG: service_role in client-side code
|
|
96
|
+
const publicClient = createBrowserClient(url, process.env.SUPABASE_SERVICE_ROLE_KEY!);
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### RLS Policy Audit Checklist
|
|
100
|
+
|
|
101
|
+
#### Common RLS Mistakes
|
|
102
|
+
```sql
|
|
103
|
+
-- 🔴 INSECURE: auth.uid() is not validated — returns null if not authenticated
|
|
104
|
+
CREATE POLICY "users can see own data" ON profiles
|
|
105
|
+
FOR SELECT USING (user_id = auth.uid());
|
|
106
|
+
-- If user is unauthenticated, auth.uid() returns null, which means
|
|
107
|
+
-- NULL = NULL is NULL (falsy in SQL) — so this IS secure... but next one isn't:
|
|
108
|
+
|
|
109
|
+
-- 🔴 DANGEROUS: Using 'true' without auth check
|
|
110
|
+
CREATE POLICY "all can read" ON public_posts
|
|
111
|
+
FOR SELECT USING (true); -- Anyone, including anonymous, can read
|
|
112
|
+
|
|
113
|
+
-- ✅ SECURE: Explicit authentication requirement
|
|
114
|
+
CREATE POLICY "only authenticated users can read" ON sensitive_data
|
|
115
|
+
FOR SELECT USING (auth.role() = 'authenticated');
|
|
116
|
+
|
|
117
|
+
-- ✅ SECURE: Workspace isolation with auth check
|
|
118
|
+
CREATE POLICY "workspace isolation" ON projects
|
|
119
|
+
FOR ALL USING (
|
|
120
|
+
workspace_id IN (
|
|
121
|
+
SELECT workspace_id FROM workspace_members
|
|
122
|
+
WHERE user_id = auth.uid()
|
|
123
|
+
)
|
|
124
|
+
);
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
#### RLS Audit SQL Queries
|
|
128
|
+
```sql
|
|
129
|
+
-- Find tables WITHOUT RLS enabled
|
|
130
|
+
SELECT schemaname, tablename
|
|
131
|
+
FROM pg_tables
|
|
132
|
+
WHERE schemaname = 'public'
|
|
133
|
+
AND tablename NOT IN (
|
|
134
|
+
SELECT tablename FROM pg_policies WHERE schemaname = 'public'
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
-- Find tables with RLS enabled but NO policies (effectively blocks all access)
|
|
138
|
+
SELECT c.relname AS table_name, c.relrowsecurity AS rls_enabled
|
|
139
|
+
FROM pg_class c
|
|
140
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
141
|
+
WHERE n.nspname = 'public'
|
|
142
|
+
AND c.relkind = 'r'
|
|
143
|
+
AND c.relrowsecurity = true
|
|
144
|
+
AND NOT EXISTS (
|
|
145
|
+
SELECT 1 FROM pg_policies p
|
|
146
|
+
WHERE p.tablename = c.relname AND p.schemaname = n.nspname
|
|
147
|
+
);
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Supabase Linter
|
|
151
|
+
Run automated security checks:
|
|
152
|
+
```bash
|
|
153
|
+
# Install Supabase CLI
|
|
154
|
+
npm install -g supabase
|
|
155
|
+
|
|
156
|
+
# Run the linter against your project
|
|
157
|
+
supabase db lint --project-id <your-project-id>
|
|
158
|
+
|
|
159
|
+
# Common lint checks:
|
|
160
|
+
# - Tables with RLS disabled
|
|
161
|
+
# - Policies using mutable functions (NOW(), RANDOM())
|
|
162
|
+
# - Security definer functions without search_path
|
|
163
|
+
# - Auth functions used incorrectly
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Storage Security
|
|
167
|
+
```typescript
|
|
168
|
+
// Create a private storage bucket (files not publicly accessible by URL)
|
|
169
|
+
const { data, error } = await supabase.storage.createBucket('user-uploads', {
|
|
170
|
+
public: false, // Private — requires signed URLs
|
|
171
|
+
fileSizeLimit: 10 * 1024 * 1024, // 10MB
|
|
172
|
+
allowedMimeTypes: ['image/jpeg', 'image/png', 'application/pdf'],
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
// Generate a signed URL (expires in 1 hour)
|
|
176
|
+
const { data: { signedUrl } } = await supabase.storage
|
|
177
|
+
.from('user-uploads')
|
|
178
|
+
.createSignedUrl(`${userId}/${filename}`, 3600);
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
```sql
|
|
182
|
+
-- Storage RLS: users can only access their own files
|
|
183
|
+
CREATE POLICY "users can manage own files"
|
|
184
|
+
ON storage.objects FOR ALL
|
|
185
|
+
USING (bucket_id = 'user-uploads' AND auth.uid()::text = (storage.foldername(name))[1]);
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Production Security Checklist
|
|
189
|
+
- [ ] All tables in `public` schema have RLS enabled.
|
|
190
|
+
- [ ] `service_role` key is only in server-side environment variables.
|
|
191
|
+
- [ ] PKCE flow enabled (`flowType: 'pkce'`) in Auth v3 client.
|
|
192
|
+
- [ ] Storage buckets are private by default.
|
|
193
|
+
- [ ] JWT expiry set appropriately (recommended: 1 hour + refresh tokens).
|
|
194
|
+
- [ ] Email confirmations required for new signups.
|
|
195
|
+
- [ ] Supabase Linter (`supabase db lint`) passes with no critical issues.
|
|
196
|
+
- [ ] MFA (Multi-Factor Authentication) enabled for admin users.
|
|
197
|
+
- [ ] Realtime subscriptions restricted — filter by authenticated user.
|
|
198
|
+
- [ ] Custom `auth.uid()` policies tested with anonymous/different user sessions.
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
<a name="bahasa-indonesia"></a>
|
|
203
|
+
## Bahasa Indonesia
|
|
204
|
+
|
|
205
|
+
### Integrasi Orkestrasi
|
|
206
|
+
Terhubung dan mengorkestrasi skill domain yang relevan seperti `brainstorming`, `zero-to-prod-orchestrator`, dan `project-context-mapper` untuk memastikan eksekusi yang kohesif.
|
|
207
|
+
|
|
208
|
+
### Deskripsi
|
|
209
|
+
Panduan ahli untuk mengaudit dan mengeraskan aplikasi Supabase. Mencakup Row Level Security (RLS), Supabase Auth v3 (PKCE flow), kebersihan API key, pencegahan kebocoran data, Supabase Linter, dan checklist keamanan produksi.
|
|
210
|
+
|
|
211
|
+
### Kondisi Pemicu
|
|
212
|
+
- Mengaudit kebijakan RLS untuk kebenaran dan celah keamanan.
|
|
213
|
+
- Menyiapkan Supabase Auth v3 dengan PKCE flow (menggantikan implicit flow).
|
|
214
|
+
- Meninjau penggunaan API key (anon key vs. service role key).
|
|
215
|
+
- Mencegah kebocoran data dari kebijakan yang salah konfigurasi.
|
|
216
|
+
- Menjalankan Supabase Linter untuk pemeriksaan keamanan otomatis.
|
|
217
|
+
|
|
218
|
+
### Supabase Auth v3 — PKCE Flow (Default 2026)
|
|
219
|
+
|
|
220
|
+
Supabase Auth v3 menggunakan **PKCE** sebagai alur default untuk semua OAuth dan magic link — menggantikan implicit flow yang lama. Konfigurasikan dengan `flowType: 'pkce'` di klien browser dan gunakan `@supabase/ssr` untuk penanganan sesi sisi server di Next.js App Router.
|
|
221
|
+
|
|
222
|
+
### Keamanan API Key
|
|
223
|
+
|
|
224
|
+
| Tipe Key | Tujuan | Tempat Penggunaan |
|
|
225
|
+
|---|---|---|
|
|
226
|
+
| `anon` key | Akses klien publik — dibatasi RLS | Frontend (browser) |
|
|
227
|
+
| `service_role` key | Melewati SEMUA RLS | Hanya backend (server) |
|
|
228
|
+
|
|
229
|
+
> ⚠️ **JANGAN PERNAH** mengekspos `service_role` key ke frontend. Jika bocor, penyerang dapat membaca/menulis semua data di database Anda, melewati RLS sepenuhnya.
|
|
230
|
+
|
|
231
|
+
### Audit Kebijakan RLS
|
|
232
|
+
|
|
233
|
+
Kesalahan RLS umum: menggunakan `USING (true)` tanpa pemeriksaan autentikasi (siapa saja, termasuk anonim, dapat membaca). Selalu verifikasi dengan `auth.role() = 'authenticated'` atau cek `auth.uid()` eksplisit.
|
|
234
|
+
|
|
235
|
+
Gunakan query audit SQL untuk menemukan tabel tanpa RLS dan tabel dengan RLS aktif tetapi tanpa kebijakan (memblokir semua akses).
|
|
236
|
+
|
|
237
|
+
### Supabase Linter
|
|
238
|
+
Jalankan `supabase db lint` untuk pemeriksaan keamanan otomatis: tabel dengan RLS dinonaktifkan, kebijakan menggunakan fungsi yang dapat dimutasi, fungsi security definer tanpa `search_path`.
|
|
239
|
+
|
|
240
|
+
### Keamanan Storage
|
|
241
|
+
Buat bucket penyimpanan privat (`public: false`) dengan batasan ukuran file dan tipe MIME yang diizinkan. Gunakan URL bertanda tangan (signed URL) untuk memberikan akses sementara ke file privat. Terapkan RLS di `storage.objects` untuk memastikan pengguna hanya dapat mengakses file mereka sendiri.
|
|
242
|
+
|
|
243
|
+
### Checklist Keamanan Produksi
|
|
244
|
+
- Semua tabel di schema `public` mengaktifkan RLS.
|
|
245
|
+
- `service_role` key hanya di variabel lingkungan sisi server.
|
|
246
|
+
- PKCE flow diaktifkan di klien Auth v3.
|
|
247
|
+
- Bucket storage privat secara default.
|
|
248
|
+
- Supabase Linter tidak ada isu kritis.
|
|
249
|
+
- MFA diaktifkan untuk pengguna admin.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: svelte-sveltekit-expert
|
|
3
|
+
description: "Expert guide for Svelte 5 (Runes) and SvelteKit 2+ — fine-grained reactivity, server-first architecture, form actions, and SSR/SSG / Panduan ahli Svelte 5 (Runes) dan SvelteKit 2+ — reaktivitas fine-grained, arsitektur server-first, form actions, dan SSR/SSG."
|
|
4
|
+
author: "Roedy Rustam"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Svelte & SvelteKit Expert (2026 Edition)
|
|
8
|
+
|
|
9
|
+
[English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
<a name="english"></a>
|
|
14
|
+
## English
|
|
15
|
+
|
|
16
|
+
### Orchestration & Integration
|
|
17
|
+
- **`tailwind-expert`**: Tailwind CSS v4 integration with SvelteKit.
|
|
18
|
+
- **`performance-web-vitals`**: Svelte's compile-time optimizations and zero-overhead reactivity.
|
|
19
|
+
- **`e2e-testing-expert`**: Playwright testing for SvelteKit applications.
|
|
20
|
+
- **`typescript-expert`**: TypeScript integration with Svelte 5 Runes.
|
|
21
|
+
|
|
22
|
+
### Description
|
|
23
|
+
Expert guide for building high-performance applications with Svelte 5 and SvelteKit 2+. Covers Runes (`$state`, `$derived`, `$effect`, `$props`), server-first architecture, form actions, load functions, streaming, SSR/SSG/ISR rendering modes, and migration from Svelte 4.
|
|
24
|
+
|
|
25
|
+
### Trigger Conditions
|
|
26
|
+
- Building applications with Svelte or SvelteKit.
|
|
27
|
+
- Migrating from Svelte 4 to Svelte 5 Runes.
|
|
28
|
+
- Choosing between Svelte and React/Vue for a new project.
|
|
29
|
+
- Implementing server-side rendering with SvelteKit.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
### Svelte 5 Runes
|
|
34
|
+
|
|
35
|
+
```svelte
|
|
36
|
+
<script lang="ts">
|
|
37
|
+
// Svelte 5 Runes — fine-grained reactivity
|
|
38
|
+
let count = $state(0);
|
|
39
|
+
let doubled = $derived(count * 2);
|
|
40
|
+
|
|
41
|
+
$effect(() => {
|
|
42
|
+
console.log(`Count changed to ${count}`);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Props with Runes
|
|
46
|
+
let { title, onSubmit }: { title: string; onSubmit: (v: number) => void } = $props();
|
|
47
|
+
</script>
|
|
48
|
+
|
|
49
|
+
<h1>{title}</h1>
|
|
50
|
+
<button onclick={() => count++}>Count: {count} (doubled: {doubled})</button>
|
|
51
|
+
<button onclick={() => onSubmit(count)}>Submit</button>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### SvelteKit Server Patterns
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
// src/routes/posts/+page.server.ts
|
|
58
|
+
import type { PageServerLoad, Actions } from './$types';
|
|
59
|
+
import { fail } from '@sveltejs/kit';
|
|
60
|
+
|
|
61
|
+
export const load: PageServerLoad = async ({ fetch }) => {
|
|
62
|
+
const posts = await fetch('/api/posts').then((r) => r.json());
|
|
63
|
+
return { posts };
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export const actions: Actions = {
|
|
67
|
+
create: async ({ request }) => {
|
|
68
|
+
const data = await request.formData();
|
|
69
|
+
const title = data.get('title');
|
|
70
|
+
if (!title) return fail(400, { error: 'Title required' });
|
|
71
|
+
// Create post...
|
|
72
|
+
return { success: true };
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Orchestration & Integration
|
|
78
|
+
- `tailwind-expert`, `performance-web-vitals`, `e2e-testing-expert`, `typescript-expert`
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
<a name="bahasa-indonesia"></a>
|
|
83
|
+
## Bahasa Indonesia
|
|
84
|
+
|
|
85
|
+
### Deskripsi
|
|
86
|
+
Panduan ahli untuk membangun aplikasi berperforma tinggi dengan Svelte 5 dan SvelteKit 2+. Mencakup Runes, arsitektur server-first, form actions, load functions, streaming, dan mode rendering SSR/SSG/ISR.
|
|
87
|
+
|
|
88
|
+
### Kondisi Pemicu
|
|
89
|
+
- Membangun aplikasi dengan Svelte atau SvelteKit.
|
|
90
|
+
- Migrasi dari Svelte 4 ke Svelte 5 Runes.
|
|
91
|
+
- Memilih antara Svelte dan React/Vue untuk proyek baru.
|