22.7.0 (2026-04-24)
🚀 Features
- core: add .nx/self-healing to .gitignore (#34855)
- core: decouple DB version from Nx version and share DB across worktrees (#34942)
- core: auto-open browser for Cloud setup URL during create-nx-workspace (#35014)
- core: allow generate command to skip project graph creation (#35170)
- core: remove polygraph cloud passthrough (#35153)
- core: use CNW variant 1 cloud prompt in nx init (#35155)
- core: add source map annotations to nx show target (#35225)
- core: prompt for setup mode when running nx init in empty git directory (#35226)
- core: add json input type for selective JSON field hashing (#35248)
- core: update nx-set-shas usage to v5 (#34934)
- core: add NX_BAIL environment variable (#34711)
- core: add page up/down to tui shortcuts (#34525)
- core: add logging and progress message types to daemon (#35342)
- dotnet: add ci-workflow generator (#33321)
- js: support nx.sync.ignoredDependencies in typescript-sync (#35401)
- misc: a/b test cloud prompt copy in create-nx-workspace (#35039)
- misc: update nx init telemetry meta from CSV to JSON format (#35076)
- misc: lock in CNW cloud prompt A/B winner and add new variants (#35154)
- nx-dev: add conditional blog/changelog proxy in edge function (#35043)
- nx-dev: add nx-blog sitemap to root sitemap index (#35363)
- repo: add nx-labs repo target and use glob pattern for update-all-repos (#34999)
- repo: enable tsgo compiler for nx package (#35047)
- repo: enforce no-disabled-tests via ESLint with per-project warning caps (#35122)
- repo: add e2e test for nx build process verification (#35119)
- vite: add compiler option to vite plugin for tsgo support (#35429, #33821, #35047, #35167)
🩹 Fixes
- angular: update duplicate migration keys (#34961)
- angular: add storybook and playwright as implicit dependencies (#35224)
- angular: preserve specific file paths in tsconfig when adding secondary entry point (#35254, #33051)
- angular: fall back to addUndefinedDefaults when addUndefinedObjectDefaults is unavailable (#35290)
- angular-rspack: ensure rebuild chunks emitted summary accurate (#34979, #34936)
- angular-rspack: normalize Windows path separators for i18n (#35252, #32864)
- angular-rspack: add fileReplacements to resolve.alias (#34197)
- angular-rspack: fixes issues with angular-rspack hmr (#35294, #35040)
- bundling: disable swc input source map resolution (#35010, #32671)
- bundling: bump esbuild for new projects to a version compatible with vite 8 (#35132)
- bundling: declare tsconfig.json as input for esbuild targets (#35432)
- core: skip analytics and DB connection when global bin hands off to local (#34914)
- core: properly quote shell metacharacters in CLI args passed to tasks (#34491, #32305, #26682)
- core: avoid redundant project graph requests in ngcli adapter (#34907)
- core: ensure postTasksExecution fires on SIGINT for continuous tasks (#34876, #34623, #34869)
- core: improve error handling in nx migrate registry fetching (#34926, #33014, #33135)
- core: remove CRA migration logic from nx init (#34912)
- core: pass collectInputs flag through daemon IPC for task hashing (#34915)
- core: prevent DB corruption from concurrent initialization (#34861)
- core: set windowsHide: true on all child process spawns (#34894, #34455)
- core: split-target should handle projects with colons in name better (#34725)
- core: prevent TUI crash when task output arrives after completion (#34785, #34677)
- core: respect --parallel limit for discrete task concurrency (#34721, #34117, #31494)
- core: use scroll-offset-based scrollbar positioning in TUI (#34689)
- core: skip import-equals namespace aliases in native scanner (#34947, #34644)
- core: include command name on all telemetry events (#34949)
- core: skip workspace context setup when global bin hands off to local (#34953, #34914)
- core: add explicit exports entry for nx/src/native directory (#34967, #34111)
- core: use upsert to prevent FK constraint violations in task DB (#34977)
- core: runtime inputs shouldn't be cached at task_hasher layer and filesets should be in the hash_plans layer (#34971, #30170)
- core: suppress postinstall error output when nx is not yet built (#34986)
- core: show better log message when isolated plugin shuts down after hook completion (#34922)
- core: handle owners and conformance project refs on move/remove (#34815)
- core: resolve published nx migrate package resolution (#35013, #34111)
- core: prevent batch executor error on prematurely completed tasks (#35015)
- core: add timeouts to GitHub push flow to prevent CLI hangs (#35011, #34482)
- core: prevent nx watch infinite loop from overly broad output globs (#34995)
- core: add package export for nx/release/changelog-renderer (#35033)
- core: validate bundler option for Angular presets in create-nx-workspace (#35074)
- core: handle "." and absolute paths as workspace name in CNW (#35083, #1)
- core: pin version of axios (#35093)
- core: preserve sibling dependency inputs in native hashing (#35071)
- core: restore nx package exports compatibility (#35095)
- core: sandbox exclusions, multi-line typeof import detection, global ensurePackage mock (#35056)
- core: restore metadata table for telemetry session tracking (#35099)
- core: no-interactive should disable prompts during migrate (#35106)
- core: reduce published nx package size with files allowlist (#35109)
- core: clean up legacy .gemini/skills during configure-ai-agents (#35117)
- core: copy pnpm install configuration to generated package.json (#35016, #30240)
- core: improve migrate error reporting (#34980)
- core: display actual error message when plugin loading fails (#35138, #35137)
- core: bump axios to 1.13.5 to resolve CVE-2026-25639 (#35148, #35145)
- core: update and pin ejs to 5.0.1 (#35157)
- core: misc tui perf fixes (#35187)
- core: replace LGPL-licensed @ltd/j-toml with BSD-3-Clause smol-toml (#35188)
- core: supply chain hardening via transitive dependency pinning (#35159)
- core: kill discrete tasks and use tree-kill for batch cleanup on SIGINT (#35175)
- core: support cross-file variable references in .env files (#34956, #34955)
- core: disable Yarn scripts for temp nx@latest installs (#35210)
- core: use fresh package manager cache for e2e tests (#35211)
- core: add missing inputs and sandbox exclusions for native tasks (#35212)
- core: prevent phantom connections and dead polling in plugin workers (#34823, #34388)
- core: ensure build tasks use copyReadme named input (#35217)
- core: add prettier config inputs to astro-docs format target (#35222)
- core: add vale-changed.mjs script to vale target inputs (d4c55d806a)
- core: add missing build inputs for angular-rspack example projects (fd0dff1078)
- core: add run-native-target script input to dotnet build-analyzer (#35221)
- core: overwrite inferred script target when nx prop defines executor or command (#35227)
- core: exclude populate-local-registry-storage from sandbox I/O checks (#35239)
- core: replace exec() with spawn() to prevent maxBuffer crash on large command output (#35256)
- core: inline daemon status check, drop subprocess workaround (#35273)
- core: don't cache project graph errors on daemon (#35088)
- core: cap TUI parallel slots by total task count (#35299)
- core: don't hang when workspace contains a named pipe (#35289)
- core: optimize warm cache performance for task execution (#35172, #31067)
- core: allow controlling migrate fallback installation concurrency (#35312)
- core: support pnpm multi-document lockfiles (#35271)
- core: await queued processTask promises before cache.getBatch (#35322, #35172)
- core: use v8 serialization in pseudo-IPC channel (#35332)
- core: recognize json inputs in TS task hasher fallback (#35334)
- core: speed up nx --version by avoiding heavy imports (#35326)
- core: resolve native binary crash on aarch64 linux with 16K/64K page kernels (#35356, #145353, #6541, #1547, #1549, #35345)
- core: normalize spawned run-commands output (#35358)
- core: create process report on fatal error in .nx/workspace-data (#35193)
- core: improve native TypeScript type definitions (#35251)
- core: don't spread plugin name into set constructor (#35385)
- core: allow --target/-t and -p flags for nx run with colon targets (#35394, #35098)
- core: make nx version lookup bundle-safe (#35430)
- core: restore top-level schemas/ in published nx package (#35427, #34111, #35109, #35411)
- core: wait for stdio drain before capturing task output (#35422, #35302)
- core: prevent deferred spinner text update from causing early spinner appearance (#35435)
- devkit: prevent double install in generators for TS solution workspaces (#34891)
- devkit: add startTime and endTime to TaskResult interface (#34996)
- gradle: remove annotations from atomizer (#34871)
- gradle: ignore test enums when atomizing (#34974)
- gradle: increase project graph timeout defaults (#35058)
- gradle: use object notation for exclude tasks (#35085)
- gradle: detect @input provider-based dependencies (#35090)
- gradle: prevent Gradle and Maven daemon accumulation during project graph recalculation (#35143)
- gradle: infer input extensions on project graph generation (#35160)
- gradle: hoist shared task computation out of per-class loop in atomized CI target generation (#35199)
- gradle: patch 0.1.19 to beta.11 (#35202)
- gradle: recognize Kotlin compile tasks in inferred input extensions (#35335)
- gradle: resolve sandbox violations in e2e-gradle tests (#35349, #35315)
- js: normalize cwd path separator in typescript plugin targets (#34911)
- js: preserve tsconfig fields in typescript plugin cache (#34908)
- js: pass configName to typecheck command in TS plugin (#34989, #34274)
- js: add input on .d.ts files within dependency projects (#34968)
- js: add {projectRoot} prefix to d.ts fileset in typescript plugin (#35037)
- js: recognize tsgo in dependency-checks lint rule (#35048)
- js: narrow tsc build-base outputs to only tsc-produced file types (#35041)
- js: include tsbuildinfo in narrowed tsc build-base outputs (#35086, #35041)
- js: use explicit nx/bin/nx path in start-local-registry (#35127)
- js: resolve ENOWORKSPACES test error in setupVerdaccio for @nx/js:library generator (#34755)
- js: include npm overrides in generated lockfile (#35192, #34529)
- js: stop generating baseUrl in tsconfig, use ./ prefix for path mappings (#34965, #32958)
- js: suppress false swc-node/ts-node warning on Node 22.18+ (#35247, #32567)
- js: avoid full source scan in readTsConfigPaths (#35300)
- js: resolve project tsconfig for inferred tsc run-commands targets in dependency-checks (#35291)
- js: declare .d.cts/.d.mts as typecheck inputs and outputs (#35357)
- js: resolve build output dir from globbed outputs in node executor (#35288, #35041, #35198, #35301)
- js: avoid double-prefixing node executor output paths (#35050, #35044, #33577)
- js: add npm workspace support to prune-lockfile executor (#35383, #33523)
- linter: detect require() calls in enforce-module-boundaries rule (#34896, #34096)
- linter: use native nx.configs in convert-to-flat-config for Nx plugins (#34897, #31736)
- linter: convert project-level eslint configs and log when skipped (#34899, #29458)
- linter: use root config to determine ESLint class in plugin (#34900, #32110)
- linter: prepend framework configs before baseConfig in flat config generation (#34898, #28381, #32923)
- linter: remove custom eslint hasher (d64aeef5df)
- linter: infer extended tsconfig files as task inputs (#35190)
- linter: add missing inputs to eslint executor target defaults (#35236)
- maven: prevent batch executor hang from premature worker exit (#35001, #34757)
- maven: make install targets noop when maven.install.skip=true (#35009)
- maven: log analyzer startup under verbose instead of stdout (#35361)
- maven: honor settings.xml in Maven 3 batch runner (#35216)
- misc: make webinar banner theme-aware with light mode support (#35029)
- misc: handle non-interactive mode and add template shorthand names for CNW (#35045)
- misc: use workspace root for package manager detection and normalize paths in plugins (#35116)
- misc: stream Framer proxy responses and add edge function timing (#35215)
- misc: bump axios to 1.15.0 for all packages (#35237)
- misc: allow create-nx-workspace . --no-interactive in empty directory (#35281)
- misc: remove process exit handlers when child process exits (#35279)
- module-federation: enable ESM output for Angular rspack MF plugin (#34839, #34584, #33992)
- module-federation: bump @module-federation/enhanced to ^2.3.3 (#35314, #35311)
- nextjs: align nx-dev build inputs and update plugin defaults (#35238)
- nextjs: add semver to required packages in update-package-json (#35384, #34095)
- node: split package-manager exec command for VS Code launch.json (#35295, #35276)
- nx-cloud: remove invalid images (#34997, #34970)
- nx-dev: resolve changelog page 500 error (#34920, #34909)
- nx-dev: build nx-dev in-place to fix ai package resolution (#34730, #34669)
- nx-dev: improve docs search ranking and metrics (#34992)
- nx-dev: correct YouTube channel URL on courses page (#35034)
- nx-dev: improve search ranking for reference pages (#35243, #1, #7, #2)
- nx-dev: seo improvements for nx.dev/docs (#35244)
- nx-dev: restore sitemap generation (#35351)
- nx-dev: remove broken header links (podcast) (#35410)
- react: force Vite 7 when using React Router in framework mode (#35101)
- react: support Vite 8 for React Router apps (#35365)
- release: fall back to gh user search for author usernames (#34904)
- release: surface swallowed publish errors when stdout is not valid JSON (#35283, #34497)
- release: apply preid to dependent patch bumps (#35381, #33488)
- repo: skip flaky Cypress HMR e2e tests (#34969)
- repo: use @nx/nx-source export condition in jest resolver (#34972)
- repo: resolve FreeBSD build disk space issue (#35030)
- repo: add copy-assets plugin and migrate all packages from legacy-post-build (#34994)
- repo: copy-assets plugin and e2e improvements (#35042, #34994)
- repo: pass env vars into docker builds in publish workflow (#35060)
- repo: bump picomatch from 4.0.2 to 4.0.4 (#35081, #35068)
- repo: fixup lock-threads failing with resource inaccessible message (#35005)
- repo: re-enable Cypress HMR e2e tests after upstream tapable fix (#35105, #34969, #20693)
- repo: clean Angular CLI restore target before cache copy (#35121)
- repo: correct build target outputs for docker and vue packages (#35136)
- repo: narrow copy-assets outputs to prevent overlap with build-base (#35097)
- repo: update issue-notifier.yml (#35178)
- repo: resolve FreeBSD build OOM and disk exhaustion (#35309, #35231)
- repo: switch agent apt mirror to azure to avoid canonical sync races (#35324)
- testing: handle undefined options in playwright preset (#34750)
- testing: gracefully handle broken jest configs in alias migration (#34901)
- testing: add dependent .d.ts inputs for ts-jest without isolatedModules (#35231)
- testing: declare external tsconfig files as playwright e2e task inputs (#35287)
- testing: include config file path in plugin hash calculation (#35346)
- vite: add support for Vite 8 (#34850, #34849)
- vite: update vitest and plugin-react-swc versions for vite 8 compat (#35062)
- vite: bump sass version for vue/nuxt presets for Vite 8 compat (#35073)
- vitest: resolve addPlugin default in init generator (#34990)
- vitest: add dependent task output files as inputs for vitest test targets (#35242)
- vitest: infer ancestor tsconfig files as test task inputs (#35241)
- webpack: bump postcss-loader to ^8.2.1 to eliminate transitive yaml@1.x CVE (#35028, #35025)
❤️ Thank You
- AgentEnder @AgentEnder
- AI-JamesHenry @AI-JamesHenry
- Alexandre Ducarne @JiggyJinjo
- Amp
- barbados-clemens @barbados-clemens
- Ben Snyder
- Caleb Ukle
- Charlie Croom
- Claude
- Claude Opus 4.6
- Claude Opus 4.6 (1M context)
- Colum Ferry @Coly010
- Copilot @Copilot
- Craigory Coppola @AgentEnder
- dan-winters @dan-winters
- Eric Baer
- FrozenPandaz @FrozenPandaz
- FUASHI LOT-BILL
- Jack Baker
- Jack Hsu @jaysoo
- Jack Stevenson
- James Henry @JamesHenry
- jase @jase88
- Jason Jean @FrozenPandaz
- Jay Bell
- jaysoo @jaysoo
- Jeff Miller @jeff-miller-cfa
- John Wiegert
- Juri Strumpflohner @juristr
- Leosvel Pérez Espinosa @leosvelperez
- leosvelperez @leosvelperez
- Louie Weng @lourw
- lourw @lourw
- Lucas Estevão
- MaxKless @MaxKless
- Miroslav Jonaš @meeroslav
- mungodewar @mungodewar
- Nelson Dominguez @ekkolon
- Parker Norwood @parker-norwood
- Raashish Aggarwal @raashish1601
- Robert Sidzinka
- Sai Asish Y @SAY-5
- Seth Davenport @SethDavenport
- Steven Nance
- Tomas Ptacek @faileon
- Victor Savkin @vsavkin