opencode-skills-collection 1.0.186 → 1.0.187
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled-skills/.antigravity-install-manifest.json +5 -1
- package/bundled-skills/3d-web-experience/SKILL.md +152 -37
- package/bundled-skills/agent-evaluation/SKILL.md +1088 -26
- package/bundled-skills/agent-memory-systems/SKILL.md +1037 -25
- package/bundled-skills/agent-tool-builder/SKILL.md +668 -16
- package/bundled-skills/ai-agents-architect/SKILL.md +271 -31
- package/bundled-skills/ai-product/SKILL.md +716 -26
- package/bundled-skills/ai-wrapper-product/SKILL.md +450 -44
- package/bundled-skills/algolia-search/SKILL.md +867 -15
- package/bundled-skills/autonomous-agents/SKILL.md +1033 -26
- package/bundled-skills/aws-serverless/SKILL.md +1046 -35
- package/bundled-skills/azure-functions/SKILL.md +1318 -19
- package/bundled-skills/browser-automation/SKILL.md +1065 -28
- package/bundled-skills/browser-extension-builder/SKILL.md +159 -32
- package/bundled-skills/bullmq-specialist/SKILL.md +347 -16
- package/bundled-skills/clerk-auth/SKILL.md +796 -15
- package/bundled-skills/computer-use-agents/SKILL.md +1870 -28
- package/bundled-skills/context-window-management/SKILL.md +271 -18
- package/bundled-skills/conversation-memory/SKILL.md +453 -24
- package/bundled-skills/crewai/SKILL.md +252 -46
- package/bundled-skills/discord-bot-architect/SKILL.md +1207 -34
- package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
- package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
- package/bundled-skills/docs/maintainers/repo-growth-seo.md +3 -3
- package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
- package/bundled-skills/docs/users/bundles.md +1 -1
- package/bundled-skills/docs/users/claude-code-skills.md +1 -1
- package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
- package/bundled-skills/docs/users/getting-started.md +1 -1
- package/bundled-skills/docs/users/kiro-integration.md +1 -1
- package/bundled-skills/docs/users/usage.md +4 -4
- package/bundled-skills/docs/users/visual-guide.md +4 -4
- package/bundled-skills/email-systems/SKILL.md +646 -26
- package/bundled-skills/faf-expert/SKILL.md +221 -0
- package/bundled-skills/faf-wizard/SKILL.md +252 -0
- package/bundled-skills/file-uploads/SKILL.md +212 -11
- package/bundled-skills/firebase/SKILL.md +646 -16
- package/bundled-skills/gcp-cloud-run/SKILL.md +1117 -32
- package/bundled-skills/graphql/SKILL.md +1026 -27
- package/bundled-skills/hubspot-integration/SKILL.md +804 -19
- package/bundled-skills/idea-darwin/SKILL.md +120 -0
- package/bundled-skills/inngest/SKILL.md +431 -16
- package/bundled-skills/interactive-portfolio/SKILL.md +342 -44
- package/bundled-skills/langfuse/SKILL.md +296 -41
- package/bundled-skills/langgraph/SKILL.md +259 -50
- package/bundled-skills/micro-saas-launcher/SKILL.md +343 -44
- package/bundled-skills/neon-postgres/SKILL.md +572 -15
- package/bundled-skills/nextjs-supabase-auth/SKILL.md +269 -21
- package/bundled-skills/notion-template-business/SKILL.md +371 -44
- package/bundled-skills/personal-tool-builder/SKILL.md +537 -44
- package/bundled-skills/plaid-fintech/SKILL.md +825 -19
- package/bundled-skills/prompt-caching/SKILL.md +438 -25
- package/bundled-skills/rag-engineer/SKILL.md +271 -29
- package/bundled-skills/salesforce-development/SKILL.md +912 -19
- package/bundled-skills/satori/SKILL.md +54 -0
- package/bundled-skills/scroll-experience/SKILL.md +381 -44
- package/bundled-skills/segment-cdp/SKILL.md +817 -19
- package/bundled-skills/shopify-apps/SKILL.md +1475 -19
- package/bundled-skills/slack-bot-builder/SKILL.md +1162 -28
- package/bundled-skills/telegram-bot-builder/SKILL.md +152 -37
- package/bundled-skills/telegram-mini-app/SKILL.md +445 -44
- package/bundled-skills/trigger-dev/SKILL.md +916 -27
- package/bundled-skills/twilio-communications/SKILL.md +1310 -28
- package/bundled-skills/upstash-qstash/SKILL.md +898 -27
- package/bundled-skills/vercel-deployment/SKILL.md +637 -39
- package/bundled-skills/viral-generator-builder/SKILL.md +132 -37
- package/bundled-skills/voice-agents/SKILL.md +937 -27
- package/bundled-skills/voice-ai-development/SKILL.md +375 -46
- package/bundled-skills/workflow-automation/SKILL.md +982 -29
- package/bundled-skills/zapier-make-patterns/SKILL.md +772 -27
- package/package.json +1 -1
|
@@ -1,23 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: nextjs-supabase-auth
|
|
3
|
-
description:
|
|
3
|
+
description: Expert integration of Supabase Auth with Next.js App Router
|
|
4
4
|
risk: none
|
|
5
|
-
source:
|
|
6
|
-
date_added:
|
|
5
|
+
source: vibeship-spawner-skills (Apache 2.0)
|
|
6
|
+
date_added: 2026-02-27
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# Next.js + Supabase Auth
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
You understand the server/client boundary, how to handle auth in middleware,
|
|
13
|
-
Server Components, Client Components, and Server Actions.
|
|
14
|
-
|
|
15
|
-
Your core principles:
|
|
16
|
-
1. Use @supabase/ssr for App Router integration
|
|
17
|
-
2. Handle tokens in middleware for protected routes
|
|
18
|
-
3. Never expose auth tokens to client unnecessarily
|
|
19
|
-
4. Use Server Actions for auth operations when possible
|
|
20
|
-
5. Understand the cookie-based session flow
|
|
11
|
+
Expert integration of Supabase Auth with Next.js App Router
|
|
21
12
|
|
|
22
13
|
## Capabilities
|
|
23
14
|
|
|
@@ -26,10 +17,9 @@ Your core principles:
|
|
|
26
17
|
- auth-middleware
|
|
27
18
|
- auth-callback
|
|
28
19
|
|
|
29
|
-
##
|
|
20
|
+
## Prerequisites
|
|
30
21
|
|
|
31
|
-
- nextjs-app-router
|
|
32
|
-
- supabase-backend
|
|
22
|
+
- Required skills: nextjs-app-router, supabase-backend
|
|
33
23
|
|
|
34
24
|
## Patterns
|
|
35
25
|
|
|
@@ -37,25 +27,283 @@ Your core principles:
|
|
|
37
27
|
|
|
38
28
|
Create properly configured Supabase clients for different contexts
|
|
39
29
|
|
|
30
|
+
**When to use**: Setting up auth in a Next.js project
|
|
31
|
+
|
|
32
|
+
// lib/supabase/client.ts (Browser client)
|
|
33
|
+
'use client'
|
|
34
|
+
import { createBrowserClient } from '@supabase/ssr'
|
|
35
|
+
|
|
36
|
+
export function createClient() {
|
|
37
|
+
return createBrowserClient(
|
|
38
|
+
process.env.NEXT_PUBLIC_SUPABASE_URL!,
|
|
39
|
+
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// lib/supabase/server.ts (Server client)
|
|
44
|
+
import { createServerClient } from '@supabase/ssr'
|
|
45
|
+
import { cookies } from 'next/headers'
|
|
46
|
+
|
|
47
|
+
export async function createClient() {
|
|
48
|
+
const cookieStore = await cookies()
|
|
49
|
+
return createServerClient(
|
|
50
|
+
process.env.NEXT_PUBLIC_SUPABASE_URL!,
|
|
51
|
+
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
|
|
52
|
+
{
|
|
53
|
+
cookies: {
|
|
54
|
+
getAll() {
|
|
55
|
+
return cookieStore.getAll()
|
|
56
|
+
},
|
|
57
|
+
setAll(cookiesToSet) {
|
|
58
|
+
cookiesToSet.forEach(({ name, value, options }) => {
|
|
59
|
+
cookieStore.set(name, value, options)
|
|
60
|
+
})
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
}
|
|
64
|
+
)
|
|
65
|
+
}
|
|
66
|
+
|
|
40
67
|
### Auth Middleware
|
|
41
68
|
|
|
42
69
|
Protect routes and refresh sessions in middleware
|
|
43
70
|
|
|
71
|
+
**When to use**: You need route protection or session refresh
|
|
72
|
+
|
|
73
|
+
// middleware.ts
|
|
74
|
+
import { createServerClient } from '@supabase/ssr'
|
|
75
|
+
import { NextResponse, type NextRequest } from 'next/server'
|
|
76
|
+
|
|
77
|
+
export async function middleware(request: NextRequest) {
|
|
78
|
+
let response = NextResponse.next({ request })
|
|
79
|
+
|
|
80
|
+
const supabase = createServerClient(
|
|
81
|
+
process.env.NEXT_PUBLIC_SUPABASE_URL!,
|
|
82
|
+
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
|
|
83
|
+
{
|
|
84
|
+
cookies: {
|
|
85
|
+
getAll() {
|
|
86
|
+
return request.cookies.getAll()
|
|
87
|
+
},
|
|
88
|
+
setAll(cookiesToSet) {
|
|
89
|
+
cookiesToSet.forEach(({ name, value, options }) => {
|
|
90
|
+
response.cookies.set(name, value, options)
|
|
91
|
+
})
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
}
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
// Refresh session if expired
|
|
98
|
+
const { data: { user } } = await supabase.auth.getUser()
|
|
99
|
+
|
|
100
|
+
// Protect dashboard routes
|
|
101
|
+
if (request.nextUrl.pathname.startsWith('/dashboard') && !user) {
|
|
102
|
+
return NextResponse.redirect(new URL('/login', request.url))
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return response
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export const config = {
|
|
109
|
+
matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
|
|
110
|
+
}
|
|
111
|
+
|
|
44
112
|
### Auth Callback Route
|
|
45
113
|
|
|
46
114
|
Handle OAuth callback and exchange code for session
|
|
47
115
|
|
|
48
|
-
|
|
116
|
+
**When to use**: Using OAuth providers (Google, GitHub, etc.)
|
|
117
|
+
|
|
118
|
+
// app/auth/callback/route.ts
|
|
119
|
+
import { createClient } from '@/lib/supabase/server'
|
|
120
|
+
import { NextResponse } from 'next/server'
|
|
121
|
+
|
|
122
|
+
export async function GET(request: Request) {
|
|
123
|
+
const { searchParams, origin } = new URL(request.url)
|
|
124
|
+
const code = searchParams.get('code')
|
|
125
|
+
const next = searchParams.get('next') ?? '/'
|
|
126
|
+
|
|
127
|
+
if (code) {
|
|
128
|
+
const supabase = await createClient()
|
|
129
|
+
const { error } = await supabase.auth.exchangeCodeForSession(code)
|
|
130
|
+
if (!error) {
|
|
131
|
+
return NextResponse.redirect(`${origin}${next}`)
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return NextResponse.redirect(`${origin}/auth/error`)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
### Server Action Auth
|
|
139
|
+
|
|
140
|
+
Handle auth operations in Server Actions
|
|
141
|
+
|
|
142
|
+
**When to use**: Login, logout, or signup from Server Components
|
|
143
|
+
|
|
144
|
+
// app/actions/auth.ts
|
|
145
|
+
'use server'
|
|
146
|
+
import { createClient } from '@/lib/supabase/server'
|
|
147
|
+
import { redirect } from 'next/navigation'
|
|
148
|
+
import { revalidatePath } from 'next/cache'
|
|
149
|
+
|
|
150
|
+
export async function signIn(formData: FormData) {
|
|
151
|
+
const supabase = await createClient()
|
|
152
|
+
const { error } = await supabase.auth.signInWithPassword({
|
|
153
|
+
email: formData.get('email') as string,
|
|
154
|
+
password: formData.get('password') as string,
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
if (error) {
|
|
158
|
+
return { error: error.message }
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
revalidatePath('/', 'layout')
|
|
162
|
+
redirect('/dashboard')
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export async function signOut() {
|
|
166
|
+
const supabase = await createClient()
|
|
167
|
+
await supabase.auth.signOut()
|
|
168
|
+
revalidatePath('/', 'layout')
|
|
169
|
+
redirect('/')
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
### Get User in Server Component
|
|
173
|
+
|
|
174
|
+
Access the authenticated user in Server Components
|
|
175
|
+
|
|
176
|
+
**When to use**: Rendering user-specific content server-side
|
|
177
|
+
|
|
178
|
+
// app/dashboard/page.tsx
|
|
179
|
+
import { createClient } from '@/lib/supabase/server'
|
|
180
|
+
import { redirect } from 'next/navigation'
|
|
181
|
+
|
|
182
|
+
export default async function DashboardPage() {
|
|
183
|
+
const supabase = await createClient()
|
|
184
|
+
const { data: { user } } = await supabase.auth.getUser()
|
|
185
|
+
|
|
186
|
+
if (!user) {
|
|
187
|
+
redirect('/login')
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
return (
|
|
191
|
+
<div>
|
|
192
|
+
<h1>Welcome, {user.email}</h1>
|
|
193
|
+
</div>
|
|
194
|
+
)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
## Validation Checks
|
|
198
|
+
|
|
199
|
+
### Using getSession() for Auth Checks
|
|
200
|
+
|
|
201
|
+
Severity: ERROR
|
|
202
|
+
|
|
203
|
+
Message: getSession() doesn't verify the JWT. Use getUser() for secure auth checks.
|
|
204
|
+
|
|
205
|
+
Fix action: Replace getSession() with getUser() for security-critical checks
|
|
49
206
|
|
|
50
|
-
###
|
|
207
|
+
### OAuth Without Callback Route
|
|
51
208
|
|
|
52
|
-
|
|
209
|
+
Severity: ERROR
|
|
53
210
|
|
|
54
|
-
|
|
211
|
+
Message: Using OAuth but missing callback route at app/auth/callback/route.ts
|
|
212
|
+
|
|
213
|
+
Fix action: Create app/auth/callback/route.ts to handle OAuth redirects
|
|
214
|
+
|
|
215
|
+
### Browser Client in Server Context
|
|
216
|
+
|
|
217
|
+
Severity: ERROR
|
|
218
|
+
|
|
219
|
+
Message: Browser client used in server context. Use createServerClient instead.
|
|
220
|
+
|
|
221
|
+
Fix action: Import and use createServerClient from @supabase/ssr
|
|
222
|
+
|
|
223
|
+
### Protected Routes Without Middleware
|
|
224
|
+
|
|
225
|
+
Severity: WARNING
|
|
226
|
+
|
|
227
|
+
Message: No middleware.ts found. Consider adding middleware for route protection.
|
|
228
|
+
|
|
229
|
+
Fix action: Create middleware.ts to protect routes and refresh sessions
|
|
230
|
+
|
|
231
|
+
### Hardcoded Auth Redirect URL
|
|
232
|
+
|
|
233
|
+
Severity: WARNING
|
|
234
|
+
|
|
235
|
+
Message: Hardcoded localhost redirect. Use origin for environment flexibility.
|
|
236
|
+
|
|
237
|
+
Fix action: Use window.location.origin or process.env.NEXT_PUBLIC_SITE_URL
|
|
238
|
+
|
|
239
|
+
### Auth Call Without Error Handling
|
|
240
|
+
|
|
241
|
+
Severity: WARNING
|
|
242
|
+
|
|
243
|
+
Message: Auth operation without error handling. Always check for errors.
|
|
244
|
+
|
|
245
|
+
Fix action: Destructure { data, error } and handle error case
|
|
246
|
+
|
|
247
|
+
### Auth Action Without Revalidation
|
|
248
|
+
|
|
249
|
+
Severity: WARNING
|
|
250
|
+
|
|
251
|
+
Message: Auth action without revalidatePath. Cache may show stale auth state.
|
|
252
|
+
|
|
253
|
+
Fix action: Add revalidatePath('/', 'layout') after auth operations
|
|
254
|
+
|
|
255
|
+
### Client-Only Route Protection
|
|
256
|
+
|
|
257
|
+
Severity: WARNING
|
|
258
|
+
|
|
259
|
+
Message: Client-side route protection shows flash of content. Use middleware.
|
|
260
|
+
|
|
261
|
+
Fix action: Move protection to middleware.ts for better UX
|
|
262
|
+
|
|
263
|
+
## Collaboration
|
|
264
|
+
|
|
265
|
+
### Delegation Triggers
|
|
266
|
+
|
|
267
|
+
- database|rls|queries|tables -> supabase-backend (Auth needs database layer)
|
|
268
|
+
- route|page|component|layout -> nextjs-app-router (Auth needs Next.js patterns)
|
|
269
|
+
- deploy|production|vercel -> vercel-deployment (Auth needs deployment config)
|
|
270
|
+
- ui|form|button|design -> frontend (Auth needs UI components)
|
|
271
|
+
|
|
272
|
+
### Full Auth Stack
|
|
273
|
+
|
|
274
|
+
Skills: nextjs-supabase-auth, supabase-backend, nextjs-app-router, vercel-deployment
|
|
275
|
+
|
|
276
|
+
Workflow:
|
|
277
|
+
|
|
278
|
+
```
|
|
279
|
+
1. Database setup (supabase-backend)
|
|
280
|
+
2. Auth implementation (nextjs-supabase-auth)
|
|
281
|
+
3. Route protection (nextjs-app-router)
|
|
282
|
+
4. Deployment config (vercel-deployment)
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### Protected SaaS
|
|
286
|
+
|
|
287
|
+
Skills: nextjs-supabase-auth, stripe-integration, supabase-backend
|
|
288
|
+
|
|
289
|
+
Workflow:
|
|
290
|
+
|
|
291
|
+
```
|
|
292
|
+
1. User authentication (nextjs-supabase-auth)
|
|
293
|
+
2. Customer sync (stripe-integration)
|
|
294
|
+
3. Subscription gating (supabase-backend)
|
|
295
|
+
```
|
|
55
296
|
|
|
56
297
|
## Related Skills
|
|
57
298
|
|
|
58
299
|
Works well with: `nextjs-app-router`, `supabase-backend`
|
|
59
300
|
|
|
60
301
|
## When to Use
|
|
61
|
-
|
|
302
|
+
|
|
303
|
+
- User mentions or implies: supabase auth next
|
|
304
|
+
- User mentions or implies: authentication next.js
|
|
305
|
+
- User mentions or implies: login supabase
|
|
306
|
+
- User mentions or implies: auth middleware
|
|
307
|
+
- User mentions or implies: protected route
|
|
308
|
+
- User mentions or implies: auth callback
|
|
309
|
+
- User mentions or implies: session management
|