Моды Claude Code: переписываю агента под себя

📎 Источник: гайд Addy Osmani про моды Claude Code · пост в канале «Start ИИ»
Обложка: тёмный фон и заголовок Getting started with Claude Code mods

Прочитал гайд 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 скажет, что дерево элементов не прошло проверку.

Красивые панели строить не стал: мой список короткий — сторож перед командами, которые жалко, и список прочитанных файлов. Остальное украшения, а их я и без мода придумаю.

#apet #ClaudeCode #ClaudeCodeMods #разработка

← Рубрика «Разработчикам»  ·  Все рубрики