Вам теж набридли кілометрові коментарі від AI в коді? Тоді commentdiet іде до вас
AI-агенти генерують забагато коментарів. І інструкції їм допомагають слабо. Тому щоб не перетворювати коментарі в художні твори, я зробив лінтер, який з pre-commit хуком не дає комітити занадто багато коментарів. І агенти без жодного промпту після виконаної роботи починають оптимізовувати свої коментарі.
Спочатку я пошукав готові рішення, але виник нюанс: вони рахують рядки коду, коли спробував за кількістю рядків, то агенти недовго вагалися і почали писати все в один рядок. Мʼяко кажучи, краще не стало.
Що ж лінтер вийшов доволі простим. Рахуємо співвідношення кількості символів коментарів до кількості символів коду і звіряємо з лімітами. Існує три ліміти:
- Файл, за замовчуванням обмеження 20%
- Директорія, 15%
- І на весь проект 10%
Здається, що якось навіть занадто багато дозволено коментарів. Але ні, тому що коментарі досить розлогі у порівнянні з кодом. І 10% - це зовсім не багато коментарів на проект.
Тим не менш, звісно ці ліміти можна змінювати. І також є налаштування ігнорувати малі файли.
Скільки це в реальному коді
Щоб зрозуміти, які ліміти ставити, я проміряв те, що було під рукою:
| Що | Коментарі / код |
|---|---|
| commentdiet (сам) | 8.2% |
| golangci-lint без testdata | 11.7% |
| testify | 24.0% |
| yaml/v3 | 28.1% |
| Go stdlib: strings | 28.9% |
| Go stdlib: encoding/json | 29.0% |
| Go stdlib: net/http | 32.3% |
| Go stdlib: sync | 41.3% |
Видно, що для публічних проектів, а тим паче бібліотек значення варто піднімати. Приватні проекти, які не можу згадувати, майже всі відразу вклалися в ліміт 10%.
Лінтер підтримує С++ та Golang, тому що я їх використовую, додати інші мови не складно, якщо буде попит.
Очевидно, що лінтер не розрізняє якість коментарів, і може змушувати агентів оптимізовувати коментарі занадто суворо. Тим не менш вони справляються, і дають зворотній зв'язок, коли щось не так.
Як запустити
З кореня проєкту:
docker run --rm -v "$PWD:/src:ro" serguacom/commentdiet:latest
Образ - це scratch з одним статичним бінарником, трохи більше мегабайта, є під amd64 і arm64. Проєкт монтується read-only, нічого не пише і нікуди не ходить. Exit code 0 — чисто, 1 — забагато коментарів, 2 — помилка конфігу або запуску.
Pre-commit hook, у .git/hooks/pre-commit:
#!/bin/sh
docker run --rm -v "$(git rev-parse --show-toplevel):/src:ro" serguacom/commentdiet:latest || exit $?
Або без Docker:
go install github.com/serguacom/commentdiet@latest
Код: github.com/serguacom/commentdiet
Ще до речі приємним бонусом є те, що лінтер викликається наприкінці роботи, і не завантажує контекст, на відміну від промпту писати компактні коментарі. Він попадає в контекст, коли основна робота зроблена, і вже не вимагається топова безпомилкова якість роботи. А промпт відразу трохи деградує IQ агента.
Ще не знаю, хто як запускає агентів, але в мене вони біжать в пісочниці і не можуть змінити хук. Чого всім теж рекомендую робити.
Коментарі та запитання · Google / GitHub / анонімно