fix: pin the vitest trio exactly, and document the peer/transitive exceptions

Copilot review round 1.

@vitest/browser-playwright declares an EXACT peer on vitest ("vitest":
"4.1.10"), so that package — not the root's range — decides which vitest lands in
clients/web. Dropping web's own vitest declaration left the root free to resolve
4.1.11 while web's peer stayed at 4.1.10, so web's tests ran on one vitest while
loading a @vitest/coverage-v8 provider built against another. Both still passed,
which is the bad part.

vitest and @vitest/coverage-v8 at the root and @vitest/browser-playwright in
clients/web are now pinned exactly to 4.1.10 and move together, the same
discipline as the exact prettier pin (#1790).

The docs also claimed more than the change delivers. npm auto-installs an unmet
peer into the install that needs it, and a client install cannot see the root's
tree — so web's eslint-plugin-react-refresh / -storybook and the TUI's
eslint-plugin-react-hooks each pull a client-local eslint, and web's
Storybook/Vitest stack pulls a local typescript and vitest; @types/express
hoists an @types/node into web and cli. Those copies sit nearer than the root's
and win. AGENTS.md and the local-dev skill now say so, and state what the
consolidation actually buys: one declaration and one place to bump, with
verify:dep-lockstep as the guard that the copies agree.

Signed-off-by: cliffhall <cliff@futurescale.com>
This commit is contained in:
cliffhall 2026-08-31 19:25:27 -04:00
commit edef659fd9

View file

@ -117,7 +117,7 @@
"@eslint/js": "^10.0.1",
"@types/node": "^24.12.4",
"@types/proper-lockfile": "^4.1.4",
"@vitest/coverage-v8": "^4.1.10",
"@vitest/coverage-v8": "4.1.10",
"eslint": "^10.8.0",
"eslint-plugin-react-hooks": "^7.1.1",
"express": "^5.2.1",
@ -125,6 +125,6 @@
"prettier": "3.8.4",
"typescript": "~5.9.3",
"typescript-eslint": "^8.65.0",
"vitest": "^4.1.10"
"vitest": "4.1.10"
}
}