lint-on-save — хук для Claude Code: линт после правок
Хук запускает линтер сразу после того, как агент изменил файл. ESLint, Pylint и RuboCop срабатывают сами, без ручного вызова.
npx claude-code-templates@latest --hook development-tools/lint-on-saveЧто делает lint-on-save
Хук вешается на событие PostToolUse с матчером Edit|MultiEdit. Как только Claude правит файл, команда смотрит на расширение и выбирает инструмент: для .js, .ts, .jsx, .tsx идёт npx eslint с флагом --fix, для .py — pylint, для .rb — rubocop --auto-correct. Ошибки линтера глушатся через 2>/dev/null || true, поэтому хук не срывает работу агента, даже если линтер ругнулся.
Проверка идёт по пути из переменной $CLAUDE_TOOL_FILE_PATH. Файлы других типов просто пропускаются — ветка if не срабатывает, и ничего не запускается. Никакого обхода проекта целиком: линт получает ровно тот файл, который тронул агент.
Ставить есть смысл, если в проекте уже настроен один из трёх линтеров. ESLint вызывается через npx, значит нужен Node и локальная установка пакета — иначе команда молча ничего не сделает. То же с pylint и rubocop: они должны быть доступны в PATH.
Какие задачи решает
- поймать ошибку стиля сразу после правки файла
- не запускать линтер руками по каждому изменённому файлу
- автоматически чинить мелочи в JS и TS через
--fix - проверять Python-файлы после того, как агент их переписал
- держать Ruby-код в форме без отдельного шага в пайплайне
Примеры запросов агенту
- поправь
src/utils.ts— и пусть линтер пройдётся после этого - перепиши
app/models/user.rb, хук сам вызовет rubocop - отредактируй
scripts/parse.pyи покажи, что скажет pylint
Как установить lint-on-save
1Через claude-code-templates
npx claude-code-templates@latest --hook development-tools/lint-on-save2Вручную: положить файлы
.claude/settings.jsonБлок hooks: событие (PreToolUse, PostToolUse, Stop…) → команда. Личные — ~/.claude/settings.json
По шагам, с командами для каждой платформы: Хуки Claude Code: что это, где настраивать и как запретить опасную команду
Вопросы о lint-on-save
Как установить lint-on-save в Claude?
Выполните npx claude-code-templates@latest --hook development-tools/lint-on-save, затем проверьте запись в .claude/settings.json.
Что делает lint-on-save?
После правки файла запускает подходящий линтер: ESLint для JS и TS, Pylint для Python, RuboCop для Ruby. Ошибки линтера не прерывают работу агента.
Какие файлы попадают под хук?
Только .js, .ts, .jsx, .tsx, .py и .rb. Остальные расширения пропускаются, потому что ни одна ветка условия не совпадает.
Исходный текст
lint-on-save.json · MIT
{
"description": "Automatically run linting tools after file modifications. Supports ESLint for JavaScript/TypeScript, Pylint for Python, and RuboCop for Ruby.",
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|MultiEdit",
"hooks": [
{
"type": "command",
"command": "if [[ \"$CLAUDE_TOOL_FILE_PATH\" == *.js || \"$CLAUDE_TOOL_FILE_PATH\" == *.ts || \"$CLAUDE_TOOL_FILE_PATH\" == *.jsx || \"$CLAUDE_TOOL_FILE_PATH\" == *.tsx ]]; then npx eslint \"$CLAUDE_TOOL_FILE_PATH\" --fix 2>/dev/null || true; elif [[ \"$CLAUDE_TOOL_FILE_PATH\" == *.py ]]; then pylint \"$CLAUDE_TOOL_FILE_PATH\" 2>/dev/null || true; elif [[ \"$CLAUDE_TOOL_FILE_PATH\" == *.rb ]]; then rubocop \"$CLAUDE_TOOL_FILE_PATH\" --auto-correct 2>/dev/null || true; fi"
}
]
}
]
}
}
© davila7 · MIT · davila7/claude-code-templates