{"record":{"id":"673050e096fe56bb","repo":"vercel/turborepo","slug":"package-manager-already-in-use","errorCode":"package_manager-already_in_use","errorMessage":"You are already using this package manager","messagePattern":"You are already using this package manager","errorType":"exception","errorClass":"ConvertError","httpStatus":null,"severity":"warning","filePath":"packages/turbo-workspaces/src/convert.ts","lineNumber":41,"sourceCode":"*/\nexport async function convertProject({\n  project,\n  convertTo,\n  logger,\n  options\n}: {\n  project: Project;\n  convertTo: RequestedPackageManagerDetails;\n  logger: Logger;\n  options?: Options;\n}) {\n  logger.header(\n    `Converting project from ${project.packageManager} to ${convertTo.name}.`\n  );\n\n  if (!options?.ignoreUnchangedPackageManager) {\n    if (project.packageManager === convertTo.name) {\n      throw new ConvertError(\"You are already using this package manager\", {\n        type: \"package_manager-already_in_use\"\n      });\n    }\n\n    if (!convertTo.version) {\n      throw new ConvertError(\n        `${convertTo.name} is not installed, or could not be located`,\n        {\n          type: \"package_manager-could_not_be_found\"\n        }\n      );\n    }\n  }\n\n  // this cast is safe since we've just verified that the version exists above\n  const to = convertTo as AvailablePackageManagerDetails;\n\n  // remove old workspace data","sourceCodeStart":23,"sourceCodeEnd":59,"githubUrl":"https://github.com/vercel/turborepo/blob/9f94a7d215b3881942527dd526afa3fc650869d5/packages/turbo-workspaces/src/convert.ts#L23-L59","documentation":"convertProject() (the turbo-workspaces package manager conversion engine) refuses no-op conversions: if the detected project manager equals the target and options.ignoreUnchangedPackageManager is not set, it throws ConvertError type package_manager-already_in_use before modifying anything.","triggerScenarios":"Calling convertProject({ project, convertTo }) with convertTo.name === project.packageManager (e.g. converting a pnpm project to pnpm) without passing { ignoreUnchangedPackageManager: true } in options.","commonSituations":"Automation that converts based on a config value that already matches; re-running a conversion that partially succeeded earlier; CLIs defaulting the target to the current manager.","solutions":["Skip the conversion when target equals the detected manager — check project.packageManager before calling","If you truly want to re-run create/install steps for the same manager, pass options.ignoreUnchangedPackageManager: true","If detection picked the wrong manager (stale packageManager field or lockfile), fix package.json devEngines.packageManager/packageManager or the lockfile, then retry"],"exampleFix":"// before\nawait convertProject({ project, convertTo: { name: 'pnpm', version: '9.0.0' }, logger }); // project is already pnpm\n\n// after\nif (project.packageManager === 'pnpm') {\n  logger.log('Already on pnpm — nothing to do');\n} else {\n  await convertProject({ project, convertTo, logger });\n}","handlingStrategy":"validation","validationCode":"if (project.packageManager === convertTo.name && !options?.ignoreUnchangedPackageManager) {\n  logger.log(`Already using ${convertTo.name}; skipping conversion.`);\n} else {\n  await convertProject({ project, convertTo, logger, options });\n}","typeGuard":"function isNoOpConversion(project: Project, target: string): boolean {\n  return project.packageManager === target;\n}","tryCatchPattern":"try {\n  await convertProject({ project, convertTo, logger });\n} catch (e) {\n  if (e instanceof ConvertError && e.type === \"package_manager-already_in_use\") {\n    // benign no-op: report and continue\n  } else throw e;\n}","preventionTips":["Compare detected vs target manager before invoking conversion","Only pass ignoreUnchangedPackageManager when you truly want re-install side effects","Keep ConvertError.type checks (not message matching) in automation for stable routing"],"tags":["package-manager","conversion","no-op","turbo-workspaces"],"backgroundTag":"package-manager-already-in-use","analyzedSha":"9f94a7d215b3881942527dd526afa3fc650869d5","analyzedAt":"2026-08-16T19:47:29.531Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}