angular/angular-cli · warning
The installed Angular CLI version is outdated. Installing a
Error message
The installed Angular CLI version is outdated.
Installing a temporary Angular CLI versioned ${cliVersionToInstall} to perform the update. What it means
During `ng update`, cliVersionToInstall determines that the currently installed Angular CLI is too old to perform the update migrations. The CLI warns and instead installs a temporary newer @angular/cli (at the computed version) and re-executes the update through its binary via runTempBinary.
Source
Thrown at packages/angular/cli/src/commands/update/cli.ts:179
})
.strict();
}
async run(options: Options<UpdateCommandArgs>): Promise<number | void> {
const { logger, packageManager } = this.context;
// Check if the current installed CLI version is older than the latest compatible version.
// Skip when running `ng update` without a package name as this will not trigger an actual update.
if (!disableVersionCheck && options.packages?.length) {
const cliVersionToInstall = await checkCLIVersion(
options.packages,
logger,
packageManager,
options.next,
);
if (cliVersionToInstall) {
logger.warn(
'The installed Angular CLI version is outdated.\n' +
`Installing a temporary Angular CLI versioned ${cliVersionToInstall} to perform the update.`,
);
return runTempBinary(
`@angular/cli@${cliVersionToInstall}`,
packageManager,
process.argv.slice(2),
);
}
}
const packages: npa.Result[] = [];
for (const request of options.packages ?? []) {
try {
const packageIdentifier = npa(request);
// only registry identifiers are supportedView on GitHub (pinned to bb72145f9a)
Solutions
- No action needed: the CLI transparently installs a temporary CLI and continues the update.
- To avoid the temporary install, first update the CLI itself: `ng update @angular/cli` then update the framework.
- Ensure your package manager (npm/yarn/pnpm/bun) can download @angular/cli@<version> from the registry (network/proxy access).
- Update in single-major steps (`ng update @angular/core@16 @angular/cli@16`, etc.) to keep the local CLI adequate at each step.
Example fix
// before ng update @angular/core@19 # installed CLI is v15 // after gn update stepwise: ng update @angular/cli@16 @angular/core@16 ng update @angular/cli@17 @angular/core@17 # ... until target version
Defensive patterns
Strategy: validation
Validate before calling
import { execSync } from 'node:child_process';
const cliVer = JSON.parse(execSync('npm ls @angular/cli --json').toString()).dependencies['@angular/cli'].version;
const major = parseInt(cliVer.split('.')[0], 10);
const target = parseInt(process.env.TARGET_MAJOR!, 10);
if (major < target) console.warn(`Installed CLI v${major} is behind target v${target}; a temporary CLI will be installed`); Try / catch
try {
await ngUpdate(['@angular/core@19']);
} catch (e) {
if (String(e.message).includes('temporary Angular CLI')) {
// ensure registry access for @angular/cli@<ver> then retry
}
} Prevention
- Update @angular/cli and @angular/core together at each major.
- Upgrade one major at a time instead of skipping several.
- Ensure package manager can reach the npm registry for temporary installs.
- Keep CLI version pinned in lockfile so it stays in sync with the framework.
When it happens
Trigger: Running `ng update @angular/core@<newer-major>` (or with --next) when the locally installed @angular/cli version is lower than the version required to run the target's migrations; checkCLIVersion/cliVersionToInstall returns a version to install.
Common situations: Skipping multiple major versions (e.g., updating from v15 to v19); projects where the CLI was not updated alongside the framework; using --next to jump to a pre-release.
Related errors
- Could not find @angular/cli version '${runnerVersion}'.
- Failed to look up hash of most recent commit, continuing a
- An unexpected error happened; could not determine version fo
- An unexpected error happened; package ${name} has no version
- Package ${JSON.stringify(pkgName)} is not in package.json.
AI-assisted analysis of angular/angular-cli@bb72145f9a (2026-08-30).
Data as JSON: /api/errors/efd6718fa5c14de4.
Report an issue: GitHub.