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 dataView on GitHub (pinned to 9f94a7d215)
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
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
- 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
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
- package_manager-could_not_be_found
- package_manager-unsupported_version
- bun-workspace_glob_error
- Unable to update README.md
- invalid_directory
AI-assisted analysis of vercel/turborepo@9f94a7d215 (2026-08-16).
Data as JSON: /api/errors/673050e096fe56bb.
Report an issue: GitHub.