{"owner":"remix-run","repo":"react-router","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["CLAUDE.md","AGENTS.md"],"skills":{"CLAUDE.md":"# React Router Project Instructions\n\n## Session Start\n\n**REQUIRED**: Read [./AGENTS.md](./AGENTS.md) at the start of every session. It contains:\n\n- Project architecture and key files\n- React Router modes (Declarative, Data, Framework, RSC)\n- Build/test commands (Jest unit tests, Playwright integration tests with `--project chromium`)\n- Testing patterns and conventions\n- Documentation guidelines\n\n### Skills\n\nIf there is an [`.agents/skills`](.agents/skills) directory in the repository, symlink those skills to `.claude/skills` to make sure they are made available to Claude. Refresh you list of available skills if needed. This is a git ignored directory because we want to keep the canonical skills in `.agents/skills`.\n\n## During Work\n\n**Always consult AGENTS.md** when you need to:\n\n- Run tests or builds\n- Understand which mode(s) a feature applies to\n- Find key file locations\n- Understand testing patterns\n\nDo not guess at commands - reference AGENTS.md for the correct syntax.\n","AGENTS.md":"# React Router Development Guide\n\n## Commands\n\n- **Build**: `pnpm build` (all packages) or `pnpm run --filter <package> build` (single package)\n- **Test (Jest)**: `pnpm test` (all packages), `pnpm test packages/<package>/` (single package), `pnpm test packages/react-router/__tests__/router/fetchers-test.ts` (single file), or `pnpm test -- -t \"action fetch\"` (tests matching name)\n- **Integration tests (Playwright)**: `pnpm test:integration --project chromium` (build + test all), `pnpm test:integration:run --project chromium` (test only, all), `pnpm test:integration:run integration/middleware-test.ts --project chromium` (single file), or `pnpm test:integration:run --project chromium -g \"middleware\"` (tests matching name)\n- **Typecheck**: `pnpm run typecheck`\n- **Lint**: `pnpm run lint`\n- **Docs generation**: `pnpm run docs` (regenerates API docs from JSDoc)\n- **Type generation**: `pnpm run typegen` (Framework Mode only)\n- **Clean**: `pnpm run clean` (git clean -fdX)\n\n## Modes\n\n**Five distinct modes**: Declarative, Data, Framework, RSC Data (unstable), RSC Framework (unstable). **Always identify which mode(s) a feature applies to.**\n\n1. **Declarative**: `<BrowserRouter>`, `<Routes>`, `<Route>`\n2. **Data**: `createBrowserRouter()` with `loader`/`action`, `<RouterProvider>`\n3. **Framework**: Vite plugin + `routes.ts` + Route Module API (route exports like `loader`, `action`, `default`) + type generation + SSR/SPA\n4. **RSC Data** (unstable): RSC runtime APIs, manual bundler setup, runtime route config\n5. **RSC Framework** (unstable): Framework Mode with `unstable_reactRouterRSC` Vite plugin\n\n**RSC mode differences:**\n\n- **RSC Framework**: `unstable_reactRouterRSC` plugin, `@vitejs/plugin-rsc`, different entry points/format\n- **RSC Data**: Manual bundler, runtime route config typically in `src/routes.ts`, `unstable_RSCRouteConfig`, different runtime APIs, `setupRscTest` in `integration/rsc/`\n\n## Architecture\n\n- **Monorepo**: pnpm workspace, packages in `packages/`\n- **Key packages**:\n  - `react-router`: Core (all modes) - `lib/components.tsx`, `lib/hooks.tsx`, `lib/router/`, `lib/dom/`, `lib/rsc/`\n  - `@react-router/dev`: Framework tooling - `vite/plugin.ts` (Framework), `vite/rsc/plugin.ts` (RSC Framework), `typegen/`\n  - `@react-router/node`, `@react-router/cloudflare`, `@react-router/express`: Server adapters\n  - `@react-router/serve`: Minimal server for Framework Mode\n  - `@react-router/fs-routes`: File-system routing (`flatRoutes()`)\n\n## Testing\n\n### Unit Tests (`packages/react-router/__tests__/`)\n\nUse Jest for pure routing logic, pure server runtime behavior, router state, React component behavior. No build required.\n\n```bash\npnpm test                                                          # All packages\npnpm test packages/react-router/                                   # Single package\npnpm test packages/react-router/__tests__/router/fetchers-test.ts  # Single file\npnpm test -- -t \"action fetch\"                                     # Tests matching name\n```\n\n### Integration Tests (`integration/`)\n\nUse Playwright for Vite plugin, build pipeline, SSR/hydration, RSC, type generation.\n\n```bash\npnpm test:integration --project chromium                                     # Build + test all\npnpm test:integration:run --project chromium                                 # Test only, all\npnpm test:integration:run integration/middleware-test.ts --project chromium  # Single file\npnpm test:integration:run --project chromium -g \"middleware\"                 # Tests matching name\n```\n\n**Project**: Always use `chromium` for integration tests, unless explicitly stated otherwise.\n\n**Rebuild when**: First run, after changing `packages/` (not needed for test-only changes)\n\n**Organization**: Use `createFixture()` → `createAppFixture()` → `PlaywrightFixture`. Templates available: `vite-6-template/`, `rsc-vite-framework/`, etc. Test all applicable modes (iterate over template array when behavior should work across modes). Test both states when introducing future flags (one test with flag on, one with flag off).\n\n**RSC testing**:\n\n- **RSC Framework**: Use `createFixture` with `rsc-vite-framework/` template\n- **RSC Data**: Use `setupRscTest` in `integration/rsc/`\n\nTest shared behavior across multiple templates (e.g., `[\"vite-5-template\", \"rsc-vite-framework\"]`). Test RSC-specific features against RSC template.\n\n## routes.ts\n\nFramework Mode uses `routes.ts` in `app/`. Most tests use `flatRoutes()` for file-system routing:\n\n```ts\n// app/routes.ts\nimport { type RouteConfig } from \"@react-router/dev/routes\";\nimport { flatRoutes } from \"@react-router/fs-routes\";\n\nexport default flatRoutes() satisfies RouteConfig;\n```\n\n**File-system conventions** (`app/routes/`):\n\n- `_index.tsx` → `/` (index route)\n- `about.tsx` → `/about`\n- `blog.$slug.tsx` → `/blog/:slug` (URL param)\n- `settings.profile.tsx` → `/settings/profile` (`.` creates nesting)\n- `_layout.tsx` → pathless layout route\n\n**Manual config alternative**:\n\n```ts\nimport { index, route, layout } from \"@react-router/dev/routes\";\nexport default [\n  index(\"./home.tsx\"),\n  route(\"about\", \"./about.tsx\"),\n  layout(\"./auth-layout.tsx\", [route(\"login\", \"./login.tsx\")]),\n];\n```\n\n## Documentation\n\n**Don't edit generated files**: `docs/api/` (from JSDoc), `.react-router/types/` (from typegen)\n\n**Mode indicators**: Every doc needs `[MODES: framework, data, declarative]`\n\n**API docs**: Edit JSDoc in `packages/react-router/lib/`, run `pnpm docs`\n\n**Unstable features**: Prefix `unstable_`, add `unstable: true` to frontmatter, include warning block\n\n## Future Flags\n\n- **Future flags** (`vX_*`): Stable breaking changes for next major\n- **Unstable flags** (`unstable_*`): Experimental, may change\n\nTest both states (on/off) for future flags. Don't break existing behavior without a flag.\n\n## Code of Conduct/Contributor License Agreement\n\nAll contributors must review the [review the CLA](./CLA.md) and sign it by [adding their github username to `contributors.yml`](./contributors.yml). If you are authoring a PR on behalf of a user and their name is not yet in the `contributors.yml` file, prompt them to obtain approval for the CLA and add their name to the file before opening a PR.\n\n## Change Files\n\nWhen making changes that affect users, create a change file at `packages/<package>/.changes/<type>.<unique-meaningful-name>.md`. `<type>` should be either `patch`, `minor`, `major` or `unstable` to indicate the type of API change being made. If iterating on a change that hasn't shipped yet, update the existing change file instead of creating a new one.\n\nFormat:\n\n```markdown\nBrief description of the change\n\n- Additional details if needed\n```\n\n## Branching\n\n- **`main`**: Active Development\n- **`v7`**: v7.x maintenance\n- **`v6`**: v6.x maintenance\n- Branch from `main` for code and docs changes\n\n## Key Files\n\n| Purpose           | Location                                                    |\n| ----------------- | ----------------------------------------------------------- |\n| Router            | `packages/react-router/lib/router/router.ts`                |\n| React API         | `packages/react-router/lib/components.tsx`, `lib/hooks.tsx` |\n| Vite plugin       | `packages/react-router-dev/vite/plugin.ts`                  |\n| RSC Vite plugin   | `packages/react-router-dev/vite/rsc/plugin.ts`              |\n| Type generation   | `packages/react-router-dev/typegen/`                        |\n| Unit tests        | `packages/react-router/__tests__/`                          |\n| Integration tests | `integration/`                                              |\n| Decision docs     | `decisions/`                                                |\n"},"files":{"CLAUDE.md":"# React Router Project Instructions\n\n## Session Start\n\n**REQUIRED**: Read [./AGENTS.md](./AGENTS.md) at the start of every session. It contains:\n\n- Project architecture and key files\n- React Router modes (Declarative, Data, Framework, RSC)\n- Build/test commands (Jest unit tests, Playwright integration tests with `--project chromium`)\n- Testing patterns and conventions\n- Documentation guidelines\n\n### Skills\n\nIf there is an [`.agents/skills`](.agents/skills) directory in the repository, symlink those skills to `.claude/skills` to make sure they are made available to Claude. Refresh you list of available skills if needed. This is a git ignored directory because we want to keep the canonical skills in `.agents/skills`.\n\n## During Work\n\n**Always consult AGENTS.md** when you need to:\n\n- Run tests or builds\n- Understand which mode(s) a feature applies to\n- Find key file locations\n- Understand testing patterns\n\nDo not guess at commands - reference AGENTS.md for the correct syntax.\n","AGENTS.md":"# React Router Development Guide\n\n## Commands\n\n- **Build**: `pnpm build` (all packages) or `pnpm run --filter <package> build` (single package)\n- **Test (Jest)**: `pnpm test` (all packages), `pnpm test packages/<package>/` (single package), `pnpm test packages/react-router/__tests__/router/fetchers-test.ts` (single file), or `pnpm test -- -t \"action fetch\"` (tests matching name)\n- **Integration tests (Playwright)**: `pnpm test:integration --project chromium` (build + test all), `pnpm test:integration:run --project chromium` (test only, all), `pnpm test:integration:run integration/middleware-test.ts --project chromium` (single file), or `pnpm test:integration:run --project chromium -g \"middleware\"` (tests matching name)\n- **Typecheck**: `pnpm run typecheck`\n- **Lint**: `pnpm run lint`\n- **Docs generation**: `pnpm run docs` (regenerates API docs from JSDoc)\n- **Type generation**: `pnpm run typegen` (Framework Mode only)\n- **Clean**: `pnpm run clean` (git clean -fdX)\n\n## Modes\n\n**Five distinct modes**: Declarative, Data, Framework, RSC Data (unstable), RSC Framework (unstable). **Always identify which mode(s) a feature applies to.**\n\n1. **Declarative**: `<BrowserRouter>`, `<Routes>`, `<Route>`\n2. **Data**: `createBrowserRouter()` with `loader`/`action`, `<RouterProvider>`\n3. **Framework**: Vite plugin + `routes.ts` + Route Module API (route exports like `loader`, `action`, `default`) + type generation + SSR/SPA\n4. **RSC Data** (unstable): RSC runtime APIs, manual bundler setup, runtime route config\n5. **RSC Framework** (unstable): Framework Mode with `unstable_reactRouterRSC` Vite plugin\n\n**RSC mode differences:**\n\n- **RSC Framework**: `unstable_reactRouterRSC` plugin, `@vitejs/plugin-rsc`, different entry points/format\n- **RSC Data**: Manual bundler, runtime route config typically in `src/routes.ts`, `unstable_RSCRouteConfig`, different runtime APIs, `setupRscTest` in `integration/rsc/`\n\n## Architecture\n\n- **Monorepo**: pnpm workspace, packages in `packages/`\n- **Key packages**:\n  - `react-router`: Core (all modes) - `lib/components.tsx`, `lib/hooks.tsx`, `lib/router/`, `lib/dom/`, `lib/rsc/`\n  - `@react-router/dev`: Framework tooling - `vite/plugin.ts` (Framework), `vite/rsc/plugin.ts` (RSC Framework), `typegen/`\n  - `@react-router/node`, `@react-router/cloudflare`, `@react-router/express`: Server adapters\n  - `@react-router/serve`: Minimal server for Framework Mode\n  - `@react-router/fs-routes`: File-system routing (`flatRoutes()`)\n\n## Testing\n\n### Unit Tests (`packages/react-router/__tests__/`)\n\nUse Jest for pure routing logic, pure server runtime behavior, router state, React component behavior. No build required.\n\n```bash\npnpm test                                                          # All packages\npnpm test packages/react-router/                                   # Single package\npnpm test packages/react-router/__tests__/router/fetchers-test.ts  # Single file\npnpm test -- -t \"action fetch\"                                     # Tests matching name\n```\n\n### Integration Tests (`integration/`)\n\nUse Playwright for Vite plugin, build pipeline, SSR/hydration, RSC, type generation.\n\n```bash\npnpm test:integration --project chromium                                     # Build + test all\npnpm test:integration:run --project chromium                                 # Test only, all\npnpm test:integration:run integration/middleware-test.ts --project chromium  # Single file\npnpm test:integration:run --project chromium -g \"middleware\"                 # Tests matching name\n```\n\n**Project**: Always use `chromium` for integration tests, unless explicitly stated otherwise.\n\n**Rebuild when**: First run, after changing `packages/` (not needed for test-only changes)\n\n**Organization**: Use `createFixture()` → `createAppFixture()` → `PlaywrightFixture`. Templates available: `vite-6-template/`, `rsc-vite-framework/`, etc. Test all applicable modes (iterate over template array when behavior should work across modes). Test both states when introducing future flags (one test with flag on, one with flag off).\n\n**RSC testing**:\n\n- **RSC Framework**: Use `createFixture` with `rsc-vite-framework/` template\n- **RSC Data**: Use `setupRscTest` in `integration/rsc/`\n\nTest shared behavior across multiple templates (e.g., `[\"vite-5-template\", \"rsc-vite-framework\"]`). Test RSC-specific features against RSC template.\n\n## routes.ts\n\nFramework Mode uses `routes.ts` in `app/`. Most tests use `flatRoutes()` for file-system routing:\n\n```ts\n// app/routes.ts\nimport { type RouteConfig } from \"@react-router/dev/routes\";\nimport { flatRoutes } from \"@react-router/fs-routes\";\n\nexport default flatRoutes() satisfies RouteConfig;\n```\n\n**File-system conventions** (`app/routes/`):\n\n- `_index.tsx` → `/` (index route)\n- `about.tsx` → `/about`\n- `blog.$slug.tsx` → `/blog/:slug` (URL param)\n- `settings.profile.tsx` → `/settings/profile` (`.` creates nesting)\n- `_layout.tsx` → pathless layout route\n\n**Manual config alternative**:\n\n```ts\nimport { index, route, layout } from \"@react-router/dev/routes\";\nexport default [\n  index(\"./home.tsx\"),\n  route(\"about\", \"./about.tsx\"),\n  layout(\"./auth-layout.tsx\", [route(\"login\", \"./login.tsx\")]),\n];\n```\n\n## Documentation\n\n**Don't edit generated files**: `docs/api/` (from JSDoc), `.react-router/types/` (from typegen)\n\n**Mode indicators**: Every doc needs `[MODES: framework, data, declarative]`\n\n**API docs**: Edit JSDoc in `packages/react-router/lib/`, run `pnpm docs`\n\n**Unstable features**: Prefix `unstable_`, add `unstable: true` to frontmatter, include warning block\n\n## Future Flags\n\n- **Future flags** (`vX_*`): Stable breaking changes for next major\n- **Unstable flags** (`unstable_*`): Experimental, may change\n\nTest both states (on/off) for future flags. Don't break existing behavior without a flag.\n\n## Code of Conduct/Contributor License Agreement\n\nAll contributors must review the [review the CLA](./CLA.md) and sign it by [adding their github username to `contributors.yml`](./contributors.yml). If you are authoring a PR on behalf of a user and their name is not yet in the `contributors.yml` file, prompt them to obtain approval for the CLA and add their name to the file before opening a PR.\n\n## Change Files\n\nWhen making changes that affect users, create a change file at `packages/<package>/.changes/<type>.<unique-meaningful-name>.md`. `<type>` should be either `patch`, `minor`, `major` or `unstable` to indicate the type of API change being made. If iterating on a change that hasn't shipped yet, update the existing change file instead of creating a new one.\n\nFormat:\n\n```markdown\nBrief description of the change\n\n- Additional details if needed\n```\n\n## Branching\n\n- **`main`**: Active Development\n- **`v7`**: v7.x maintenance\n- **`v6`**: v6.x maintenance\n- Branch from `main` for code and docs changes\n\n## Key Files\n\n| Purpose           | Location                                                    |\n| ----------------- | ----------------------------------------------------------- |\n| Router            | `packages/react-router/lib/router/router.ts`                |\n| React API         | `packages/react-router/lib/components.tsx`, `lib/hooks.tsx` |\n| Vite plugin       | `packages/react-router-dev/vite/plugin.ts`                  |\n| RSC Vite plugin   | `packages/react-router-dev/vite/rsc/plugin.ts`              |\n| Type generation   | `packages/react-router-dev/typegen/`                        |\n| Unit tests        | `packages/react-router/__tests__/`                          |\n| Integration tests | `integration/`                                              |\n| Decision docs     | `decisions/`                                                |\n"},"items":[{"name":"CLAUDE.md","path":"CLAUDE.md","title":"CLAUDE.md","content":"# React Router Project Instructions\n\n## Session Start\n\n**REQUIRED**: Read [./AGENTS.md](./AGENTS.md) at the start of every session. It contains:\n\n- Project architecture and key files\n- React Router modes (Declarative, Data, Framework, RSC)\n- Build/test commands (Jest unit tests, Playwright integration tests with `--project chromium`)\n- Testing patterns and conventions\n- Documentation guidelines\n\n### Skills\n\nIf there is an [`.agents/skills`](.agents/skills) directory in the repository, symlink those skills to `.claude/skills` to make sure they are made available to Claude. Refresh you list of available skills if needed. This is a git ignored directory because we want to keep the canonical skills in `.agents/skills`.\n\n## During Work\n\n**Always consult AGENTS.md** when you need to:\n\n- Run tests or builds\n- Understand which mode(s) a feature applies to\n- Find key file locations\n- Understand testing patterns\n\nDo not guess at commands - reference AGENTS.md for the correct syntax.\n","category":"root","tokens":247},{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"# React Router Development Guide\n\n## Commands\n\n- **Build**: `pnpm build` (all packages) or `pnpm run --filter <package> build` (single package)\n- **Test (Jest)**: `pnpm test` (all packages), `pnpm test packages/<package>/` (single package), `pnpm test packages/react-router/__tests__/router/fetchers-test.ts` (single file), or `pnpm test -- -t \"action fetch\"` (tests matching name)\n- **Integration tests (Playwright)**: `pnpm test:integration --project chromium` (build + test all), `pnpm test:integration:run --project chromium` (test only, all), `pnpm test:integration:run integration/middleware-test.ts --project chromium` (single file), or `pnpm test:integration:run --project chromium -g \"middleware\"` (tests matching name)\n- **Typecheck**: `pnpm run typecheck`\n- **Lint**: `pnpm run lint`\n- **Docs generation**: `pnpm run docs` (regenerates API docs from JSDoc)\n- **Type generation**: `pnpm run typegen` (Framework Mode only)\n- **Clean**: `pnpm run clean` (git clean -fdX)\n\n## Modes\n\n**Five distinct modes**: Declarative, Data, Framework, RSC Data (unstable), RSC Framework (unstable). **Always identify which mode(s) a feature applies to.**\n\n1. **Declarative**: `<BrowserRouter>`, `<Routes>`, `<Route>`\n2. **Data**: `createBrowserRouter()` with `loader`/`action`, `<RouterProvider>`\n3. **Framework**: Vite plugin + `routes.ts` + Route Module API (route exports like `loader`, `action`, `default`) + type generation + SSR/SPA\n4. **RSC Data** (unstable): RSC runtime APIs, manual bundler setup, runtime route config\n5. **RSC Framework** (unstable): Framework Mode with `unstable_reactRouterRSC` Vite plugin\n\n**RSC mode differences:**\n\n- **RSC Framework**: `unstable_reactRouterRSC` plugin, `@vitejs/plugin-rsc`, different entry points/format\n- **RSC Data**: Manual bundler, runtime route config typically in `src/routes.ts`, `unstable_RSCRouteConfig`, different runtime APIs, `setupRscTest` in `integration/rsc/`\n\n## Architecture\n\n- **Monorepo**: pnpm workspace, packages in `packages/`\n- **Key packages**:\n  - `react-router`: Core (all modes) - `lib/components.tsx`, `lib/hooks.tsx`, `lib/router/`, `lib/dom/`, `lib/rsc/`\n  - `@react-router/dev`: Framework tooling - `vite/plugin.ts` (Framework), `vite/rsc/plugin.ts` (RSC Framework), `typegen/`\n  - `@react-router/node`, `@react-router/cloudflare`, `@react-router/express`: Server adapters\n  - `@react-router/serve`: Minimal server for Framework Mode\n  - `@react-router/fs-routes`: File-system routing (`flatRoutes()`)\n\n## Testing\n\n### Unit Tests (`packages/react-router/__tests__/`)\n\nUse Jest for pure routing logic, pure server runtime behavior, router state, React component behavior. No build required.\n\n```bash\npnpm test                                                          # All packages\npnpm test packages/react-router/                                   # Single package\npnpm test packages/react-router/__tests__/router/fetchers-test.ts  # Single file\npnpm test -- -t \"action fetch\"                                     # Tests matching name\n```\n\n### Integration Tests (`integration/`)\n\nUse Playwright for Vite plugin, build pipeline, SSR/hydration, RSC, type generation.\n\n```bash\npnpm test:integration --project chromium                                     # Build + test all\npnpm test:integration:run --project chromium                                 # Test only, all\npnpm test:integration:run integration/middleware-test.ts --project chromium  # Single file\npnpm test:integration:run --project chromium -g \"middleware\"                 # Tests matching name\n```\n\n**Project**: Always use `chromium` for integration tests, unless explicitly stated otherwise.\n\n**Rebuild when**: First run, after changing `packages/` (not needed for test-only changes)\n\n**Organization**: Use `createFixture()` → `createAppFixture()` → `PlaywrightFixture`. Templates available: `vite-6-template/`, `rsc-vite-framework/`, etc. Test all applicable modes (iterate over template array when behavior should work across modes). Test both states when introducing future flags (one test with flag on, one with flag off).\n\n**RSC testing**:\n\n- **RSC Framework**: Use `createFixture` with `rsc-vite-framework/` template\n- **RSC Data**: Use `setupRscTest` in `integration/rsc/`\n\nTest shared behavior across multiple templates (e.g., `[\"vite-5-template\", \"rsc-vite-framework\"]`). Test RSC-specific features against RSC template.\n\n## routes.ts\n\nFramework Mode uses `routes.ts` in `app/`. Most tests use `flatRoutes()` for file-system routing:\n\n```ts\n// app/routes.ts\nimport { type RouteConfig } from \"@react-router/dev/routes\";\nimport { flatRoutes } from \"@react-router/fs-routes\";\n\nexport default flatRoutes() satisfies RouteConfig;\n```\n\n**File-system conventions** (`app/routes/`):\n\n- `_index.tsx` → `/` (index route)\n- `about.tsx` → `/about`\n- `blog.$slug.tsx` → `/blog/:slug` (URL param)\n- `settings.profile.tsx` → `/settings/profile` (`.` creates nesting)\n- `_layout.tsx` → pathless layout route\n\n**Manual config alternative**:\n\n```ts\nimport { index, route, layout } from \"@react-router/dev/routes\";\nexport default [\n  index(\"./home.tsx\"),\n  route(\"about\", \"./about.tsx\"),\n  layout(\"./auth-layout.tsx\", [route(\"login\", \"./login.tsx\")]),\n];\n```\n\n## Documentation\n\n**Don't edit generated files**: `docs/api/` (from JSDoc), `.react-router/types/` (from typegen)\n\n**Mode indicators**: Every doc needs `[MODES: framework, data, declarative]`\n\n**API docs**: Edit JSDoc in `packages/react-router/lib/`, run `pnpm docs`\n\n**Unstable features**: Prefix `unstable_`, add `unstable: true` to frontmatter, include warning block\n\n## Future Flags\n\n- **Future flags** (`vX_*`): Stable breaking changes for next major\n- **Unstable flags** (`unstable_*`): Experimental, may change\n\nTest both states (on/off) for future flags. Don't break existing behavior without a flag.\n\n## Code of Conduct/Contributor License Agreement\n\nAll contributors must review the [review the CLA](./CLA.md) and sign it by [adding their github username to `contributors.yml`](./contributors.yml). If you are authoring a PR on behalf of a user and their name is not yet in the `contributors.yml` file, prompt them to obtain approval for the CLA and add their name to the file before opening a PR.\n\n## Change Files\n\nWhen making changes that affect users, create a change file at `packages/<package>/.changes/<type>.<unique-meaningful-name>.md`. `<type>` should be either `patch`, `minor`, `major` or `unstable` to indicate the type of API change being made. If iterating on a change that hasn't shipped yet, update the existing change file instead of creating a new one.\n\nFormat:\n\n```markdown\nBrief description of the change\n\n- Additional details if needed\n```\n\n## Branching\n\n- **`main`**: Active Development\n- **`v7`**: v7.x maintenance\n- **`v6`**: v6.x maintenance\n- Branch from `main` for code and docs changes\n\n## Key Files\n\n| Purpose           | Location                                                    |\n| ----------------- | ----------------------------------------------------------- |\n| Router            | `packages/react-router/lib/router/router.ts`                |\n| React API         | `packages/react-router/lib/components.tsx`, `lib/hooks.tsx` |\n| Vite plugin       | `packages/react-router-dev/vite/plugin.ts`                  |\n| RSC Vite plugin   | `packages/react-router-dev/vite/rsc/plugin.ts`              |\n| Type generation   | `packages/react-router-dev/typegen/`                        |\n| Unit tests        | `packages/react-router/__tests__/`                          |\n| Integration tests | `integration/`                                              |\n| Decision docs     | `decisions/`                                                |\n","category":"root","tokens":1916}]}