Two bugs in .husky/pre-commit made lint+typecheck+tests silently no-op:
1. cd recursion: `cd apps/web && ...` repeated 4× sequentially.
After the 1st cd the CWD is apps/web, so `cd apps/web` again tries
to enter apps/web/apps/web and errors out. Fix: wrap each step in
a subshell `(cd apps/web && ...)` so the cd is scoped.
2. Lint grep false positive: `grep -q "error"` matched the ESLint
summary line "(0 errors, K warnings)" — blocking commits even
when lint was clean. Fix: `grep -qE "\([1-9][0-9]* error"` —
matches only the summary with N>=1 errors.
With (1) alone, the hook would block any commit because of bug (2).
Both fixes land together to keep the hook usable.
Before: 3/4 steps no-op'd, and the 4th (lint) would have always
blocked if anything had ever triggered it.
After: all 4 steps run, and only actual errors block.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>