# angular-cli: what changed from 21 to 22 - Product: angular-cli (https://whatsnew.fyi/product/angular-cli) - Vendor: angular-cli - Range: changelog entries numbered after v21.2.23 up to and including v22.1.7, stable releases only - Entries below: 13 releases (newest first) - Resolved: 21 is v21.2.23 and 22 is v22.1.7, the newest stable release of each major we track - Carrying security changes: 1 · CVEs mentioned: 0 · Mentioning breaking changes: 0 · Removing or deprecating something: 1 - Page: https://whatsnew.fyi/product/angular-cli/compare/21...22 What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## What changed (97 changes, grouped by kind) ### Added #### v22.1.0 (2026-07-29) - update ai-config to include Angular MCP server config - add built-in SQLite cache store fallback - emit debug ids for stable subresource integrity hashes - enable chunk optimization for server builds - migrate advanced optimization Babel plugins to oxc-parser and magic-string - migrate i18n inliner to oxc-parser and magic-string - share persistent build cache across git worktrees - support the standard Forwarded header ### Changed #### v22.1.6 (2026-08-26) - Batch prerender routes and share in-memory server bundles #### v22.1.5 (2026-08-19) - Traverse AST with iterative post-order walker in i18n inliner #### v22.1.4 (2026-08-13) - avoid eager module loading during global bootstrap - avoid encoding the inline source map before remapping - batch last_accessed updates in sqlite cache store - hash the i18n inline cache key options once per locale - optimize template string size calculation in server manifest - share i18n translations with the inliner workers by reference - use Map for chunk asset size lookups in budget calculator #### v22.1.3 (2026-08-05) - release build resources early in non-watch mode - avoid buffering request body when sanitizing headers #### v22.0.8 (2026-07-23) - skip semantic affected-file walk when type checking is disabled ### Fixed #### v22.1.7 (2026-09-02) - isolate temporary package installations from parent Yarn workspace - add splitting option to unit-test builder - enable code splitting for vitest browser tests - fail build and exclude routes when prerendering fails - keep dev-server Vite cache worktree-local - preserve binary values in the SQLite cache store - decode pathname when constructing server asset path - ensure public directory containment in CommonEngine #### v22.1.6 (2026-08-26) - Ignore side-effect annotations in unit test builds - Abort web request signal when node request is aborted #### v22.1.5 (2026-08-19) - Transform fail() to expect.fail() in refactor-jasmine-vitest - Enforce MCP roots in get_best_practices tool - Handle errors from isAllowedWorkspacePath in best-practices tool - Throw on out-of-roots workspace in best-practices tool - Correct misleading error message for top-level await - Disable code splitting for unit test builds - Preserve integrity and crossorigin in autoCsp loader #### v22.1.4 (2026-08-13) - generate CLAUDE.md for Claude Code instead of AGENTS.md - import UrlSegment instead of subPath in guard generator - disable searching current directory for bare executable names on Windows - serialize configuration as a single argv token in run_target strategies - count statically imported chunks in the initial total - normalize setupFiles paths to POSIX for vitest runner - prevent syntax corruption for Crockford-style enum IIFE - prevent syntax corruption in oxc transform - return direct file contents for non-Angular TypeScript files - return only lowest version per target engine - set target for Rolldown dependency prebundling in Vite dev server - destroy platform when response stream is cancelled #### v22.1.3 (2026-08-05) - always install package during ng add to inspect manifest on disk for schematics - correctly report available package updates during bare ng update - discover migrations from installed packages when omitted by registry metadata - normalize Windows drive-letter casing for process.cwd - prevent build process hang on unhandled error - retain watch files on error in load result cache - support case-insensitive and alternative license file names - settle writeResponseToNodeResponse when client disconnects #### v22.1.2 (2026-07-30) - add packages with built-in schematics to devDependencies only - prevent IIFE wrapper interleaving for adjacent classes in minified files #### v22.1.1 (2026-07-30) - support npm 12 metadata array and error formats - rewrite paths from sandboxed execroots when running under Bazel #### v22.1.0 (2026-07-29) - abort and guide manual mitigation when updating catalog packages - prevent Yarn registry environment variable override - remove algoliasearch dependency and support latest docs versions - resolve correct registry name when using npm alias syntax during update - respect client-side release age settings during update resolution - revert package.json changes if installation tasks fail during update - robustly parse npm manifest from array - remove unused spec tsconfig outDir - add bounded timeout to vitest executor disposal - anchor debug ID comment matching and make injection idempotent - prevent esbuild service hang on internal component stylesheet builds #### v22.0.9 (2026-07-29) - declare devserver_start and devserver_stop as isReadOnly:false - safeguard Karma builder stream controller against closed state #### v22.0.8 (2026-07-23) - batch Prettier invocations during migration formatting - update MCP devserver tool names to conform to spec regex - canonicalize drive letter casing for workspace root on Windows - ensure import map integrity keys are valid URL-like specifiers - favor istanbul coverage provider when browser testing is enabled - preserve custom config options in runnerConfig for vitest - remap metafile paths when workspace root is a symlink or junction #### v22.0.7 (2026-07-15) - copy packageManager field and yarn config for temp installs - support resolving subproject dependencies in pnpm workspaces #### v22.0.6 (2026-07-09) - fallback to build target preserveSymlinks option in karma runner - prevent externalizing builder-injected i18n locale data - strip all vite id prefixes from minified code with external dependencies - replace all route parameters when resolving relative redirects #### v22.0.5 (2026-07-01) - Remove unused app tsconfig outDir - Gracefully handle package manager errors in command handler - Respect release age policy in update bootstrapping logic - Auto-inject localize/init in library unit tests - Inherit preserveSymlinks option from build target in unit-test builder - Load zone.js dynamically for library unit tests - Scope createRequire module resolution using paths to prevent parent paths - Preserve response headers during redirect ### Deprecated #### v22.1.0 (2026-07-29) - stringToFileBuffer and fileBufferToString are deprecated; use standard Web APIs (TextEncoder and TextDecoder) instead ### Security #### v22.0.5 (2026-07-01) - Prevent OS command injection in ssr-dev-server builder ## Release notes ### v22.1.7 — 22.1.7 - Date: 2026-09-02 - Version: v22.1.7 - Original notes: https://github.com/angular/angular-cli/releases/tag/v22.1.7 - Permalink: https://whatsnew.fyi/product/angular-cli/releases/v22.1.7 - **fixed** — isolate temporary package installations from parent Yarn workspace - **fixed** — add splitting option to unit-test builder - **fixed** — enable code splitting for vitest browser tests - **fixed** — fail build and exclude routes when prerendering fails - **fixed** — keep dev-server Vite cache worktree-local - **fixed** — preserve binary values in the SQLite cache store - **fixed** — decode pathname when constructing server asset path - **fixed** — ensure public directory containment in CommonEngine ###### @angular/cli | Commit | Description | | -- | -- | | [![fix - e9db85c0f](https://img.shields.io/badge/e9db85c0f-fix-green)](https://github.com/angular/angular-cli/commit/e9db85c0f5ef0aa0c67d2b8d90b872307af39822) | isolate temporary package installations from parent Yarn workspace | ###### @angular/build | Commit | Description | | -- | -- | | [![fix - 1c9b1af61](https://img.shields.io/badge/1c9b1af61-fix-green)](https://github.com/angular/angular-cli/commit/1c9b1af61115764e0be55f5a1ed9a9967c191a74) | add splitting option to unit-test builder | | [![fix - 4b861f458](https://img.shields.io/badge/4b861f458-fix-green)](https://github.com/angular/angular-cli/commit/4b861f458c8c789a5276f7b591bebd28e2080444) | enable code splitting for vitest browser tests | | [![fix - f1fd82381](https://img.shields.io/badge/f1fd82381-fix-green)](https://github.com/angular/angular-cli/commit/f1fd823814b5e3620838beb423d5f33600c2e546) | fail build and exclude routes when prerendering fails | | [![fix - a84906fe3](https://img.shields.io/badge/a84906fe3-fix-green)](https://github.com/angular/angular-cli/commit/a84906fe393e8c2dee978c02631af20e93627df1) | keep dev-server Vite cache worktree-local | | [![fix - fcf883ef1](https://img.shields.io/badge/fcf883ef1-fix-green)](https://github.com/angular/angular-cli/commit/fcf883ef166dc2e34d86007c0fcdfad1d0434c86) | preserve binary values in the SQLite cache store | ###### @angular/ssr | Commit | Description | | -- | -- | | [![fix - baf1ca189](https://img.shields.io/badge/baf1ca189-fix-green)](https://github.com/angular/angular-cli/commit/baf1ca189dcf1ab0e55ac853c80f892dbd1864e4) | decode pathname when constructing server asset path | | [![fix - 70748ca8e](https://img.shields.io/badge/70748ca8e-fix-green)](https://github.com/angular/angular-cli/commit/70748ca8e76fe4b42798719410336119d943e755) | ensure public directory containment in CommonEngine | ### v22.1.6 — 22.1.6 - Date: 2026-08-26 - Version: v22.1.6 - Original notes: https://github.com/angular/angular-cli/releases/tag/v22.1.6 - Permalink: https://whatsnew.fyi/product/angular-cli/releases/v22.1.6 - **fixed** — Ignore side-effect annotations in unit test builds - **changed** — Batch prerender routes and share in-memory server bundles - **fixed** — Abort web request signal when node request is aborted ###### @angular/build | Commit | Description | | -- | -- | | [![fix - 3f132eaa97](https://img.shields.io/badge/3f132eaa97-fix-green)](https://github.com/angular/angular-cli/commit/3f132eaa97b95e16c58b8095c2566e3c78190446) | ignore side-effect annotations in unit test builds | | [![perf - 5b1028936f](https://img.shields.io/badge/5b1028936f-perf-orange)](https://github.com/angular/angular-cli/commit/5b1028936f6e9582917f95ac37942dca0ee2c659) | batch prerender routes and share in-memory server bundles | ###### @angular/ssr | Commit | Description | | -- | -- | | [![fix - 76818cb811](https://img.shields.io/badge/76818cb811-fix-green)](https://github.com/angular/angular-cli/commit/76818cb811a8fe669575f988fec2e4528dca8c73) | abort web request signal when node request is aborted | ### v22.1.5 — 22.1.5 - Date: 2026-08-19 - Version: v22.1.5 - Original notes: https://github.com/angular/angular-cli/releases/tag/v22.1.5 - Permalink: https://whatsnew.fyi/product/angular-cli/releases/v22.1.5 - **fixed** — Transform fail() to expect.fail() in refactor-jasmine-vitest - **fixed** — Enforce MCP roots in get_best_practices tool - **fixed** — Handle errors from isAllowedWorkspacePath in best-practices tool - **fixed** — Throw on out-of-roots workspace in best-practices tool - **fixed** — Correct misleading error message for top-level await - **fixed** — Disable code splitting for unit test builds - **fixed** — Preserve integrity and crossorigin in autoCsp loader - **changed** — Traverse AST with iterative post-order walker in i18n inliner ###### @schematics/angular | Commit | Description | | -- | -- | | [![fix - ba2b0e4c2](https://img.shields.io/badge/ba2b0e4c2-fix-green)](https://github.com/angular/angular-cli/commit/ba2b0e4c291842c699fdbeaaddec1531dbdd7952) | transform fail() to expect.fail() in refactor-jasmine-vitest | ###### @angular/cli | Commit | Description | | -- | -- | | [![fix - e672271f8](https://img.shields.io/badge/e672271f8-fix-green)](https://github.com/angular/angular-cli/commit/e672271f81e7b8b422b98c17fca5b67896d40844) | enforce MCP roots in get_best_practices tool | | [![fix - a14916cc4](https://img.shields.io/badge/a14916cc4-fix-green)](https://github.com/angular/angular-cli/commit/a14916cc4b13412205d3e4a1c32d7e40be52f0e1) | handle errors from isAllowedWorkspacePath in best-practices tool | | [![fix - d6e1cddff](https://img.shields.io/badge/d6e1cddff-fix-green)](https://github.com/angular/angular-cli/commit/d6e1cddff92842f6889585ae7899efc028decc78) | throw on out-of-roots workspace in best-practices tool | ###### @angular/build | Commit | Description | | -- | -- | | [![fix - cba72902d](https://img.shields.io/badge/cba72902d-fix-green)](https://github.com/angular/angular-cli/commit/cba72902d42022bd5a1bd17b23d65cacc0013e35) | correct misleading error message for top-level await | | [![fix - b4679998c](https://img.shields.io/badge/b4679998c-fix-green)](https://github.com/angular/angular-cli/commit/b4679998c205b6cce01d40fad24c4ee7954aa48d) | disable code splitting for unit test builds | | [![fix - ff1d3565e](https://img.shields.io/badge/ff1d3565e-fix-green)](https://github.com/angular/angular-cli/commit/ff1d3565e87749a8347c3be98cd4a7ebccb69fc0) | preserve integrity and crossorigin in autoCsp loader | | [![perf - 1fc1fb05c](https://img.shields.io/badge/1fc1fb05c-perf-orange)](https://github.com/angular/angular-cli/commit/1fc1fb05cfe2c69ee7b9345b582d3c2177b923fd) | traverse AST with iterative post-order walker in i18n inliner | ### v22.1.4 — 22.1.4 - Date: 2026-08-13 - Version: v22.1.4 - Original notes: https://github.com/angular/angular-cli/releases/tag/v22.1.4 - Permalink: https://whatsnew.fyi/product/angular-cli/releases/v22.1.4 - **fixed** — generate CLAUDE.md for Claude Code instead of AGENTS.md - **fixed** — import UrlSegment instead of subPath in guard generator - **fixed** — disable searching current directory for bare executable names on Windows - **fixed** — serialize configuration as a single argv token in run_target strategies - **changed** — avoid eager module loading during global bootstrap - **fixed** — count statically imported chunks in the initial total - **fixed** — normalize setupFiles paths to POSIX for vitest runner - **fixed** — prevent syntax corruption for Crockford-style enum IIFE - **fixed** — prevent syntax corruption in oxc transform - **fixed** — return direct file contents for non-Angular TypeScript files - **fixed** — return only lowest version per target engine - **fixed** — set target for Rolldown dependency prebundling in Vite dev server - **changed** — avoid encoding the inline source map before remapping - **changed** — batch last_accessed updates in sqlite cache store - **changed** — hash the i18n inline cache key options once per locale - **changed** — optimize template string size calculation in server manifest - **changed** — share i18n translations with the inliner workers by reference - **changed** — use Map for chunk asset size lookups in budget calculator - **fixed** — destroy platform when response stream is cancelled ###### @schematics/angular | Commit | Description | | -- | -- | | [![fix - d4a48e3ab](https://img.shields.io/badge/d4a48e3ab-fix-green)](https://github.com/angular/angular-cli/commit/d4a48e3abe320e090eefe17cb70abdf8e7eafaed) | generate CLAUDE.md for Claude Code instead of AGENTS.md | | [![fix - d451f15b2](https://img.shields.io/badge/d451f15b2-fix-green)](https://github.com/angular/angular-cli/commit/d451f15b2838a8282363dcb30161dd5dc858750f) | import UrlSegment instead of subPath in guard generator | ###### @angular/cli | Commit | Description | | -- | -- | | [![fix - 67a29899b](https://img.shields.io/badge/67a29899b-fix-green)](https://github.com/angular/angular-cli/commit/67a29899b07f760bac9582cbc6175966cce1c5d2) | disable searching current directory for bare executable names on Windows | | [![fix - 1b0ba5c17](https://img.shields.io/badge/1b0ba5c17-fix-green)](https://github.com/angular/angular-cli/commit/1b0ba5c17f0be2679b31bad1bee8b435315dac1a) | serialize configuration as a single argv token in run_target strategies (#33657) | | [![perf - 9440432d2](https://img.shields.io/badge/9440432d2-perf-orange)](https://github.com/angular/angular-cli/commit/9440432d273c044965508d80e808c2fe123af0aa) | avoid eager module loading during global bootstrap | ###### @angular/build | Commit | Description | | -- | -- | | [![fix - 46fcb29d6](https://img.shields.io/badge/46fcb29d6-fix-green)](https://github.com/angular/angular-cli/commit/46fcb29d6c1ded962de95449d63716c13950f59a) | count statically imported chunks in the initial total | | [![fix - 796b57684](https://img.shields.io/badge/796b57684-fix-green)](https://github.com/angular/angular-cli/commit/796b576843191a4d5c74e4f9363ec0e46ae3a881) | normalize setupFiles paths to POSIX for vitest runner | | [![fix - c805e5cfb](https://img.shields.io/badge/c805e5cfb-fix-green)](https://github.com/angular/angular-cli/commit/c805e5cfb308d02a1944ef446d0a01af8a7ec6d2) | prevent syntax corruption for Crockford-style enum IIFE | | [![fix - cc6c17716](https://img.shields.io/badge/cc6c17716-fix-green)](https://github.com/angular/angular-cli/commit/cc6c17716df5c411efca5e6f4c960f0565f45d90) | prevent syntax corruption in oxc transform | | [![fix - a142f6f83](https://img.shields.io/badge/a142f6f83-fix-green)](https://github.com/angular/angular-cli/commit/a142f6f83d2f501b64f2404909ef9325bbfa70fb) | return direct file contents for non-Angular TypeScript files | | [![fix - 956c6578d](https://img.shields.io/badge/956c6578d-fix-green)](https://github.com/angular/angular-cli/commit/956c6578d31d8482c04dc45723d7ab3b4fe355a5) | return only lowest version per target engine | | [![fix - 689b5b116](https://img.shields.io/badge/689b5b116-fix-green)](https://github.com/angular/angular-cli/commit/689b5b116717140da98494e61ac5ea5ad7b68d73) | set target for Rolldown dependency prebundling in Vite dev server | | [![perf - 70461f6ed](https://img.shields.io/badge/70461f6ed-perf-orange)](https://github.com/angular/angular-cli/commit/70461f6ed2e30aeaad2b93400ad00d9274665967) | avoid encoding the inline source map before remapping | | [![perf - 22cce7563](https://img.shields.io/badge/22cce7563-perf-orange)](https://github.com/angular/angular-cli/commit/22cce7563e82f17373b69e590d3e445767bd9264) | batch last_accessed updates in sqlite cache store | | [![perf - ab2ed18d5](https://img.shields.io/badge/ab2ed18d5-perf-orange)](https://github.com/angular/angular-cli/commit/ab2ed18d5739e8565403062ca74aa2d5cb3b95ec) | hash the i18n inline cache key options once per locale | | [![perf - 34516ff73](https://img.shields.io/badge/34516ff73-perf-orange)](https://github.com/angular/angular-cli/commit/34516ff736185e20ef8239b1fed8eda1f0193f62) | optimize template string size calculation in server manifest | | [![perf - 712971c37](https://img.shields.io/badge/712971c37-perf-orange)](https://github.com/angular/angular-cli/commit/712971c370738beaebff18f6995859b1713ed8ae) | share i18n translations with the inliner workers by reference | | [![perf - 78f8c5f _[Truncated at 4000 characters — full notes: https://github.com/angular/angular-cli/releases/tag/v22.1.4]_ ### v22.1.3 — 22.1.3 - Date: 2026-08-05 - Version: v22.1.3 - Original notes: https://github.com/angular/angular-cli/releases/tag/v22.1.3 - Permalink: https://whatsnew.fyi/product/angular-cli/releases/v22.1.3 - **fixed** — always install package during ng add to inspect manifest on disk for schematics - **fixed** — correctly report available package updates during bare ng update - **fixed** — discover migrations from installed packages when omitted by registry metadata - **fixed** — normalize Windows drive-letter casing for process.cwd - **fixed** — prevent build process hang on unhandled error - **fixed** — retain watch files on error in load result cache - **fixed** — support case-insensitive and alternative license file names - **changed** — release build resources early in non-watch mode - **fixed** — settle writeResponseToNodeResponse when client disconnects - **changed** — avoid buffering request body when sanitizing headers ###### @angular/cli | Commit | Description | | -- | -- | | [![fix - f837b788c6](https://img.shields.io/badge/f837b788c6-fix-green)](https://github.com/angular/angular-cli/commit/f837b788c6a23e7661db5455192f5a84d20e9b37) | always install package during ng add to inspect manifest on disk for schematics (#33718) | | [![fix - 72ae93638d](https://img.shields.io/badge/72ae93638d-fix-green)](https://github.com/angular/angular-cli/commit/72ae93638dd83b3877773ac0d9f7e4c4e9056a33) | correctly report available package updates during bare ng update | | [![fix - a949e06568](https://img.shields.io/badge/a949e06568-fix-green)](https://github.com/angular/angular-cli/commit/a949e0656855786e4274159be09242ff9c4eb012) | discover migrations from installed packages when omitted by registry metadata (#33718) | | [![fix - 1d9122fd50](https://img.shields.io/badge/1d9122fd50-fix-green)](https://github.com/angular/angular-cli/commit/1d9122fd50f8a9b82199d44f9b0e075726279538) | normalize Windows drive-letter casing for process.cwd | ###### @angular/build | Commit | Description | | -- | -- | | [![fix - a4860d505a](https://img.shields.io/badge/a4860d505a-fix-green)](https://github.com/angular/angular-cli/commit/a4860d505aff0b43fc608cd0745ed187b1d407b5) | prevent build process hang on unhandled error (#33715) | | [![fix - 7686d66cab](https://img.shields.io/badge/7686d66cab-fix-green)](https://github.com/angular/angular-cli/commit/7686d66cabcdfe90748ac405686d42674a19576f) | retain watch files on error in load result cache | | [![fix - 25b7cf7504](https://img.shields.io/badge/25b7cf7504-fix-green)](https://github.com/angular/angular-cli/commit/25b7cf7504838d541abfba043d9ea3d616a23c04) | support case-insensitive and alternative license file names | | [![perf - 4fd81402ce](https://img.shields.io/badge/4fd81402ce-perf-orange)](https://github.com/angular/angular-cli/commit/4fd81402ce5f2f3db45a17ee0d116f12edf8d254) | release build resources early in non-watch mode (#33715) | ###### @angular/ssr | Commit | Description | | -- | -- | | [![fix - 6af906cb94](https://img.shields.io/badge/6af906cb94-fix-green)](https://github.com/angular/angular-cli/commit/6af906cb94bd0686b4c0431989e054711c74892a) | settle writeResponseToNodeResponse when client disconnects | | [![perf - 917d3b2254](https://img.shields.io/badge/917d3b2254-perf-orange)](https://github.com/angular/angular-cli/commit/917d3b22549c19b91e03ceb0775a3a758142b9de) | avoid buffering request body when sanitizing headers | ### v22.1.2 — 22.1.2 - Date: 2026-07-30 - Version: v22.1.2 - Original notes: https://github.com/angular/angular-cli/releases/tag/v22.1.2 - Permalink: https://whatsnew.fyi/product/angular-cli/releases/v22.1.2 - **fixed** — add packages with built-in schematics to devDependencies only - **fixed** — prevent IIFE wrapper interleaving for adjacent classes in minified files ###### @angular/cli | Commit | Description | | -- | -- | | [![fix - 57db27ea91](https://img.shields.io/badge/57db27ea91-fix-green)](https://github.com/angular/angular-cli/commit/57db27ea910b102854267dfcd77e8fe60f23993c) | add packages with built-in schematics to devDependencies only | ###### @angular/build | Commit | Description | | -- | -- | | [![fix - baed978885](https://img.shields.io/badge/baed978885-fix-green)](https://github.com/angular/angular-cli/commit/baed978885585fceadc64f0151d7474054d57d6a) | prevent IIFE wrapper interleaving for adjacent classes in minified files | ### v22.1.1 — 22.1.1 - Date: 2026-07-30 - Version: v22.1.1 - Original notes: https://github.com/angular/angular-cli/releases/tag/v22.1.1 - Permalink: https://whatsnew.fyi/product/angular-cli/releases/v22.1.1 - **fixed** — support npm 12 metadata array and error formats - **fixed** — rewrite paths from sandboxed execroots when running under Bazel ###### @angular/cli | Commit | Description | | -- | -- | | [![fix - ab971a8543](https://img.shields.io/badge/ab971a8543-fix-green)](https://github.com/angular/angular-cli/commit/ab971a8543d80dfc93fdddf49598564f25196160) | support npm 12 metadata array and error formats | ###### @angular/build | Commit | Description | | -- | -- | | [![fix - db24220fb8](https://img.shields.io/badge/db24220fb8-fix-green)](https://github.com/angular/angular-cli/commit/db24220fb8efb5c9416e375a468672ff69d0659d) | rewrite paths from sandboxed execroots when running under Bazel | ### v22.1.0 — 22.1.0 - Date: 2026-07-29 - Version: v22.1.0 - Original notes: https://github.com/angular/angular-cli/releases/tag/v22.1.0 - Permalink: https://whatsnew.fyi/product/angular-cli/releases/v22.1.0 - **fixed** — abort and guide manual mitigation when updating catalog packages - **fixed** — prevent Yarn registry environment variable override - **fixed** — remove algoliasearch dependency and support latest docs versions - **fixed** — resolve correct registry name when using npm alias syntax during update - **fixed** — respect client-side release age settings during update resolution - **fixed** — revert package.json changes if installation tasks fail during update - **fixed** — robustly parse npm manifest from array - **added** — update ai-config to include Angular MCP server config - **fixed** — remove unused spec tsconfig outDir - **deprecated** — stringToFileBuffer and fileBufferToString are deprecated; use standard Web APIs (TextEncoder and TextDecoder) instead - **added** — add built-in SQLite cache store fallback - **added** — emit debug ids for stable subresource integrity hashes - **added** — enable chunk optimization for server builds - **added** — migrate advanced optimization Babel plugins to oxc-parser and magic-string - **added** — migrate i18n inliner to oxc-parser and magic-string - **added** — share persistent build cache across git worktrees - **fixed** — add bounded timeout to vitest executor disposal - **fixed** — anchor debug ID comment matching and make injection idempotent - **fixed** — prevent esbuild service hang on internal component stylesheet builds - **added** — support the standard Forwarded header ###### @angular/cli | Commit | Description | | -- | -- | | [![fix - f59bcf529](https://img.shields.io/badge/f59bcf529-fix-green)](https://github.com/angular/angular-cli/commit/f59bcf52917bc5e25b97c863f96127ec8d0f12f5) | abort and guide manual mitigation when updating catalog packages | | [![fix - 48f90f5d5](https://img.shields.io/badge/48f90f5d5-fix-green)](https://github.com/angular/angular-cli/commit/48f90f5d5e5dd6369b2ccf044a722271c82dffd6) | prevent Yarn registry environment variable override | | [![fix - c963ecbec](https://img.shields.io/badge/c963ecbec-fix-green)](https://github.com/angular/angular-cli/commit/c963ecbec241d42dfb419ae081ba22429e37f09e) | remove algoliasearch dependency and support latest docs versions | | [![fix - 6859d25c3](https://img.shields.io/badge/6859d25c3-fix-green)](https://github.com/angular/angular-cli/commit/6859d25c32b6c93cbbf2d4ad4143aa10b52b7588) | resolve correct registry name when using npm alias syntax during update | | [![fix - 3a2589dac](https://img.shields.io/badge/3a2589dac-fix-green)](https://github.com/angular/angular-cli/commit/3a2589dac684dfe26b2151b940bd40280d7c5d8e) | respect client-side release age settings during update resolution | | [![fix - 5c3101bff](https://img.shields.io/badge/5c3101bff-fix-green)](https://github.com/angular/angular-cli/commit/5c3101bff2e1b9d0b0e4668a183e8bcab8a1540e) | revert package.json changes if installation tasks fail during update | | [![fix - 7932caaf9](https://img.shields.io/badge/7932caaf9-fix-green)](https://github.com/angular/angular-cli/commit/7932caaf987c5692d6624f6af23e65ce3f6d27fd) | robustly parse npm manifest from array | ###### @schematics/angular | Commit | Description | | -- | -- | | [![feat - 89d7f59cd](https://img.shields.io/badge/89d7f59cd-feat-blue)](https://github.com/angular/angular-cli/commit/89d7f59cd7cc5d821ac0e81b1fee50e27877c976) | update ai-config to include Angular MCP server config | | [![fix - b345bb54d](https://img.shields.io/badge/b345bb54d-fix-green)](https://github.com/angular/angular-cli/commit/b345bb54d3ec7c73f9db70400f823d90aeab8fa8) | remove unused spec tsconfig outDir | ###### @angular-devkit/core | Commit | Description | | -- | -- | | [![refactor - fd336d365](https://img.shields.io/badge/fd336d365-refactor-yellow)](https://github.com/angular/angular-cli/commit/fd336d365dbfe8f558db177a8da24790914a541b) | deprecate stringToFileBuffer and fileBufferToString | ###### @angular/build | Commit | Description | | -- | -- | | [![feat - 34d558c3c](https://img.shields.io/badge/34d558c3c-feat-blue)](https://github.com/angular/angular-cli/commit/34d558c3c98e1b59a2c2808fc04bfbb63dfe8acf) | add built-in SQLite cache store fallback | | [![feat - 0c18dc0f6](https://img.shields.io/badge/0c18dc0f6-feat-blue)](https://github.com/angular/angular-cli/commit/0c18dc0f6d4f36d7bbb6f35b37bfa688e8fcf7d2) | emit debug ids for stable subresource integrity hashes | | [![feat - 51f69276f](https://img.shields.io/badge/51f69276f-feat-blue)](https://github.com/angular/angular-cli/commit/51f69276fd2b2aab0e94901e79a51f6860ef8690) | enable chunk optimization for server builds | | [![feat - 10dc30f9c](https://img.shields.io/badge/10dc30f9c-feat-blue)](https://github.com/angular/angular-cli/commit/10dc30f9c680f46f65b5beb030f2a75c422a3e71) | migrate advanced optimization Babel plugins to oxc-parser + magic-string | | [![feat - 917393a4c](https://img.shields.io/badge/917393a4c-feat-blue)](https://github.com/angular/angular-cli/commit/917393a4cd85172574b155f727da5c1eae196fb1) | migrate i18n inliner to oxc-parser + magic-string | | [![feat - 52ae7f862](https://img.shields.io/badge/52ae7f862-feat-blue)](https://github.com/angular/angular-cli/commit/52ae7f862a581cac97d5a9b33c9b71b830d95b19) | share persistent build cache across git worktrees | | [![fix - 95510511d](https://img.shields.io/badge/95510511d-fix-green)](https://github.com/angular/angular-cli/commit/95510511d963384c5a03298300246aa34a62328a) | add bounded timeout to vitest executor disposal | | _[Truncated at 4000 characters — full notes: https://github.com/angular/angular-cli/releases/tag/v22.1.0]_ ### v22.0.9 — 22.0.9 - Date: 2026-07-29 - Version: v22.0.9 - Original notes: https://github.com/angular/angular-cli/releases/tag/v22.0.9 - Permalink: https://whatsnew.fyi/product/angular-cli/releases/v22.0.9 - **fixed** — declare devserver_start and devserver_stop as isReadOnly:false - **fixed** — safeguard Karma builder stream controller against closed state ###### @angular/cli | Commit | Description | | -- | -- | | [![fix - 9ee8f9b669](https://img.shields.io/badge/9ee8f9b669-fix-green)](https://github.com/angular/angular-cli/commit/9ee8f9b6692b8efa2d0cabd502cd5a598f436c8a) | declare devserver_start and devserver_stop as isReadOnly:false | ###### @angular/build | Commit | Description | | -- | -- | | [![fix - d0c776d461](https://img.shields.io/badge/d0c776d461-fix-green)](https://github.com/angular/angular-cli/commit/d0c776d4610e2327c29900b9b3d679e9c0f28061) | safeguard Karma builder stream controller against closed state | ### v22.0.8 — 22.0.8 - Date: 2026-07-23 - Version: v22.0.8 - Original notes: https://github.com/angular/angular-cli/releases/tag/v22.0.8 - Permalink: https://whatsnew.fyi/product/angular-cli/releases/v22.0.8 - **fixed** — batch Prettier invocations during migration formatting - **fixed** — update MCP devserver tool names to conform to spec regex - **fixed** — canonicalize drive letter casing for workspace root on Windows - **fixed** — ensure import map integrity keys are valid URL-like specifiers - **fixed** — favor istanbul coverage provider when browser testing is enabled - **fixed** — preserve custom config options in runnerConfig for vitest - **fixed** — remap metafile paths when workspace root is a symlink or junction - **changed** — skip semantic affected-file walk when type checking is disabled ###### @angular/cli | Commit | Description | | -- | -- | | [![fix - 41c356256](https://img.shields.io/badge/41c356256-fix-green)](https://github.com/angular/angular-cli/commit/41c356256525469a41ea72896b1ddff91a4e6e55) | batch Prettier invocations during migration formatting | | [![fix - bc87c85c3](https://img.shields.io/badge/bc87c85c3-fix-green)](https://github.com/angular/angular-cli/commit/bc87c85c3c660e969cf77a493dc4ee58fd831214) | update MCP devserver tool names to conform to spec regex | ###### @angular/build | Commit | Description | | -- | -- | | [![fix - 5724bf632](https://img.shields.io/badge/5724bf632-fix-green)](https://github.com/angular/angular-cli/commit/5724bf632eba59eccdd941beae8aafad35ce003e) | canonicalize drive letter casing for workspace root on Windows | | [![fix - b8bdbaa1e](https://img.shields.io/badge/b8bdbaa1e-fix-green)](https://github.com/angular/angular-cli/commit/b8bdbaa1ea1c58f061580bd58c015078f57c1530) | ensure import map integrity keys are valid URL-like specifiers | | [![fix - 212a7bb21](https://img.shields.io/badge/212a7bb21-fix-green)](https://github.com/angular/angular-cli/commit/212a7bb21eca131f32fd7b4e7b5a9ab87f2bfded) | favor istanbul coverage provider when browser testing is enabled | | [![fix - bc760b005](https://img.shields.io/badge/bc760b005-fix-green)](https://github.com/angular/angular-cli/commit/bc760b005e0dae10a2dfd31a7f0f772482305398) | preserve custom config options in runnerConfig for vitest | | [![fix - 19cda7415](https://img.shields.io/badge/19cda7415-fix-green)](https://github.com/angular/angular-cli/commit/19cda7415693f36e911a736a32576110905b6600) | remap metafile paths when workspace root is a symlink or junction | | [![perf - fdcc98c79](https://img.shields.io/badge/fdcc98c79-perf-orange)](https://github.com/angular/angular-cli/commit/fdcc98c7912f45431268fdf66c8b132bd119bc27) | skip semantic affected-file walk when type checking is disabled | ### v22.0.7 — 22.0.7 - Date: 2026-07-15 - Version: v22.0.7 - Original notes: https://github.com/angular/angular-cli/releases/tag/v22.0.7 - Permalink: https://whatsnew.fyi/product/angular-cli/releases/v22.0.7 - **fixed** — copy packageManager field and yarn config for temp installs - **fixed** — support resolving subproject dependencies in pnpm workspaces ###### @angular/cli | Commit | Description | | -- | -- | | [![fix - e85c10ccb](https://img.shields.io/badge/e85c10ccb-fix-green)](https://github.com/angular/angular-cli/commit/e85c10ccb551eeaf9ac7e819ee6eb095317b5032) | copy packageManager field and yarn config for temp installs | | [![fix - b87cafec0](https://img.shields.io/badge/b87cafec0-fix-green)](https://github.com/angular/angular-cli/commit/b87cafec04b24c2f4337ecfa00388197ab5003f0) | support resolving subproject dependencies in pnpm workspaces | ### v22.0.6 — 22.0.6 - Date: 2026-07-09 - Version: v22.0.6 - Original notes: https://github.com/angular/angular-cli/releases/tag/v22.0.6 - Permalink: https://whatsnew.fyi/product/angular-cli/releases/v22.0.6 - **fixed** — fallback to build target preserveSymlinks option in karma runner - **fixed** — prevent externalizing builder-injected i18n locale data - **fixed** — strip all vite id prefixes from minified code with external dependencies - **fixed** — replace all route parameters when resolving relative redirects ###### @angular/build | Commit | Description | | -- | -- | | [![fix - df49966c6](https://img.shields.io/badge/df49966c6-fix-green)](https://github.com/angular/angular-cli/commit/df49966c6b8ec0c10b58fee18981fc2992ac071a) | fallback to build target preserveSymlinks option in karma runner | | [![fix - 9906add5b](https://img.shields.io/badge/9906add5b-fix-green)](https://github.com/angular/angular-cli/commit/9906add5b722cca7f61488b367dd73545c6e13bc) | prevent externalizing builder-injected i18n locale data | | [![fix - 070155f6e](https://img.shields.io/badge/070155f6e-fix-green)](https://github.com/angular/angular-cli/commit/070155f6ead185d4b478d9034662d65b8bb86a23) | strip all vite id prefixes from minified code with external dependencies | ###### @angular/ssr | Commit | Description | | -- | -- | | [![fix - c9aa354b1](https://img.shields.io/badge/c9aa354b1-fix-green)](https://github.com/angular/angular-cli/commit/c9aa354b1de0c946ddc994191613bb809a799f81) | replace all route parameters when resolving relative redirects | ### v22.0.5 — 22.0.5 - Date: 2026-07-01 - Version: v22.0.5 - Original notes: https://github.com/angular/angular-cli/releases/tag/v22.0.5 - Permalink: https://whatsnew.fyi/product/angular-cli/releases/v22.0.5 - **fixed** — Remove unused app tsconfig outDir - **fixed** — Gracefully handle package manager errors in command handler - **fixed** — Respect release age policy in update bootstrapping logic - **security** — Prevent OS command injection in ssr-dev-server builder - **fixed** — Auto-inject localize/init in library unit tests - **fixed** — Inherit preserveSymlinks option from build target in unit-test builder - **fixed** — Load zone.js dynamically for library unit tests - **fixed** — Scope createRequire module resolution using paths to prevent parent paths - **fixed** — Preserve response headers during redirect ###### @schematics/angular | Commit | Description | | -- | -- | | [![fix - 862a38069](https://img.shields.io/badge/862a38069-fix-green)](https://github.com/angular/angular-cli/commit/862a380697db60cee8cf83e8fe20641db2a6aae1) | remove unused app tsconfig outDir | ###### @angular/cli | Commit | Description | | -- | -- | | [![fix - f099e641c](https://img.shields.io/badge/f099e641c-fix-green)](https://github.com/angular/angular-cli/commit/f099e641c96a5932d81535e712af7044269b4788) | gracefully handle package manager errors in command handler | | [![fix - cf033ec48](https://img.shields.io/badge/cf033ec48-fix-green)](https://github.com/angular/angular-cli/commit/cf033ec48e2371655fbf6bcdb588c05aff2e6662) | respect release age policy in update bootstrapping logic | ###### @angular-devkit/build-angular | Commit | Description | | -- | -- | | [![fix - f75085f4b](https://img.shields.io/badge/f75085f4b-fix-green)](https://github.com/angular/angular-cli/commit/f75085f4b58ed61979a2901a4ef0353e56f22136) | prevent OS command injection in ssr-dev-server builder | ###### @angular/build | Commit | Description | | -- | -- | | [![fix - dfee1e7b1](https://img.shields.io/badge/dfee1e7b1-fix-green)](https://github.com/angular/angular-cli/commit/dfee1e7b142d767c86eecb7791ed72bce65866c5) | auto-inject localize/init in library unit tests | | [![fix - aba718403](https://img.shields.io/badge/aba718403-fix-green)](https://github.com/angular/angular-cli/commit/aba718403df7a96310570c1449674a49254cd4af) | inherit preserveSymlinks option from build target in unit-test builder | | [![fix - 7c0d9f03c](https://img.shields.io/badge/7c0d9f03c-fix-green)](https://github.com/angular/angular-cli/commit/7c0d9f03c2ae82a90a48e51b2aee731a36dc2beb) | load zone.js dynamically for library unit tests | | [![fix - 4288e4452](https://img.shields.io/badge/4288e4452-fix-green)](https://github.com/angular/angular-cli/commit/4288e44525e855f29f026276f518968b1b2697db) | scope createRequire module resolution using paths to prevent parent paths | ###### @angular/ssr | Commit | Description | | -- | -- | | [![fix - 5f774f891](https://img.shields.io/badge/5f774f891-fix-green)](https://github.com/angular/angular-cli/commit/5f774f891a086bf0a2ab6f86c24485425e99f16d) | preserve response headers during redirect |