vibes-plug 2.11.0 → 3.9.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 (181) hide show
  1. package/.claude/rules/vibes-plug-core.md +5 -0
  2. package/.cursor/rules/vibes-plug-core.mdc +8 -3
  3. package/.cursorrules +9 -3
  4. package/AGENTS.md +25 -4
  5. package/CHANGELOG.md +151 -0
  6. package/CLAUDE.md +15 -8
  7. package/README.md +216 -641
  8. package/bin/vibes.mjs +1104 -0
  9. package/index.js +1 -1
  10. package/package.json +11 -3
  11. package/plugin.json +4 -3
  12. package/scripts/check-anti-slop.js +53 -0
  13. package/scripts/check-anti-slop.mjs +53 -0
  14. package/scripts/generate_swarm_gif.py +2 -2
  15. package/scripts/install.js +3 -1
  16. package/scripts/update_skills.js +1 -1
  17. package/scripts/update_skills.mjs +86 -0
  18. package/scripts/validate-skills.mjs +111 -0
  19. package/skills/accessibility-testing-expert/SKILL.md +117 -116
  20. package/skills/affective-computing-emotion-ai/SKILL.md +83 -0
  21. package/skills/agentic-coding-workflow-expert/SKILL.md +297 -0
  22. package/skills/agentic-memory-architect/SKILL.md +52 -0
  23. package/skills/agentic-micro-economy-architect/SKILL.md +92 -0
  24. package/skills/ai-llm-integration-expert/SKILL.md +330 -187
  25. package/skills/ai-media-generation-expert/SKILL.md +173 -172
  26. package/skills/ai-prompt-engineering-expert/SKILL.md +170 -50
  27. package/skills/ai-safety-governance-expert/SKILL.md +223 -0
  28. package/skills/angular-expert/SKILL.md +149 -148
  29. package/skills/anti-slop/SKILL.md +134 -0
  30. package/skills/api-design-expert/SKILL.md +4 -3
  31. package/skills/api-gateway-proxy-expert/SKILL.md +3 -2
  32. package/skills/app-analyzer-optimizer/SKILL.md +4 -3
  33. package/skills/apple-ecosystem-expert/SKILL.md +6 -5
  34. package/skills/astro-framework-expert/SKILL.md +201 -200
  35. package/skills/async-queue-temporal-expert/SKILL.md +218 -240
  36. package/skills/authentication-identity-expert/SKILL.md +79 -184
  37. package/skills/autonomous-red-teamer/SKILL.md +338 -203
  38. package/skills/autonomous-tdd-debugger/SKILL.md +6 -5
  39. package/skills/biome-linter-formatter-expert/SKILL.md +90 -89
  40. package/skills/blockchain-web3-expert/SKILL.md +116 -115
  41. package/skills/brainstorming/SKILL.md +392 -377
  42. package/skills/browser-automation-expert/SKILL.md +260 -222
  43. package/skills/bun-runtime-expert/SKILL.md +5 -4
  44. package/skills/chatbot-messaging-expert/SKILL.md +115 -114
  45. package/skills/ci-cd-devops-architect/SKILL.md +3 -2
  46. package/skills/cloud-hosting-expert/SKILL.md +5 -4
  47. package/skills/coderabbit/SKILL.md +5 -4
  48. package/skills/compliance-gdpr-privacy-expert/SKILL.md +3 -2
  49. package/skills/composable-mach-architect/SKILL.md +338 -0
  50. package/skills/cron-scheduler-expert/SKILL.md +5 -4
  51. package/skills/data-pipeline-etl-expert/SKILL.md +3 -2
  52. package/skills/data-telemetry-expert/SKILL.md +5 -4
  53. package/skills/data-visualization-expert/SKILL.md +155 -154
  54. package/skills/database-orm-expert/SKILL.md +102 -240
  55. package/skills/deep-research-analyst/SKILL.md +182 -0
  56. package/skills/dependency-upgrade-migrator/SKILL.md +11 -10
  57. package/skills/design-system-architect/SKILL.md +34 -3
  58. package/skills/desktop-electron-expert/SKILL.md +129 -128
  59. package/skills/documentation-site-expert/SKILL.md +60 -59
  60. package/skills/doku-mcp-server/SKILL.md +5 -4
  61. package/skills/doku-payment-gateway/SKILL.md +250 -232
  62. package/skills/domain-driven-design-expert/SKILL.md +3 -2
  63. package/skills/e2e-testing-expert/SKILL.md +5 -4
  64. package/skills/ecommerce-expert/SKILL.md +88 -87
  65. package/skills/email-notification-expert/SKILL.md +35 -7
  66. package/skills/ephemeral-generative-ui-architect/SKILL.md +88 -0
  67. package/skills/error-resilience-expert/SKILL.md +26 -4
  68. package/skills/event-driven-architect/SKILL.md +5 -4
  69. package/skills/feature-flag-analytics-expert/SKILL.md +3 -2
  70. package/skills/file-upload-media-expert/SKILL.md +5 -4
  71. package/skills/firebase-security-expert/SKILL.md +5 -4
  72. package/skills/form-validation-expert/SKILL.md +7 -6
  73. package/skills/frontier-ai-models-expert/SKILL.md +116 -0
  74. package/skills/fullstack-expert/SKILL.md +68 -144
  75. package/skills/gemini-agent-booster/SKILL.md +248 -172
  76. package/skills/geospatial-maps-expert/SKILL.md +81 -80
  77. package/skills/global-a11y-i18n-expert/SKILL.md +5 -4
  78. package/skills/glsl-shader-expert/SKILL.md +155 -71
  79. package/skills/go-programming-expert/SKILL.md +5 -4
  80. package/skills/graph-rag-knowledge-expert/SKILL.md +201 -159
  81. package/skills/graphql-apollo-expert/SKILL.md +5 -4
  82. package/skills/headless-cms-expert/SKILL.md +182 -181
  83. package/skills/hig/SKILL.md +5 -4
  84. package/skills/js-backend-expert/SKILL.md +219 -218
  85. package/skills/legacy-code-translator/SKILL.md +6 -5
  86. package/skills/llm-finops-router/SKILL.md +52 -0
  87. package/skills/local-slm-edge-ai-expert/SKILL.md +168 -167
  88. package/skills/logging-error-tracking-expert/SKILL.md +5 -4
  89. package/skills/mcp-server-architect/SKILL.md +316 -294
  90. package/skills/micro-frontend-architect/SKILL.md +5 -4
  91. package/skills/mobile-expo-expert/SKILL.md +5 -4
  92. package/skills/modern-css-native-expert/SKILL.md +190 -189
  93. package/skills/monorepo-architect/SKILL.md +5 -4
  94. package/skills/mpa-orchestrator/SKILL.md +41 -4
  95. package/skills/multi-agent-orchestration/SKILL.md +388 -254
  96. package/skills/mvc-expert/SKILL.md +5 -4
  97. package/skills/n8n-automation-expert/SKILL.md +90 -89
  98. package/skills/nextjs-app-router-expert/SKILL.md +3 -2
  99. package/skills/openapi-swagger-codegen-expert/SKILL.md +4 -3
  100. package/skills/payment-gateway-expert/SKILL.md +131 -128
  101. package/skills/pdf-document-generation-expert/SKILL.md +92 -91
  102. package/skills/performance-web-vitals/SKILL.md +5 -4
  103. package/skills/post-quantum-crypto-migrator/SKILL.md +3 -2
  104. package/skills/prd-architect/SKILL.md +85 -109
  105. package/skills/proactive-background-watcher/SKILL.md +5 -4
  106. package/skills/production-ready-hardener/SKILL.md +25 -27
  107. package/skills/pwa-offline-first-expert/SKILL.md +227 -185
  108. package/skills/pydantic-ai-expert/SKILL.md +162 -0
  109. package/skills/python-programming-expert/SKILL.md +5 -4
  110. package/skills/rate-limit-abuse-prevention/SKILL.md +5 -4
  111. package/skills/realtime-collaboration-expert/SKILL.md +3 -2
  112. package/skills/rich-text-editor-expert/SKILL.md +178 -177
  113. package/skills/rust-programming-expert/SKILL.md +5 -4
  114. package/skills/saas-architect/SKILL.md +155 -0
  115. package/skills/saas-billing/SKILL.md +394 -382
  116. package/skills/saas-multi-tenant/SKILL.md +7 -6
  117. package/skills/scalability-clean-code/SKILL.md +5 -4
  118. package/skills/search-engine-expert/SKILL.md +90 -89
  119. package/skills/self-healing-cloud-orchestrator/SKILL.md +3 -2
  120. package/skills/senior-frontend/SKILL.md +21 -18
  121. package/skills/senior-frontend/scripts/frontend_scaffolder.py +1 -1
  122. package/skills/seo/SKILL.md +4 -4
  123. package/skills/session-memory-manager/SKILL.md +129 -0
  124. package/skills/solidjs-expert/SKILL.md +81 -80
  125. package/skills/spa-orchestrator/SKILL.md +5 -4
  126. package/skills/sse-websocket-streaming-expert/SKILL.md +3 -2
  127. package/skills/state-management-expert/SKILL.md +5 -4
  128. package/skills/supabase-security-expert/SKILL.md +5 -4
  129. package/skills/svelte-sveltekit-expert/SKILL.md +92 -91
  130. package/skills/svg-animation-motion-expert/SKILL.md +3 -2
  131. package/skills/synthetic-data-finetuning-expert/SKILL.md +156 -0
  132. package/skills/tailwind-expert/SKILL.md +62 -5
  133. package/skills/tanstack-query-expert/SKILL.md +5 -4
  134. package/skills/tauri-expert/SKILL.md +5 -4
  135. package/skills/typescript-expert/SKILL.md +5 -4
  136. package/skills/ui-ux-pro-max/SKILL.md +7 -4
  137. package/skills/vector-db-rag-expert/SKILL.md +209 -208
  138. package/skills/vercel-ai-sdk-expert/SKILL.md +226 -0
  139. package/skills/voice-ai-realtime-agent/SKILL.md +243 -202
  140. package/skills/vue-frontend-expert/SKILL.md +5 -4
  141. package/skills/wasm-edge-computing-expert/SKILL.md +3 -2
  142. package/skills/web-3d-graphics-expert/SKILL.md +259 -82
  143. package/skills/web-game-engine-expert/SKILL.md +278 -50
  144. package/skills/web-scraper/SKILL.md +158 -157
  145. package/skills/website-design-cloner/SKILL.md +5 -4
  146. package/skills/webxr-ar-vr-expert/SKILL.md +105 -65
  147. package/skills/wordpress-headless-expert/SKILL.md +145 -144
  148. package/skills/zero-tech-debt-auditor/SKILL.md +115 -0
  149. package/skills/zero-to-prod-orchestrator/SKILL.md +281 -227
  150. package/skills/zero-trust-secret-vault/SKILL.md +3 -2
  151. package/BLUEPRINT.md +0 -309
  152. package/skills/ai-cost-token-optimizer/SKILL.md +0 -82
  153. package/skills/ai-evals-benchmark-expert/SKILL.md +0 -188
  154. package/skills/asisten-ramah/SKILL.md +0 -47
  155. package/skills/auto-doc-updater/SKILL.md +0 -220
  156. package/skills/autonomous-chaos-monkey/SKILL.md +0 -63
  157. package/skills/background-jobs-queue-expert/SKILL.md +0 -235
  158. package/skills/bootstrap-to-modern/SKILL.md +0 -94
  159. package/skills/database-migration-versioning-expert/SKILL.md +0 -90
  160. package/skills/edge-serverless-db-expert/SKILL.md +0 -99
  161. package/skills/mcp-client-orchestrator/SKILL.md +0 -76
  162. package/skills/mobile-push-notification-expert/SKILL.md +0 -71
  163. package/skills/monday-design-aesthetic/SKILL.md +0 -73
  164. package/skills/multiple-entry-points/SKILL.md +0 -91
  165. package/skills/project-context-mapper/SKILL.md +0 -85
  166. package/skills/saas-mvp-launcher/SKILL.md +0 -260
  167. package/skills/saas-transformer/SKILL.md +0 -500
  168. package/skills/saas-transformer/references/billing_integration_guide.md +0 -401
  169. package/skills/secure-fuzz-testing/SKILL.md +0 -207
  170. package/skills/self-evolving-memory-graph/SKILL.md +0 -91
  171. package/skills/session-context-loader/SKILL.md +0 -83
  172. package/skills/session-handoff-resume/SKILL.md +0 -164
  173. package/skills/skill-baru/SKILL.md +0 -178
  174. package/skills/supabase-migration/SKILL.md +0 -91
  175. package/skills/token-saver/SKILL.md +0 -119
  176. package/skills/ui-components-expert/SKILL.md +0 -166
  177. package/skills/vibe-code-gardener/SKILL.md +0 -181
  178. package/skills/visual-qa-vision-agent/SKILL.md +0 -71
  179. /package/skills/{saas-transformer → saas-architect}/references/feature_gating_patterns.md +0 -0
  180. /package/skills/{saas-transformer → saas-architect}/references/saas_transformation_checklist.md +0 -0
  181. /package/skills/{saas-transformer → saas-architect}/scripts/saas_transformation_scanner.py +0 -0
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: authentication-identity-expert
3
3
  description: "Expert guide for implementing secure authentication, authorization (RBAC/ABAC), OAuth2, and identity management (Clerk, Auth.js, Supabase Auth) / Panduan ahli untuk autentikasi dan otorisasi."
4
- author: "Roedy Rustam"
4
+ author: "Roedy Rustam"
5
+ version: "3.0.0"
5
6
  ---
6
7
 
7
8
  # Authentication & Identity Expert (2026 Edition)
@@ -14,88 +15,73 @@ author: "Roedy Rustam"
14
15
  ## English
15
16
 
16
17
  ### Description
17
- Production-grade guide for implementing secure authentication, authorization, and identity management in modern web and mobile applications. Covers **Clerk**, **Supabase Auth**, **Auth.js v5**, **Better Auth**, JWT patterns, OAuth 2.1, PKCE flows, RBAC/ABAC, passkeys (WebAuthn), and MFA implementation for React 19 / Next.js 15 stacks.
18
+ Production-grade guide for implementing secure authentication, authorization, and identity management in modern web and mobile applications. Covers **Clerk**, **Supabase Auth**, **Auth.js v5**, **Better Auth**, JWT patterns, OAuth 2.1, PKCE flows, RBAC/ABAC, passkeys (WebAuthn), and MFA implementations for React 19 / Next.js 15 stacks.
18
19
 
19
20
  ### Trigger Conditions
20
- - Working on login/signup flows, session management, or OAuth integration.
21
- - Integrating **Clerk**, **Supabase Auth**, **Auth.js v5**, **Better Auth**, or **Auth0**.
22
- - Implementing **Role-Based Access Control (RBAC)** or **Attribute-Based Access Control (ABAC)**.
23
- - Setting up **WebAuthn/Passkeys**, **MFA/2FA**, or **SSO**.
21
+ - Working on login/signup flows, session management, or OAuth integrations.
22
+ - Integrating Clerk, Supabase Auth, Auth.js v5, Better Auth, or Auth0.
23
+ - Implementing RBAC (Role-Based Access Control) or ABAC.
24
+ - Setting up WebAuthn/Passkeys, MFA/2FA, or SSO.
24
25
  - Securing Next.js App Router routes with middleware-based auth guards.
25
- - Implementing **OAuth 2.1** flows with PKCE for SPAs or mobile apps.
26
26
 
27
27
  ---
28
28
 
29
- ### Identity Provider Selection Guide (2026)
29
+ ### Identity Provider Selection Guide
30
30
 
31
- | Provider | Best For | Key Strength |
32
- |---|---|---|
33
- | **Clerk** | SaaS, B2B apps | Built-in organizations, roles, MFA, UI components |
34
- | **Supabase Auth** | Supabase-powered apps | RLS integration, social login, SSO |
35
- | **Auth.js v5** | Next.js self-hosted | Flexible adapters, edge-compatible |
36
- | **Better Auth** | TypeScript-first self-hosted | Modern DX, built-in 2FA, org management |
37
- | **Auth0** | Enterprise, compliance | Enterprise SSO, compliance (SOC2, HIPAA) |
38
-
39
- **Recommendation**: Use **Clerk** for most new SaaS apps (best DX). Use **Supabase Auth** if you're already using Supabase. Use **Better Auth** for full control without vendor lock-in.
31
+ | Provider | Best For | Key Strength | Pricing Model |
32
+ |---|---|---|---|
33
+ | **Clerk** | New SaaS products | Best developer DX, prebuilt UI components, orgs/teams out-of-the-box | Per MAU (free up to 10k) |
34
+ | **Supabase Auth** | Existing Supabase apps | Native RLS integration, multi-provider OAuth, generous free tier | Included with Supabase |
35
+ | **Auth.js v5** | Self-hosted control | Full data ownership, zero vendor lock-in, Edge-compatible | 100% Free / OSS |
36
+ | **Better Auth** | Modern TS-first apps | Comprehensive TypeScript plugin ecosystem, 2FA, passkeys | 100% Free / OSS |
40
37
 
41
38
  ---
42
39
 
43
- ### Core Security Principles
44
-
45
- #### 1. Never Roll Your Own Crypto
46
- - Use `argon2id` (preferred) or `bcrypt` for password hashing — **never MD5, SHA1, or plain SHA256**.
47
- - Use battle-tested libraries: `@node-rs/argon2`, `bcryptjs`.
48
- - Minimum: bcrypt cost factor ≥12, argon2id memory ≥64MB.
40
+ ### Technical Guidelines & Recipes
49
41
 
50
- #### 2. JWT Best Practices
42
+ #### 1. Password Hashing Standards
51
43
  ```typescript
52
- // ✅ Short-lived access tokens + HttpOnly refresh tokens
53
- const ACCESS_TOKEN_EXPIRY = '15m'; // 15 minutes
54
- const REFRESH_TOKEN_EXPIRY = '7d'; // 7 days
55
-
56
- // ✅ Store refresh tokens in HttpOnly, Secure, SameSite=Strict cookies
57
- res.cookie('refresh_token', token, {
58
- httpOnly: true,
59
- secure: true,
60
- sameSite: 'strict',
61
- maxAge: 7 * 24 * 60 * 60 * 1000, // 7 days in ms
62
- });
44
+ import argon2 from 'argon2';
45
+
46
+ export async function hashPassword(password: string): Promise<string> {
47
+ return argon2.hash(password, {
48
+ type: argon2.argon2id,
49
+ memoryCost: 65536, // 64 MB
50
+ timeCost: 3,
51
+ parallelism: 4,
52
+ });
53
+ }
54
+ ```
63
55
 
64
- // ❌ Never store tokens in localStorage (XSS vulnerable)
65
- // ❌ Never put sensitive data in JWT payload (it's base64 decoded, not encrypted)
56
+ #### 2. Short-Lived JWT + Refresh Token Rotation
57
+ ```typescript
58
+ // Access token: 15 minutes, in memory
59
+ // Refresh token: 7-30 days, HttpOnly, Secure, SameSite=Strict cookie
66
60
  ```
67
61
 
68
- #### 3. OAuth 2.1 + PKCE (For SPAs & Mobile)
62
+ #### 3. OAuth 2.1 + PKCE
69
63
  ```typescript
70
- // PKCE flow — required for public clients in OAuth 2.1
71
64
  import { generateCodeVerifier, generateCodeChallenge } from 'oslo/oauth2';
72
65
 
73
- const codeVerifier = generateCodeVerifier(); // 43-128 char random string
74
- const codeChallenge = await generateCodeChallenge(codeVerifier); // SHA-256 hash
75
-
76
- // Store codeVerifier in sessionStorage (NOT localStorage) during redirect
66
+ const codeVerifier = generateCodeVerifier();
67
+ const codeChallenge = await generateCodeChallenge(codeVerifier);
77
68
  sessionStorage.setItem('pkce_verifier', codeVerifier);
78
69
 
79
- // Auth URL includes challenge
80
70
  const authUrl = new URL('https://provider.com/oauth/authorize');
81
71
  authUrl.searchParams.set('code_challenge', codeChallenge);
82
72
  authUrl.searchParams.set('code_challenge_method', 'S256');
83
- authUrl.searchParams.set('state', cryptoRandomState); // CSRF protection
73
+ authUrl.searchParams.set('state', cryptoRandomState);
84
74
  ```
85
75
 
86
76
  #### 4. Clerk — Next.js 15 Integration
87
77
  ```typescript
88
- // middleware.ts — protect routes at the edge
78
+ // middleware.ts
89
79
  import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server';
90
80
 
91
- const isPublicRoute = createRouteMatcher([
92
- '/', '/sign-in(.*)', '/sign-up(.*)', '/api/webhooks(.*)',
93
- ]);
81
+ const isPublicRoute = createRouteMatcher(['/', '/sign-in(.*)', '/sign-up(.*)', '/api/webhooks(.*)']);
94
82
 
95
83
  export default clerkMiddleware(async (auth, req) => {
96
- if (!isPublicRoute(req)) {
97
- await auth.protect(); // Redirects to sign-in if unauthenticated
98
- }
84
+ if (!isPublicRoute(req)) await auth.protect();
99
85
  });
100
86
 
101
87
  export const config = {
@@ -103,47 +89,11 @@ export const config = {
103
89
  };
104
90
  ```
105
91
 
106
- ```typescript
107
- // Server Component — get user on the server
108
- import { auth, currentUser } from '@clerk/nextjs/server';
109
-
110
- export default async function DashboardPage() {
111
- const { userId, orgId, orgRole } = await auth();
112
- if (!userId) redirect('/sign-in');
113
-
114
- const user = await currentUser();
115
- return <div>Welcome, {user?.firstName}!</div>;
116
- }
117
- ```
118
-
119
92
  #### 5. Supabase Auth — RLS Integration
120
- ```typescript
121
- // Create Supabase client with user session
122
- import { createServerClient } from '@supabase/ssr';
123
-
124
- export async function createSupabaseServerClient(cookieStore: ReadonlyRequestCookies) {
125
- return createServerClient(
126
- process.env.NEXT_PUBLIC_SUPABASE_URL!,
127
- process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
128
- {
129
- cookies: {
130
- getAll: () => cookieStore.getAll(),
131
- setAll: (cookies) => cookies.forEach(({ name, value, options }) =>
132
- cookieStore.set(name, value, options)
133
- ),
134
- },
135
- }
136
- );
137
- }
138
-
139
- // RLS in PostgreSQL — users can only access their own rows
140
- -- CREATE POLICY "Users can only see own data" ON profiles
141
- -- FOR ALL USING (auth.uid() = user_id);
142
- ```
93
+ > For detailed Supabase Auth SSR setup, PKCE session cookie handling, and PostgreSQL Row-Level Security (RLS) policies, delegate directly to `supabase-security-expert`.
143
94
 
144
95
  #### 6. Auth.js v5 (Next.js App Router)
145
96
  ```typescript
146
- // auth.ts
147
97
  import NextAuth from 'next-auth';
148
98
  import GitHub from 'next-auth/providers/github';
149
99
  import { DrizzleAdapter } from '@auth/drizzle-adapter';
@@ -151,129 +101,74 @@ import { db } from '@/db';
151
101
 
152
102
  export const { handlers, auth, signIn, signOut } = NextAuth({
153
103
  adapter: DrizzleAdapter(db),
154
- providers: [
155
- GitHub,
156
- // Add more providers...
157
- ],
158
- session: { strategy: 'database' }, // or 'jwt'
159
- callbacks: {
160
- authorized({ auth, request: { nextUrl } }) {
161
- const isLoggedIn = !!auth?.user;
162
- const isProtected = nextUrl.pathname.startsWith('/dashboard');
163
- if (isProtected && !isLoggedIn) return false;
164
- return true;
165
- },
166
- },
104
+ providers: [GitHub],
105
+ session: { strategy: 'database' },
167
106
  });
168
107
  ```
169
108
 
170
109
  #### 7. RBAC — Role-Based Access Control (Server-Side)
171
110
  ```typescript
172
- // ✅ Always enforce roles server-side — never rely on client UI alone
173
111
  type Role = 'viewer' | 'editor' | 'admin' | 'super_admin';
174
112
 
175
113
  const permissions: Record<Role, string[]> = {
176
114
  viewer: ['read:posts'],
177
115
  editor: ['read:posts', 'write:posts', 'delete:own_posts'],
178
116
  admin: ['read:posts', 'write:posts', 'delete:any_post', 'manage:users'],
179
- super_admin: ['*'], // All permissions
117
+ super_admin: ['*'],
180
118
  };
181
119
 
182
- function hasPermission(userRole: Role, required: string): boolean {
183
- const allowed = permissions[userRole];
120
+ export function hasPermission(userRole: Role, required: string): boolean {
121
+ const allowed = permissions[userRole] || [];
184
122
  return allowed.includes('*') || allowed.includes(required);
185
123
  }
186
-
187
- // In Server Action / API Route
188
- const { userId } = await auth();
189
- const user = await db.query.users.findFirst({ where: eq(users.id, userId) });
190
-
191
- if (!hasPermission(user.role, 'delete:any_post')) {
192
- throw new Error('Forbidden');
193
- }
194
124
  ```
195
125
 
196
126
  #### 8. WebAuthn / Passkeys (2026 Standard)
197
127
  ```typescript
198
- // Using SimpleWebAuthn library
199
128
  import { generateRegistrationOptions, verifyRegistrationResponse } from '@simplewebauthn/server';
200
129
 
201
- // Registration — generate challenge
202
- const options = await generateRegistrationOptions({
203
- rpName: 'My App',
204
- rpID: 'myapp.com',
205
- userName: user.email,
206
- attestationType: 'none',
207
- authenticatorSelection: {
208
- residentKey: 'preferred', // Enables passkeys
209
- userVerification: 'preferred',
210
- },
211
- });
212
-
213
- // Store challenge in session, send options to client
214
- await redis.setex(`webauthn:${userId}`, 60, JSON.stringify(options.challenge));
130
+ export async function getPasskeyRegistrationOptions(userId: string, userEmail: string) {
131
+ return generateRegistrationOptions({
132
+ rpName: 'My App',
133
+ rpID: 'myapp.com',
134
+ userID: new TextEncoder().encode(userId),
135
+ userName: userEmail,
136
+ attestationType: 'none',
137
+ authenticatorSelection: { residentKey: 'preferred', userVerification: 'preferred' },
138
+ });
139
+ }
215
140
  ```
216
141
 
217
- ### Security Checklist
218
- - [ ] Passwords hashed with argon2id (cost ≥64MB) or bcrypt (cost ≥12).
219
- - [ ] JWT access tokens expire in ≤15 minutes; refresh in HttpOnly cookies.
220
- - [ ] OAuth state parameter validated on callback (CSRF protection).
142
+ ### Production Security Checklist
143
+ - [ ] Passwords hashed with argon2id or bcrypt (cost >= 12).
144
+ - [ ] JWT access token expires in <= 15 minutes; refresh token in HttpOnly cookie.
221
145
  - [ ] PKCE enforced for all public OAuth clients.
222
- - [ ] All authorization checks enforced server-side (not UI-only).
223
- - [ ] Admin routes protected by both auth middleware AND role check.
224
- - [ ] MFA offered (TOTP/WebAuthn) for privileged accounts.
225
- - [ ] Refresh token rotation on every use (detect theft).
226
- - [ ] Rate limiting on login/signup endpoints (prevent brute force).
227
- - [ ] Account lockout after N failed attempts.
146
+ - [ ] Authorization enforced on server actions and API routes (never UI only).
147
+ - [ ] Rate limiting on login and signup endpoints.
148
+
149
+ ## Orchestration & Integration
150
+ - Connects with `supabase-security-expert`, `saas-architect`, `js-backend-expert`, `firebase-security-expert`, and `production-ready-hardener`.
228
151
 
229
152
  ---
230
153
 
231
154
  <a name="bahasa-indonesia"></a>
232
155
  ## Bahasa Indonesia
233
156
 
234
- ### Integrasi Orkestrasi
235
- Terhubung dan mengorkestrasi skill domain yang relevan seperti `brainstorming`, `zero-to-prod-orchestrator`, dan `project-context-mapper` untuk memastikan eksekusi yang kohesif.
236
-
237
157
  ### Deskripsi
238
- Panduan tingkat produksi untuk mengimplementasikan autentikasi, otorisasi, dan manajemen identitas yang aman pada aplikasi web dan mobile modern. Mencakup **Clerk**, **Supabase Auth**, **Auth.js v5**, **Better Auth**, pola JWT, OAuth 2.1, alur PKCE, RBAC/ABAC, passkey (WebAuthn), dan implementasi MFA untuk stack React 19 / Next.js 15.
239
-
240
- ### Kondisi Pemicu
241
- - Mengerjakan alur login/signup, manajemen sesi, atau integrasi OAuth.
242
- - Mengintegrasikan Clerk, Supabase Auth, Auth.js v5, Better Auth, atau Auth0.
243
- - Mengimplementasikan RBAC (Role-Based Access Control) atau ABAC.
244
- - Menyiapkan WebAuthn/Passkeys, MFA/2FA, atau SSO.
245
- - Mengamankan rute Next.js App Router dengan auth guard berbasis middleware.
246
-
247
- ### Panduan Teknis
248
-
249
- #### 1. Prinsip Keamanan Inti
250
- - **Jangan buat kriptografi sendiri**: Gunakan `argon2id` atau `bcrypt` untuk hashing password.
251
- - **JWT berumur pendek**: Access token ≤15 menit, refresh token di HttpOnly cookie.
252
- - **PKCE wajib** untuk semua public OAuth client (SPA, mobile).
253
- - **Validasi state OAuth** di callback untuk proteksi CSRF.
254
-
255
- #### 2. Pemilihan Identity Provider
256
- - **Clerk**: Terbaik untuk SaaS baru — DX terbaik, komponen UI siap pakai, manajemen organisasi.
257
- - **Supabase Auth**: Ideal jika sudah pakai Supabase — integrasi langsung dengan RLS.
258
- - **Auth.js v5**: Self-hosted, fleksibel, edge-compatible untuk Next.js.
259
- - **Better Auth**: TypeScript-first, kontrol penuh tanpa vendor lock-in.
260
-
261
- #### 3. RBAC di Sisi Server
262
- Selalu terapkan pengecekan role di server (Server Action, API route, middleware) — **jangan hanya di UI**. Gunakan tabel permission yang memetakan setiap role ke daftar aksi yang diizinkan.
263
-
264
- #### 4. WebAuthn / Passkeys
265
- Gunakan library `@simplewebauthn/server` untuk registrasi dan verifikasi passkey. Simpan challenge di Redis dengan TTL pendek (60 detik) untuk mencegah replay attack.
266
-
267
- #### 5. Checklist Keamanan
268
- - Password di-hash dengan argon2id atau bcrypt.
269
- - JWT access token expire ≤15 menit; refresh di HttpOnly cookie.
270
- - State OAuth divalidasi saat callback.
271
- - PKCE diterapkan untuk semua klien publik OAuth.
272
- - Pengecekan otorisasi dilakukan di server, bukan hanya UI.
273
- - MFA ditawarkan untuk akun privileged.
274
- - Rate limiting di endpoint login/signup.
275
- - Rotasi refresh token setiap kali digunakan.
276
-
277
-
278
- ## Orchestration & Integration
279
- - Connects to other backend skills as part of the orchestration flow.
158
+ Panduan tingkat produksi untuk autentikasi, otorisasi, dan manajemen identitas modern (Clerk, Supabase Auth, Auth.js v5, Better Auth, OAuth 2.1 PKCE, RBAC, dan Passkeys).
159
+
160
+ ### Rekomendasi Identity Provider
161
+ - **Clerk**: Terbaik untuk SaaS baru (UI bawaan, manajemen tim/organisasi).
162
+ - **Supabase Auth**: Terbaik jika memakai database Supabase (integrasi native RLS).
163
+ - **Auth.js v5**: Self-hosted, kontrol penuh tanpa vendor lock-in.
164
+ - **Better Auth**: TypeScript-first, fitur 2FA dan passkey bawaan.
165
+
166
+ ### Poin Kunci Keamanan
167
+ 1. **Password Hashing**: Gunakan `argon2id` atau `bcrypt` (cost >= 12).
168
+ 2. **Token Berumur Pendek**: Access token <= 15 menit, refresh token di cookie HttpOnly dengan rotasi token.
169
+ 3. **PKCE Wajib**: Terapkan PKCE untuk semua klien publik OAuth.
170
+ 4. **Otorisasi Server-Side**: Wajibkan verifikasi hak akses di server (bukan hanya UI).
171
+ 5. **Supabase Auth**: Untuk setup SSR dan RLS mendalam, delegasikan ke `supabase-security-expert`.
172
+
173
+ ## Integrasi Orkestrasi
174
+ - Terhubung dengan `supabase-security-expert`, `saas-architect`, `js-backend-expert`, `firebase-security-expert`, dan `production-ready-hardener`.