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