[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C69PCYYG757D3DJT2X5KAH":3,"skill-same:01M6C69PCYYG757D3DJT2X5KAH":143},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":6,"ownerHtmlUrl":56,"ownerBlogUrl":57,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M6C69PCYYG757D3DJT2X5KAH","clerk-react-router-patterns",null,"React Router v7\u002Fv8 patterns with Clerk — rootAuthLoader, getAuth in loaders, clerkMiddleware, protected routes, SSR user data, org switching. Triggers on: react-router auth, rootAuthLoader, getAuth loader, react-router protected route, loader authentication, SSR auth react-router, useNavigate may be used only in the context of a Router.","Allternit\u002Fallternit-platform","Allternit","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F250397232?v=4","01M6C67T2SPVP033M7REAAHYHX","01M6C67T7CXM1DKVQY8DFAFRB2",1,"MIT","https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-react-router-patterns\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"react","patterns","router","react router","clerk react router patterns","clerk","with","org","triggers","switching","route","react router v7","only","webfetch","user","context","data","authentication","ssr","auth","2026-11-10 10:12:30",false,"---\nname: clerk-react-router-patterns\ndescription: 'React Router v7\u002Fv8 patterns with Clerk — rootAuthLoader, getAuth in loaders,\n  clerkMiddleware, protected routes, SSR user data, org switching. Triggers on: react-router\n  auth, rootAuthLoader, getAuth loader, react-router protected route, loader authentication,\n  SSR auth react-router, useNavigate may be used only in the context of a Router.'\nlicense: MIT\nallowed-tools: WebFetch\nmetadata:\n  author: clerk\n  version: 1.1.0\n---\n\n# React Router Patterns\n\nSDK: `@clerk\u002Freact-router` v3.5+. Supports React Router v7.9+ and v8.\n\n## What Do You Need?\n\n| Task | Reference |\n|------|-----------|\n| Auth in loaders and actions | references\u002Floaders-actions.md |\n| Protected routes and redirects | references\u002Fprotected-routes.md |\n| SSR user data and session | references\u002Fssr-auth.md |\n\n## React Router v7 vs v8\n\nCheck the installed `react-router` major version before scaffolding — the config differs:\n\n| | v7.9+ | v8+ |\n|--|--|--|\n| Middleware API | Opt-in: set `future: { v8_middleware: true }` in `react-router.config.ts` | Always on — do NOT set the flag (v8 removed it) |\n| `ssr.noExternal` workaround (below) | Not needed | **Required** |\n\n## Minimal Setup\n\n### 1. vite.config.ts (v8 only — REQUIRED)\n\nReact Router v8 ships development\u002Fproduction conditional exports. In `react-router dev`,\nVite externalizes `@clerk\u002Freact-router` for SSR, so Node resolves the production build of\nreact-router while the app code gets the development build — two module instances, two\nRouter contexts. Every request then fails during SSR with:\n\n```\nError: useNavigate() may be used only in the context of a \u003CRouter> component.\n```\n\n**`npm ls react-router` shows a single copy — that does NOT rule this out.** The\nduplication is per export condition, not per installed copy. Do not chase duplicate\ninstalls; add the workaround (upstream issue:\nhttps:\u002F\u002Fgithub.com\u002Fremix-run\u002Freact-router\u002Fissues\u002F15232):\n\n```ts\nimport { reactRouter } from '@react-router\u002Fdev\u002Fvite'\nimport { defineConfig } from 'vite'\n\nexport default defineConfig({\n  plugins: [reactRouter()],\n  ssr: {\n    noExternal: ['@clerk\u002Freact-router'],\n  },\n})\n```\n\n### 2. root.tsx\n\n```tsx\nimport { Outlet } from 'react-router'\nimport { rootAuthLoader, clerkMiddleware } from '@clerk\u002Freact-router\u002Fserver'\nimport { ClerkProvider } from '@clerk\u002Freact-router'\nimport type { Route } from '.\u002F+types\u002Froot'\n\nexport const middleware: Route.MiddlewareFunction[] = [clerkMiddleware()]\n\nexport async function loader(args: Route.LoaderArgs) {\n  return rootAuthLoader(args)\n}\n\nexport default function App({ loaderData }: Route.ComponentProps) {\n  return (\n    \u003CClerkProvider loaderData={loaderData}>\n      \u003COutlet \u002F>\n    \u003C\u002FClerkProvider>\n  )\n}\n```\n\nThere is no `ClerkApp` HOC in `@clerk\u002Freact-router` (that was the `@clerk\u002Fremix` API).\nRender `\u003CClerkProvider loaderData={loaderData}>` inside the default export and pass it\nthe root route's `loaderData`.\n\n### 3. react-router.config.ts (v7 only)\n\n```ts\nimport type { Config } from '@react-router\u002Fdev\u002Fconfig'\n\nexport default {\n  future: {\n    v8_middleware: true,\n  },\n} satisfies Config\n```\n\nOn v8, omit the `future` block entirely — the flag no longer exists.\n\n> **Required**: `rootAuthLoader` must be called in `root.tsx`'s loader. Without it, `getAuth` throws in nested loaders.\n\n## Mental Model\n\nReact Router v7\u002Fv8 uses a middleware + loader pipeline. Clerk plugs into both layers:\n\n- **Middleware** (`clerkMiddleware()`) — runs on every request, attaches auth to context\n- **`rootAuthLoader`** — required in `root.tsx` to pass Clerk state to the client\n- **`getAuth(args)`** — called inside any loader\u002Faction to get the current user\n\n```\nRequest → clerkMiddleware() → rootAuthLoader → page loader → component\n                 ↓                   ↓               ↓\n           attaches auth      injects state     getAuth(args)\n           to context         to response       reads context\n```\n\n## Auth in Loaders\n\n```tsx\nimport { getAuth } from '@clerk\u002Freact-router\u002Fserver'\nimport type { Route } from '.\u002F+types\u002Fdashboard'\n\nexport async function loader(args: Route.LoaderArgs) {\n  const { userId } = await getAuth(args)\n  if (!userId) throw redirect('\u002Fsign-in')\n\n  const data = await fetchUserData(userId)\n  return { data }\n}\n```\n\n## Auth in Actions\n\n```tsx\nimport { getAuth } from '@clerk\u002Freact-router\u002Fserver'\n\nexport async function action(args: Route.ActionArgs) {\n  const { userId, orgId } = await getAuth(args)\n  if (!userId) throw new Response('Unauthorized', { status: 401 })\n\n  const formData = await args.request.formData()\n  await saveData(userId, orgId, formData)\n  return redirect('\u002Fdashboard')\n}\n```\n\n## Client Components\n\n```tsx\nimport { useAuth, useUser } from '@clerk\u002Freact-router'\n\nexport function Profile() {\n  const { userId, isSignedIn } = useAuth()\n  const { user } = useUser()\n  if (!isSignedIn) return null\n  return \u003Cp>{user?.firstName}\u003C\u002Fp>\n}\n```\n\n## Org Switching\n\n```tsx\nimport { OrganizationSwitcher } from '@clerk\u002Freact-router'\n\nexport function Nav() {\n  return \u003COrganizationSwitcher afterSelectOrganizationUrl=\"\u002Fdashboard\" \u002F>\n}\n```\n\n```tsx\nexport async function loader(args: Route.LoaderArgs) {\n  const { userId, orgId } = await getAuth(args)\n  if (!userId) throw redirect('\u002Fsign-in')\n  if (!orgId) throw redirect('\u002Fselect-org')\n\n  return { data: await fetchOrgData(orgId) }\n}\n```\n\n## Common Pitfalls\n\n| Symptom | Cause | Fix |\n|---------|-------|-----|\n| `useNavigate() may be used only in the context of a \u003CRouter>` thrown from ClerkProvider during SSR in dev (v8) | Vite dev SSR externalizes `@clerk\u002Freact-router`, which then loads react-router's production build while the app uses the development build — two Router contexts. A single copy in `npm ls` does not rule this out. | Add `ssr: { noExternal: ['@clerk\u002Freact-router'] }` to `vite.config.ts`. Do NOT downgrade to v7 |\n| Build error: `ClerkApp` is not exported | `ClerkApp` does not exist in `@clerk\u002Freact-router` | Use `\u003CClerkProvider loaderData={loaderData}>` in root.tsx's default export |\n| `clerkMiddleware() not detected` | Missing middleware (or on v7, missing `v8_middleware` future flag) | Export `middleware = [clerkMiddleware()]` from root route; on v7 also set `future: { v8_middleware: true }` |\n| Unknown future flag error\u002Fwarning (v8) | `v8_middleware` flag left in `react-router.config.ts` after upgrading | Remove the `future.v8_middleware` entry — middleware is always on in v8 |\n| `getAuth` returns empty userId | `rootAuthLoader` not called | Call `rootAuthLoader(args)` in `root.tsx` loader |\n| Infinite redirect loop | Redirect target is also protected | Exclude `\u002Fsign-in` from protection check |\n| `redirect` not working in action | Using `Response` instead of `throw redirect()` | Use `throw redirect('\u002Fpath')` from `react-router` |\n\n## Import Map\n\n| What | Import From |\n|------|-------------|\n| `getAuth` | `@clerk\u002Freact-router\u002Fserver` |\n| `rootAuthLoader` | `@clerk\u002Freact-router\u002Fserver` |\n| `clerkMiddleware` | `@clerk\u002Freact-router\u002Fserver` |\n| `ClerkProvider` | `@clerk\u002Freact-router` |\n| `useAuth`, `useUser` | `@clerk\u002Freact-router` |\n| `OrganizationSwitcher` | `@clerk\u002Freact-router` |\n\n## See Also\n\n- `clerk-setup` - Initial Clerk install\n- `clerk-custom-ui` - Custom flows & appearance\n- `clerk-orgs` - B2B organizations\n\n## Docs\n\n[React Router SDK](https:\u002F\u002Fclerk.com\u002Fdocs\u002Freact-router\u002Fgetting-started\u002Fquickstart)\n","# React Router Patterns\n\nSDK: `@clerk\u002Freact-router` v3.5+. Supports React Router v7.9+ and v8.\n\n## What Do You Need?\n\n| Task | Reference |\n|------|-----------|\n| Auth in loaders and actions | references\u002Floaders-actions.md |\n| Protected routes and redirects | references\u002Fprotected-routes.md |\n| SSR user data and session | references\u002Fssr-auth.md |\n\n## React Router v7 vs v8\n\nCheck the installed `react-router` major version before scaffolding — the config differs:\n\n| | v7.9+ | v8+ |\n|--|--|--|\n| Middleware API | Opt-in: set `future: { v8_middleware: true }` in `react-router.config.ts` | Always on — do NOT set the flag (v8 removed it) |\n| `ssr.noExternal` workaround (below) | Not needed | **Required** |\n\n## Minimal Setup\n\n### 1. vite.config.ts (v8 only — REQUIRED)\n\nReact Router v8 ships development\u002Fproduction conditional exports. In `react-router dev`,\nVite externalizes `@clerk\u002Freact-router` for SSR, so Node resolves the production build of\nreact-router while the app code gets the development build — two module instances, two\nRouter contexts. Every request then fails during SSR with:\n\n```\nError: useNavigate() may be used only in the context of a \u003CRouter> component.\n```\n\n**`npm ls react-router` shows a single copy — that does NOT rule this out.** The\nduplication is per export condition, not per installed copy. Do not chase duplicate\ninstalls; add the workaround (upstream issue:\nhttps:\u002F\u002Fgithub.com\u002Fremix-run\u002Freact-router\u002Fissues\u002F15232):\n\n```ts\nimport { reactRouter } from '@react-router\u002Fdev\u002Fvite'\nimport { defineConfig } from 'vite'\n\nexport default defineConfig({\n  plugins: [reactRouter()],\n  ssr: {\n    noExternal: ['@clerk\u002Freact-router'],\n  },\n})\n```\n\n### 2. root.tsx\n\n```tsx\nimport { Outlet } from 'react-router'\nimport { rootAuthLoader, clerkMiddleware } from '@clerk\u002Freact-router\u002Fserver'\nimport { ClerkProvider } from '@clerk\u002Freact-router'\nimport type { Route } from '.\u002F+types\u002Froot'\n\nexport const middleware: Route.MiddlewareFunction[] = [clerkMiddleware()]\n\nexport async function loader(args: Route.LoaderArgs) {\n  return rootAuthLoader(args)\n}\n\nexport default function App({ loaderData }: Route.ComponentProps) {\n  return (\n    \u003CClerkProvider loaderData={loaderData}>\n      \u003COutlet \u002F>\n    \u003C\u002FClerkProvider>\n  )\n}\n```\n\nThere is no `ClerkApp` HOC in `@clerk\u002Freact-router` (that was the `@clerk\u002Fremix` API).\nRender `\u003CClerkProvider loaderData={loaderData}>` inside the default export and pass it\nthe root route's `loaderData`.\n\n### 3. react-router.config.ts (v7 only)\n\n```ts\nimport type { Config } from '@react-router\u002Fdev\u002Fconfig'\n\nexport default {\n  future: {\n    v8_middleware: true,\n  },\n} satisfies Config\n```\n\nOn v8, omit the `future` block entirely — the flag no longer exists.\n\n> **Required**: `rootAuthLoader` must be called in `root.tsx`'s loader. Without it, `getAuth` throws in nested loaders.\n\n## Mental Model\n\nReact Router v7\u002Fv8 uses a middleware + loader pipeline. Clerk plugs into both layers:\n\n- **Middleware** (`clerkMiddleware()`) — runs on every request, attaches auth to context\n- **`rootAuthLoader`** — required in `root.tsx` to pass Clerk state to the client\n- **`getAuth(args)`** — called inside any loader\u002Faction to get the current user\n\n```\nRequest → clerkMiddleware() → rootAuthLoader → page loader → component\n                 ↓                   ↓               ↓\n           attaches auth      injects state     getAuth(args)\n           to context         to response       reads context\n```\n\n## Auth in Loaders\n\n```tsx\nimport { getAuth } from '@clerk\u002Freact-router\u002Fserver'\nimport type { Route } from '.\u002F+types\u002Fdashboard'\n\nexport async function loader(args: Route.LoaderArgs) {\n  const { userId } = await getAuth(args)\n  if (!userId) throw redirect('\u002Fsign-in')\n\n  const data = await fetchUserData(userId)\n  return { data }\n}\n```\n\n## Auth in Actions\n\n```tsx\nimport { getAuth } from '@clerk\u002Freact-router\u002Fserver'\n\nexport async function action(args: Route.ActionArgs) {\n  const { userId, orgId } = await getAuth(args)\n  if (!userId) throw new Response('Unauthorized', { status: 401 })\n\n  const formData = await args.request.formData()\n  await saveData(userId, orgId, formData)\n  return redirect('\u002Fdashboard')\n}\n```\n\n## Client Components\n\n```tsx\nimport { useAuth, useUser } from '@clerk\u002Freact-router'\n\nexport function Profile() {\n  const { userId, isSignedIn } = useAuth()\n  const { user } = useUser()\n  if (!isSignedIn) return null\n  return \u003Cp>{user?.firstName}\u003C\u002Fp>\n}\n```\n\n## Org Switching\n\n```tsx\nimport { OrganizationSwitcher } from '@clerk\u002Freact-router'\n\nexport function Nav() {\n  return \u003COrganizationSwitcher afterSelectOrganizationUrl=\"\u002Fdashboard\" \u002F>\n}\n```\n\n```tsx\nexport async function loader(args: Route.LoaderArgs) {\n  const { userId, orgId } = await getAuth(args)\n  if (!userId) throw redirect('\u002Fsign-in')\n  if (!orgId) throw redirect('\u002Fselect-org')\n\n  return { data: await fetchOrgData(orgId) }\n}\n```\n\n## Common Pitfalls\n\n| Symptom | Cause | Fix |\n|---------|-------|-----|\n| `useNavigate() may be used only in the context of a \u003CRouter>` thrown from ClerkProvider during SSR in dev (v8) | Vite dev SSR externalizes `@clerk\u002Freact-router`, which then loads react-router's production build while the app uses the development build — two Router contexts. A single copy in `npm ls` does not rule this out. | Add `ssr: { noExternal: ['@clerk\u002Freact-router'] }` to `vite.config.ts`. Do NOT downgrade to v7 |\n| Build error: `ClerkApp` is not exported | `ClerkApp` does not exist in `@clerk\u002Freact-router` | Use `\u003CClerkProvider loaderData={loaderData}>` in root.tsx's default export |\n| `clerkMiddleware() not detected` | Missing middleware (or on v7, missing `v8_middleware` future flag) | Export `middleware = [clerkMiddleware()]` from root route; on v7 also set `future: { v8_middleware: true }` |\n| Unknown future flag error\u002Fwarning (v8) | `v8_middleware` flag left in `react-router.config.ts` after upgrading | Remove the `future.v8_middleware` entry — middleware is always on in v8 |\n| `getAuth` returns empty userId | `rootAuthLoader` not called | Call `rootAuthLoader(args)` in `root.tsx` loader |\n| Infinite redirect loop | Redirect target is also protected | Exclude `\u002Fsign-in` from protection check |\n| `redirect` not working in action | Using `Response` instead of `throw redirect()` | Use `throw redirect('\u002Fpath')` from `react-router` |\n\n## Import Map\n\n| What | Import From |\n|------|-------------|\n| `getAuth` | `@clerk\u002Freact-router\u002Fserver` |\n| `rootAuthLoader` | `@clerk\u002Freact-router\u002Fserver` |\n| `clerkMiddleware` | `@clerk\u002Freact-router\u002Fserver` |\n| `ClerkProvider` | `@clerk\u002Freact-router` |\n| `useAuth`, `useUser` | `@clerk\u002Freact-router` |\n| `OrganizationSwitcher` | `@clerk\u002Freact-router` |\n\n## See Also\n\n- `clerk-setup` - Initial Clerk install\n- `clerk-custom-ui` - Custom flows & appearance\n- `clerk-orgs` - B2B organizations\n\n## Docs\n\n[React Router SDK](https:\u002F\u002Fclerk.com\u002Fdocs\u002Freact-router\u002Fgetting-started\u002Fquickstart)\n",{"name":5,"license":14,"metadata":48,"description":7,"allowed-tools":50},{"author":28,"version":49},"1.1.0","WebFetch","main","7db7c6f88fb96b6792195dacabdb088419b7a9fa",".agents\u002Fskills\u002Fclerk-react-router-patterns",0,"https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform","https:\u002F\u002Fgithub.com\u002FAllternit","https:\u002F\u002Fallternit.com","Allternit builds AI agents that work on your computer, in the cloud, and from your phone. Home of Allternit Desktop and Gizzi Code.","2026-11-13 03:03:58",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add Allternit\u002Fallternit-platform --skill clerk-react-router-patterns",{"tool":66,"command":67},"bunx","bunx skills add Allternit\u002Fallternit-platform --skill clerk-react-router-patterns",{"tool":69,"command":70},"pnpm","pnpm dlx skills add Allternit\u002Fallternit-platform --skill clerk-react-router-patterns","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-react-router-patterns\u002FSKILL.md",true,[74,80,84,88,92,96,100,104,108,112,117,121,127,131,135,139],{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"evals\u002Fevals.json","REFERENCE","参考文档",4749,"https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-react-router-patterns\u002Fevals\u002Fevals.json",{"path":81,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":82,"sourceHtmlUrl":83},"references\u002Fdesign-system.md",13200,"https:\u002F\u002Fgithub.com\u002Fian-pascoe\u002Fdotfiles\u002Fblob\u002Fmain\u002Fdot_agents\u002Fskills\u002Fplannotator-visual-explainer\u002Freferences\u002Fdesign-system.md",{"path":85,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":86,"sourceHtmlUrl":87},"references\u002Fdiagram-shell.md",4051,"https:\u002F\u002Fgithub.com\u002Fian-pascoe\u002Fdotfiles\u002Fblob\u002Fmain\u002Fdot_agents\u002Fskills\u002Fplannotator-visual-explainer\u002Freferences\u002Fdiagram-shell.md",{"path":89,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":90,"sourceHtmlUrl":91},"references\u002Floaders-actions.md",1742,"https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-react-router-patterns\u002Freferences\u002Floaders-actions.md",{"path":93,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":94,"sourceHtmlUrl":95},"references\u002Fpr-components.md",15984,"https:\u002F\u002Fgithub.com\u002Fian-pascoe\u002Fdotfiles\u002Fblob\u002Fmain\u002Fdot_agents\u002Fskills\u002Fplannotator-visual-explainer\u002Freferences\u002Fpr-components.md",{"path":97,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":98,"sourceHtmlUrl":99},"references\u002Fprotected-routes.md",1712,"https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-react-router-patterns\u002Freferences\u002Fprotected-routes.md",{"path":101,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":102,"sourceHtmlUrl":103},"references\u002Fssr-auth.md",1470,"https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-react-router-patterns\u002Freferences\u002Fssr-auth.md",{"path":105,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":106,"sourceHtmlUrl":107},"references\u002Fsvg-patterns.md",13518,"https:\u002F\u002Fgithub.com\u002Fian-pascoe\u002Fdotfiles\u002Fblob\u002Fmain\u002Fdot_agents\u002Fskills\u002Fplannotator-visual-explainer\u002Freferences\u002Fsvg-patterns.md",{"path":109,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":110,"sourceHtmlUrl":111},"references\u002Ftheme-override.md",7964,"https:\u002F\u002Fgithub.com\u002Fian-pascoe\u002Fdotfiles\u002Fblob\u002Fmain\u002Fdot_agents\u002Fskills\u002Fplannotator-visual-explainer\u002Freferences\u002Ftheme-override.md",{"path":113,"resourceType":114,"resourceTypeDesc":115,"sizeBytes":54,"sourceHtmlUrl":116},"templates\u002Freact-router-basic-auth\u002Fapp\u002Fapp.css","OTHER","其他","https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-react-router-patterns\u002Ftemplates\u002Freact-router-basic-auth\u002Fapp\u002Fapp.css",{"path":118,"resourceType":114,"resourceTypeDesc":115,"sizeBytes":119,"sourceHtmlUrl":120},"templates\u002Freact-router-basic-auth\u002Fapp\u002Froot.tsx",2504,"https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-react-router-patterns\u002Ftemplates\u002Freact-router-basic-auth\u002Fapp\u002Froot.tsx",{"path":122,"resourceType":123,"resourceTypeDesc":124,"sizeBytes":125,"sourceHtmlUrl":126},"templates\u002Freact-router-basic-auth\u002Fapp\u002Froutes.ts","SCRIPT","脚本",132,"https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-react-router-patterns\u002Ftemplates\u002Freact-router-basic-auth\u002Fapp\u002Froutes.ts",{"path":128,"resourceType":114,"resourceTypeDesc":115,"sizeBytes":129,"sourceHtmlUrl":130},"templates\u002Freact-router-basic-auth\u002Fapp\u002Froutes\u002Fhome.tsx",57,"https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-react-router-patterns\u002Ftemplates\u002Freact-router-basic-auth\u002Fapp\u002Froutes\u002Fhome.tsx",{"path":132,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":133,"sourceHtmlUrl":134},"templates\u002Freact-router-basic-auth\u002Fpackage.json",427,"https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-react-router-patterns\u002Ftemplates\u002Freact-router-basic-auth\u002Fpackage.json",{"path":136,"resourceType":123,"resourceTypeDesc":124,"sizeBytes":137,"sourceHtmlUrl":138},"templates\u002Freact-router-basic-auth\u002Freact-router.config.ts",105,"https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-react-router-patterns\u002Ftemplates\u002Freact-router-basic-auth\u002Freact-router.config.ts",{"path":140,"resourceType":123,"resourceTypeDesc":124,"sizeBytes":141,"sourceHtmlUrl":142},"templates\u002Freact-router-basic-auth\u002Fvite.config.ts",499,"https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclerk-react-router-patterns\u002Ftemplates\u002Freact-router-basic-auth\u002Fvite.config.ts",[144,171,187,209,231,261],{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":148,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":151,"publishedAt":43},"01M6C6GBWRCJNWQP5S16PKXB77","jev","Ask typed System One judgments (noul \u002F choice \u002F score) against Allternit's LOCAL System One server instead of prompting a chat model to \"return JSON\". Use when classifying, routing, scoring, or screening something and code needs a probability it can branch on, or when the user runs \u002Fjev. Official TypeSafe Jev is an optional, explicit remote lane.","Apache-2.0","https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002Ftools\u002Fsystem-one-local\u002Fskills\u002Fjev\u002FSKILL.md",[],[146,152,153,154,155,156,157,158,159,160,161,162,37,163,164,165,166,167,168,169,170],"official","routing","code","server","lane","system","json","model","choice","branch","ask","use","scoring","chat","local","probability","remote","can","when",{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":148,"licenseFileUrl":6,"sourceHtmlUrl":175,"categories":176,"keywords":177,"publishedAt":43},"01M6C6G9CGB9MX47NSQ31QNNB7","jev-route","Route with local System One answers — map Choice + confidence to act \u002F confirm \u002F human lanes, or pick a model tier by Choice label. Also documents the separate `route-model` helper for OpenRouter's typesafe\u002Fjev-router (a chat-model router, NOT System One). Use for confidence routing, model-tier routing, or when the user runs \u002Fjev-route.","https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002Ftools\u002Fsystem-one-local\u002Fskills\u002Fjev-route\u002FSKILL.md",[],[146,178,33,179,153,157,159,180,160,181,37,163,25,182,165,183,166,184,29,185,186,170],"jev route","documents","pick","openrouter","model router","map","helper","for","model-tier",{"skillNo":188,"name":189,"nameZh":6,"description":190,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":148,"licenseFileUrl":6,"sourceHtmlUrl":191,"categories":192,"keywords":193,"publishedAt":43},"01M6C6G6JZE0RC50QWWE6HG320","jev-guardrail","Screen text or agent tool calls with a battery of local System One Noul hazards plus a Score, with policy in code — and the Claude Code PreToolUse guard (hooks\u002Fpretooluse-guard) that puts deterministic hard rules first and lets Jev only raise friction. Use for injection\u002Fsecret\u002Fdestructive-action screening or when the user runs \u002Fjev-guardrail.","https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002Ftools\u002Fsystem-one-local\u002Fskills\u002Fjev-guardrail\u002FSKILL.md",[],[146,194,195,196,154,197,198,199,157,200,201,202,37,163,203,35,204,205,166,206,207,185,208,170],"jev guardrail","guardrail","policy","injection","first","guard","tool","text","Rules","friction","hooks","deterministic","battery","calls","agent tool",{"skillNo":210,"name":211,"nameZh":6,"description":212,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":148,"licenseFileUrl":6,"sourceHtmlUrl":213,"categories":214,"keywords":218,"publishedAt":43},"01M6C6G426P7Q5J3F98HVYDCB2","jev-fanout","Ask every independent System One question over the same state in ONE POST \u002Fv1\u002Fsystemone to the local server (speculative fan-out). Use for parallel judgments, compound commands, one-call turn assessment, or when the user runs \u002Fjev-fanout. Do not fire one HTTP call per question.","https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002Ftools\u002Fsystem-one-local\u002Fskills\u002Fjev-fanout\u002FSKILL.md",[215],{"categoryNo":216,"categoryName":217,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",[146,219,220,221,222,223,155,157,224,162,225,37,163,226,227,166,228,229,185,230,170],"fanout","jev fanout","http","assessment","state","parallel","question","do","call","post","v1","local server",{"skillNo":232,"name":233,"nameZh":6,"description":234,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":148,"licenseFileUrl":6,"sourceHtmlUrl":235,"categories":236,"keywords":237,"publishedAt":43},"01M6C6G13D7JK869Q3DHMQ9542","memory-drive","Read and write the user's Allternit Memory Drive, a git repo of markdown memories in the open Agent Memory Repo format. Use at the start of a session to load what the user's agents remember (MEMORY.md), when the user says \"remember this\", when you learn a durable fact about the user or their work, and before answering questions that depend on past sessions.","https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002Ftools\u002Fmemory-drive-plugin\u002Fskills\u002Fmemory-drive\u002FSKILL.md",[],[238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,37,254,163,255,256,257,258,259,260,170],"memory","drive","memory drive","sessions","remember","learn","git","agent memory","start","open","markdown","format","work","repo","read","write","session","what the","memories","about","questions","you","load",{"skillNo":262,"name":263,"nameZh":6,"description":264,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":148,"licenseFileUrl":6,"sourceHtmlUrl":265,"categories":266,"keywords":270,"publishedAt":43},"01M6C6FX778N1047QAJ39Y582H","agent-orchestrator","Orchestrate external CLI agents (kimi, codex, agy, claude, grok, gizzi) through the Allternit Factory (gizzi agents \u002F orchestration \u002F workspace \u002F workflows). Use when the user asks to delegate, offload, or farm out implementation work to another CLI agent \u002F terminal session, or to run work outside this session to save tokens. Part of Allternit Agents \u002F Bot Agents — not a separate product.","https:\u002F\u002Fgithub.com\u002FAllternit\u002Fallternit-platform\u002Fblob\u002Fmain\u002Ftools\u002Fagent-orchestrator\u002FSKILL.md",[267],{"categoryNo":268,"categoryName":269,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[271,272,273,274,275,276,277,278,279,280,281,282,283,250,284,285,254,163,286,287,288,289,290,291,292,293,170],"orchestrator","agent orchestrator","bot","cli","terminal","codex","orchestration","workflows","run","product","orchestrate","save","workspace","delegate","factory","grok","kimi","implementation","offload","tokens","cli agents","farm","terminal session"]