clerk-react-patterns — скилл для Claude Code: обзор и установка
Скилл помогает настроить аутентификацию в React SPA на базе @clerk/react. Пригодится при сборке проектов на Vite или Create React App с закрытыми маршрутами.
npx skills add clerk/skills --skill clerk-react-patterns -a claude-codeЧто делает clerk-react-patterns
Скилл содержит шаблоны интеграции пакета @clerk/react в клиентские одностраничные приложения. Он обучает агента оборачивать корень проекта в ClerkProvider, задавать переменную VITE_CLERK_PUBLISHABLE_KEY и запрашивать сессионный JWT через getToken() для вызовов API.
Внутри собраны правила работы с хуками useAuth, useUser и useClerk, схемы кастомных форм входа и защита маршрутов в React Router v6 и v7. Библиотека работает только в браузере, поэтому серверного метода auth() в ней нет.
Перед проверкой статуса isSignedIn код обязательно должен проверять флаг isLoaded, иначе состояние сессии вернёт undefined. Для серверного рендеринга на Next.js или TanStack Start этот набор не подойдёт — для них созданы отдельные скиллы.
Какие задачи решает
- защитить маршруты в React Router v6 и v7
- настроить ClerkProvider с ключом VITE_CLERK_PUBLISHABLE_KEY
- получить JWT-токен сессии через useAuth для вызова API
- создать кастомные формы входа с хуками useSignIn и useSignUp
Примеры запросов агенту
- Настрой ClerkProvider для проекта на Vite и защити роут /dashboard через React Router
- Покажи, как безопасно проверить статус авторизации с useAuth и получить токен для fetch
- Сделай кастомную форму входа с хуком useSignIn
Как установить clerk-react-patterns
1Через Skills CLI (Vercel)
npx skills add clerk/skills --skill clerk-react-patterns -a claude-code2Вручную: положить файлы
~/.claude/skills/clerk-react-patterns/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/clerk-react-patterns/
1Через Skills CLI (Vercel)
npx skills add clerk/skills --skill clerk-react-patterns -a codex2Вручную: положить файлы
.agents/skills/clerk-react-patterns/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add clerk/skills --skill clerk-react-patterns -a cursor2Вручную: положить файлы
.cursor/skills/clerk-react-patterns/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install clerk/skills clerk-react-patterns2Вручную: положить файлы
.github/skills/clerk-react-patterns/SKILL.md1Через Skills CLI (Vercel)
npx skills add clerk/skills --skill clerk-react-patterns -a gemini-cli2Командой платформы
gemini skills install https://github.com/clerk/skills --path skills/clerk-react-patternsВручную: положить файлы
.devin/skills/clerk-react-patterns/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add clerk/skills --skill clerk-react-patterns -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о clerk-react-patterns
Как установить clerk-react-patterns в Claude Code?
Выполните команду npx skills add clerk/skills --skill clerk-react-patterns -a claude-code в терминале.
Что делает скилл clerk-react-patterns?
Он снабжает ИИ-агента шаблонами авторизации на базе @clerk/react для Vite и Create React App. Скилл учит правильно настраивать ClerkProvider, хуки сессии и закрытые роуты.
Подходит ли этот скилл для Next.js?
Нет, этот набор рассчитан только на клиентские React SPA. Для проектов на Next.js разработчики рекомендуют скилл clerk-nextjs-patterns.
Исходный текст
SKILL.md · MIT
---
name: clerk-react-patterns
description: 'React SPA auth patterns with @clerk/react for Vite/CRA - ClerkProvider
setup, useAuth/useUser/useClerk hooks, React Router protected routes, custom sign-in
flows. Triggers on: Vite Clerk setup, React Router auth, useAuth hook, protected
route, custom sign-in form React.'
license: MIT
allowed-tools: WebFetch
metadata:
author: clerk
version: 1.0.0
---
# React SPA Patterns
> This skill covers `@clerk/react` for Vite/CRA SPAs. For Next.js use `clerk-nextjs-patterns`. For TanStack Start use `clerk-tanstack-patterns`.
## What Do You Need?
| Task | Reference |
|------|-----------|
| useAuth / useUser / useClerk hooks | references/hooks.md |
| Protected routes with React Router | references/protected-routes.md |
| Custom sign-in / sign-up forms | references/custom-flows.md |
| React Router v6/v7 integration | references/router-integration.md |
## References
| Reference | Description |
|-----------|-------------|
| `references/hooks.md` | useAuth, isLoaded guard |
| `references/protected-routes.md` | ProtectedRoute pattern |
| `references/custom-flows.md` | useSignIn, useSignUp flows |
| `references/router-integration.md` | React Router v6/v7 setup |
## Setup
```
npm install @clerk/react
```
`.env`:
```
VITE_CLERK_PUBLISHABLE_KEY=pk_...
```
`src/main.tsx`:
```tsx
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { ClerkProvider } from '@clerk/react'
import App from './App.tsx'
const PUBLISHABLE_KEY = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY
createRoot(document.getElementById('root')!).render(
<StrictMode>
<ClerkProvider publishableKey={PUBLISHABLE_KEY}>
<App />
</ClerkProvider>
</StrictMode>,
)
```
## Mental Model
`@clerk/react` is client-only — there is no server-side `auth()`. All auth state comes from hooks.
- `isLoaded` must be `true` before trusting `isSignedIn` — always guard on `isLoaded`
- `useClerk()` gives access to `signOut`, `openSignIn`, `openUserProfile` and other methods
- `getToken()` from `useAuth()` fetches the session JWT for API calls
## Minimal Pattern
```tsx
import { useAuth } from '@clerk/react'
export function Dashboard() {
const { isLoaded, isSignedIn, userId } = useAuth()
if (!isLoaded) return <div>Loading...</div>
if (!isSignedIn) return <div>Please sign in</div>
return <div>Hello {userId}</div>
}
```
## Protected Route (React Router v6/v7)
```tsx
import { Navigate, Outlet } from 'react-router-dom'
import { useAuth } from '@clerk/react'
export function ProtectedRoute() {
const { isLoaded, isSignedIn } = useAuth()
if (!isLoaded) return <div>Loading...</div>
if (!isSignedIn) return <Navigate to="/sign-in" replace />
return <Outlet />
}
```
```tsx
<Routes>
<Route element={<ProtectedRoute />}>
<Route path="/dashboard" element={<Dashboard />} />
<Route path="/settings" element={<Settings />} />
</Route>
<Route path="/sign-in" element={<SignIn />} />
</Routes>
```
## Token for API Calls
```tsx
import { useAuth } from '@clerk/react'
export function DataFetcher() {
const { getToken } = useAuth()
async function fetchData() {
const token = await getToken()
if (!token) return
const res = await fetch('/api/data', {
headers: { Authorization: `Bearer ${token}` },
})
return res.json()
}
return <button onClick={fetchData}>Load</button>
}
```
## Common Pitfalls
| Symptom | Cause | Fix |
|---------|-------|-----|
| `isSignedIn` is `undefined` | `isLoaded` is still `false` | Always check `isLoaded` first |
| `ClerkProvider` missing | Provider not at root | Wrap `<App>` in `main.tsx` |
| Env var undefined | Wrong Vite prefix | Use `VITE_CLERK_PUBLISHABLE_KEY`, access via `import.meta.env` |
| Token is `null` | User not signed in | Null-check `getToken()` result |
| Sign-in component shows blank | No `publishableKey` on provider | Pass `publishableKey` explicitly |
## See Also
- `clerk-setup` - Initial Clerk install
- `clerk-custom-ui` - Custom flows & appearance
- `clerk-orgs` - B2B organizations
## Docs
[React SDK](https://clerk.com/docs/react/getting-started/quickstart)
© clerk · MIT · clerk/skills