#!/usr/bin/env bash set -euo pipefail RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' NC='\033[0m' TARGET="${1:-.}" errors=0 echo "=== Lint Scan ===" # Probe for source files. Explicit prunes (rather than -not -path "*/.*") # so that target paths under hidden ancestor dirs (e.g. a Claude Code # worktree at .../.claude/worktrees//) still match real source. # -print -quit instead of `| head -1` avoids SIGPIPE under `set -o pipefail`. has_python=$(find "$TARGET" \ \( -path '*/__pycache__' -o -path '*/.venv' -o -path '*/venv' \ -o -path '*/.git' -o -path '*/node_modules' \) -prune \ -o -name '*.py' -print -quit) has_go=$(find "$TARGET" \ \( -path '*/.git' -o -path '*/vendor' -o -path '*/node_modules' \) -prune \ -o -name '*.go' -print -quit) if [ -z "$has_python" ] && [ -z "$has_go" ]; then printf "${YELLOW}!${NC} No Python or Go files found — skipping\n" exit 0 fi if [ -n "$has_python" ]; then if ! command -v ruff &>/dev/null; then printf "${RED}✗${NC} ruff not installed\n" exit 2 fi echo "-- Python (ruff) --" if ruff check "$TARGET" 2>/dev/null; then printf "${GREEN}✓${NC} Python lint clean\n" else printf "${RED}✗${NC} Python lint errors found\n" errors=$((errors + 1)) fi fi if [ -n "$has_go" ]; then if ! command -v golangci-lint &>/dev/null; then printf "${YELLOW}!${NC} golangci-lint not installed — skipping Go lint\n" else echo "-- Go (golangci-lint) --" if golangci-lint run "$TARGET/..." 2>/dev/null; then printf "${GREEN}✓${NC} Go lint clean\n" else printf "${RED}✗${NC} Go lint errors found\n" errors=$((errors + 1)) fi fi fi if [ "$errors" -gt 0 ]; then exit 1 else exit 0 fi