SKILL.md
Clerk Debug Bundle
Current State
!node --version 2>/dev/null || echo 'N/A'
!npm list @clerk/nextjs @clerk/clerk-react @clerk/express 2>/dev/null | grep clerk || echo 'No Clerk packages found'
Overview
Collect all necessary debug information for Clerk troubleshooting and support tickets. Generates an environment report, runtime health check, client-side debug panel, and support bundle.
Prerequisites
- Clerk SDK installed
- Access to application logs
- Browser with developer tools
Instructions
Step 1: Environment Debug Script
// scripts/clerk-debug.ts
import { createClerkClient } from '@clerk/backend'
async function collectDebugInfo() {
const info: Record<string, any> = {
timestamp: new Date().toISOString(),
nodeVersion: process.version,
platform: process.platform,
env: {
hasPK: !!process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY,
hasSK: !!process.env.CLERK_SECRET_KEY,
pkPrefix: process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY?.slice(0, 8) + '...',
nodeEnv: process.env.NODE_ENV,
},
}
// Test API connectivity
try {
const clerk = createClerkClient({ secretKey: process.env.CLERK_SECRET_KEY! })
const users = await clerk.users.getUserList({ limit: 1 })
info.apiConnectivity = { status: 'ok', userCount: users.totalCount }
} catch (err: any) {
info.apiConnectivity = { status: 'error', message: err.message, code: err.status }
}
// Check package versions
try {
const pkg = require('./package.json')
info.packages = Object.entries(pkg.dependencies || {})
.filter(([k]) => k.includes('clerk'))
.reduce((acc, [k, v]) => ({ ...acc, [k]: v }), {})
} catch {
info.packages = 'Could not read package.json'
}
console.log(JSON.stringify(info, null, 2))
return info
}
collectDebugInfo()
Run with:
npx tsx scripts/clerk-debug.ts
Step 2: Runtime Health Check Endpoint
// app/api/clerk-health/route.ts
import { auth, clerkClient } from '@clerk/nextjs/server'
export async function GET() {
const checks: Record<string, { status: string; detail?: string }> = {}
// Check 1: SDK loaded
checks.sdk = { status: 'ok', detail: 'Clerk SDK loaded' }
// Check 2: Auth function works
try {
const { userId } = await auth()
checks.auth = { status: 'ok', detail: userId ? `Authenticated as ${userId}` : 'Not authenticated (expected for health check)' }
} catch (err: any) {
checks.auth = { status: 'error', detail: err.message }
}
// Check 3: Backend API connectivity
try {
const client = await clerkClient()
await client.users.getUserList({ limit: 1 })
checks.backendApi = { status: 'ok', detail: 'API reachable' }
} catch (err: any) {
checks.backendApi = { status: 'error', detail: err.message }
}
// Check 4: Environment variables
checks.envVars = {
status: process.env.CLERK_SECRET_KEY ? 'ok' : 'error',
detail: process.env.CLERK_SECRET_KEY ? 'Secret key configured' : 'CLERK_SECRET_KEY missing',
}
const allOk = Object.values(checks).every((c) => c.status === 'ok')
return Response.json({ healthy: allOk, checks }, { status: allOk ? 200 : 503 })
}
