56 lines
1.3 KiB
Bash
Executable File

#!/bin/sh
# Pre-commit: fast local lint gate before commit. Full suite runs in pre-push/CI.
set -e
ensure_node_tooling() {
if command -v node >/dev/null 2>&1 && command -v pnpm >/dev/null 2>&1; then
return 0
fi
NVM_DIR="${NVM_DIR:-$HOME/.nvm}"
if [ -s "$NVM_DIR/nvm.sh" ]; then
# shellcheck disable=SC1090
. "$NVM_DIR/nvm.sh" --no-use
nvm use --silent node >/dev/null 2>&1 || true
fi
if ! command -v node >/dev/null 2>&1 || ! command -v pnpm >/dev/null 2>&1; then
echo "❌ node and pnpm must be available before committing"
echo " Install them or make sure your nvm setup is available to git hooks."
exit 1
fi
}
ensure_node_tooling
echo "🔍 Pre-commit checks..."
STAGED_FILES=$(git diff --cached --name-only)
APP_CHANGED=false
for FILE in $STAGED_FILES; do
case "$FILE" in
.github/workflows/*|.husky/*|docs/*|*.md)
;;
*)
APP_CHANGED=true
;;
esac
done
if [ "$APP_CHANGED" = false ]; then
echo " → app checks skipped (docs/workflow/hooks only)"
echo "✅ Pre-commit passed"
exit 0
fi
# Lint only when frontend source files are staged. Typecheck and test coverage
# run in the pre-push gate.
STAGED_LINTABLE=$(echo "$STAGED_FILES" | grep -E '\.(ts|tsx|js|jsx|mjs)$' || true)
if [ -n "$STAGED_LINTABLE" ]; then
echo " → lint..."
pnpm lint --quiet
fi
echo "✅ Pre-commit passed"