vercel/turborepo · warning · ConvertError

package_manager-already_in_use

package_manager-already_in_use

Error message

You are already using this package manager

What it means

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.

Source

Thrown at packages/turbo-workspaces/src/convert.ts:41

*/
export async function convertProject({
  project,
  convertTo,
  logger,
  options
}: {
  project: Project;
  convertTo: RequestedPackageManagerDetails;
  logger: Logger;
  options?: Options;
}) {
  logger.header(
    `Converting project from ${project.packageManager} to ${convertTo.name}.`
  );

  if (!options?.ignoreUnchangedPackageManager) {
    if (project.packageManager === convertTo.name) {
      throw new ConvertError("You are already using this package manager", {
        type: "package_manager-already_in_use"
      });
    }

    if (!convertTo.version) {
      throw new ConvertError(
        `${convertTo.name} is not installed, or could not be located`,
        {
          type: "package_manager-could_not_be_found"
        }
      );
    }
  }

  // this cast is safe since we've just verified that the version exists above
  const to = convertTo as AvailablePackageManagerDetails;

  // remove old workspace data

View on GitHub (pinned to 9f94a7d215)

Solutions

  1. Skip the conversion when target equals the detected manager — check project.packageManager before calling
  2. If you truly want to re-run create/install steps for the same manager, pass options.ignoreUnchangedPackageManager: true
  3. If detection picked the wrong manager (stale packageManager field or lockfile), fix package.json devEngines.packageManager/packageManager or the lockfile, then retry

Example fix

// before
await convertProject({ project, convertTo: { name: 'pnpm', version: '9.0.0' }, logger }); // project is already pnpm

// after
if (project.packageManager === 'pnpm') {
  logger.log('Already on pnpm — nothing to do');
} else {
  await convertProject({ project, convertTo, logger });
}
Defensive patterns

Strategy: validation

Validate before calling

if (project.packageManager === convertTo.name && !options?.ignoreUnchangedPackageManager) {
  logger.log(`Already using ${convertTo.name}; skipping conversion.`);
} else {
  await convertProject({ project, convertTo, logger, options });
}

Type guard

function isNoOpConversion(project: Project, target: string): boolean {
  return project.packageManager === target;
}

Try / catch

try {
  await convertProject({ project, convertTo, logger });
} catch (e) {
  if (e instanceof ConvertError && e.type === "package_manager-already_in_use") {
    // benign no-op: report and continue
  } else throw e;
}

Prevention

When it happens

Trigger: Calling convertProject({ project, convertTo }) with convertTo.name === project.packageManager (e.g. converting a pnpm project to pnpm) without passing { ignoreUnchangedPackageManager: true } in options.

Common situations: 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.

Related errors


AI-assisted analysis of vercel/turborepo@9f94a7d215 (2026-08-16). Data as JSON: /api/errors/673050e096fe56bb. Report an issue: GitHub.