🧹 Plankton Code Quality & Auto-Fix
Что это
Plankton (автор @alxfazio) — это система контроля качества кода на моменте записи файла для агентов Claude Code. В отличие от традиционных pre-commit хуков, которые срабатывают при коммите, Plankton запускает форматтеры и линтеры сразу после каждого изменения файла через механизм PostToolUse хуков. Если агент пропустил какую-то ошибку, Plankton автоматически делегирует исправление дочернему процессу Claude с подходящей моделью (Haiku, Sonnet или Opus). Основная задача — сделать так, чтобы код всегда оставался в «опрятном» состоянии, а агент даже не знал о большинстве исправлений.
⚙️ Как работает
Архитектура «три фазы»
Каждый раз, когда Claude Code редактирует или создаёт файл, хук multi_linter.sh выполняет три фазы:
Фаза 1: Автоформатирование (беззвучно)
- Запускаются форматтеры:
ruff format, biome, shfmt, taplo, markdownlint.
- 40–50% проблем исправляются тихо — агент не видит процесс.
- Выхода в основной поток нет.
Фаза 2: Сбор нарушений (JSON)
- Запускаются линтеры, собираются те проблемы, которые не исправить автоматически.
- Результат — структурированный JSON:
{line, column, code, message, linter}.
- Агент по-прежнему ничего не видит.
Фаза 3: Делегация + проверка
- Запускается
claude -p (подпроцесс) с полученным JSON нарушений.
- Выбор модели зависит от сложности проблемы:
- Haiku (таймаут 120 с) — форматирование, импорты, стиль (коды E/W/F).
- Sonnet (таймаут 300 с) — сложность, рефакторинг (C901, PLR).
- Opus (таймаут 600 с) — система типов, глубокие рассуждения (
unresolved-attribute).
- После попытки исправления фазы 1 и 2 запускаются снова для верификации.
- Если всё чисто — код возврата 0, если нарушения остались — 2 (сообщение агенту).
Что видит основной агент
| Сценарий |
Видит агент |
Exit code |
| Нет нарушений |
Ничего |
0 |
| Всё исправлено подпроцессом |
Ничего |
0 |
| Нарушения остались |
[hook] N violation(s) remain |
2 |
| Предупреждения (дубликаты, устаревшие правила) |
[hook:advisory] ... |
0 |
Таким образом, агент получает информацию только о неисправимых проблемах — качество растёт прозрачно.
🛡️ Защита от подлога правил
LLM часто пытаются отключить правила в конфигах (.ruff.toml, biome.json), чтобы не исправлять код. Plankton блокирует это тремя слоями:
- PreToolUse хук —
protect_linter_configs.sh запрещает любые правки конфигов линтеров до того, как они произойдут.
- Stop hook —
stop_config_guardian.sh детектирует изменения через git diff в конце сессии.
- Список защищённых файлов:
.ruff.toml, biome.json, .shellcheckrc, .yamllint, .hadolint.yaml и другие.
🚫 Принудительное использование менеджеров пакетов
PreToolUse хук на Bash блокирует устаревшие менеджеры пакетов:
pip, pip3, poetry, pipenv — заблокированы (требует uv).
npm, yarn, pnpm — заблокированы (требует bun).
- Исключения:
npm audit, npm view, npm publish.
📦 Настройка
Быстрый старт
# Установка зависимостей
brew install jaq ruff uv
# Установка Python-линтеров
uv sync --all-extras
# Запуск Claude Code — хуки активируются автоматически
claude
Никаких команд установки или конфигурации плагинов. Хуки находятся в .claude/settings.json и подхватываются при запуске claude в директории Plankton.
Интеграция в свой проект
Чтобы использовать хуки Plankton в своём проекте:
- Скопировать
.claude/hooks/ в свой проект.
- Скопировать
.claude/settings.json с конфигурацией хуков.
- Скопировать файлы конфигов линтеров (
.ruff.toml, biome.json, и т.д.).
- Установить линтеры для используемых языков.
Конфигурационный файл
.claude/hooks/config.json управляет всем поведением Plankton. Основные параметры:
languages — включить/отключить проверку для каждого языка (можно отключить ненужные для скорости).
phases.auto_format — включить/отключить автоформатирование.
phases.subprocess_delegation — false пропускает фазу 3 (только отчёт о нарушениях).
subprocess — настройки таймаутов для каждой модели и порог объёма (volume_threshold: если нарушений больше этого числа — авто-эскалация на более мощную модель).
Переменные окружения
| Переменная |
Назначение |
HOOK_SKIP_SUBPROCESS=1 |
Пропустить фазу 3, сообщать о нарушениях напрямую |
HOOK_SUBPROCESS_TIMEOUT=N |
Переопределить таймаут для всех уровней |
HOOK_DEBUG_MODEL=1 |
Логировать выбор модели |
HOOK_SKIP_PM=1 |
Отключить принудительный контроль менеджеров пакетов |
🧩 Когда использовать
- Вы хотите автоматическое форматирование и линтинг при каждом изменении файла, а не только при коммите.
- Вам нужна защита от модификаций конфигов линтеров агентом.
- Вы работаете с несколькими языками (Python, TypeScript, Shell, YAML, JSON, TOML, Markdown, Dockerfile).
- Вы хотите автоматическое распределение задач между моделями Claude по сложности.
- Применяется в связке с ECC (сестринский проект): ECC отвечает за общее поведение агента (команды, правила), а Plankton — за качество кода на уровне каждого файла.
💡 Важно знать
- Конфликт с ECC: если вы используете оба набора хуков, то ECC's Prettier и Plankton's biome могут конфликтовать на JS/TS. Рекомендуется отключить Prettier в ECC, так как biome покрывает больше правил.
- Не требует установки как плагин — просто скопируйте хуки в
.claude/hooks/.
- Зависимости под язык: например, для Python нужен
ruff и uv, для TypeScript — biome, для Shell — shellcheck и shfmt.
- Настройка
volume_threshold в config.json позволяет автоматически повышать уровень модели, если нарушений слишком много.
- Безопасность: PreToolUse хуки блокируют попытки агента изменить правила линтеров, что предотвращает типичный «обман» системы качества.
Комментарии
Комментариев пока нет. Будьте первым.