[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-vercel-next-dev-loop":3,"mdc-f8x772-key":53,"related-org-vercel-next-dev-loop":1104,"related-repo-vercel-next-dev-loop":1269},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":29,"repoUrl":30,"updatedAt":31,"license":32,"forks":33,"topics":34,"repo":48,"sourceUrl":51,"mdContent":52},"next-dev-loop","verify Next.js runtime behavior","Verify Next.js runtime behavior after editing app code. Use this skill to confirm a change actually works in a running app — not just that it compiles or type-checks. Combines \u002F_next\u002Fmcp (Next.js's view) with agent-browser (the browser's view). Requires a running `next dev`.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"vercel","Vercel","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fvercel.png",[12,14,17,20,23,26],{"name":9,"slug":8,"type":13},"tag",{"name":15,"slug":16,"type":13},"Next.js","next-js",{"name":18,"slug":19,"type":13},"Local Development","local-development",{"name":21,"slug":22,"type":13},"Web Development","web-development",{"name":24,"slug":25,"type":13},"Frontend","frontend",{"name":27,"slug":28,"type":13},"Debugging","debugging",141208,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fnext.js","2026-05-22T06:45:28.627735",null,31587,[35,36,37,38,39,40,41,42,43,44,45,46,47,8],"blog","browser","compiler","components","hybrid","nextjs","node","react","server-rendering","ssg","static","static-site-generator","universal",{"repoUrl":30,"stars":29,"forks":33,"topics":49,"description":50},[35,36,37,38,39,40,41,42,43,44,45,46,47,8],"The React Framework","https:\u002F\u002Fgithub.com\u002Fvercel\u002Fnext.js\u002Ftree\u002FHEAD\u002Fskills\u002Fnext-dev-loop","---\nname: next-dev-loop\ndescription: >\n  Verify Next.js runtime behavior after editing app code. Use this\n  skill to confirm a change actually works in a running app — not\n  just that it compiles or type-checks. Combines \u002F_next\u002Fmcp\n  (Next.js's view) with agent-browser (the browser's view).\n  Requires a running `next dev`.\n---\n\n# next-dev-loop\n\nThe edit\u002Fverify rhythm during `next dev` — make a change, then\nconfirm it actually works at runtime, not only that the types or\nthe build are happy.\n\nYou verify through two views of the same running app:\n\n- **`\u002F_next\u002Fmcp`** — an HTTP endpoint Next.js exposes about itself.\n  Knows framework-specific things: routes, segments, RSC, server\n  actions, server logs, and errors as Next.js saw them. Call\n  `tools\u002Flist` for the current surface.\n- **`agent-browser`** — a CLI that drives a real Chrome. Knows\n  framework-agnostic browser things: DOM, console, network, React\n  fiber, vitals. Before driving it, run `agent-browser skills get core`\n  once for the version-matched usage guide — don't guess subcommands\n  from memory.\n\nThe two views cross-check each other.\n\n## requires\n\n- Next.js **16.3+** with **Turbopack** — `\u002F_next\u002Fmcp` plus the\n  proactive compile check via `get_compilation_issues`.\n- `agent-browser` **>= 0.31.1** — React introspection, worktree-scoped\n  `session id`, idempotent `--restore`, and launch flag reconciliation.\n\nThese are hard floors, not soft preferences. If anything is missing,\ntell the user how to upgrade and stop. Don't fall back to grepping\nsource or to a weaker probe — this skill assumes both views are live\nat the versions above.\n\n- Upgrade Next.js: `pnpm next upgrade` (or `npx next upgrade`).\n  Docs: https:\u002F\u002Fnextjs.org\u002Fdocs\u002Fapp\u002Fgetting-started\u002Fupgrading\n  (version-16 guide:\n  https:\u002F\u002Fnextjs.org\u002Fdocs\u002Fapp\u002Fguides\u002Fupgrading\u002Fversion-16)\n- Install or upgrade `agent-browser`: `npm i -g agent-browser@latest`.\n  If the CLI isn't on `PATH`, install it before continuing — preflight\n  expects to invoke it directly.\n\n## preflight\n\nOnce per session, confirm both views are live.\n\n1. **Open `agent-browser` at the target URL, restoring saved\n   login state when present.** First derive one stable session id for\n   this checkout and use it for every `agent-browser` command:\n\n   ```bash\n   SESSION=\"$(agent-browser session id --scope worktree --prefix next-dev-loop)\"\n   export AGENT_BROWSER_SESSION=\"$SESSION\"\n   export AGENT_BROWSER_RESTORE=\"$SESSION\"\n   ```\n\n   Then open the target URL:\n\n   ```bash\n   agent-browser --session \"$SESSION\" --restore --headed --enable react-devtools open \u003Curl>\n   ```\n\n   `--scope worktree` keeps parallel worktrees and copied checkouts\n   from colliding. Bare `--restore` uses the session id as the\n   persistence key, loads saved cookies\u002FlocalStorage before navigation\n   when present, and auto-saves state on close. Always pass the desired\n   launch flags on `open`; agent-browser will reuse, relaunch, or restart\n   its scoped background state as needed.\n\n   The browser is the user's. If state was not restored (first run,\n   expired session) and the page is gated, the user drives the login —\n   pause until they confirm. After login, continue using the same session\n   and restore context; `agent-browser close` saves the cookie state so\n   the next `open` restores it.\n\n2. Probe `\u002F_next\u002Fmcp` (`tools\u002Flist`) — confirm it's reachable and\n   lists `get_compilation_issues`:\n   - Unreachable → either `next dev` isn't running, or Next.js is\n     below 16.3. Check `package.json` to disambiguate, then refuse.\n   - `get_compilation_issues` not in the list → Next.js below 16.3.\n     Refuse and tell the user to upgrade.\n3. `get_compilation_issues` doubles as a Turbopack probe. An error\n   response of `\"Turbopack project is not available...\"` means the\n   user is on webpack. Refuse — Turbopack is required.\n4. `get_routes` → your route map for the rest of the session.\n\n## loop\n\n### before the edit — narrow the scope\n\nAsk the running app, not the codebase. `\u002F_next\u002Fmcp` knows which\nfiles rendered the current route; use those as your search scope.\nRuntime introspection stays cheap as the codebase grows; agentic\nsearch doesn't.\n\n### after the edit — verify\n\nFour failure modes. Check each:\n\n- **Compiles** — `get_compilation_issues`.\n- **Runs without errors** — `\u002F_next\u002Fmcp` (server and bubbled-up\n  browser errors both surface here).\n- **Behaves as intended** — `agent-browser` drives the page; assert\n  what the user actually sees.\n- **React-level behavior** — `agent-browser` with react-devtools\n  enabled exposes the component tree, props, state, and render\n  counts. Anchor framework-level checks here (extra renders,\n  server\u002Fclient boundary shifts, suspense fallbacks) — DOM asserts\n  alone miss them.\n\nPick the specific tool from `tools\u002Flist` or the agent-browser\nmanual rather than from memory.\n\n## gotchas\n\n- **Every `agent-browser` command must know your session and restore\n  key, or it may use an empty default browser or fail to save login\n  state.** Easiest: export both `AGENT_BROWSER_SESSION=\"$SESSION\"` and\n  `AGENT_BROWSER_RESTORE=\"$SESSION\"` at the top of each shell you run\n  agent-browser in. If you do not export them, pass\n  `--session \"$SESSION\" --restore` on every command.\n- **When the two views disagree, suspect the tooling first.** If\n  `agent-browser` says a route is broken but `\u002F_next\u002Fmcp` and the\n  server say it rendered cleanly, a stale or misdirected browser\n  session is the likelier cause than a real bug — reconcile the views\n  before debugging the app.\n- Confirming a click or navigation: the page settles a beat later, so\n  wait with `wait --load networkidle` (no path to get wrong), then\n  snapshot\u002Fread to confirm the page. Avoid `wait --url` unless you pass\n  the link's exact href — a guessed or placeholder path won't match the\n  real URL and times out after 25s.\n- A blank read, empty snapshot, `about:blank`, or a \"no browser\n  session\" error — right after `open` or after a click (even if `open`\n  reported the page) — is the browser dropping the page (a stale\n  session), not a broken route. Reopen your session at the URL with\n  `--session \"$SESSION\" --restore` and re-snapshot; if still blank,\n  run `agent-browser --session \"$SESSION\" --restore close`, then open\n  again. Don't fall back to `curl`; it bypasses the browser you're\n  testing.\n- React introspection output is stale after navigation. Re-run.\n- `\u002F_next\u002Fmcp` replies are SSE — read the JSON off the `data:` line\n  with `sed -n 's\u002F^data: \u002F\u002Fp'` (a plain `sed 's\u002F^data: \u002F\u002F'` leaves the\n  `event:` line and the parse fails).\n- Non-3000 dev server: read the `next dev` banner; set\n  `NEXT_MCP_URL=http:\u002F\u002Flocalhost:\u003Cport>\u002F_next\u002Fmcp`.\n- `get_errors` and `get_page_metadata` need at least one navigation\n  to populate.\n\n## reference\n\nAll tools below are present once preflight passes. If `tools\u002Flist`\nis missing any of them, preflight should have refused — re-check.\n\n```\n# \u002F_next\u002Fmcp                 notes\nget_project_metadata         projectPath, devServerUrl, bundler\nget_routes                   fs-scan; no browser session needed\nget_errors                   runtime + build; needs a browser session;\n                             includes browser-side errors caught by the\n                             dev server\nget_page_metadata            segment trie + routerType; needs a browser\n                             session; use as a discovery shortcut for\n                             which files power a route\nget_logs                     returns logFilePath\nget_server_action_by_id      hashed id → file + functionName\nget_compilation_issues       Turbopack only; errors on webpack\n                             (\"Turbopack project is not available\")\n```\n\n## teardown\n\nClose the session with the same session and restore context:\n`agent-browser --session \"$SESSION\" --restore close`. `close` saves\nthat session's cookies and storage so the next loop's `--restore` open\nkeeps the user logged in. Leave `next dev` up for the next loop.\n\n---\n\n`next-dev-loop-\u003Ctopic>` siblings (e.g. `next-dev-loop-rsc`, `next-dev-loop-debug`)\nassume this preflight already ran; they pick up at the loop.\n",{"data":54,"body":55},{"name":4,"description":6},{"type":56,"children":57},"root",[58,65,80,85,135,140,146,216,221,291,296,301,659,664,671,683,689,694,760,772,777,1001,1006,1018,1028,1033,1067,1071,1098],{"type":59,"tag":60,"props":61,"children":62},"element","h1",{"id":4},[63],{"type":64,"value":4},"text",{"type":59,"tag":66,"props":67,"children":68},"p",{},[69,71,78],{"type":64,"value":70},"The edit\u002Fverify rhythm during ",{"type":59,"tag":72,"props":73,"children":75},"code",{"className":74},[],[76],{"type":64,"value":77},"next dev",{"type":64,"value":79}," — make a change, then\nconfirm it actually works at runtime, not only that the types or\nthe build are happy.",{"type":59,"tag":66,"props":81,"children":82},{},[83],{"type":64,"value":84},"You verify through two views of the same running app:",{"type":59,"tag":86,"props":87,"children":88},"ul",{},[89,113],{"type":59,"tag":90,"props":91,"children":92},"li",{},[93,103,105,111],{"type":59,"tag":94,"props":95,"children":96},"strong",{},[97],{"type":59,"tag":72,"props":98,"children":100},{"className":99},[],[101],{"type":64,"value":102},"\u002F_next\u002Fmcp",{"type":64,"value":104}," — an HTTP endpoint Next.js exposes about itself.\nKnows framework-specific things: routes, segments, RSC, server\nactions, server logs, and errors as Next.js saw them. Call\n",{"type":59,"tag":72,"props":106,"children":108},{"className":107},[],[109],{"type":64,"value":110},"tools\u002Flist",{"type":64,"value":112}," for the current surface.",{"type":59,"tag":90,"props":114,"children":115},{},[116,125,127,133],{"type":59,"tag":94,"props":117,"children":118},{},[119],{"type":59,"tag":72,"props":120,"children":122},{"className":121},[],[123],{"type":64,"value":124},"agent-browser",{"type":64,"value":126}," — a CLI that drives a real Chrome. Knows\nframework-agnostic browser things: DOM, console, network, React\nfiber, vitals. Before driving it, run ",{"type":59,"tag":72,"props":128,"children":130},{"className":129},[],[131],{"type":64,"value":132},"agent-browser skills get core",{"type":64,"value":134},"\nonce for the version-matched usage guide — don't guess subcommands\nfrom memory.",{"type":59,"tag":66,"props":136,"children":137},{},[138],{"type":64,"value":139},"The two views cross-check each other.",{"type":59,"tag":141,"props":142,"children":144},"h2",{"id":143},"requires",[145],{"type":64,"value":143},{"type":59,"tag":86,"props":147,"children":148},{},[149,183],{"type":59,"tag":90,"props":150,"children":151},{},[152,154,159,161,166,168,173,175,181],{"type":64,"value":153},"Next.js ",{"type":59,"tag":94,"props":155,"children":156},{},[157],{"type":64,"value":158},"16.3+",{"type":64,"value":160}," with ",{"type":59,"tag":94,"props":162,"children":163},{},[164],{"type":64,"value":165},"Turbopack",{"type":64,"value":167}," — ",{"type":59,"tag":72,"props":169,"children":171},{"className":170},[],[172],{"type":64,"value":102},{"type":64,"value":174}," plus the\nproactive compile check via ",{"type":59,"tag":72,"props":176,"children":178},{"className":177},[],[179],{"type":64,"value":180},"get_compilation_issues",{"type":64,"value":182},".",{"type":59,"tag":90,"props":184,"children":185},{},[186,191,193,198,200,206,208,214],{"type":59,"tag":72,"props":187,"children":189},{"className":188},[],[190],{"type":64,"value":124},{"type":64,"value":192}," ",{"type":59,"tag":94,"props":194,"children":195},{},[196],{"type":64,"value":197},">= 0.31.1",{"type":64,"value":199}," — React introspection, worktree-scoped\n",{"type":59,"tag":72,"props":201,"children":203},{"className":202},[],[204],{"type":64,"value":205},"session id",{"type":64,"value":207},", idempotent ",{"type":59,"tag":72,"props":209,"children":211},{"className":210},[],[212],{"type":64,"value":213},"--restore",{"type":64,"value":215},", and launch flag reconciliation.",{"type":59,"tag":66,"props":217,"children":218},{},[219],{"type":64,"value":220},"These are hard floors, not soft preferences. If anything is missing,\ntell the user how to upgrade and stop. Don't fall back to grepping\nsource or to a weaker probe — this skill assumes both views are live\nat the versions above.",{"type":59,"tag":86,"props":222,"children":223},{},[224,263],{"type":59,"tag":90,"props":225,"children":226},{},[227,229,235,237,243,245,253,255,261],{"type":64,"value":228},"Upgrade Next.js: ",{"type":59,"tag":72,"props":230,"children":232},{"className":231},[],[233],{"type":64,"value":234},"pnpm next upgrade",{"type":64,"value":236}," (or ",{"type":59,"tag":72,"props":238,"children":240},{"className":239},[],[241],{"type":64,"value":242},"npx next upgrade",{"type":64,"value":244},").\nDocs: ",{"type":59,"tag":246,"props":247,"children":251},"a",{"href":248,"rel":249},"https:\u002F\u002Fnextjs.org\u002Fdocs\u002Fapp\u002Fgetting-started\u002Fupgrading",[250],"nofollow",[252],{"type":64,"value":248},{"type":64,"value":254},"\n(version-16 guide:\n",{"type":59,"tag":246,"props":256,"children":259},{"href":257,"rel":258},"https:\u002F\u002Fnextjs.org\u002Fdocs\u002Fapp\u002Fguides\u002Fupgrading\u002Fversion-16",[250],[260],{"type":64,"value":257},{"type":64,"value":262},")",{"type":59,"tag":90,"props":264,"children":265},{},[266,268,273,275,281,283,289],{"type":64,"value":267},"Install or upgrade ",{"type":59,"tag":72,"props":269,"children":271},{"className":270},[],[272],{"type":64,"value":124},{"type":64,"value":274},": ",{"type":59,"tag":72,"props":276,"children":278},{"className":277},[],[279],{"type":64,"value":280},"npm i -g agent-browser@latest",{"type":64,"value":282},".\nIf the CLI isn't on ",{"type":59,"tag":72,"props":284,"children":286},{"className":285},[],[287],{"type":64,"value":288},"PATH",{"type":64,"value":290},", install it before continuing — preflight\nexpects to invoke it directly.",{"type":59,"tag":141,"props":292,"children":294},{"id":293},"preflight",[295],{"type":64,"value":293},{"type":59,"tag":66,"props":297,"children":298},{},[299],{"type":64,"value":300},"Once per session, confirm both views are live.",{"type":59,"tag":302,"props":303,"children":304},"ol",{},[305,571,630,648],{"type":59,"tag":90,"props":306,"children":307},{},[308,320,322,327,329,442,446,448,525,528,534,536,541,543,549,551,554,556,562,564,569],{"type":59,"tag":94,"props":309,"children":310},{},[311,313,318],{"type":64,"value":312},"Open ",{"type":59,"tag":72,"props":314,"children":316},{"className":315},[],[317],{"type":64,"value":124},{"type":64,"value":319}," at the target URL, restoring saved\nlogin state when present.",{"type":64,"value":321}," First derive one stable session id for\nthis checkout and use it for every ",{"type":59,"tag":72,"props":323,"children":325},{"className":324},[],[326],{"type":64,"value":124},{"type":64,"value":328}," command:",{"type":59,"tag":330,"props":331,"children":336},"pre",{"className":332,"code":333,"language":334,"meta":335,"style":335},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","SESSION=\"$(agent-browser session id --scope worktree --prefix next-dev-loop)\"\nexport AGENT_BROWSER_SESSION=\"$SESSION\"\nexport AGENT_BROWSER_RESTORE=\"$SESSION\"\n","bash","",[337],{"type":59,"tag":72,"props":338,"children":339},{"__ignoreMap":335},[340,379,413],{"type":59,"tag":341,"props":342,"children":345},"span",{"class":343,"line":344},"line",1,[346,352,358,363,368,374],{"type":59,"tag":341,"props":347,"children":349},{"style":348},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[350],{"type":64,"value":351},"SESSION",{"type":59,"tag":341,"props":353,"children":355},{"style":354},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[356],{"type":64,"value":357},"=",{"type":59,"tag":341,"props":359,"children":360},{"style":354},[361],{"type":64,"value":362},"\"$(",{"type":59,"tag":341,"props":364,"children":366},{"style":365},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[367],{"type":64,"value":124},{"type":59,"tag":341,"props":369,"children":371},{"style":370},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[372],{"type":64,"value":373}," session id --scope worktree --prefix next-dev-loop",{"type":59,"tag":341,"props":375,"children":376},{"style":354},[377],{"type":64,"value":378},")\"\n",{"type":59,"tag":341,"props":380,"children":382},{"class":343,"line":381},2,[383,389,394,398,403,408],{"type":59,"tag":341,"props":384,"children":386},{"style":385},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[387],{"type":64,"value":388},"export",{"type":59,"tag":341,"props":390,"children":391},{"style":348},[392],{"type":64,"value":393}," AGENT_BROWSER_SESSION",{"type":59,"tag":341,"props":395,"children":396},{"style":354},[397],{"type":64,"value":357},{"type":59,"tag":341,"props":399,"children":400},{"style":354},[401],{"type":64,"value":402},"\"",{"type":59,"tag":341,"props":404,"children":405},{"style":348},[406],{"type":64,"value":407},"$SESSION",{"type":59,"tag":341,"props":409,"children":410},{"style":354},[411],{"type":64,"value":412},"\"\n",{"type":59,"tag":341,"props":414,"children":416},{"class":343,"line":415},3,[417,421,426,430,434,438],{"type":59,"tag":341,"props":418,"children":419},{"style":385},[420],{"type":64,"value":388},{"type":59,"tag":341,"props":422,"children":423},{"style":348},[424],{"type":64,"value":425}," AGENT_BROWSER_RESTORE",{"type":59,"tag":341,"props":427,"children":428},{"style":354},[429],{"type":64,"value":357},{"type":59,"tag":341,"props":431,"children":432},{"style":354},[433],{"type":64,"value":402},{"type":59,"tag":341,"props":435,"children":436},{"style":348},[437],{"type":64,"value":407},{"type":59,"tag":341,"props":439,"children":440},{"style":354},[441],{"type":64,"value":412},{"type":59,"tag":443,"props":444,"children":445},"br",{},[],{"type":64,"value":447},"Then open the target URL:",{"type":59,"tag":330,"props":449,"children":451},{"className":332,"code":450,"language":334,"meta":335,"style":335},"agent-browser --session \"$SESSION\" --restore --headed --enable react-devtools open \u003Curl>\n",[452],{"type":59,"tag":72,"props":453,"children":454},{"__ignoreMap":335},[455],{"type":59,"tag":341,"props":456,"children":457},{"class":343,"line":344},[458,462,467,472,476,480,485,490,495,500,505,510,515,520],{"type":59,"tag":341,"props":459,"children":460},{"style":365},[461],{"type":64,"value":124},{"type":59,"tag":341,"props":463,"children":464},{"style":370},[465],{"type":64,"value":466}," --session",{"type":59,"tag":341,"props":468,"children":469},{"style":354},[470],{"type":64,"value":471}," \"",{"type":59,"tag":341,"props":473,"children":474},{"style":348},[475],{"type":64,"value":407},{"type":59,"tag":341,"props":477,"children":478},{"style":354},[479],{"type":64,"value":402},{"type":59,"tag":341,"props":481,"children":482},{"style":370},[483],{"type":64,"value":484}," --restore",{"type":59,"tag":341,"props":486,"children":487},{"style":370},[488],{"type":64,"value":489}," --headed",{"type":59,"tag":341,"props":491,"children":492},{"style":370},[493],{"type":64,"value":494}," --enable",{"type":59,"tag":341,"props":496,"children":497},{"style":370},[498],{"type":64,"value":499}," react-devtools",{"type":59,"tag":341,"props":501,"children":502},{"style":370},[503],{"type":64,"value":504}," open",{"type":59,"tag":341,"props":506,"children":507},{"style":354},[508],{"type":64,"value":509}," \u003C",{"type":59,"tag":341,"props":511,"children":512},{"style":370},[513],{"type":64,"value":514},"ur",{"type":59,"tag":341,"props":516,"children":517},{"style":348},[518],{"type":64,"value":519},"l",{"type":59,"tag":341,"props":521,"children":522},{"style":354},[523],{"type":64,"value":524},">\n",{"type":59,"tag":443,"props":526,"children":527},{},[],{"type":59,"tag":72,"props":529,"children":531},{"className":530},[],[532],{"type":64,"value":533},"--scope worktree",{"type":64,"value":535}," keeps parallel worktrees and copied checkouts\nfrom colliding. Bare ",{"type":59,"tag":72,"props":537,"children":539},{"className":538},[],[540],{"type":64,"value":213},{"type":64,"value":542}," uses the session id as the\npersistence key, loads saved cookies\u002FlocalStorage before navigation\nwhen present, and auto-saves state on close. Always pass the desired\nlaunch flags on ",{"type":59,"tag":72,"props":544,"children":546},{"className":545},[],[547],{"type":64,"value":548},"open",{"type":64,"value":550},"; agent-browser will reuse, relaunch, or restart\nits scoped background state as needed.",{"type":59,"tag":443,"props":552,"children":553},{},[],{"type":64,"value":555},"The browser is the user's. If state was not restored (first run,\nexpired session) and the page is gated, the user drives the login —\npause until they confirm. After login, continue using the same session\nand restore context; ",{"type":59,"tag":72,"props":557,"children":559},{"className":558},[],[560],{"type":64,"value":561},"agent-browser close",{"type":64,"value":563}," saves the cookie state so\nthe next ",{"type":59,"tag":72,"props":565,"children":567},{"className":566},[],[568],{"type":64,"value":548},{"type":64,"value":570}," restores it.",{"type":59,"tag":90,"props":572,"children":573},{},[574,576,581,583,588,590,595,597],{"type":64,"value":575},"Probe ",{"type":59,"tag":72,"props":577,"children":579},{"className":578},[],[580],{"type":64,"value":102},{"type":64,"value":582}," (",{"type":59,"tag":72,"props":584,"children":586},{"className":585},[],[587],{"type":64,"value":110},{"type":64,"value":589},") — confirm it's reachable and\nlists ",{"type":59,"tag":72,"props":591,"children":593},{"className":592},[],[594],{"type":64,"value":180},{"type":64,"value":596},":",{"type":59,"tag":86,"props":598,"children":599},{},[600,620],{"type":59,"tag":90,"props":601,"children":602},{},[603,605,610,612,618],{"type":64,"value":604},"Unreachable → either ",{"type":59,"tag":72,"props":606,"children":608},{"className":607},[],[609],{"type":64,"value":77},{"type":64,"value":611}," isn't running, or Next.js is\nbelow 16.3. Check ",{"type":59,"tag":72,"props":613,"children":615},{"className":614},[],[616],{"type":64,"value":617},"package.json",{"type":64,"value":619}," to disambiguate, then refuse.",{"type":59,"tag":90,"props":621,"children":622},{},[623,628],{"type":59,"tag":72,"props":624,"children":626},{"className":625},[],[627],{"type":64,"value":180},{"type":64,"value":629}," not in the list → Next.js below 16.3.\nRefuse and tell the user to upgrade.",{"type":59,"tag":90,"props":631,"children":632},{},[633,638,640,646],{"type":59,"tag":72,"props":634,"children":636},{"className":635},[],[637],{"type":64,"value":180},{"type":64,"value":639}," doubles as a Turbopack probe. An error\nresponse of ",{"type":59,"tag":72,"props":641,"children":643},{"className":642},[],[644],{"type":64,"value":645},"\"Turbopack project is not available...\"",{"type":64,"value":647}," means the\nuser is on webpack. Refuse — Turbopack is required.",{"type":59,"tag":90,"props":649,"children":650},{},[651,657],{"type":59,"tag":72,"props":652,"children":654},{"className":653},[],[655],{"type":64,"value":656},"get_routes",{"type":64,"value":658}," → your route map for the rest of the session.",{"type":59,"tag":141,"props":660,"children":662},{"id":661},"loop",[663],{"type":64,"value":661},{"type":59,"tag":665,"props":666,"children":668},"h3",{"id":667},"before-the-edit-narrow-the-scope",[669],{"type":64,"value":670},"before the edit — narrow the scope",{"type":59,"tag":66,"props":672,"children":673},{},[674,676,681],{"type":64,"value":675},"Ask the running app, not the codebase. ",{"type":59,"tag":72,"props":677,"children":679},{"className":678},[],[680],{"type":64,"value":102},{"type":64,"value":682}," knows which\nfiles rendered the current route; use those as your search scope.\nRuntime introspection stays cheap as the codebase grows; agentic\nsearch doesn't.",{"type":59,"tag":665,"props":684,"children":686},{"id":685},"after-the-edit-verify",[687],{"type":64,"value":688},"after the edit — verify",{"type":59,"tag":66,"props":690,"children":691},{},[692],{"type":64,"value":693},"Four failure modes. Check each:",{"type":59,"tag":86,"props":695,"children":696},{},[697,712,728,744],{"type":59,"tag":90,"props":698,"children":699},{},[700,705,706,711],{"type":59,"tag":94,"props":701,"children":702},{},[703],{"type":64,"value":704},"Compiles",{"type":64,"value":167},{"type":59,"tag":72,"props":707,"children":709},{"className":708},[],[710],{"type":64,"value":180},{"type":64,"value":182},{"type":59,"tag":90,"props":713,"children":714},{},[715,720,721,726],{"type":59,"tag":94,"props":716,"children":717},{},[718],{"type":64,"value":719},"Runs without errors",{"type":64,"value":167},{"type":59,"tag":72,"props":722,"children":724},{"className":723},[],[725],{"type":64,"value":102},{"type":64,"value":727}," (server and bubbled-up\nbrowser errors both surface here).",{"type":59,"tag":90,"props":729,"children":730},{},[731,736,737,742],{"type":59,"tag":94,"props":732,"children":733},{},[734],{"type":64,"value":735},"Behaves as intended",{"type":64,"value":167},{"type":59,"tag":72,"props":738,"children":740},{"className":739},[],[741],{"type":64,"value":124},{"type":64,"value":743}," drives the page; assert\nwhat the user actually sees.",{"type":59,"tag":90,"props":745,"children":746},{},[747,752,753,758],{"type":59,"tag":94,"props":748,"children":749},{},[750],{"type":64,"value":751},"React-level behavior",{"type":64,"value":167},{"type":59,"tag":72,"props":754,"children":756},{"className":755},[],[757],{"type":64,"value":124},{"type":64,"value":759}," with react-devtools\nenabled exposes the component tree, props, state, and render\ncounts. Anchor framework-level checks here (extra renders,\nserver\u002Fclient boundary shifts, suspense fallbacks) — DOM asserts\nalone miss them.",{"type":59,"tag":66,"props":761,"children":762},{},[763,765,770],{"type":64,"value":764},"Pick the specific tool from ",{"type":59,"tag":72,"props":766,"children":768},{"className":767},[],[769],{"type":64,"value":110},{"type":64,"value":771}," or the agent-browser\nmanual rather than from memory.",{"type":59,"tag":141,"props":773,"children":775},{"id":774},"gotchas",[776],{"type":64,"value":774},{"type":59,"tag":86,"props":778,"children":779},{},[780,821,845,866,916,921,963,982],{"type":59,"tag":90,"props":781,"children":782},{},[783,795,797,803,805,811,813,819],{"type":59,"tag":94,"props":784,"children":785},{},[786,788,793],{"type":64,"value":787},"Every ",{"type":59,"tag":72,"props":789,"children":791},{"className":790},[],[792],{"type":64,"value":124},{"type":64,"value":794}," command must know your session and restore\nkey, or it may use an empty default browser or fail to save login\nstate.",{"type":64,"value":796}," Easiest: export both ",{"type":59,"tag":72,"props":798,"children":800},{"className":799},[],[801],{"type":64,"value":802},"AGENT_BROWSER_SESSION=\"$SESSION\"",{"type":64,"value":804}," and\n",{"type":59,"tag":72,"props":806,"children":808},{"className":807},[],[809],{"type":64,"value":810},"AGENT_BROWSER_RESTORE=\"$SESSION\"",{"type":64,"value":812}," at the top of each shell you run\nagent-browser in. If you do not export them, pass\n",{"type":59,"tag":72,"props":814,"children":816},{"className":815},[],[817],{"type":64,"value":818},"--session \"$SESSION\" --restore",{"type":64,"value":820}," on every command.",{"type":59,"tag":90,"props":822,"children":823},{},[824,829,831,836,838,843],{"type":59,"tag":94,"props":825,"children":826},{},[827],{"type":64,"value":828},"When the two views disagree, suspect the tooling first.",{"type":64,"value":830}," If\n",{"type":59,"tag":72,"props":832,"children":834},{"className":833},[],[835],{"type":64,"value":124},{"type":64,"value":837}," says a route is broken but ",{"type":59,"tag":72,"props":839,"children":841},{"className":840},[],[842],{"type":64,"value":102},{"type":64,"value":844}," and the\nserver say it rendered cleanly, a stale or misdirected browser\nsession is the likelier cause than a real bug — reconcile the views\nbefore debugging the app.",{"type":59,"tag":90,"props":846,"children":847},{},[848,850,856,858,864],{"type":64,"value":849},"Confirming a click or navigation: the page settles a beat later, so\nwait with ",{"type":59,"tag":72,"props":851,"children":853},{"className":852},[],[854],{"type":64,"value":855},"wait --load networkidle",{"type":64,"value":857}," (no path to get wrong), then\nsnapshot\u002Fread to confirm the page. Avoid ",{"type":59,"tag":72,"props":859,"children":861},{"className":860},[],[862],{"type":64,"value":863},"wait --url",{"type":64,"value":865}," unless you pass\nthe link's exact href — a guessed or placeholder path won't match the\nreal URL and times out after 25s.",{"type":59,"tag":90,"props":867,"children":868},{},[869,871,877,879,884,886,891,893,898,900,906,908,914],{"type":64,"value":870},"A blank read, empty snapshot, ",{"type":59,"tag":72,"props":872,"children":874},{"className":873},[],[875],{"type":64,"value":876},"about:blank",{"type":64,"value":878},", or a \"no browser\nsession\" error — right after ",{"type":59,"tag":72,"props":880,"children":882},{"className":881},[],[883],{"type":64,"value":548},{"type":64,"value":885}," or after a click (even if ",{"type":59,"tag":72,"props":887,"children":889},{"className":888},[],[890],{"type":64,"value":548},{"type":64,"value":892},"\nreported the page) — is the browser dropping the page (a stale\nsession), not a broken route. Reopen your session at the URL with\n",{"type":59,"tag":72,"props":894,"children":896},{"className":895},[],[897],{"type":64,"value":818},{"type":64,"value":899}," and re-snapshot; if still blank,\nrun ",{"type":59,"tag":72,"props":901,"children":903},{"className":902},[],[904],{"type":64,"value":905},"agent-browser --session \"$SESSION\" --restore close",{"type":64,"value":907},", then open\nagain. Don't fall back to ",{"type":59,"tag":72,"props":909,"children":911},{"className":910},[],[912],{"type":64,"value":913},"curl",{"type":64,"value":915},"; it bypasses the browser you're\ntesting.",{"type":59,"tag":90,"props":917,"children":918},{},[919],{"type":64,"value":920},"React introspection output is stale after navigation. Re-run.",{"type":59,"tag":90,"props":922,"children":923},{},[924,929,931,937,939,945,947,953,955,961],{"type":59,"tag":72,"props":925,"children":927},{"className":926},[],[928],{"type":64,"value":102},{"type":64,"value":930}," replies are SSE — read the JSON off the ",{"type":59,"tag":72,"props":932,"children":934},{"className":933},[],[935],{"type":64,"value":936},"data:",{"type":64,"value":938}," line\nwith ",{"type":59,"tag":72,"props":940,"children":942},{"className":941},[],[943],{"type":64,"value":944},"sed -n 's\u002F^data: \u002F\u002Fp'",{"type":64,"value":946}," (a plain ",{"type":59,"tag":72,"props":948,"children":950},{"className":949},[],[951],{"type":64,"value":952},"sed 's\u002F^data: \u002F\u002F'",{"type":64,"value":954}," leaves the\n",{"type":59,"tag":72,"props":956,"children":958},{"className":957},[],[959],{"type":64,"value":960},"event:",{"type":64,"value":962}," line and the parse fails).",{"type":59,"tag":90,"props":964,"children":965},{},[966,968,973,975,981],{"type":64,"value":967},"Non-3000 dev server: read the ",{"type":59,"tag":72,"props":969,"children":971},{"className":970},[],[972],{"type":64,"value":77},{"type":64,"value":974}," banner; set\n",{"type":59,"tag":72,"props":976,"children":978},{"className":977},[],[979],{"type":64,"value":980},"NEXT_MCP_URL=http:\u002F\u002Flocalhost:\u003Cport>\u002F_next\u002Fmcp",{"type":64,"value":182},{"type":59,"tag":90,"props":983,"children":984},{},[985,991,993,999],{"type":59,"tag":72,"props":986,"children":988},{"className":987},[],[989],{"type":64,"value":990},"get_errors",{"type":64,"value":992}," and ",{"type":59,"tag":72,"props":994,"children":996},{"className":995},[],[997],{"type":64,"value":998},"get_page_metadata",{"type":64,"value":1000}," need at least one navigation\nto populate.",{"type":59,"tag":141,"props":1002,"children":1004},{"id":1003},"reference",[1005],{"type":64,"value":1003},{"type":59,"tag":66,"props":1007,"children":1008},{},[1009,1011,1016],{"type":64,"value":1010},"All tools below are present once preflight passes. If ",{"type":59,"tag":72,"props":1012,"children":1014},{"className":1013},[],[1015],{"type":64,"value":110},{"type":64,"value":1017},"\nis missing any of them, preflight should have refused — re-check.",{"type":59,"tag":330,"props":1019,"children":1023},{"className":1020,"code":1022,"language":64},[1021],"language-text","# \u002F_next\u002Fmcp                 notes\nget_project_metadata         projectPath, devServerUrl, bundler\nget_routes                   fs-scan; no browser session needed\nget_errors                   runtime + build; needs a browser session;\n                             includes browser-side errors caught by the\n                             dev server\nget_page_metadata            segment trie + routerType; needs a browser\n                             session; use as a discovery shortcut for\n                             which files power a route\nget_logs                     returns logFilePath\nget_server_action_by_id      hashed id → file + functionName\nget_compilation_issues       Turbopack only; errors on webpack\n                             (\"Turbopack project is not available\")\n",[1024],{"type":59,"tag":72,"props":1025,"children":1026},{"__ignoreMap":335},[1027],{"type":64,"value":1022},{"type":59,"tag":141,"props":1029,"children":1031},{"id":1030},"teardown",[1032],{"type":64,"value":1030},{"type":59,"tag":66,"props":1034,"children":1035},{},[1036,1038,1043,1045,1051,1053,1058,1060,1065],{"type":64,"value":1037},"Close the session with the same session and restore context:\n",{"type":59,"tag":72,"props":1039,"children":1041},{"className":1040},[],[1042],{"type":64,"value":905},{"type":64,"value":1044},". ",{"type":59,"tag":72,"props":1046,"children":1048},{"className":1047},[],[1049],{"type":64,"value":1050},"close",{"type":64,"value":1052}," saves\nthat session's cookies and storage so the next loop's ",{"type":59,"tag":72,"props":1054,"children":1056},{"className":1055},[],[1057],{"type":64,"value":213},{"type":64,"value":1059}," open\nkeeps the user logged in. Leave ",{"type":59,"tag":72,"props":1061,"children":1063},{"className":1062},[],[1064],{"type":64,"value":77},{"type":64,"value":1066}," up for the next loop.",{"type":59,"tag":1068,"props":1069,"children":1070},"hr",{},[],{"type":59,"tag":66,"props":1072,"children":1073},{},[1074,1080,1082,1088,1090,1096],{"type":59,"tag":72,"props":1075,"children":1077},{"className":1076},[],[1078],{"type":64,"value":1079},"next-dev-loop-\u003Ctopic>",{"type":64,"value":1081}," siblings (e.g. ",{"type":59,"tag":72,"props":1083,"children":1085},{"className":1084},[],[1086],{"type":64,"value":1087},"next-dev-loop-rsc",{"type":64,"value":1089},", ",{"type":59,"tag":72,"props":1091,"children":1093},{"className":1092},[],[1094],{"type":64,"value":1095},"next-dev-loop-debug",{"type":64,"value":1097},")\nassume this preflight already ran; they pick up at the loop.",{"type":59,"tag":1099,"props":1100,"children":1101},"style",{},[1102],{"type":64,"value":1103},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1105,"total":1268},[1106,1122,1136,1145,1156,1171,1187,1205,1217,1236,1248,1258],{"slug":1107,"name":1107,"fn":1108,"description":1109,"org":1110,"tags":1111,"stars":29,"repoUrl":30,"updatedAt":1121},"next-cache-components-adoption","enable and migrate to Next.js Cache Components","Turn on Cache Components in a Next.js app and resolve the blocking routes it surfaces. Use when the user wants to enable, adopt, or migrate to Cache Components, flip the `cacheComponents` flag, work through a flood of blocking-prerender \u002F instant validation errors, run the `cache-components-instant-false` codemod, or decide between opting routes out with `export const instant = false` and fixing them in place.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1112,1115,1116,1119,1120],{"name":1113,"slug":1114,"type":13},"Caching","caching",{"name":24,"slug":25,"type":13},{"name":1117,"slug":1118,"type":13},"Migration","migration",{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},"2026-07-24T05:38:30.118542",{"slug":1123,"name":1123,"fn":1124,"description":1125,"org":1126,"tags":1127,"stars":29,"repoUrl":30,"updatedAt":1135},"next-cache-components-optimizer","optimize Next.js cache components","Drive a Next.js route to instant navigation by setting up an agentic loop, under Cache Components \u002F PPR, on initial load (hard navigation) and client-side navigation (soft navigation). Encode the goal as a failing @next\u002Fplaywright instant() e2e and work it to green, one verified route at a time; the shipped test then guards against regression. Use when asked to make a route's navigation instant (its static shell commits immediately), fix a route whose static shell isn't prerendered\u002Fserved\u002Fprefetched, grow a route's static shell or fix its slow first paint, diagnose which Suspense boundary keeps a route out of its static shell, or write the instant() e2e guard for one. Requires Next.js 16.3+ with cacheComponents; directs an upgrade if older.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1128,1129,1130,1131,1134],{"name":1113,"slug":1114,"type":13},{"name":24,"slug":25,"type":13},{"name":15,"slug":16,"type":13},{"name":1132,"slug":1133,"type":13},"Performance","performance",{"name":9,"slug":8,"type":13},"2026-07-30T05:31:10.674078",{"slug":4,"name":4,"fn":5,"description":6,"org":1137,"tags":1138,"stars":29,"repoUrl":30,"updatedAt":31},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1139,1140,1141,1142,1143,1144],{"name":27,"slug":28,"type":13},{"name":24,"slug":25,"type":13},{"name":18,"slug":19,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":21,"slug":22,"type":13},{"slug":1146,"name":1146,"fn":1147,"description":1148,"org":1149,"tags":1150,"stars":29,"repoUrl":30,"updatedAt":1155},"next-partial-prefetching-adoption","adopt Partial Prefetching in Next.js apps","Turn on Partial Prefetching in a Next.js app and work through the insights it surfaces. Use when the user wants to enable or adopt Partial Prefetching, flip the `partialPrefetching` flag, opt routes in with `export const prefetch = 'partial'`, audit `\u003CLink prefetch={true}>` calls, or resolve the link-prefetch-partial and instant-shell-url-data insights.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1151,1152,1153,1154],{"name":24,"slug":25,"type":13},{"name":15,"slug":16,"type":13},{"name":1132,"slug":1133,"type":13},{"name":9,"slug":8,"type":13},"2026-07-30T05:31:11.591864",{"slug":1157,"name":1157,"fn":1158,"description":1159,"org":1160,"tags":1161,"stars":1168,"repoUrl":1169,"updatedAt":1170},"turborepo","manage monorepos with Turborepo","Turborepo monorepo build system guidance. Triggers on: turbo.json, task pipelines,\ndependsOn, caching, remote cache, the \"turbo\" CLI, --filter, --affected, CI optimization, environment\nvariables, internal packages, monorepo structure\u002Fbest practices, and boundaries.\n\nUse when user: configures tasks\u002Fworkflows\u002Fpipelines, creates packages, sets up\nmonorepo, shares code between apps, runs changed\u002Faffected packages, debugs cache,\nor has apps\u002Fpackages directories.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1162,1165,1166],{"name":1163,"slug":1164,"type":13},"CI\u002FCD","ci-cd",{"name":1132,"slug":1133,"type":13},{"name":1167,"slug":1157,"type":13},"Turborepo",30809,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fturborepo","2026-07-30T05:32:14.920116",{"slug":1172,"name":1172,"fn":1173,"description":1174,"org":1175,"tags":1176,"stars":1184,"repoUrl":1185,"updatedAt":1186},"add-function-examples","add AI function examples for testing","Guide for adding new AI function examples, for testing specific features against the actual provider APIs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1177,1180,1183],{"name":1178,"slug":1179,"type":13},"AI SDK","ai-sdk",{"name":1181,"slug":1182,"type":13},"Testing","testing",{"name":9,"slug":8,"type":13},25670,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fai","2026-04-06T18:55:51.318866",{"slug":1188,"name":1188,"fn":1189,"description":1190,"org":1191,"tags":1192,"stars":1184,"repoUrl":1185,"updatedAt":1204},"add-harness-package","add AI SDK harness packages","Guide for adding new AI SDK harness packages. Use when creating a new @ai-sdk\u002Fharness-\u003Cname> package that adapts a coding-agent runtime to HarnessV1.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1193,1196,1197,1200,1203],{"name":1194,"slug":1195,"type":13},"Agents","agents",{"name":1178,"slug":1179,"type":13},{"name":1198,"slug":1199,"type":13},"Harness","harness",{"name":1201,"slug":1202,"type":13},"SDK","sdk",{"name":9,"slug":8,"type":13},"2026-06-18T08:29:19.858737",{"slug":1206,"name":1206,"fn":1207,"description":1208,"org":1209,"tags":1210,"stars":1184,"repoUrl":1185,"updatedAt":1216},"add-provider-package","add new provider packages to AI SDK","Guide for adding new AI provider packages to the AI SDK. Use when creating a new @ai-sdk\u002F\u003Cprovider> package to integrate an AI service into the SDK.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1211,1212,1215],{"name":1178,"slug":1179,"type":13},{"name":1213,"slug":1214,"type":13},"API Development","api-development",{"name":9,"slug":8,"type":13},"2026-04-06T18:55:47.45549",{"slug":1218,"name":1218,"fn":1219,"description":1220,"org":1221,"tags":1222,"stars":1184,"repoUrl":1185,"updatedAt":1235},"adr-skill","create and maintain architecture decision records","Create and maintain Architecture Decision Records (ADRs) optimized for agentic coding workflows. Use when you need to propose, write, update, accept\u002Freject, deprecate, or supersede an ADR; bootstrap an adr folder and index; consult existing ADRs before implementing changes; or enforce ADR conventions. This skill uses Socratic questioning to capture intent before drafting, and validates output against an agent-readiness checklist.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1223,1226,1229,1232],{"name":1224,"slug":1225,"type":13},"ADR","adr",{"name":1227,"slug":1228,"type":13},"Architecture","architecture",{"name":1230,"slug":1231,"type":13},"Documentation","documentation",{"name":1233,"slug":1234,"type":13},"Engineering","engineering","2026-04-06T18:55:50.043694",{"slug":1179,"name":1179,"fn":1237,"description":1238,"org":1239,"tags":1240,"stars":1184,"repoUrl":1185,"updatedAt":1247},"build AI features with Vercel AI SDK","Answer questions about the AI SDK and help build AI-powered features. Use when developers: (1) Ask about AI SDK functions like generateText, streamText, ToolLoopAgent, embed, or tools, (2) Want to build AI agents, chatbots, RAG systems, or text generation features, (3) Have questions about AI providers (OpenAI, Anthropic, Google, etc.), streaming, tool calling, structured output, or embeddings, (4) Use React hooks like useChat or useCompletion. Triggers on: \"AI SDK\", \"Vercel AI SDK\", \"generateText\", \"streamText\", \"add AI to my app\", \"build an agent\", \"tool calling\", \"structured output\", \"useChat\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1241,1242,1243,1246],{"name":1194,"slug":1195,"type":13},{"name":1178,"slug":1179,"type":13},{"name":1244,"slug":1245,"type":13},"LLM","llm",{"name":9,"slug":8,"type":13},"2026-04-06T18:55:48.739463",{"slug":1249,"name":1249,"fn":1250,"description":1251,"org":1252,"tags":1253,"stars":1184,"repoUrl":1185,"updatedAt":1257},"capture-api-response-test-fixture","capture API response test fixtures","Capture API response test fixture.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1254,1255,1256],{"name":1213,"slug":1214,"type":13},{"name":1181,"slug":1182,"type":13},{"name":9,"slug":8,"type":13},"2026-04-06T18:55:56.374433",{"slug":1259,"name":1259,"fn":1260,"description":1261,"org":1262,"tags":1263,"stars":1184,"repoUrl":1185,"updatedAt":1267},"develop-ai-functions-example","develop AI SDK function examples","Develop examples for AI SDK functions. Use when creating, running, or modifying examples under examples\u002Fai-functions\u002Fsrc to validate provider support, demonstrate features, or create test fixtures.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1264,1265,1266],{"name":1178,"slug":1179,"type":13},{"name":1181,"slug":1182,"type":13},{"name":9,"slug":8,"type":13},"2026-04-06T18:55:55.088956",68,{"items":1270,"total":1303},[1271,1279,1287,1296],{"slug":1107,"name":1107,"fn":1108,"description":1109,"org":1272,"tags":1273,"stars":29,"repoUrl":30,"updatedAt":1121},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1274,1275,1276,1277,1278],{"name":1113,"slug":1114,"type":13},{"name":24,"slug":25,"type":13},{"name":1117,"slug":1118,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"slug":1123,"name":1123,"fn":1124,"description":1125,"org":1280,"tags":1281,"stars":29,"repoUrl":30,"updatedAt":1135},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1282,1283,1284,1285,1286],{"name":1113,"slug":1114,"type":13},{"name":24,"slug":25,"type":13},{"name":15,"slug":16,"type":13},{"name":1132,"slug":1133,"type":13},{"name":9,"slug":8,"type":13},{"slug":4,"name":4,"fn":5,"description":6,"org":1288,"tags":1289,"stars":29,"repoUrl":30,"updatedAt":31},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1290,1291,1292,1293,1294,1295],{"name":27,"slug":28,"type":13},{"name":24,"slug":25,"type":13},{"name":18,"slug":19,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":21,"slug":22,"type":13},{"slug":1146,"name":1146,"fn":1147,"description":1148,"org":1297,"tags":1298,"stars":29,"repoUrl":30,"updatedAt":1155},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1299,1300,1301,1302],{"name":24,"slug":25,"type":13},{"name":15,"slug":16,"type":13},{"name":1132,"slug":1133,"type":13},{"name":9,"slug":8,"type":13},4]