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,237 +1,257 @@
1
- ---
2
- name: saas-multi-tenant
3
- description: "Design and implement multi-tenant SaaS architectures with RLS, tenant isolation, and PostgreSQL / Desain dan implementasikan arsitektur SaaS multi-tenant dengan RLS, isolasi tenant, dan PostgreSQL."
1
+ ---
2
+ name: saas-multi-tenant
3
+ description: "Design and implement multi-tenant SaaS architectures with RLS, tenant isolation, and PostgreSQL / Desain dan implementasikan arsitektur SaaS multi-tenant dengan RLS, isolasi tenant, dan PostgreSQL."
4
4
  author: "Roedy Rustam"
5
- ---
6
-
7
- # SaaS Multi-Tenant Expert (2026 Edition)
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 designing and implementing multi-tenant SaaS architectures with full tenant isolation, Supabase/PostgreSQL Row Level Security (RLS), schema-per-org patterns, RBAC, and Super Admin access controls.
18
-
19
- ### Trigger Conditions
20
- - Building a SaaS application that serves multiple organizations (workspaces/tenants).
21
- - Implementing Row Level Security (RLS) policies in Supabase or PostgreSQL.
22
- - Designing a data model that isolates tenant data securely.
23
- - Implementing role-based access control (RBAC) within a tenant.
24
- - Building the Super Admin management panel for cross-tenant operations.
25
- - Choosing between shared schema vs. schema-per-org isolation strategies.
26
-
27
- ### Tenant Isolation Strategies
28
-
29
- | Strategy | Isolation Level | Cost | Complexity | Best For |
30
- |---|---|---|---|---|
31
- | **Shared Schema + RLS** | Row-level | Low | Medium | Standard SaaS (< 1M tenants) |
32
- | **Schema per Org** | Table-level | Medium | High | Compliance-heavy (HIPAA, finance) |
33
- | **DB per Org** | Database-level | High | Very High | Enterprise, regulated industries |
34
-
35
- ### Strategy 1: Shared Schema + RLS (Recommended for Most SaaS)
36
-
37
- #### Core Schema Design
38
- ```sql
39
- -- Central workspaces (tenants) table
40
- CREATE TABLE workspaces (
41
- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
42
- name TEXT NOT NULL,
43
- slug TEXT UNIQUE NOT NULL,
44
- plan TEXT NOT NULL DEFAULT 'free' CHECK (plan IN ('free', 'pro', 'enterprise')),
45
- created_at TIMESTAMPTZ NOT NULL DEFAULT now()
46
- );
47
-
48
- -- Users belong to multiple workspaces via memberships
49
- CREATE TABLE workspace_members (
50
- workspace_id UUID REFERENCES workspaces(id) ON DELETE CASCADE,
51
- user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE,
52
- role TEXT NOT NULL DEFAULT 'member' CHECK (role IN ('owner', 'admin', 'member', 'viewer')),
53
- created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
54
- PRIMARY KEY (workspace_id, user_id)
55
- );
56
-
57
- -- All tenant data has workspace_id
58
- CREATE TABLE projects (
59
- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
60
- workspace_id UUID NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
61
- name TEXT NOT NULL,
62
- created_by UUID REFERENCES auth.users(id),
63
- created_at TIMESTAMPTZ NOT NULL DEFAULT now()
64
- );
65
- ```
66
-
67
- #### Row Level Security Policies
68
- ```sql
69
- -- Enable RLS on all tenant tables
70
- ALTER TABLE projects ENABLE ROW LEVEL SECURITY;
71
-
72
- -- Policy: Users can only see projects in their workspaces
73
- CREATE POLICY "workspace members can view projects"
74
- ON projects FOR SELECT
75
- USING (
76
- workspace_id IN (
77
- SELECT workspace_id FROM workspace_members
78
- WHERE user_id = auth.uid()
79
- )
80
- );
81
-
82
- -- Policy: Only admins and owners can create projects
83
- CREATE POLICY "admins can create projects"
84
- ON projects FOR INSERT
85
- WITH CHECK (
86
- workspace_id IN (
87
- SELECT workspace_id FROM workspace_members
88
- WHERE user_id = auth.uid()
89
- AND role IN ('owner', 'admin')
90
- )
91
- );
92
-
93
- -- Policy: Super Admin can bypass RLS (service role only)
94
- -- ⚠️ NEVER expose service role key to frontend
95
- ```
96
-
97
- #### Session Management & RLS Optimization
98
- To avoid performance bottlenecks, embed `workspace_id` and `role` directly into the user's Session JWT (Custom Claims). This allows RLS policies to check the session token directly (`auth.jwt()->>'workspace_id'`) instead of joining the `workspace_members` table on every query.
99
-
100
- #### RLS Helper Functions
101
- ```sql
102
- -- Helper: Check if current user has a minimum role in a workspace
103
- CREATE OR REPLACE FUNCTION user_has_role(
104
- p_workspace_id UUID,
105
- p_min_role TEXT
106
- ) RETURNS BOOLEAN AS $$
107
- DECLARE
108
- role_hierarchy TEXT[] := ARRAY['viewer', 'member', 'admin', 'owner'];
109
- user_role TEXT;
110
- BEGIN
111
- SELECT role INTO user_role
112
- FROM workspace_members
113
- WHERE workspace_id = p_workspace_id AND user_id = auth.uid();
114
-
115
- RETURN (
116
- array_position(role_hierarchy, user_role) >=
117
- array_position(role_hierarchy, p_min_role)
118
- );
119
- END;
120
- $$ LANGUAGE plpgsql SECURITY DEFINER;
121
- ```
122
-
123
- ### Strategy 2: Schema per Org (Compliance-Heavy)
124
- For regulated industries requiring strict data separation:
125
- ```sql
126
- -- Dynamically create a schema for each new tenant
127
- CREATE OR REPLACE FUNCTION create_tenant_schema(p_slug TEXT) RETURNS VOID AS $$
128
- BEGIN
129
- EXECUTE format('CREATE SCHEMA IF NOT EXISTS tenant_%s', p_slug);
130
-
131
- -- Create all tenant tables in the new schema
132
- EXECUTE format('
133
- CREATE TABLE tenant_%s.projects (
134
- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
135
- name TEXT NOT NULL,
136
- created_at TIMESTAMPTZ NOT NULL DEFAULT now()
137
- )', p_slug);
138
- END;
139
- $$ LANGUAGE plpgsql;
140
-
141
- -- Bypass pattern: set search_path per connection
142
- SET search_path TO tenant_acme, public;
143
- SELECT * FROM projects; -- Reads from tenant_acme.projects only
144
- ```
145
-
146
- ### Super Admin Architecture
147
-
148
- Super Admin is a separate system that operates **across all tenants** with elevated privileges:
149
-
150
- ```typescript
151
- // Super Admin routes are ONLY accessible at admin.yourdomain.com
152
- // Enforced at DNS + middleware level
153
-
154
- // middleware.ts verify super admin domain
155
- if (hostname === 'admin.yourdomain.com') {
156
- const session = await verifyAdminSession(req);
157
- if (!session?.user.isSuperAdmin) {
158
- return NextResponse.redirect('https://yourdomain.com');
159
- }
160
- }
161
- ```
162
-
163
- ```sql
164
- -- Super Admin uses service role to bypass RLS
165
- -- admin.sql — queries bypass all RLS policies when using service role key
166
-
167
- -- Cross-tenant query (only accessible with service role)
168
- SELECT w.name, COUNT(wm.user_id) as member_count, w.plan
169
- FROM workspaces w
170
- LEFT JOIN workspace_members wm ON w.id = wm.workspace_id
171
- GROUP BY w.id
172
- ORDER BY member_count DESC;
173
- ```
174
-
175
- ### RBAC Implementation (TypeScript)
176
- ```typescript
177
- type Role = 'owner' | 'admin' | 'member' | 'viewer';
178
-
179
- const ROLE_PERMISSIONS: Record<Role, string[]> = {
180
- owner: ['*'], // All permissions
181
- admin: ['project:create', 'project:delete', 'member:invite', 'member:remove'],
182
- member: ['project:create', 'project:read', 'project:update'],
183
- viewer: ['project:read'],
184
- };
185
-
186
- function can(userRole: Role, permission: string): boolean {
187
- const perms = ROLE_PERMISSIONS[userRole];
188
- return perms.includes('*') || perms.includes(permission);
189
- }
190
-
191
- // Usage in API handler
192
- if (!can(currentMember.role, 'project:delete')) {
193
- throw new ForbiddenError('Insufficient permissions');
194
- }
195
- ```
196
-
197
- ---
198
-
199
- <a name="bahasa-indonesia"></a>
200
- ## Bahasa Indonesia
201
-
202
- ### Deskripsi
203
- Panduan ahli untuk merancang dan mengimplementasikan arsitektur SaaS multi-tenant dengan isolasi tenant penuh, Row Level Security (RLS) Supabase/PostgreSQL, pola schema-per-org, RBAC, dan kontrol akses Super Admin.
204
-
205
- ### Kondisi Pemicu
206
- - Membangun aplikasi SaaS yang melayani beberapa organisasi (workspace/tenant).
207
- - Mengimplementasikan kebijakan Row Level Security (RLS) di Supabase atau PostgreSQL.
208
- - Merancang model data yang mengisolasi data tenant dengan aman.
209
- - Mengimplementasikan role-based access control (RBAC) dalam tenant.
210
- - Membangun panel manajemen Super Admin untuk operasi lintas tenant.
211
- - Memilih antara shared schema vs. schema-per-org.
212
-
213
- ### Strategi Isolasi Tenant
214
-
215
- | Strategi | Level Isolasi | Biaya | Kompleksitas | Terbaik Untuk |
216
- |---|---|---|---|---|
217
- | **Shared Schema + RLS** | Row-level | Rendah | Sedang | SaaS standar (< 1M tenant) |
218
- | **Schema per Org** | Table-level | Sedang | Tinggi | Kepatuhan ketat (HIPAA, keuangan) |
219
- | **DB per Org** | Database-level | Tinggi | Sangat Tinggi | Enterprise, industri teratur |
220
-
221
- ### Strategi 1: Shared Schema + RLS (Direkomendasikan)
222
- Rancang tabel `workspaces` (tenant), `workspace_members` (keanggotaan + role), dan semua tabel data dengan kolom `workspace_id`. Terapkan RLS agar pengguna hanya dapat melihat data workspace mereka sendiri.
223
-
224
- #### Optimasi Session Management & RLS
225
- Untuk menghindari bottleneck performa, sematkan `workspace_id` dan `role` langsung ke dalam Session JWT pengguna (Custom Claims). Ini memungkinkan kebijakan RLS untuk memeriksa token sesi secara langsung (`auth.jwt()->>'workspace_id'`) daripada melakukan join ke tabel `workspace_members` pada setiap query.
226
-
227
- #### Fungsi Helper RLS
228
- Buat fungsi `user_has_role()` yang dapat digunakan kembali di seluruh kebijakan RLS untuk memeriksa apakah pengguna saat ini memiliki role minimum yang diperlukan dalam workspace tertentu.
229
-
230
- ### Strategi 2: Schema per Org
231
- Untuk industri teratur yang membutuhkan pemisahan data ketat. Buat schema PostgreSQL terpisah untuk setiap tenant secara dinamis. Atur `search_path` per koneksi untuk mengarahkan query ke schema tenant yang benar.
232
-
233
- ### Arsitektur Super Admin
234
- Super Admin adalah sistem terpisah yang beroperasi **di semua tenant** dengan hak istimewa yang ditingkatkan. Hanya dapat diakses di `admin.yourdomain.com` — diberlakukan di level DNS dan middleware. Menggunakan service role key Supabase untuk mem-bypass RLS dan melakukan query lintas tenant.
235
-
236
- ### Implementasi RBAC
237
- Definisikan peta izin per role (`owner`, `admin`, `member`, `viewer`) dan fungsi `can()` helper untuk memeriksa izin dalam API handler.
5
+ ---
6
+
7
+ # SaaS Multi-Tenant 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
+ 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 designing and implementing multi-tenant SaaS architectures with full tenant isolation, Supabase/PostgreSQL Row Level Security (RLS), schema-per-org patterns, RBAC, and Super Admin access controls.
21
+
22
+ ### Trigger Conditions
23
+ - Building a SaaS application that serves multiple organizations (workspaces/tenants).
24
+ - Implementing Row Level Security (RLS) policies in Supabase or PostgreSQL.
25
+ - Designing a data model that isolates tenant data securely.
26
+ - Implementing role-based access control (RBAC) within a tenant.
27
+ - Building the Super Admin management panel for cross-tenant operations.
28
+ - Choosing between shared schema vs. schema-per-org isolation strategies.
29
+
30
+ ### Tenant Isolation Strategies
31
+
32
+ | Strategy | Isolation Level | Cost | Complexity | Best For |
33
+ |---|---|---|---|---|
34
+ | **Shared Schema + RLS** | Row-level | Low | Medium | Standard SaaS (< 1M tenants) |
35
+ | **Schema per Org** | Table-level | Medium | High | Compliance-heavy (HIPAA, finance) |
36
+ | **DB per Org** | Database-level | High | Very High | Enterprise, regulated industries |
37
+
38
+ ### Strategy 1: Shared Schema + RLS (Recommended for Most SaaS)
39
+
40
+ #### Core Schema Design
41
+ ```sql
42
+ -- Central workspaces (tenants) table
43
+ CREATE TABLE workspaces (
44
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
45
+ name TEXT NOT NULL,
46
+ slug TEXT UNIQUE NOT NULL,
47
+ plan TEXT NOT NULL DEFAULT 'free' CHECK (plan IN ('free', 'pro', 'enterprise')),
48
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now()
49
+ );
50
+
51
+ -- Users belong to multiple workspaces via memberships
52
+ CREATE TABLE workspace_members (
53
+ workspace_id UUID REFERENCES workspaces(id) ON DELETE CASCADE,
54
+ user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE,
55
+ role TEXT NOT NULL DEFAULT 'member' CHECK (role IN ('owner', 'admin', 'member', 'viewer')),
56
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
57
+ PRIMARY KEY (workspace_id, user_id)
58
+ );
59
+
60
+ -- All tenant data has workspace_id
61
+ CREATE TABLE projects (
62
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
63
+ workspace_id UUID NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
64
+ name TEXT NOT NULL,
65
+ created_by UUID REFERENCES auth.users(id),
66
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now()
67
+ );
68
+ ```
69
+
70
+ #### Row Level Security Policies
71
+ ```sql
72
+ -- Enable RLS on all tenant tables
73
+ ALTER TABLE projects ENABLE ROW LEVEL SECURITY;
74
+
75
+ -- Policy: Users can only see projects in their workspaces
76
+ CREATE POLICY "workspace members can view projects"
77
+ ON projects FOR SELECT
78
+ USING (
79
+ workspace_id IN (
80
+ SELECT workspace_id FROM workspace_members
81
+ WHERE user_id = auth.uid()
82
+ )
83
+ );
84
+
85
+ -- Policy: Only admins and owners can create projects
86
+ CREATE POLICY "admins can create projects"
87
+ ON projects FOR INSERT
88
+ WITH CHECK (
89
+ workspace_id IN (
90
+ SELECT workspace_id FROM workspace_members
91
+ WHERE user_id = auth.uid()
92
+ AND role IN ('owner', 'admin')
93
+ )
94
+ );
95
+
96
+ -- Policy: Super Admin can bypass RLS (service role only)
97
+ -- ⚠️ NEVER expose service role key to frontend
98
+ ```
99
+
100
+ #### Session Management & RLS Optimization
101
+ To avoid performance bottlenecks, embed `workspace_id` and `role` directly into the user's Session JWT (Custom Claims). This allows RLS policies to check the session token directly (`auth.jwt()->>'workspace_id'`) instead of joining the `workspace_members` table on every query.
102
+
103
+ #### RLS Helper Functions
104
+ ```sql
105
+ -- Helper: Check if current user has a minimum role in a workspace
106
+ CREATE OR REPLACE FUNCTION user_has_role(
107
+ p_workspace_id UUID,
108
+ p_min_role TEXT
109
+ ) RETURNS BOOLEAN AS $$
110
+ DECLARE
111
+ role_hierarchy TEXT[] := ARRAY['viewer', 'member', 'admin', 'owner'];
112
+ user_role TEXT;
113
+ BEGIN
114
+ SELECT role INTO user_role
115
+ FROM workspace_members
116
+ WHERE workspace_id = p_workspace_id AND user_id = auth.uid();
117
+
118
+ RETURN (
119
+ array_position(role_hierarchy, user_role) >=
120
+ array_position(role_hierarchy, p_min_role)
121
+ );
122
+ END;
123
+ $$ LANGUAGE plpgsql SECURITY DEFINER;
124
+ ```
125
+
126
+ ### Strategy 2: Schema per Org (Compliance-Heavy)
127
+ For regulated industries requiring strict data separation:
128
+ ```sql
129
+ -- Dynamically create a schema for each new tenant
130
+ CREATE OR REPLACE FUNCTION create_tenant_schema(p_slug TEXT) RETURNS VOID AS $$
131
+ BEGIN
132
+ EXECUTE format('CREATE SCHEMA IF NOT EXISTS tenant_%s', p_slug);
133
+
134
+ -- Create all tenant tables in the new schema
135
+ EXECUTE format('
136
+ CREATE TABLE tenant_%s.projects (
137
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
138
+ name TEXT NOT NULL,
139
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now()
140
+ )', p_slug);
141
+ END;
142
+ $$ LANGUAGE plpgsql;
143
+
144
+ -- Bypass pattern: set search_path per connection
145
+ SET search_path TO tenant_acme, public;
146
+ SELECT * FROM projects; -- Reads from tenant_acme.projects only
147
+ ```
148
+
149
+ ### Super Admin Architecture
150
+
151
+ Super Admin is a separate system that operates **across all tenants** with elevated privileges:
152
+
153
+ ```typescript
154
+ // Super Admin routes are ONLY accessible at admin.yourdomain.com
155
+ // Enforced at DNS + middleware level
156
+
157
+ // middleware.ts — verify super admin domain
158
+ if (hostname === 'admin.yourdomain.com') {
159
+ const session = await verifyAdminSession(req);
160
+ if (!session?.user.isSuperAdmin) {
161
+ return NextResponse.redirect('https://yourdomain.com');
162
+ }
163
+ }
164
+ ```
165
+
166
+ ```sql
167
+ -- Super Admin uses service role to bypass RLS
168
+ -- admin.sql queries bypass all RLS policies when using service role key
169
+
170
+ -- Cross-tenant query (only accessible with service role)
171
+ SELECT w.name, COUNT(wm.user_id) as member_count, w.plan
172
+ FROM workspaces w
173
+ LEFT JOIN workspace_members wm ON w.id = wm.workspace_id
174
+ GROUP BY w.id
175
+ ORDER BY member_count DESC;
176
+ ```
177
+
178
+ ### RBAC Implementation (TypeScript)
179
+ ```typescript
180
+ type Role = 'owner' | 'admin' | 'member' | 'viewer';
181
+
182
+ const ROLE_PERMISSIONS: Record<Role, string[]> = {
183
+ owner: ['*'], // All permissions
184
+ admin: ['project:create', 'project:delete', 'member:invite', 'member:remove'],
185
+ member: ['project:create', 'project:read', 'project:update'],
186
+ viewer: ['project:read'],
187
+ };
188
+
189
+ function can(userRole: Role, permission: string): boolean {
190
+ const perms = ROLE_PERMISSIONS[userRole];
191
+ return perms.includes('*') || perms.includes(permission);
192
+ }
193
+
194
+ // Usage in API handler
195
+ if (!can(currentMember.role, 'project:delete')) {
196
+ throw new ForbiddenError('Insufficient permissions');
197
+ }
198
+ ```
199
+
200
+ ### Skill Orchestration & Handoff
201
+ - **Upstream Orchestrator**: Executes during **Phase 3** of `zero-to-prod-orchestrator` or SaaS design lock in `brainstorming`.
202
+ - **Database & Security**: Delegate database schema migrations to `supabase-migration` and security audit / App Check rules to `supabase-security-expert`.
203
+ - **SaaS Billing & Monitization**: Delegate subscription state machines and Stripe/Polar integration to `saas-billing` and `payment-gateway-expert`.
204
+ - **Multi-Entry Points**: Delegate Super Admin domain isolation (`admin.yourdomain.com`) to `multiple-entry-points`.
205
+ - **Transformation Roadmap**: Coordinate with `saas-transformer` and `saas-mvp-launcher` when upgrading single-tenant apps to multi-tenant.
206
+
207
+ ---
208
+
209
+ <a name="bahasa-indonesia"></a>
210
+ ## Bahasa Indonesia
211
+
212
+ ### Integrasi Orkestrasi
213
+ Terhubung dan mengorkestrasi skill domain yang relevan seperti `brainstorming`, `zero-to-prod-orchestrator`, dan `project-context-mapper` untuk memastikan eksekusi yang kohesif.
214
+
215
+ ### Deskripsi
216
+ Panduan ahli untuk merancang dan mengimplementasikan arsitektur SaaS multi-tenant dengan isolasi tenant penuh, Row Level Security (RLS) Supabase/PostgreSQL, pola schema-per-org, RBAC, dan kontrol akses Super Admin.
217
+
218
+ ### Kondisi Pemicu
219
+ - Membangun aplikasi SaaS yang melayani beberapa organisasi (workspace/tenant).
220
+ - Mengimplementasikan kebijakan Row Level Security (RLS) di Supabase atau PostgreSQL.
221
+ - Merancang model data yang mengisolasi data tenant dengan aman.
222
+ - Mengimplementasikan role-based access control (RBAC) dalam tenant.
223
+ - Membangun panel manajemen Super Admin untuk operasi lintas tenant.
224
+ - Memilih antara shared schema vs. schema-per-org.
225
+
226
+ ### Strategi Isolasi Tenant
227
+
228
+ | Strategi | Level Isolasi | Biaya | Kompleksitas | Terbaik Untuk |
229
+ |---|---|---|---|---|
230
+ | **Shared Schema + RLS** | Row-level | Rendah | Sedang | SaaS standar (< 1M tenant) |
231
+ | **Schema per Org** | Table-level | Sedang | Tinggi | Kepatuhan ketat (HIPAA, keuangan) |
232
+ | **DB per Org** | Database-level | Tinggi | Sangat Tinggi | Enterprise, industri teratur |
233
+
234
+ ### Strategi 1: Shared Schema + RLS (Direkomendasikan)
235
+ Rancang tabel `workspaces` (tenant), `workspace_members` (keanggotaan + role), dan semua tabel data dengan kolom `workspace_id`. Terapkan RLS agar pengguna hanya dapat melihat data workspace mereka sendiri.
236
+
237
+ #### Optimasi Session Management & RLS
238
+ Untuk menghindari bottleneck performa, sematkan `workspace_id` dan `role` langsung ke dalam Session JWT pengguna (Custom Claims). Ini memungkinkan kebijakan RLS untuk memeriksa token sesi secara langsung (`auth.jwt()->>'workspace_id'`) daripada melakukan join ke tabel `workspace_members` pada setiap query.
239
+
240
+ #### Fungsi Helper RLS
241
+ Buat fungsi `user_has_role()` yang dapat digunakan kembali di seluruh kebijakan RLS untuk memeriksa apakah pengguna saat ini memiliki role minimum yang diperlukan dalam workspace tertentu.
242
+
243
+ ### Strategi 2: Schema per Org
244
+ Untuk industri teratur yang membutuhkan pemisahan data ketat. Buat schema PostgreSQL terpisah untuk setiap tenant secara dinamis. Atur `search_path` per koneksi untuk mengarahkan query ke schema tenant yang benar.
245
+
246
+ ### Arsitektur Super Admin
247
+ Super Admin adalah sistem terpisah yang beroperasi **di semua tenant** dengan hak istimewa yang ditingkatkan. Hanya dapat diakses di `admin.yourdomain.com` — diberlakukan di level DNS dan middleware. Menggunakan service role key Supabase untuk mem-bypass RLS dan melakukan query lintas tenant.
248
+
249
+ ### Implementasi RBAC
250
+ Definisikan peta izin per role (`owner`, `admin`, `member`, `viewer`) dan fungsi `can()` helper untuk memeriksa izin dalam API handler.
251
+
252
+ ### Orkestrasi Skill & Serah Terima
253
+ - **Orkestrator Utama**: Dieksekusi pada **Fase 3** dari `zero-to-prod-orchestrator` atau saat finalisasi SaaS di `brainstorming`.
254
+ - **Database & Keamanan**: Delegasikan migrasi skema ke `supabase-migration` dan audit keamanan / RLS ke `supabase-security-expert`.
255
+ - **SaaS Billing & Monitisasi**: Delegasikan state machine langganan dan integrasi Stripe/Polar ke `saas-billing` dan `payment-gateway-expert`.
256
+ - **Multi-Entry Points**: Delegasikan isolasi domain Super Admin (`admin.domain.com`) ke `multiple-entry-points`.
257
+ - **Roadmap Transformasi**: Koordinasikan dengan `saas-transformer` dan `saas-mvp-launcher` saat mentransformasi aplikasi single-tenant ke multi-tenant.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: saas-mvp-launcher
3
3
  description: "Structured roadmap and design to plan and launch a SaaS MVP from scratch / Panduan terstruktur untuk merencanakan dan meluncurkan SaaS MVP dari nol."
4
- author: "Roedy Rustam"
4
+ author: "Roedy Rustam"
5
5
  ---
6
6
 
7
7
  # SaaS MVP Launcher
@@ -13,6 +13,10 @@ author: "Roedy Rustam"
13
13
  <a name="english"></a>
14
14
  ## English
15
15
 
16
+ ### Orchestration & Integration
17
+ Connects and orchestrates with relevant domain skills like `modern-web-guidance`, `brainstorming`, `zero-to-prod-orchestrator`, and `project-context-mapper` to ensure cohesive execution.
18
+ - **MANDATORY**: Execute `modern-web-guidance` FIRST for all frontend HTML/CSS/JS features to ensure compliance with modern Google standards.
19
+
16
20
  ### Overview
17
21
  This skill guides you through building a production-ready SaaS MVP in the shortest time possible. It covers everything from idea validation and tech stack selection to authentication, payments, database design, deployment, and launch — using modern, battle-tested tools.
18
22
 
@@ -75,6 +79,10 @@ Recommended modern SaaS stack (2026):
75
79
  <a name="bahasa-indonesia"></a>
76
80
  ## Bahasa Indonesia
77
81
 
82
+ ### Integrasi Orkestrasi
83
+ Terhubung dan mengorkestrasi skill domain yang relevan seperti `modern-web-guidance`, `brainstorming`, `zero-to-prod-orchestrator`, dan `project-context-mapper` untuk memastikan eksekusi yang kohesif.
84
+ - **MANDATORY**: Eksekusi `modern-web-guidance` PERTAMA KALI untuk semua fitur frontend HTML/CSS/JS guna memastikan kepatuhan dengan standar modern Google.
85
+
78
86
  ### Ringkasan
79
87
  Skill ini memandu Anda membangun SaaS MVP tingkat produksi dalam waktu sesingkat mungkin. Panduan ini mencakup validasi ide, pemilihan stack teknologi, autentikasi, pembayaran, desain database, deployment, hingga checklist peluncuran menggunakan teknologi modern yang teruji.
80
88
 
@@ -229,3 +237,24 @@ export const subscriptions = pgTable('subscriptions', {
229
237
  currentPeriodEnd: timestamp('current_period_end').notNull(),
230
238
  });
231
239
  ```
240
+
241
+ ---
242
+ ### 🎨 Automatic Visual Assets Generation Mandate (CRITICAL)
243
+ **MANDATORY**: Whenever you are building a new application, scaffolding a project, or finalizing the initial UI/UX, you MUST automatically use the `generate_image` tool to create a custom logo that perfectly matches the application's core concept and aesthetic.
244
+ This generated image MUST be explicitly used as:
245
+ 1. The primary application logo (e.g., in the header/navbar).
246
+ 2. The website favicon (`favicon.ico` or equivalent).
247
+ 3. The Open Graph (OG) image for SEO metadata (`og:image`).
248
+
249
+ Do not use placeholders for these assets. Generate and integrate them automatically.
250
+
251
+ ---
252
+ ### 📄 Standard Pages Mandate (CRITICAL)
253
+ **MANDATORY**: Whenever you are building a new application, landing page, or website, you MUST automatically create the following standard pages:
254
+ 1. **About Page** (`/about`)
255
+ 2. **Profile Page** (`/profile`)
256
+ 3. **Contact Page** (`/contact`)
257
+ 4. **Terms of Reference / Terms of Service** (`/terms`)
258
+ 5. **Privacy Policy** (`/privacy-policy`)
259
+
260
+ These pages must be generated with standard boilerplate content that can later be customized to fit the specific application. Do not wait for the user to ask for them; they are a strict requirement for all web projects. / **WAJIB**: Otomatis buatkan halaman standar (About, Profile, Contact, Terms, Privacy Policy) pada setiap pembuatan aplikasi/website baru dengan konten boilerplate yang bisa disesuaikan nanti.