{"record":{"id":"44d6a1cc09234bb8","repo":"vercel/next.js","slug":"could-not-determine-the-installed-next-js-version","errorCode":null,"errorMessage":"Could not determine the installed Next.js version.","messagePattern":"Could not determine the installed Next\\.js version\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/next/src/lib/upgrade/prepare-upgrade.ts","lineNumber":44,"sourceCode":"    targetRequest !== 'latest' &&\n    targetRequest !== 'future'\n  ) {\n    throw new Error(\n      `Unsupported AI upgrade type ${JSON.stringify(targetRequest)}. Expected \"security\", \"latest\", or \"future\".`\n    )\n  }\n\n  // Resolve from the app: the invoking canary is only the upgrade tooling.\n  const requireFromApp = createRequire(join(directory, 'package.json'))\n  const installedNext = JSON.parse(\n    await readFile(requireFromApp.resolve('next/package.json'), 'utf8')\n  ) as {\n    version: string\n  }\n  const installedVersion = installedNext.version\n\n  if (!semver.valid(installedVersion)) {\n    throw new Error('Could not determine the installed Next.js version.')\n  }\n\n  // TODO: Handle prereleases\n  if (semver.prerelease(installedVersion)) {\n    throw new Error(\n      'AI upgrades are not available for prerelease versions of Next.js yet.'\n    )\n  }\n\n  if (targetRequest === 'latest' || targetRequest === 'future') {\n    const url = `${NPM_REGISTRY}next/latest`\n    const { value } = await fetchJSON(url)\n    const release = value as { version: string } | null\n\n    if (\n      !release ||\n      !semver.valid(release.version) ||\n      semver.prerelease(release.version)","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/vercel/next.js/blob/34433fd12ee8074ea3f47af9f36255c7390d0301/packages/next/src/lib/upgrade/prepare-upgrade.ts#L26-L62","documentation":"prepareUpgrade resolves the app's own next/package.json via createRequire from the app directory and reads its version. If that version string is not valid semver, the CLI cannot compute upgrade targets or compare advisory ranges, so it throws rather than guessing.","triggerScenarios":"next is installed with a non-semver version field (git dependency, file: link to a source checkout, npm alias with altered metadata, corrupted node_modules).","commonSituations":"Installing next from a git URL or a patched tarball whose package.json version was edited (e.g. '0.0.0-local'); pnpm overrides replacing version metadata; partially deleted node_modules.","solutions":["Install a published next release: npm i next@latest (or a pinned stable version)","Check the installed version: node -e \"console.log(require('next/package.json').version)\" and ensure it is valid semver","If using a fork/local build, give it a valid semver version field","Clear node_modules and reinstall to repair a corrupted install"],"exampleFix":"// before (package.json)\n\"next\": \"github:vercel/next.js#canary\"\n// after\n\"next\": \"^15.0.0\"","handlingStrategy":"validation","validationCode":"const semver = require('semver')\nconst v = require('next/package.json').version\nif (!semver.valid(v)) console.error('Installed next version is not valid semver:', v)","typeGuard":null,"tryCatchPattern":"try {\n  await prepareUpgrade(dir, 'latest')\n} catch (e) {\n  if (e.message.includes('installed Next.js version')) {\n    // reinstall a published next release\n  }\n}","preventionTips":["Avoid git/file/link installs of next in apps you intend to AI-upgrade","Keep fork versions valid semver","Reinstall node_modules if version metadata looks corrupted"],"tags":["nextjs","upgrade","semver","dependency"],"backgroundTag":"invalid-argument-format","analyzedSha":"34433fd12ee8074ea3f47af9f36255c7390d0301","analyzedAt":"2026-09-20T18:20:20.576Z","contentChangedAt":"2026-09-20T18:20:20.576Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}