Files
vercel__next.js/package.json
Jiwon Choi 5d9ab72cef Add next upgrade --ai and security vulnerability coverage (#98562)
> [!TIP]
> Recommended to review commit by commit.

This PR adds `next upgrade --experimental-ai="security"` flag (alias
`--ai`), which is targeted to help users leverage agents to upgrade
their app to the safe major version when their app's Next.js version has
any security advisories.

Once the command is ran from the user, Next.js will detect the installed
agent harness in user's device, currently limited to Codex and Claude,
and will proceed with starting an agent session once approved. If it is
called within an agent session, the work will continue off within that
agent.

`next upgrade --ai` simply does two things:

- prepare the relevant context to temporary dir
- print hand off prompt, guiding to read those context

The context will guide the agent to run relevant codemods and migration
checklist to proceed. This PR is a base core of the workflow, and will
have wrappers of entry point around this. Also, will add "latest" and
"future" as follow up, which will cover the app to be always latest, and
adopt the future defaults like Cache Components.

This PR also sets up the evals infra and adds evals.
2026-09-18 00:52:20 +02:00

349 lines
16 KiB
JSON

{
"name": "nextjs-project",
"version": "0.0.0",
"private": true,
"workspaces": [
"packages/*"
],
"scripts": {
"new-error": "turbo gen error",
"new-test": "turbo gen test",
"pr-adopt": "node scripts/adopt-pr.js",
"clean": "lerna clean -y && lerna run clean && lerna exec 'node ../../scripts/rm.mjs dist'",
"build": "turbo run build --remote-cache-timeout 60 --summarize true",
"build-all": "turbo run build build-native-auto --remote-cache-timeout 60 --summarize true",
"lerna": "lerna",
"dev": "turbo run dev --parallel --filter=\"!@next/bundle-analyzer-ui\"",
"bench:render-pipeline": "tsx bench/render-pipeline/benchmark.ts",
"bench:render-pipeline:analyze": "tsx bench/render-pipeline/analyze-profiles.ts",
"bench:render-pipeline:client": "tsx bench/render-pipeline/client-trace.ts",
"bench:dev-validation": "tsx bench/dev-validation/benchmark.ts",
"pack-next": "tsx scripts/pack-next.ts",
"eval": "node run-evals.js",
"eval:upgrade": "node evals/next-upgrade/run.js",
"test-types": "tsc",
"test-unit": "jest test/unit/ packages/next/ packages/font",
"test-dev": "scripts/run-jest.sh --mode=dev --bundler=webpack --headless --",
"test-dev-webpack": "scripts/run-jest.sh --mode=dev --bundler=webpack --headless --",
"test-dev-experimental": "scripts/run-jest.sh --mode=dev --bundler=webpack --experimental --headless --",
"test-dev-experimental-webpack": "scripts/run-jest.sh --mode=dev --bundler=webpack --experimental --headless --",
"test-dev-rspack": "scripts/run-jest.sh --mode=dev --bundler=rspack --headless --",
"test-dev-experimental-rspack": "scripts/run-jest.sh --mode=dev --bundler=rspack --experimental --headless --",
"test-dev-turbo": "scripts/run-jest.sh --mode=dev --bundler=turbo --headless --",
"test-dev-experimental-turbo": "scripts/run-jest.sh --mode=dev --bundler=turbo --experimental --headless --",
"test-start": "scripts/run-jest.sh --mode=start --bundler=webpack --headless --",
"test-start-webpack": "scripts/run-jest.sh --mode=start --bundler=webpack --headless --",
"test-start-experimental": "scripts/run-jest.sh --mode=start --bundler=webpack --experimental --headless --",
"test-start-experimental-webpack": "scripts/run-jest.sh --mode=start --bundler=webpack --experimental --headless --",
"test-start-rspack": "scripts/run-jest.sh --mode=start --bundler=rspack --headless --",
"test-start-experimental-rspack": "scripts/run-jest.sh --mode=start --bundler=rspack --experimental --headless --",
"test-start-turbo": "scripts/run-jest.sh --mode=start --bundler=turbo --headless --",
"test-start-experimental-turbo": "scripts/run-jest.sh --mode=start --bundler=turbo --experimental --headless --",
"test-deploy": "scripts/run-jest.sh --mode=deploy --bundler=webpack --headless --",
"test-deploy-webpack": "scripts/run-jest.sh --mode=deploy --bundler=webpack --headless --",
"test-deploy-turbo": "scripts/run-jest.sh --mode=deploy --bundler=turbo --headless --",
"testonly-dev": "scripts/run-jest.sh --mode=dev --bundler=webpack --",
"testonly-dev-webpack": "scripts/run-jest.sh --mode=dev --bundler=webpack --",
"testonly-dev-rspack": "scripts/run-jest.sh --mode=dev --bundler=rspack --",
"testonly-dev-turbo": "scripts/run-jest.sh --mode=dev --bundler=turbo --",
"testonly-start": "scripts/run-jest.sh --mode=start --bundler=webpack --",
"testonly-start-webpack": "scripts/run-jest.sh --mode=start --bundler=webpack --",
"testonly-start-rspack": "scripts/run-jest.sh --mode=start --bundler=rspack --",
"testonly-start-turbo": "scripts/run-jest.sh --mode=start --bundler=turbo --",
"testonly-deploy": "scripts/run-jest.sh --mode=deploy --bundler=webpack --",
"testonly-deploy-webpack": "scripts/run-jest.sh --mode=deploy --bundler=webpack --",
"testonly-deploy-turbo": "scripts/run-jest.sh --mode=deploy --bundler=turbo --",
"test": "scripts/run-jest.sh --bundler=webpack --headless --",
"test-webpack": "scripts/run-jest.sh --bundler=webpack --headless --",
"test-rspack": "scripts/run-jest.sh --bundler=rspack --headless --",
"test-turbo": "scripts/run-jest.sh --bundler=turbo --headless --",
"testonly": "jest --runInBand",
"testheadless": "scripts/run-jest.sh --headless --",
"git-reset": "git reset --hard HEAD",
"git-clean": "git clean -d -x -e node_modules -e packages -f",
"typescript": "tsc --noEmit",
"lint-typescript": "turbo run typescript",
"lint-eslint": "eslint --config eslint.cli.config.mjs",
"lint-ast-grep": "ast-grep scan",
"lint-no-typescript": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" run-p prettier-check \"lint-eslint .\" lint-language",
"types-and-precompiled": "run-p \"lint-typescript --log-order=stream\" check-compiler-fixtures types:test-lib && pnpm check-precompiled",
"check-compiler-fixtures": "find crates/next-custom-transforms/tests/fixture -type f -name 'tsconfig.json' -print0 | xargs --null -I'{}' pnpm tsc --noEmit --project '{}'",
"validate-externals-doc": "node ./scripts/validate-externals-doc.js",
"check-unused-turbo-tasks": "node scripts/check-unused-turbo-tasks.mjs",
"generate-browser-variant-aliases": "node scripts/generate-browser-variant-aliases.mjs",
"lint": "run-p test-types lint-typescript prettier-check \"lint-eslint .\" lint-ast-grep lint-language check-unused-turbo-tasks",
"lint-fix": "pnpm prettier-fix && pnpm lint-eslint --fix .",
"lint-language": "alex . --quiet",
"prettier-check": "prettier --check .",
"check-examples": "./scripts/check-examples.sh",
"get-test-timings": "node run-tests.js --timings --write-timings -g 1/1",
"prettier-fix": "prettier --write .",
"types": "lerna run types --stream",
"types:test-lib": "tsc --project test/lib/tsconfig.json",
"check-precompiled": "./scripts/check-pre-compiled.sh",
"lint-staged": "lint-staged",
"next-with-deps": "./scripts/next-with-deps.sh",
"next": "cross-env NEXT_PRIVATE_LOCAL_DEV=1 NEXT_TELEMETRY_DISABLED=1 NODE_OPTIONS=\"--trace-deprecation --enable-source-maps\" next",
"next-no-sourcemaps": "echo 'No longer supported. Use `pnpm next --disable-source-maps` instead'; exit 1;",
"debug": "cross-env NEXT_PRIVATE_LOCAL_DEV=1 NEXT_TELEMETRY_DISABLED=1 node --inspect --trace-deprecation --enable-source-maps packages/next/dist/bin/next",
"debug-brk": "cross-env NEXT_PRIVATE_LOCAL_DEV=1 NEXT_TELEMETRY_DISABLED=1 node --inspect-brk --trace-deprecation --enable-source-maps packages/next/dist/bin/next",
"pnpm:devPreinstall": "node scripts/create-next-bin-placeholder.mjs",
"postinstall": "node scripts/git-configure.mjs && node scripts/install-native.mjs",
"version": "pnpm install --no-frozen-lockfile && git add .",
"prepare": "husky",
"sync-react": "node ./scripts/sync-react.js",
"update-google-fonts": "node ./scripts/update-google-fonts.js",
"patch-next": "tsx scripts/patch-next.ts",
"unpack-next": "tsx scripts/unpack-next.ts",
"swc-build-native": "tsx scripts/build-native.ts",
"swc-build-wasm": "tsx scripts/build-wasm.cjs",
"build-turbopack-cli": "cargo build -p turbopack-cli --release",
"sweep": "tsx scripts/sweep.cjs",
"storybook": "turbo run storybook",
"build-storybook": "turbo run build-storybook",
"test-storybook": "turbo run test-storybook",
"with-rspack": "cross-env NEXT_RSPACK=1 NEXT_TEST_USE_RSPACK=1",
"with-turbo": "cross-env IS_TURBOPACK_TEST=1",
"with-webpack": "cross-env IS_WEBPACK_TEST=1",
"with-experimental": "cross-env __NEXT_CACHE_COMPONENTS=true"
},
"devDependencies": {
"@actions/core": "1.10.1",
"@ast-grep/cli": "0.42.0",
"@babel/core": "7.26.10",
"@babel/eslint-parser": "7.24.6",
"@babel/generator": "7.27.0",
"@babel/parser": "7.27.0",
"@babel/plugin-syntax-explicit-resource-management": "7.25.7",
"@babel/plugin-transform-object-rest-spread": "7.25.9",
"@babel/preset-react": "7.26.3",
"@edge-runtime/jest-environment": "4.0.0",
"@emotion/cache": "11.11.0",
"@emotion/react": "11.11.1",
"@eslint/compat": "1.4.0",
"@eslint/eslintrc": "^3",
"@eslint/js": "9.37.0",
"@fullhuman/postcss-purgecss": "1.3.0",
"@jest/expect-utils": "29.7.0",
"@mdx-js/loader": "2.2.1",
"@mdx-js/react": "2.2.1",
"@next/bundle-analyzer": "workspace:*",
"@next/env": "workspace:*",
"@next/eslint-plugin-next": "workspace:*",
"@next/font": "workspace:*",
"@next/mdx": "workspace:*",
"@next/playwright": "workspace:*",
"@next/plugin-storybook": "workspace:*",
"@next/polyfill-module": "workspace:*",
"@next/polyfill-nomodule": "workspace:*",
"@next/swc": "workspace:*",
"@next/third-parties": "workspace:*",
"@opentelemetry/api": "1.4.1",
"@picocss/pico": "1.5.10",
"@rspack/core": "1.6.7",
"@slack/web-api": "7.9.1",
"@swc/cli": "0.1.55",
"@swc/core": "1.11.24",
"@swc/helpers": "0.5.23",
"@swc/types": "0.1.7",
"@taskr/esnext": "1.1.0",
"@testing-library/jest-dom": "6.1.2",
"@testing-library/react": "^15.0.5",
"@types/busboy": "1.5.3",
"@types/cheerio": "0.22.16",
"@types/cookie": "0.3.3",
"@types/cross-spawn": "6.0.0",
"@types/fs-extra": "8.1.0",
"@types/glob": "7.1.1",
"@types/html-validator": "5.0.3",
"@types/http-proxy": "1.17.17",
"@types/jest": "29.5.5",
"@types/js-yaml": "4.0.9",
"@types/node": "20.17.7",
"@types/react": "19.2.18",
"@types/react-dom": "19.2.4",
"@types/shell-quote": "1.7.1",
"@types/string-hash": "1.1.1",
"@types/trusted-types": "2.0.3",
"@types/yargs": "16.0.11",
"@vercel/agent-eval": "2.2.1",
"@vercel/blob": "2.3.2",
"@vercel/devlow-bench": "workspace:*",
"@vercel/kv": "3.0.0",
"@vercel/og": "1.0.1",
"@vercel/sandbox": "1.8.0",
"alex": "9.1.0",
"async-sema": "3.0.1",
"babel-plugin-react-compiler": "0.0.0-experimental-1371fcb-20260227",
"browserslist": "4.28.1",
"buffer": "5.6.0",
"cheerio": "0.22.0",
"cookie": "0.4.1",
"cors": "2.8.5",
"coveralls": "3.0.3",
"create-next-app": "workspace:*",
"critters": "0.0.6",
"cross-env": "6.0.3",
"cross-spawn": "6.0.5",
"dd-trace": "4.12.0",
"dotenv": "16.4.7",
"es5-ext": "0.10.53",
"escape-string-regexp": "2.0.0",
"eslint": "9.37.0",
"eslint-config-next": "workspace:*",
"eslint-formatter-codeframe": "7.32.1",
"eslint-plugin-eslint-plugin": "5.2.1",
"eslint-plugin-import": "2.31.0",
"eslint-plugin-jest": "27.6.3",
"eslint-plugin-jsdoc": "48.0.4",
"eslint-plugin-mdx": "3.1.5",
"eslint-plugin-react": "7.37.0",
"eslint-plugin-react-hooks": "0.0.0-experimental-ab18f33d-20260220",
"event-stream": "4.0.1",
"execa": "2.0.3",
"expect": "29.7.0",
"expect-type": "0.14.2",
"express": "4.17.0",
"faker": "5.5.3",
"faunadb": "2.6.1",
"find-up": "4.1.0",
"firebase": "7.14.5",
"flat": "5.0.2",
"fs-extra": "9.0.0",
"get-port": "5.1.1",
"get-port-please": "3.1.1",
"glob": "7.1.6",
"globals": "16.4.0",
"gzip-size": "5.1.1",
"html-validator": "5.1.18",
"http-proxy": "1.18.1",
"husky": "9.0.11",
"image-size": "1.2.1",
"is-animated": "2.0.2",
"isomorphic-unfetch": "3.0.0",
"jest": "29.7.0",
"jest-diff": "29.7.0",
"jest-environment-jsdom": "29.7.0",
"jest-extended": "4.0.2",
"jest-junit": "16.0.0",
"jest-snapshot": "30.0.0-alpha.6",
"js-yaml": "4.2.0",
"json5": "2.2.3",
"kleur": "^4.1.0",
"ky": "0.19.1",
"ky-universal": "0.6.0",
"lerna": "9.0.3",
"lint-staged": "15.2.2",
"lodash": "4.18.1",
"lost": "8.3.1",
"minimatch": "3.0.4",
"moment": "^2.24.0",
"nanoid": "3.1.30",
"next": "workspace:*",
"node-plop": "0.31.1",
"npm-run-all": "4.1.5",
"nprogress": "0.2.0",
"octokit": "3.1.0",
"outdent": "0.8.0",
"pixrem": "5.0.0",
"playwright": "1.61.0",
"playwright-chromium": "1.61.0",
"postcss": "8.5.23",
"postcss-nested": "4.2.1",
"postcss-pseudoelements": "5.0.0",
"postcss-short-size": "4.0.0",
"postcss-trolling": "0.1.7",
"prettier": "3.6.2",
"pretty-bytes": "5.3.0",
"pretty-ms": "7.0.0",
"random-seed": "0.3.0",
"react": "19.0.0",
"react-builtin": "npm:react@19.3.0-canary-ff8f88fc-20260915",
"react-dom": "19.0.0",
"react-dom-builtin": "npm:react-dom@19.3.0-canary-ff8f88fc-20260915",
"react-dom-experimental-builtin": "npm:react-dom@0.0.0-experimental-ff8f88fc-20260915",
"react-experimental-builtin": "npm:react@0.0.0-experimental-ff8f88fc-20260915",
"react-is-builtin": "npm:react-is@19.3.0-canary-ff8f88fc-20260915",
"react-server-dom-turbopack": "npm:react-server-dom-turbopack@19.3.0-canary-ff8f88fc-20260915",
"react-server-dom-turbopack-experimental": "npm:react-server-dom-turbopack@0.0.0-experimental-ff8f88fc-20260915",
"react-server-dom-webpack": "npm:react-server-dom-webpack@19.3.0-canary-ff8f88fc-20260915",
"react-server-dom-webpack-experimental": "npm:react-server-dom-webpack@0.0.0-experimental-ff8f88fc-20260915",
"react-ssr-prepass": "1.0.8",
"react-virtualized": "9.22.3",
"request-promise-core": "1.1.2",
"resolve-from": "5.0.0",
"sass": "1.54.0",
"satori": "0.29.0",
"scheduler-builtin": "npm:scheduler@0.28.0-canary-ff8f88fc-20260915",
"scheduler-experimental-builtin": "npm:scheduler@0.0.0-experimental-ff8f88fc-20260915",
"seedrandom": "3.0.5",
"semver": "7.3.7",
"serve-handler": "6.1.6",
"shell-quote": "1.7.3",
"strip-ansi": "6.0.0",
"styled-jsx": "5.1.6",
"styled-jsx-plugin-postcss": "3.0.2",
"swr": "^2.2.4",
"tailwindcss": "3.2.7",
"taskr": "1.1.0",
"tree-kill": "1.2.2",
"tsx": "4.19.2",
"turbo": "2.9.4",
"typescript": "6.0.2",
"typescript-eslint": "8.46.0",
"unfetch": "4.2.0",
"wait-port": "0.2.2",
"webpack": "5.98.0",
"webpack-bundle-analyzer": "4.7.0",
"webpack-dev-server": "5.2.0",
"whatwg-fetch": "3.0.0",
"ws": "8.2.3",
"yargs": "16.2.0"
},
"engines": {
"node": ">=20.9.0"
},
"packageManager": "pnpm@10.33.0",
"pnpm": {
"overrides": {
"postcss": "8.5.23",
"webpack": "5.98.0",
"browserslist": "4.28.1",
"caniuse-lite": "1.0.30001746",
"@types/node": "20.17.7",
"@babel/core": "7.26.10",
"@babel/parser": "7.27.0",
"@babel/types": "7.27.0",
"@babel/traverse": "7.27.0",
"@types/react": "19.2.18",
"@types/react-dom": "19.2.4",
"@types/retry": "0.12.0",
"jest-snapshot": "30.0.0-alpha.6",
"react": "npm:react@19.3.0-canary-ff8f88fc-20260915",
"react-dom": "npm:react-dom@19.3.0-canary-ff8f88fc-20260915",
"react-is": "npm:react-is@19.3.0-canary-ff8f88fc-20260915",
"scheduler": "npm:scheduler@0.28.0-canary-ff8f88fc-20260915"
},
"packageExtensions": {
"eslint-plugin-react-hooks@0.0.0-experimental-6de32a5a-20250822": {
"dependencies": {
"@babel/plugin-proposal-private-methods": "^7.18.6"
}
}
},
"patchedDependencies": {
"webpack-sources@3.2.3": "patches/webpack-sources@3.2.3.patch",
"stacktrace-parser@0.1.10": "patches/stacktrace-parser@0.1.10.patch",
"taskr@1.1.0": "patches/taskr@1.1.0.patch",
"minizlib@3.1.0": "patches/minizlib@3.1.0.patch",
"@rspack/core@1.6.7": "patches/@rspack__core@1.6.7.patch",
"@modelcontextprotocol/sdk": "patches/@modelcontextprotocol__sdk.patch",
"@vercel/blob": "patches/@vercel__blob.patch",
"postcss-scss": "patches/postcss-scss.patch",
"playwright-core@1.61.0": "patches/playwright-core@1.61.0.patch",
"@types/node@20.17.7": "patches/@types__node@20.17.7.patch",
"@vercel/agent-eval@2.2.1": "patches/@vercel__agent-eval@2.2.1.patch"
}
}
}