0678f8f019
The desktop self-update rebuild (`hermes desktop --build-only`, driven by the macOS in-app updater) runs `_run_npm_install_deterministic`, which used plain `npm ci` / `npm install`. Those honor an inherited `NODE_ENV=production` (or npm `omit=dev`) and silently omit devDependencies. The desktop build toolchain — tsc, vite, electron-builder — are all devDependencies, so under `NODE_ENV=production` the install completes (exit 0) but `tsc` is never placed, and the very next step (`tsc -b && vite build`) dies with `tsc: command not found` (exit 127). The user sees "UPDATE DIDN'T FINISH / Rebuilding the desktop app failed (exit 127)" even though the git/pip update applied cleanly. NODE_ENV=production can leak in from a shell profile, a parent process, or a packaged-app launch context. Force `--include=dev` on both the `npm ci` and `npm install` paths. The only callers are frontend builds (desktop / TUI / web), which always need the dev toolchain, so this is safe across the board. Verified empirically: under NODE_ENV=production, `npm ci` leaves tsc MISSING while `npm ci --include=dev` installs it. Added two regression tests (test_npm_ci_forces_include_dev, test_npm_install_fallback_forces_include_dev) — both confirmed to FAIL when the fix is reverted.