angular/angular-cli · error · UnknownPackageManagerException

Unknown package manager "${packageManagerName}".

Error message

Unknown package manager "${packageManagerName}".

What it means

The NodePackage task executor factory resolves a profile from its packageManagers map (default 'npm'). If factoryOptions.packageManager names an unsupported manager, it throws UnknownPackageManagerException at task creation time.

Source

Thrown at packages/angular_devkit/schematics/tasks/package-manager/executor.ts:62

      installAll: 'install',
      installPackage: 'install',
    },
  },
};

export class UnknownPackageManagerException extends BaseException {
  constructor(name: string) {
    super(`Unknown package manager "${name}".`);
  }
}

export default function (
  factoryOptions: NodePackageTaskFactoryOptions = {},
): TaskExecutor<NodePackageTaskOptions> {
  const packageManagerName = factoryOptions.packageManager || 'npm';
  const packageManagerProfile = packageManagers[packageManagerName];
  if (!packageManagerProfile) {
    throw new UnknownPackageManagerException(packageManagerName);
  }

  const rootDirectory = factoryOptions.rootDirectory || process.cwd();

  return (options: NodePackageTaskOptions = { command: 'install' }) => {
    let taskPackageManagerProfile = packageManagerProfile;
    let taskPackageManagerName = packageManagerName;
    if (factoryOptions.allowPackageManagerOverride && options.packageManager) {
      taskPackageManagerProfile = packageManagers[options.packageManager];
      if (!taskPackageManagerProfile) {
        throw new UnknownPackageManagerException(options.packageManager);
      }
      taskPackageManagerName = options.packageManager;
    }

    const bufferedOutput: { stream: NodeJS.WriteStream; data: Buffer }[] = [];
    const spawnOptions: SpawnOptions = {
      shell: true,

View on GitHub (pinned to bb72145f9a)

Solutions

  1. Use a supported value: 'npm', 'yarn', 'pnpm' (check the version's packageManagers map)
  2. Fix typos in the packageManager option or workspace configuration
  3. Upgrade @angular-devkit/schematics / Angular CLI to a version that supports your package manager
  4. Omit factoryOptions.packageManager to fall back to the default ('npm')

Example fix

// before
createPackageManagerTask({ packageManager: 'bun' }); // unknown
// after
createPackageManagerTask({ packageManager: 'pnpm' }); // supported profile
Defensive patterns

Strategy: validation

Validate before calling

const supported = ['npm', 'yarn', 'pnpm']; // matches devkit packageManagers map
if (!supported.includes(factoryOptions.packageManager ?? 'npm')) {
  throw new Error(`Unsupported package manager: ${factoryOptions.packageManager}`);
}

Type guard

type PackageManager = 'npm' | 'yarn' | 'pnpm';
function isPackageManager(v: unknown): v is PackageManager {
  return v === 'npm' || v === 'yarn' || v === 'pnpm';
}

Try / catch

try {
  const executor = packageTaskFactory({ packageManager });
} catch (e) {
  if (/Unknown package manager/.test(String(e))) {
    return packageTaskFactory(); // default npm
  } else throw e;
}

Prevention

When it happens

Trigger: Calling createTaskExecutor/createPackageManagerTask with factoryOptions.packageManager set to a string not in the map (e.g. 'bun', 'pnpm@8', a typo like 'npn') when the installed schematics version lacks that profile.

Common situations: Custom builders/schematics passing through a repo-configured package manager that the toolchain version predates; typos in angular.json or workspace config; forcing a manager via factory options in older CLI versions.

Related errors


AI-assisted analysis of angular/angular-cli@bb72145f9a (2026-08-30). Data as JSON: /api/errors/9a6e64a65fdc81e9. Report an issue: GitHub.