fix(install): desktop still gated on Node 26 by a stale lockfile engines mirror - #76575
Merged
Conversation
`hermes desktop` still failed with EBADENGINE demanding Node >=26 after #76562, on a machine whose `apps/desktop/package.json` already said `^20.19.0 || >=22.12.0`. #76562 fixed the manifest but not its mirror in `package-lock.json`, and `npm ci` reads engines from the lockfile: package.json apps/desktop -> {'node': '^20.19.0 || >=22.12.0'} package-lock apps/desktop -> {'node': '>=26.0.0'} <- what gated Chasing that exposed a second, pre-existing problem: the floor #76562 declared was too generous. Running the real `npm ci` against the whole workspace on Node 22.21.1 fails on a transitive dependency — npm error notsup Not compatible with your version of node/npm: react-router@8.3.0 npm error notsup Required: {"node":">=22.22.0"} react-router 8.3.0 (a direct dependency of both `apps/desktop` and `web`) declares `>=22.22.0`, which is tighter than Vite's `^20.19 || >=22.12` and excludes all of Node 20. So `>=20.0.0` promised support the tree cannot deliver: an install on Node 20 or early 22 passed the installer's gate and then died inside `npm ci` on someone else's package. All four engine declarations now state the floor the dependency tree actually has, `>=22.22.0`: root `package.json`, `apps/desktop/package.json`, and both of their `package-lock.json` mirrors. The installer gates move with them (`node_satisfies_build` in install.sh, `Test-NodeVersionOk` in install.ps1) so a too-old system Node is replaced with the managed one *before* npm runs, and the failure a user does see names hermes-agent rather than a transitive package. NODE_VERSION stays 22 — latest-v22.x is 22.23.2, comfortably above the floor. The invariant test gains the case that would have caught the mirror drift on its own: the desktop assertion now pins the tightest floor a dependency actually declares, and the managed-runtime check compares majors, since install.sh fetches latest-v{major}.x rather than {major}.0.0. Verified with real `npm ci --dry-run` over the full workspace: - node 22.23.2 (what install.sh provisions) -> 1258 packages - node 26.5.1 -> 1189 packages - node 22.21.1 (below the floor) -> EBADENGINE naming hermes-agent, i.e. our own manifest, not react-router
teknium1
approved these changes
Aug 2, 2026
Contributor
૮ >ﻌ< ა ci reviewran on 63ff4b8 ℹ️ InfoDesktop E2E visual evidence · View test artifacts · View job3 visual diffs. inline evidence is publishing... |
teknium1
added a commit
that referenced
this pull request
Aug 2, 2026
…ines churn (#76627) The Playwright suite fails identically on every PR regardless of diff (verified on a Python-only PR and a docs-only PR): the mock-backend Electron window never gets a title, so boot/chat/setup/interim specs all fail; only the dead-backend boot-failure path still passes. Breakage window matches the Aug 1 night engines/npm churn (#76499/#76562/#76575). Gated with 'false &&' in the job condition — delete that to re-enable. Root-fix + re-enable tracked in #76627 (Ari).
2 tasks
7 tasks
randlee
pushed a commit
to randlee/hermes-agent
that referenced
this pull request
Aug 11, 2026
…ckfile-engines fix(install): desktop still gated on Node 26 by a stale lockfile engines mirror
randlee
pushed a commit
to randlee/hermes-agent
that referenced
this pull request
Aug 11, 2026
…ines churn (NousResearch#76627) The Playwright suite fails identically on every PR regardless of diff (verified on a Python-only PR and a docs-only PR): the mock-backend Electron window never gets a title, so boot/chat/setup/interim specs all fail; only the dead-backend boot-failure path still passes. Breakage window matches the Aug 1 night engines/npm churn (NousResearch#76499/NousResearch#76562/NousResearch#76575). Gated with 'false &&' in the job condition — delete that to re-enable. Root-fix + re-enable tracked in NousResearch#76627 (Ari).
33hodl
pushed a commit
to 33hodl/hermes-agent
that referenced
this pull request
Aug 12, 2026
…ckfile-engines fix(install): desktop still gated on Node 26 by a stale lockfile engines mirror
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
hermes desktopstill fails with EBADENGINE demanding Node >=26 after #76562 — my miss. I fixedapps/desktop/package.jsonbut not its mirror inpackage-lock.json, andnpm cireads engines from the lockfile:Second problem, found while chasing that
The floor #76562 declared was too generous. Running the real
npm ciover the whole workspace on Node 22.21.1:react-router8.3.0 — a direct dependency of bothapps/desktopandweb— declares>=22.22.0. That is tighter than Vite's^20.19 || >=22.12and excludes all of Node 20. So>=20.0.0promised support the tree cannot deliver: an install on Node 20 or early 22 cleared the installer's gate and then died insidenpm cion somebody else's package.The fix
All four engine declarations now state the floor the dependency tree actually has,
>=22.22.0— rootpackage.json,apps/desktop/package.json, and bothpackage-lock.jsonmirrors. The installer gates move with them (node_satisfies_build,Test-NodeVersionOk) so a too-old system Node is replaced with the managed one before npm runs, and any failure a user does hit nameshermes-agentinstead of a transitive package.NODE_VERSIONstays 22 — latest-v22.x is 22.23.2, comfortably above the floor.Verification
Real
npm ci --dry-runover the full workspace, not a trimmed fixture:hermes-agent— our manifest, not react-routerThe invariant test gains the case that would have caught the mirror drift on its own: the desktop assertion now pins the tightest floor any dependency actually declares, and the managed-runtime check compares majors, since
install.shfetcheslatest-v{major}.xrather than{major}.0.0.Worth naming the lesson — I verified #76562 against a hand-built fixture (root manifest + lockfile only) rather than the real workspace tree. That fixture had no
apps/desktopentry and noreact-router, so it could not have caught either bug. The checks here run againstgit archiveof the actual tree.