diff --git a/.husky/pre-commit b/.husky/pre-commit index e343c6840..3e07c989a 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,20 +1,24 @@ #!/usr/bin/env sh +# Each step runs in a subshell so the cd does not leak across steps. +# Pre-commit runs from the repo root; every cd below is relative to that. # Generate TypeScript types from OpenAPI spec before commit # This ensures types are always up-to-date with the backend API -cd apps/web && bash scripts/generate-types.sh +(cd apps/web && bash scripts/generate-types.sh) # Implicit 10.1: Type checking # Prevent commits with TypeScript errors (warnings are allowed) -cd apps/web && npm run typecheck 2>&1 | grep -q "error TS" && { +(cd apps/web && npm run typecheck 2>&1 | grep -q "error TS") && { echo "❌ Type checking failed. Please fix TypeScript errors before committing." echo "💡 Run 'npm run typecheck' to see all errors." exit 1 } || true # Implicit 10.2: Linting -# Prevent commits with linting errors (warnings are allowed) -cd apps/web && npm run lint 2>&1 | grep -q "error" && { +# Prevent commits with linting errors (warnings are allowed). +# Pattern matches "(N error" with N>=1 in ESLint's summary line — +# avoids false positive on "(0 errors, K warnings)". +(cd apps/web && npm run lint 2>&1 | grep -qE "\([1-9][0-9]* error") && { echo "❌ Linting failed. Please fix linting errors before committing." echo "💡 Tip: Run 'npm run lint:fix' to automatically fix some issues." exit 1 @@ -24,7 +28,7 @@ cd apps/web && npm run lint 2>&1 | grep -q "error" && { # Skip if SKIP_TESTS environment variable is set (for quick commits) # Only runs unit tests (not E2E) to keep it fast if [ -z "$SKIP_TESTS" ]; then - cd apps/web && npm test -- --run 2>&1 | grep -q "FAIL" && { + (cd apps/web && npm test -- --run 2>&1 | grep -q "FAIL") && { echo "❌ Tests failed. Please fix failing tests before committing." echo "💡 Tip: Run 'npm test' to see all test failures." echo "💡 Tip: Set SKIP_TESTS=1 to skip tests for this commit (not recommended)."