Что такое мод: обработчики событий внутри плагина

По документации Anthropic, мод — это плагин, который меняет внешний вид и поведение Claude Code и состоит из обработчиков событий на JavaScript или TypeScript. Claude Code вызывает их, когда Claude собирается использовать инструмент, вы отправляете промпт или рисуется часть интерфейса. В документации эти обработчики называются хуками, а прежние хуки из файла настроек теперь называются settings hooks.

Хук срабатывает до того, как Claude Code обработает событие, и решает, что будет дальше: наблюдать (отметить событие и пропустить его), изменить (поправить событие и пропустить) или ответить (обработать самому, например отказать в команде). Всё, что выходит за пределы кода хука, — рисование, команды, вызовы модели, файлы, процессы, сеть — идёт только через API модов, тот самый $ в коде. Поэтому Claude Code и может показать, что делает мод, ещё до установки. Моды на одном событии выполняются в порядке загрузки, так что моды разных авторов складываются.

Часть встроенных функций уже стала модами: /diff рисует встроенный cc-plugin-diff. Его можно отключить в /plugin (тогда /diff обслуживает прежняя встроенная версия) или заменить своим. Anthropic планирует со временем перевести на моды и другие встроенные функции.

Что умеют моды и не умеют хуки, skills и MCP

Settings hooks, skills, строки состояния и MCP-серверы работают снаружи Claude Code. Мод работает внутри, поэтому он может:

  • Рисовать интерфейс: панель рядом с лентой диалога или полосу над полем ввода — с вкладками, кнопками и полями;
  • Перерисовывать интерфейс самого Claude Code: строку вызова инструмента, спиннер, окно, в котором Claude задаёт вопросы;
  • Вмешиваться в вызов инструмента или запрос: придержать вызов и спросить вас, ответить без запуска инструмента, отправить один запрос другой модели;
  • Запускать свой код по команде: /команда сразу выполняет вашу функцию без хода Claude, даже пока Claude работает;
  • Делиться данными между хуками: один хук записывает, другой показывает.

В анонсе Anthropic есть ещё примеры: переписать промпт до отправки модели, повторить вызов инструмента, одобрить или отклонить запрос разрешения, вычистить секреты из вывода инструмента до того, как его прочтёт Claude. Сравнение из документации:

МодSettings hookSkillMCP-сервер
Что этоФункции в плагине, которые Claude Code вызывает в своём процессеShell-команда, HTTP-запрос или промпт на событии жизненного циклаФайл SKILL.md с инструкциями, которые читает ClaudeВнешний процесс или сервис, дающий Claude инструменты
Что может менятьВызовы инструментов, промпты, команды, ходы и то, что рисует интерфейсПройдёт ли вызов инструмента или промпт, аргументы и результат вызова, контекст для ClaudeЧто Claude знает и делаетКакие инструменты есть у Claude
Рисует в интерфейсеДаНетНетНет
На чём пишетсяJavaScript или TypeScriptСкрипт и запись в settings.jsonMarkdownСервер на любом языке
Когда выбиратьНужна панель, полоса над полем ввода, своя команда или перезапись событияНужно заблокировать, разрешить или записать событие готовым скриптомВы постоянно вставляете в чат одни и те же инструкцииClaude нужен доступ к внешней системе

В одном плагине может быть всё сразу, так что мод можно поставлять вместе со skill и MCP-сервером. Совет Anthropic: если задачу уже решают settings hook, skill или MCP, сначала сравните варианты, а потом пишите мод.

Перед началом: проверьте версию

  • Терминал: Claude Code v2.1.287 или новее; проверьте командой claude --version и при необходимости обновитесь.
  • Приложение Desktop: встроенный в него Claude Code поддерживает моды с v2.1.286; введите /status в локальной сессии на вкладке Code и посмотрите строку Claude Code.
  • Включены по умолчанию. Если во время раннего доступа вы задавали CLAUDE_CODE_ENABLE_FUNCTION_HOOKS, уберите её: с v2.1.287 переменная игнорируется, и 0 уже не выключает моды.
  • Что загружено: /plugin показывает под вкладками бледную строку вроде 1 mod active · first-mod.

Сначала попробуйте готовый мод

В репозитории anthropics/claude-code-playground, в каталоге claude-code/mods, Anthropic выкладывает примеры модов. Каждый — полноценный плагин с README о том, как он сделан; поставляются как есть, без поддержки:

  • token-weather — рисует над полем ввода «прогноз погоды» для вашего контекстного окна
  • blast-radius — придерживает рискованную shell-команду (например, rm -rf или force push), показывает, что она изменит, и даёт кнопки «продолжить» и «отменить»
  • replay-theater — добавляет команду /replay, которая пошагово показывает правки файлов, сделанные Claude за последний ход

Загрузите пример на одну сессию через --plugin-dir или добавьте каталог claude-code/mods из клона как маркетплейс, чтобы оставить мод насовсем (если переместить или удалить клон, мод перестанет загружаться):

# Попробовать на одну сессию
git clone https://github.com/anthropics/claude-code-playground
claude --plugin-dir ./claude-code-playground/claude-code/mods/token-weather

# Оставить насовсем: в сессии Claude Code добавить каталог как маркетплейс и установить
/plugin marketplace add ./claude-code-playground/claude-code/mods
/plugin install token-weather@claude-code-playground-mods

Самый простой путь: попросите Claude

Опишите нужный мод в интерактивной сессии, и Claude его напишет. Он опирается на встроенный skill plugin-authoring: там сказано, где лежат моды, какие события и методы есть в вашей версии и как моды загружаются. Claude подключает его сам, а можно и вручную — командой /plugin-authoring.

  1. Опишите задачу, например make a mod that shows the current git branch above the prompt (можно и своими словами по-русски). Claude пишет мод в каталог сессии ~/.claude/dev-mods/ плюс ID сессии; так как ~/.claude — защищённый путь, в режимах default и acceptEdits перед созданием каждого файла будет вопрос.
  2. Выберите горячую перезагрузку при первом сохранении: Enable for this session загружает моды в конце хода и перезагружает после каждой правки, Not now откладывает загрузку до следующего запуска этой сессии.
  3. Проверьте и доработайте: /plugin → Installed покажет мод; попросите Claude о правках — они применятся в конце хода.

Такой мод загружается только в своей сессии, а каталог удаляется после срока cleanupPeriodDays; чтобы сохранить мод, скопируйте его, скажем, в ~/mods/git-branch и запускайте claude --plugin-dir ~/mods/git-branch. Он не загрузится в claude -p и режиме dontAsk, в недоверенном рабочем каталоге, при --safe-mode, --bare или disableAllHooks и там, где это запрещают управляемые настройки. И помните: это обычная сессия Claude Code, она расходует лимит тарифа.

Первый мод своими руками: три файла

Учебный мод Anthropic first-mod считает вызовы инструментов, показывает число рядом со спиннером и добавляет команду /tally. Node.js, сборщик и шаг сборки не нужны: Claude Code загружает .js и .ts напрямую. Файлы: .claude-plugin/plugin.json, hooks/hooks.json, hooks/register.js.

first-mod/
├── .claude-plugin/
│   └── plugin.json
└── hooks/
    ├── hooks.json
    └── register.js

1. Создайте каталоги, затем 2. сохраните манифест first-mod/.claude-plugin/plugin.json. Особых полей для мода не нужно, но имя, похожее на имена Anthropic (например, начинающееся с claude-), не пройдёт проверку:

mkdir -p first-mod/.claude-plugin first-mod/hooks
{
  "name": "first-mod",
  "version": "0.1.0",
  "description": "Counts Claude's tool calls, shows the count beside the spinner, and adds a /tally command",
  "author": { "name": "Your Name" }
}

3. Укажите, где код: ключ modules в first-mod/hooks/hooks.json содержит один путь относительно этого файла. Именно он делает плагин модом.

{
  "description": "The first-mod hooks module",
  "modules": ["./register.js"]
}

4. Напишите first-mod/hooks/register.js. Claude Code вызывает экспортированную функцию register и передаёт ей on; каждый вызов on регистрирует хук на одно событие:

// Счётчик, общий для хуков ниже
let calls = 0

// Claude Code вызывает register один раз при загрузке мода
export function register(on) {
  // Старт сессии: регистрируем /tally и пропускаем событие дальше (наблюдение)
  on('session.start', async ($, e, next) => {
    await $.command.register({
      name: 'tally',
      description: 'Show how many tool calls Claude has made',
    })
    return next(e)
  })

  // Перед каждым вызовом инструмента: +1 и перерисовка (наблюдение)
  on('tool.call', async ($, e, next) => {
    calls += 1
    $.ui.invalidate('ui.render')
    return next(e)
  })

  // Только для /tally: возвращаем свой текст (ответ)
  on('command.run', { command: 'tally' }, async () => {
    return { text: 'Claude has made ' + calls + ' tool calls since this mod loaded' }
  })

  // Оставляем спиннер Claude Code и дописываем счётчик (изменение)
  on('ui.render', { component: 'Spinner' }, async ($, e, next) => {
    return next({ ...e, props: { ...e.props, suffix: ' · tool calls: ' + calls + '…' } })
  })
}

Каждый хук получает $ (API модов), e (событие в виде обычных данных) и next (передаёт событие дальше и возвращает результат). session.start и tool.call наблюдают; command.run отвечает сам и не вызывает next, а фильтр { command: 'tally' } ограничивает его командой /tally; ui.render изменяет событие, дописывая счётчик в suffix спиннера.

5. Загрузите и попробуйте:

# Загрузить first-mod только на эту сессию
claude --plugin-dir ./first-mod

# Проверить команду без интерактивной сессии
claude -p "/tally" --plugin-dir ./first-mod
# first-mod: Claude has made 0 tool calls since this mod loaded

Дайте задачу на несколько вызовов инструментов (list the files here and read the README): спиннер покажет Thinking · tool calls: 2…, а /tally затем выведет first-mod: Claude has made 2 tool calls since this mod loaded с вашим числом. Нет /tally в списке команд — значит, модуль не загрузился.

6. Правьте на лету: замените ' · tool calls: ' на ' · tools used: ' и сохраните. first-mod перезагрузится, и следующий спиннер покажет новый текст; при каждой перезагрузке register выполняется заново, поэтому счётчик обнуляется.

Хотите TypeScript? Назовите файл register.ts и укажите в modules значение ["./register.ts"]. При загрузке через --plugin-dir Claude Code записывает в .claude-plugin/types/ файлы .d.ts под вашу точную версию, так что редактор подсказывает и проверяет типы. Если страница документации и эти файлы расходятся, верьте файлам.

Установка, проверка, тесты, отключение, распространение

Установка: /plugin install <plugin>@<marketplace> в сессии или claude plugin install <plugin>@<marketplace> в shell; если сессия уже открыта, выполните в ней /reload-plugins.

Проверка: claude plugin validate выполняет те же проверки и статический анализ, что и Claude Code при загрузке мода, не запуская ваш код. Строка hooks: перечисляет события (фильтры в фигурных скобках), calls: — все вызванные методы API модов; если модуль читает или задаёт переменные окружения, появятся строки env reads: / env writes::

claude plugin validate ./first-mod

  ❯ ./register.js hooks: session.start, tool.call, command.run{command=tally}, ui.render{component=Spinner}
  ❯ ./register.js calls: $.command.register, $.ui.invalidate

✔ Validation passed

Пропавшее событие обычно означает опечатку ("tool.calls" is not an event). Пишите вызовы API полностью, как $.store.get('notes'), без псевдонимов и деструктуризации $, а имена событий — строковыми литералами.

Тесты: claude plugin test запускает автотесты мода без сессии, входа в аккаунт и сети.

Отключение: один мод — на вкладке Installed в /plugin; все установленные моды на одну сессию — запуском с --safe-mode (отключатся и другие ваши настройки); все установленные моды везде — строкой "disableAllHooks": true в ~/.claude/settings.json (остановятся также settings hooks и своя строка состояния). Встроенные моды вроде /diff отключаются отдельно в /plugin.

Распространение: каталог или .zip для пары человек, свой маркетплейс для команды, управляемые настройки для всей организации, публичный маркетплейс или каталог плагинов Anthropic для всех. Разрабатывайте через --plugin-dir: установленные плагины кешируются по версии, и правки доходят до них только после смены версии и переустановки.

Безопасность: к чему мод имеет доступ

Anthropic пишет прямо: у модов тот же доступ к компьютеру, что и у самого Claude Code, они работают без песочницы, ставить их стоит только из доверенных источников. После загрузки мод может:

  • Действовать от вашего имени: читать и менять ваши файлы, запускать программы, ходить в сеть;
  • Читать секреты: переменные окружения и файлы настроек, включая API-ключи;
  • Видеть сессию: каждый ваш промпт и каждый вызов инструмента;
  • Менять сессию: переписывать промпты и вызовы инструментов, отправлять промпт как будто от вас, писать в другую вашу сессию;
  • Действовать без спроса: одобрить вызов инструмента раньше, чем вас спросят;
  • Тратить лимит: вызывать модель по вашему тарифу или API-ключу.

Песочница здесь не поможет: она изолирует Bash-команды, которые запускает Claude, а процесс, запущенный модом, работает вне её. Мод может одобрить вызов, о котором правило ask спросило бы вас, или вызов, заблокированный вашим собственным хуком PreToolUse. Не может он только одного — изменить то, что показывает запрос разрешения.

  1. Ставьте моды только от авторов и из маркетплейсов, которым доверяете.
  2. Сначала клонируйте и выполните claude plugin validate ./some-mod: перечисленные события и вызовы должны соответствовать заявленной функции мода.
  3. Берегите ключи: мод видит переменные окружения, а по справке Anthropic при заданной ANTHROPIC_API_KEY Claude Code авторизуется этим ключом и тарифицирует по API, а не по подписке.
  4. Если что-то ведёт себя странно, запустите Claude Code с --safe-mode, чтобы исключить моды.

Где работают моды

Хуки выполняются в любой сессии, которая загрузила плагин, но нарисованное модом видно только в терминале и в приложении Desktop:

Где запущен Claude CodeХуки работаютНарисованное модом видно
claude в терминале, включая встроенные терминалы редакторов и плагин JetBrainsДаДа
Вкладка Code в приложении Desktop, кроме WSL-сессийДаДа, кроме элементов только для терминала
WSL-сессия в приложении DesktopНет: в WSL-сессиях плагины недоступныНет
Панель чата расширения VS CodeДаНет
claude -p и Agent SDKДаНет
Remote Control с claude.ai или из мобильного приложенияДа, в сессии на вашем компьютереВ терминале на вашем компьютере
Облачная сессияДа, если плагин попадает в облачную сессиюНет

Мод, который рисует, может определить, где запущен, и перейти на текст, так что логика защиты и логирования работает и в VS Code, и в CI-запусках claude -p.

Команды и компании

  • Действуют правила для плагинов: администраторы разрешают или блокируют маркетплейсы — на Team и Enterprise это делает владелец в консоли администратора, на Claude API и сторонних API администраторы рассылают управляемые настройки.
  • sec-default загружается первым на Team, Enterprise и любом компьютере с управляемыми настройками и не даёт установленным пользователем модам рисковать, например обходить ваши правила deny. Если администратор загружает свои моды первыми, sec-default стоит оставить в списке.
  • Только моды организации: с allowManagedModsOnly собственные моды пользователей не загружаются, а skills, команды, агенты и MCP-серверы их плагинов продолжают работать.
  • Идеи для команд от Anthropic: панель статуса CI/CD, подтверждение перед любой командой, затрагивающей продакшен-конфигурацию, и мод аудита, который загружается первым и записывает все вызовы других модов.

Какой тариф нужен и кому что покупать

Моды бесплатны — документация задаёт только требование к версии, — но работают внутри Claude Code, а он, по странице цен Anthropic, есть в Pro и Max и отсутствует во Free. Claude Code расходует общий лимит с приложениями Claude, и просьба написать мод, как и мод, вызывающий модель, тратит этот лимит.

Наши цены на Claude сегодня (из системы заказов)
  • Попробовать моды, Claude Code время от времени: хватит Claude Pro.
  • Агентная работа каждый день, Pro постоянно упирается в лимит: справка Anthropic советует Max 5x ($100 в месяц, примерно в 5 раз больше лимита Pro на сессию).
  • И на Max 5x не хватает: Max 20x ($200 в месяц, примерно в 20 раз больше Pro). Лимит сессии на Max сбрасывается каждые пять часов, плюс есть недельный лимит.
  • Команда в компании, которой нужен централизованный контроль маркетплейсов и модов: тарифы Team или Enterprise от Anthropic.

На свой аккаунт или готовый. Если карта не проходит, оплатите у нас в USDT (TRC20 или BEP20); USDT обычно покупают через P2P, а рубли на странице показаны по текущему курсу для ориентира. Подключение на свой аккаунт: вставьте экспорт cookie claude.ai (JSON из Cookie-Editor) на странице заказа — он проверяется до оплаты, обычно всё готово за 5–30 минут, а после выдачи данные удаляются. Для Max аккаунт должен нормально входить и не быть заблокированным; бесплатный аккаунт, за который ни разу не платили банковской картой, Max не подключит, а совсем новым аккаунтам нужно подождать 3–15 дней до Max 20x. Иначе берите готовый аккаунт: один на заказ, для одного пользователя, по описанию товара можно привязать свою почту. После оплаты подтвердите почту для выдачи (письмо приходит от Cloudflare); готовый Max выдаётся вручную (страница заказа показывает от 30 минут до ~4 часов), для готового Pro отправьте его Organization ID на странице заказа. Затем войдите в Claude Code этим аккаунтом. Подробнее: Claude Pro и Max в России, готовый аккаунт и оплата USDT. Готовых Max 5x / Max 20x сейчас нет в наличии, поэтому Max 5x / Max 20x — через подключение на свой аккаунт (Max 5x / Max 20x) по условиям выше.

Продление и возвраты. Каждый заказ — на 30 дней, напоминания приходят за 7, 3 и 1 день до окончания. Готовый аккаунт продлевается через Telegram @ccnb1937 по номеру заказа, по цене подключения того же тарифа; подключение на свой аккаунт продлевается новым заказом. Если сервис стал недоступен из-за региональной политики Anthropic, неиспользованные дни возвращаются в USDT; блокировки за нарушение правил использования Anthropic не возмещаются; возврат обрабатывается в течение 1 рабочего дня. При любых проблемах сразу пишите в онлайн-чат в правом нижнем углу или на support@claudemax.shop.

ClaudeMax — независимый сервис: не Anthropic и не авторизованный реселлер; работаем с ноября 2024 года и обслужили более 20 000 пользователей (наша собственная статистика). Статья сверена с документацией Anthropic 2026-10-07; по событиям и API модов приоритет за актуальной официальной документацией.