[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6K1VE8ASH8BP59DJE0313R3":3,"skill-same:01M6K1VE8ASH8BP59DJE0313R3":155},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":31,"publishedAt":51,"linkOnly":52,"markdownContent":53,"markdownBody":54,"frontMatter":55,"refName":132,"commitSha":133,"skillDirectory":134,"forksCount":135,"repositoryHtmlUrl":136,"repositoryHomepageUrl":6,"ownerHtmlUrl":137,"ownerBlogUrl":138,"ownerDescription":139,"updatedAt":140,"install":141,"resources":154},"01M6K1VE8ASH8BP59DJE0313R3","swr",null,"SWR data-fetching expert guidance. Use when building React apps with client-side data fetching, caching, revalidation, mutations, optimistic UI, pagination, or infinite loading using the SWR library.","NagyVikt\u002Fcodex-plugins","NagyVikt","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F137165288?v=4","01M6K0SJ3R2DAZRJKJJS10VN87","Viktor Nagy","01M6K0SJ9HXN0GBD91QDQ9WNVV",2,"MIT","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fswr\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[5,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50],"caching","data fetching","utils","retry","loading","error","apps","app","neon","mutation","react","postgres","expert","hooks","fetch","api","deduplication","server","streaming","2026-11-10 10:12:30",false,"---\nname: swr\ndescription: SWR data-fetching expert guidance. Use when building React apps with client-side data fetching, caching, revalidation, mutations, optimistic UI, pagination, or infinite loading using the SWR library.\nmetadata:\n  priority: 4\n  docs:\n    - \"https:\u002F\u002Fswr.vercel.app\u002Fdocs\"\n  sitemap: \"https:\u002F\u002Fswr.vercel.app\u002Fsitemap.xml\"\n  pathPatterns:\n    - 'lib\u002Ffetcher.*'\n    - 'src\u002Flib\u002Ffetcher.*'\n    - 'utils\u002Ffetcher.*'\n    - 'src\u002Futils\u002Ffetcher.*'\n    - 'hooks\u002Fuse*SWR*'\n    - 'src\u002Fhooks\u002Fuse*SWR*'\n    - 'hooks\u002FuseFetch*'\n    - 'src\u002Fhooks\u002FuseFetch*'\n  importPatterns:\n    - 'swr'\n    - 'swr\u002F*'\n  bashPatterns:\n    - '\\bnpm\\s+(install|i|add)\\s+[^\\n]*\\bswr\\b'\n    - '\\bpnpm\\s+(install|i|add)\\s+[^\\n]*\\bswr\\b'\n    - '\\bbun\\s+(install|i|add)\\s+[^\\n]*\\bswr\\b'\n    - '\\byarn\\s+add\\s+[^\\n]*\\bswr\\b'\n  promptSignals:\n    phrases:\n      - \"swr\"\n      - \"useswr\"\n      - \"stale-while-revalidate\"\n    allOf:\n      - [data fetching, client]\n      - [cache, revalidat]\n    anyOf:\n      - \"mutation\"\n      - \"optimistic\"\n      - \"infinite loading\"\n      - \"pagination\"\n    noneOf: []\n    minScore: 6\nretrieval:\n  aliases:\n    - data fetching\n    - client cache\n    - stale while revalidate\n    - react hooks data\n  intents:\n    - refresh stale client cache after a mutation\n    - fetch and cache API data on the client side\n    - add infinite scroll or paginated data loading\n    - keep UI in sync with server data automatically\n    - revalidate cached data after updating a record\n  entities:\n    - useSWR\n    - useSWRMutation\n    - useSWRInfinite\n    - mutate\n    - SWRConfig\n    - fetcher\n  examples:\n    - refresh stale client cache after mutation\n    - load more items on scroll\n    - revalidate data when the window regains focus\n    - fetch data client side with caching\n    - add infinite scrolling to load more items\nchainTo:\n  -\n    pattern: 'from\\s+[''\\\"](openai|@anthropic-ai\u002Fsdk|anthropic)[''\"]|new\\s+(OpenAI|Anthropic)\\('\n    targetSkill: ai-sdk\n    message: 'Direct AI provider SDK detected alongside SWR — loading AI SDK guidance for unified streaming and provider-agnostic patterns.'\n  -\n    pattern: 'from\\s+[''\"\"]@vercel\u002F(postgres|kv)[''\"\"]'\n    targetSkill: vercel-storage\n    message: '@vercel\u002Fpostgres and @vercel\u002Fkv are sunset — loading Vercel Storage guidance for Neon and Upstash migration.'\n  -\n    pattern: 'useEffect\\s*\\([^)]*\\)\\s*\\{[^}]*fetch\\s*\\(|useEffect\\s*\\(\\s*\\(\\)\\s*=>\\s*\\{[^}]*fetch\\s*\\('\n    targetSkill: swr\n    message: 'Manual useEffect+fetch pattern detected — SWR provides automatic caching, deduplication, revalidation, and error retry. Replace with useSWR for cleaner data fetching.'\n  -\n    pattern: 'from\\s+[''\\\"](axios)[''\"]|require\\s*\\(\\s*[''\\\"](axios)[''\"]'\n    targetSkill: swr\n    message: 'Axios detected in React component — SWR with a native fetch wrapper provides caching, deduplication, and revalidation that axios alone cannot. Use useSWR with a fetcher function instead.'\n\n---\n\n# SWR — React Hooks for Data Fetching\n\nYou are an expert in SWR v2 (latest: 2.4.1), the React Hooks library for data fetching by Vercel. SWR implements the stale-while-revalidate HTTP cache invalidation strategy — serve from cache first, then revalidate in the background.\n\n## Installation\n\n```bash\nnpm install swr\n```\n\n## Core API\n\n### `useSWR`\n\n```tsx\nimport useSWR from 'swr'\n\nconst fetcher = (url: string) => fetch(url).then(res => res.json())\n\nfunction Profile() {\n  const { data, error, isLoading, mutate } = useSWR('\u002Fapi\u002Fuser', fetcher)\n\n  if (isLoading) return \u003Cdiv>Loading...\u003C\u002Fdiv>\n  if (error) return \u003Cdiv>Error loading data\u003C\u002Fdiv>\n  return \u003Cdiv>Hello, {data.name}\u003C\u002Fdiv>\n}\n```\n\n**Key parameters:**\n- `key` — unique string, array, or function identifying the resource (often a URL)\n- `fetcher` — async function that receives the key and returns data\n- `options` — optional config object\n\n**Return values:** `data`, `error`, `isLoading`, `isValidating`, `mutate`\n\n### `useSWRMutation` — Remote Mutations\n\n```tsx\nimport useSWRMutation from 'swr\u002Fmutation'\n\nasync function updateUser(url: string, { arg }: { arg: { name: string } }) {\n  return fetch(url, { method: 'POST', body: JSON.stringify(arg) }).then(res => res.json())\n}\n\nfunction Profile() {\n  const { trigger, isMutating } = useSWRMutation('\u002Fapi\u002Fuser', updateUser)\n\n  return (\n    \u003Cbutton disabled={isMutating} onClick={() => trigger({ name: 'New Name' })}>\n      Update\n    \u003C\u002Fbutton>\n  )\n}\n```\n\n### `useSWRInfinite` — Pagination & Infinite Loading\n\n```tsx\nimport useSWRInfinite from 'swr\u002Finfinite'\n\nconst getKey = (pageIndex: number, previousPageData: any[]) => {\n  if (previousPageData && !previousPageData.length) return null\n  return `\u002Fapi\u002Fitems?page=${pageIndex}`\n}\n\nfunction Items() {\n  const { data, size, setSize, isLoading } = useSWRInfinite(getKey, fetcher)\n  const items = data ? data.flat() : []\n\n  return (\n    \u003C>\n      {items.map(item => \u003Cdiv key={item.id}>{item.name}\u003C\u002Fdiv>)}\n      \u003Cbutton onClick={() => setSize(size + 1)}>Load More\u003C\u002Fbutton>\n    \u003C\u002F>\n  )\n}\n```\n\n## Global Configuration\n\nWrap your app (or a subtree) with `SWRConfig` to set defaults:\n\n```tsx\nimport { SWRConfig } from 'swr'\n\nfunction App() {\n  return (\n    \u003CSWRConfig value={{\n      fetcher: (url: string) => fetch(url).then(res => res.json()),\n      revalidateOnFocus: false,\n      dedupingInterval: 5000,\n    }}>\n      \u003CDashboard \u002F>\n    \u003C\u002FSWRConfig>\n  )\n}\n```\n\n## Revalidation Strategies\n\n| Strategy | Option | Default |\n|---|---|---|\n| On window focus | `revalidateOnFocus` | `true` |\n| On network recovery | `revalidateOnReconnect` | `true` |\n| On mount if stale | `revalidateIfStale` | `true` |\n| Polling | `refreshInterval` | `0` (disabled) |\n| Manual | Call `mutate()` | — |\n\n## Optimistic Updates\n\n```tsx\nconst { trigger } = useSWRMutation('\u002Fapi\u002Fuser', updateUser, {\n  optimisticData: (current) => ({ ...current, name: 'New Name' }),\n  rollbackOnError: true,\n  populateCache: true,\n  revalidate: false,\n})\n```\n\n## Conditional Fetching\n\nPass `null` or a falsy key to skip fetching:\n\n```tsx\nconst { data } = useSWR(userId ? `\u002Fapi\u002Fuser\u002F${userId}` : null, fetcher)\n```\n\n## Error Retry\n\nSWR retries on error by default with exponential backoff. Customize with:\n\n```tsx\nuseSWR(key, fetcher, {\n  onErrorRetry: (error, key, config, revalidate, { retryCount }) => {\n    if (error.status === 404) return \u002F\u002F Don't retry on 404\n    if (retryCount >= 3) return      \u002F\u002F Max 3 retries\n    setTimeout(() => revalidate({ retryCount }), 5000)\n  },\n})\n```\n\n## `useSWRSubscription` — Real-Time Data Sources\n\nSubscribe to real-time data (WebSockets, SSE, etc.) with automatic deduplication:\n\n```tsx\nimport useSWRSubscription from 'swr\u002Fsubscription'\n\nfunction LivePrice({ symbol }: { symbol: string }) {\n  const { data } = useSWRSubscription(\n    `wss:\u002F\u002Fstream.example.com\u002F${symbol}`,\n    (key, { next }) => {\n      const ws = new WebSocket(key)\n      ws.onmessage = (event) => next(null, JSON.parse(event.data))\n      ws.onerror = (event) => next(event)\n      return () => ws.close()\n    }\n  )\n\n  return \u003Cspan>{data?.price}\u003C\u002Fspan>\n}\n```\n\nThe `subscribe` function receives a `next(error, data)` callback and must return a cleanup function. Multiple components using the same key share a single subscription.\n\n## Key Rules\n\n- **Keys must be unique** — two `useSWR` calls with the same key share cache and deduplicate requests\n- **Fetcher is optional** when set via `SWRConfig`\n- **`mutate(key)`** globally revalidates any hook matching that key\n- **Array keys** like `useSWR(['\u002Fapi\u002Fuser', id], fetcher)` — the fetcher receives the full array\n- **Never call hooks conditionally** — use conditional keys (`null`) instead\n","# SWR — React Hooks for Data Fetching\n\nYou are an expert in SWR v2 (latest: 2.4.1), the React Hooks library for data fetching by Vercel. SWR implements the stale-while-revalidate HTTP cache invalidation strategy — serve from cache first, then revalidate in the background.\n\n## Installation\n\n```bash\nnpm install swr\n```\n\n## Core API\n\n### `useSWR`\n\n```tsx\nimport useSWR from 'swr'\n\nconst fetcher = (url: string) => fetch(url).then(res => res.json())\n\nfunction Profile() {\n  const { data, error, isLoading, mutate } = useSWR('\u002Fapi\u002Fuser', fetcher)\n\n  if (isLoading) return \u003Cdiv>Loading...\u003C\u002Fdiv>\n  if (error) return \u003Cdiv>Error loading data\u003C\u002Fdiv>\n  return \u003Cdiv>Hello, {data.name}\u003C\u002Fdiv>\n}\n```\n\n**Key parameters:**\n- `key` — unique string, array, or function identifying the resource (often a URL)\n- `fetcher` — async function that receives the key and returns data\n- `options` — optional config object\n\n**Return values:** `data`, `error`, `isLoading`, `isValidating`, `mutate`\n\n### `useSWRMutation` — Remote Mutations\n\n```tsx\nimport useSWRMutation from 'swr\u002Fmutation'\n\nasync function updateUser(url: string, { arg }: { arg: { name: string } }) {\n  return fetch(url, { method: 'POST', body: JSON.stringify(arg) }).then(res => res.json())\n}\n\nfunction Profile() {\n  const { trigger, isMutating } = useSWRMutation('\u002Fapi\u002Fuser', updateUser)\n\n  return (\n    \u003Cbutton disabled={isMutating} onClick={() => trigger({ name: 'New Name' })}>\n      Update\n    \u003C\u002Fbutton>\n  )\n}\n```\n\n### `useSWRInfinite` — Pagination & Infinite Loading\n\n```tsx\nimport useSWRInfinite from 'swr\u002Finfinite'\n\nconst getKey = (pageIndex: number, previousPageData: any[]) => {\n  if (previousPageData && !previousPageData.length) return null\n  return `\u002Fapi\u002Fitems?page=${pageIndex}`\n}\n\nfunction Items() {\n  const { data, size, setSize, isLoading } = useSWRInfinite(getKey, fetcher)\n  const items = data ? data.flat() : []\n\n  return (\n    \u003C>\n      {items.map(item => \u003Cdiv key={item.id}>{item.name}\u003C\u002Fdiv>)}\n      \u003Cbutton onClick={() => setSize(size + 1)}>Load More\u003C\u002Fbutton>\n    \u003C\u002F>\n  )\n}\n```\n\n## Global Configuration\n\nWrap your app (or a subtree) with `SWRConfig` to set defaults:\n\n```tsx\nimport { SWRConfig } from 'swr'\n\nfunction App() {\n  return (\n    \u003CSWRConfig value={{\n      fetcher: (url: string) => fetch(url).then(res => res.json()),\n      revalidateOnFocus: false,\n      dedupingInterval: 5000,\n    }}>\n      \u003CDashboard \u002F>\n    \u003C\u002FSWRConfig>\n  )\n}\n```\n\n## Revalidation Strategies\n\n| Strategy | Option | Default |\n|---|---|---|\n| On window focus | `revalidateOnFocus` | `true` |\n| On network recovery | `revalidateOnReconnect` | `true` |\n| On mount if stale | `revalidateIfStale` | `true` |\n| Polling | `refreshInterval` | `0` (disabled) |\n| Manual | Call `mutate()` | — |\n\n## Optimistic Updates\n\n```tsx\nconst { trigger } = useSWRMutation('\u002Fapi\u002Fuser', updateUser, {\n  optimisticData: (current) => ({ ...current, name: 'New Name' }),\n  rollbackOnError: true,\n  populateCache: true,\n  revalidate: false,\n})\n```\n\n## Conditional Fetching\n\nPass `null` or a falsy key to skip fetching:\n\n```tsx\nconst { data } = useSWR(userId ? `\u002Fapi\u002Fuser\u002F${userId}` : null, fetcher)\n```\n\n## Error Retry\n\nSWR retries on error by default with exponential backoff. Customize with:\n\n```tsx\nuseSWR(key, fetcher, {\n  onErrorRetry: (error, key, config, revalidate, { retryCount }) => {\n    if (error.status === 404) return \u002F\u002F Don't retry on 404\n    if (retryCount >= 3) return      \u002F\u002F Max 3 retries\n    setTimeout(() => revalidate({ retryCount }), 5000)\n  },\n})\n```\n\n## `useSWRSubscription` — Real-Time Data Sources\n\nSubscribe to real-time data (WebSockets, SSE, etc.) with automatic deduplication:\n\n```tsx\nimport useSWRSubscription from 'swr\u002Fsubscription'\n\nfunction LivePrice({ symbol }: { symbol: string }) {\n  const { data } = useSWRSubscription(\n    `wss:\u002F\u002Fstream.example.com\u002F${symbol}`,\n    (key, { next }) => {\n      const ws = new WebSocket(key)\n      ws.onmessage = (event) => next(null, JSON.parse(event.data))\n      ws.onerror = (event) => next(event)\n      return () => ws.close()\n    }\n  )\n\n  return \u003Cspan>{data?.price}\u003C\u002Fspan>\n}\n```\n\nThe `subscribe` function receives a `next(error, data)` callback and must return a cleanup function. Multiple components using the same key share a single subscription.\n\n## Key Rules\n\n- **Keys must be unique** — two `useSWR` calls with the same key share cache and deduplicate requests\n- **Fetcher is optional** when set via `SWRConfig`\n- **`mutate(key)`** globally revalidates any hook matching that key\n- **Array keys** like `useSWR(['\u002Fapi\u002Fuser', id], fetcher)` — the fetcher receives the full array\n- **Never call hooks conditionally** — use conditional keys (`null`) instead\n",{"name":5,"chainTo":56,"metadata":71,"retrieval":108,"description":7},[57,61,65,68],{"message":58,"pattern":59,"targetSkill":60},"Direct AI provider SDK detected alongside SWR — loading AI SDK guidance for unified streaming and provider-agnostic patterns.","from\\s+['\\\"](openai|@anthropic-ai\u002Fsdk|anthropic)['\"]|new\\s+(OpenAI|Anthropic)\\(","ai-sdk",{"message":62,"pattern":63,"targetSkill":64},"@vercel\u002Fpostgres and @vercel\u002Fkv are sunset — loading Vercel Storage guidance for Neon and Upstash migration.","from\\s+['\"\"]@vercel\u002F(postgres|kv)['\"\"]","vercel-storage",{"message":66,"pattern":67,"targetSkill":5},"Manual useEffect+fetch pattern detected — SWR provides automatic caching, deduplication, revalidation, and error retry. Replace with useSWR for cleaner data fetching.","useEffect\\s*\\([^)]*\\)\\s*\\{[^}]*fetch\\s*\\(|useEffect\\s*\\(\\s*\\(\\)\\s*=>\\s*\\{[^}]*fetch\\s*\\(",{"message":69,"pattern":70,"targetSkill":5},"Axios detected in React component — SWR with a native fetch wrapper provides caching, deduplication, and revalidation that axios alone cannot. Use useSWR with a fetcher function instead.","from\\s+['\\\"](axios)['\"]|require\\s*\\(\\s*['\\\"](axios)['\"]",{"docs":72,"sitemap":74,"priority":75,"bashPatterns":76,"pathPatterns":81,"promptSignals":90,"importPatterns":106},[73],"https:\u002F\u002Fswr.vercel.app\u002Fdocs","https:\u002F\u002Fswr.vercel.app\u002Fsitemap.xml",4,[77,78,79,80],"\\bnpm\\s+(install|i|add)\\s+[^\\n]*\\bswr\\b","\\bpnpm\\s+(install|i|add)\\s+[^\\n]*\\bswr\\b","\\bbun\\s+(install|i|add)\\s+[^\\n]*\\bswr\\b","\\byarn\\s+add\\s+[^\\n]*\\bswr\\b",[82,83,84,85,86,87,88,89],"lib\u002Ffetcher.*","src\u002Flib\u002Ffetcher.*","utils\u002Ffetcher.*","src\u002Futils\u002Ffetcher.*","hooks\u002Fuse*SWR*","src\u002Fhooks\u002Fuse*SWR*","hooks\u002FuseFetch*","src\u002Fhooks\u002FuseFetch*",{"allOf":91,"anyOf":97,"noneOf":101,"phrases":102,"minScore":105},[92,94],[33,93],"client",[95,96],"cache","revalidat",[41,98,99,100],"optimistic","infinite loading","pagination",[],[5,103,104],"useswr","stale-while-revalidate",6,[5,107],"swr\u002F*",{"aliases":109,"intents":113,"entities":119,"examples":126},[33,110,111,112],"client cache","stale while revalidate","react hooks data",[114,115,116,117,118],"refresh stale client cache after a mutation","fetch and cache API data on the client side","add infinite scroll or paginated data loading","keep UI in sync with server data automatically","revalidate cached data after updating a record",[120,121,122,123,124,125],"useSWR","useSWRMutation","useSWRInfinite","mutate","SWRConfig","fetcher",[127,128,129,130,131],"refresh stale client cache after mutation","load more items on scroll","revalidate data when the window regains focus","fetch data client side with caching","add infinite scrolling to load more items","main","9a4409c8751439c3aeeea2bc3940ba05dc3cd3b5","plugins\u002Fvercel\u002Fskills\u002Fswr",0,"https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins","https:\u002F\u002Fgithub.com\u002FNagyVikt","https:\u002F\u002Fwebu.hu\u002F","Codex is a tool they said...\r\n\r\nCreator of GitGuardex, CueCards. Tech stack: Next.js · TypeScript · Rust · Linux. ","2026-03-30 02:19:53",{"source":8,"skillName":5,"commands":142,"prompt":152,"zipAvailable":153},[143,146,149],{"tool":144,"command":145},"npx","npx skills add NagyVikt\u002Fcodex-plugins --skill swr",{"tool":147,"command":148},"bunx","bunx skills add NagyVikt\u002Fcodex-plugins --skill swr",{"tool":150,"command":151},"pnpm","pnpm dlx skills add NagyVikt\u002Fcodex-plugins --skill swr","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fswr\u002FSKILL.md",true,[],[156,191,219,240,266,288],{"skillNo":157,"name":158,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":172,"publishedAt":51},"01M6K1ZEN8P9R2S6NPNJNJ8JVH","workflow","Vercel Workflow DevKit (WDK) expert guidance. Use when building durable workflows, long-running tasks, API routes or agents that need pause\u002Fresume, retries, step-based execution, or crash-safe orchestration with Vercel Workflow.","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fworkflow\u002FSKILL.md",[162,163,166,169],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":164,"categoryName":165,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":167,"categoryName":168,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000030","开发工程师",{"categoryNo":170,"categoryName":171,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000038","人力资源",[158,173,174,175,50,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190],"workflows","create","run","logs","start","why","loop","wait for","branch","auto","log","conversation","human","lib","condition","rendering","retries","sleep",{"skillNo":192,"name":193,"nameZh":6,"description":194,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":195,"categories":196,"keywords":205,"publishedAt":51},"01M6K1Z71NWFSPHK2VJJ73MVSY","verification","Full-story verification — infers what the user is building, then verifies the complete flow end-to-end: browser → API → data → response. Triggers on dev server start and 'why isn't this working' signals.","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fverification\u002FSKILL.md",[197,200,201,204],{"categoryNo":198,"categoryName":199,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":202,"categoryName":203,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000031","产品经理",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},[193,206,50,207,47,208,181,209,210,211,212,213,214,39,215,216,37,217,36,218],"auth","routing middleware","projects","user story","full stack","jest","local","project","end","false","unit","middleware","unit test",{"skillNo":220,"name":64,"nameZh":6,"description":221,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":222,"categories":223,"keywords":225,"publishedAt":51},"01M6K1YPRYJS3BQEDP8HKBHPEJ","Vercel storage expert guidance — Blob, Edge Config, and Marketplace storage (Neon Postgres, Upstash Redis). Use when choosing, configuring, or using data storage with Vercel applications.","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fvercel-storage\u002FSKILL.md",[224],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[226,227,228,229,175,230,231,182,232,233,44,234,235,40,39,186,236,237,238,239],"storage","vercel storage","vercel","config","supabase","migrate","router","clerk","prisma","connection pooling","turso","upstash","URL","auth0",{"skillNo":241,"name":242,"nameZh":6,"description":243,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":244,"categories":245,"keywords":251,"publishedAt":51},"01M6K1YFEP0GPPGMQ3D0FPTS27","vercel-services","Vercel Services — deploy multiple services within a single Vercel project. Use for monorepo layouts or when combining a backend (Python, Go) with a frontend (Next.js, Vite) in one deployment.","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fvercel-services\u002FSKILL.md",[246,247,248],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":249,"categoryName":250,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",[252,253,228,254,255,256,257,258,259,260,261,132,262,263,213,264,39,38,37,265],"vercel services","services","frontend","docker compose","SET","configure","monorepo","go api","fastapi","up","aws lambda","go backend","get","python backend",{"skillNo":267,"name":268,"nameZh":6,"description":269,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":270,"categories":271,"keywords":272,"publishedAt":51},"01M6K1Y8S3CRD43DPKX0PK1MTT","vercel-sandbox","Vercel Sandbox guidance — ephemeral Firecracker microVMs for running untrusted code safely. Supports AI agents, code generation, and experimentation. Use when executing user-generated or AI-generated code in isolation.","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fvercel-sandbox\u002FSKILL.md",[],[273,274,228,275,276,174,175,277,278,279,280,281,282,283,284,285,36,286,268,287],"sandbox","vercel sandbox","safe","ai agents","code","ai sdk","Code Generation","playground","generated","spawn","install","runner","io","child","student",{"skillNo":289,"name":290,"nameZh":6,"description":291,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":292,"categories":293,"keywords":295,"publishedAt":51},"01M6K1Y1J8S7AN97H75SHBGF7J","vercel-queues","Vercel Queues guidance (public beta) — durable event streaming with topics, consumer groups, retries, and delayed delivery. $0.60\u002F1M ops. Powers Workflow DevKit. Use when building async processing, fan-out patterns, or event-driven architectures.","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fvercel-queues\u002FSKILL.md",[294],{"categoryNo":164,"categoryName":165,"taxonomyType":21,"taxonomyTypeDesc":22},[296,228,158,173,50,297,256,47,257,261,298,299,300,301,39,186,302,189,36,303],"vercel queues","beta","message","delivery","across","worker","processing","at"]