Repository: vercel/next.js
Pull request: Improve existing dev server error message to suggest using it

<!-- CURSOR_AGENT_PR_BODY_BEGIN -->
### What?

Improves the error message shown when a user tries to start `next dev` while another dev server is already running in the same directory.

### Why?

Previously, the error message only suggested killing the existing process (`Run kill <pid> to stop it.`). This wasn't the best advice — often the user just wants to access the already-running dev server rather than kill it and start a new one.

### How?

Updated the error message in `packages/next/src/build/lockfile.ts` to present both options:

1. Access the existing server at its URL
2. Kill the process if they want to start a new one

**Before:**
```
✖ Another next dev server is already running.

- Local:        http://localhost:3000
- PID:          61479
- Dir:          /path/to/project
- Log:          .next/dev/logs/next-development.log

Run kill 61479 to stop it.
```

**After:**
```
✖ Another next dev server is already running.

- Local:        http://localhost:3000
- PID:          61479
- Dir:          /path/to/project
- Log:          .next/dev/logs/next-development.log

You can access the existing server at http://localhost:3000,
or run kill 61479 to stop it and start a new one.
```

Updated the lockfile test regex to match the new message format.
<!-- CURSOR_AGENT_PR_BODY_END -->

[Slack Thread](https://vercel.slack.com/archives/C046HAU4H7F/p1775173304387809?thread_ts=1775173304.387809&cid=C046HAU4H7F)

<div><a href="https://cursor.com/agents/bc-0bb3085b-1fd1-56c3-8617-cd8a32d8c376"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-web-light.png"><img alt="Open in Web" width="114" height="28" src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a>&nbsp;<a href="https://cursor.com/background-agent?bcId=bc-0bb3085b-1fd1-56c3-8617-cd8a32d8c376"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img alt="Open in Cursor" width="131" height="28" src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a>&nbsp;</div>



Changed files:
filename: packages/next/src/build/lockfile.ts
patch: @@ -202,12 +202,17 @@ export class Lockfile {
             )
           }
           console.error()
+          console.error(
+            `You can access the existing server at ${cyan(serverInfo.appUrl)},`
+          )
           // Use platform-appropriate kill command
           const killCommand =
             process.platform === 'win32'
               ? `taskkill /PID ${serverInfo.pid} /F`
               : `kill ${serverInfo.pid}`
-          console.error(`Run ${cyan(killCommand)} to stop it.`)
+          console.error(
+            `or run ${cyan(killCommand)} to stop it and start a new one.`
+          )
         } else {
           // Fallback when we can't read server info from the lockfile
           Log.error(

filename: test/development/lockfile/lockfile.test.ts
patch: @@ -50,14 +50,15 @@ describe('lockfile', () => {
     // The kill command varies by platform: `kill <pid>` on Unix, `taskkill /PID <pid> /F` on Windows
     const killPattern =
       process.platform === 'win32'
-        ? 'Run taskkill /PID \\d+ /F to stop it\\.'
-        : 'Run kill \\d+ to stop it\\.'
+        ? 'or run taskkill /PID \\d+ /F to stop it and start a new one\\.'
+        : 'or run kill \\d+ to stop it and start a new one\\.'
     const errorPattern = new RegExp(
       'Another next dev server is already running\\.\\s*' +
         '- Local:\\s+http://[^\\s]+\\s+' +
         '- PID:\\s+\\d+\\s+' +
         '- Dir:\\s+[^\\s]+\\s+' +
         '- Log:\\s+\\.next/dev/logs/next-development\\.log\\s+' +
+        'You can access the existing server at http://[^\\s]+,\\s+' +
         killPattern
     )
     expect(output).toMatch(errorPattern)