ХукКачество кода

auto-lint

Универсальный автолинтинг для всех языков: определяет тип файла и запускает подходящий линтер.

Закинь в Claude, Cursor или любой AI

Описание

Простым языком

Линтер — это инструмент который проверяет код на ошибки и несоответствия стилю. Для TypeScript один линтер, для Python другой, для Go третий. Этот хук работает как диспетчер: смотрит на расширение файла и сам выбирает нужный инструмент.

Ты пишешь код на нескольких языках — хук покрывает все сразу. Изменил Python-файл — запускается ruff. Изменил TypeScript — запускается ESLint. Настраивается один раз, работает для всего проекта.


Что делает

Хук auto-lint — универсальный линтер, который определяет тип файла по расширению и запускает подходящий инструмент. TypeScript — ESLint, Python — ruff, Go — gofmt, Rust — rustfmt, CSS — stylelint. Один хук для всего стека.

Работает как "зонтичный" хук поверх специализированных (prettier, python-lint). Если специализированный хук уже запущен — auto-lint дополняет его ESLint-проверками, которые prettier не делает.

Когда срабатывает

Триггер: PostToolUse — после Write или Edit. Условие: любой файл с кодом. Действие: определяет расширение → запускает соответствующий линтер с --fix флагом.


Установка

  1. Установи нужные линтеры для своего стека (см. список ниже)
  2. Добавь конфиг PostToolUse в .claude/settings.json
  3. Создай ~/.claude/hooks/auto-lint.sh с правами chmod +x
  4. Проверь: измени файл и убедись что линтер запускается

Конфиг settings.json

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/hooks/auto-lint.sh"
          }
        ]
      }
    ]
  }
}

Скрипт хука

#!/bin/bash
# auto-lint.sh — универсальный линтер по расширению файла
# PostToolUse: Write | Edit

FILE="${CLAUDE_TOOL_INPUT_PATH:-}"
[ -z "$FILE" ] && exit 0

case "$FILE" in
  */node_modules/*|*/dist/*|*/.next/*|*/build/*|*/.venv/*|*/venv/*)
    exit 0
    ;;
esac

EXT="${FILE##*.}"

case "$EXT" in
  ts|tsx)
    if command -v npx &>/dev/null; then
      ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
      if ls "$ROOT/eslint.config."* "$ROOT/.eslintrc."* &>/dev/null 2>&1; then
        npx eslint --fix "$FILE" 2>/dev/null || true
      fi
    fi
    ;;
  js|jsx|mjs|cjs)
    command -v npx &>/dev/null && npx eslint --fix "$FILE" 2>/dev/null || true
    ;;
  py)
    if command -v ruff &>/dev/null; then
      ruff format "$FILE" 2>/dev/null
      ruff check --fix "$FILE" 2>/dev/null || true
    fi
    ;;
  go)
    command -v gofmt &>/dev/null && gofmt -w "$FILE" 2>/dev/null
    command -v go &>/dev/null && go vet "$FILE" 2>/dev/null || true
    ;;
  rs)
    command -v rustfmt &>/dev/null && rustfmt "$FILE" 2>/dev/null
    ;;
  css|scss)
    if command -v npx &>/dev/null; then
      npx prettier --write "$FILE" 2>/dev/null
      npx stylelint --fix "$FILE" 2>/dev/null || true
    fi
    ;;
  sh|bash)
    command -v shellcheck &>/dev/null && shellcheck "$FILE" 2>/dev/null || true
    ;;
  *) exit 0 ;;
esac

exit 0

Установка линтеров для разных языков:

# TypeScript / JavaScript
npm install --save-dev eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin

# Python
pip install ruff
# или через uv
uv add ruff --dev

# Go — встроен в toolchain, дополнительно:
go install golang.org/x/tools/cmd/goimports@latest

# Rust — встроен в rustup:
rustup component add rustfmt clippy

# CSS
npm install --save-dev stylelint stylelint-config-standard

# Shell
apt install shellcheck   # Debian/Ubuntu
brew install shellcheck  # macOS

Примеры работы

Что пропускает

  • Файлы в node_modules, dist, .next, venv — автоматически
  • Языки без установленного линтера — хук тихо пропускает
  • Файлы без известного расширения
  • Markdown и JSON — только prettier если настроен отдельно

Что обрабатывает

  • TypeScript/TSX — ESLint с --fix (ошибки типов, unused vars)
  • Python — ruff format + check (как black + isort + flake8)
  • Go — gofmt форматирование + go vet проверка
  • Rust — rustfmt форматирование
  • CSS/SCSS — prettier + stylelint
  • Shell — shellcheck статический анализ

Настройка под себя

Добавляй новые языки в case блок. Для монорепо с несколькими языками — это единственный хук который нужен.

  • Добавь rb для Ruby через rubocop --auto-correct
  • Добавь php через php-cs-fixer fix
  • Добавь kt для Kotlin через ktlint --format
  • Добавь java через google-java-format -i
Один хук для всего стека — это не компромисс, это принцип. Меньше конфигурации, больше единообразия.
#Hooks#Claude Code#TypeScript
TG

> Пока нет комментариев

Связанный контент

Похожие инструменты