diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml index b7d4230d40..0132b1b88d 100644 --- a/.github/workflows/pr-checks.yml +++ b/.github/workflows/pr-checks.yml @@ -22,22 +22,56 @@ jobs: pull-requests: read steps: + - name: Check changed files + env: + GH_TOKEN: ${{ github.token }} + id: changed-files + run: | + changed_files="$(gh pr diff "${{ github.event.pull_request.number }}" --repo "$GITHUB_REPOSITORY" --name-only)" + + touches_scripts="false" + touches_packages="false" + + while IFS= read -r file; do + case "$file" in + scripts/*) touches_scripts="true" ;; + packages/*) touches_packages="true" ;; + esac + done <<< "$changed_files" + + if [ "$touches_scripts" = "true" ] && [ "$touches_packages" = "true" ]; then + echo "PR checks cannot safely run when a PR changes both scripts/ and packages/." + echo "Please split automation changes and package changes into separate PRs." + exit 1 + elif [ "$touches_scripts" = "true" ]; then + echo "PR touches scripts/ without touching packages/; skipping community helper checks." + echo '{"prNumber":${{ github.event.pull_request.number }},"actions":[]}' > pr-checks-result.json + echo "mode=skip" >> "$GITHUB_OUTPUT" + else + echo "mode=run" >> "$GITHUB_OUTPUT" + fi + - name: Checkout repo + if: steps.changed-files.outputs.mode == 'run' uses: actions/checkout@v7 - name: Setup pnpm + if: steps.changed-files.outputs.mode == 'run' uses: pnpm/action-setup@v6 - name: Setup node + if: steps.changed-files.outputs.mode == 'run' uses: actions/setup-node@v6 with: node-version-file: ".nvmrc" cache: pnpm - name: Install deps + if: steps.changed-files.outputs.mode == 'run' run: pnpm install --frozen-lockfile - name: Run checks + if: steps.changed-files.outputs.mode == 'run' env: GITHUB_TOKEN: ${{ github.token }} PR_NUMBER: ${{ github.event.pull_request.number }} diff --git a/CHANGELOG.md b/CHANGELOG.md index f1548a9f61..0c4875750f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,9 @@ We manage release notes in this file instead of the paginated Github Releases Pa Table of Contents - [React Router Releases](#react-router-releases) + - [v8.1.0](#v810) + - [Agent Skills Installation via `create-react-router`](#agent-skills-installation-via-create-react-router) + - [Observability Metadata](#observability-metadata) - [v8.0.1](#v801) - [v8.0.0](#v800) - [Baseline Support](#baseline-support) @@ -104,6 +107,70 @@ We manage release notes in this file instead of the paginated Github Releases Pa +## v8.1.0 + +Date: 2026-06-29 + +### What's Changed + +#### Agent Skills Installation via `create-react-router` + +`create-react-router` can now setup the React Router [Agent Skill](https://github.com/remix-run/react-router/tree/main/.agents/skills/react-router) in your new project. Interactive shells will issue a prompt on whether to include the skills, and they will be included by default with when running with `--yes` or in non-interactive shells. You can skip the skill addition with the `--no-agent-skills` CLI flag. + +#### Observability Metadata + +The Instrumentation APIs `info` parameter usually corresponds roughly to the inputs to the thing being instrumented (`handler`, `loader`, etc.). For route level instrumentations such as loaders, this contains useful information like the `pattern` (i.e., `/blog/:slug`) that allows you to report information that is easily aggregated by pattern, instead of having to manually deduce one from the request url. + +However, for outer layers such as the `handler` or a router `navigate` call - we can't provide a `pattern` because we haven't yet done any route matching, so it wasn't easy to report at those levels based on a generic route pattern. + +The internal instrumentation results now contain relevant metadata in `result.meta` for these outer instrumentation layers. For server `handler` instrumentations, we also expose the `statusCode` of the outgoing HTTP response: + +```ts +export const instrumentations = [ + { + handler(handler) { + handler.instrument({ + async request(handleRequest) { + let result = await handleRequest(); + + // Available to server `handler`, and router `navigate`/`fetch` instrumentations + let normalizedUrl = result.meta?.url; + let routePattern = result.meta?.pattern; + let routeParams = result.meta?.params; + + // Available to server `handler` only + let statusCode = result.statusCode; + }, + }); + }, + }, +]; +``` + +Please see the [docs](https://reactrouter.com/how-to/instrumentation#result-metadata) for more information. + +### Minor Changes + +- `react-router` - Return route metadata from server request, client navigation, and client fetcher instrumentations ([#15235](https://github.com/remix-run/react-router/pull/15235)) + - Adds result metadata after instrumented calls complete, including the URL, matched route pattern, and params + - Adds known HTTP status codes to server request handler instrumentation results +- `create-react-router` - Add a default-on CLI option to include the official React Router agent skill in generated projects ([#15213](https://github.com/remix-run/react-router/pull/15213)) + - New projects include `.agents/skills/react-router` by default when running with `--yes` or in non-interactive shells + - Interactive runs prompt to include the skill, defaulting to yes + - Use `--no-agent-skills` to skip copying the skill + +### Patch Changes + +- `@react-router/dev` - Fix a regression with the new prerendering plugin where the `react-router.config.ts` `buildEnd` hook would run before prerendering was completed ([#15211](https://github.com/remix-run/react-router/pull/15211)) +- `@react-router/dev` - Fixed `react-router typegen` crashes under the Bun runtime when Babel default imports are already unwrapped ([#15214](https://github.com/remix-run/react-router/pull/15214)) +- `@react-router/dev` - Replace the deprecated `envFile:false` Vite config with `envDir:false` to eliminate a deprecation warning when using vite@8.1.0+ ([#15230](https://github.com/remix-run/react-router/pull/15230)) +- `@react-router/dev` - Only add the `"node"` Vite server condition for Framework mode apps that declare a Node server adapter dependency ([#15242](https://github.com/remix-run/react-router/pull/15242)) + - This prevents non-Node SSR runtimes from resolving Node-specific package exports by default +- `@react-router/serve` - Use Node's built-in networking APIs to find an available port and remove the `get-port` dependency ([#15239](https://github.com/remix-run/react-router/pull/15239)) +- `create-react-router` - Use Node's built-in utilities for CLI argument parsing, ANSI-stripping, and child process execution to remove the `arg`, `strip-ansi`, and `execa` dependencies ([#15231](https://github.com/remix-run/react-router/pull/15231)) + +**Full Changelog**: [`v8.0.1...v8.1.0`](https://github.com/remix-run/react-router/compare/react-router@8.0.1...react-router@8.1.0) + ## v8.0.1 Date: 2026-06-18 diff --git a/packages/create-react-router/.changes/minor.agent-skills.md b/packages/create-react-router/.changes/minor.agent-skills.md deleted file mode 100644 index dbccc8b34f..0000000000 --- a/packages/create-react-router/.changes/minor.agent-skills.md +++ /dev/null @@ -1,5 +0,0 @@ -Add a default-on CLI option to include the official React Router agent skill in generated projects. - -- New projects include `.agents/skills/react-router` by default when running with `--yes` or in non-interactive shells. -- Interactive runs prompt to include the skill, defaulting to yes. -- Use `--no-agent-skills` to skip copying the skill. diff --git a/packages/create-react-router/.changes/patch.use-node-parse-args.md b/packages/create-react-router/.changes/patch.use-node-parse-args.md deleted file mode 100644 index 86980802f4..0000000000 --- a/packages/create-react-router/.changes/patch.use-node-parse-args.md +++ /dev/null @@ -1 +0,0 @@ -Use Node's built-in utilities for CLI argument parsing, ANSI-stripping, and child process execution to remove the `arg`, `strip-ansi`, and `execa` dependencies. diff --git a/packages/create-react-router/CHANGELOG.md b/packages/create-react-router/CHANGELOG.md index d2ad382a70..9a3996c9e4 100644 --- a/packages/create-react-router/CHANGELOG.md +++ b/packages/create-react-router/CHANGELOG.md @@ -1,5 +1,18 @@ # `create-react-router` +## v8.1.0 + +### Minor Changes + +- Add a default-on CLI option to include the official React Router agent skill in generated projects ([#15213](https://github.com/remix-run/react-router/pull/15213)) + - New projects include `.agents/skills/react-router` by default when running with `--yes` or in non-interactive shells + - Interactive runs prompt to include the skill, defaulting to yes + - Use `--no-agent-skills` to skip copying the skill + +### Patch Changes + +- Use Node's built-in utilities for CLI argument parsing, ANSI-stripping, and child process execution to remove the `arg`, `strip-ansi`, and `execa` dependencies ([#15231](https://github.com/remix-run/react-router/pull/15231)) + ## v8.0.1 ### Patch Changes diff --git a/packages/create-react-router/package.json b/packages/create-react-router/package.json index 5b5b10e09f..a282395c79 100644 --- a/packages/create-react-router/package.json +++ b/packages/create-react-router/package.json @@ -1,7 +1,7 @@ { "name": "create-react-router", "type": "module", - "version": "8.0.1", + "version": "8.1.0", "description": "Create a new React Router app", "homepage": "https://reactrouter.com", "bugs": { diff --git a/packages/react-router-architect/CHANGELOG.md b/packages/react-router-architect/CHANGELOG.md index 5212dbb44f..ebedd043d6 100644 --- a/packages/react-router-architect/CHANGELOG.md +++ b/packages/react-router-architect/CHANGELOG.md @@ -1,5 +1,13 @@ # `@react-router/architect` +## v8.1.0 + +### Patch Changes + +- Updated dependencies: + - [`react-router@8.1.0`](https://github.com/remix-run/react-router/releases/tag/react-router@8.1.0) + - [`@react-router/node@8.1.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/node@8.1.0) + ## v8.0.1 ### Patch Changes diff --git a/packages/react-router-architect/package.json b/packages/react-router-architect/package.json index 49f6223109..d21551ec8a 100644 --- a/packages/react-router-architect/package.json +++ b/packages/react-router-architect/package.json @@ -1,7 +1,7 @@ { "name": "@react-router/architect", "type": "module", - "version": "8.0.1", + "version": "8.1.0", "description": "Architect server request handler for React Router", "bugs": { "url": "https://github.com/remix-run/react-router/issues" diff --git a/packages/react-router-cloudflare/CHANGELOG.md b/packages/react-router-cloudflare/CHANGELOG.md index a445375b34..1e06837081 100644 --- a/packages/react-router-cloudflare/CHANGELOG.md +++ b/packages/react-router-cloudflare/CHANGELOG.md @@ -1,5 +1,12 @@ # `@react-router/cloudflare` +## v8.1.0 + +### Patch Changes + +- Updated dependencies: + - [`react-router@8.1.0`](https://github.com/remix-run/react-router/releases/tag/react-router@8.1.0) + ## v8.0.1 ### Patch Changes diff --git a/packages/react-router-cloudflare/package.json b/packages/react-router-cloudflare/package.json index 537596c13f..5eeddace80 100644 --- a/packages/react-router-cloudflare/package.json +++ b/packages/react-router-cloudflare/package.json @@ -1,7 +1,7 @@ { "name": "@react-router/cloudflare", "type": "module", - "version": "8.0.1", + "version": "8.1.0", "description": "Cloudflare platform abstractions for React Router", "bugs": { "url": "https://github.com/remix-run/react-router/issues" diff --git a/packages/react-router-dev/.changes/patch.build-end-after-prerender.md b/packages/react-router-dev/.changes/patch.build-end-after-prerender.md deleted file mode 100644 index d93d15b962..0000000000 --- a/packages/react-router-dev/.changes/patch.build-end-after-prerender.md +++ /dev/null @@ -1 +0,0 @@ -Fix a regression with the new prerendering plugin where the `react-router.config.ts` `buildEnd` hook would run before prerendering was completed diff --git a/packages/react-router-dev/.changes/patch.bun-babel-default-imports.md b/packages/react-router-dev/.changes/patch.bun-babel-default-imports.md deleted file mode 100644 index 46f2ee79f3..0000000000 --- a/packages/react-router-dev/.changes/patch.bun-babel-default-imports.md +++ /dev/null @@ -1 +0,0 @@ -Fixed `react-router typegen` crashes under the Bun runtime when Babel default imports are already unwrapped. diff --git a/packages/react-router-dev/.changes/patch.fix-envfile-warning-appeared-vite810.md b/packages/react-router-dev/.changes/patch.fix-envfile-warning-appeared-vite810.md deleted file mode 100644 index da1044700a..0000000000 --- a/packages/react-router-dev/.changes/patch.fix-envfile-warning-appeared-vite810.md +++ /dev/null @@ -1 +0,0 @@ -Replace the deprecated `envFile:false` Vite config with `envDir:false` to eliminate a deprecation warning when using vite@8.1.0+ diff --git a/packages/react-router-dev/.changes/patch.vite-node-external-conditions.md b/packages/react-router-dev/.changes/patch.vite-node-external-conditions.md deleted file mode 100644 index 63b2e4c502..0000000000 --- a/packages/react-router-dev/.changes/patch.vite-node-external-conditions.md +++ /dev/null @@ -1,3 +0,0 @@ -Only add the `"node"` Vite server condition for Framework mode apps that declare a Node server adapter dependency - -This prevents non-Node SSR runtimes from resolving Node-specific package exports by default. diff --git a/packages/react-router-dev/CHANGELOG.md b/packages/react-router-dev/CHANGELOG.md index 0ac3bd9a96..83213fd938 100644 --- a/packages/react-router-dev/CHANGELOG.md +++ b/packages/react-router-dev/CHANGELOG.md @@ -1,5 +1,19 @@ # `@react-router/dev` +## v8.1.0 + +### Patch Changes + +- Fix a regression with the new prerendering plugin where the `react-router.config.ts` `buildEnd` hook would run before prerendering was completed ([#15211](https://github.com/remix-run/react-router/pull/15211)) +- Fixed `react-router typegen` crashes under the Bun runtime when Babel default imports are already unwrapped ([#15214](https://github.com/remix-run/react-router/pull/15214)) +- Replace the deprecated `envFile:false` Vite config with `envDir:false` to eliminate a deprecation warning when using vite@8.1.0+ ([#15230](https://github.com/remix-run/react-router/pull/15230)) +- Only add the `"node"` Vite server condition for Framework mode apps that declare a Node server adapter dependency ([#15242](https://github.com/remix-run/react-router/pull/15242)) + - This prevents non-Node SSR runtimes from resolving Node-specific package exports by default +- Updated dependencies: + - [`react-router@8.1.0`](https://github.com/remix-run/react-router/releases/tag/react-router@8.1.0) + - [`@react-router/node@8.1.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/node@8.1.0) + - [`@react-router/serve@8.1.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/serve@8.1.0) + ## v8.0.1 ### Patch Changes diff --git a/packages/react-router-dev/package.json b/packages/react-router-dev/package.json index 85e251e1e9..381d4e83f3 100644 --- a/packages/react-router-dev/package.json +++ b/packages/react-router-dev/package.json @@ -1,7 +1,7 @@ { "name": "@react-router/dev", "type": "module", - "version": "8.0.1", + "version": "8.1.0", "description": "Dev tools and CLI for React Router", "keywords": [ "react", diff --git a/packages/react-router-express/CHANGELOG.md b/packages/react-router-express/CHANGELOG.md index 886cfb1de4..ef65397247 100644 --- a/packages/react-router-express/CHANGELOG.md +++ b/packages/react-router-express/CHANGELOG.md @@ -1,5 +1,13 @@ # `@react-router/express` +## v8.1.0 + +### Patch Changes + +- Updated dependencies: + - [`react-router@8.1.0`](https://github.com/remix-run/react-router/releases/tag/react-router@8.1.0) + - [`@react-router/node@8.1.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/node@8.1.0) + ## v8.0.1 ### Patch Changes diff --git a/packages/react-router-express/package.json b/packages/react-router-express/package.json index 75e11a4dfc..34c8fd1db7 100644 --- a/packages/react-router-express/package.json +++ b/packages/react-router-express/package.json @@ -1,7 +1,7 @@ { "name": "@react-router/express", "type": "module", - "version": "8.0.1", + "version": "8.1.0", "description": "Express server request handler for React Router", "bugs": { "url": "https://github.com/remix-run/react-router/issues" diff --git a/packages/react-router-fs-routes/CHANGELOG.md b/packages/react-router-fs-routes/CHANGELOG.md index 1dcf7dad87..9fa7fbbb79 100644 --- a/packages/react-router-fs-routes/CHANGELOG.md +++ b/packages/react-router-fs-routes/CHANGELOG.md @@ -1,5 +1,12 @@ # `@react-router/fs-routes` +## v8.1.0 + +### Patch Changes + +- Updated dependencies: + - [`@react-router/dev@8.1.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/dev@8.1.0) + ## v8.0.1 ### Patch Changes diff --git a/packages/react-router-fs-routes/package.json b/packages/react-router-fs-routes/package.json index 00609bc202..b4b63af1b4 100644 --- a/packages/react-router-fs-routes/package.json +++ b/packages/react-router-fs-routes/package.json @@ -1,7 +1,7 @@ { "name": "@react-router/fs-routes", "type": "module", - "version": "8.0.1", + "version": "8.1.0", "description": "File system routing conventions for React Router, for use within routes.ts", "bugs": { "url": "https://github.com/remix-run/react-router/issues" diff --git a/packages/react-router-node/CHANGELOG.md b/packages/react-router-node/CHANGELOG.md index ff6c9afe16..baa5cbdb92 100644 --- a/packages/react-router-node/CHANGELOG.md +++ b/packages/react-router-node/CHANGELOG.md @@ -1,5 +1,12 @@ # `@react-router/node` +## v8.1.0 + +### Patch Changes + +- Updated dependencies: + - [`react-router@8.1.0`](https://github.com/remix-run/react-router/releases/tag/react-router@8.1.0) + ## v8.0.1 ### Patch Changes diff --git a/packages/react-router-node/package.json b/packages/react-router-node/package.json index 9682997ee1..bb824bcd1c 100644 --- a/packages/react-router-node/package.json +++ b/packages/react-router-node/package.json @@ -1,7 +1,7 @@ { "name": "@react-router/node", "type": "module", - "version": "8.0.1", + "version": "8.1.0", "description": "Node.js platform abstractions for React Router", "bugs": { "url": "https://github.com/remix-run/react-router/issues" diff --git a/packages/react-router-remix-routes-option-adapter/CHANGELOG.md b/packages/react-router-remix-routes-option-adapter/CHANGELOG.md index bd935d047c..917d97f27a 100644 --- a/packages/react-router-remix-routes-option-adapter/CHANGELOG.md +++ b/packages/react-router-remix-routes-option-adapter/CHANGELOG.md @@ -1,5 +1,12 @@ # `@react-router/remix-config-routes-adapter` +## v8.1.0 + +### Patch Changes + +- Updated dependencies: + - [`@react-router/dev@8.1.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/dev@8.1.0) + ## v8.0.1 ### Patch Changes diff --git a/packages/react-router-remix-routes-option-adapter/package.json b/packages/react-router-remix-routes-option-adapter/package.json index c0be299b18..444d452930 100644 --- a/packages/react-router-remix-routes-option-adapter/package.json +++ b/packages/react-router-remix-routes-option-adapter/package.json @@ -1,7 +1,7 @@ { "name": "@react-router/remix-routes-option-adapter", "type": "module", - "version": "8.0.1", + "version": "8.1.0", "description": "Adapter for Remix's \"routes\" config option, for use within routes.ts", "bugs": { "url": "https://github.com/remix-run/react-router/issues" diff --git a/packages/react-router-serve/.changes/patch.remove-get-port.md b/packages/react-router-serve/.changes/patch.remove-get-port.md deleted file mode 100644 index 0824fa9572..0000000000 --- a/packages/react-router-serve/.changes/patch.remove-get-port.md +++ /dev/null @@ -1 +0,0 @@ -Use Node's built-in networking APIs to find an available port and remove the `get-port` dependency. diff --git a/packages/react-router-serve/CHANGELOG.md b/packages/react-router-serve/CHANGELOG.md index e0d1f51e1b..7fbde4acd1 100644 --- a/packages/react-router-serve/CHANGELOG.md +++ b/packages/react-router-serve/CHANGELOG.md @@ -1,5 +1,15 @@ # `@react-router/serve` +## v8.1.0 + +### Patch Changes + +- Use Node's built-in networking APIs to find an available port and remove the `get-port` dependency ([#15239](https://github.com/remix-run/react-router/pull/15239)) +- Updated dependencies: + - [`react-router@8.1.0`](https://github.com/remix-run/react-router/releases/tag/react-router@8.1.0) + - [`@react-router/express@8.1.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/express@8.1.0) + - [`@react-router/node@8.1.0`](https://github.com/remix-run/react-router/releases/tag/@react-router/node@8.1.0) + ## v8.0.1 ### Patch Changes diff --git a/packages/react-router-serve/package.json b/packages/react-router-serve/package.json index c572c3a277..49c3e8732e 100644 --- a/packages/react-router-serve/package.json +++ b/packages/react-router-serve/package.json @@ -1,7 +1,7 @@ { "name": "@react-router/serve", "type": "module", - "version": "8.0.1", + "version": "8.1.0", "description": "Production application server for React Router", "bugs": { "url": "https://github.com/remix-run/react-router/issues" diff --git a/packages/react-router/.changes/minor.instrumentation-meta.md b/packages/react-router/.changes/minor.instrumentation-meta.md deleted file mode 100644 index c7ce47290e..0000000000 --- a/packages/react-router/.changes/minor.instrumentation-meta.md +++ /dev/null @@ -1,5 +0,0 @@ -Return route metadata from server request, client navigation, and client fetcher instrumentations - -- Adds result metadata after instrumented calls complete, including the URL, - matched route pattern, and params. -- Adds known HTTP status codes to server request handler instrumentation results. diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index a348e2e47b..14c58666f2 100644 --- a/packages/react-router/CHANGELOG.md +++ b/packages/react-router/CHANGELOG.md @@ -1,5 +1,13 @@ # `react-router` +## v8.1.0 + +### Minor Changes + +- Return route metadata from server request, client navigation, and client fetcher instrumentations ([#15235](https://github.com/remix-run/react-router/pull/15235)) + - Adds result metadata after instrumented calls complete, including the URL, matched route pattern, and params + - Adds known HTTP status codes to server request handler instrumentation results + ## v8.0.1 ### Patch Changes diff --git a/packages/react-router/package.json b/packages/react-router/package.json index 173f68aa64..9fd6c022e1 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,7 +1,7 @@ { "name": "react-router", "type": "module", - "version": "8.0.1", + "version": "8.1.0", "description": "Declarative routing for React", "keywords": [ "react", diff --git a/scripts/pr.ts b/scripts/pr.ts index 0da0c9dc53..fd544e6706 100644 --- a/scripts/pr.ts +++ b/scripts/pr.ts @@ -144,6 +144,9 @@ async function changeFileCheck(ctx: CheckContext): Promise { } let files = await getPrFiles(ctx.prNumber); + let touchesPackageFiles = files.some((f) => + f.filename.startsWith("packages/"), + ); let regex = /^packages\/[^/]+\/\.changes\/(major|minor|patch|unstable)\.[^/]+\.md$/; let summaries: ChangeFileSummary[] = files @@ -162,6 +165,11 @@ async function changeFileCheck(ctx: CheckContext): Promise { console.log(`changeFileCheck: found ${summaries.length} change files`); + if (summaries.length === 0 && !touchesPackageFiles) { + console.log("changeFileCheck: no package files changed"); + return []; + } + let body = CHANGE_FILE_MISSING_COMMENT; if (summaries.length > 0) {