Прочитал гайд Addy Osmani от 1 октября про моды Claude Code — и за вечер перекроил агента под себя. Моды включены по умолчанию с версии 2.1.287: включать и ставить нечего.
Что такое мод на самом деле
Это файл на JavaScript или TypeScript внутри обычного плагина: манифест .claude-plugin/plugin.json, а в hooks/hooks.json — путь к модулю. Модуль экспортирует register(on, options), и внутри вы подписываетесь на события сессии. Хук видит событие целиком и делает одно из трёх: пропускает дальше после next(e); переписывает его перед следующей ступенью (next({...e, command: safer})); или не пускает вовсе, вернув { deny: "..." }. События — вызовы инструментов, ходы, старт и конец сессии, слэш-команды и перерисовки интерфейса.
От хуков из настроек это отличается принципиально: те запускают шелл-команду на каждое событие и гоняют JSON через stdin и stdout, а мод загружается один раз и живёт в сессии — держит состояние, рисует интерфейс и может зарегистрировать свой инструмент для модели.
Самый быстрый путь: описать словами
Руководство предлагает срезать путь: запускаете claude, описываете словами, что хотите видеть, разрешаете горячую перезагрузку — мод появляется в конце хода. Я попросил полоску над промптом: заполнение контекста и погода вместо слов — ясно до 25%, облачно до 50, дождь до 75, гроза до 90. Около восьмидесяти строк Claude Code написал сам, я правил формулировки и смотрел, как полоска меняется прямо в сессии.
Деталь, на которой я споткнулся: история замеров должна лежать в $.state, а не в переменной модуля. Горячая перезагрузка — это новая загрузка: register вызывается заново, переменные обнуляются, а значения в $.state держит хост.
Что реально стоит делать
- Сторож перед опасным: мод Blast Radius приостанавливает
rm -rf,git reset --hard, форс-пуш и миграции, считает, что команда затронет, и открывает панель с «Выполнить» и «Отмена». Отмена возвращает отказ с причиной. - Разбор команд на своей территории:
kubectlв продакшене,terraform apply— всё, что делает больно один раз и навсегда. - Список прочитанных файлов: понимать, что агент уже видел за сессию.
Честность реализации: поддержка AGENTS.md и панель /diff в Claude Code сделаны модами, а их исходники лежат в открытом репозитории anthropics/claude-code в папке mods/.
Где я не стал увлекаться
Мод живёт в песочнице: ни DOM, ни Node, всё наружу — только через $. API может меняться между релизами, а типы для вашей версии Claude Code сам пишет в .claude-plugin/types/ — они и есть источник истины. Два ограничения: мод, собранный «на словах» внутри сессии, живёт в папке, которую потом подчищают (нужное копируйте наружу и ставьте как плагин), а если что-то не рисуется — claude --debug скажет, что дерево элементов не прошло проверку.
Красивые панели строить не стал: мой список короткий — сторож перед командами, которые жалко, и список прочитанных файлов. Остальное украшения, а их я и без мода придумаю.