Repository navigation
Description
npm audit (dev included) reports a low severity advisory against esbuild in three of the four client installs. It is not in the production tree — npm audit --omit=dev is clean everywhere after #2058 — so this is the last thing standing between us and a clean plain npm audit.
esbuild 0.27.3 - 0.28.0 severity=low
GHSA-g7r4-m6w7-qqqr — esbuild allows arbitrary file read when running
the development server on Windows
Split out of #2058, which deliberately scoped itself to the production tree (--omit=dev) and left this alone rather than widening a one-line security bump.
Where it is
Four copies, and they do not all have the same fix:
| Install | Path | Version | Parent's range | Fixable in range? |
|---|---|---|---|---|
clients/web |
tsup/node_modules/esbuild |
0.27.7 | tsup@8.5.1 → ^0.27.0 |
❌ |
clients/cli |
esbuild (hoisted from tsup) |
0.27.7 | tsup@8.5.1 → ^0.27.0 |
❌ |
clients/tui |
esbuild (hoisted from tsup) |
0.27.7 | tsup@8.5.1 → ^0.27.0 |
❌ |
clients/tui |
tsx/node_modules/esbuild |
0.28.0 | tsx@4.23.12 → ~0.28.0 |
✅ → 0.28.2 |
Why it needs an overrides, and the trap to avoid
The advisory range is 0.27.3 - 0.28.0, and esbuild@0.27.7 is the latest 0.27.x. So within tsup's declared ^0.27.0 there is no version above the range — the only in-range escape is downward, to 0.27.2.
npm audit fix does, and it is a trap: it silently downgrades esbuild 0.27.7 → 0.27.2 across web/cli/tui. This was hit and reverted during #2058 (~700 lines of lockfile churn for a low-severity dev advisory). Do not reach for npm audit fix here.
The three tsup copies therefore need an overrides forcing esbuild above tsup's declared range:
"overrides": { "esbuild": "^0.28.2" }clients/tui/package.json already carries an overrides block (for ink-select-input@6), so there is precedent for the mechanism.
The tsx copy needs none — a plain npm update esbuild in clients/tui moves it 0.28.0 → 0.28.2.
Reachability is nil, which is why this is Low and not urgent
The advisory is against esbuild's development server (esbuild --serve / the serve() API), on Windows only. Nothing here runs it:
tsupandtsxuse esbuild as a bundler/transformer, never its serve mode.- The web dev server is Vite's, not esbuild's.
- It is dev-only regardless — it does not ship in the published tarball.
So this is hygiene, not an incident. The argument for doing it is the same one made in #2058: a permanently non-clean npm audit trains people to skim the channel, and the real finding added later lands where everyone has learned to look past.
Scope
- Add the
overridestoclients/{web,cli,tui}/package.jsonand re-resolve;npm update esbuildinclients/tuifor thetsxcopy. - Confirm the override doesn't break the bundlers — this forces
tsuponto an esbuild major it does not declare support for, sonpm run buildfor web/cli/tui is the real gate here, not just the audit. Iftsupturns out to be incompatible with esbuild 0.28.x, close this as "wait for atsuprelease that widens its range" rather than downgrading to 0.27.2. - Verify plain
npm auditis clean in all five installs, and thatnpm audit --omit=devstays clean. - Confirm no unrelated lockfile churn (the High-severity nanoid advisory in the production tree (via vite → postcss), on both branches #2058 lesson).
npm run ci.
Activity
cliffhall commentedon Aug 19, 2026
Triage: Priority Low (total 5)
serve()mode, which nothing here runs. The real cost is a permanently non-cleannpm audit, not exposure.Not claimed: no
bug/security label (this ischore), no engagement yet, unassigned, not a sub-issue.Board: #28, Status
Todo, milestone v2.4.0.