Goal
Add Biome with a high-signal baseline and CI wiring, and replace "latest" dependency ranges with pinned semver (merged from #31).
Merged from
Why this matters
The repo has no linter or formatter (no eslint/biome/prettier config or dependency anywhere). Root package.json also pins ten packages to the literal range "latest", making builds non-reproducible. This issue establishes the tooling foundation: pin deps first, then add lint/format with a high-signal, low-noise Biome baseline.
To do
Phase 1: Pin dependencies (was #31)
Phase 2: Biome (was #32)
Out of scope
- Mass-reformatting the repo (separate follow-up)
- Promoting warnings to errors / clearing any warnings (follow-up)
- Backend tooling changes
Verification
mise exec -- pnpm lint → exit 0
mise exec -- pnpm format:check → exit 0
mise exec -- pnpm typecheck → exit 0
mise exec -- pnpm test → exit 0
Goal
Add Biome with a high-signal baseline and CI wiring, and replace "latest" dependency ranges with pinned semver (merged from #31).
Merged from
Why this matters
The repo has no linter or formatter (no eslint/biome/prettier config or dependency anywhere). Root
package.jsonalso pins ten packages to the literal range"latest", making builds non-reproducible. This issue establishes the tooling foundation: pin deps first, then add lint/format with a high-signal, low-noise Biome baseline.To do
Phase 1: Pin dependencies (was #31)
pnpm-lock.yaml"latest"in rootpackage.jsonwith^<resolved version>pnpm install— confirm lockfile stable (no major version moves)grep -c '"latest"' package.json→ 0Phase 2: Biome (was #32)
@biomejs/biomebiome.jsonwith formatter, linter, import organization, and sensible TypeScript/React ignoreslint,lint:fix,format,format:check, and/orcheckbacked bybiome checkpnpm lintexits 0,pnpm format:checkexits 0,pnpm typecheck+pnpm testexit 0Out of scope
Verification
mise exec -- pnpm lint→ exit 0mise exec -- pnpm format:check→ exit 0mise exec -- pnpm typecheck→ exit 0mise exec -- pnpm test→ exit 0