{"id":51544850,"url":"https://github.com/roninforge/roninforge-react-router","last_synced_at":"2026-07-09T17:01:08.641Z","repository":{"id":363762440,"uuid":"1242221041","full_name":"RoninForge/roninforge-react-router","owner":"RoninForge","description":"Cursor plugin for React Router 7 Framework Mode (formerly Remix). 45 anti-patterns, 10 rules, 5 skills, reviewer agent. Catches the Remix v2 / RR v6 leftovers that pre-Nov-2024 LLMs still produce.","archived":false,"fork":false,"pushed_at":"2026-06-10T07:44:48.000Z","size":56,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-10T09:21:30.258Z","etag":null,"topics":["ai-coding","code-review","cursor","cursor-ai","cursor-plugin","cursor-rules","framework-mode","llm","mdc","react","react-19","react-router","react-router-7","remix","roninforge","typescript"],"latest_commit_sha":null,"homepage":"https://roninforge.org/#plugins","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RoninForge.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-18T08:25:07.000Z","updated_at":"2026-06-10T07:44:53.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/RoninForge/roninforge-react-router","commit_stats":null,"previous_names":["roninforge/roninforge-react-router"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/RoninForge/roninforge-react-router","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RoninForge%2Froninforge-react-router","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RoninForge%2Froninforge-react-router/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RoninForge%2Froninforge-react-router/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RoninForge%2Froninforge-react-router/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RoninForge","download_url":"https://codeload.github.com/RoninForge/roninforge-react-router/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RoninForge%2Froninforge-react-router/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35306717,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-09T02:00:07.329Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-coding","code-review","cursor","cursor-ai","cursor-plugin","cursor-rules","framework-mode","llm","mdc","react","react-19","react-router","react-router-7","remix","roninforge","typescript"],"created_at":"2026-07-09T17:01:07.052Z","updated_at":"2026-07-09T17:01:08.631Z","avatar_url":"https://github.com/RoninForge.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# roninforge-react-router\n\nCursor plugin for **React Router 7 Framework Mode** (formerly Remix). 45 anti-patterns, 10 rules, 5 skills, a reviewer agent, two fixtures, and a structural validator.\n\nTargets `react-router@^7.15.1` (released 2026-05-14). Framework Mode is the canonical default; Data Mode and Declarative Mode are documented as migration targets only.\n\n## Why this exists\n\nReact Router v7 shipped November 2024 as the merge of Remix and React Router. The package surface changed (`@remix-run/*` to `react-router` + `@react-router/*`), the helpers changed (`json()` and `defer()` removed), the type system changed (per-route `Route` namespace via `react-router typegen`), and the entry components changed (`RemixServer` to `ServerRouter`, `RemixBrowser` to `HydratedRouter`).\n\nLLMs trained on pre-Nov-2024 data still produce Remix v2 and React Router v6 idioms when targeting a v7 project. This plugin encodes the 45 most common breakages, the canonical fixes, and a validator that fails the build when leftovers slip in.\n\n## Quick install\n\n```bash\ngit clone https://github.com/RoninForge/roninforge-react-router.git\n\n# -n preserves any existing rule of the same name.\ncp -rn roninforge-react-router/rules/*  your-project/.cursor/rules/\ncp -rn roninforge-react-router/skills/* your-project/.cursor/skills/\ncp -rn roninforge-react-router/agents/* your-project/.cursor/agents/\n```\n\nOr vendor the whole repo as a git submodule under `your-project/.cursor/plugins/`.\n\nRestart Cursor; the rules attach to `app/**/*.{ts,tsx}`, `react-router.config.{ts,js}`, `vite.config.{ts,js}`, `routes.ts`, and `package.json`.\n\n## What is inside\n\n### Rules\n\n| File                                              | Scope                                      |\n|---------------------------------------------------|--------------------------------------------|\n| `rules/react-router-anti-patterns.mdc`            | Centerpiece. All 45 anti-patterns.         |\n| `rules/react-router-route-modules.mdc`            | Canonical route module shape (9 exports). |\n| `rules/react-router-type-safety.mdc`              | typegen, tsconfig, Route namespace.        |\n| `rules/react-router-routing-config.mdc`           | `app/routes.ts` and `flatRoutes()`.        |\n| `rules/react-router-data-flow.mdc`                | plain returns, `data()`, `redirect()`.    |\n| `rules/react-router-client-data.mdc`              | `clientLoader`, `HydrateFallback`, SPA.    |\n| `rules/react-router-forms.mdc`                    | `\u003cForm\u003e`, `\u003cfetcher.Form\u003e`, `useFormAction`. |\n| `rules/react-router-sessions-and-env.mdc`         | Cookie security, `.server` modules, Zod env. |\n| `rules/react-router-navigation-and-pending.mdc`   | `useNavigation`, `useFetcher`, view transitions. |\n| `rules/react-router-migration-from-remix.mdc`     | Stage-by-stage Remix v2 to RR7 migration. |\n\n### Skills\n\n| Skill                          | Purpose                                                          |\n|--------------------------------|------------------------------------------------------------------|\n| `rr7-new-route`                | Scaffold a typed route module with loader/action/Component.      |\n| `rr7-new-resource-route`       | Scaffold a no-default-export JSON/RSS/sitemap endpoint.          |\n| `rr7-new-action-form`          | Scaffold a `\u003cForm method=\"post\"\u003e` + Zod-validated action.        |\n| `rr7-migrate-from-remix`       | Stage-by-stage Remix v2 to RR7 migration.                        |\n| `rr7-validate`                 | Run validator + typegen + tsc + grep audit.                     |\n\n### Agent\n\n`agents/rr7-reviewer.md` reviews a codebase against all 45 anti-patterns, grouped by file type, with output template.\n\n## Anti-pattern summary\n\n| Severity | Count | Examples                                                                 |\n|----------|-------|--------------------------------------------------------------------------|\n| CRIT     | 4     | VITE_*SECRET leak, server module in client, hardcoded SESSION_SECRET, insecure cookie |\n| ERR      | 23    | `@remix-run/*`, `json()`/`defer()`, `RemixServer`, `LoaderFunctionArgs`, `useLoaderData\u003ctypeof loader\u003e`, `unstable_useViewTransitionState` |\n| WARN     | 16    | `\u003cform\u003e` for mutations, `useFetcher` no key, `useBlocker` no reset, sequential awaits |\n| NIT      | 2     | no `useFormAction`, `tsc` not in CI                                      |\n| **Total**| **45**|                                                                          |\n\n## Pinned versions\n\n| Package                | Version    |\n|------------------------|------------|\n| react-router           | ^7.15.1    |\n| @react-router/node     | ^7.15.1    |\n| @react-router/serve    | ^7.15.1    |\n| @react-router/dev      | ^7.15.1    |\n| @react-router/fs-routes| ^7.15.1    |\n| react                  | ^19.2.6    |\n| react-dom              | ^19.2.6    |\n| vite                   | ^8.0.13    |\n| tailwindcss            | ^4.3.0     |\n| typescript             | ^6.0.3     |\n| zod                    | ^4.4.3     |\n| node                   | \u003e=20.19.0  |\n\n## Validator\n\n```bash\nbash tests/validation/validate-plugin.sh\n```\n\nChecks:\n\n1. `plugin.json` valid JSON, name matches.\n2. Every rule has frontmatter with `description` and `globs`.\n3. Every skill has frontmatter with `name` (matching dir) and `description`.\n4. Every agent has frontmatter with `name` and `description`.\n5. `correct-sample/` is free of all 18 forbidden patterns and forbidden files.\n6. `anti-pattern-sample/` contains every marker (negative test for the reviewer).\n7. `correct-sample/package.json` pins `react-router ^7.15` and `node \u003e=20.19`.\n8. `correct-sample/app/root.tsx` contains `\u003cMeta\u003e`, `\u003cLinks\u003e`, `\u003cScripts\u003e`, `\u003cScrollRestoration\u003e`.\n9. No em dashes in any rule, skill, agent, or README.\n10. No emojis in any rule, skill, agent, or README.\n\nExit 0 prints `ALL CHECKS PASSED`.\n\n## Links\n\n- React Router v7 docs: https://reactrouter.com\n- Framework Mode quickstart: https://reactrouter.com/start/framework/installation\n- Upgrading from Remix v2: https://reactrouter.com/upgrading/remix\n- Upgrading from React Router v6: https://reactrouter.com/upgrading/v6\n- Type safety explanation: https://reactrouter.com/explanation/type-safety\n- File-name conventions: https://api.reactrouter.com/v7/functions/_react_router_fs_routes.flatRoutes.html\n- Codemod: https://codemod.com/registry/remix-2-react-router-upgrade\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n\n\n## More from RoninForge\n\n[RoninForge](https://roninforge.org) builds free tools for developers working with AI coding assistants:\n\n- [LLM API pricing comparison](https://roninforge.org/llm-pricing) - Claude, GPT, Gemini, DeepSeek, Mistral, and Grok token prices side by side, verified against official pricing pages\n- [GitHub Copilot AI Credits calculator](https://roninforge.org/copilot-credits-calculator) - estimate your monthly credit burn under usage-based billing\n- [All Cursor plugins](https://roninforge.org/#plugins)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froninforge%2Froninforge-react-router","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Froninforge%2Froninforge-react-router","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froninforge%2Froninforge-react-router/lists"}